Pick a shape
The database
The checklist
Whatever you deploy on, these have to be true.PUBLIC_URL is https and reachable by runner machines
PUBLIC_URL is https and reachable by runner machines
The dashboard and the API are on the same site
The dashboard and the API are on the same site
app.example.com and api.example.com. Different sites means the session
cookie is not sent and nobody can sign in.NEXT_PUBLIC_API_URL is set in the build environment
NEXT_PUBLIC_API_URL is set in the build environment
localhost default fails on purpose.CREDENTIALS_KEY is generated, stored and backed up
CREDENTIALS_KEY is generated, stored and backed up
openssl rand -base64 32, in a secret store, backed up as you would a
root key. Losing it loses every connected cloud. The development example
key is refused outside development.Secrets are in a secret store, not in environment files
Secrets are in a secret store, not in environment files
DATABASE_URL, CREDENTIALS_KEY, GITHUB_CLIENT_SECRET,
GITHUB_WEBHOOK_SECRET and the private key.The migration runs before the new version starts
The migration runs before the new version starts
DEV_LOGIN and the provider endpoint overrides are unset
DEV_LOGIN and the provider endpoint overrides are unset
DEV_LOGIN fails startup outside development. The *_ENDPOINT variables
would silently point launches at a test emulator.The image includes the cache proxy
The image includes the cache proxy
linux/amd64 and
linux/arm64. A plain go build leaves it out and cache-enabled runners
quietly lose acceleration.The database is backed up
The database is backed up
/healthz is wired to your load balancer
/healthz is wired to your load balancer
/docs is where the API documents itself.Scaling
Several API replicas are safe
Postgres is the thing to watch
Upgrading
Run the migration
Roll the API replicas
Deploy the dashboard
NEXT_PUBLIC_API_URL set at build time.Bump RUNNER_VERSION when actions/runner releases