# Uptime Kuma status and monitoring

Source: https://docs.quake.ai/resources/iac-templates/uptime-kuma
Markdown: https://docs.quake.ai/resources/iac-templates/uptime-kuma.md

---

# Uptime Kuma status and monitoring

This pattern composes Compute, Network, and Block Storage into a self-hosted uptime-monitoring and status-page host you run on infrastructure you control.

## What this template does

Provisions a single instance running [Uptime Kuma](https://github.com/louislam/uptime-kuma), an open-source uptime-monitoring tool (a self-hosted alternative to Statuspage, Pingdom, or Better Uptime). You add monitors that poll your services on a schedule, configure notifications, and publish public status pages:

- Compute instance that runs Uptime Kuma in Docker, sized for its single SQLite-backed container (2 vCPU and 2 GiB RAM)
- Private network, subnet, router, port, and security group; a floating IP for public access
- A block volume mounted at `/var/lib/docker`, so the Uptime Kuma data (the SQLite database of monitors, check history, and status pages) lives on a volume you can grow rather than on the boot disk
- cloud-init installs Docker Engine and starts Uptime Kuma from a compose file on first boot

Uptime Kuma watches the services you deploy: it polls HTTP endpoints, TCP ports, and pings, alerts you when a check fails, and exposes a public status page for your users.

No credential ships with this template. You set the admin account the first time you open the dashboard.

## Parameters

| Parameter | Description | Default |
| --- | --- | --- |
| `key_name` | SSH keypair name (must already exist) | No default |
| `flavor_name` | Instance size (Uptime Kuma runs on 2 vCPU / 2 GiB) | `s1a.small` |
| `image_name` | Operating system image | `Ubuntu-24.04` |
| `app_name` | Display name prefix for resources | `uptime-kuma` |
| `volume_size` | Block volume size in GiB, mounted at `/var/lib/docker` | `10` |
| `external_network` | External network for floating IP allocation | `PublicStatic` |
| `private_cidr` | CIDR for the private subnet | `10.42.0.0/24` |
| `dashboard_allowed_cidr` | CIDR allowed to reach the dashboard on port 3001 | `10.42.0.0/24` |

## Dashboard access and security

The dashboard listens on port 3001 over plain HTTP. The security group restricts 3001 to `dashboard_allowed_cidr`, which defaults to the private network only, so the raw dashboard stays off the public internet. Uptime Kuma sets the admin account on first visit. Reach the dashboard one of three ways:

- Put a reverse proxy (Caddy or Nginx) in front of Uptime Kuma and serve the dashboard over HTTPS on 443. Point the domain's DNS A record at the floating IP. This is the recommended path for routine access.
- Tunnel over SSH: `ssh -L 3001:localhost:3001 user@FLOATING_IP`, then open `http://localhost:3001`.
- Set `dashboard_allowed_cidr` to `YOUR_IP/32` to reach port 3001 directly from one address.

Ports 80 and 443 stay open for the reverse proxy you put in front; they carry no traffic until you add one.

## Status pages and the admin dashboard

Uptime Kuma serves two surfaces from the same app:

- The **admin dashboard** configures monitors, notifications, and status pages. Keep it restricted.
- A **public status page** lives at `/status/SLUG`, where you set `SLUG` in the dashboard. Status pages are meant to be public, so expose them deliberately through the reverse proxy on 443. A status page shows only the monitors you add to it.


Run this monitoring host in a different region from the workloads it watches. A single instance shares a failure domain with anything else you run in the same region, so a region-wide problem would take down both the service and the monitor watching it.


## When to use this pattern

Watch HTTP endpoints, TCP ports, and pings for the apps you run, alert on failures through email, webhook, or chat, and give your users a public status page. Uptime Kuma pairs with the [monitoring stack](/resources/iac-templates/monitoring-stack) (Prometheus and Grafana) for infrastructure metrics and with [self-hosted analytics](/resources/iac-templates/analytics-umami) for product usage.

## Estimated cost

<PricingCompanion
  components={[
    { kind: "template", slug: "uptime-kuma", required: true },
  ]}
/>

## Template source

<TemplateSource slug="uptime-kuma" />

<TemplateResourceMap template="uptime-kuma" format="opentofu" />

## Customize this pattern

- [Customize a template's image and flavor](/docs/automation/how-to/customize-template-image-flavor)
- [Add a block volume to a template](/docs/automation/how-to/add-volume-to-template)
- [Parameterize a template with a tfvars file](/docs/automation/how-to/parameterize-template-tfvars)

## See also

- [Monitoring stack](/resources/iac-templates/monitoring-stack)
- [Self-hosted analytics (Umami)](/resources/iac-templates/analytics-umami)
