End-to-End Deployment Runbook
A concise, linear checklist for an engineer to follow start to finish. Each step links back to the detailed page it's drawn from.
Pre-flight (once per MSP instance)
- Create App 1 — Portal (multitenant): SPA redirect URI = your portal URL; expose the
access_as_userscope; add theauth_timeoptional claim to the access token. Record its client ID. → Azure App Registrations - Create App 2 — Data (multitenant): upload the Graph certificate's public key; add the required Graph application permissions. Record its client ID. → Azure App Registrations, Graph Permissions
- Provision hosting:
- Model A: App Service + Managed Identity + Key Vault (holding the certificate) + grant the Managed Identity Key Vault Secrets User.
- Model B: build the container, mount the certificate/PFX, provision a PersistentVolume for the SQLite file. → Server Installation
Deploy
- Set configuration:
AzureAd:{Authority, Audience, TenantId}andCet2:{GraphAuth.*, BootstrapAdminObjectIds, Actions.Enabled=false}. → Configuration - Deploy the API. Confirm
GET /api/healthreturnsok. - Add the portal URL to App 1's redirect URIs. Verify an MSP administrator can sign in. → SSL and DNS
Per customer tenant
- The customer's Global Administrator admin-consents App 2, and — only if enabling sensitive actions — assigns User Administrator and/or Authentication Administrator to its service principal.
- Tenants → Onboard the customer's tenant ID; the probe must pass.
- Verify live data (Devices, Compliance). Run the full Validation Testing checklist.
- In Access Control, assign the customer's users/groups a role scoped to their tenant.
- Customer users sign in with their own accounts and see only their own tenant. → Tenant Onboarding
Go-live
- (Optional) Enable write actions: confirm certificate authentication is in place, set
Cet2:Actions:Enabled=true, validate a low-risk action (Device Sync) end to end, and confirm it appears in the target's Action history. - Apply Conditional Access to the app registrations before production customer use.
That's the whole deployment, start to finish. If something doesn't behave as expected at any step, the Troubleshooting page is organised by symptom and maps directly onto this runbook.