Files
lmxopcua/docs/ServiceHosting.md
Joseph Doherty 1bd8a1875b PR 7.3 tail — doc + memory housekeeping for retired Galaxy.Host
Closes the v2-mxgw migration's housekeeping debt now that PR 7.2 has
retired the legacy projects + service.

Repo docs:
- CLAUDE.md: rewrote the Galaxy section + reference-impl + MXAccess
  documentation pointers; replaced .NET 4.8 x86 / COM apartment
  constraints with .NET 10 AnyCPU + a pointer to the gateway. Dropped
  the "Service hosting (Galaxy.Host)" library-preferences row.
- docs/ServiceHosting.md: rewrote (was 156 lines of Galaxy.Host pipe
  IPC details). Now reflects the v2 process shape: OtOpcUa.Server +
  OtOpcUa.Admin + optional OtOpcUaWonderwareHistorian, with Galaxy
  access via the in-process driver → mxaccessgw.
- docs/v2/dev-environment.md: scrubbed four Galaxy.Host references
  (TwinCAT/Galaxy.Host shared-host note; .NET 4.8 SDK row; install
  step #2; risks table). The .NET 4.8 SDK is now correctly framed as
  "optional, only needed when building the mxaccessgw worker".
- mxaccess_documentation.md: deleted from the repo root (obsolete; the
  gateway repo is the canonical MxAccess API doc).

Memory housekeeping (under ~/.claude/projects/.../memory/):
- Retired: project_galaxy_host_service.md,
  project_galaxy_host_installed.md, reference_impl.md (the LmxProxy
  Host MXAccess reference is no longer the design pattern this repo
  uses).
- Revised: project_overview.md (now describes the .NET 10 + mxaccessgw
  shape), project_aveva_platform_installed.md (AVEVA still required
  on the dev box but consumed by the gateway worker, not by anything
  here), project_galaxy_via_mxgateway.md (post-7.2 state — flagged as
  the only Galaxy backend), project_server_history_alarm_subsystems.md
  (per-driver fallbacks retired in PR 7.2).
- MEMORY.md index updated to match.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-30 08:14:22 -04:00

3.0 KiB

Service Hosting

Overview

A production OtOpcUa deployment runs two or three processes, each with a distinct runtime and install surface:

Process Project Runtime Platform Responsibility
OtOpcUa Server src/ZB.MOM.WW.OtOpcUa.Server .NET 10 x64 Hosts the OPC UA endpoint; loads every driver in-process (Modbus, S7, AbCip, AbLegacy, TwinCAT, FOCAS, OPC UA Client, Galaxy via mxaccessgw); exposes /healthz.
OtOpcUa Admin src/ZB.MOM.WW.OtOpcUa.Admin .NET 10 (ASP.NET Core / Blazor Server) x64 Operator UI for Config DB editing + fleet status, SignalR hubs (FleetStatusHub, AlertHub), Prometheus /metrics.
OtOpcUa Wonderware Historian (optional) src/ZB.MOM.WW.OtOpcUa.Driver.Historian.Wonderware .NET Framework 4.8 x86 (32-bit) Out-of-process sidecar exposing the Wonderware Historian SDK over a named pipe. Required only when Historian:Wonderware:Enabled=true in appsettings.json.

Galaxy access uses a separately-installed mxaccessgw running out of a sibling repo (c:\Users\dohertj2\Desktop\mxaccessgw\) — see docs/v2/Galaxy.ParityRig.md for setup. The mxaccessgw owns the MXAccess COM bitness constraint (its worker is x86 net48); nothing in the OtOpcUa repo carries that constraint anymore. PR 7.2 retired the legacy in-process Galaxy.Host / Galaxy.Proxy / Galaxy.Shared projects + the OtOpcUaGalaxyHost Windows service.

OtOpcUa Server

Hosted via Microsoft.Extensions.Hosting with AddWindowsService (decision #30 — replaced TopShelf in v2). The host's Build() returns immediately when launched interactively (e.g. dotnet run) but blocks for SCM signals when running as a Windows service.

In-process drivers are registered at startup in Program.cs's DriverFactoryRegistry block; the DriverInstance rows in the central Config DB select which driver factories materialise into live IDriver instances. See docs/v2/driver-specs.md for the per-driver DriverConfig JSON shapes.

OtOpcUa Admin

Same hosting model; runs the Blazor Server UI + SignalR hubs. Reads from the same Config DB the Server writes to.

OtOpcUa Wonderware Historian (optional)

When Historian:Wonderware:Enabled=true, the Server speaks to a sidecar that wraps the Wonderware Historian SDK (which is .NET Framework only). The pipe IPC contract is in src/ZB.MOM.WW.OtOpcUa.Driver.Historian.Wonderware.Client/Contracts/ and the sidecar's pipe handler lives at src/ZB.MOM.WW.OtOpcUa.Driver.Historian.Wonderware/Pipe/.

Install via the -InstallWonderwareHistorian switch on scripts/install/Install-Services.ps1.

Install / Uninstall

  • scripts/install/Install-Services.ps1 — installs OtOpcUa and optionally OtOpcUaWonderwareHistorian.
  • scripts/install/Uninstall-Services.ps1 — stops + removes both, plus OtOpcUaGalaxyHost if a pre-7.2 rig still carries it.

Logging

Serilog with rolling-daily file sinks. Each service writes to %ProgramData%\OtOpcUa\<service>-*.log plus stdout (NSSM-friendly).