Deploying Atlas (Docker / Coolify)
- Written for
- + Written for
- Deprecated
- + Deprecated
- Applies to
- + Applies to
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.

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.jsStep 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.jsStep 6 — Sign in and verify
Visit https://<your-host>/, sign in with the admin credentials, and confirm:
GET /v1/healthreturns200.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.