Production Checklist
Pre-flight verification for deploying Edictum Console to production. Covers secrets, HTTPS, database, monitoring, and security hardening.
Right page if: you are deploying Edictum Console to production and need a checklist to verify your configuration is secure and complete. Wrong page if: you are setting up a local development instance -- see https://docs.edictum.ai/docs/console/setup. For the full architecture, see https://docs.edictum.ai/docs/console/architecture. Gotcha: the console runs as a single instance (no horizontal scaling yet). Use managed Postgres and Redis in production for HA. HTTPS is required for Secure cookies -- without it, session cookies are transmitted in cleartext.
Use this checklist before promoting your console deployment to production.
Required Environment Variables
These must be set or the server will not function correctly:
| Variable | How to generate | Notes |
|---|---|---|
EDICTUM_SECRET_KEY | python -c "import secrets; print(secrets.token_hex(32))" | 64-char hex string. Signs session tokens. |
EDICTUM_DATABASE_URL | postgresql+asyncpg://user:pass@host:5432/edictum | Must use the asyncpg driver. |
EDICTUM_REDIS_URL | redis://host:6379/0 or rediss://... for TLS | Sessions and rate limiting. |
EDICTUM_SIGNING_KEY_SECRET | python -c "import secrets; print(secrets.token_hex(32))" | 64-char hex string. Encrypts Ed25519 private keys at rest. Required for bundle signing. |
EDICTUM_BASE_URL | https://console.yourcompany.com | Must be https:// — enables Secure flag on cookies. |
Security
- HTTPS enabled —
EDICTUM_BASE_URLstarts withhttps://. Without it, session cookies lack the Secure flag and are transmitted in cleartext. The server logs a warning at startup if HTTP is detected. - CORS origins configured —
EDICTUM_CORS_ORIGINSset to your domain(s). The server rejects wildcard*and strips localhost origins whenbase_urlis non-localhost. - Environment set to production —
EDICTUM_ENV_NAME=productionhides/docs,/redoc, and/openapi.jsonendpoints. - Admin account created — either via
EDICTUM_ADMIN_EMAIL+EDICTUM_ADMIN_PASSWORD(min 12 chars) or through the/dashboard/setupwizard on first visit. - Signing key configured —
EDICTUM_SIGNING_KEY_SECRETset. Without it, bundle signing is unavailable and deployments push unsigned YAML. - Rate limiting verified — default is 10 login attempts per 300 seconds per IP. Adjust with
EDICTUM_RATE_LIMIT_MAX_ATTEMPTSandEDICTUM_RATE_LIMIT_WINDOW_SECONDSif needed. - Trusted proxies set — if behind a reverse proxy, set
EDICTUM_TRUSTED_PROXIESto your proxy IPs (comma-separated) to enable correctX-Forwarded-Forparsing for rate limits.
Database
- Managed Postgres recommended — use RDS, Cloud SQL, or equivalent for automated backups, replication, and failover. The Kustomize manifests include a single-replica StatefulSet for development only.
- Backup schedule configured — Edictum does not manage backups. Set up daily automated snapshots.
- Backup restore tested — verify you can restore from a snapshot and the console starts correctly.
- Event partitioning verified — the console automatically creates monthly partitions for the
Eventtable (next 3 months). Check the background worker is running:GET /api/v1/health→workers.partition: "running". - Event retention policy set — configure purge from Settings → Danger Zone (30/60/90 days). Events grow without bounds if not purged.
Redis
- Managed Redis recommended — use ElastiCache, Upstash, or equivalent. The default Kustomize manifests run Redis without persistence (
--save "" --appendonly no). - TLS enabled — use
rediss://URL for encrypted connections (Upstash, ElastiCache with in-transit encryption). - Understand the failure mode — if Redis goes down, sessions are lost (users must re-login) and rate limiting is bypassed until Redis recovers.
Monitoring
- Health endpoint monitored — poll
GET /api/v1/healthand alert onstatus: "degraded". The response includes database latency, Redis connectivity, connected agent count, and worker status. - Readiness probe configured —
GET /api/v1/health/readyreturns 503 when Postgres or Redis is down or any worker has crashed. Use as Kubernetes readiness probe. - Liveness probe configured —
GET /api/v1/health/livereturns 200 if the process is alive. Use as Kubernetes liveness probe. - Worker health checked — the health response includes
workers.approval_timeoutandworkers.partitionstatus. Alert on"crashed"or"stopped". A built-in monitor auto-restarts crashed workers within 60 seconds.
Deployment
- Single replica — the console does not support horizontal scaling yet. Run exactly one replica. The deployment strategy should be
Recreate(notRollingUpdate) to prevent concurrent Alembic migrations. - Migration lock — Alembic uses PostgreSQL advisory lock (id=43) to prevent concurrent schema migrations. The startup probe should allow 120 seconds for migrations on first deploy.
- Session TTL reviewed — default is 24 hours (
EDICTUM_SESSION_TTL_HOURS). Adjust based on your security policy.
Notification Channels
- At least one channel configured — if using HITL approvals, configure Slack, Telegram, Discord, webhook, or email from Settings → Notification Channels.
- Test button clicked — each channel has a test button. Verify delivery before relying on it for production approvals.
- Routing filters set — configure per-channel filters (environments, agent patterns, contract names) to avoid alert fatigue.
- Understand the failure mode — if a notification channel fails (SMTP down, Slack rate-limited), the approval still proceeds — it just isn't notified. Channels fail independently; one failure doesn't block others.
Agent Connectivity
- Agent SDK version matches — agents should use
edictum[server]v0.15.0+. Older SDK versions may omitbundle_namein event payloads. - API keys created — create environment-scoped API keys from the dashboard. The full key is shown once and cannot be retrieved again.
- SSE connection verified — after connecting an agent, check Fleet Monitoring for the agent's entry. If missing, check the API key, agent ID, and network connectivity.
- Drift monitoring enabled — after deploying a bundle, verify agents show the correct
policy_versionin Fleet Monitoring. Drifted agents typically resolve automatically when the SSE connection reconnects.
Next Steps
- Console setup — local development quickstart
- Self-hosting guide — build from source, troubleshooting
- Failure modes — what happens when components fail
- Fleet monitoring — drift detection and coverage analysis
Last updated on