Logo

Monitor your services with Uptime Kuma

Monitor your services with Uptime Kuma

Install your own self-hosted "UptimeRobot-like" monitoring service. Uptime Kuma watches your websites, APIs, ports, databases and SSL certificates, with Discord, Telegram, email notifications and a public status page.

Introduction

Uptime Kuma is the open-source alternative to UptimeRobot, Pingdom and StatusCake. It continuously monitors:

  • HTTP/HTTPS (with SSL certificate validation)
  • TCP/UDP open ports
  • ICMP ping
  • Databases (MySQL, PostgreSQL, MongoDB, Redis)
  • DNS resolution
  • Steam game servers
  • Docker containers

All with 90+ notification channels and customizable public status pages.

Prerequisites

  • Linux VPS with Docker installed
  • Domain pointing to the VPS (optional but recommended)
  • Port 3001 accessible

Step 1: Launch Uptime Kuma with Docker

Create the volume and container:

sudo docker volume create uptime-kuma
sudo docker run -d \
  --name uptime-kuma \
  --restart=always \
  -p 3001:3001 \
  -v uptime-kuma:/app/data \
  louislam/uptime-kuma:latest

Check the container is running:

sudo docker ps | grep uptime-kuma

Step 2: First login

Open your browser:

http://YOUR_VPS_IP:3001

On first connection, create your admin account (username + password).

Step 3: Add an HTTP monitor

Click Add New Monitor.

Main fields:

  • Monitor Type: HTTP(s)
  • Friendly Name: My Site
  • URL: https://your-site.com
  • Heartbeat Interval: 60 seconds (default)
  • Retries: 3 (number of attempts before triggering alert)
  • Accepted Status Codes: 200-299

Click Save. Uptime Kuma immediately starts monitoring.

Step 4: Configure a Discord notification

Settings → Notifications → Setup Notification.

  • Notification Type: Discord
  • Friendly Name: VeryCloud Alerts
  • Discord Webhook URL: https://discord.com/api/webhooks/XXX/YYY
  • Click Test to verify
  • Save

Go back to your monitor, Notifications tab, and check VeryCloud Alerts.

Step 5: Advanced monitors

TCP Port

Check that a Minecraft server responds:

  • Monitor Type: TCP Port
  • Hostname: mc.your-domain.com
  • Port: 25565

ICMP Ping

  • Monitor Type: Ping
  • Hostname: SERVER_IP

Expiring SSL certificate

On an HTTPS monitor, enable Notify when certificate expires and set the threshold (e.g. 14 days).

Database

  • Monitor Type: MySQL/MariaDB
  • Connection String: mysql://user:password@host:3306/database

Step 6: Create a public status page

Status Pages → Add New Status Page.

  • Slug: verycloud → URL accessible at /status/verycloud
  • Title: VeryCloud Status
  • Description: Real-time status of our services
  • Select monitors to display
  • Customize colors, logo

The page is publicly accessible without authentication.

Configure Nginx Proxy Manager or vanilla Nginx to expose Uptime Kuma on https://status.your-domain.com.

Manual Nginx config:

sudo nano /etc/nginx/sites-available/uptime-kuma
server {
    listen 80;
    server_name status.your-domain.com;

    location / {
        proxy_pass http://127.0.0.1:3001;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

Enable and get SSL:

sudo ln -s /etc/nginx/sites-available/uptime-kuma /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx
sudo certbot --nginx -d status.your-domain.com

Step 8: Backup

Uptime Kuma stores everything in the Docker volume. To backup:

sudo docker stop uptime-kuma
sudo tar -czf uptime-kuma-backup-$(date +%F).tar.gz \
  /var/lib/docker/volumes/uptime-kuma/_data
sudo docker start uptime-kuma

To automate, create a cron:

sudo crontab -e
0 3 * * * docker stop uptime-kuma && tar -czf /backup/uptime-kuma-$(date +\%F).tar.gz /var/lib/docker/volumes/uptime-kuma/_data && docker start uptime-kuma

Troubleshooting

Container won't start

sudo docker logs uptime-kuma --tail 50

Discord notifications don't work

Verify the webhook is valid (no typo) and test with curl:

curl -H "Content-Type: application/json" \
  -d '{"content":"test"}' \
  https://discord.com/api/webhooks/XXX/YYY

Update

sudo docker pull louislam/uptime-kuma:latest
sudo docker stop uptime-kuma
sudo docker rm uptime-kuma
# Re-run the docker run command from step 1

Useful commands

# Real-time logs
sudo docker logs -f uptime-kuma

# Restart
sudo docker restart uptime-kuma

# Update
sudo docker pull louislam/uptime-kuma:latest
sudo docker stop uptime-kuma && sudo docker rm uptime-kuma
# (then docker run from step 1)

# Stats
sudo docker stats uptime-kuma

Conclusion

Uptime Kuma gives you external supervision independent of your infrastructure. Combined with Netdata (internal monitoring), you cover all angles: if your VPS goes completely down, Uptime Kuma (hosted elsewhere or on another node) alerts you, while Netdata would no longer be able to communicate.

Resources

Join our Discord community server

For any questions, suggestions, or just to chat with the community, join us on Discord!

900+Members