Anatomy of an easy deploy
What it actually takes to add a new app to the platform — the three-rule contract that keeps every project plug-and-play.
The whole point of the setup is that adding a project is boring. Here’s the contract every app follows.
Three rules
- Be containerizable — a
Dockerfile, or a layout the build pack understands. - Read config from env vars — especially
DATABASE_URLandPORT. - Listen on one HTTP port — the proxy handles domain, TLS, and the gate.
That’s it. No SDK, no shared framework, no coupling.
The recipe
# 1. give it a database
infra/db/new-db.sh my-app
# 2. connect the repo in Coolify, paste the DATABASE_URL, set the domain
# 3. (optional) add the gatekeeper label to gate it
# 4. git push → it's live
Because the same container runs locally and in production, there are no surprises
between docker compose up on my laptop and the deploy on the server. The proxy and
the password gate sit outside the app, so I write each project as if it’s wide open.