← Self-Hosting · Foundations 7 of 8 · Replaces: UptimeRobot / Pingdom
What You'll Build
Uptime Kuma checks each of your apps every 60 seconds and messages you if one stops answering — so you find out before your family does. It also graphs response times and can publish a status page.
Port: 3001 · Time: 20 minutes · Difficulty: Easy
Step 1: Start Uptime Kuma
mkdir -p ~/stacks/uptime-kuma && cd ~/stacks/uptime-kuma
nano compose.yaml
services:
uptime-kuma:
image: louislam/uptime-kuma:2 # version 2
container_name: uptime-kuma
restart: unless-stopped
ports:
- "3001:3001"
volumes:
- ./data:/app/data # monitors, history, settings
docker compose up -d
Open http://192.168.1.50:3001, choose the default embedded database if asked, and create your admin account.
Step 2: Add Monitors
Click + Add New Monitor for each app:
| Monitor type | Use it for | Example |
|---|---|---|
| HTTP(s) | Any web app | https://photos.home.example.com |
| HTTP(s) – Keyword | Check the page really loaded (not an error page) | Keyword Immich |
| DNS | Pi-hole / AdGuard answering | Hostname example.com, resolver 192.168.1.50 |
| Ping | Devices: router, NAS, printer | 192.168.1.1 |
| Docker Container | Apps with no web page | Needs the Docker socket mounted (see tip) |
To use Docker Container monitors, add - /var/run/docker.sock:/var/run/docker.sock:ro under volumes:, run docker compose up -d, then add a Docker Host in Settings → Docker Hosts using the socket.
Step 3: Get Notified on Your Phone (ntfy)
ntfy is a free push-notification app with no account needed.
- Install the ntfy app (Android/iOS) and subscribe to a hard-to-guess topic name, e.g.
homeserver-alerts-k29xq. - In Uptime Kuma: Settings → Notifications → Setup Notification → type ntfy. Server
https://ntfy.sh, topic the same name → Test. - Tick Default enabled and Apply on all existing monitors → Save.
Prefer Discord, Telegram, email, or Home Assistant? They're all in the same notification-type list.
Step 4: A Status Page (Optional)
Status Pages → New Status Page, pick the monitors to show, and share the link with your household so they can check "is Jellyfin down, or is it just me?"
Troubleshooting
- A monitor for a *.home name is always down — the container can't resolve your local DNS names. Monitor the IP:port instead, or set the container's DNS to your Pi-hole with
dns: [192.168.1.50]in compose. - Too many alerts for short blips — in a monitor's settings, raise Retries to 3 so a single failed check doesn't alert.
- Who watches the watcher? If the whole server dies, Uptime Kuma dies with it. A free external monitor (or a second tiny device running Kuma) covers that.
What's Next?
Want graphs of CPU, memory, temperature, and disk over time?
Foundations 8: Grafana + Prometheus →