Production cutover checklist¶
AgentBI on the shared VPS (Traefik HTTPS). Live example: https://agentbi.online.
Prerequisites¶
- DNS — A record for
AGENTBI_DOMAIN→ VPS public IP (see deploy/DNS.md). - Secrets on VPS — in
/home/smdg/agentbi:bash cp .env.production.example .env # Required: POSTGRES_PASSWORD, REDIS_PASSWORD, SECRET_KEY, ADMIN_PASSWORD # Required: AGENTBI_DOMAIN, CORS_ORIGINS=https://$AGENTBI_DOMAIN # Recommended: ADMIN_API_KEY (platform tenant bootstrap) # SSO (Google): GOOGLE_SSO_ENABLED=true, GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET # SSO_PUBLIC_BASE_URL / SSO_FRONTEND_URL = https://$AGENTBI_DOMAIN # Billing: STRIPE_SECRET_KEY, STRIPE_WEBHOOK_SECRET, STRIPE_PRICE_PRO, STRIPE_PRICE_BUSINESS # STRIPE_SUCCESS_URL / STRIPE_CANCEL_URL → …/settings.html?billing=success|cancel # Observability: SENTRY_DSN, LOG_JSON=true, JWT_EXPIRE_MINUTES=480 chmod 600 .env - Google OAuth — redirect URI:
https://$AGENTBI_DOMAIN/api/v1/auth/sso/callback - Stripe — webhook:
https://$AGENTBI_DOMAIN/api/v1/billing/webhook
Events:checkout.session.completed,customer.subscription.*
Deploy¶
- Fresh DB password — if the Postgres volume used a weak password,
ALTER USERor wipe volumes once (data loss). - Deploy — push to
main(CI → Deploy) or:bash COMPOSE_FILE=docker-compose.prod.yml ./deploy.shDeploy builds SHA-tagged images, backs up DB before migrate, runs Alembic, writesVERSION. - Verify
curl -sf https://$AGENTBI_DOMAIN/api/v1/health/readycurl -sf https://$AGENTBI_DOMAIN/api/v1/version→ matches deploy SHA- Open UI, sign in;
/docsmust be 404 in production - SSO: Google button; map email domains first (Users → Organizations)
- Cross-tenant ingest isolation (
bt_keys) - Settings → Billing / Stripe Checkout + Customer Portal
- Settings → Domain (optional vanity host — DB only)
Tenant + SSO mapping¶
Prefer UI: Users → Organizations → SSO email domains (comma-separated, unique across tenants).
bash
curl -X POST https://$AGENTBI_DOMAIN/api/v1/tenants \
-H "X-Admin-Key: $ADMIN_API_KEY" \
-H "Content-Type: application/json" \
-d '{"name":"Acme Corp","allowed_email_domains":["acme.com"]}'
SSO @acme.com users auto-provision into that tenant. Unknown domains are rejected. IdP roles are capped at admin (never super_admin).
Ops¶
- Backups — cron
./scripts/backup_postgres.sh+ pre-migrate dumps fromdeploy.sh; copy off-host. - Docker prune —
./scripts/vps/install_vps_ops.sh(daily safe prune). - Swap —
sudo /home/smdg/bin/setup-swapfileonce (2G, low swappiness). - Rotate — change bootstrap admin password in-app.
- Monitor — Sentry alerts + uptime on
/api/v1/health/readyfor 48h after cutover.
Rollback¶
```bash ./scripts/rollback.sh --sha "$(cat VERSION.prev)"
optional: --restore backups/backup_….dump.gz¶
```
Or redeploy a previous git SHA via Actions (workflow_dispatch / prior commit).