Production Deployment
Breeze ships as pre-built Docker images on GitHub Container Registry. A single docker compose up -d brings up a fully working production stack with automatic TLS.
What Gets Deployed
The core stack (docker-compose.yml) includes:
| Service | Image | Purpose |
|---|---|---|
| Binaries Init | ghcr.io/lanternops/breeze/binaries | Copies agent/viewer binaries to a shared volume, then exits |
| Caddy | caddy:2.8-alpine | Reverse proxy, auto-TLS, security headers |
| API | ghcr.io/lanternops/breeze/api | Hono API server |
| Web | ghcr.io/lanternops/breeze/web | Astro SSR dashboard |
| PostgreSQL | postgres:16-alpine | Primary database |
| Redis | redis:7-alpine | Job queue, caching, rate limiting |
An optional monitoring stack (Prometheus, Grafana, Alertmanager, Loki, Promtail, exporters) is available as a separate overlay — see Monitoring.
Deploy Steps
-
Prepare the server
You need Docker and Docker Compose on a Linux VPS. See Prerequisites.
-
Clone and configure
Terminal window git clone https://github.com/LanternOps/breeze.gitcd breezecp .env.example .env -
Set your domain and secrets
Edit
.envand set these required values:Terminal window BREEZE_DOMAIN=breeze.yourdomain.comACME_EMAIL=admin@yourdomain.comGenerate all secrets at once:
Terminal window for key in JWT_SECRET APP_ENCRYPTION_KEY MFA_ENCRYPTION_KEY \ENROLLMENT_KEY_PEPPER MFA_RECOVERY_CODE_PEPPER \METRICS_SCRAPE_TOKEN SESSION_SECRET TURN_SECRET; doecho "${key}=$(openssl rand -hex 32)"doneecho "AGENT_ENROLLMENT_SECRET=$(openssl rand -hex 32)"echo "POSTGRES_PASSWORD=$(openssl rand -base64 24 | tr -d '/+=')"Paste the output into
.env. -
Start the stack
Terminal window docker compose up -dThat’s it. On first start, the API container automatically runs database migrations and seeds the initial admin user. Caddy obtains a TLS certificate from Let’s Encrypt.
-
Verify the deployment
Terminal window # Check healthcurl https://breeze.yourdomain.com/health# Check running containersdocker compose ps# View API logsdocker compose logs -f api
Adding Monitoring
The monitoring stack lives in a separate compose overlay file (docker-compose.monitoring.yml) and includes Prometheus, Grafana, Alertmanager, Loki, Promtail, and database exporters.
To deploy with monitoring:
docker compose -f docker-compose.yml -f docker-compose.monitoring.yml up -dAdd a Grafana password to .env:
GRAFANA_ADMIN_PASSWORD=$(openssl rand -base64 16 | tr -d '/+=')Grafana is available at http://127.0.0.1:3000 (localhost only by default).
Pinning a Version
By default, images pull the latest tag. To pin to a specific release:
# In .envBREEZE_VERSION=0.3.0Then pull and restart:
docker compose pull && docker compose up -dResource Tuning
Override default resource limits via environment variables:
# Redis memory limit (default: 256mb)REDIS_MAXMEMORY=512mbUpdating
cd breezegit pull origin maindocker compose pulldocker compose up -dPre-built images are pulled from GHCR. Database migrations run automatically on startup.