← all stacks

Observability on $5 self-host stack

5 open-source picks · replaces 5 SaaS · self-host on your own VPS

Persona. Solo or small-team operator who wants uptime checks + dashboards + analytics + status page + paging — and refuses to budget Datadog money for it.

Stack total · starts at
$43/mo
sum of per-tool VPS-cost lower bounds
Hardest setup in stack
hard
worst of 5 picks
Health mix
5 alive
live from GitHub at build time

Why these together

The premise: get usable monitoring + analytics + paging without paying Datadog. Uptime Kuma is the cheapest credible uptime checker (one container, $0 marginal cost when colocated with anything else); Grafana is the dashboard layer that reads from any timeseries store you bring (Prometheus on the same box is the typical pairing); Plausible is the lightweight web-analytics piece, separate from product/error data so the cookie-free promise to users stays clean; Cachet is the public status page that Uptime Kuma pings; Keep is the on-call rotation that closes the loop when something flips red. The honest disclaimer: $5 is enough for Uptime Kuma + Plausible + Cachet on one VPS. Adding Grafana + Prometheus + Keep usually pushes you to $15-20. Still ~10× cheaper than Datadog at any non-trivial scale.

The 5 picks

Pick Replaces Cost / setup Health
UptimeRobot
External uptime / availability monitoring
$3/mo+
easy · 5min docker run
alive
★ 86.5k · today
grafana/grafana · AGPL-3.0
Datadog
Observability (metrics + logs + traces + APM)
$20/mo+
hard · 1-2h to wire up the LGTM stack via docker-compose; multi-day to do it production-grade
alive
★ 73.7k · today
plausible/analytics · AGPL-3.0
Google Analytics
Web analytics
$5/mo+
easy · 10min docker-compose
alive
★ 24.8k · 3d ago
Statuspage (Atlassian)
Public status page / incident communication
$5/mo+
moderate · 20min docker-compose (PHP/Laravel + Postgres or MySQL)
alive
★ 15.0k · 10d ago
keephq/keep · MIT
PagerDuty
On-call rotation / incident response / paging
$10/mo+
moderate · 30min docker-compose (keep-frontend + keep-backend + websocket-server; SQLite default, swap to Postgres via `DATABASE_CONNECTION_STRING`)
alive
★ 11.8k · 1d ago

Other stacks