← all posts

Cheap observability on Hetzner

18 July 2025 · 4 min read

  • Devops
  • Grafana
  • NixOS
  • Monitoring

The boring stack that works

One Hetzner box, declaratively configured via NixOS:

services.grafana.enable = true;
services.prometheus.exporters.node.enable = true;
services.prometheus.scrapeConfigs = [{
  job_name = "node";
  static_configs = [{ targets = [ "127.0.0.1:${toString cfg.port}" ]; }];
}];

A short watchlist gets you 90% of value:

  1. Disk usage — the #1 surprise-incident producer on small servers
  2. RAM + swap — the #2
  3. HTTP 5xx rate by vhost — catches upload/deploy breakage
  4. Backup job success/failure — the metric that saves companies
  5. Cert expiry — only if you insist on unmanaged TLS, which you shouldn’t

Alerting discipline

Alerts go to one channel. Alert only on conditions needing human action (or a page will train you to ignore pages). Metrics dashboards ≠ alerting.

Cost

Smallest AX-class box runs Prometheus, Loki, Grafana, and a restic backup receiver for ~€4/month. Pair it with the free-tier endpoint pushing via node_exporter and you have real production-grade numbers.

You will check the dashboard less that week, and the fear of checking goes with it. That’s the whole ROI.