Setting Up Prometheus and Grafana for Home Lab Monitoring

Self-hosted observability used to feel like a paid product in disguise. Pull-based metrics, exporter quirks, and alertmanager YAML scared off hobbyists who just wanted to know whether their NAS was still alive. Prometheus and Grafana are remarkably approachable once you separate the moving parts, and this walkthrough focuses on practical decisions for a small setup: a handful of servers, a NAS, maybe a couple of Raspberry Pi nodes humming in a cupboard, all running quietly behind an Aussie broadband link.

I built my first home metrics stack while renting a unit in Brisbane, with a second-hand Dell Optiplex next to the laundry and an aging router plugged into an NBN HFC connection. The point was never enterprise polish — it was to catch dying disks before they failed and to stop guessing whether a slow API was the application or the network. The same approach scales from a single node to a small fleet without changing the philosophy, and is the playbook I now reach for, including for clients through my consulting resume.

Planning your observability stack

Before installing anything, draw a small diagram on paper. List every machine you actually want to monitor: the hypervisor, the NAS, a Raspberry Pi running Pi-hole, the family router if it exposes metrics, maybe a small Kubernetes cluster for fun. Each becomes a scrape target in Prometheus, and naming them consistently now will save hours later when you build Grafana dashboards.

Think about retention early. Prometheus stores time-series data locally by default, and on a spinning disk the default fifteen-day retention can quietly eat tens of gigabytes. Two to four weeks is usually enough for a home lab; if you want more history, consider remote-write to a cheap object store. Several Australian providers with points of presence in Sydney and Melbourne offer low-cost storage tiers suitable for archival metrics.

Finally, decide what success looks like. If your goal is simply "know when things are down", a tiny configuration with two exporters and a single alerting rule is enough. If you want to chart UPS battery voltage during an AGL outage in Adelaide or track CPU temperatures against a Melbourne heatwave, you will want more exporters and a longer retention window. Match the scope to the question you want answered.

Setting up exporters and the Prometheus server

The Prometheus model is pull-based, so every machine you want to monitor needs to expose an HTTP endpoint that Prometheus can scrape. The de-facto standard for Linux hosts is node_exporter, which exposes CPU, memory, disk, network, and filesystem metrics. On Debian or Ubuntu, a single deb package from the Prometheus downloads page is enough; on RHEL-derived systems used by many Australian enterprise environments, the same binary works fine as a systemd unit.

Networking matters more than people expect. Routers supplied by Telstra, Optus, or Aussie Broadband often isolate guest networks and IoT VLANs, so a Prometheus server on your main LAN may not reach every node. Pin Prometheus to a VLAN that can see everything, or use the push gateway for devices behind double NAT. Static DHCP reservations in your router prevent the dreaded "scrape failed, target disappeared" problem when a device renews its lease.

Prometheus itself is a single static binary written in Go, which makes it wonderfully portable. Download the release tarball, drop it under /opt/prometheus, and create a dedicated system user. Put the data directory on a dedicated SSD or a small NVMe in a spare M.2 slot — local suppliers like Scorptec and MSY in Brisbane stock affordable drives, and a 256 GB NVMe is more than enough for several months of metrics from a modest home fleet.

Run Prometheus behind a reverse proxy with basic authentication if you want to access the UI from outside your home network — the built-in web server is fine for localhost but does not advertise itself as production-grade. Caddy or nginx with a small Let's Encrypt certificate handles this cleanly, even on residential NBN FTTP plans without a static IP. Pair it with dynamic DNS and you have a remote dashboard you can check from a cafe in Perth or a coworking space in Hobart.

Building dashboards that actually help

Grafana is where the magic becomes visible. Install it from the official APT or YUM repository — Grafana Labs maintains packages for most major distributions used in Australia, including Ubuntu LTS releases. Point its default datasource at your Prometheus instance, then build dashboards panel by panel. Resist the urge to copy community dashboards wholesale; they are usually bloated with panels you will never read.

Useful panels include CPU load per host, memory pressure, disk SMART temperature, and network throughput. SMART data is gold, because catching a drive creeping toward failure beats replacing it after the array has degraded. The smartctl_exporter project makes this trivial, and many ASRock and ASUS motherboards expose IPMI metrics that work with the ipmi_exporter.

Pulling services like Plex, Home Assistant, or Unifi Network into a single Grafana dashboard gives you a pane of glass no commercial router UI provides. With Australian energy prices being what they are, you might also add a panel showing UPS load and mains voltage — handy during summer brownouts in regional South Australia or planned outages in Canberra suburbs.

Alerting and keeping the stack healthy

Alertmanager is the third pillar and arguably the most underrated. A single rule that fires when any node_exporter target has been unreachable for more than two minutes is usually enough to start. Route alerts through your notification stack, whether that is email, Telegram, or Pushover, to keep the signal out of the spam folder. Keep rules in version control, even if it is just a private Git repo on the same NAS you are monitoring — silent alerting failure is the worst during an incident.

The biggest mistake long-term is letting the data directory grow unchecked. Watch the storage panel in Grafana and prune jobs you no longer care about. Rotate Grafana admin passwords and the basic-auth password on the Prometheus endpoint, and back up dashboards through Grafana provisioning rather than the UI. A weekly cron job exporting every dashboard to JSON, then committing it to Git, has saved me more than once when a config store blew out during an unrelated upgrade.

Once everything is humming, the home lab feels less like a pile of boxes and more like a small data centre. Pull metrics when something feels off, glance at the temperature panel before summer kicks in, and sleep better knowing the next disk failure will not be a surprise.

Practical tuning checklist

After the dashboards and alerts are in place, a handful of small tunings will keep the stack tidy over the long term. The following changes pay off the most in a home environment, and most take less than ten minutes each to apply.

  • Pin Prometheus retention to a value you actually intend to keep, and watch the data directory size in Grafana.
  • Use file_sd_configs for target lists so adding a new host does not mean editing prometheus.yml.
  • Run node_exporter with --collector.filesystem.mount-points-exclude to ignore tmpfs and overlay mounts.
  • Enable TLS and basic auth on both Prometheus and Grafana, even on a home LAN.
  • Keep dashboards, alert rules, and Prometheus configuration in a private Git repository.
  • Set up smartctl_exporter and ipmi_exporter early — they are cheap to add and painful to add during an incident.
  • Document the network path to each target; future-you will forget.

The same approach scales from a single node to a small business environment without changing the philosophy. Drop this playbook into a starter environment this weekend, and a few exporters plus a shared Grafana instance will replace most paid monitoring subscriptions.

Experience

Information Technology Consulting

Independent Practice

Provides IT consulting services focused on infrastructure planning, cloud migration strategy, and systems architecture. Engagements draw on years of hands-on sysadmin and development experience across Linux, Windows, and hybrid environments.

K9 Search & Rescue Volunteer

Ongoing

Active participant in K9 Search & Rescue operations, combining technical logistics skills with field support for canine search teams.

Karl Katzke's Blog

October 2006 – May 2014

Published a long-running personal technology blog covering cloud vs. in-house infrastructure, F# and Mono on OSX, hardware vendor critiques, RAID card performance analysis, and sysadmin storytelling. Notable posts include "When Sysadmins Ruled the Earth" (May 15, 2014) and "Getting Started with F# and Mono on OSX" (December 22, 2012).

Credentials

A small badge icon with a shield shape in muted blue tones on a light background

Systems Administration

Deep experience with Linux (RHEL, SLES, CentOS), high-availability clusters, and STONITH configurations.

A small badge icon with a gear shape in muted blue tones on a light background

Cloud Infrastructure

Practical knowledge of AWS EC2, reserved instances, and cost analysis for cloud vs. on-premises deployments.

A small badge icon with a code symbol in muted blue tones on a light background

Development

Proficient in F#, PHP (Symfony), and cross-platform tooling including Mono and MonoDevelop on OSX.

Studies

F# & Functional Programming

Self-directed, 2012

Explored strongly typed functional programming with F# on OSX using the Mono runtime. Published a detailed getting-started guide covering toolchain setup and cross-platform game development research.

High-Availability & Cluster Management

Professional Development, 2009

Configured and documented crm_mon email alerting for STONITH events on SLES11-HAE clusters, integrating with Nagios monitoring for production environments.

Hardware & Storage Performance

Ongoing

Conducted hands-on benchmarking of SATA/SAS RAID controllers including HighPoint RocketRaid 2740 and LSI/SuperMicro AOC-USASLP2-H8iR, comparing against software RAID configurations.

Skills

A small icon representing a server with clean geometric lines in slate blue

Linux Administration

RHEL, SLES, CentOS — package management, kernel tuning, HA clustering, and monitoring integration.

A small icon representing a cloud shape with clean geometric lines in slate blue

Cloud Architecture

AWS EC2, reserved-instance planning, cost modeling, and hybrid infrastructure strategy.

A small icon representing code brackets with clean geometric lines in slate blue

F# & .NET/Mono

Functional programming on OSX, MonoDevelop toolchain, and cross-platform game-dev exploration.

A small icon representing a database cylinder with clean geometric lines in slate blue

PHP & Symfony

Web application development with the Symfony framework and the broader PHP ecosystem.

A small icon representing a storage drive with clean geometric lines in slate blue

Storage & RAID

SATA/SAS controller evaluation, md RAID configuration, and performance benchmarking.

A small icon representing a shield with clean geometric lines in slate blue

High Availability

Pacemaker, STONITH, crm_mon alerting, and Nagios integration for production cluster monitoring.