Fully verified90,771

Editorial pickMonitoring

Uptime Kuma

Uptime Kuma checks HTTP endpoints, TCP ports, DNS, ping, and certificate expiry, then notifies you through Telegram, email, or a webhook. It also publishes status pages. One container and a local Docker volume are enough.

Overview

Uptime Kuma watches things and tells you when they stop working. It checks HTTP(S) endpoints, TCP ports, DNS records, ping, and TLS certificate expiry, then sends a notification through Telegram, email, a webhook, or any of the ninety-odd other providers it ships with.

It suits a home server, a side project, or internal infrastructure — anywhere you want to know about an outage before someone else reports it. A small instance needs no separate database: everything lives in one local Docker volume. Public status pages and a container healthcheck are built in, and the interface is translated into more than forty languages.

This recipe deliberately leaves the Docker socket unmounted. Monitoring websites and ports does not need it, and handing a container direct socket access hands it the host.

Security assessment

The recipe runs without privileged, without host networking, and without the Docker socket. It sets no-new-privileges and publishes its port on 127.0.0.1 only, so anything public goes through an HTTPS reverse proxy.

One risk appears only if you later add Docker API access to monitor containers. Put a restricted socket proxy in front of it rather than mounting /var/run/docker.sock into the container: read access to the socket is equivalent to root on the host.

Update tracking

These are stored results of separate checks, not real-time data. An unknown status means the check has not been performed yet.

New releases

Recipe version compared with the latest known upstream release. A version number, not a reading of what changed.

Current version 2.5.3Aug 30, 2026, 3:42 PM UTC

Critical vulnerabilities

Result of a dedicated Docker image scan, not a Compose configuration check.

Breaking updates

A new major version is found by comparing version numbers. A compatibility verdict is entered by hand after reading the release notes and the migration steps.

Not checkedNot checked

compose.yaml

Upstream Compose changes relative to the verified recipe.

Upstream Compose is not trackedNot checked

Outdated Docker images

Pinned image tags checked for newer versions.

All images are currentAug 30, 2026, 3:42 PM UTC

From observation to action

Update plan

The recipe already pins the latest known release. The steps below show the evidence retained for that version.

2.5.32.5.3
  1. Open the release evidence

    Open this release on GitHub ↗ The link is evidence to review, not proof of compatibility.

  2. Review the version boundary

    The version numbers do not cross a major compatibility boundary. No compatibility verdict has been recorded.

  3. Prepare image-tag changes

    No image-tag change is currently planned.

  4. Follow the documented migration shape

    Change the tag and restart. Release-specific migration steps still come from the release notes and installation guide.

  5. Protect the rollback point

    No version change is currently planned. The recipe includes a backup procedure. Restore has been tested.

  6. Verify the updated recipe

    An exact Fully verified check for this target was recorded on 2026-08-30.

Read the update procedure in the installation guide ↓

Specifications

Security and exposure

Installation levels

The status shows how fully the published recipe meets each level's requirements.

Ready

For home

A minimal setup for a local network or access through a VPN.

  • Single server
  • Local access
  • Minimum components

The recipe covers every requirement at this level.

Ready

For a VPS

A public deployment with protected access and backups.

  • Domain
  • HTTPS via reverse proxy
  • Off-server backup

The recipe covers every requirement at this level.

Not supported

Reliable

A setup designed for predictable operations and observability.

  • Separate database
  • Healthcheck
  • External monitoring
  • CPU and memory limits

You still need to add: separate database, external monitoring, cpu and memory limits.

Tailored to your server

Configuration generator

Answer five questions and download a ready-to-run Uptime Kuma bundle.

Runs locally
01 Do you have a domain?
02 Which reverse proxy?
03 Server architecture
04 Where should data be stored?

Use an absolute path for a separate disk, such as /srv/uptime-kuma.

05 Is VPN access required?

Your bundle is ready

The archive is created in your browser. Your answers are never sent anywhere.

Screenshots

Screenshots have not been added yet.

Quick start

Read the full guide first: it explains external access, backups, and data locations.

Prepare settingscp .env.example .env
Launchdocker compose up -d
Check statusdocker compose ps

Step-by-step guide

1. Check the server

You need Ubuntu 22.04+ or Debian 12+ with Docker Engine and Docker Compose v2.24+. Budget 1 CPU, 512 MB of RAM, and 2 GB of local disk; 1 GB of RAM is more comfortable. There is no separate database to plan for.

Keep the data on a local filesystem or a Docker volume. Upstream advises against NFS, and SQLite over NFS corrupts in ways that only show up later.

docker --version
docker compose version

2. Prepare the files and variables

Put compose.yaml, .env.example, backup.sh, restore.sh, and proxy/ in a directory of their own:

mkdir -p ~/services/uptime-kuma
cd ~/services/uptime-kuma
cp .env.example .env
chmod 600 .env

.env holds four values: the pinned UPTIME_KUMA_VERSION, the local UPTIME_KUMA_PORT, the UPTIME_KUMA_DATA_VOLUME name, and TZ.

3. Start the container on a VPS

docker compose pull
docker compose up -d
docker compose ps

The image carries its own healthcheck. On a first run the container can sit in starting for a couple of minutes while it lays out the database — that is normal. The port is bound to 127.0.0.1, so nothing is reachable from outside yet.

4. Finish the setup over SSH

ssh -L 3001:127.0.0.1:3001 user@server.example

Open http://localhost:3001, create the administrator, and put the password in a password manager. There is no recovery flow if you lose it.

Local network

Without a reverse proxy, keep the localhost bind and reach the interface through an SSH tunnel. If you trust the LAN, replace 127.0.0.1 in compose.yaml with the server’s own LAN address — 192.168.1.10, say — never 0.0.0.0, and block port 3001 on the external interface with a firewall.

Domain and HTTPS

For a reverse proxy on the host, proxy/Caddyfile, proxy/nginx.conf, and proxy/traefik.yaml are ready to use. Replace status.example.com with your domain. Caddy gets a certificate on its own, the Nginx example expects one from Certbot, and Traefik uses the letsencrypt resolver.

Two things matter here. Turn on Trust Proxy in Uptime Kuma, or every check will be attributed to the proxy’s address. And keep the WebSocket upgrade: all three examples forward it already, and without it the dashboard loads once and then stops updating. For Traefik in a container, replace 127.0.0.1 with a host gateway address that container can actually reach.

Backup

Everything lives in the uptime-kuma-data volume:

chmod +x backup.sh restore.sh
./backup.sh

The script stops the container, writes an archive into ./backups, and starts it again. It stops the container on purpose: copying a live SQLite database gives you an archive that restores into a corrupt one. Keep a second copy off this server.

Restore

Restoring replaces the volume contents with the archive you name:

./restore.sh ./backups/uptime-kuma-YYYYMMDDTHHMMSSZ.tar.gz
docker compose ps

The script takes a safety copy of the current data first, so a restore from the wrong archive is recoverable.

Update

Back up, read the release notes, change UPTIME_KUMA_VERSION in .env, then:

docker compose pull
docker compose up -d
docker compose ps
docker compose logs --tail=100 uptime-kuma

Rollback

Put the previous UPTIME_KUMA_VERSION back in .env and run docker compose pull && docker compose up -d.

If the new release migrated the database, the old image will not read the new schema: return to the old version first, then restore the pre-update archive with restore.sh. Read the upstream release notes before crossing a major version in either direction.

Complete removal

docker compose down stops everything and keeps the data. To remove the container and the data for good:

docker compose down
docker volume rm uptime-kuma-data
rm -rf ~/services/uptime-kuma

Sources: official installation and update guide.

Troubleshooting

The container never turns healthy

Look at the status and the last messages:

docker compose ps
docker compose logs --tail=200 uptime-kuma

A first start takes a while: the container prepares the database before it answers. If it stays unhealthy after that, check free disk space and that the volume is writable — a read-only mount fails quietly here.

The page loads, then stops updating

Uptime Kuma pushes state over a WebSocket. If the dashboard renders once and then freezes, the reverse proxy is dropping the upgrade: check that it forwards the Upgrade and Connection headers. Caddy does this on its own; Nginx and Traefik need it configured, and the examples in proxy/ already do.

Port 3001 is taken

Change UPTIME_KUMA_PORT in .env — to 3101, for instance — and recreate the container:

docker compose up -d

If a reverse proxy on the host points at the old port, update its upstream too.

An update left you with an empty instance

You are almost certainly on a different volume, not on lost data. Check which one the container actually mounts:

docker volume inspect uptime-kuma-data
docker compose config

Do not create a new administrator and do not delete the old volume until you have confirmed the data path and that a backup exists. Creating the administrator again is what makes the empty instance permanent.

Official sources

Latest release: 2026-08-22 · GitHub Stars: 90,771 · metadata checked Aug 30, 2026, 1:17 PM UTC

Disclaimer

Fossary is an independent informational catalog and is not affiliated with the developers of the listed applications. We collect information from public sources and verify published recipes, but we do not develop, distribute, or control these applications.

A listing or validation status is not a requirement, endorsement, or personal recommendation to use an application. You decide whether it is suitable and use it at your own risk. We do not warrant an application's security, availability, or fitness for purpose and, to the extent permitted by law, are not liable for resulting loss or damage. Review its license, security settings, data processing, and backup procedures before installation.