I was going to set up Prometheus + Grafana on my Ghost host. Netdata is what I actually use.
wget -O /tmp/nd.sh https://get.netdata.cloud/kickstart.sh
sudo sh /tmp/nd.sh --dont-start-it --disable-telemetry --native-only
sudo systemctl enable --now netdata
Dashboard: http://server-ip:19999. Per-second metrics, 200+ charts out of the box, around 1–3% CPU steady-state on a 2-core VM. First time I installed it I sat there refreshing the systemd-services panel for half an hour.
Don't expose 19999
The default Netdata config binds to all interfaces. Don't leave it like that. Before you start the service, edit /etc/netdata/netdata.conf:
[web]
bind to = 127.0.0.1
allow connections from = localhost
Then from your laptop:
ssh -L 19999:localhost:19999 user@server
Hit http://localhost:19999 locally, full dashboard, no public exposure. This is the setup I keep telling myself I'll automate and haven't.
If you need it from a LAN, open a specific subnet, not *:
allow connections from = localhost 10.0.0.* 10.8.0.*
(10.8.0.* being my WireGuard range — see the WireGuard guide.)
If you absolutely have to expose it on the internet, stick nginx in front with basic auth and LE certs. Reverse proxy pattern: nginx reverse proxy setup.
What's actually useful
First place I look when something feels off: Systems → Load. If load is over CPU count for a few minutes, drill down.
Second place: Applications or systemd services panel. It breaks everything down by service automatically. docker, ghost, nginx, whatever — each one has its own CPU/memory/io chart with no config.
Netdata also auto-picks up disks, network interfaces, Docker containers via cgroups. Run SMART on the host (apt install smartmontools && systemctl enable --now smartd) and disk health charts appear after the next Netdata restart. Free.
Alerts to Discord
Default alerts are fine (~200 out of the box — OOM, disk 90%, swap in use, iowait spike, etc.). What's missing is getting them somewhere you'll actually see.
sudo /etc/netdata/edit-config health_alarm_notify.conf
Scroll to the Discord section, uncomment:
SEND_DISCORD="YES"
DISCORD_WEBHOOK_URL[alarms]="https://discord.com/api/webhooks/..."
DEFAULT_RECIPIENT_DISCORD="alarms"
Restart, fire a test:
sudo systemctl restart netdata
sudo /usr/libexec/netdata/plugins.d/alarm-notify.sh test
Telegram, ntfy, Slack, email all work the same way — different block, same file. I use Discord for boring stuff and ntfy for things that need to wake me up.
Gotchas
Memory keeps growing. Default retention keeps hot metrics in RAM and spills history to disk. On a small box, cap it:
[db]
mode = ram
retention = 3600
Keeps one hour in memory, no disk spill. Good enough for "what's happening right now".
Alerts set to YES but nothing arrives. Two usual suspects. One, the webhook URL is wrong (Discord silently 404s — check the nginx/docker logs where Netdata runs). Two, the alarm isn't wired to a default recipient. Easy miss: DEFAULT_RECIPIENT_DISCORD="alarms" — the string has to match the [alarms] key above it.
When to outgrow Netdata
The moment you have more than maybe 10 hosts and want dashboards across all of them, or you need retention longer than a few days, or a team expects an actual SRE stack — that's when Prometheus + Grafana earns the complexity. For solo or small-team ops on a handful of boxes, Netdata wins on effort-to-value.
I've been running it on my Ghost VM and the Proxmox host for months. Never touched the config after the initial bind + Discord webhook. Just works.