Install Jetrepo
Configure, build, migrate, start, and verify the production stack.
Install from a trusted release checkout with docker-compose.prod.yaml. The production images, one-shot migration, isolated volumes, declared health checks, and exact Published read paths have been drilled together. DNS, TLS, Google OAuth, and the first human Organization activation remain deployment-specific.
Access
You need host, DNS, TLS, reverse-proxy, Google OAuth, and deployment-secret administration.
Set required values
Provide all 15 required values before starting:
POSTGRES_PASSWORD,REDIS_PASSWORD,BETTER_AUTH_SECRET,ENVIRONMENT_WORKER_SECRET, andIMAGOR_SECRETMINIO_ROOT_USERandMINIO_ROOT_PASSWORDCORE_API_PUBLIC_URL,DELIVERY_API_PUBLIC_URL,ADMIN_APP_PUBLIC_URL,IMAGOR_PUBLIC_URL, andS3_PUBLIC_URLGOOGLE_CLIENT_ID,GOOGLE_CLIENT_SECRET, andGOOGLE_ALLOWED_DOMAIN
The production stack forwards IMAGOR_PUBLIC_URL and IMAGOR_SECRET to both Core and Delivery, using the same signing secret as the Image service. The storage guide describes verification.
Register this Google callback exactly:
${CORE_API_PUBLIC_URL}/api/auth/callback/google
POSTGRES_PASSWORD is required by the Postgres service even when DATABASE_URL is set explicitly. If your shell already exports DATABASE_URL, Compose uses it instead of the internal Postgres default; unset it unless that override is intentional.
Start the stack
-
Validate Compose interpolation and syntax without printing resolved values. Set
JETREPO_NETWORK_NAMEwhen an isolated install must not join the defaultjetrepo_network.unset DATABASE_URL # omit only for an intentional external database export JETREPO_NETWORK_NAME=${JETREPO_NETWORK_NAME:-jetrepo_network} docker compose -f docker-compose.prod.yaml config --quiet -
Build and start the production targets.
docker compose -f docker-compose.prod.yaml up -d --build -
Inspect all services and both one-shot tasks.
docker compose -f docker-compose.prod.yaml ps -a docker compose -f docker-compose.prod.yaml logs --tail=200 migrate minio-setupMigration must exit 0 before Core API, Delivery API, and Worker can start. Object setup must also exit 0, but it does not gate those services; confirm it separately before testing uploads or images.
-
Probe the public routes. Core API
/healthand Delivery API/healthprove only Postgres connectivity. Admin/proves only an HTTP response.curl -fsS "$CORE_API_PUBLIC_URL/health" curl -fsS "$DELIVERY_API_PUBLIC_URL/health" curl -fsS "$ADMIN_APP_PUBLIC_URL/" > /dev/null -
Sign in with an account in the configured Workspace domain. Test sign-out and refresh. Email/password sign-in is disabled.
-
After product access exists, use non-sensitive test content to verify a Draft write, published Delivery API read, upload, Worker metadata completion, public original-object download, and one signed image transform. These functional checks cover dependencies that the health endpoints omit.
If first installation fails, preserve pgdata, redis_data, and minio_data and capture redacted logs. Correct the configuration and recreate only affected services. Never use volume deletion as installation rollback.
For an upgrade with Backends created before immutable Resource History existed, follow the migration plus jetrepo-resource-history-bootstrap gate in Upgrade Jetrepo. A new empty installation needs no history backfill.