Deployment guides

CapScope is one Go binary plus a Dockerfile and a compose file, so anything that can run a Docker image can run it. Every guide below covers the same five things: a password, a persistent /data volume, Docker socket access, HTTPS in front of port 8080, and exactly one replica.

Common to all platforms

The image ships everything a PaaS expects: a plain Dockerfile, EXPOSE 8080, a VOLUME /data, a built-in HEALTHCHECK and an unauthenticated GET /healthz endpoint. Whatever the platform, these six rules always apply:

  • Set AUTH_PASS to a long random password — the server refuses to start without it (unless you explicitly set ALLOW_NO_AUTH=true for a private test).
  • Persist /data on a volume. The SQLite database — logs, metrics, snapshots, alert state — lives there and dies on redeploy without it.
  • Give CapScope Docker API access: mount /var/run/docker.sock, or (safer, no socket in CapScope) point DOCKER_HOST at a read-only socket proxy.
  • Exactly one replica. Each instance writes the same SQLite file — two writers corrupt the database.
  • HTTPS in front. The app listens on 8080; Basic auth credentials travel in clear text on plain HTTP.
  • Kubernetes is not supported. CapScope talks to the Docker Engine API, not the kubelet — run it as a Docker container on a Docker node.
Generate the password first — it is used by every guide below:
bash
openssl rand -base64 24

The image is built from the repo's multi-stage Dockerfile (Go 1.24 to a static scratch binary), so any platform that can build or pull a Docker image works. The first build downloads Go modules — the host needs outbound internet during the build.

Pick your platform

PlatformGuideWhat it needs on top
Docker ComposeDocker Compose guidethe compose file from the repo, or a plain docker run
CapRoverCapRover guidenothing — captain-definition is in the repo
CoolifyCoolify guideDockerfile resource + socket proxy volume
DokployDokploy guidecompose service, Swarm single-node caveat
DokkuDokku guidegit push + storage:mount overrides
Portainer / plain DockerPortainer & otherspaste the compose stack
PodmanPortainer & others — Podmansame image; mount the Podman API socket instead of docker.sock

Verify after any deployment

Health check answers

GET /healthz returns 200 — the path is auth-free by design, so platforms can probe it without secrets.

Sidebar fills up

Log in with Basic auth; the app list appears within about 10 seconds of the first deploy.

Live tail streams

Open any container — the SSE stream flows. If it is silent, your reverse proxy is buffering; see the troubleshooting table in each guide.

History survives a redeploy

Restart or redeploy CapScope, then search a known log string again. If the data is still there, /data is persisted correctly.


New to CapScope? Read the documentation intro first, then come back and pick a platform.