Uptime Kuma is a self-hosted monitoring tool that provides a clean web interface for tracking the availability of HTTP endpoints, TCP ports, DNS records, and ping targets. On RHEL 8, you can deploy it quickly using Docker or run it directly with Node.js managed by PM2. This tutorial walks through both installation methods, configuring monitors, setting up notification channels, and publishing a public status page. By the end you will have a live dashboard showing real-time uptime data for your services.

Prerequisites

  • RHEL 8 server with a non-root sudo user
  • EPEL 8 repository enabled: dnf install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
  • Docker installed and running (for the Docker method) — see the Docker CE on RHEL 8 guide
  • Node.js 18+ and npm (for the Node.js method)
  • Port 3001 open in the firewall
  • Git installed: dnf install -y git

Step 1 — Open the Firewall Port

Before starting Uptime Kuma, allow inbound traffic on port 3001 so you can reach the web interface from a browser.

sudo firewall-cmd --permanent --add-port=3001/tcp
sudo firewall-cmd --reload
sudo firewall-cmd --list-ports

Confirm that 3001/tcp appears in the output before continuing.

Step 2 — Option A: Deploy Uptime Kuma with Docker

The Docker image is the fastest way to get Uptime Kuma running. The command below starts a detached container, maps port 3001, and mounts a named volume so your data persists across container restarts and upgrades.

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

sudo docker ps --filter name=uptime-kuma

To update later, stop and remove the container then pull a fresh image — the named volume preserves all configuration.

sudo docker stop uptime-kuma
sudo docker rm uptime-kuma
sudo docker pull louislam/uptime-kuma
sudo docker run -d --name uptime-kuma --restart=always 
  -p 3001:3001 -v uptime-kuma:/app/data louislam/uptime-kuma

Step 3 — Option B: Deploy with Node.js and PM2

If you prefer to avoid Docker, install Uptime Kuma directly on the host using Node.js and keep it running with PM2, the production process manager for Node applications.

# Install Node.js 18 via NodeSource
curl -fsSL https://rpm.nodesource.com/setup_18.x | sudo bash -
sudo dnf install -y nodejs

# Install PM2 globally
sudo npm install -g pm2

# Clone and set up Uptime Kuma
git clone https://github.com/louislam/uptime-kuma.git /opt/uptime-kuma
cd /opt/uptime-kuma
npm run setup

# Start with PM2 and enable autostart
pm2 start server/server.js --name uptime-kuma
pm2 startup systemd
pm2 save

Check that PM2 reports the process as online with pm2 list before proceeding.

Step 4 — Initial Setup and Adding Monitors

Open a browser and navigate to http://YOUR_SERVER_IP:3001. On the first visit you will be prompted to create an admin account. After logging in, click Add New Monitor to configure your first check.

  • HTTP(s) — enter the full URL; Uptime Kuma follows redirects and checks the HTTP status code.
  • TCP Port — specify the host and port number; useful for databases and non-HTTP services.
  • Ping — enter a hostname or IP address to monitor raw ICMP reachability.
  • DNS — resolve a hostname and compare against an expected value.

Set the Heartbeat Interval (default 60 seconds) and the Retries count before an alert fires. Click Save to activate the monitor immediately.

Step 5 — Configure Notification Channels

Uptime Kuma supports over 90 notification providers. Navigate to Settings → Notifications and click Setup Notification to add a channel.

  • Telegram — create a bot via BotFather, copy the token, and enter your chat ID.
  • Slack — create an Incoming Webhook in your Slack workspace and paste the URL.
  • Email (SMTP) — enter your SMTP host, port, credentials, and recipient address.

Use the Test button to verify delivery before assigning the notification to a monitor. Multiple notification channels can be attached to a single monitor.

Step 6 — Create a Public Status Page

Uptime Kuma can publish a branded status page that your users can check during incidents. Go to Status Page in the left sidebar and click New Status Page.

# Example: access your status page at a custom path
# After creating the page in the UI, it is available at:
http://YOUR_SERVER_IP:3001/status/YOUR_SLUG

# To serve behind a reverse proxy with Nginx:
sudo dnf install -y nginx
cat <<'EOF' | sudo tee /etc/nginx/conf.d/uptime-kuma.conf
server {
    listen 80;
    server_name status.example.com;
    location / {
        proxy_pass         http://127.0.0.1:3001;
        proxy_http_version 1.1;
        proxy_set_header   Upgrade $http_upgrade;
        proxy_set_header   Connection "upgrade";
        proxy_set_header   Host $host;
    }
}
EOF
sudo systemctl enable --now nginx

Add monitors to the status page by toggling them in the Edit view of the page. Subscribers can opt in to email notifications for status changes directly from the public page.

Conclusion

You now have Uptime Kuma running on RHEL 8, continuously polling your services and alerting you the moment something goes offline. The Docker deployment makes upgrades simple and keeps application data isolated in a named volume, while the Node.js method gives you direct access to the codebase on the host. With notification channels configured and a public status page published, your team and users have full visibility into service availability without relying on any third-party SaaS monitoring platform.

Next steps: How to Use Prometheus Blackbox Exporter for Endpoint Monitoring on RHEL 8, How to Build Grafana Dashboards for Linux Server Metrics on RHEL 8, and How to Install and Configure cAdvisor for Container Monitoring on RHEL 8.