Deploy Keeper to Azure Container Apps
This page documents the bridge-hosting reference for Marvin plus Paranoid Keeper on Azure Container Apps.
It is useful when you need to study or compare an always-on hosted bridge pattern, but it is not the final Marvin product boundary.
What this path is for
Use this document when you want:
- a scripted Azure deployment reference
- Marvin as the public front door
- a Keeper-style backend bridge behind Marvin
- an example of always-on hosted runtime shape on Azure
If you want the primary Paranoid Keeper product path first, read Paranoid Keeper on Azure.
What this deployment does
The repo deployment script:
- reads your local bridge runtime configuration
- creates or reuses the standards-based resource group
- creates or reuses an Azure Container Registry for the Marvin image
- builds the Marvin image from the local repo
- deploys Log Analytics, PostgreSQL Flexible Server, Container Apps environment, and the hosted runtime through Bicep
- runs
marvin-ui,keeper, andredisin the same Container App - exposes Marvin on the public URL and keeps Keeper behind
/keeper - pins the runtime to
minReplicas: 1andmaxReplicas: 1 - updates auth and trusted-origin settings to the final Azure Container Apps URL
Preferred repo flow
npm install
npm run marvin:uiThen open localhost:4177, complete the Marvin setup flow, and only use this page if you specifically want the older bridge-hosting pattern.
Prerequisites
- Azure subscription with rights to create resource groups, Azure Container Registry, PostgreSQL Flexible Server, and Container Apps
- Azure CLI installed
az logincompleted- local bridge runtime configuration created from the repo
- Microsoft OAuth credentials if Microsoft calendars will participate
- Google OAuth credentials if Google calendars will participate
Deploy from the repo
powershell -ExecutionPolicy Bypass -File .\solutions\paranoid-keeper\deploy-azure-container-app.ps1 `
-SubscriptionId <subscription-guid> `
-WorkloadName marvin `
-Environment dev `
-RegionShort wus3 `
-Location westus3 `
-Instance 01That produces the standards-based names:
rg-marvin-dev-wus3-01law-marvin-dev-wus3-01psql-marvin-dev-wus3-01cae-marvin-dev-wus3-01ca-marvin-dev-wus3-01acrmarvindevwus301
What opens after deployment
The public URL opens Marvin, not Keeper.
From there:
- sign in to Marvin
- review the calendar profile and sync policy
- continue provider authorization only if this bridge path is the one you intentionally chose
- validate route behavior with a narrow test window first
Operational notes
Runtime layout
The hosted runtime is one Container App with three containers:
marvin-uikeeperredis
Marvin is exposed publicly on port 3001. Keeper remains internal to the same app on port 3000 and is routed through Marvin under /keeper.
Secrets
The deployment stores runtime secrets in Azure Container Apps secrets. For stricter production controls, move those secrets into Azure Key Vault later and rotate them there.
Availability
The deployment sets:
minReplicas: 1maxReplicas: 1
That keeps the bridge runtime continuously available.