Deployment guide

Uptime Kuma

Overview

Uptime Kuma is a popular open source, self-hosted uptime and status monitor with a clean, real-time dashboard. It watches your websites, APIs and services over HTTP(S), TCP, ping, DNS, push, Docker and gRPC, alerts you through more than ninety notification integrations, and publishes status pages you can share.

This SecureAnyCloud image installs Uptime Kuma 1.23.17 from source under /opt/uptime-kuma and fronts it with nginx on port 80, ready for your TLS certificate. It ships with no administrator, so you create your own on your first visit.

Secure by default: the image ships with no administrator and no database rows. Your first visit lands on a one-screen setup wizard where you create your own admin. A uptime-kuma-firstboot.service oneshot ensures the data directory exists, resolves the instance URL and starts the stack on first boot, then disables itself.

What you get:

  • Uptime Kuma 1.23.17 (MIT) under /opt/uptime-kuma
  • An embedded SQLite database at /var/lib/uptime-kuma/data/kuma.db, so there is no separate database to run
  • uptime-kuma.service running as the dedicated uptimekuma system user, bound to loopback at 127.0.0.1:3001
  • An nginx reverse proxy on port 80, configured for the socket.io WebSocket traffic the live dashboard relies on and ready for TLS
  • uptime-kuma-firstboot.service to prepare the data directory and start the stack on first boot
  • Node.js 20 LTS runtime
  • Ubuntu 24.04 LTS base, patched at build time
  • 24/7 SecureAnyCloud support with a 24-hour response SLA

Prerequisites

You need an active Azure subscription, an SSH key pair, and a VNet with a subnet.

The recommended VM size is Standard_B2s. Uptime Kuma is lightweight, and 4 GB of RAM is comfortable for hundreds of monitors.

1

Deploy from the Azure Portal

Search the Marketplace for Uptime Kuma on Ubuntu 24.04 and choose your VM size.

Attach a network security group (NSG) that allows TCP 22 (SSH) from your management network. Also allow TCP 80 and 443 (the dashboard) from the networks that need it. In production, put TLS in front of port 80 (see Step 10).

2

Deploy from the Azure CLI

RG="uptime-kuma-prod"; LOCATION="eastus"; VM_NAME="uptime-kuma-01" IMAGE_URN="sac1647283583153:uptime-kuma-ubuntu-24-04:default:latest" SSH_KEY="$(cat ~/.ssh/id_rsa.pub)" az group create --name "$RG" --location "$LOCATION" az network vnet create -g "$RG" --name kuma-vnet --address-prefix 10.80.0.0/16 --subnet-name kuma-subnet --subnet-prefix 10.80.1.0/24 az network nsg create -g "$RG" --name kuma-nsg az network nsg rule create -g "$RG" --nsg-name kuma-nsg --name allow-ssh --priority 100 \
  --source-address-prefixes "<your-mgmt-cidr>" --destination-port-ranges 22 --access Allow --protocol Tcp az network nsg rule create -g "$RG" --nsg-name kuma-nsg --name allow-web --priority 110 \
  --source-address-prefixes "<your-mgmt-cidr>" --destination-port-ranges 80 443 --access Allow --protocol Tcp
# Accept the Marketplace terms once per subscription (required before the first CLI deploy)
az vm image terms accept --urn sac1647283583153:uptime-kuma-ubuntu-24-04:default:latest
az vm create -g "$RG" --name "$VM_NAME" --image "$IMAGE_URN" \
  --size Standard_B2s --storage-sku StandardSSD_LRS \
  --admin-username azureuser --ssh-key-values "$SSH_KEY" \
  --vnet-name kuma-vnet --subnet kuma-subnet --nsg kuma-nsg --public-ip-sku Standard
3

Connect via SSH

ssh azureuser@<vm-ip>
4

Verify the services are running

Uptime Kuma listens on loopback at 127.0.0.1:3001. nginx serves the dashboard on port 80 and proxies its WebSocket traffic.

sudo systemctl is-active uptime-kuma nginx ss -tln | grep -E ':80 |127.0.0.1:3001' curl -s -o /dev/null -w 'GET /dashboard -> HTTP %{http_code}\n' http://127.0.0.1/dashboard

Both services report active. The Node server is bound to 127.0.0.1:3001, nginx is bound to :80, and the dashboard returns HTTP 200 through nginx.

5

Confirm that no admin ships

Nothing sensitive ships in the image. The SQLite database has zero user rows, so every instance starts at the setup wizard. The per-VM instance info note in /root is root-only and contains no credential, only the resolved URL.

sudo sqlite3 /var/lib/uptime-kuma/data/kuma.db 'SELECT COUNT(*) AS users FROM user;'
sudo stat -c '%n perms=%a owner=%U:%G' /root/uptime-kuma-info.txt
sudo grep -E '^UPTIME_KUMA_URL|^NOTE' /root/uptime-kuma-info.txt

The user count is 0 and the note is 600 root:root. The note tells you to create your admin at the setup wizard on your first visit.

6

Complete the first-run setup wizard

Open http://<vm-ip>/ in your browser. Because no administrator ships, Uptime Kuma redirects you to its one-screen setup wizard.

Choose a language, then enter a Username and a strong Password and click Create. This step secures the instance, so pick a real password.

You are signed in automatically and land on the dashboard, with Quick Stats across the top and an empty monitor list on the left.

7

Add your first monitor

Click Add New Monitor. Leave Monitor Type set to HTTP(s), enter a Friendly Name, and enter the URL you want to watch. Set the check interval and retries, then click Save.

The monitor starts checking immediately. It appears in the list with a live uptime percentage and a heartbeat bar. The dashboard records each result, for example 200 - OK with an Up status.

8

The runtime stack

node -v nginx -v jq -r .version /opt/uptime-kuma/package.json

Node.js 20 LTS runs the server, nginx 1.24 fronts it, and the pinned Uptime Kuma release is 1.23.17.

9

Data and persistence

All monitoring data lives in the embedded SQLite database under /var/lib/uptime-kuma/data. The directory is captured into the image and carried onto every instance.

sudo ls -lh /var/lib/uptime-kuma/data/kuma.db systemctl is-enabled uptime-kuma-firstboot.service apt-mark showhold

The database file is present and the first-boot service is enabled for the next fresh instance. No packages are held, so the OS security baseline is intact.

10

Enable HTTPS

nginx already fronts Uptime Kuma on port 80 and is ready for TLS. Point a DNS record at your VM, then obtain a certificate with certbot.

sudo apt-get install -y certbot python3-certbot-nginx
sudo certbot --nginx -d <your-domain> --agree-tos -m <your-email> --redirect

certbot installs the certificate, rewrites the nginx server block for TLS and sets up automatic renewal. Your dashboard is then served over HTTPS.

Managing the service

sudo systemctl status uptime-kuma
sudo systemctl restart uptime-kuma
sudo journalctl -u uptime-kuma -f

The Node server logs to the journal. nginx logs are under /var/log/nginx/.

To back up the instance, snapshot the OS disk. Alternatively, stop the service and copy /var/lib/uptime-kuma/data/kuma.db.

Support

SecureAnyCloud provides 24/7 support for this image by email and live chat. Support covers deployment, nginx TLS termination, upgrades, notification integrations and performance tuning. Email sales@secureanycloud.com.

This is a repackaged open source software product, with additional charges for SecureAnyCloud support services. Uptime Kuma is a trademark of its respective owner. All product and company names are trademarks or registered trademarks of their respective holders. Their use does not imply any affiliation with or endorsement by them.

Deploy on Azure

Launch Uptime Kuma on Ubuntu 24.04 LTS on Azure with 24/7 support from SecureAnyCloud.

View this image

Need Help?

Our support team is available 24/7.

sales@secureanycloud.com

Deploy on Azure