Browse docs
Ship

Put It on the Internet With Coolify

A fresh server, Coolify, four required settings and one deploy. Every step was followed on a new server with the times measured.

Updated Oct 2026
On this page

We followed this on a fresh DigitalOcean server (2 vCPU, 4 GB, $24 a month) and kept the result: the live InvoiceFlow demo runs on it. The repo's docs/deploy/coolify.md has every detail; this is the path.

1. A server with Coolify

  1. Create an Ubuntu server with at least 2 vCPU and 4 GB of memory. With the app running, ours used about 2 GB.
  2. Point your domain at it: an A record for app.yourdomain.com to the server's IP.
  3. Install Coolify with its one-line installer. It took 135 seconds.
  4. Open Coolify on port 8000 and create the admin account right away (the first person to open it becomes the owner). Coolify then shows a setup wizard; Skip setup is fine.

2. The resource

  1. Projects, + Add, Resource, and pick your private repository (through Coolify's GitHub App, or a deploy key).
  2. Build Pack: Docker Compose, Base Directory /deploy, Docker Compose Location /docker-compose.yml.
Coolify's general settings for the app with the Docker Compose build pack
The build settings. Nothing in the repository needs editing for Coolify.
  1. On the web service, Domains: https://app.yourdomain.com:8000. The :8000 is the port inside the container; visitors use normal HTTPS.
The web service's domain setting in Coolify
Coolify gets the HTTPS certificate for this domain by itself.

3. Environment variables

Environment Variables, Developer view. Four are required; the containers refuse to start without them:

Variable Value
SECRET_KEY a long random string; in your project folder: uv run python -c "import secrets; print(secrets.token_urlsafe(64))"
POSTGRES_PASSWORD another random string
SITE_URL https://app.yourdomain.com
ALLOWED_HOSTS app.yourdomain.com

Then: SUPERUSER_EMAIL and SUPERUSER_PASSWORD (your owner account), ADMIN_PANEL_SLUG (a private path for the panel instead of /panel/), EMAIL_PROVIDER with its key, DEFAULT_FROM_EMAIL, and BACKUP_TIME=03:00 for nightly backups.

The environment variables in Coolify's developer view, values hidden
Values masked here. Paste yours in the same view.

Set up email before you invite anyone

Without an email provider, emails are only written to the worker's log. Nobody can confirm their address, so nobody can sign up. Set EMAIL_PROVIDER=resend with RESEND_API_KEY (or SMTP) before you share the link.

4. Deploy

Click Deploy. Coolify builds the image, starts Postgres and Redis, runs migrate (which creates your owner account), then starts the web server and the worker. Our first deploy took 343 seconds. The status then reads Running (no healthcheck); that label is normal for a Compose app.

Coolify's deployment log finishing
The first deploy. Later ones reuse the cache but still rebuild the app image.

Check it:

  1. https://app.yourdomain.com/health/ready/ answers {"status": "ok", ...}.
  2. Sign in with SUPERUSER_EMAIL, set up two-factor, and open /YOUR-ADMIN-PANEL-SLUG/.
  3. Panel, Settings, General: your site name (see Make It Yours).

5. Stripe and AI in production

  • Stripe: live keys in the environment, a webhook endpoint for https://app.yourdomain.com/billing/webhooks/stripe/ with the seven events, its signing secret, then the plans in the panel and Sync all to gateway. The steps are at the end of Sell It With Stripe.
  • AI: ANTHROPIC_API_KEY in the environment, redeploy, then panel, AI: switch it on and set a monthly budget.

6. Every later deploy

Push to your repository, then Redeploy in Coolify, or from your computer:

uv run poe deploy

It triggers Coolify and waits until the new release answers healthy. It needs COOLIFY_WEBHOOK and COOLIFY_TOKEN in your local .env; give the token both Deploy and Read (Coolify's form unticks Read when you tick Deploy, and without Read the script cannot follow the deploy).

Coolify's API token form
Tick Deploy, then make sure Read is still ticked.

Measured on our server: a redeploy took about 5 to 6 minutes, and the site was down for 103 seconds of it, because Coolify recreates the whole stack and runs migrate before the web server starts. For deploys without downtime, see the repo's docs/deploy/zero-downtime.md.

Where are migrate's messages?

Not in the deployment log, and not in Runtime Logs once the migrate container has finished. Right after a deploy, open Servers, localhost, Terminal and run docker logs $(docker ps -a -q --filter name=migrate- | head -1).

7. Backups

With BACKUP_TIME=03:00, a backup container saves the database and the uploaded files every night and keeps 7 days. We tested the restore for real: deleted a user, ran restore_db.sh, and the user was back. The steps are in the repo's docs/deploy/backups.md.

No Coolify?

On any server with Docker, Caddy gives you HTTPS with one command (docs/deploy/vps-caddy.md). On a fresh droplet it was up, with a real certificate, in 193 seconds.

Next: Where Everything Is.

Stop wiring plumbing. Start describing your product.

A Django SaaS starter written for Claude Code: accounts, Stripe billing with credits, an admin panel, jobs, email, AI and a Coolify deploy, finished and tested. You describe the product.

Get it for $49 →