Uptime monitoring for Docker Compose on a VPS
Docker Compose on a small VPS (Hetzner, DigitalOcean Droplet, Linode) is a common homelab and early-production pattern: nginx or Traefik in front, app containers behind, Postgres on an internal network. You should monitor one public ingress — not every internal service port from the internet.
StillOnline runs HTTP GET checks from outside your VPS, hosts a status page, and alerts you via the StillOnline Telegram bot, Slack, or email. You do not run a monitoring container on the same host unless you want to — external truth catches DNS, TLS, and reverse-proxy failures Coolify/Compose UI miss.
Quick answer
Docker Compose on a VPS should expose GET /health on the public HTTPS domain where nginx or Traefik terminates TLS — returning 200, not on http://app:3000 or localhost. Register that URL in StillOnline; Free runs five-minute checks on one URL (pricing). Internal Postgres, Redis, and workers stay off external checks. See Hetzner + Coolify and open-source vs hosted status page.
One ingress, not every container
| Service | External StillOnline check? |
|---|---|
| nginx / Traefik → app | Yes — /health on public domain |
Postgres on internal network | No — optional ping inside app /health only |
| Redis, worker, queue | No public check — use heartbeat pattern later |
| Admin port exposed by mistake | Do not register — fix firewall instead |
StillOnline probes the same URL customers use, matching health check quickstart.
Typical Compose pitfalls
| Problem | Solution |
|---|---|
Health curls localhost inside container | Test from outside the VPS |
| Only monitoring Compose UI (Portainer) | UI up ≠ app domain up |
| Cert expired on nginx | External check fails — fix TLS |
docker compose restart blip | Short red period — maintenance post |
curl -sS -o /dev/null -w "%{http_code}\n" https://api.yourproduct.com/health
StillOnline setup
- Sign in.
- New project.
- HTTP check → public
/health, GET, 200, five-minute interval (Free). - Status page link in docs if you have paying users — public status page guide.
Settings → Connect Telegram → StillOnline bot — Telegram guide.
Free: one URL. Pro: more checks for separate public webhook host — pricing.
Homelab vs indie SaaS
Homelab builders often run Uptime Kuma on the same box — that dies when the VPS is down. External StillOnline checks survive host outages you cannot self-ping — Kuma vs hosted. Once you have B2B customers, a hosted status page beats SSH-only incident comms.
Related guides
- Hetzner + Coolify monitoring
- Open-source vs hosted status page
- Health check URL quickstart
- Status page without Uptime Kuma
FAQ
Should StillOnline ping each Docker Compose service?
No. Use one public health URL through your reverse proxy. Internal services are validated inside that health handler if needed — health endpoint design.
Can I monitor http://127.0.0.1:8080/health?
Only if that port is publicly reachable on the internet — usually a bad idea. Prefer HTTPS on your domain.
Does StillOnline install an agent on my VPS?
No. External HTTP probes only — no container to add to Compose.
When should a homelab use StillOnline instead of self-hosted Kuma?
When you need a customer-facing status page and alerts that work when the VPS is unreachable — status page without Kuma · open-source vs hosted.