Production checklist
The Compose defaults are tuned for a laptop. Work through this list before an install serves a team.
Must do
Section titled “Must do”-
Set
SECRET_KEY. The JWT signing key. The app refuses to boot on the insecure default wheneverAPP_ENVis anything other thandev,testorlocal. Generate one:Terminal window python -c "import secrets; print(secrets.token_urlsafe(48))" -
Set
APP_ENV=production. This turns the safety checks above into hard failures and disables development fallbacks such ascreate_allschema initialisation. -
Change the seed admin password.
SEED_ADMIN_PASSWORDdefaults toadmin. Set it before the first boot or reset it immediately afterwards. -
Change the database passwords.
POSTGRES_PASSWORDandYUPCHA_RUNTIME_DB_PASSWORDdefault to well-known values. Keep the schema owner (DATABASE_URL) and the runtime role (APP_DATABASE_URL) separate so forced row-level security applies to API and worker traffic. -
Put TLS in front. The bundled nginx listens on plain HTTP on port 3000. Terminate TLS with your reverse proxy of choice and forward to it.
-
Back up the data volume. PostgreSQL holds the data plane, and the
data/volume holds the workspace control plane (workspaces.db, encrypted workspace secrets, collection ledgers). Both need to be in the backup.
Should do
Section titled “Should do”- Run exactly one scheduler. Scale
workerfreely; do not scalescheduleruntil leadership election exists. - Keep PostgreSQL and Redis private. Compose binds them to loopback for host administration; do not publish them on a LAN interface.
- Pin an image tag. Deploy from a tagged GHCR image
(
ghcr.io/debpalash/opengtm:<version>) rather thanlatest, and run migrations once with the owner role before starting the runtime services. - Rotate provider keys per workspace. Keys entered in
Settings → API Keys are encrypted per workspace and never placed in queue
payloads; prefer them over global
.envkeys when more than one team shares the install. - Set a spend ceiling on workbooks that use paid providers, so a runaway refresh cannot exhaust a vendor budget.
Before hosting mutually untrusted tenants
Section titled “Before hosting mutually untrusted tenants”OpenGTM’s tenant isolation is PostgreSQL RLS plus application-level checks, which is a strong boundary for one organisation’s workspaces. Before offering it to strangers as a service, the architecture notes list what still has to move: a controlled egress proxy for outbound fetches, managed key storage for the workspace secret encryption key, SSO and audit export, restore drills, and an external security review. Offering OpenGTM as a network service also triggers the AGPL source-availability clause; see License.