# 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\-*.log` plus stdout (NSSM-friendly).