GarNet Dashboard

GP02 Core Services Guide
GP02.garnet.ca — File Server. These three plus cwaGP02mon share one port (38080) via HTTP.sys path prefixes, so one firewall rule covers all of it. Deploy cwaGP02mon first (see its own guide) so you can watch these three come online here. Local storage and Azure Blob backup both live here; nothing critical is ever stored on the IIS server (see the JPOD.ca guide). Live status is on the GP02 Services page.
Key Settings & Defaults
Deployment-only settings (shared port, cross-service URLs) live in each app's own appsettings.Deploy.json, sitting alongside its exe — never touched by dotnet publish, so it survives every future republish (see the note at the bottom of this page). Credentials (database, Zoom, RingCentral, Azure Blob) live in appsettings.local.json instead, since those are the same in dev and on GP02 here.
AppSettingConfig keyDefaultSet via
cwaSSO3 Shared port & path HttpSys:UrlPrefix / PathBase none — falls back to Kestrel on the local dev port until set appsettings.Deploy.json
cwaZOOM / cwaRING URLs Sso:CwaZoomBaseUrl / CwaRingBaseUrl http://localhost:5290 / :5280 (dev defaults) appsettings.Deploy.json
Oldest search start Recordings:OldestSearchStartUtc 2024-01-01 appsettings.json
cwaZOOM Shared port & path HttpSys:UrlPrefix / PathBase none appsettings.Deploy.json
Download folder Zoom:DownloadFolder C:\Zoom Meeting appsettings.json
cwaRING Shared port & path HttpSys:UrlPrefix / PathBase none appsettings.Deploy.json
Download folder DownloadFolder C:\RingCentral Recordings appsettings.json
All three AzureStorage:ContainerName sso3-zoom-recordings appsettings.json
Windows Services
AppRolePath prefixWindows Service name
cwaSSO3 Orchestration, caching, audit trail — the API every UI actually talks to /sso3/ G4L-cwaSSO3
cwaZOOM Zoom passthrough — actual download/blob-upload happens here (only it can see this box's disk) /zoom/ G4L-cwaZOOM
cwaRING RingCentral passthrough — same role as cwaZOOM, for calls/voicemail /ring/ G4L-cwaRING
Child-process tools (run on GP02, but not services)
Invoked on demand by cwaSSO3 via Process.Start when a button is clicked — not always-running, no Windows Service registration needed. Both are already published (self-contained) into C:\Deploy.g4l\svc alongside the three services, with cwaSSO3's appsettings.Deploy.json already pointed at where they land in C:\Services.g4l\svc.
ToolTriggered fromcwaSSO3 config keyPurpose
coaG4LNsync Home page — Settings → "Run Sync Now" Sync:ExePath Mirrors the Azure SQL tables down to gp01's local read-only replica
coaZoomFullSync zoom.html — "Full History Sync" ZoomFullSync:ExePath Walks every user's full Zoom recording history into the cache (what the recording-count report reads from)
Deploy steps
  1. Deploy cwaGP02mon first and confirm it's running.
  2. Copy C:\Deploy.g4l\svc (three app subfolders, two child-process tool subfolders + the install script below) onto GP02.
  3. Copy all five subfolders into C:\Services.g4l\svc on GP02 (so paths match the script and cwaSSO3's Sync:ExePath/ZoomFullSync:ExePath).
  4. Run install-services.cmd as Administrator — registers all three as Windows Services and starts them one at a time.
  5. Confirm with sc query G4L-cwaSSO3 (etc.), or watch them come online on the GP02 Services page (via cwaGP02mon, already running from step 1).
No re-publish needed for a routine deploy — the three folders already have real config baked in (appsettings.Deploy.json for the shared port, appsettings.local.json for connection strings/API credentials). Re-publish only when the code itself changes.
Published self-contained (dotnet publish -r win-x64 --self-contained true) — the .NET 10 runtime is bundled in, so GP02 doesn't need it pre-installed. A framework-dependent publish will fail to start with a ".NET Runtime" error in Event Viewer if the runtime isn't already on the machine.
If code changes later and you republish, dotnet publish will overwrite appsettings.json/appsettings.local.json from the source repo but will never touch appsettings.Deploy.json — it isn't referenced anywhere in the project, so it's untouched by the build and just keeps working across republishes.
The install script also sets a Windows Service Description for each (via sc description) — sc create's own DisplayName= doesn't populate that field, so without it the Description column in services.msc stays blank.
Install script
Already sitting in C:\Deploy.g4l\svc\install-services.cmd — copy/paste here only if you need it somewhere else. The uninstall commands at the bottom are commented out (::) on purpose — run them manually, one at a time, not as part of this script.
@echo off
setlocal

:: ============================================================
::  GP02 core services installer
::  Registers cwaSSO3, cwaZOOM, and cwaRING as Windows Services
::  (Automatic start) and starts them one at a time.
::
::  Published self-contained (includes the .NET 10 runtime) - no
::  separate .NET install needed on GP02.
::
::  Deploy cwaGP02mon first (see the sibling \mon folder) so you
::  can watch these three come online here.
::
::  Run this AFTER copying this folder's three app subfolders
::  into C:\Services.g4l\svc on GP02 (so the paths below
::  match). Must be run from an ELEVATED (Administrator) Command
::  Prompt.
::
::  Re-running after the services already exist will print
::  "already exists" for sc create - that's expected and safe to
::  ignore. Use "sc delete <name>" first for a clean re-install.
:: ============================================================

echo Registering G4L-cwaSSO3...
sc create G4L-cwaSSO3 binPath= "C:\Services.g4l\svc\cwaSSO3\cwaSSO3.exe" start= auto DisplayName= "G4L-cwaSSO3 (orchestration/caching/audit)"
sc description G4L-cwaSSO3 "Cruise Connections Zoom/RingCentral archive - orchestration, caching, and audit trail API."

echo Registering G4L-cwaZOOM...
sc create G4L-cwaZOOM binPath= "C:\Services.g4l\svc\cwaZOOM\cwaZOOM.exe" start= auto DisplayName= "G4L-cwaZOOM (Zoom passthrough)"
sc description G4L-cwaZOOM "Cruise Connections Zoom passthrough - downloads recordings and uploads to blob storage."

echo Registering G4L-cwaRING...
sc create G4L-cwaRING binPath= "C:\Services.g4l\svc\cwaRING\cwaRING.exe" start= auto DisplayName= "G4L-cwaRING (RingCentral passthrough)"
sc description G4L-cwaRING "Cruise Connections RingCentral passthrough - downloads calls/voicemail and uploads to blob storage."

echo.
echo Starting services one at a time - starting two together can race
echo on first-time Windows Event Log access and fail to start.
echo.

net start G4L-cwaZOOM
timeout /t 3 /nobreak >nul

net start G4L-cwaRING
timeout /t 3 /nobreak >nul

net start G4L-cwaSSO3

echo.
echo Done. Check status with: sc query G4L-cwaSSO3   (and G4L-cwaZOOM / G4L-cwaRING)
echo Or check cwaGP02mon's view of them at: http://localhost:38080/monitor/
pause

:: ============================================================
:: To UNINSTALL these three (run these manually - NOT part of
:: this script):
::
::   net stop G4L-cwaSSO3
::   net stop G4L-cwaZOOM
::   net stop G4L-cwaRING
::   sc delete G4L-cwaSSO3
::   sc delete G4L-cwaZOOM
::   sc delete G4L-cwaRING
:: ============================================================