Laptop rehearsal
Run the production recipe as compose projects on one machine before touching a server.
deploy/README.md's "Laptop rehearsal" runs the same three zones as separate compose projects on one Docker network, so what you rehearse is what Coolify runs. Every command below is the README's own and was run as written there.
docker network create keyring-net
cp deploy/data/.env.example deploy/data/.env
cd deploy/data
grep -v 'exclude_from_hc: true' docker-compose.yml > .compose-rehearsal.yml
docker compose -p kr8data -f .compose-rehearsal.yml --env-file .env up -d
cd ../..
cp deploy/api/.env.example deploy/api/.env
cd deploy/api
grep -v 'exclude_from_hc: true' docker-compose.yml > .compose-rehearsal.yml
docker compose -p kr8api -f .compose-rehearsal.yml -f docker-compose.rehearsal.yml --env-file .env up -d
cd ../..
cp deploy/dashboard/.env.example deploy/dashboard/.env
cd deploy/dashboard
docker compose -p kr8dash -f docker-compose.yml -f docker-compose.rehearsal.yml --env-file .env up -d
cd ../..Fill each .env before its up: three openssl rand -hex 32 values for data, the same KEYRING_APP_PASSWORD plus a pepper and a Redis password for api, one session secret for dashboard.
.compose-rehearsal.yml strips exclude_from_hc, a Coolify-only key a real docker compose refuses. Each zone's docker-compose.rehearsal.yml adds the host port a laptop needs and Coolify never gets: 13000 for the api and 13001 for the dashboard.
curl -s http://127.0.0.1:13000/readyz
curl -o /dev/null -s -w '%{http_code}\n' http://127.0.0.1:13001/The first answers {"status":"ok","region":"eu","database":"ok",...} once data is up; the second answers 307 once the dashboard has started.
The docs site rehearses the same way from deploy/docs, with docker-compose.rehearsal.yml publishing it on 13002.
Then a real app
docs/dogfood.md in the repository continues from here: the first workspace over curl, a Next.js and a NestJS app verifying a real key against this stack, a revoke timed at four to five seconds, and the control plane stopped under a running app to measure exactly what stale-then-open admits and when.
Tear down
Reverse order, each from its own directory, with down -v, then docker network rm keyring-net.