Uptime Kuma - Monitor Everything [Part 10 of 10]
Keep track of your services with beautiful uptime monitoring
![]()
![]()
![]()
![]()
This is it - the final part of our HomeLab series!
Youâve built an amazing homelab with multiple services. But how do you know if theyâre all running? When something goes down, how quickly do you find out?
Uptime Kuma is a self-hosted monitoring tool that watches your services 24/7 and alerts you when something breaks.
Features:
-
Monitor websites, APIs, ports, and more
-
Beautiful, modern dashboard
-
Real-time status updates
-
90+ notification options
-
Public status pages
-
Uptime statistics and graphs
-
Certificate expiry monitoring
-
Ping and TCP monitoring
-
Docker container monitoring
Letâs set it up and complete your HomeLab!
What is Uptime Kuma?
Uptime Kuma is a self-hosted monitoring tool (like Uptime Robot, but better).
What it monitors:
-
HTTP/HTTPS - Websites and web services
-
TCP Ports - Database servers, SSH, custom services
-
Ping - Network connectivity
-
DNS - Domain resolution
-
Docker Containers - Container health
-
And much moreâŚ
Why use it?
-
Know when things break - Get notified immediately
-
Track uptime - See historical performance
-
Public status pages - Share status with users
-
Free and private - No monthly fees, no data sharing
-
Beautiful interface - Actually enjoyable to use
What Youâll Need
Prerequisites
-
Docker and Portainer running (Part 4) -
Nginx Proxy Manager configured (Part 5) -
Services to monitor (Parts 6-9) -
At least 1GB RAM
Ports Required
- Port 3001 - Uptime Kuma web interface
Installing Uptime Kuma
Uptime Kuma is a single container with a built-in SQLite database.
Step 1: Create Data Directory
On your Ubuntu server (via SSH):
# Create directory for Uptime Kuma data
sudo mkdir -p /mnt/storage/docker/uptime-kuma
# Set ownership (container runs as user 1000)
sudo chown -R 1000:1000 /mnt/storage/docker/uptime-kuma
Step 2: Deploy via Portainer
Login to Portainer:
https://portainer.homelab.example.com
Create new stack:
-
Click Stacks in left sidebar
-
Click + Add stack
-
Name:
uptime-kuma -
Build method: Web editor
Paste this compose configuration:
version: '3.8'
services:
uptime-kuma:
container_name: uptime-kuma
image: louislam/uptime-kuma:2
environment:
TZ: America/New_York # Change to your timezone
UMASK: '0022'
volumes:
- /mnt/storage/docker/uptime-kuma:/app/data
ports:
- '3001:3001'
restart: unless-stopped
networks:
- portainer-network
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:3001"]
interval: 30s
retries: 3
start_period: 10s
timeout: 5s
networks:
portainer-network:
external: true
Note about timezone:
-
Find your timezone: TZ Database Timezones
-
Examples:
America/New_York,America/Los_Angeles,Europe/London,Asia/Tokyo
Step 3: Deploy the Stack
Deploy:
-
Scroll down
-
Click Deploy the stack
-
Wait 1-2 minutes for deployment
Verify deployment:
-
Go to Containers in Portainer
-
Confirm container is running:
-
uptime-kuma
Step 4: Configure Firewall
On your Ubuntu server (via SSH):
# Allow Uptime Kuma from LAN
sudo ufw allow from 192.168.1.0/24 to any port 3001 proto tcp comment 'Uptime Kuma from LAN'
# Check firewall status
sudo ufw status numbered
Note: Replace 192.168.1.0/24 with your network range.
Step 5: Allow Docker Container Access
Important: Uptime Kuma runs in Docker and needs to access services on your host. First, find your Docker network range:
# Find your Docker network subnet
docker network inspect bridge | grep Subnet
# Output will show something like: "Subnet": "172.17.0.0/16" or "172.18.0.0/16"
Then add firewall rules using YOUR Docker subnet:
# Replace 172.18.0.0/16 with YOUR Docker subnet from above!
# Allow Docker containers to access service ports
sudo ufw allow from 172.18.0.0/16 to any port 80 proto tcp comment 'Docker to HTTP'
sudo ufw allow from 172.18.0.0/16 to any port 81 proto tcp comment 'Docker to NPM'
sudo ufw allow from 172.18.0.0/16 to any port 443 proto tcp comment 'Docker to HTTPS'
sudo ufw allow from 172.18.0.0/16 to any port 2283 proto tcp comment 'Docker to Immich'
sudo ufw allow from 172.18.0.0/16 to any port 3000 proto tcp comment 'Docker to Wiki.js'
sudo ufw allow from 172.18.0.0/16 to any port 8080 proto tcp comment 'Docker to Discourse HTTP'
sudo ufw allow from 172.18.0.0/16 to any port 8443 proto tcp comment 'Docker to Discourse HTTPS'
sudo ufw allow from 172.18.0.0/16 to any port 8888 proto tcp comment 'Docker to OpenSpeedTest'
sudo ufw allow from 172.18.0.0/16 to any port 9443 proto tcp comment 'Docker to Portainer'
# Reload firewall
sudo ufw reload
Why? Docker containers use a different network than your LAN. Without these rules, monitors will timeout.
Note: Common Docker subnets are 172.17.0.0/16 or 172.18.0.0/16, but yours may differ.
Setting Up Proxy with NPM
Now letâs add Uptime Kuma to Nginx Proxy Manager.
Step 1: Create SSL Certificate
Login to NPM:
https://npm.homelab.example.com
Create certificate:
-
Go to SSL Certificates
-
Click Add SSL Certificate â Letâs Encrypt
-
Domain Names:
uptime.homelab.example.com -
Use a DNS Challenge:
Enable (if using DNS challenge) -
Email Address: Your email for Letâs Encrypt notifications
-
Agree to Terms:
Check -
Click Save
-
Wait for certificate issuance (1-2 minutes)
Step 2: Create Proxy Host
In NPM:
-
Go to Hosts â Proxy Hosts
-
Click Add Proxy Host
Details Tab:
-
Domain Names:
uptime.homelab.example.com -
Scheme:
http -
Forward Hostname/IP:
uptime-kuma(container name) -
Forward Port:
3001 -
Cache Assets:
Enable -
Block Common Exploits:
Enable -
Websockets Support:
Enable (REQUIRED for real-time updates!)
SSL Tab:
-
SSL Certificate: Select your certificate
-
Force SSL:
Enable -
HTTP/2 Support:
Enable -
HSTS Enabled:
Leave unchecked
Click: Save
Step 3: Test Access
Open your browser:
https://uptime.homelab.example.com
You should see the Uptime Kuma setup screen!
First-Time Setup
Create Admin Account
On first access:
-
Username: Choose a username
-
Password: Choose a strong password
-
Repeat Password: Confirm password
-
Click Create
Need a strong password?
-
Use a password manager (Bitwarden, 1Password, Proton Pass, KeePassXC)
-
Or generate one:
openssl rand -base64 20
Youâll be taken to the dashboard!
Adding Monitors
Now letâs monitor all your services!
Understanding Monitor URLs
For services on portainer-network (use container names):
-
Nginx Proxy Manager
-
Immich
-
Wiki.js
-
OpenSpeedTest
For services NOT on portainer-network (use host IP):
-
Portainer
-
Discourse
Monitor 1: Nginx Proxy Manager
Click: Add New Monitor
Configuration:
-
Monitor Type: HTTP(s)
-
Friendly Name:
Nginx Proxy Manager -
URL:
http://nginx-proxy-manager:81 -
Heartbeat Interval:
60seconds -
Retries:
3 -
Heartbeat Retry Interval:
60seconds -
Accepted Status Codes:
200-299,300-399
Click: Save
Monitor 2: Portainer
Click: Add New Monitor
Configuration:
-
Monitor Type: HTTP(s)
-
Friendly Name:
Portainer -
URL:
https://192.168.1.100:9443 -
Heartbeat Interval:
60seconds -
Retries:
3 -
Accepted Status Codes:
200-299,300-399,400-499 -
Advanced Settings:
-
Ignore TLS/SSL error:
Enable (self-signed certificate)
Click: Save
Monitor 3: Immich
Click: Add New Monitor
Configuration:
-
Monitor Type: HTTP(s)
-
Friendly Name:
Immich -
URL:
http://immich_server:2283 -
Heartbeat Interval:
60seconds -
Retries:
3 -
Accepted Status Codes:
200-299
Click: Save
Monitor 4: Discourse
Click: Add New Monitor
Configuration:
-
Monitor Type: HTTP(s)
-
Friendly Name:
Discourse -
URL:
http://192.168.1.100:8080 -
Heartbeat Interval:
60seconds -
Retries:
3 -
Accepted Status Codes:
200-299
Click: Save
Monitor 5: Wiki.js
Click: Add New Monitor
Configuration:
-
Monitor Type: HTTP(s)
-
Friendly Name:
Wiki.js -
URL:
http://wikijs:3000 -
Heartbeat Interval:
60seconds -
Retries:
3 -
Accepted Status Codes:
200-299
Click: Save
Monitor 6: OpenSpeedTest
Click: Add New Monitor
Configuration:
-
Monitor Type: HTTP(s)
-
Friendly Name:
OpenSpeedTest -
URL:
http://openspeedtest:3000 -
Heartbeat Interval:
60seconds -
Retries:
3 -
Accepted Status Codes:
200-299
Click: Save
Setting Up Notifications
Get alerted when services go down!
Step 1: Add Notification Method
Click: Settings (gear icon) â Notifications
Click: Setup Notification
Choose your notification type:
Popular options:
-
Email (SMTP) - Requires SMTP server (like Brevo from Part 7)
-
Discord - Create webhook in Discord server
-
Telegram - Use Telegram bot
-
Slack - Use Slack webhook
-
Pushover - Mobile push notifications
-
90+ other options!
Example: Email Notifications (SMTP)
If you set up Brevo for Discourse:
-
Notification Type: SMTP (Email)
-
Friendly Name:
Email Alerts -
SMTP Host:
smtp-relay.brevo.com -
SMTP Port:
587 -
Security:
TLS -
Username: Your Brevo email
-
Password: Your Brevo SMTP key
-
From Email: Your verified sender email
-
To Email: Your email address
-
Click: Test (verify it works)
-
Click: Save
Step 2: Apply to Monitors
For each monitor:
-
Click the monitor name
-
Click Edit
-
Scroll to Notifications
-
Select your notification method
-
Click: Save
Now youâll get alerts when services go down! ![]()
Using Uptime Kuma
Dashboard View
Your dashboard shows:
-
Green - Service is up -
Red - Service is down -
Gray - Monitor paused -
Response time - How fast service responds
-
Uptime percentage - 99.9% = very reliable
Viewing History
Click any monitor to see:
-
Uptime graph
-
Response time chart
-
Recent events
-
Certificate expiry (for HTTPS)
-
Average response time
Creating Status Pages
Share uptime publicly:
-
Click: Status Pages
-
Click: New Status Page
-
Configure:
-
Title: Your status page name
-
Slug: URL path (e.g.,
homelab) -
Select monitors to display
- Click: Save
Share URL: https://uptime.homelab.example.com/status/homelab
Maintenance
Check Container Status
# View Uptime Kuma container
docker ps | grep uptime-kuma
# Check logs
docker logs uptime-kuma
# Follow logs in real-time
docker logs -f uptime-kuma
Backup Uptime Kuma
# Backup database and configuration
sudo tar -czf uptime-kuma-backup-$(date +%Y%m%d).tar.gz \
/mnt/storage/docker/uptime-kuma/
# Store backup off-site!
Restore from Backup
# Stop container
docker stop uptime-kuma
# Restore backup
sudo tar -xzf uptime-kuma-backup-YYYYMMDD.tar.gz -C /
# Start container
docker start uptime-kuma
Update Uptime Kuma
Via Portainer:
-
Go to Stacks â uptime-kuma
-
Click Editor
-
Click Update the stack
-
Select Re-pull image and redeploy
-
Wait for update to complete
Check for updates monthly - Uptime Kuma is actively developed.
Troubleshooting
Dashboard Not Updating in Real-Time
Problem: Dashboard shows old data, doesnât auto-refresh.
Solution: Enable Websockets in NPM:
-
Go to NPM â Proxy Hosts
-
Details tab â Websockets Support:
Enable -
Save and refresh browser
Monitors Showing Down When Services Are Up
Problem: False positives - services are up but monitors say down.
Solutions:
Check accepted status codes:
-
Some services return 301/302 redirects
-
Add
300-399to accepted codes
Increase retries:
-
Set Retries to 3 or more
-
Prevents false alerts from temporary issues
Check firewall rules:
-
Verify Docker network rules (Step 5 of installation)
-
Test:
docker exec uptime-kuma curl http://192.168.1.100:81
Cannot Access Specific Service
Problem: One monitor always times out.
Check:
-
Service is actually running
-
Firewall allows Docker network access
-
Using correct URL (container name vs IP)
-
Port is correct (internal vs external)
Congratulations!
You did it! Youâve completed the entire HomeLab series!
What Youâve Built:
-
Physical Server - Custom hardware with RAID storage -
Docker & Portainer - Container management platform -
Nginx Proxy Manager - Reverse proxy with SSL -
Immich - Private photo backup -
Discourse - Community forum -
Wiki.js - Knowledge base -
OpenSpeedTest - Network speed testing -
Uptime Kuma - Service monitoring
You now have a production-grade homelab! ![]()
Whatâs Next?
Expand Your HomeLab:
More Services:
-
Nextcloud - File sync and sharing
-
Plex/Jellyfin - Media server
-
Home Assistant - Smart home automation
-
Vaultwarden - Password manager
-
Paperless-ngx - Document management
-
Gitea - Self-hosted Git
Advanced Topics:
-
Backups - Automated backup solutions
-
VPN - Remote access via WireGuard
-
Monitoring - Prometheus + Grafana
-
Security - Fail2ban, Crowdsec
-
High Availability - Multiple servers
TL;DR
-
Uptime Kuma monitors your services 24/7
-
Features: HTTP/HTTPS monitoring, notifications, status pages
-
Installation: Single container with SQLite database
-
Setup: Create monitors for all services
-
Notifications: 90+ options including email, Discord, Telegram
-
Dashboard: Real-time status with uptime graphs
-
Youâve completed the entire HomeLab series!

Final Thoughts
Thank you for following this series!
Building a homelab is a journey. Youâve learned:
-
Server hardware and assembly
-
RAID storage configuration
-
Docker containerization
-
Reverse proxy and SSL
-
Self-hosted applications
-
Network monitoring
Keep learning, keep building, and enjoy your homelab!
What will you add to your homelab next?
What was your favorite part of this series?
Any questions or feedback?
Drop a comment below!
Navigation: â Part 9