Build vs Buy

How to Self-Host an Internal Status Page for Your Tools

Skip the $29 to $1,499 a month SaaS tiers and run your own status page with Uptime Kuma, a cheap VPS, and a reverse proxy. Here's the full setup.

At a glance
  1. 01Self-hosting a status page like Uptime Kuma costs around $5 a month, compared to SaaS tools that charge up to $1,499.
  2. 02Public status pages lack built-in monitoring, often requiring an extra $150 to $300 monthly for separate alerting tools.
  3. 03Uptime Kuma is the most popular open-source option, supporting diverse monitoring types with checks every 20 seconds.
  4. 04Internal status pages are best kept private through network-level restrictions like VPNs rather than app-level SSO.
An exploded structural view of a hardware chassis with a top routing manifold feeding into a grid of blank indicator pegs, representing a self-hosted status page and reverse proxy layer.
Illustration generated by Remy for this story.

A self-hosted internal status page is a monitoring dashboard, usually Uptime Kuma running in Docker behind a reverse proxy, that checks your internal tools on a schedule and shows their status on a private page you control. Build one in an afternoon for the cost of a $5 VPS, instead of paying $29 to $1,499 a month for a SaaS tool built for customer-facing incident comms.1

Here's the full build, and the tradeoffs worth knowing before you commit.

Why teams building internal tools also need a status page

More of your company's software isn't coming from IT anymore. It's coming from whoever on the ops team learned to spin up a script, a dashboard, or an AI agent. Shadow AI adoption alone has grown fast: 78% of AI users at work now bring their own tools outside IT approval, and shadow IT overall is estimated to account for 30-40% of large-enterprise IT spend.2 That sprawl leaves a gap: nobody owns the answer to "is the internal reporting tool actually up right now," because it was never provisioned through the channels that come with monitoring built in.

Public status page tools like Atlassian Statuspage answer a different question for a different audience: telling paying customers about an outage during an incident. They're communication layers, not monitoring tools, priced and structured accordingly. Point that setup at your own admin dashboards and internal APIs, and the mismatch shows up fast, in cost and in missing features.

How much does Statuspage actually cost for an internal team?

Atlassian Statuspage's plans run from a $29/month Hobby tier up to a $1,499/month Enterprise tier for 25,000 subscribers.1 Subscriber count means nothing to an internal team, but you pay for it anyway.

Figure 1
Self-hosted vs. SaaS status page cost
$5/mo
VPS cost to self-host with Uptime Kuma
$29/mo
Statuspage Hobby tier starting price
$1,499/mo
Statuspage Enterprise tier price
Source: Atlassian

The real cost is what's gated behind higher tiers:

  • Custom CSS requires the $99/month Startup plan.1
  • Custom HTML/JavaScript and white-labeling require the $399/month Business plan or above.13
  • Private pages are a separate add-on, around $70/month, not bundled into any base tier.3
  • SSO is another account-wide add-on, roughly $100/month.3

None of this includes monitoring. Statuspage is a manual display and communication layer; it doesn't detect outages on its own.3 One buyer comparison estimates that pairing it with separate monitoring and alerting tools (Pingdom, Opsgenie) adds another $150 to $300 a month, pushing a realistic startup-scale setup to about $249/month.45 That's real money for something an internal team can run for the price of a small VPS.

Which self-hosted status page tool should you use?

Several open-source options exist, and they land in different places on maintenance burden and features.

  • Cachet needs about 512MB of RAM and has no built-in private pages.
  • Upptime and cState are static, GitHub-hosted, and also lack private-page auth.
  • Gatus is remarkably light, running in as little as 64MB of RAM as a single Go binary, but it's monitoring-first with a thinner status UI.6
  • OneUptime is the outlier: a full platform with SSO-gated private status pages, but it recommends at least 4GB of RAM, overkill for tracking a handful of internal tools.6
  • Uptime Kuma sits in the middle and is the default pick for most teams. It has 90,700 GitHub stars and 8,300 forks, the most widely adopted tool in this category.7 It supports HTTP(s), TCP, DNS, ping, Docker container, and push-based monitoring, with checks as frequent as every 20 seconds and over 90 notification integrations.7 It doesn't ship per-user authenticated private pages out of the box, but for an internal tool, network-level privacy solves that problem more simply anyway (more on that below).

Step 1: Provision a small VPS or internal server

Uptime Kuma doesn't need much. A 1 vCPU, 1GB RAM VPS handles most small setups.8 It runs fine on a homelab box, a spare internal server, or the cheapest tier of any cloud provider. Keep it separate from the infrastructure hosting the tools you're monitoring. More on why in the last step.

Figure 2
Statuspage add-on costs stack up fast
Custom HTML/JS (Business)$399SSO add-on$100Custom CSS (Startup)$99.00Private pages add-on$70.00Base (Hobby)$29.00
Source: Hund.io

Step 2: Deploy with Docker Compose

The official repo ships a straightforward Docker setup. The simplest path is one command:

docker run -d --restart=always -p 3001:3001 -v uptime-kuma:/app/data --name uptime-kuma louislam/uptime-kuma:2

This exposes the dashboard on port 3001.7 If you don't want it reachable outside the host yet, bind it to localhost instead:

docker run -d --restart=always -p 127.0.0.1:3001:3001 -v uptime-kuma:/app/data --name uptime-kuma louislam/uptime-kuma:2

That's the maintainers' own recommendation for limiting exposure before you've set up a proxy.7 For a production-style setup, pair a Docker Compose file with Nginx and Certbot. Third-party install guides document the pattern step by step.8

Figure 3
Minimum RAM required by self-hosted tool
OneUptime4,096Cachet512Gatus64Upptime / cState0

Step 3: Put it behind a reverse proxy with HTTPS

Uptime Kuma runs over WebSocket. Any reverse proxy in front of it, whether Nginx, Caddy, Traefik, HAProxy, or Nginx Proxy Manager, must forward the Upgrade and Connection headers or the dashboard and status page will fail to load correctly.9 This trips up more setups than it should. If your page loads but never updates, check those headers first.

One limitation worth planning around: Uptime Kuma can't serve a status page from a subdirectory like example.com/status. It needs a dedicated domain or subdomain.9 Budget for something like status.internal.yourcompany.com from the start.

How do you keep a self-hosted status page private?

Uptime Kuma doesn't offer per-user authenticated private status pages, and neither do the lighter alternatives (Cachet, Upptime, Gatus, cState).6 Only full platforms like OneUptime bake SSO into the status page itself.6

That's fine for an internal tool, because the right way to keep it private isn't app-level auth. It's network-level restriction:

Figure 4
Realistic startup-scale cost with monitoring added
$249/mo
Statuspage + Pingdom + Opsgenie, combined monthly cost
Source: OneUptime
  • VPN or Tailscale, so the page is only reachable from devices already on your private network.
  • Internal DNS, so the subdomain simply doesn't resolve outside your network.
  • Cloudflare Tunnel plus Access, which puts an identity check in front of the tunnel without touching Uptime Kuma's own auth.
  • Firewall rules on the VPS, allowing traffic only from known office or VPN IP ranges.

Any of these gets you a genuinely private page without waiting on app-level SSO that doesn't exist yet in the lighter tools.

Step 5: Add your internal tools as monitors

Once the dashboard is reachable, add a monitor for each internal service: your admin panel over HTTP, an internal API over TCP, a Docker container running a self-built agent, or a DNS record for a service that shouldn't ever resolve to the wrong host. Uptime Kuma supports all of these natively, plus push-based checks for services that report in themselves.7 Set check intervals based on how fast you need to know: a customer-facing internal tool might warrant checks every 20-30 seconds, while a batch job's health check can run every few minutes.

Step 6: Configure alerts and the public-facing status page

Wire up notifications so the right people hear about a problem before someone pings them on Slack asking why a dashboard is broken. Uptime Kuma's notification list covers Slack, email, Telegram, and over 90 other integrations.7 Then publish a status page grouped by tool or team, so a non-engineer can glance at it and know whether the CRM sync or the internal reporting service is the one that's down.

Step 7: Plan for the status page's own downtime

There's an obvious irony in a monitoring tool that goes down along with everything it's watching. A few habits prevent that:

Figure 5
Self-hosted status page tools compared
Self-hosted status page tools compared
Minimum resourcesPrivate status pagesMaintenance burdenMonitoring features
Cachetteams wanting a classic status page UI512MB RAMNoMediumLow
Gatusextremely light, monitoring-first setups64MB RAMNoLowMedium
RecommendedUptime Kumamost internal teams monitoring a handful of tools~1GB RAM VPSNoLowHigh
OneUptimeteams needing SSO-gated private pages and full platform features4GB RAMYesHighHigh
Ratings are relative across these options, not absolute. Grounded in s1, s5.
  1. Host it separately. Run the status page on different infrastructure from the tools it's monitoring, so one outage doesn't take both down together.
  2. Back up the data volume. Uptime Kuma stores its state in SQLite. Back that volume up on a schedule, not just when you remember.
  3. Keep it updated. Self-hosting means you own patching, so put Uptime Kuma version bumps on the same cadence as your other internal infrastructure.

This is the same discipline that applies to any self-hosted tool an internal team leans on, whether it's a monitoring dashboard or an AI agent workflow built in-house. If you're already tracking a growing list of self-built internal services, a tool like Remy can help you keep an inventory of what exists before you even get to monitoring it.

When should you move beyond a single self-hosted status page?

A single Uptime Kuma instance covers most internal-tool monitoring needs indefinitely. Move to something heavier when:

  • You need external customer subscribers, not just an internal team, and want automated subscriber notifications rather than a shared internal link.
  • Compliance or SSO requirements mean you need audited, per-user access control on the status page itself, which only full platforms like OneUptime currently support out of the box.6
  • You need postmortem workflows, incident timelines, and structured retrospectives built into the same tool, rather than tracked separately in docs.
  • Your team has outgrown VPN-based access control and needs finer-grained, app-level permissions than network isolation can provide.

Until one of those is true, the math stays lopsided: a $5 VPS and an afternoon of setup buys the same "is it up" clarity as a $29-$1,499/month SaaS tool, plus ownership of your own data and auth model instead of renting someone else's.18

Frequently asked
Questions readers ask
Is Uptime Kuma really free to self-host?

Yes. Uptime Kuma is open source and free to run; your only cost is the server it runs on, typically a $5-$6/month VPS with 1 vCPU and 1GB RAM.87

Can I make an Uptime Kuma status page truly private?

Uptime Kuma doesn't have per-user authenticated private pages built in, so privacy comes from network-level restriction instead: a VPN, Tailscale, internal DNS, firewall rules, or Cloudflare Tunnel and Access in front of the page.69

Why does my Uptime Kuma dashboard load but not update?

This is almost always a reverse proxy misconfiguration. Uptime Kuma runs over WebSocket, and your proxy needs to explicitly forward the Upgrade and Connection headers or live updates will fail silently.9

Can I host a self-hosted status page at a URL like example.com/status?

Not with Uptime Kuma. It requires a dedicated domain or subdomain and doesn't support subdirectory hosting, so plan for something like status.internal.yourcompany.com.9

When does a paid status page SaaS make more sense than self-hosting?

When you need external customer subscriber notifications, compliance-grade SSO on the status page itself, or built-in postmortem workflows, a full platform or SaaS tool starts to earn its cost over a lightweight self-hosted setup.61

Sources
  1. 1Statuspage Pricing: Find the Right Plan for YouAtlassian
  2. 2Shadow AI Statistics: Key Data Points Every CISO Needs in 2026Airia
  3. 3Hund.io vs. Atlassian StatuspageHund.io
  4. 4The Open-Source Atlassian Statuspage AlternativeOneUptime
  5. 5The status page problem: why does the market leader charge $399/month for a page you update manually?Reddit r/SaaS
  6. 6Self-Hosted Status Pages Compared: Cachet, Upptime, Gatus, cState, and OneUptimeOneUptime Blog
  7. 7louislam/uptime-kuma: A fancy self-hosted monitoring toolGitHub
  8. 8How to Install Uptime Kuma on a VPS with HTTPS, Notifications, and a Public Status PagePerLod
  9. 9Reverse Proxy · louislam/uptime-kuma WikiGitHub Wiki
Portrait of Marcus Bello
Marcus Bello
Build vs Buy
Marcus writes about when teams should build their own tools instead of buying.
More from Marcus Bello
© 2026 The Official Remy BlogDrafted by AI authors, reviewed by human editors.