All Articles
DevOps··9 min read

Tired of Self-Hosting Uptime Kuma? An Honest Look at the Hosted Path

Uptime Kuma is excellent software with an operational catch: it can't watch itself, it probes from one place, and someone has to maintain it. An honest self-hosted vs hosted comparison, including how to monitor behind-the-firewall services without exposing them.

Let's get one thing straight before anything else: Uptime Kuma is excellent software. It's one of the most polished self-hosted projects in existence, the UI embarrasses plenty of paid products, and the maintainers have earned every one of those GitHub stars. If people move off it, and they do, it's almost never because the software failed them.

It's because of everything around the software. The recurring pains are operational, and they compound quietly:

  • The monitor can't monitor itself. When the VPS running Kuma goes down, so does every check on it. You find out your API was offline for four hours from a customer email, and then you discover Kuma was down for six. Who watches the watcher is not a philosophy question here, it's a pager gap.
  • One vantage point. Kuma probes from wherever it runs. It cannot distinguish "the site is down" from "my VPS provider is having network weather," because it has no second region to confirm with.
  • You are the ops team. Upgrades, Docker image bumps, backups of the SQLite database (and the occasional lock or corruption when the disk fills), TLS renewal on the dashboard, reverse proxy config. None of it is hard. All of it is recurring.
  • No incident lifecycle or on-call. Kuma sends notifications. It does not open incidents, escalate to whoever is on call, or track acknowledgment. At 3 a.m., a Telegram message that nobody saw is functionally the same as no alert.
  • Notification sprawl. Ninety-plus notification providers is impressive, but each one is fire-and-forget. There is no dedupe, no routing logic, no "only page me if it fails from two places."

If you're weighing tools feature by feature, we keep a full Uptime Kuma alternative comparison that goes monitor type by monitor type. This post is about the decision underneath that: should you be self-hosting your uptime monitoring at all, and if you switch, what do you actually give up?

Self-hosted vs hosted: the honest decision criteria

Most "self-hosted vs hosted uptime monitoring" content is written by someone selling one side. Here's the table we wish had existed when we were on the other side of this decision. The last row matters most, because for most Kuma users the real objection to hosted tools was never money. It was control.

CriterionSelf-hosted Uptime KumaHosted monitoring
Multi-region probingOne vantage point (your box), unless you run and sync multiple instances yourselfBuilt in; failures confirmed from multiple continents before alerting
Who watches the watcherNobody, unless you add an external check on Kuma itselfThe vendor's redundant infrastructure; their outage is their pager, not yours
Status pagesHosted on the same box as your monitoring (and often your app), so they share its outagesServed from infrastructure independent of yours, which is the whole point
On-call and escalationNot built in; notifications onlyIncident lifecycle, acknowledgment, escalation chains on most platforms
Price at 10-25 monitorsThe VPS you already pay for (near-zero marginal cost)Free tiers cover the low end; roughly $9-30/mo for this range on most vendors
Maintenance hours per monthUpgrades, backups, SQLite care, TLS, proxy config: call it 1-3 honest hoursZero
Data control / private servicesTotal: your box, your database, AGPL code you can readThe vendor holds the check data. Private services can still stay private: outbound-only heartbeats mean nothing behind your firewall gets exposed (see below)
💡

The row that decides it

If your monitoring has no production stakes (nobody gets paged, no customers check a status page), the left column wins on cost and that's fine. The moment downtime costs money or trust, the first three rows stop being features and become requirements.

The hosted options, compared

If you decide the hosted column is where you need to be, here's the honest lay of the land for a Kuma refugee, including the option of not leaving at all.

upti.my

Built for exactly this migration path. Every Kuma monitor type you actually use maps to a native check type (mapping table below), checks probe from multiple continents with multi-node confirmation, and incidents have a real lifecycle: open, acknowledge, escalate, resolve. The free plan ($0) covers 10 checks, 5 heartbeats, and 1 public status page, which is a typical homelab-graduated-to-production setup. Starter is $9/mo, Growth is $39/mo with a 14-day trial and adds custom workflows including self-healing, Scale is $99/mo. The differentiator for this audience is heartbeat monitoring for everything behind your firewall, plus workflow automation, both covered in the split section below.

Better Stack

Better Stack is the polished high end: uptime monitoring merged with log management and a strong incident/on-call product. If your team already wants centralized logging and you have the budget for a per-seat, multi-product bill, it's a serious option. For someone leaving Kuma because a VPS was one more thing to manage, its scope can feel like trading one kind of complexity for another.

UptimeRobot

UptimeRobot is the veteran, and its free tier is famous. The trade-offs are check intervals and depth: the free tier probes infrequently, and the features Kuma users take for granted (fast intervals, keyword assertions, decent status pages) sit behind paid tiers that add up. It's a fine landing spot for genuinely casual monitoring, less so if Kuma's one-minute checks were part of why you liked it.

Hyperping

Hyperping is clean, focused uptime and status pages with a design-forward feel that Kuma users tend to appreciate. It covers the core well. What it lacks for this migration is the operational layer around the checks: heartbeat depth and automation beyond notifications.

Or: stay on Kuma, but harden it

Honest option, and for some readers the right one: keep Kuma and fix only its blind spot. Point one external check at Kuma's own/dashboard (a single free hosted check from any vendor, including ours, does it), so a dead watcher pages you. Add a second Kuma instance in another region if single-vantage false positives bite you, cron your SQLite backups off-box, and accept the maintenance line in the table above as the price. If Kuma down was your only pain, this costs you an evening and zero dollars.

The five-minute fix everyone should do today

Whatever you decide long term, put an external HTTP check on your Kuma instance right now. The who-watches-the-watcher gap is the one Kuma failure mode you cannot configure your way out of from inside Kuma.

The split that works: heartbeats inside, hosted checks outside

Here's the objection that usually keeps self-hosters on Kuma: half of what they monitor isn't reachable from the internet at all. Cron jobs, internal services, a database on a private network. An external probe can't see any of it, and "just expose an endpoint" is exactly the kind of security trade you self-host to avoid.

The answer is to split the job along the line where each side is actually better. The outside view (is the site reachable from Frankfurt, Virginia, and Singapore; is the status page up when your rack isn't) is a job hosted infrastructure does structurally better, because it lives outside your failure domain. The inside view is a job your own systems handle by reporting out, not by letting probes in.

That's heartbeat monitoring, the same dead-man's-switch model as Kuma's push monitors: your job or service pings a unique URL, and the alert fires when the pings stop. All traffic is outbound, so it works from behind firewalls and NAT with zero inbound exposure, no open ports, and nothing new to install, upgrade, or back up. A curl at the end of a script is the entire integration.

crontab (excerpt)
# existing job, one line longer: ping on success, alert on silence
0 3 * * * /usr/local/bin/backup.sh && curl -fsS https://app.upti.my/heartbeat/<your-id>

# anything long-running: let its own health check report outward
* * * * * docker inspect -f '{{.State.Health.Status}}' postgres \
  | grep -q healthy && curl -fsS https://app.upti.my/heartbeat/<other-id>

And the self-healing part Kuma never had comes from workflows, not from software on your box. When a check fails or a heartbeat goes silent, a visual workflow can filter and dedupe the signal, wait out a flap, then call a webhook or provider API that restarts or redeploys the service: restart-on-failure automation with guardrails instead of another daemon to patch. You delete the failure mode where your monitoring shares fate with what it monitors, and you add nothing to your maintenance list. Setup details are in the heartbeat documentation and the workflow documentation.

Migration: recreate your Kuma monitors in an afternoon

The good news about Kuma configs is that they're usually simple: a few dozen HTTP monitors, some TCP and ping checks, a handful of push monitors for cron jobs. The mapping is nearly one to one:

Uptime Kuma monitorupti.my equivalentNotes
HTTP(s) / keywordHTTP checkKeyword monitors become response-body assertions; you also gain multi-region confirmation
TCP portTCP checkDirect equivalent
PingPing checkDirect equivalent
DNSDNS checkDirect equivalent; see the check types overview
PushHeartbeatSame dead-man's-switch model: swap the URL your cron job curls
Docker containerHeartbeat + workflowNo socket-level probe; a one-line health-check ping covers liveness, and a workflow can restart the container via webhook

Sizing against the free plan: 10 checks, 5 heartbeats, and 1 public status page. If your Kuma instance watches a personal site, an API, a database port, and a few cron jobs, that fits with room left. The full inventory is in what you get with the free plan.

The one piece that doesn't copy over automatically is your status page audience. If people subscribed to your Kuma status page, publish the new public status page first, announce the URL on the old one, and run both for a couple of weeks before retiring Kuma's. Subscribers re-subscribe; bookmarks take longer, so a redirect from the old status page URL is worth the five minutes of nginx config (your last one, if all goes well).

⚠️

Don't decommission Kuma on day one

Run both systems in parallel for a week or two and compare what pages you. It builds confidence in the new alerting, and any threshold you mistuned shows up as a discrepancy instead of a missed outage.

The cost question, honestly

The strongest argument for staying is real: the VPS you already have makes Kuma genuinely near-free. If you're a hobbyist with one box, no on-call rotation, and nobody downstream of your uptime, staying on Kuma (hardened with that one external check) is the right call, and no honest vendor should tell you otherwise.

The switch case is production stakes. When a false alarm wakes a human, single-vantage probing is expensive. When a real outage goes unnoticed because the watcher died with the watched, that's the most expensive monitoring bill you'll ever pay, it just doesn't arrive as an invoice. Multi-region confirmation, escalation to whoever is on call, and a status page that stays up when your infra doesn't: that's what the $0 to $9/mo actually buys, plus the 1-3 hours a month you stop spending on somebody else's upgrade notes. Where monitoring fits in the bigger picture is covered in how to build a reliability stack, and the wider tool landscape lives on the alternatives overview.

📌Key Takeaways

  • 1Uptime Kuma is excellent software; the pains that push people off it are operational: self-blindness, one vantage point, and recurring maintenance
  • 2The who-watches-the-watcher gap is the one failure mode you can't fix from inside Kuma. At minimum, put an external check on Kuma today
  • 3Hosted wins on multi-region confirmation, on-call, and status page independence; self-hosted wins on marginal cost and total data control
  • 4Behind-the-firewall services don't need an exposed port or new software: outbound-only heartbeats cover the inside view, hosted checks cover the outside, and workflows handle restart-style self-healing via webhooks and provider APIs
  • 5Kuma HTTP, TCP, ping, and DNS monitors map one to one; push monitors become heartbeats. The free plan (10 checks, 5 heartbeats, 1 status page) covers a typical instance
  • 6Staying on hardened Kuma is legitimate for hobbyists; the switch case is production stakes, where someone gets paged and customers check the status page

You liked Kuma because it respected you: your hardware, your rules, nothing exposed that didn't need to be. The hosted path can respect the same instincts: it moves the eyes outside your failure domain and lets everything private keep reporting outward. Recreate your Kuma monitors on the free plan this afternoon, run both for a week, and let the results decide.