Flagship walkthrough

Build a home lab monitoring stack.

This project creates a practical monitoring baseline with Docker Compose, Uptime Kuma, a small dashboard page, backup notes, and validation checks.

Updated May 20, 2026.

What you will build

  • One Docker Compose stack under /opt/stacks/monitoring.
  • Uptime Kuma on port 3001.
  • A static dashboard page on port 8089.
  • A documented backup path for monitoring data.
  • A validation checklist you can rerun after updates.

Assumptions

This walkthrough assumes a Debian utility VM with Docker Compose already installed. If you need that base first, use the Docker Compose sample lesson.

Create the stack folder

sudo mkdir -p /opt/stacks/monitoring/dashboard
sudo chown -R $USER:$USER /opt/stacks/monitoring
cd /opt/stacks/monitoring

Docker Compose file

cat > compose.yml <<'EOF'
services:
  uptime-kuma:
    image: louislam/uptime-kuma:1
    restart: unless-stopped
    ports:
      - "3001:3001"
    volumes:
      - ./uptime-kuma:/app/data

  lab-dashboard:
    image: nginx:alpine
    restart: unless-stopped
    ports:
      - "8089:80"
    volumes:
      - ./dashboard:/usr/share/nginx/html:ro
EOF

Simple dashboard page

cat > dashboard/index.html <<'EOF'
<!doctype html>
<html lang="en">
  <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <title>Home Lab Status</title>
    <style>
      body{font-family:system-ui;margin:0;background:#f6f7f5;color:#151a17}
      main{max-width:840px;margin:auto;padding:48px 20px}
      .grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:12px}
      a{display:block;border:1px solid #d9dfda;border-radius:8px;background:#fff;padding:16px;color:#173b34;font-weight:800;text-decoration:none}
      p{color:#65716a}
    </style>
  </head>
  <body>
    <main>
      <h1>Home Lab Status</h1>
      <p>Replace these links with your actual hostnames or IP addresses.</p>
      <div class="grid">
        <a href="http://YOUR-UTILITY-VM-IP:3001">Uptime Kuma</a>
        <a href="https://YOUR-PROXMOX-HOST:8006">Proxmox</a>
        <a href="http://YOUR-NAS-IP">NAS</a>
      </div>
    </main>
  </body>
</html>
EOF

Start the stack

docker compose up -d
docker compose ps
curl -I http://localhost:3001
curl -I http://localhost:8089

Add Uptime Kuma checks

MonitorTypeSuggested name
Router gatewayPingrouter-gateway
Proxmox hostPing or HTTPSproxmox-host
NASPing or HTTPnas-main
DashboardHTTPlab-dashboard
Public siteHTTPSpublic-site

Backup notes

Back up the stack folder, especially /opt/stacks/monitoring/uptime-kuma.

sudo tar -czf ~/monitoring-stack-backup-$(date +%F).tar.gz /opt/stacks/monitoring

Store the archive somewhere outside the utility VM. For a real lab, this should land on NAS storage or a Proxmox Backup Server-backed VM backup.

Validation checklist

  • docker compose ps shows both services running.
  • Uptime Kuma loads from another device on the LAN.
  • The dashboard page loads from another device on the LAN.
  • At least three monitors are green.
  • One safe failure test creates an alert or visible down state.
  • A backup archive exists outside the VM.

Rollback

cd /opt/stacks/monitoring
docker compose down

This stops the stack without deleting data. Remove the folder only after confirming you no longer need the monitoring history.

Project preview: this is the first paid-style LabStack Learning walkthrough. Want more projects like this? Join the learning waitlist.