Skip to content
Jetrepo
Esc
navigateopen⌘Jpreview
On this page

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, and IMAGOR_SECRET
  • MINIO_ROOT_USER and MINIO_ROOT_PASSWORD
  • CORE_API_PUBLIC_URL, DELIVERY_API_PUBLIC_URL, ADMIN_APP_PUBLIC_URL, IMAGOR_PUBLIC_URL, and S3_PUBLIC_URL
  • GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET, and GOOGLE_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

  1. Validate Compose interpolation and syntax without printing resolved values. Set JETREPO_NETWORK_NAME when an isolated install must not join the default jetrepo_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
  2. Build and start the production targets.

    docker compose -f docker-compose.prod.yaml up -d --build
  3. 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-setup

    Migration 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.

  4. Probe the public routes. Core API /health and Delivery API /health prove 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
  5. Sign in with an account in the configured Workspace domain. Test sign-out and refresh. Email/password sign-in is disabled.

  6. 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.

Was this page helpful?