Homelab · Part 11

Part 11 — Monitoring the Lab: A Lightweight Monitoring Stack Watching the Whole Environment

Deploy a low-overhead, high-visibility telemetry stack using Prometheus, Node Exporter, Uptime Kuma, and Grafana to track your entire homelab infrastructure.

By K Shankar R Karanth Homelab Hands-On Homelab-tested — Debian 12, Docker, Prometheus, Grafana
Quick idea: A lightweight monitoring stack isn’t a luxury in a modern homelab; it is your flight recorder that turns invisible system failures into actionable alerts before services crash silently.
Prometheus / VictoriaMetrics

Time-series database engine optimized for pulling and storing metric telemetry with minimal RAM overhead.

Node Exporter

Lightweight host daemon exposing OS-level CPU, memory, storage, and network metrics over HTTP.

Uptime Kuma & Grafana

Synthetic monitoring and visual dashboard engines providing real-time status pages and metric visualisations.

The Cost of Operating Blind

Think of a homelab monitoring stack as the instrument cluster on an aircraft dashboard. Operating a complex multi-node lab without telemetry is like flying through thick fog with a taped-over speedometer—you won’t know your disk space is exhausted until your database corrupts itself mid-write.

In enterprise deployments, silent failures usually start at the fringes: a memory leak in an ingress controller, runaway log growth on a DNS node, or micro-burst thermal throttling on a hypervisor. In a homelab, these same silent issues manifest as random Sunday evening outages that take hours to diagnose.

Traditional enterprise suites like Datadog or System Center are far too heavy for home setups. We need a stack that consumes less than 500 MB of RAM while maintaining complete visibility over hypervisors, containers, and network endpoints.

The Lightweight Stack Architecture

Think of this stack as a three-tier surveillance network: Exporters act as field scouts collecting raw stats, VictoriaMetrics or Prometheus functions as the central archive, and Grafana serves as the command center visualising the intelligence.

To keep resource usage negligible, we deploy Node Exporter (for Linux hosts), WMI Exporter (for Windows nodes), and cAdvisor (for Docker container runtime metrics). Synthetic HTTP/ICMP checking is offloaded to Uptime Kuma for immediate uptime alerts via Webhooks or Telegram.

By opting for VictoriaMetrics instead of standard Prometheus, we cut disk I/O and RAM consumption by up to 50 percent while remaining entirely compatible with PromQL queries and Grafana dashboards.

Deploying the Core Stack via Docker Compose

We centralise the telemetry stack on a management host or utility virtual machine using Docker Compose. The following specification spins up VictoriaMetrics, Grafana, Node Exporter, and Uptime Kuma with persistent storage and optimized resource limits.

version: '3.8'

services:
  victoriametrics:
    image: victoriametrics/victoria-metrics:v1.96.0
    container_name: victoriametrics
    restart: always
    volumes:
      - vmdata:/storage
    command:
      - '--storageDataPath=/storage'
      - '--retentionPeriod=1m'
      - '--promscrape.config=/etc/victoriametrics/prometheus.yml'
    volumes:
      - vmdata:/storage
      - ./prometheus.yml:/etc/victoriametrics/prometheus.yml:ro
    ports:
      - "8428:8428"

  node-exporter:
    image: prom/node-exporter:v1.7.0
    container_name: node-exporter
    restart: always
    volumes:
      - /proc:/host/proc:ro
      - /sys:/host/sys:ro
      - /:/rootfs:ro
    command:
      - '--path.procfs=/host/proc'
      - '--path.sysfs=/host/sys'
      - '--path.rootfs=/rootfs'
    ports:
      - "9100:9100"

  uptime-kuma:
    image: louislam/uptime-kuma:1
    container_name: uptime-kuma
    restart: always
    volumes:
      - kuma-data:/app/data
    ports:
      - "3001:3001"

  grafana:
    image: grafana/grafana-oss:10.2.2
    container_name: grafana
    restart: always
    environment:
      - GF_SECURITY_ADMIN_PASSWORD=ChangeThisSecurePassword123!
      - GF_USERS_ALLOW_SIGN_UP=false
    volumes:
      - grafana-data:/var/lib/grafana
    ports:
      - "3000:3000"

volumes:
  vmdata:
  kuma-data:
  grafana-data:

Configuring Telemetry Scraping

Once the container services are running, configure the target scrapers in `prometheus.yml`. This dictates which nodes, hypervisors, and services VictoriaMetrics will query every 15 seconds.

# /etc/victoriametrics/prometheus.yml
global:
  scrape_interval: 15s
  evaluation_interval: 15s

scrape_configs:
  - job_name: 'victoriametrics'
    static_configs:
      - targets: ['localhost:8428']

  - job_name: 'homelab-nodes'
    static_configs:
      - targets:
          - '192.168.1.10:9100'  # Hypervisor 01
          - '192.168.1.11:9100'  # Hypervisor 02
          - '192.168.1.20:9100'  # Storage Node / NAS
        labels:
          environment: 'production-homelab'

  - job_name: 'network-switches'
    static_configs:
      - targets: ['192.168.1.2:9116'] # SNMP Exporter

Synthetic Monitoring and Alerting Rules

Scraping CPU and RAM is only half the battle. You must know when end-user services fail to respond on HTTP, DNS, or ICMP interfaces.

Configure Uptime Kuma by logging into `http://<your-ip>:3001` and creating HTTP checks for internal endpoints (such as Active Directory Web Services, Proxmox VE API, and Pi-hole web interfaces). Bind notification channels to Discord, Telegram, or Apprise for immediate offline push notifications.

In Grafana, add VictoriaMetrics as a standard Prometheus data source (`http://victoriametrics:8428`) and import community Dashboard ID `1860` (Node Exporter Full) to get immediate visual dashboard analytics for all hypervisors and virtual machines.

Final Thoughts

Building a robust homelab monitoring stack doesn’t require multi-gigabyte enterprise software suite footprints. By pairing lightweight scrapers like Node Exporter with efficient backends like VictoriaMetrics, you gain complete operational intelligence across your entire infrastructure while keeping memory consumption near zero.

Key takeaway: Maintain a rule that your telemetry stack should never consume more than 5 percent of your total infrastructure RAM; efficiency is the cornerstone of operational stability.
Next in this series

Part 12 — Automated Backups and Disaster Recovery: Building an Immutable Backup Pipeline with Restic and Syncthing.