Documentation

Deploying Atlas (Docker / Coolify)

AdminUpdated Sep 11, 2026

Deploying Atlas (Docker / Coolify)

This is the end-to-end path to a running Atlas, following the reference docker-compose.coolify.yml. Kubernetes users will recognize the same steps against the manifests in deploy/k8s.

The deployment topology

Prerequisites

  • A host with Docker (the reference uses a Coolify-managed box).

  • PostgreSQL and Redis reachable from the containers.

  • A DNS name and the ability to issue TLS (Let's Encrypt via the proxy).

Step 1 — Create the database

On your Postgres, create a dedicated database (the reference calls it atlas). Atlas connects as a normal role against that database; it doesn't need RLS or a per-tenant role.

Step 2 — Get the source and configure the resource

Point Coolify (or your CI) at the repository and create a Docker Compose resource from docker-compose.coolify.yml. It builds three images — api and worker from the root Dockerfile, and web from deploy/web.Dockerfile (the marketing site from deploy/marketing.Dockerfile).

Set the environment from deploy/atlas.env.example (see Configuration & secrets for what each value means). At minimum you need DATABASE_URL, REDIS_URL, DATA_ENCRYPTION_KEY, PLATFORM_INSTANCE_ID and the origin (ATLAS_ORIGIN, used for FAPI_ORIGIN/BAPI_ORIGIN).

Step 3 — Deploy

Coolify builds the images and starts api, web and worker on the shared network behind the proxy. The proxy issues TLS for your host.

Step 4 — Run migrations

Migrations run from the built production image (no tsx needed):

docker run --rm --network <net> -e DATABASE_URL=$DATABASE_URL \
  <atlas-api-image> packages/db/dist/migrate.js

Step 5 — Bootstrap the platform instance

Create the platform instance and the first admin user (prints a generated password when ADMIN_PASSWORD is unset):

docker run --rm --network <net> \
  -e DATABASE_URL=$DATABASE_URL -e ATLAS_ORIGIN=$ATLAS_ORIGIN \
  -e PLATFORM_INSTANCE_ID=inst_platform_dashboard \
  <atlas-api-image> apps/api/dist/scripts/bootstrap.js

Step 6 — Sign in and verify

Visit https://<your-host>/, sign in with the admin credentials, and confirm:

  • GET /v1/health returns 200.

  • A full sign-in reaches the dashboard.

  • The session survives a refresh (proves the same-origin cookie is correct).

A note on host names

The proxy's Host() routing rules live in the compose file's labels:, which are not interpolated from environment variables. When you move to a real domain, replace the host in those labels (and update the origin envs) — see the launch runbook shipped in deploy/.

Next

Understand the secrets that hold it together → Configuration & secrets.

Was this page helpful?