Files
scadalink-design/lmxproxy/instances_config.md
Joseph Doherty ac44122bf7 docs(lmxproxy): add dual-instance configuration (A on 50100, B on 50101)
Both instances share API keys and connect to the same AVEVA platform.
Verified: 17/17 integration tests pass against both instances.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-22 07:26:06 -04:00

2.9 KiB

LmxProxy v2 — Instance Configuration

Two instances of the LmxProxy v2 Host service are deployed on windev (10.100.0.48), both connecting to the same AVEVA System Platform via MxAccess COM.

Instances

Instance A Instance B
Service Name ZB.MOM.WW.LmxProxy.Host.V2 ZB.MOM.WW.LmxProxy.Host.V2B
Display Name SCADA Bridge LMX Proxy V2 SCADA Bridge LMX Proxy V2B
Publish Directory C:\publish-v2\ C:\publish-v2b\
gRPC Port 50100 50101
HTTP Status Port 8081 8082
Log File Prefix lmxproxy-v2- lmxproxy-v2b-
Log Directory C:\publish-v2\logs\ C:\publish-v2b\logs\
Health Probe Tag DevAppEngine.Scheduler.ScanTime DevAppEngine.Scheduler.ScanTime
API Keys File C:\publish-v2\apikeys.json C:\publish-v2b\apikeys.json
Auto-Start Yes Yes

Shared API Keys

Both instances use the same API keys (copied from instance A during setup).

Role Key
ReadWrite c4559c7c6acc60a997135c1381162e3c30f4572ece78dd933c1a626e6fd933b4
ReadOnly a77d090d4adcfeaac1a50379ec5f971ff282c998599fd8ccf410090c9f290150

Service Management

# Instance A
sc start ZB.MOM.WW.LmxProxy.Host.V2
sc stop ZB.MOM.WW.LmxProxy.Host.V2
sc query ZB.MOM.WW.LmxProxy.Host.V2

# Instance B
sc start ZB.MOM.WW.LmxProxy.Host.V2B
sc stop ZB.MOM.WW.LmxProxy.Host.V2B
sc query ZB.MOM.WW.LmxProxy.Host.V2B

Health Endpoints

# Instance A
curl http://10.100.0.48:8081/api/health
curl http://10.100.0.48:8081/api/status

# Instance B
curl http://10.100.0.48:8082/api/health
curl http://10.100.0.48:8082/api/status

Client Connection

// Instance A
var clientA = new LmxProxyClientBuilder()
    .WithHost("10.100.0.48")
    .WithPort(50100)
    .WithApiKey("c4559c7c6acc60a997135c1381162e3c30f4572ece78dd933c1a626e6fd933b4")
    .Build();

// Instance B
var clientB = new LmxProxyClientBuilder()
    .WithHost("10.100.0.48")
    .WithPort(50101)
    .WithApiKey("c4559c7c6acc60a997135c1381162e3c30f4572ece78dd933c1a626e6fd933b4")
    .Build();

Updating Instances

After code changes, both instances need to be republished separately:

# Stop both
sc stop ZB.MOM.WW.LmxProxy.Host.V2
sc stop ZB.MOM.WW.LmxProxy.Host.V2B

# Publish
dotnet publish src/ZB.MOM.WW.LmxProxy.Host -c Release -r win-x86 --self-contained false -o C:\publish-v2
dotnet publish src/ZB.MOM.WW.LmxProxy.Host -c Release -r win-x86 --self-contained false -o C:\publish-v2b

# Restore instance-specific config (publish overwrites appsettings.json)
# Instance B needs port 50101/8082 and log prefix lmxproxy-v2b-

# Start both
sc start ZB.MOM.WW.LmxProxy.Host.V2
sc start ZB.MOM.WW.LmxProxy.Host.V2B

Note: dotnet publish overwrites appsettings.json in the output directory with the source copy (which has default ports 50051/8080). After publishing, verify the instance-specific config is correct before starting the service.