Skip to content

Operations

Three things hold your data — back up all three:

WhatHow
PostgreSQLdocker 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/.envIt 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.

  • docker compose ps shows per-service health — the backend and database expose real healthchecks the stack waits on.
  • The backend serves a health endpoint under /api/health your external monitoring can probe.
  • Or let ServiceOps monitor itself from another instance with service monitors.

Structured JSON on stdout, per container:

Terminal window
docker compose logs -f app-backend

LOG_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.

  • The stack binds application ports to 127.0.0.1 on purpose — only your proxy is public.
  • Forward Host, X-Forwarded-For and X-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).

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.