Skip to content
DoneHardware

Raspberry Pi Home Lab

A compact home lab running on a Raspberry Pi 5 with Docker, a monitoring stack, and automated off-site backups.

Highlights

  • Provisioned a Raspberry Pi 5 (8 GB) with Ubuntu Server 24.04 LTS
  • Deployed Portainer for container management via Docker Compose
  • Set up Prometheus + Grafana for metrics, Loki + Promtail for logs
  • Configured automated off-site backups to Backblaze B2 using restic
  • Exposed services securely with Tailscale Funnel (no open ports)

Tools

Raspberry Pi 5Ubuntu Server 24.04Docker & Docker ComposePortainerPrometheusGrafanaLokiPromtailresticBackblaze B2Tailscale

Links

This started as a weekend project to learn container orchestration on ARM without paying for cloud instances. The Pi 5 has 8 GB of RAM, which is plenty for a modest monitoring stack and a few self-hosted services.

#How the pieces connect

Network diagram: Tailscale clients reach the Raspberry Pi 5, which runs four Docker services and backs up nightly to Backblaze B2. Tailscale network Raspberry Pi 5 Ubuntu Server 24.04 Portainer Grafana Prometheus Loki restic nightly backup Backblaze B2

The whole stack, inlined as SVG at build time. It follows the page theme automatically.

#Why a Pi?

Cloud costs add up fast. A $10/month VPS is $120/year, while the Pi 5 kit cost me around $120 once. For personal telemetry, home automation, and learning, it pays for itself within a year.

#Key decisions

  • Portainer over raw Docker Compose files - the UI makes it trivial to inspect logs, restart containers, and update images without SSH’ing in.
  • Tailscale Funnel - exposes Grafana at a public URL with zero port forwarding. The Pi stays behind CGNAT.
  • restic + Backblaze B2 - encrypts backups client-side, deduplicates them, and costs pennies. I back up /etc, /var/lib/docker/volumes, and the Prometheus data directory nightly.

#Watching it run

Three blinking LEDs is apparently all it takes to make a home lab feel alive. This is an inline SVG with a SMIL animation - no JavaScript involved.

Inline SVG with a slow SMIL blink - the markup lives directly in the MDX file.

A weekly health check is one command away:

healthcheck.sh
      # Runs on the Pi, usually from a cron job
docker compose -f /opt/stack/docker-compose.yml ps
restic snapshots --repo b2:bucket:pi-backups
    

#What I’d do differently

Next time I’d skip Ubuntu and go straight to NixOS. A declarative config would make the whole setup reproducible and version-controlled from day one. The learning curve is real, but so is the payoff.

Power tip

Add a small UPS (I use an APC BE600M1). It gives the Pi enough time to shut down cleanly on power loss, which protects the SD card and the restic repository.