Deployment — Docker Compose
Prerequisites
| Tool | Version |
|---|---|
| Docker Engine | 24+ |
| Docker Compose plugin | 2.20+ |
| RAM | 2 GB minimum, 4 GB recommended |
Quick start
Shellgit clone https://github.com/VisionLab-de/VisionPush.git cd VisionPush # Copy and configure environment cp .env.example .env # At minimum set JWT_SECRET and CREDENTIAL_ENCRYPTION_KEY docker compose -f infra/docker/docker-compose.yml up -d --build # Admin panel dev server cd admin && npm install && npm start
Services
| Service | Port | Description |
|---|---|---|
| postgres | 5433 | PostgreSQL 16 with WAL archiving |
| nats | 4222, 8222 | NATS JetStream |
| minio | 9000, 9001 | S3-compatible object storage (dev only) |
| visionpush-api | 8090 | REST API + OAuth server |
| visionpush-worker | — | Background push processor |
| webseite | 8080 | Landing page (nginx) |
| backup | — | WAL-G scheduled backup (daily 02:00 UTC) |
| grafana | 3001 | Metrics dashboard (admin / admin) |
| prometheus | 9090 | Metrics collection |
| tempo | 3200 | Distributed tracing |
Environment variables
Copy .env.example to .env and fill in the required values:
.env# Required JWT_SECRET=$(openssl rand -base64 32) CREDENTIAL_ENCRYPTION_KEY=$(openssl rand -base64 32) # Database (pre-configured for Docker Compose) DATABASE_URL=postgres://visionpush:visionpush_dev_secret@postgres:5432/visionpush # NATS NATS_URL=nats://nats:4222 # Blob storage — filesystem (default) STORAGE_BACKEND=filesystem STORAGE_PUBLIC_URL=http://localhost:8090/media STORAGE_DATA_DIR=./data/blobs # Blob storage — S3 / Cloudflare R2 (production) # STORAGE_BACKEND=s3 # S3_BUCKET=your-bucket # S3_REGION=auto # S3_ENDPOINT=https://account.r2.cloudflarestorage.com # AWS_ACCESS_KEY_ID=... # AWS_SECRET_ACCESS_KEY=... # SMTP (optional — password reset + team invites) # SMTP_HOST=smtp.resend.com # SMTP_PORT=587 # SMTP_USER=resend # SMTP_PASSWORD=... # SMTP_FROM=VisionPush <noreply@yourdomain.com> # Public URL used in invite/reset emails # APP_URL=https://app.yourdomain.com
Persistent data
| Volume | Contents |
|---|---|
| postgres_data | PostgreSQL data directory |
| nats_data | NATS JetStream file storage |
| minio_data | MinIO objects (WAL-G backups in dev) |
| analytics_data | Parquet analytics files |
Shell — destroy all datadocker compose -f infra/docker/docker-compose.yml down -v
Backup and restore
Automated backups (WAL-G)
The backup service runs WAL-G daily at 02:00 UTC and pushes base backups to the configured S3 bucket. WAL segments are continuously archived — point-in-time recovery is possible down to ~1 minute.
Configure a real S3 bucket in .env:
.env — production S3WALG_S3_PREFIX=s3://your-real-bucket/visionpush/ AWS_ACCESS_KEY_ID=real-key AWS_SECRET_ACCESS_KEY=real-secret AWS_REGION=eu-central-1 # Remove AWS_ENDPOINT and AWS_S3_FORCE_PATH_STYLE for real AWS S3
Restore
Shell# Latest backup bash infra/docker/scripts/restore.sh LATEST # Point-in-time recovery bash infra/docker/scripts/restore.sh "2026-05-19T03:00:00Z" # Named backup bash infra/docker/scripts/restore.sh base_000000010000000000000002
Production checklist
- Change default PostgreSQL password (
POSTGRES_PASSWORD+DATABASE_URL) - Set strong
JWT_SECRETandCREDENTIAL_ENCRYPTION_KEY - Configure a real S3/R2 bucket for WAL-G backups (MinIO is local-only)
- Set
STORAGE_BACKEND=s3and configure S3 vars - Configure SMTP for password reset and team invite emails
- Place a reverse proxy (Caddy, Nginx, Traefik) in front for TLS
- Change the default admin password (
admin@example.com/changeme)
Caddy reverse proxy example
Caddyfileapi.yourdomain.com { reverse_proxy localhost:8090 } app.yourdomain.com { reverse_proxy localhost:4200 }
Day-to-day operations
Shell# Stop docker compose -f infra/docker/docker-compose.yml down # Pull new images and restart docker compose -f infra/docker/docker-compose.yml pull docker compose -f infra/docker/docker-compose.yml up -d # Tail logs docker compose -f infra/docker/docker-compose.yml logs -f visionpush-api docker compose -f infra/docker/docker-compose.yml logs -f visionpush-worker
Docker Compose vs. Kubernetes
| Feature | Docker Compose | Kubernetes |
|---|---|---|
| High availability | No | Yes |
| Automatic scaling | No | Yes (HPA + KEDA) |
| Rolling updates | Manual | Automatic |
| Secret management | .env file | Vault + ESO |
| PostgreSQL HA | No | Yes (CloudNativePG) |
| Log aggregation | docker logs | Loki + Promtail |
| GitOps | No | Yes (ArgoCD) |
For production workloads that require high availability, use the Kubernetes deployment.