diff --git a/CLAUDE.md b/CLAUDE.md index bce110e..570741d 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -304,6 +304,36 @@ by the shared lib (the `galaxy_repository.v1` wire contract is already identical clients are unaffected). Build/test from `ZB.MOM.WW.GalaxyRepository/`: `dotnet test`. Consumer matrix: HistorianGateway (initial); mxaccessgw (follow-on adoption). +## Hosted application: ZB.MOM.WW.Overview (family dashboard) + +Besides the shared libraries, this repo hosts one **application**: +[`ZB.MOM.WW.Overview/`](ZB.MOM.WW.Overview/) — a Blazor Server single-pane dashboard that polls +every registered instance's anonymous `/health/ready` + `/health/active`, caches one snapshot +(pages never poll) and renders per-cluster state including the Akka **leader chip**, which is what +the `ZB.MOM.WW.Health` `0.2.0`/`0.3.0` per-entry `data` work exists to feed. **No login, strictly +read-only, holds no credentials** — a requirement, not an omission; it references no Auth/Audit/ +Secrets package. Design + impl plan: `docs/plans/2026-07-22-overview-dashboard-{design,impl-plan}.md` +(ledger 19/20; the open task is Phase 4 live acceptance, recorded in `41013dc` as 7 of 9 design §9 +checks passing, 2 blocked on an OtOpcUa rig redeploy). + +The `Applications` registry ships **empty** on purpose: a deployment supplying none fails startup +naming the key rather than booting an empty dashboard. Per-deployment overlays are committed — +`appsettings.Docker.json` (the local rigs, joined via external networks) and +`appsettings.Wonder.json`. + +**Deployed to `wonder-app-vd03` 2026-08-11** (`main @ 4f97e72`) as that box's **fifth** app: +service `ZbOverview` on **:5320** under the shared NSSM, `ASPNETCORE_ENVIRONMENT=Wonder`, +5/5 instances Up. Two constraints worth carrying to any future box: + +- **Publish self-contained** (`-r win-x64 --self-contained true`). wonder has **no .NET 10 runtime** + — every app there carries its own. An FDD publish installs fine and then fails at service start. +- **Registry `BaseUrl` must not put co-located instances on a shared host name.** Leader-address → + instance resolution matches on **host only** (Akka and HTTP ports differ by design), which assumes + distinct hosts per instance — true on the rig, false on a single box, where the fleet-wide scan + lets the first matching entry win the chip for *every* group. On wonder that made ScadaBridge's + **site** card claim `Leader · central`, a different Akka cluster. Fixed by using `127.0.0.1`, + which matches nothing, so each chip falls back to the raw Akka address. + ## Per-project primary commands Run these from inside each project directory (not from `scadaproj`). @@ -339,6 +369,13 @@ dotnet test ZB.MOM.WW.HistorianGateway.slnx --filter "Category=LiveIntegration" dotnet publish src/ZB.MOM.WW.HistorianGateway.Server/ZB.MOM.WW.HistorianGateway.Server.csproj -c Release -o docker/publish -p:UseAppHost=false cd docker && docker compose up -d --build # dashboard/health/metrics :5220, gRPC h2c :5221 (needs host VPN for egress) +# ZB.MOM.WW.Overview (~/Desktop/scadaproj/ZB.MOM.WW.Overview — the hosted family dashboard) +dotnet build ZB.MOM.WW.Overview.slnx +dotnet test ZB.MOM.WW.Overview.slnx # 177 tests, fully offline +cd docker && docker compose up -d --build # local rigs → http://localhost:5320 (start the rigs first) +# wonder deploy artifact — SELF-CONTAINED, the box has no .NET 10 runtime: +dotnet publish src/ZB.MOM.WW.Overview/ZB.MOM.WW.Overview.csproj -c Release -r win-x64 --self-contained true -o + # ZB.MOM.WW.LocalDb (~/Desktop/scadaproj/ZB.MOM.WW.LocalDb — a hosted shared lib) dotnet build ZB.MOM.WW.LocalDb.slnx dotnet test ZB.MOM.WW.LocalDb.slnx # 149 tests, fully offline (no live deps)