On Debian 13:
sudo apt update
sudo apt install -y docker.io docker-compose
sudo systemctl enable --now docker
On RHEL 10:
sudo dnf install -y docker docker-compose
sudo systemctl enable --now docker
Using Uptime Kuma (popular status page solution):
docker run -d \
--name status-page \
--restart unless-stopped \
-p 3001:3001 \
-v status-data:/app/data \
louislam/uptime-kuma:1
Create persistent volume:
docker volume create status-data
Create docker-compose.yml:
version: '3'
services:
status-page:
image: louislam/uptime-kuma:1
container_name: status-page
restart: unless-stopped
ports:
- "3001:3001"
volumes:
- status-data:/app/data
volumes:
status-data:
Start with:
docker-compose up -d
On Debian 13:
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt install -y nodejs
On RHEL 10:
curl -fsSL https://rpm.nodesource.com/setup_20.x | sudo -E bash -
sudo dnf install -y nodejs
cd /opt
git clone https://github.com/louislam/uptime-kuma.git
cd uptime-kuma
npm install
npm run build
sudo tee /etc/systemd/system/status-page.service >/dev/null <<'EOF'
[Unit]
Description=Status Page Monitor
After=network.target
[Service]
Type=simple
User=root
WorkingDirectory=/opt/uptime-kuma
ExecStart=/usr/bin/node /opt/uptime-kuma/server/server.js
Restart=on-failure
Environment=NODE_ENV=production
[Install]
WantedBy=multi-user.target
EOF
Enable and start:
sudo systemctl daemon-reload
sudo systemctl enable --now status-page
docker run -d \
--name cachet \
--restart unless-stopped \
-p 8000:8000 \
-e DB_DRIVER=sqlite \
-e APP_DEBUG=false \
cachethq/cachet:2.4
docker run -d \
--name statping \
--restart unless-stopped \
-p 8080:8080 \
-v statping-data:/app \
statping/statping:latest
Create Nginx configuration:
sudo tee /etc/nginx/sites-available/status >/dev/null <<'EOF'
server {
listen 80;
server_name status.example.com;
location / {
proxy_pass http://127.0.0.1:3001;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
EOF
On Debian 13:
sudo ln -s /etc/nginx/sites-available/status /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl restart nginx
On RHEL 10:
sudo ln -s /etc/nginx/sites-available/status /etc/nginx/conf.d/status.conf
sudo nginx -t
sudo systemctl restart nginx
On UFW:
sudo ufw allow 3001/tcp
sudo ufw allow 80/tcp
On firewalld:
sudo firewall-cmd --permanent --add-port=3001/tcp
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --reload
Open http://SERVER_IP:3001 to access the status page setup.
For first-time setup:
Supported notification channels:
Configure in Settings > Notifications.
When a monitor fails:
Status page solutions typically provide REST APIs:
# Get monitor status (Uptime Kuma)
curl -X GET http://localhost:3001/api/status
# Get heartbeat data
curl -X GET http://localhost:3001/api/push/monitor-id
Use Let’s Encrypt:
sudo apt install -y certbot python3-certbot-nginx # Debian
sudo dnf install -y certbot python3-certbot-nginx # RHEL
sudo certbot --nginx -d status.example.com
Setting up monitoring systems can be complex. We offer consulting services for:
Contact us at office@linux-server-admin.com or visit our contact page.
Prefer automation? See Status Page Ansible Setup for an example playbook.
Prefer containers? See Status Page Docker Setup.
See Status Page Configuration for configuration guidance.
See Status Page Security for hardening guidance.