---
title: "How To Install Uptime Kuma Self Hosted Monitoring Tool"
description: "Install Uptime Kuma on a VPS with Docker and Nginx to monitor your websites uptime, SSL, domain expiry, and response time for free."
date: 2026-02-26
categories: ["hosting"]
tags: ["docker","self-hosted"]
---

import { Picture } from "astro:assets";
import YouTubeEmbed from "../../layouts/components/widgets/YouTubeEmbed.astro";
import img1 from "../../assets/images/wordpress/01-uptime-kuma-monitor-1024x755.webp";
import img2 from "../../assets/images/wordpress/02-uptime-kuma-smtp-setup-1024x759.webp";
import img3 from "../../assets/images/wordpress/03-uptime-kuma-status-1024x730.webp";
import img4 from "../../assets/images/wordpress/04-uptime-kuma-emails--1024x78.webp";

If you want to monitor your website's uptime on your own VPS, [Uptime Kuma](https://github.com/louislam/uptime-kuma) is the tool I keep coming back to. It sends alerts via email, Slack, Discord, Telegram, and a bunch of other channels when something goes down, and it keeps a history of response times so you can spot what's been slow.

The project is open source and has had major updates recently. Version 2.0 (October 2025) added MariaDB support for larger deployments, rootless Docker images for better security, and a refreshed UI. Version 2.1 (February 2026) added Globalping support for checks from worldwide probes, domain expiry monitoring, and new notification integrations like Jira Service Management and Google Sheets.

This guide walks through installing Uptime Kuma using Docker Compose with Nginx as a reverse proxy and a Let's Encrypt SSL certificate.

<YouTubeEmbed
  url="https://www.youtube.com/embed/5k8y0JZBlWs"
  label="How To Install Uptime Kuma Self Hosted Monitoring Tool"
/>

## 1. Provision a VPS Server

You need a VPS to run this. I use:


<Button link="https://go.bitdoze.com/hetzner" text="Hetzner VPS" />
<Button link="https://go.bitdoze.com/hostinger-vps" text="Hostinger VPS" />
<Button link="https://go.bitdoze.com/do" text="DigitalOcean $100 Free" />
<Button link="https://go.bitdoze.com/vultr" text="Vultr $100 Free" />


Uptime Kuma is lightweight. A 1 vCPU / 1 GB RAM server is enough to run it alongside other containers without problems.

## 2. Install Uptime Kuma on Ubuntu

### 2.1 Update the system and install Nginx

```bash
sudo apt update && sudo apt upgrade -y
sudo reboot
sudo apt install nginx git -y
```

### 2.2 Install Docker and Docker Compose

Follow the [official Docker install guide](https://docs.docker.com/engine/install/ubuntu/) or run:

```bash
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin -y
```

> **Note:** The current recommended way is the `docker-compose-plugin` (v2). Use `docker compose` (no hyphen) going forward.

### 2.3 Create directories and write a compose file

```bash
mkdir -p /docker-vol/uptime-kuma
mkdir -p /opt/uptime-kuma
cd /opt/uptime-kuma
```

Create `docker-compose.yml`:

```yaml
services:
  uptime-kuma:
    image: louislam/uptime-kuma:2
    container_name: uptime-kuma
    volumes:
      - /docker-vol/uptime-kuma:/app/data
    ports:
      - 8001:3001
    restart: unless-stopped
    security_opt:
      - no-new-privileges:true
```

> **Tip:** Use `louislam/uptime-kuma:2` instead of `:latest` to stay on the v2 branch and avoid unexpected breaking changes when v3 eventually releases. Version 2.0+ also has rootless Docker images (`louislam/uptime-kuma:2-rootless`) if you want to run without root privileges.

Start the container:

```bash
docker compose up -d
```

### 2.4 Open the firewall for Nginx

```bash
sudo ufw allow "Nginx Full"
```

### 2.5 Configure Nginx as a reverse proxy

Create `/etc/nginx/sites-available/uptime-kuma.conf` and paste:

```nginx
server {
    listen 80;
    server_name your_domain_here;

    location / {
        proxy_pass         http://localhost:8001;
        proxy_http_version 1.1;
        proxy_set_header   Upgrade $http_upgrade;
        proxy_set_header   Connection "upgrade";
        proxy_set_header   Host $host;
    }
}
```

Enable the site and reload Nginx:

```bash
sudo ln -s /etc/nginx/sites-available/uptime-kuma.conf /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
```

## 3. Point Your Domain to the Server

Log in to your DNS provider and add an **A record** pointing your domain or subdomain to the VPS IP address.

## 4. Add an SSL Certificate with Let's Encrypt

Install Certbot and generate a certificate:

```bash
sudo apt install certbot python3-certbot-nginx -y
sudo certbot --nginx -d your_domain_here
```

Certbot patches the Nginx config automatically and sets up auto-renewal. Your site will be available over HTTPS right away.

## 5. Set Up Your First Monitor

On first login you create an admin account. Then add a monitor — set the type to HTTP(s), give it a friendly name, and set the heartbeat interval to 300 seconds. Checking every 5 minutes is enough for most sites.

<Picture src={img1} alt="Uptime Kuma add monitor screen" />

### Configure email notifications

Go to Settings → Notifications and add an SMTP notification. For Gmail: hostname `smtp.gmail.com`, port `587`, security STARTTLS, and your Gmail credentials. If you have 2FA on your account, generate an App Password instead of using your main password.

<Picture src={img2} alt="Uptime Kuma SMTP notification setup" />

Once configured, the dashboard shows a green heartbeat for every healthy monitor:

<Picture src={img3} alt="Uptime Kuma dashboard showing all monitors up" />

When something goes down you receive an alert email, and another one when it recovers:

<Picture src={img4} alt="Uptime Kuma downtime notification email" />

## What's new in version 2.x

If you're upgrading from v1, here's what changed:

- **MariaDB support** -- You can now use MariaDB instead of the default SQLite for larger deployments with hundreds of monitors. SQLite still works fine for most setups.
- **Domain expiry monitoring** -- Checks RDAP data and alerts you before domains expire. Useful if you manage multiple domains.
- **Globalping integration** -- Run checks from probes around the world instead of just your VPS location. Helpful for confirming whether an outage is regional or global.
- **Rootless Docker** -- The `2-rootless` image runs without root privileges, which is better security practice for shared servers.
- **New notification providers** -- Jira Service Management, Google Sheets, Brevo, Nextcloud Talk, and several others.
- **SNMPv3 support** -- Monitor network devices and infrastructure.
- **Incident history** -- Track and document past incidents within the dashboard.

The backup/restore feature from v1 was removed in v2, so back up the `/app/data` volume manually before upgrading.

## Conclusion

Uptime Kuma runs quietly in Docker, checks your sites, and messages you when something breaks. It handles SSL expiry, domain expiry, DNS, TCP ports, SNMP, and more. I've been running it for years without issues. Total cost on a shared VPS: basically nothing.