TutorialsAugust 4, 20265 min read

How to Self-Host a Status Page for Your Services

Give users a public status page that shows what's up, what's down and why. Build one for free with Uptime Kuma on a VPS.

NBy Nxeon

A public status page builds trust: when something breaks, users check one URL instead of flooding your inbox, and you communicate clearly. You don't need a paid service — Uptime Kuma, which you may already run for monitoring, includes a polished public status page feature. This guide builds one on a VPS and gets it on a clean domain.

What a good status page shows

  • Live status of each service (operational, degraded, down).
  • Uptime history so users can see your track record.
  • Incident notices you post during and after outages.

Uptime Kuma covers all three. If you haven't set it up yet, start with how to self-host Uptime Kuma for monitoring and come back — the monitors you create there feed straight into the status page.

Prerequisites

  • A VPS with Docker installed — run Docker on a VPS.
  • A domain with an A record, e.g. status.example.com.

Deploy Uptime Kuma

mkdir -p ~/status && cd ~/status
services:
  uptime-kuma:
    image: louislam/uptime-kuma:1
    container_name: uptime-kuma
    restart: unless-stopped
    volumes:
      - ./data:/app/data
    ports:
      - "3001:3001"
docker compose up -d

Open http://your-server-ip:3001, create your admin account, and add a monitor for each service you want to display.

Build the public status page

In Uptime Kuma, go to your profile menu and choose Status Pages → New Status Page. Give it a name and slug, then:

  1. Add the monitors you want to show publicly.
  2. Group them (e.g. "Website", "API", "Email").
  3. Set a title, logo and description.
  4. Publish.
Deploying a new server with the Nxeon one-click deploy wizard
Deploying a new server with the Nxeon one-click deploy wizard

Put it on a clean domain with HTTPS

You want the status page on status.example.com, not a raw IP and port. Front it with Caddy for automatic TLS:

status.example.com {
    reverse_proxy 127.0.0.1:3001
}

Then restrict the firewall to web and SSH:

sudo ufw allow OpenSSH
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable

Point the DNS record at your VPS as covered in how to point a domain to your VPS.

Post incidents

When something breaks, open the status page editor and post an incident with a short, honest message and a severity. Update it as you investigate and resolve. Users appreciate transparency far more than silence — and a clear incident history makes you look professional.

Host the status page separately

One important design point: if your status page runs on the same server as the services it monitors, an outage can take the status page down too. For anything you care about, run the status page on a separate small VPS so it stays online to report bad news. It's the one service you never want sharing fate with the rest.

Group services and set expectations

A status page is a communication tool, so structure it for readers, not for you. Group monitors into categories that match how users think — "Website", "API", "Dashboard", "Email" — so a visitor instantly sees whether the part they care about is affected. Give each monitor a friendly display name rather than a raw hostname.

Plan for maintenance windows: before scheduled work, mark the affected services as under maintenance so users know the downtime is intentional and you aren't paged for it. When something breaks unexpectedly, post an incident quickly with a short, honest description and a severity, then update it as you learn more and again when it's resolved. A tidy incident history is one of the best trust signals you can offer.

Custom domain and branding

Make the page feel like part of your service. In the status page editor set a title, upload a logo, add a description and pick a theme, then serve it from a dedicated subdomain like status.example.com over HTTPS. Point the DNS at the small, separate VPS that hosts it — see how to point a domain to your VPS — so the page keeps loading even when your main infrastructure is having a bad day.

Notifications and keeping people informed

A status page is passive — people have to visit it — so pair it with active notifications for the moments that matter. In Uptime Kuma, attach notification channels (email, Discord, Telegram, Slack, ntfy and more) to your monitors so your team hears about an outage the instant it's detected, before customers do. Post a matching incident on the public page and you've closed the loop: internal alert, public transparency, and a written record.

A few habits make a status page trustworthy rather than decorative:

  • Update incidents in real time, even a short "still investigating" — silence reads as neglect.
  • Write a brief post-mortem when something significant breaks; users respect honesty about what happened and what you changed.
  • Keep monitor names user-friendly so a non-technical visitor understands what's affected.

Done well, a status page turns your worst moments into trust-building ones. It costs almost nothing to run — a small VPS and a domain — and it's one of the clearest signals that you take reliability seriously.

FAQ

Can I make a status page for free?

Yes. Uptime Kuma includes a public status page at no cost — you only pay for the small VPS it runs on.

Should the status page be on the same server?

No. Host it on a separate VPS so it stays up when your main infrastructure is down — otherwise it can't report the outage.

Can users subscribe to updates?

Uptime Kuma's status page shows live status and incident history. Pair it with its notification channels (email, Discord, Telegram) to push alerts as incidents happen.

Does it show uptime percentages?

Yes, each monitor displays uptime over recent periods and a status history bar, giving visitors an honest view of reliability.

Keep your status page independent on its own small affordable VPS — see the VPS plans to spin one up.

#status-page#uptime-kuma#monitoring#docker#self-hosting#seobatch

Deploy your first server in under a minute

Creating an account is free and takes no card details. You pay when you deploy — choose a billing term and pay from your wallet or by card at checkout.