Self-hosted Uptime Kuma replaces UptimeRobot and Pingdom with 20-second probe intervals, multi-protocol checks, and customizable public status pages.
An infrastructure team managing dozens of internal microservices and edge APIs often finds commercial monitoring platforms either cost-prohibitive per check or unable to reach private subnets. Uptime Kuma runs as a self-contained service inside the target network, executing sub-minute health probes against HTTP endpoints, TCP ports, Docker sockets, and DNS records. It combines lightweight polling loops with an immediate reactive dashboard and multi-channel alerting.
The primary operational distinction centers on probe frequency and dispatch velocity. Uptime Robot limits free accounts to five-minute intervals and requires paid tier upgrades for sixty-second checks, leaving blind spots where transient degradation escapes detection. Uptime Kuma defaults to twenty-second polling cycles with no check caps, surfacing latency spikes and endpoint failures almost immediately. Because checks run on your own compute, high-frequency polling introduces negligible network overhead without hosted platform rate limits.
Network topology drives the secondary performance difference. Uptime Robot probes from public datacenters across the internet, so requests traverse transit providers, CDN caches, and edge firewalls. Uptime Kuma deploys adjacent to workloads inside a private VPC, behind a VPN, or mounted directly to a Docker socket. While Uptime Robot provides built-in multi-region consensus that filters out regional route flaps, Uptime Kuma trades distributed vantage points for zero probe transit latency and visibility into internal microservices that cannot face the public web.
/metricsIs Uptime Kuma free for commercial use? Yes. Distributed under permissive MIT terms, it runs in production environments with no license costs, seat fees, or monitor restrictions.
Uptime Kuma vs Uptime Robot — which should you choose? Choose Uptime Robot for managed multi-region consensus from global test nodes without running servers; choose Uptime Kuma for sub-minute checks, private VPC monitoring, and complete data control.
Can Uptime Kuma monitor private services behind a firewall? Yes. Operating inside your own infrastructure, it directly reaches internal IP addresses, local DNS records, and Docker containers inaccessible to external SaaS probes.
Uptime Kuma is ideal when high-frequency polling, private network visibility, and data sovereignty outweigh the convenience of multi-region probe consensus. Its MIT license permits unrestricted enterprise deployment, while active maintenance with updates pushed in September 2026 ensures continued reliability. Teams requiring global multi-continent consensus should maintain an external fallback, but for private infrastructure monitoring, it provides an outstanding self-hosted foundation.
We started this exact setup from scratch in a clean Linux machine on Nov 1, 2026 and checked it through Uptime Kuma's own API: every check passed. Recipes are re-checked regularly and removed if they stop working.
mkdir -p uptime-kuma && cd uptime-kuma
curl -fsSL https://open-source.store/tools/uptime-kuma/compose.yml -o compose.ymltouch .envdocker compose up -dservices:
uptime-kuma:
image: louislam/uptime-kuma:2.5.9
restart: unless-stopped
volumes:
- ./data:/app/data
ports:
- "3001:3001"
healthcheck:
test: ["CMD", "extra/healthcheck"]
interval: 10s
timeout: 10s
start_period: 60s
retries: 5
Lint, codegen, breaking-change checks and dependency management in one Git-native CLI. Open source, no registry lock-in.
Show that Uptime Kuma is listed as an open-source alternative. Paste into your README:
Ubuntu 24.04 · Apple container, Docker 29.1.3, Compose 2.40.3+ds1-0ubuntu1~24.04.1. Images pulled in 106 s: louislam/uptime-kuma:2.5.9.
Based on the upstream setup. Official compose. Image pinned to 2.5.9 and the image's own healthcheck repeated with a shorter interval.
uptime-kuma-1 | 2026-11-01T15:35:57.608515466Z 2026-11-01T15:35:57Z [DB] INFO: patch-added-json-query.sql is patching uptime-kuma-1 | 2026-11-01T15:35:57.609027257Z 2026-11-01T15:35:57Z [DB] INFO: patch-added-json-query.sql was patched successfully uptime-kuma-1 | 2026-11-01T15:35:57.609073049Z 2026-11-01T15:35:57Z [DB] INFO: patch-added-kafka-producer.sql is not patched uptime-kuma-1 | 2026-11-01T15:35:57.609117757Z 2026-11-01T15:35:57Z [DB] INFO: patch-added-kafka-producer.sql is patching uptime-kuma-1 | 2026-11-01T15:35:57.610145424Z 2026-11-01T15:35:57Z [DB] INFO: patch-added-kafka-producer.sql was patched successfully uptime-kuma-1 | 2026-11-01T15:35:57.610186924Z 2026-11-01T15:35:57Z [DB] INFO: patch-add-certificate-expiry-status-page.sql is not patched uptime-kuma-1 | 2026-11-01T15:35:57.610232924Z 2026-11-01T15:35:57Z [DB] INFO: patch-add-certificate-expiry-status-page.sql is patching uptime-kuma-1 | 2026-11-01T15:35:57.610552257Z 2026-11-01T15:35:57Z [DB] INFO: patch-add-certificate-expiry-status-page.sql was patched successfully uptime-kuma-1 | 2026-11-01T15:35:57.610616049Z 2026-11-01T15:35:57Z [DB] INFO: patch-monitor-oauth-cc.sql is not patched uptime-kuma-1 | 2026-11-01T15:35:57.610651174Z 2026-11-01T15:35:57Z [DB] INFO: patch-monitor-oauth-cc.sql is patching uptime-kuma-1 | 2026-11-01T15:35:57.611591924Z 2026-11-01T15:35:57Z [DB] INFO: patch-monitor-oauth-cc.sql was patched successfully uptime-kuma-1 | 2026-11-01T15:35:57.611633674Z 2026-11-01T15:35:57Z [DB] INFO: patch-add-timeout-monitor.sql is not patched uptime-kuma-1 | 2026-11-01T15:35:57.611678799Z 2026-11-01T15:35:57Z [DB] INFO: patch-add-timeout-monitor.sql is patching uptime-kuma-1 | 2026-11-01T15:35:57.612044049Z 2026-11-01T15:35:57Z [DB] INFO: patch-add-timeout-monitor.sql was patched successfully uptime-kuma-1 | 2026-11-01T15:35:57.612086799Z 2026-11-01T15:35:57Z [DB] INFO: patch-add-gamedig-given-port.sql is not patched uptime-kuma-1 | 2026-11-01T15:35:57.612132549Z 2026-11-01T15:35:57Z [DB] INFO: patch-add-gamedig-given-port.sql is patching uptime-kuma-1 | 2026-11-01T15:35:57.612444799Z 2026-11-01T15:35:57Z [DB] INFO: patch-add-gamedig-given-port.sql was patched successfully uptime-kuma-1 | 2026-11-01T15:35:57.612486882Z 2026-11-01T15:35:57Z [DB] INFO: patch-notification-config.sql is not patched uptime-kuma-1 | 2026-11-01T15:35:57.612534632Z 2026-11-01T15:35:57Z [DB] INFO: patch-notification-config.sql is patching uptime-kuma-1 | 2026-11-01T15:35:57.614323632Z 2026-11-01T15:35:57Z [DB] INFO: patch-notification-config.sql was patched successfully uptime-kuma-1 | 2026-11-01T15:35:57.614388091Z 2026-11-01T15:35:57Z [DB] INFO: patch-fix-kafka-producer-booleans.sql is not patched uptime-kuma-1 | 2026-11-01T15:35:57.614457132Z 2026-11-01T15:35:57Z [DB] INFO: patch-fix-kafka-producer-booleans.sql is patching uptime-kuma-1 | 2026-11-01T15:35:57.618943424Z 2026-11-01T15:35:57Z [DB] INFO: patch-fix-kafka-producer-booleans.sql was patched successfully uptime-kuma-1 | 2026-11-01T15:35:57.618978799Z 2026-11-01T15:35:57Z [DB] INFO: patch-timeout.sql is not patched uptime-kuma-1 | 2026-11-01T15:35:57.619064091Z 2026-11-01T15:35:57Z [DB] INFO: patch-timeout.sql is patching uptime-kuma-1 | 2026-11-01T15:35:57.619247507Z 2026-11-01T15:35:57Z [DB] INFO: patch-timeout.sql was patched successfully uptime-kuma-1 | 2026-11-01T15:35:57.619294882Z 2026-11-01T15:35:57Z [DB] INFO: patch-monitor-tls-info-add-fk.sql is not patched uptime-kuma-1 | 2026-11-01T15:35:57.619337424Z 2026-11-01T15:35:57Z [DB] INFO: patch-monitor-tls-info-add-fk.sql is patching uptime-kuma-1 | 2026-11-01T15:35:57.619566299Z 2026-11-01T15:35:57Z [DB] INFO: patch-monitor-tls-info-add-fk.sql was patched successfully uptime-kuma-1 | 2026-11-01T15:35:57.619608049Z 2026-11-01T15:35:57Z [DB] INFO: Database Patched Successfully uptime-kuma-1 | 2026-11-01T15:35:57.722820591Z 2026-11-01T15:35:57Z [MIGRATION] INFO: Listening on: uptime-kuma-1 | 2026-11-01T15:35:57.722923549Z 2026-11-01T15:35:57Z [MIGRATION] INFO: - http://localhost:3001 uptime-kuma-1 | 2026-11-01T15:35:57.722997841Z 2026-11-01T15:35:57Z [MIGRATION] INFO: - http://172.18.0.2:3001 uptime-kuma-1 | 2026-11-01T15:35:57.723073841Z 2026-11-01T15:35:57Z [DB] INFO: Migrating Aggregate Table uptime-kuma-1 | 2026-11-01T15:35:57.723124299Z 2026-11-01T15:35:57Z [DB] INFO: Getting list of unique monitors uptime-kuma-1 | 2026-11-01T15:35:57.724003466Z 2026-11-01T15:35:57Z [DB] INFO: Clearing non-important heartbeats uptime-kuma-1 | 2026-11-01T15:35:57.724586507Z 2026-11-01T15:35:57Z [DB] INFO: No data to migrate uptime-kuma-1 | 2026-11-01T15:35:57.724814757Z 2026-11-01T15:35:57Z [SERVER] INFO: JWT secret is not found, generate one. uptime-kuma-1 | 2026-11-01T15:35:57.783847466Z 2026-11-01T15:35:57Z [SERVER] INFO: Stored JWT secret into database uptime-kuma-1 | 2026-11-01T15:35:57.784139174Z 2026-11-01T15:35:57Z [SERVER] INFO: No user, need setup uptime-kuma-1 | 2026-11-01T15:35:57.793239257Z 2026-11-01T15:35:57Z [SERVICES] INFO: Starting nscd uptime-kuma-1 | 2026-11-01T15:35:57.805034632Z 2026-11-01T15:35:57Z [SERVER] INFO: Listening on: uptime-kuma-1 | 2026-11-01T15:35:57.805096007Z 2026-11-01T15:35:57Z [SERVER] INFO: - http://localhost:3001 uptime-kuma-1 | 2026-11-01T15:35:57.805169716Z 2026-11-01T15:35:57Z [SERVER] INFO: - http://172.18.0.2:3001 uptime-kuma-1 | 2026-11-01T15:36:02.731070635Z 2026-11-01T15:36:02Z [SOCKET] INFO: New websocket connection, IP = 127.0.0.1 uptime-kuma-1 | 2026-11-01T15:36:02.731105176Z 2026-11-01T15:36:02Z [AUTH] INFO: WebSocket with no origin is allowed uptime-kuma-1 | 2026-11-01T15:36:02.735851218Z 2026-11-01T15:36:02Z [SERVER] INFO: Redirect to setup page uptime-kuma-1 | 2026-11-01T15:36:02.791210343Z 2026-11-01T15:36:02Z [AUTH] INFO: Login by username + password. IP=127.0.0.1 uptime-kuma-1 | 2026-11-01T15:36:02.847483218Z 2026-11-01T15:36:02Z [AUTH] INFO: Successfully logged in user admin. IP=127.0.0.1 uptime-kuma-1 | 2026-11-01T15:36:02.851913718Z 2026-11-01T15:36:02Z [MANAGE] INFO: Resume Monitor: 1 User ID: 1 uptime-kuma-1 | 2026-11-01T15:36:02.853199718Z 2026-11-01T15:36:02Z [MONITOR] INFO: Added Monitor: 1 User ID: 1 uptime-kuma-1 | 2026-11-01T15:36:02.853615510Z 2026-11-01T15:36:02Z [MONITOR] INFO: Get Monitor: 1 User ID: 1 uptime-kuma-1 | 2026-11-01T15:36:16.154279334Z SyntaxError: Unexpected token '@', "@ uptime-kuma-1 | 2026-11-01T15:36:16.154303876Z " is not valid JSON uptime-kuma-1 | 2026-11-01T15:36:16.154305084Z at JSON.parse (<anonymous>) uptime-kuma-1 | 2026-11-01T15:36:16.154306084Z at createStrictSyntaxError (/app/node_modules/body-parser/lib/types/json.js:169:10) uptime-kuma-1 | 2026-11-01T15:36:16.154306793Z at parse (/app/node_modules/body-parser/lib/types/json.js:90:15) uptime-kuma-1 | 2026-11-01T15:36:16.154307501Z at /app/node_modules/body-parser/lib/read.js:128:18 uptime-kuma-1 | 2026-11-01T15:36:16.154308126Z at AsyncResource.runInAsyncScope (node:async_hooks:214:14) uptime-kuma-1 | 2026-11-01T15:36:16.154309001Z at invokeCallback (/app/node_modules/raw-body/index.js:238:16) uptime-kuma-1 | 2026-11-01T15:36:16.154309626Z at done (/app/node_modules/raw-body/index.js:227:7) uptime-kuma-1 | 2026-11-01T15:36:16.154310251Z at IncomingMessage.onEnd (/app/node_modules/raw-body/index.js:287:7) uptime-kuma-1 | 2026-11-01T15:36:16.154310876Z at IncomingMessage.emit (node:events:519:28) uptime-kuma-1 | 2026-11-01T15:36:16.154311459Z at endReadableNT (node:internal/streams/readable:1698:12) uptime-kuma-1 | 2026-11-01T15:36:16.154312084Z SyntaxError: Unexpected token '@', "@ uptime-kuma-1 | 2026-11-01T15:36:16.154312751Z " is not valid JSON uptime-kuma-1 | 2026-11-01T15:36:16.154313334Z at JSON.parse (<anonymous>) uptime-kuma-1 | 2026-11-01T15:36:16.154314001Z at createStrictSyntaxError (/app/node_modules/body-parser/lib/types/json.js:169:10) uptime-kuma-1 | 2026-11-01T15:36:16.154314751Z at parse (/app/node_modules/body-parser/lib/types/json.js:90:15) uptime-kuma-1 | 2026-11-01T15:36:16.154326418Z at /app/node_modules/body-parser/lib/read.js:128:18 uptime-kuma-1 | 2026-11-01T15:36:16.154327584Z at AsyncResource.runInAsyncScope (node:async_hooks:214:14) uptime-kuma-1 | 2026-11-01T15:36:16.154328251Z at invokeCallback (/app/node_modules/raw-body/index.js:238:16) uptime-kuma-1 | 2026-11-01T15:36:16.154328876Z at done (/app/node_modules/raw-body/index.js:227:7) uptime-kuma-1 | 2026-11-01T15:36:16.154329501Z at IncomingMessage.onEnd (/app/node_modules/raw-body/index.js:287:7) uptime-kuma-1 | 2026-11-01T15:36:16.154330126Z at IncomingMessage.emit (node:events:519:28) uptime-kuma-1 | 2026-11-01T15:36:16.154330751Z at endReadableNT (node:internal/streams/readable:1698:12) uptime-kuma-1 | 2026-11-01T15:36:28.144265132Z SyntaxError: Expected ',' or '}' after property value in JSON at position 65 (line 1 column 66) uptime-kuma-1 | 2026-11-01T15:36:28.144282757Z at JSON.parse (<anonymous>) uptime-kuma-1 | 2026-11-01T15:36:28.144284215Z at parse (/app/node_modules/body-parser/lib/types/json.js:96:19) uptime-kuma-1 | 2026-11-01T15:36:28.144285007Z at /app/node_modules/body-parser/lib/read.js:128:18 uptime-kuma-1 | 2026-11-01T15:36:28.144285798Z at AsyncResource.runInAsyncScope (node:async_hooks:214:14) uptime-kuma-1 | 2026-11-01T15:36:28.144286423Z at invokeCallback (/app/node_modules/raw-body/index.js:238:16) uptime-kuma-1 | 2026-11-01T15:36:28.144291590Z at done (/app/node_modules/raw-body/index.js:227:7) uptime-kuma-1 | 2026-11-01T15:36:28.144292215Z at IncomingMessage.onEnd (/app/node_modules/raw-body/index.js:287:7) uptime-kuma-1 | 2026-11-01T15:36:28.144292798Z at IncomingMessage.emit (node:events:519:28) uptime-kuma-1 | 2026-11-01T15:36:28.144293340Z at endReadableNT (node:internal/streams/readable:1698:12) uptime-kuma-1 | 2026-11-01T15:36:28.144293840Z at process.processTicksAndRejections (node:internal/process/task_queues:89:21) uptime-kuma-1 | 2026-11-01T15:36:28.145496423Z SyntaxError: Expected ',' or '}' after property value in JSON at position 65 (line 1 column 66) uptime-kuma-1 | 2026-11-01T15:36:28.145504673Z at JSON.parse (<anonymous>) uptime-kuma-1 | 2026-11-01T15:36:28.145505923Z at parse (/app/node_modules/body-parser/lib/types/json.js:96:19) uptime-kuma-1 | 2026-11-01T15:36:28.145512340Z at /app/node_modules/body-parser/lib/read.js:128:18 uptime-kuma-1 | 2026-11-01T15:36:28.145513090Z at AsyncResource.runInAsyncScope (node:async_hooks:214:14) uptime-kuma-1 | 2026-11-01T15:36:28.145513673Z at invokeCallback (/app/node_modules/raw-body/index.js:238:16) uptime-kuma-1 | 2026-11-01T15:36:28.145514215Z at done (/app/node_modules/raw-body/index.js:227:7) uptime-kuma-1 | 2026-11-01T15:36:28.145514757Z at IncomingMessage.onEnd (/app/node_modules/raw-body/index.js:287:7) uptime-kuma-1 | 2026-11-01T15:36:28.145515298Z at IncomingMessage.emit (node:events:519:28) uptime-kuma-1 | 2026-11-01T15:36:28.145523465Z at endReadableNT (node:internal/streams/readable:1698:12) uptime-kuma-1 | 2026-11-01T15:36:28.145524257Z at process.processTicksAndRejections (node:internal/process/task_queues:89:21) uptime-kuma-1 | 2026-11-01T15:36:55.148266921Z SyntaxError: Expected property name or '}' in JSON at position 1 (line 1 column 2) uptime-kuma-1 | 2026-11-01T15:36:55.148288921Z at JSON.parse (<anonymous>) uptime-kuma-1 | 2026-11-01T15:36:55.150066171Z at parse (/app/node_modules/body-parser/lib/types/json.js:96:19) uptime-kuma-1 | 2026-11-01T15:36:55.150073254Z at /app/node_modules/body-parser/lib/read.js:128:18 uptime-kuma-1 | 2026-11-01T15:36:55.150074296Z at AsyncResource.runInAsyncScope (node:async_hooks:214:14) uptime-kuma-1 | 2026-11-01T15:36:55.150075129Z at invokeCallback (/app/node_modules/raw-body/index.js:238:16) uptime-kuma-1 | 2026-11-01T15:36:55.150076129Z at done (/app/node_modules/raw-body/index.js:227:7) uptime-kuma-1 | 2026-11-01T15:36:55.150076796Z at IncomingMessage.onEnd (/app/node_modules/raw-body/index.js:287:7) uptime-kuma-1 | 2026-11-01T15:36:55.150077463Z at IncomingMessage.emit (node:events:519:28) uptime-kuma-1 | 2026-11-01T15:36:55.150078088Z at endReadableNT (node:internal/streams/readable:1698:12) uptime-kuma-1 | 2026-11-01T15:36:55.150078754Z at process.processTicksAndRejections (node:internal/process/task_queues:89:21) uptime-kuma-1 | 2026-11-01T15:36:55.152358213Z SyntaxError: Expected property name or '}' in JSON at position 1 (line 1 column 2) uptime-kuma-1 | 2026-11-01T15:36:55.152366254Z at JSON.parse (<anonymous>) uptime-kuma-1 | 2026-11-01T15:36:55.152367504Z at parse (/app/node_modules/body-parser/lib/types/json.js:96:19) uptime-kuma-1 | 2026-11-01T15:36:55.152379921Z at /app/node_modules/body-parser/lib/read.js:128:18 uptime-kuma-1 | 2026-11-01T15:36:55.152380879Z at AsyncResource.runInAsyncScope (node:async_hooks:214:14) uptime-kuma-1 | 2026-11-01T15:36:55.152381463Z at invokeCallback (/app/node_modules/raw-body/index.js:238:16) uptime-kuma-1 | 2026-11-01T15:36:55.152382004Z at done (/app/node_modules/raw-body/index.js:227:7) uptime-kuma-1 | 2026-11-01T15:36:55.152382504Z at IncomingMessage.onEnd (/app/node_modules/raw-body/index.js:287:7) uptime-kuma-1 | 2026-11-01T15:36:55.152390504Z at IncomingMessage.emit (node:events:519:28) uptime-kuma-1 | 2026-11-01T15:36:55.152391213Z at endReadableNT (node:internal/streams/readable:1698:12) uptime-kuma-1 | 2026-11-01T15:36:55.152391754Z at process.processTicksAndRejections (node:internal/process/task_queues:89:21)