Blog / Tutorials

Setting up Uptime Kuma on a VPS to monitor your projects

By the NoctHost TeamJune 3, 20266 min read

Uptime Kuma is a self-hosted status and monitoring tool: a clean dashboard that pings your sites, APIs, TCP ports, and containers on an interval and shouts when something breaks. It is a single Docker container with a built-in web UI, and it supports dozens of notification channels out of the box.

You will run it behind Caddy for HTTPS, add a couple of monitors, and wire up Telegram alerts so a dead service pings your phone. Hosting it on its own small VPS means the monitor stays up even when the thing it watches goes down.

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.
Tip — Run your monitor on a different server (and ideally a different provider or region) than the apps it watches. A monitor that dies with your app tells you nothing.

Step 1: Install Docker

curl -fsSL https://get.docker.com | sh
ufw allow 22/tcp
ufw allow 80/tcp
ufw allow 443/tcp
ufw enable

Step 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:1

Step 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 caddy
/etc/caddy/Caddyfile
status.example.com {
    reverse_proxy 127.0.0.1:3001
}
systemctl reload caddy

Step 4: Create the admin account and first monitor

  1. Open https://status.example.com and set an admin username and password.
  2. Click Add New Monitor.
  3. Choose monitor type HTTP(s), paste a URL to watch, and set the heartbeat interval (60 seconds is a sensible default).
  4. 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
  1. In Kuma go to Settings, then Notifications, then Setup Notification.
  2. Pick Telegram, paste the bot token and your chat ID, and test it.
  3. Attach the notification to each monitor (or set it as default for all).
Tip — Kuma supports Discord, Slack, email, webhooks, and many more. Add at least two channels so a single broken integration does not silence every alert.

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.

Spin one up in about a minute

Email signup, pay with crypto, hourly billing. Trying a box costs cents — destroy it when you are done.

Deploy a server

Frequently asked

Why self-host a monitor instead of using a free SaaS?
A self-hosted monitor has no check-count caps, no data sharing, and one flat hourly cost. You also control the check interval and retention. The main rule is to host it somewhere independent of the apps it watches.
Can Uptime Kuma watch internal services?
Yes. Besides public HTTP endpoints it can probe TCP ports, ping hosts, resolve DNS, and check Docker containers, so you can monitor databases, SSH, and private services alongside your websites.

Keep reading