Monitoring beginner ⏱ 30 minutes

Uptime Kuma Advanced: Notifications and Status Pages

Advanced Uptime Kuma with custom notifications. Status pages and monitoring groups.

By homelabbing.io • 2025-12-17
#uptime-kuma#monitoring#notifications#status-page#docker

Uptime Kuma is a beautiful, self-hosted monitoring tool that checks if your services are up and running. This comprehensive guide covers advanced configurations, notification integrations, status pages, and best practices for production homelab monitoring.

What You’ll Learn

  • Advanced monitoring configurations (HTTP, TCP, DNS, Ping, Docker, Kubernetes)
  • Setting up 20+ notification channels (Discord, Slack, Telegram, Gotify, Pushover)
  • Creating public and private status pages
  • API integration and automation
  • Multi-user management and access control
  • Backup strategies and high availability
  • Performance tuning for low-resource systems
  • Integration with other monitoring tools

Prerequisites

  • Docker and Docker Compose installed
  • Basic understanding of HTTP protocols
  • Services to monitor
  • Notification platform accounts (Discord, Slack, etc.)

Why Uptime Kuma?

Advantages Over Alternatives

vs UptimeRobot:

  • Self-hosted (full control over data)
  • No monitor limits
  • Beautiful, modern UI
  • More notification channels
  • Status page included

vs Pingdom:

  • Free and open source
  • No subscription costs
  • Unlimited monitors
  • Docker container support
  • Flexible notification routing

vs Healthchecks.io:

  • Easier setup for HTTP monitoring
  • Built-in status pages
  • Visual dashboard
  • More notification providers
  • Better for service availability monitoring

Key Features

  • 30+ notification channels: Discord, Slack, Telegram, email, SMS, and more
  • Beautiful UI: Modern, responsive interface
  • Status pages: Public and private status pages
  • Multi-protocol: HTTP, HTTPS, TCP, Ping, DNS, Docker, Kubernetes
  • Flexible monitoring: Keywords, status codes, response times
  • Certificate monitoring: SSL expiry warnings
  • Multi-user: Team collaboration with role-based access
  • Mobile-friendly: Works great on phones and tablets
  • Low resource usage: Runs on Raspberry Pi

Complete Docker Compose Setup

Create a production-ready Uptime Kuma installation with reverse proxy support.

docker-compose.yml

version: '3.8'

services:
  uptime-kuma:
    image: louislam/uptime-kuma:latest
    container_name: uptime-kuma
    restart: unless-stopped
    ports:
      - "3001:3001"
    volumes:
      - uptime-kuma-data:/app/data
      - /var/run/docker.sock:/var/run/docker.sock:ro  # For Docker monitoring
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=America/New_York
    labels:
      - "com.centurylinklabs.watchtower.enable=true"
    networks:
      - monitoring
    healthcheck:
      test: ["CMD", "node", "/app/extra/healthcheck.js"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 60s

  # Optional: Caddy reverse proxy with automatic HTTPS
  caddy:
    image: caddy:latest
    container_name: caddy-uptime-kuma
    restart: unless-stopped
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile
      - caddy-data:/data
      - caddy-config:/config
    networks:
      - monitoring
    depends_on:
      - uptime-kuma

volumes:
  uptime-kuma-data:
  caddy-data:
  caddy-config:

networks:
  monitoring:
    driver: bridge

Caddyfile for Reverse Proxy

Create ./Caddyfile:

status.yourdomain.com {
    reverse_proxy uptime-kuma:3001

    # Security headers
    header {
        Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
        X-Content-Type-Options "nosniff"
        X-Frame-Options "SAMEORIGIN"
        Referrer-Policy "no-referrer-when-downgrade"
    }

    # Rate limiting (optional)
    rate_limit {
        zone dynamic {
            key {remote_host}
            events 30
            window 1m
        }
    }
}

Deploy the stack:

docker-compose up -d
docker logs -f uptime-kuma

Access Uptime Kuma at http://YOUR-SERVER-IP:3001 or https://status.yourdomain.com.

Initial Setup and Configuration

First Login

  1. Navigate to Uptime Kuma URL
  2. Create admin account:
    • Username: admin
    • Password: Strong password with 12+ characters
  3. Save credentials securely

Dashboard Overview

The main dashboard shows:

  • Monitor list: All configured monitors with status
  • Status: Up (green), Down (red), Pending (orange)
  • Uptime percentage: 24h, 7d, 30d, 90d
  • Response time: Average latency
  • Certificate expiry: SSL certificate days remaining

General Settings

Navigate to Settings → General:

Language: English
Theme: Dark (or Auto)
Search Engine Visibility: Disabled (for private instances)
Primary Base URL: https://status.yourdomain.com
Server Timezone: Your timezone
Enable 2FA: Recommended for security

Advanced Monitor Types

HTTP/HTTPS Monitoring

Most common monitor type for web services.

Basic HTTP Monitor:

Monitor Type: HTTP(s)
Friendly Name: Personal Website
URL: https://example.com
Heartbeat Interval: 60 seconds
Retries: 2
Heartbeat Retry Interval: 20 seconds
Request Timeout: 48 seconds
Method: GET

Advanced HTTP with Authentication:

Monitor Type: HTTP(s)
Friendly Name: Admin Panel
URL: https://admin.example.com/health
Method: POST
Headers:
  Authorization: Bearer your-api-token
  Content-Type: application/json
Body:
  {
    "check": "health"
  }
Expected Status Codes: 200,201
Keyword (Up): "status":"healthy"
Keyword (Down): "error","maintenance"

API Endpoint Monitoring:

Monitor Type: HTTP(s) - JSON Query
Friendly Name: API Health Check
URL: https://api.example.com/v1/status
JSON Query: $.status
Expected Value: "operational"

TCP Port Monitoring

Check if specific ports are open and responding.

Database Port Check:

Monitor Type: TCP Port
Friendly Name: PostgreSQL Database
Hostname: postgres.local
Port: 5432
Heartbeat Interval: 30 seconds

SSH Server Check:

Monitor Type: TCP Port
Friendly Name: SSH Server
Hostname: YOUR-SERVER-IP
Port: 22
Heartbeat Interval: 60 seconds

Ping/ICMP Monitoring

Check network connectivity to hosts.

Basic Ping Monitor:

Monitor Type: Ping
Friendly Name: Router
Hostname: 192.168.1.1
Heartbeat Interval: 60 seconds
Packet Size: 56 bytes

DNS Monitoring

Verify DNS resolution is working correctly.

DNS Query Monitor:

Monitor Type: DNS
Friendly Name: DNS Resolution
Hostname: example.com
Resolver Server: 1.1.1.1
DNS Record Type: A
Expected IP: 93.184.216.34

Custom DNS Server Check:

Monitor Type: DNS
Friendly Name: Pi-hole DNS
Hostname: github.com
Resolver Server: YOUR-PIHOLE-IP
DNS Record Type: A
Port: 53

Docker Container Monitoring

Monitor Docker containers directly.

Container Health Check:

Monitor Type: Docker Container
Friendly Name: Nginx Container
Container Name/ID: nginx
Docker Daemon: /var/run/docker.sock
Docker Host: (leave empty for local)

Keyword Monitoring

Monitor for specific content on web pages.

Content Verification:

Monitor Type: HTTP(s) - Keyword
Friendly Name: Blog Homepage
URL: https://blog.example.com
Keyword: "Latest Posts"
Invert Keyword: No

Maintenance Detection:

Monitor Type: HTTP(s) - Keyword
Friendly Name: Service Status
URL: https://app.example.com
Keyword: "maintenance mode"
Invert Keyword: Yes (alert if maintenance keyword found)

Certificate Monitoring

Get alerts before SSL certificates expire.

Certificate Expiry Check:

Monitor Type: HTTP(s)
Friendly Name: Website SSL
URL: https://example.com
Ignore TLS/SSL Error: No
Certificate Expiry Notification: Enabled
Days Before Expiry (Warning): 14 days
Days Before Expiry (Critical): 7 days

Notification Channels Setup

Discord Notifications

Perfect for homelab community channels.

Setup Steps:

  1. Create Discord webhook:

    • Server Settings → Integrations → Webhooks
    • New Webhook → Choose channel → Copy webhook URL
  2. In Uptime Kuma:

    • Settings → Notifications → Add Notification
    • Notification Type: Discord
    • Friendly Name: Discord Homelab
    • Discord Webhook URL: https://discord.com/api/webhooks/YOUR-WEBHOOK-ID/YOUR-TOKEN
    • Bot Display Name: Uptime Kuma
    • Prefix Custom Message: No
    • Apply to all monitors: Yes (or select specific)

Custom Discord Message Template:

Notification Type: Discord
Message Format:
  Title: [STATUS] Monitor Name
  Description: Monitor is [UP/DOWN]
  Color: Green for up, Red for down
  Fields:
    - Response Time: XXms
    - Status Code: 200
    - Timestamp: ISO format

Slack Notifications

For team collaboration and alerts.

Setup Steps:

  1. Create Slack app:

    • Go to https://api.slack.com/apps
    • Create New App → From scratch
    • Choose workspace
    • Incoming Webhooks → Activate → Add New Webhook
    • Select channel → Copy webhook URL
  2. In Uptime Kuma:

    • Notification Type: Slack
    • Friendly Name: Slack Homelab
    • Webhook URL: https://hooks.slack.com/services/YOUR/WEBHOOK/URL
    • Username: Uptime Kuma
    • Icon Emoji: :robot_face:
    • Channel: #monitoring

Advanced Slack Configuration:

Notification Type: Slack
Webhook URL: Your webhook
Message Format:
  Channel Override: #critical-alerts (for important monitors)
  Username: Critical Monitor
  Icon: :rotating_light:
  Mention @channel: For critical alerts only

Telegram Notifications

Excellent for mobile push notifications.

Setup Steps:

  1. Create Telegram bot:

    - Message @BotFather on Telegram
    - Send: /newbot
    - Follow prompts to create bot
    - Save Bot Token
  2. Get Chat ID:

    - Message your bot
    - Visit: https://api.telegram.org/botYOUR-BOT-TOKEN/getUpdates
    - Find "chat":{"id":123456789}
  3. In Uptime Kuma:

    • Notification Type: Telegram
    • Bot Token: Your bot token
    • Chat ID: Your chat ID
    • Thread ID: (optional, for topic groups)
    • Send Silently: No

Telegram Group Notifications:

Notification Type: Telegram
Bot Token: Your bot token
Chat ID: -1001234567890 (group chat ID, starts with -100)
Notification Settings: All events

Email Notifications

SMTP email alerts for traditional notifications.

Gmail SMTP Setup:

  1. Enable 2-factor authentication
  2. Create App Password:
    • Google Account → Security → 2-Step Verification
    • App passwords → Generate
  3. Configure in Uptime Kuma:
Notification Type: Email (SMTP)
Friendly Name: Gmail Alerts
SMTP Host: smtp.gmail.com
SMTP Port: 587
SMTP Security: TLS
SMTP Username: your-[email protected]
SMTP Password: your-app-password (16 chars)
From Email: your-[email protected]
From Name: Uptime Kuma
To Email: [email protected]
Subject: [Uptime Kuma] {MONITOR_NAME} is {STATUS}

Custom Email Server:

Notification Type: Email (SMTP)
SMTP Host: mail.yourdomain.com
SMTP Port: 465
SMTP Security: SSL/TLS
Authentication: Yes
SMTP Username: [email protected]
SMTP Password: your-password
Custom Message: HTML supported

Gotify Notifications

Self-hosted push notification server.

Gotify Setup:

  1. Deploy Gotify:
gotify:
  image: gotify/server:latest
  ports:
    - "8080:80"
  volumes:
    - gotify-data:/app/data
  1. Create application token in Gotify UI

  2. Configure in Uptime Kuma:

Notification Type: Gotify
Server URL: http://YOUR-SERVER-IP:8080
Application Token: Your token
Priority: 5 (1-10, 10 is highest)

Pushover Notifications

Premium push notifications for iOS and Android.

Setup Steps:

  1. Sign up at https://pushover.net (one-time $5 fee)

  2. Get User Key from dashboard

  3. Create application, get API Token

  4. Configure in Uptime Kuma:

Notification Type: Pushover
User Key: Your user key
Application Token/API Key: Your API token
Device: (optional, specific device)
Message Priority: Normal
Sound: pushover (or other sounds)
Retry: 30 seconds (for emergency priority)
Expire: 3600 seconds (1 hour)

Ntfy Notifications

Simple, lightweight push notifications.

Ntfy Setup:

  1. Use public instance or self-host:
ntfy:
  image: binwiederhier/ntfy:latest
  ports:
    - "8081:80"
  volumes:
    - ntfy-data:/var/cache/ntfy
  1. Configure in Uptime Kuma:
Notification Type: Ntfy
Ntfy Server URL: https://ntfy.sh (or your instance)
Ntfy Topic: homelab-monitoring
Priority: Default
Icon: https://your-domain.com/icon.png

Webhook Notifications

Custom integrations with any service.

Generic Webhook:

Notification Type: Webhook
URL: https://your-webhook-endpoint.com/alert
Method: POST
Content Type: application/json
Headers:
  Authorization: Bearer your-api-token
  X-Custom-Header: value
Body:
  {
    "monitor": "{MONITOR_NAME}",
    "status": "{STATUS}",
    "url": "{MONITOR_URL}",
    "time": "{MONITOR_TIME}",
    "message": "{HEARTBEAT_MESSAGE}"
  }

Home Assistant Integration:

Notification Type: Webhook
URL: http://YOUR-HOME-ASSISTANT:8123/api/webhook/uptime_kuma_alert
Method: POST
Body:
  {
    "monitor": "{MONITOR_NAME}",
    "status": "{STATUS}",
    "timestamp": "{MONITOR_TIME}"
  }

Multiple Notification Channels

Configure different notifications for different monitors.

Strategy 1: Severity-Based Routing

  • Critical services: Discord + Telegram + Email
  • Important services: Slack + Telegram
  • Development services: Discord only

Strategy 2: Time-Based Routing

  • Business hours: Slack
  • After hours: Telegram + Pushover
  • Weekends: Email only

Strategy 3: Team-Based Routing

  • Infrastructure: Discord #infrastructure
  • Applications: Slack #app-alerts
  • Security: Telegram + Email

Status Pages

Create beautiful public or private status pages.

Creating Status Pages

Public Status Page:

  1. Navigate to Status Pages
  2. Click “Add New Status Page”
  3. Configure:
Title: Homelab Services Status
Slug: homelab-status (URL will be /status/homelab-status)
Description: Real-time status of homelab services
Theme: Dark
Published: Yes
Show Tags: Yes
Show Powered By: Yes (optional)
Google Analytics ID: (optional)
  1. Add monitors to page:
    • Drag monitors from left panel
    • Organize into groups
    • Set display order

Private Status Page:

Title: Internal Services
Slug: internal
Published: Yes
Password Protected: Yes
Password: SecurePassword123

Status Page Customization

Custom Domain:

Custom Domain: status.yourdomain.com

Configure DNS:

CNAME status.yourdomain.com → your-uptime-kuma-domain.com

Custom CSS:

Navigate to Status Page Settings → Custom CSS:

/* Custom branding */
.shadow-box {
    background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
}

/* Custom header */
.status-page-title {
    font-family: 'Helvetica Neue', sans-serif;
    font-weight: 700;
}

/* Monitor status colors */
.up {
    background-color: #10b981 !important;
}

.down {
    background-color: #ef4444 !important;
}

/* Hide footer */
.footer {
    display: none;
}

Status Page Groups:

Organize monitors into logical groups:

Group 1: Core Services
  - Website
  - API
  - Database

Group 2: Applications
  - Nextcloud
  - Gitea
  - Jellyfin

Group 3: Infrastructure
  - Router
  - NAS
  - Firewall

Incident Management

Create and manage incidents on status pages.

Creating Incident:

  1. Status Page → Incident
  2. Title: “Database Connectivity Issues”
  3. Content: “We’re experiencing connectivity issues with the database server.”
  4. Status: Investigating / Identified / Monitoring / Resolved
  5. Style: Danger / Warning / Info / Primary

Incident Update:

Add updates as situation evolves:

[10:00 AM] Issue identified - Database server unresponsive
[10:15 AM] Server restart initiated
[10:30 AM] Database back online, monitoring for stability
[11:00 AM] Resolved - All services operating normally

Multi-User Management

Configure team access with role-based permissions.

Creating Users

Settings → Security → Users → Add User:

Username: john.doe
Password: SecurePassword123
Role: Regular User
Disable Auth: No

User Roles

Administrator:

  • Full access to all features
  • Can manage users
  • Can modify all monitors
  • Can configure notifications

Regular User:

  • View all monitors
  • Create/edit own monitors
  • Cannot manage users
  • Cannot change global settings

Access Control

Per-Monitor Permissions:

Currently Uptime Kuma shares all monitors with all users. For isolation:

  1. Use separate instances for different teams
  2. Use tags for organization
  3. Use status pages with passwords for limited sharing

API Integration

Automate monitor management with the API.

Enable API Access

Settings → Security → Enable API Keys:

API Key Name: Automation
Key: auto-generated-key-here
Permissions: Read/Write

API Examples

Get All Monitors:

curl -X GET "http://YOUR-SERVER-IP:3001/api/monitors"   -H "Authorization: Bearer your-api-key"

Create Monitor:

curl -X POST "http://YOUR-SERVER-IP:3001/api/monitors"   -H "Authorization: Bearer your-api-key"   -H "Content-Type: application/json"   -d '{
    "type": "http",
    "name": "New Service",
    "url": "https://example.com",
    "interval": 60,
    "maxretries": 2,
    "notificationIDList": [1, 2]
  }'

Pause Monitor:

curl -X POST "http://YOUR-SERVER-IP:3001/api/monitors/123/pause"   -H "Authorization: Bearer your-api-key"

Resume Monitor:

curl -X POST "http://YOUR-SERVER-IP:3001/api/monitors/123/resume"   -H "Authorization: Bearer your-api-key"

Terraform Integration

Manage monitors as infrastructure as code:

resource "uptimekuma_monitor" "website" {
  name     = "Personal Website"
  type     = "http"
  url      = "https://example.com"
  interval = 60

  notifications = [
    uptimekuma_notification.discord.id,
    uptimekuma_notification.slack.id
  ]
}

resource "uptimekuma_notification" "discord" {
  name         = "Discord Alerts"
  type         = "discord"
  webhook_url  = var.discord_webhook_url
}

Backup and Restore

Protect your monitoring configuration.

Manual Backup

Settings → Backup:

  1. Click “Backup”
  2. Download JSON file
  3. Store securely (version control recommended)

Automated Backup Script:

#!/bin/bash

UPTIME_KUMA_CONTAINER="uptime-kuma"
BACKUP_DIR="/backups/uptime-kuma"
DATE=$(date +%Y%m%d-%H%M%S)

# Create backup directory
mkdir -p "$BACKUP_DIR"

# Export data directory
docker cp "$UPTIME_KUMA_CONTAINER:/app/data" "$BACKUP_DIR/data-$DATE"

# Compress backup
tar -czf "$BACKUP_DIR/uptime-kuma-backup-$DATE.tar.gz" -C "$BACKUP_DIR" "data-$DATE"

# Remove uncompressed backup
rm -rf "$BACKUP_DIR/data-$DATE"

# Keep only last 30 days of backups
find "$BACKUP_DIR" -name "uptime-kuma-backup-*.tar.gz" -mtime +30 -delete

echo "Backup completed: uptime-kuma-backup-$DATE.tar.gz"

Automated Backup with Cron:

# Add to crontab
0 2 * * * /usr/local/bin/backup-uptime-kuma.sh

Restore from Backup

# Stop container
docker stop uptime-kuma

# Extract backup
tar -xzf uptime-kuma-backup-20251217.tar.gz

# Restore data
docker cp data-20251217/. uptime-kuma:/app/data

# Start container
docker start uptime-kuma

Version Control Backups

Store backups in Git:

#!/bin/bash

BACKUP_DIR="/backups/uptime-kuma"
cd "$BACKUP_DIR"

# Initialize git repo if needed
if [ ! -d .git ]; then
    git init
    git remote add origin YOUR-GIT-REPO
fi

# Create backup
docker exec uptime-kuma node extra/backup.js

# Commit and push
git add backup.json
git commit -m "Automated backup $(date +%Y-%m-%d)"
git push -u origin main

Performance Optimization

Resource Configuration

For Low-Resource Systems (Raspberry Pi):

uptime-kuma:
  deploy:
    resources:
      limits:
        cpus: '0.5'
        memory: 256M
      reservations:
        cpus: '0.1'
        memory: 128M

Monitor Optimization:

  1. Increase intervals: Use 60s+ for non-critical monitors
  2. Reduce retries: Use 1-2 retries instead of 3
  3. Consolidate checks: Monitor gateway instead of every device
  4. Disable unused features: Turn off certificate checks if not needed

Database Maintenance

Uptime Kuma uses SQLite. Periodic maintenance:

# Enter container
docker exec -it uptime-kuma sh

# Navigate to data directory
cd /app/data

# Backup database
cp kuma.db kuma.db.backup

# Vacuum database to reclaim space
sqlite3 kuma.db "VACUUM;"

# Analyze for query optimization
sqlite3 kuma.db "ANALYZE;"

exit

Data Retention

Configure data retention to limit database growth:

Settings → Data Retention:

Keep heartbeat data for: 180 days
Keep notification logs for: 90 days
Keep event logs for: 30 days

Integration with Other Tools

Grafana Dashboard

Create Grafana dashboard using Uptime Kuma API.

Prometheus Exporter:

Use community exporter: https://github.com/lucasheld/uptime-kuma-exporter

uptime-kuma-exporter:
  image: lucasheld/uptime-kuma-exporter:latest
  environment:
    - UPTIME_KUMA_URL=http://uptime-kuma:3001
    - UPTIME_KUMA_USERNAME=admin
    - UPTIME_KUMA_PASSWORD=your-password
  ports:
    - "9101:9101"

Add to Prometheus:

scrape_configs:
  - job_name: 'uptime-kuma'
    static_configs:
      - targets: ['uptime-kuma-exporter:9101']

Home Assistant Integration

Monitor services and create automations.

Configuration.yaml:

sensor:
  - platform: rest
    name: Uptime Kuma Status
    resource: http://YOUR-SERVER-IP:3001/api/monitors
    headers:
      Authorization: Bearer your-api-key
    value_template: "{{ value_json | length }}"
    json_attributes_path: "$[0]"
    json_attributes:
      - name
      - active
      - type

Automation Example:

automation:
  - alias: "Alert when service down"
    trigger:
      - platform: webhook
        webhook_id: uptime_kuma_alert
    condition:
      - condition: template
        value_template: "{{ trigger.json.status == 'down' }}"
    action:
      - service: notify.mobile_app
        data:
          title: "Service Down"
          message: "{{ trigger.json.monitor }} is down!"

Troubleshooting

Monitor False Positives

Issue: Monitor reports down when service is up

Solutions:

  1. Increase timeout: Some services need more than 48s
  2. Add retries: Set to 2-3 retries with 20s interval
  3. Check keywords: Ensure keyword exists on page
  4. Verify SSL: Disable “Ignore TLS Error” for valid certs
  5. Check DNS: Ensure domain resolves correctly

Notification Not Received

Issue: Alerts not arriving

Solutions:

  1. Test notification: Settings → Notifications → Test
  2. Check webhook URL: Verify webhook is still valid
  3. Review logs: Check Docker logs for errors
  4. Verify network: Ensure outbound connections allowed
  5. Rate limits: Some services rate limit webhooks

High Resource Usage

Issue: Container using too much CPU/RAM

Solutions:

  1. Reduce monitor count: Consolidate monitors
  2. Increase intervals: Use 60s+ instead of 30s
  3. Clean database: Run VACUUM maintenance
  4. Reduce retention: Lower data retention period
  5. Check bad monitors: Disable monitors timing out

Database Corruption

Issue: kuma.db corrupted

Solutions:

# Stop container
docker stop uptime-kuma

# Restore from backup
docker cp backup/kuma.db uptime-kuma:/app/data/kuma.db

# Start container
docker start uptime-kuma

# If no backup, export and reimport
sqlite3 kuma.db ".dump" > backup.sql
rm kuma.db
sqlite3 kuma.db < backup.sql

Best Practices

Monitor Configuration

  1. Meaningful names: Use descriptive, consistent naming
  2. Appropriate intervals: 60s for most, 30s for critical, 300s for low priority
  3. Smart retries: Use 2-3 retries to avoid false positives
  4. Keyword validation: Always verify keywords actually exist
  5. Certificate monitoring: Enable for all HTTPS endpoints

Notification Strategy

  1. Avoid alert fatigue: Don’t send every alert to every channel
  2. Escalation paths: Critical → Immediate, Warning → Delayed
  3. Group by severity: Different channels for different priorities
  4. Test regularly: Verify notifications work before you need them
  5. Document runbooks: Include troubleshooting links in alerts

Security

  1. Strong passwords: 12+ characters, unique
  2. Enable 2FA: For admin accounts
  3. Use reverse proxy: Add rate limiting, SSL, authentication
  4. Regular backups: Automated daily backups
  5. Update regularly: Keep Uptime Kuma up to date
  6. Network isolation: Run in separate network segment
  7. Status page passwords: Protect sensitive status pages

Performance

  1. Optimize intervals: Don’t over-monitor
  2. Database maintenance: Monthly VACUUM operations
  3. Resource limits: Set appropriate Docker resource constraints
  4. Data retention: Keep only necessary historical data
  5. Monitor consolidation: Use parent/gateway checks when possible

Advanced Use Cases

Multi-Region Monitoring

Monitor from multiple geographic locations.

Architecture:

Region 1 (US East) → Uptime Kuma Instance 1
Region 2 (EU West) → Uptime Kuma Instance 2
Region 3 (Asia)    → Uptime Kuma Instance 3
                        ↓
            Aggregated Status Page

Implementation:

  1. Deploy Uptime Kuma in each region
  2. Configure same monitors in all instances
  3. Use Grafana or custom dashboard to aggregate
  4. Alert only when all regions report down

Maintenance Windows

Schedule maintenance to prevent false alerts.

Using Pauses:

# Pause monitor via API
curl -X POST "http://YOUR-SERVER-IP:3001/api/monitors/123/pause"   -H "Authorization: Bearer your-api-key"

# Resume after maintenance
curl -X POST "http://YOUR-SERVER-IP:3001/api/monitors/123/resume"   -H "Authorization: Bearer your-api-key"

Automated Maintenance Script:

#!/bin/bash

# Pause monitors
curl -X POST "http://YOUR-SERVER-IP:3001/api/monitors/pause-all"   -H "Authorization: Bearer your-api-key"

# Perform maintenance
echo "Performing maintenance..."
sleep 3600  # 1 hour maintenance

# Resume monitors
curl -X POST "http://YOUR-SERVER-IP:3001/api/monitors/resume-all"   -H "Authorization: Bearer your-api-key"

SLA Reporting

Calculate and report service level agreements.

Monitor Configuration:

Friendly Name: Production API
URL: https://api.production.com
Uptime Target: 99.9% (Three nines)

Monthly SLA Check:

# Calculate uptime percentage
# 99.9% = max 43 minutes downtime per month
# 99.99% = max 4.3 minutes downtime per month

Reporting:

Export uptime data and create monthly reports showing:

  • Actual uptime percentage
  • Total downtime minutes
  • Number of incidents
  • Mean time to recovery (MTTR)
  • SLA compliance status

Next Steps

  • Explore community plugins and extensions
  • Set up distributed monitoring across multiple locations
  • Integrate with incident management platforms
  • Create custom notification handlers
  • Build automated remediation scripts
  • Implement chaos engineering testing

Additional Resources


With Uptime Kuma properly configured, you’ll have comprehensive visibility into your homelab service availability, with intelligent alerting that notifies you through your preferred channels without overwhelming you with noise. Start with basic HTTP monitors and gradually expand to cover all critical services.