This site is under active development. Some services and pages may not be fully ready yet.

All documentation

Docker Setup

Development, staging, and production Docker Compose configurations with all services.

The platform ships as a Docker Compose stack. Production and development use separate compose files so that development conveniences never reach a live install.

Services

ServiceRole
appPHP-FPM running the Laravel API.
nginxServes the API and static public assets, and fronts app.
postgresPostgreSQL database.
redisCache, sessions and queues.
queue-workerProcesses queued jobs, including all provisioning.
schedulerRuns the cron-driven tasks: billing, reminders, backups.
frontendNext.js portal (development compose only; in production this is usually built and hosted separately).

Starting production

docker compose -f docker-compose.prod.yml up -d --build
docker compose -f docker-compose.prod.yml exec app php artisan migrate --force
Noteapp and nginx are separate images, and the nginx image bakes in backend/public at build time. If you change anything under backend/public, rebuild nginx as well or the old file will keep being served.

Applying code changes

Application code is baked into the image rather than mounted, so a git pull alone changes nothing that is running. Rebuild the app image, recreate the containers, then run migrations.

git pull --ff-only
docker compose -f docker-compose.prod.yml build app
docker compose -f docker-compose.prod.yml up -d --no-deps app queue-worker scheduler
docker compose -f docker-compose.prod.yml exec app php artisan migrate --force
TipRecreating app gives it a new container IP. If nginx resolved the old one at start-up you will see 502s until you restart nginx too.