Skip to content

Deployment

ComponentHostDetails
API + WorkerHetzner (Docker)Behind Caddy reverse proxy
PostgreSQL 16.8Hetzner (Docker)1 GB memory limit
Redis 7.4Hetzner (Docker)256 MB memory limit
DashboardCloudflare PagesAuto-deploy from main
Marketing siteCloudflare PagesAuto-deploy from main
DocsCloudflare PagesAuto-deploy from main

The API uses a multistage Dockerfile based on golang:1.26-alpine. Images are pushed to GitHub Container Registry (GHCR).

Three Docker Compose configurations exist in deploy/:

FilePurpose
docker-compose.ymlProduction
docker-compose.dev.ymlLocal development
docker-compose.coolify.ymlCoolify deployment

Production services: API (port 8080), Worker, PostgreSQL, Redis, and Caddy (ports 80/443 with automatic TLS).

GitHub Actions run on self-hosted runners hosted on Hetzner. The pipeline builds Docker images, runs tests, and deploys on merge to main.

Versioning — release-please manages changelogs and version bumps.

CLI binaries — GoReleaser builds and publishes CLI binaries for Linux, macOS, and Windows on each release.

GET /health

Returns 200 OK when both PostgreSQL and Redis are reachable. Returns 503 Service Unavailable if either dependency is down.

  • Prometheus/metrics endpoint, internal only, protected by token authentication
  • GlitchTip — error tracking (Sentry-compatible)
  • OpenTelemetry — distributed tracing

A daily backup runs at 02:00 UTC via deploy/scripts/backup.sh. It produces compressed SQL dumps of the PostgreSQL database. Backups are retained for 7 days.

To roll back the API or worker, deploy the previous Docker image by SHA. If the release included a database schema change, restore the most recent backup taken before the migration ran.