Skip to main content

Best fit

  • Single-host setups.
  • Teams that want Docker-based local and production parity.
  • Operators comfortable managing environment files and redeploying containers.

Local runtime

Use infra/docker/docker-compose.yml:
docker compose --env-file .env -f infra/docker/docker-compose.yml up --build
If you also want a local Postgres container:
docker compose --env-file .env -f infra/docker/docker-compose.yml --profile local-postgres up --build

Production runtime

Use infra/docker/docker-compose.production.yml. Supabase mode:
docker compose --env-file .env -f infra/docker/docker-compose.production.yml up -d --build
Postgres + S3 mode with local Postgres:
docker compose --env-file .env -f infra/docker/docker-compose.production.yml --profile local-postgres up -d --build

Required runtime values

After containers are up

Run database migrations:
docker compose --env-file .env -f infra/docker/docker-compose.production.yml exec web npm run db:push
If you are using the local Postgres profile, wait for the database container to become healthy first.

Common operations

docker compose -f infra/docker/docker-compose.production.yml ps
docker compose -f infra/docker/docker-compose.production.yml logs -f web
docker compose -f infra/docker/docker-compose.production.yml logs -f caddy
For a full VPS walkthrough using Docker Compose with domain and TLS setup, see VPS.