Self-host Uptime Kuma: a status page in 10 minutes with Docker

Published 2026-10-06 · tested on Ubuntu 24.04, Intel Core Ultra 7 255H, Docker 29

TESTED — we actually deployed this

Uptime Kuma is the self-hosted answer to UptimeRobot and Pingdom: a monitoring dashboard that pings your sites, APIs, and databases, and alerts you when they go down. No per-monitor pricing, no 5-minute-interval paywall — your hardware, your rules.

We deployed version 2 from scratch, measured its actual resource usage, and broke a couple of monitors on purpose to see what failure looks like. Everything below is from that run.

What you need

Docker not installed? On Ubuntu/Debian: curl -fsSL https://get.docker.com | sh

Step 1: the Compose file

Make a directory and drop this in as compose.yaml:

services:
  uptime-kuma:
    image: louislam/uptime-kuma:2
    container_name: uptime-kuma
    volumes:
      - kuma-data:/app/data
    ports:
      - "3001:3001"
    restart: unless-stopped

volumes:
  kuma-data:

Two deliberate choices here:

Step 2: start it

docker compose up -d

First run pulls the image (574 MB — a minute or two on decent broadband). Then open http://localhost:3001 (or http://<machine-ip>:3001 from another device on your network).

Step 3: database choice (new in v2)

Version 2 asks which database to use before anything else:

Uptime Kuma database setup screen offering Embedded MariaDB, external MariaDB/MySQL, and SQLite

Pick SQLite for a homelab. The embedded MariaDB option exists for large installations (hundreds of monitors); for anything under ~50 monitors, SQLite is simpler, uses less RAM, and backs up as a single file. After 2 months with 3 monitors, our SQLite data volume was under 2 MB.

Then create your admin account. Use a real password manager entry — this dashboard knows every URL you care about.

Step 4: add monitors

Add New Monitor → pick a type → paste a URL. We set up three real ones:

Uptime Kuma dashboard showing three monitors up with response time history

Lessons from the two monitors we got wrong on the first try (visible as red in the history — we left them in deliberately):

That’s the general rule: HTTP monitors for pages, TCP monitors for databases and services that require auth.

What it actually costs to run (measured)

Metric Measured value
Image size 574 MB
RAM, idle (0 monitors) 143 MB
RAM, 3 active monitors (60s interval) 133–147 MB
CPU, idle 0.02%
CPU, 3 monitors ~0.7–0.9% of one core
Disk (data volume, 3 monitors) 1.4 MB
Restart time (docker restart) 1.6 s, serving again in under 10 s

Translation: Uptime Kuma runs comfortably on a Raspberry Pi, a 10-year-old laptop, or the smallest VPS money can buy. RAM is the only number that matters, and it stays well under 200 MB.

Gotchas

Backups

Everything lives in one volume. Snapshot it with:

docker run --rm -v kuma-data:/data -v "$PWD":/backup alpine \
  tar czf /backup/kuma-backup-$(date +%F).tar.gz -C /data .

Cron that weekly and copy it somewhere that isn’t the same disk.

When NOT to self-host this

What we actually ran this on