Skip to content

Self-hosting ServiceOps

ServiceOps self-hosts as a Docker Compose stack. One VM, one compose file, a reverse proxy in front — no Kubernetes required.

ComponentMinimum
HostLinux VM, 2 vCPU / 4 GB RAM to start; 8 GB recommended with AI features busy
DockerDocker Engine + Compose plugin
Reverse proxynginx, Caddy, Traefik or equivalent, terminating TLS
DNSA name for the desk (and one per custom domain you’ll serve)
Reverse proxy (yours, TLS)
frontend (SSR) ←→ backend (API)
PostgreSQL · Redis · MinIO (S3 storage)
ServiceRole
backendThe API — NestJS, owns all business logic
frontendThe web application (server-side rendered)
dbPostgreSQL 16 — the system of record
redisQueues, cache, sessions
minioS3-compatible storage for files (any S3 endpoint works instead)
  1. Clone the repository on the host and enter the deploy/ directory.
  2. Copy the example environment and set your values — see Configuration:
    Terminal window
    cp env/.env.example .env
    # edit .env: set your domain, database password, storage credentials
  3. Start the stack:
    Terminal window
    docker compose up -d --build
  4. On first boot the backend prepares its own database schema and seed data — no manual migration step. Watch it come healthy:
    Terminal window
    docker compose ps
    docker compose logs -f app-backend
  5. Point your reverse proxy at the frontend and backend ports (bound to 127.0.0.1 by default, deliberately — only the proxy is public). Configure TLS at the proxy.

Result: the login page answers on your domain. The first administrator account’s credentials are generated at first boot — retrieve them as your bootstrap instructs, sign in, and change the password immediately.

Terminal window
git pull
docker compose up -d --build

Schema updates apply automatically at boot. Take a backup before upgrading — restore is then a compose-down, restore, compose-up.