Secure Azure Deployment handoff · anonymized example
Northwind Bakery Orders — Production Handoff
Client: Northwind Bakery (fictional sample)
Contractor: Will Pickeral
Company: William Belle
Application: Northwind Bakery Orders — online order & pickup scheduler
Hosting provider: Azure
Region: East US 2
Handoff date: 2026-05-14
About this document. This is an anonymized example of the production handoff every client receives at the end of a deployment engagement. All names, URLs, and identifiers are fictional.
1. Summary
Northwind Bakery Orders is a web app where customers place pickup orders and staff manage the daily queue. It has been deployed to a managed Azure production environment: sign-in is handled by Microsoft Entra ID with MFA for staff, all secrets live in Azure Key Vault, the database runs on a private PostgreSQL server with 14-day backups, and application logs flow to Azure Monitor.
| Item | Value |
|---|---|
| Production URL | https://orders.northwindbakery.example |
| Go-live status | ✅ Live since 2026-05-14 |
| Launch prerequisites | Staff accounts provisioned; test orders cleared |
2. Production access
URL: https://orders.northwindbakery.example
How staff sign in:
- Open the production URL.
- Click Sign in with Microsoft.
- Authenticate with the staff member's
@northwindbakery.exampleaccount. - Complete the MFA prompt (second factor).
- The app loads with the role assigned to that account (Manager or Counter Staff).
Access is HTTPS-only; HTTP is redirected to HTTPS. Customers order through the public storefront without an account; only staff sign in.
3. Resource inventory
All resources live in rg-northwind-prod, region East US 2, on Azure.
| Resource | Name | Tier / SKU | Purpose |
|---|---|---|---|
| App Service Plan | asp-northwind-prod |
Linux S1 | Hosts the web app |
| Web App | app-northwind-prod |
Node 24 LTS, HTTPS-only, managed identity | The orders application |
| PostgreSQL Flexible Server | pg-northwind-prod |
B_Standard_B1ms, PostgreSQL 16 | Order & customer data (private VNet only) |
| Database | northwind_orders |
UTF8 | Application data |
| Key Vault | kv-northwind-prod |
Standard, RBAC, purge protection | Secret storage |
| Log Analytics workspace | log-northwind-prod |
90-day retention | Central log store |
| Application Insights | appi-northwind-prod |
Node.JS | App telemetry & errors |
Infrastructure-as-code: all infrastructure is defined in Terraform under infra/ and managed via remote state. To list live values:
cd infra/environments/production
terraform output
4. User management
Staff roles are assigned in Entra ID, not inside the app.
| App role | Entra app role |
|---|---|
| Manager | Northwind.Manager |
| Counter Staff | Northwind.Staff |
Add a user / assign a role
- Azure Portal → Entra ID → Enterprise Applications.
- Open "Northwind Bakery Orders" (set Application type to All applications if it isn't listed).
- Users and Groups → Add user/group.
- Select the staff member, assign the role (
Northwind.Manager/Northwind.Staff), and confirm.
Change a user's role
Remove the existing assignment (below) and add a new one with the correct role.
Remove / offboard a user
- Entra ID → Enterprise Applications → Northwind Bakery Orders → Users and Groups.
- Select the user → Remove.
Access is revoked immediately. For full offboarding, also disable the account in Entra ID.
5. Security posture
| Control | Status |
|---|---|
| Hosting on a reputable provider | Azure |
| Authentication | Microsoft Entra ID (staff) |
| MFA | Enforced via Conditional Access for all staff |
| Secrets | Azure Key Vault — none in code or repo |
| Encryption in transit | HTTPS / TLS 1.2+ |
| Encryption at rest | Azure-managed |
| Database exposure | Private VNet only — no public endpoint |
| Logging & audit | Azure Monitor / Log Analytics |
| Session / idle handling | Entra session policy |
Secrets
Key Vault: https://kv-northwind-prod.vault.azure.net/
| Secret | Name |
|---|---|
| Database connection string | DATABASE-URL |
| PostgreSQL admin password | PG-ADMIN-PASSWORD |
| Entra ID client secret | ENTRA-CLIENT-SECRET |
No secrets are stored in the application code or repository. The App Service reads DATABASE-URL via a Key Vault reference using its managed identity.
Audit / activity log
The app logs staff sign-ins and order status changes; platform logs flow to Log Analytics. Sample query (last hour of traces):
AppTraces
| where TimeGenerated > ago(1h)
| order by TimeGenerated desc
6. Backups & recovery
- Automated backups: PostgreSQL Flexible Server, 14-day point-in-time retention. View at Portal → PostgreSQL server → Backups.
- Restore procedure: point-in-time restore creates a new server from any moment in the retention window; data is validated before cutover.
Documented restore test
az postgres flexible-server restore \
--resource-group rg-northwind-prod \
--name pg-northwind-restore-test \
--source-server pg-northwind-prod \
--restore-time "2026-05-13T18:00:00Z"
# validate, then delete the test server
az postgres flexible-server delete \
--resource-group rg-northwind-prod \
--name pg-northwind-restore-test --yes
Restore-test record: 2026-05-13 — restored to 18:00 UTC on pg-northwind-restore-test; schema and orders verified intact; success; performed by Will Pickeral.
7. Go-live checklist
| # | Item | Status |
|---|---|---|
| 1 | Production URL confirmed working | ✅ |
| 2 | Resource inventory documented (§3) | ✅ |
| 3 | Data migration notes documented | ✅ |
| 4 | User add/remove/offboarding documented (§4) | ✅ |
| 5 | MFA confirmed | ✅ |
| 6 | Backups + restore test | ✅ |
| 7 | Logging/audit confirmed | ✅ |
| 8 | Secrets documented; none in code | ✅ |
| 9 | Test/demo data removed | ✅ |
| 10 | Real staff provisioned | ✅ |
| 11 | Any compliance/legal gate signed | n/a |
| 12 | Target launch date set | ✅ 2026-05-14 |
8. One-page maintenance guide
Restart the app: Portal → App Service app-northwind-prod → Overview → Restart.
Check logs:
- Live stream: App Service → Log stream.
- Searchable: Application Insights → Logs.
- Health check:
https://orders.northwindbakery.example/api/healthreturns{ "ok": true }.
Add a user: Entra ID → Enterprise Applications → Northwind Bakery Orders → Users and Groups → Add user → assign role. (Full steps in §4.)
Deploy an update: push to main. The pipeline builds, deploys to a staging slot, waits at a manual approval gate, then deploys to production. Database migrations run automatically on startup.
Rotate a secret: update the value in Key Vault kv-northwind-prod; the App Service picks up Key Vault references on restart.
Emergency contact: Will Pickeral — support@williambelle.co.
9. Ongoing support & future work
Ongoing maintenance, support, and development of new features fall outside this deployment engagement and would be arranged under a separate contract or milestone. This engagement is being left open so that anticipated features or changes can be scoped and added as future milestones without a new agreement.
Will Pickeral is available for:
- Maintenance & support — platform updates, dependency patching, incident response, and operational questions.
- New feature development — enhancements, new screens/workflows, and integrations.
To initiate support or new work, contact us and we'll scope it as a new milestone under the open engagement.
10. Contractor contact
Will Pickeral Web: williambelle.co Email: support@williambelle.co