What you'll need
- A VPS on Ubuntu 22.04/24.04 with a dedicated IPv4.
- A subdomain pointing at it (e.g. status.example.com) if you want HTTPS.
- Docker installed.
Step 1: Install Docker
curl -fsSL https://get.docker.com | sh
ufw allow 22/tcp
ufw allow 80/tcp
ufw allow 443/tcp
ufw enableStep 2: Run Uptime Kuma with a persistent volume
Kuma stores its database in /app/data. Mount a named volume so your monitors and history survive container restarts and updates. Bind it to localhost only; Caddy will expose it.
docker volume create uptime-kuma
docker run -d --restart=unless-stopped \
-p 127.0.0.1:3001:3001 \
-v uptime-kuma:/app/data \
--name uptime-kuma \
louislam/uptime-kuma:1Step 3: Put Caddy in front for HTTPS
Install Caddy from its official repo and write a one-block config that proxies your subdomain to Kuma. Caddy gets the certificate automatically.
apt install -y debian-keyring debian-archive-keyring apt-transport-https curl
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | tee /etc/apt/sources.list.d/caddy-stable.list
apt update && apt install -y caddystatus.example.com {
reverse_proxy 127.0.0.1:3001
}systemctl reload caddyStep 4: Create the admin account and first monitor
- Open https://status.example.com and set an admin username and password.
- Click Add New Monitor.
- Choose monitor type HTTP(s), paste a URL to watch, and set the heartbeat interval (60 seconds is a sensible default).
- Save. The dashboard starts charting uptime and response time immediately.
Kuma can also monitor a raw TCP port (great for databases or SSH), a ping, a DNS record, or a Docker container, not just HTTP.
Step 5: Wire up Telegram alerts
Create a bot with @BotFather to get a token, then find your chat ID. The quickest way: message your new bot, then call getUpdates and read the chat id from the response.
curl https://api.telegram.org/botYOUR_TOKEN/getUpdates- In Kuma go to Settings, then Notifications, then Setup Notification.
- Pick Telegram, paste the bot token and your chat ID, and test it.
- Attach the notification to each monitor (or set it as default for all).
Keep it running
- Update: docker pull louislam/uptime-kuma:1 then recreate the container with the same volume.
- Back up the volume the same way as any Docker volume (tar the contents of /app/data).
- Publish a public status page from inside Kuma if you want users to self-serve incident status.
Uptime Kuma barely registers on a small box, so a dedicated monitoring VPS costs only a few dollars a month, billed hourly. Spin one up in about 60 seconds in a different region from your apps, and you have an independent watchdog you can destroy the moment you no longer need it.