Operations
Backups
Section titled “Backups”Three things hold your data — back up all three:
| What | How |
|---|---|
| PostgreSQL | docker compose exec app-db pg_dump -U YOUR_DB_USER -d YOUR_DB_NAME > backup.sql on a schedule |
| Object storage (MinIO volume) | Snapshot the volume, or mirror the bucket with any S3 tool |
deploy/.env | It carries the encryption keys — a database restore without the matching OAUTH_ENCRYPTION_KEY cannot decrypt stored integration credentials |
Test the restore once before you need it: fresh VM, restore, docker compose up -d, sign in.
Health
Section titled “Health”docker compose psshows per-service health — the backend and database expose real healthchecks the stack waits on.- The backend serves a health endpoint under
/api/healthyour external monitoring can probe. - Or let ServiceOps monitor itself from another instance with service monitors.
Structured JSON on stdout, per container:
docker compose logs -f app-backendLOG_LEVEL=debug (in deploy/.env, then docker compose up -d app-backend) enables per-call
diagnostics — search timings, retrieval counts. Logs never carry secrets or full message
bodies; treat them as shippable to your log stack as-is.
Reverse proxy notes
Section titled “Reverse proxy notes”- The stack binds application ports to
127.0.0.1on purpose — only your proxy is public. - Forward
Host,X-Forwarded-ForandX-Forwarded-Proto; the backend is configured to trust its proxy. - Raise the proxy’s upload size limit to at least the 25 MB attachment ceiling.
- Serving customer custom domains means routing those hostnames to the same frontend/backend and obtaining TLS for them (your ACME setup).
Scheduled work
Section titled “Scheduled work”Queues and scheduled jobs (SLA checks, monitor probes, report sending, email watch renewals) run inside the backend container — no external cron is needed. If the container was down, work resumes on start; email channels reconcile what arrived in between.