Deployment
Infrastructure overview
Section titled “Infrastructure overview”| Component | Host | Details |
|---|---|---|
| API + Worker | Hetzner (Docker) | Behind Caddy reverse proxy |
| PostgreSQL 16.8 | Hetzner (Docker) | 1 GB memory limit |
| Redis 7.4 | Hetzner (Docker) | 256 MB memory limit |
| Dashboard | Cloudflare Pages | Auto-deploy from main |
| Marketing site | Cloudflare Pages | Auto-deploy from main |
| Docs | Cloudflare Pages | Auto-deploy from main |
Docker
Section titled “Docker”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/:
| File | Purpose |
|---|---|
docker-compose.yml | Production |
docker-compose.dev.yml | Local development |
docker-compose.coolify.yml | Coolify 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.
Health check
Section titled “Health check”GET /healthReturns 200 OK when both PostgreSQL and Redis are reachable. Returns 503 Service Unavailable if either dependency is down.
Monitoring
Section titled “Monitoring”- Prometheus —
/metricsendpoint, internal only, protected by token authentication - GlitchTip — error tracking (Sentry-compatible)
- OpenTelemetry — distributed tracing
Backups
Section titled “Backups”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.
Rollback
Section titled “Rollback”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.