Tutorial

Membuat Status Page Self-Hosted: Uptime Kuma + Grafana Panduan Lengkap 2026

Membuat Status Page Self-Hosted: Uptime Kuma + Grafana Panduan Lengkap 2026

Kenapa Setiap Developer Butuh Status Page?

Pernah gak sih lo punya service atau website yang sering tapi gak punya cara buat communicate status ke user? Atau lo punya beberapa service yang di-maintain tapi user lo gak tau mana yang lagi aktif, mana yang lagi down, dan mana yang lagi maintenance?

Status page itu jawabannya. Lihat statuspage.io (milik Atlassian) atau stat.uptimerobot.com — hampir semua SaaS besar punya status page sendiri. User bisa cek kapan aja apakah service-nya healthy atau lagi ada masalah. Dan yang bikin menarik untuk developer Indonesia: lo bisa bikin sendiri, self-hosted, GRATIS.

Gue bikin status page untuk semua service yang gue maintain: website toolkuy.com, API endpoints, Telegram bots, VPS monitoring. Sekarang kalau ada yang down, user gak perlu DM atau WhatsApp gue — mereka bisa cek status sendiri di status.toolkuy.com. Dan kalau gue perlu maintenance window, gue bisa schedule yang otomatis update status page. Time savings-nya signifikan.

Opsi Tool yang Tersedia

ToolHargaFitur UtamaCocok UntukDifficulty
Uptime KumaGratisMonitoring + status page + alertsSingle developer / small teamGampang
Grafana + PrometheusGratisCustom dashboards + alertingMultiple services + advanced metricsSedang
CachetGratisIncident management + status pageMulti-team / client-facingSedang
StatpingGratisSimple status page + notificationsQuick setup, minimal fiturGampang
GitHub Pages + UptimeRobotGratisStatic status page + external monitoringZero maintenanceGampang

Di tutorial ini, gue bakal cover Uptime Kuma secara mendalam karena ini yang paling gampang dipasang, powerful, dan punya built-in status page yang bisa di-share publik.

Part 1: Install Uptime Kuma (5 Menit)

Option A: Docker (Recommended)

# Install via Docker — paling gampang
docker run -d   --restart=always   -p 3001:3001   -v uptime-kuma:/app/data   --name uptime-kuma   louislam/uptime-kuma:latest

# Verify running
docker ps | grep uptime-kuma
# Should show: Up X minutes, 0.0.0.0:3001->3001/tcp

# Check logs
docker logs uptime-kuma --tail 20

Option B: Manual Install (Tanpa Docker)

# Prasyarat: Node.js 14+ terinstall
# Install Node.js dulu kalau belum ada
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt-get install -y nodejs

# Clone dan install
git clone https://github.com/louislam/uptime-kuma.git
cd uptime-kuma
npm install
npm run start

# Akses di http://localhost:3001

Setup Admin Account

  1. Buka http://localhost:3001 di browser
  2. Create admin account — pakai password yang kuat! Minimal 12 karakter, kombinasi huruf, angka, simbol.
  3. Login ke dashboard — langsung mulai setup monitoring.

Part 2: Setup Service Monitoring

Uptime Kuma support berbagai jenis monitoring:

Jenis Monitor yang Tersedia

TypeUse CaseContoh
HTTP(s)Website / API health checkhttps://toolkuy.com, https://api.toolkuy.com/health
TCPPort availability checkdb.toolkuy.com:5432, redis.toolkuy.com:6379
DNSDNS resolution checktoolkuy.com resolves to correct IP
DockerDocker container healthnginx-proxy, postgres-db
KeywordCheck if page contains specific textHomepage contains "Welcome"
SteamGame server monitoringMinecraft server, Rust server
MQTTIoT broker monitoringMQTT broker connectivity

Contoh Setup Monitoring untuk Developer Indonesia

# 1. Monitor Website Utama
Type: HTTP(s)
Name: Website - toolkuy.com
URL: https://toolkuy.com
Interval: 60 seconds
Timeout: 10 seconds
Retries: 3
Accepted Status Codes: 200-299

# 2. Monitor API Health Endpoint
Type: HTTP(s)
Name: API Health Check
URL: https://api.toolkuy.com/health
Method: GET
Expected Status: 200
Interval: 30 seconds

# 3. Monitor Database Port
Type: TCP
Name: PostgreSQL Database
Hostname: db.toolkuy.com
Port: 5432
Interval: 120 seconds

# 4. Monitor DNS
Type: DNS
Name: DNS - toolkuy.com
Hostname: toolkuy.com
Resolved: 104.21.xx.xx (IP server lo)
Interval: 300 seconds

Notification Setup

Monitoring tanpa notifikasi = monitoring yang percuma. Set up notifikasi supaya lo tau kalau ada masalah bahkan sebelum user ngerasa:

Telegram Notification (Recommended)

# 1. Buat bot Telegram dari @BotFather
# 2. Copy bot token

# 3. Di Uptime Kuma:
# Settings → Notifications → Add Notification
# Type: Telegram

# Isi:
Bot Token: 123456789:ABCdefGHIjklMNOpqrsTUVwxyz
Chat ID: -1001234567890  # Group chat ID
Message Template: 
  [STATUS] {{NAME}} is {{STATUS}}
  Time: {{TIME}}
  Message: {{MSG}}

Email Notification

# Settings → Notifications → Add Notification
# Type: Email (SMTP)

SMTP Host: smtp.gmail.com
SMTP Port: 587
SSL/TLS: true
Username: [email protected]
Password: your-app-password  # Bukan password Gmail biasa!
From: [email protected]
To: [email protected]

Part 3: Setup Status Page Publik

Uptime Kuma punya built-in status page yang bisa di-share ke user. Ini killer feature yang bikin lo gak perlu tool terpisah untuk status page.

Setup

  1. Di Uptime Kuma dashboard, klik Status Pages di sidebar
  2. Klik Add Status Page
  3. Pilih nama dan URL (contoh: status → status.toolkuy.com)
  4. Pilih services/monitors yang mau ditampilkan
  5. Customize appearance: logo, warna, text, favicon
  6. Publish — langsung bisa diakses publik!

Custom Domain Setup

# Option 1: Nginx Reverse Proxy
# /etc/nginx/sites-available/status.toolkuy.com

server {
    listen 443 ssl http2;
    server_name status.toolkuy.com;
    
    ssl_certificate /etc/letsencrypt/live/status.toolkuy.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/status.toolkuy.com/privkey.pem;
    
    location / {
        proxy_pass http://localhost: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;
    }
}

# Option 2: Cloudflare Tunnel (tanpa nginx config)
# Install cloudflared
curl -L https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64 -o /usr/local/bin/cloudflared
chmod +x /usr/local/bin/cloudflared

# Setup tunnel
cloudflared tunnel create status-page
cloudflared tunnel route dns status-page status.toolkuy.com
cloudflared tunnel run --url http://localhost:3001 status-page

Contoh Status Page yang Profesional

Layout yang gue rekomendasikan untuk developer Indonesia:

  • Header: Nama service + logo (bisa pake logo SVG custom)
  • Current Status: Green "All Systems Operational" atau Red "Partial Outage"
  • Uptime Chart: Bar chart 90 hari terakhir, hijau = up, merah = down
  • Response Time: Line chart response time untuk setiap service
  • Incident History: Daftar incident yang sudah resolved, dengan timeline
  • Subscribe: Button untuk subscribe email/Telegram notifications

Part 4: Maintenance Window

Salah satu fitur paling berguna: schedule maintenance yang otomatis update status page.

# Di Uptime Kuma:
# Settings → Maintenance → Add Maintenance

Title: Scheduled Server Update
Description: |
  Server sedang di-update untuk security patch.
  Expected duration: 2 hours.
  Semua service akan temporarily unavailable.
  
Schedule: Every Sunday 02:00-04:00 WIB
Affected Monitors: Website, API, Database
Display: Show on status page as "Under Maintenance"
Notify Users: Yes (Telegram + Email)

Selama maintenance, status page otomatis show "Under Maintenance" untuk services yang affected. User gak perlu DM lo lagi buat tanya "kenapa website-nya down?". Mereka bisa cek sendiri.

Part 5: Monitoring Strategy yang Efektif

Alert Thresholds yang Direkomendasikan

LevelConditionAction
CriticalService down > 1 minuteTelegram + Email alert langsung
WarningResponse time > 3 detikTelegram alert (bisa ditoleransi)
InfoCertificate expiry < 14 hariEmail reminder untuk renew
InfoService recovery (dari down ke up)Telegram info bahwa service sudah normal

Tip: Jangan Over-Alert

Salah satu kesalahan paling umum: terlalu banyak alert yang gak penting. Kalau lo dapet 50 alert per hari, lo bakal ignore semua alert — termasuk yang benar-benar critical. Rule of thumb: kalau lo bisa ngapa-ngapain dengan alert itu, kirim alert. Kalau gak bisa (info saja), simpan di daily digest.

Kesimpulan

Status page self-hosted itu investasi kecil (5 menit setup) yang ROI-nya besar:

  • User gak perlu DM lo lagi untuk tanya status — mereka bisa cek sendiri
  • Historical uptime data yang bisa lo pakai buat SLA reporting ke klien
  • Professional appearance untuk klien dan user — bikin lo keliatan serius
  • Incident management yang terstruktur — bukan cuma "maaf lagi down" di WhatsApp
  • Waktu yang dihemat dari gak harus jawab status questions satu-satu

Mulai dari Uptime Kuma hari ini (5 menit install), dan scale ke advanced features kalau lo butuh. Yang penting: jangan tunggu sampai service lo down dan lo gak punya cara communicate status ke user. Setup sekarang, sebelum terlambat.

Automated Incident Management Workflow

Status page yang bagus bukan cuma menampilkan status — tapi juga membantu lo manage incidents secara terstruktur. Berikut workflow yang gue pakai:

Incident Lifecycle

1. DETECT
   ├── Uptime Kuma detect service down
   ├── Alert ke Telegram group (otomatis)
   └── Status page auto-update ke "Investigating"

2. COMMUNICATE
   ├── Buat incident di status page
   ├── Post update: "Investigating - some users affected"
   └── Notify subscribers via email

3. RESOLVE
   ├── Fix the issue
   ├── Update status: "Monitoring - fix deployed"
   └── Wait 15 minutes, verify recovery

4. CLOSE
   ├── Update status: "Resolved - all systems operational"
   ├── Post-mortem (optional tapi recommended)
   └── Close incident di status page

Template Notifikasi Incident

# Telegram notification template (Markdown)
🚨 INCIDENT: {{NAME}}
Status: {{STATUS}}
Time: {{TIME}}
Duration: {{DURATION}}

{{MSG}}

Updates: https://status.toolkuy.com

# Email template
Subject: [{{STATUS}}] {{NAME}} - {{TIME}}

Service {{NAME}} is currently {{STATUS}}.

What we know:
- Issue detected at {{TIME}}
- Affected services: {{AFFECTED_SERVICES}}
- Current status: {{STATUS}}

What we're doing:
- Investigating the root cause
- Working on resolution
- Updates every 15 minutes

Check status page for real-time updates:
https://status.toolkuy.com

Multi-Service Architecture untuk Status Page

Kalau lo manage banyak services (5+), lo butuh organizational strategy untuk monitoring:

Grouping Strategy

# Uptime Kuma: buat groups berdasarkan criticality
Group: "Production - Critical" (alert immediately)
├── Website Utama (toolkuy.com)
├── Payment Gateway
└── Database

Group: "Production - Important" (alert within 5 min)
├── API Endpoints
├── CDN
└── Email Service

Group: "Internal - Dev" (daily digest only)
├── Staging Server
├── Dev Database
└── CI/CD Pipeline

Monitoring dari Multiple Locations

Untuk status page yang reliable, monitoring harus datang dari beberapa locations — bukan cuma dari satu server. Kalau server monitoring lo sendiri yang down, lo gak akan tau kalau services lain juga down.

Options untuk Multi-Location Monitoring

  • Uptime Kuma + UptimeRobot — pakai Uptime Kuma untuk primary monitoring, UptimeRobot sebagai backup external check
  • Pingdom + Uptime Kuma — kombinasi commercial + self-hosted untuk redundancy
  • Multiple Uptime Kuma instances — deploy di 2-3 VPS berbeda region untuk cross-check

Health Check Script untuk Multi-Service

#!/bin/bash
# health-check.sh — comprehensive health check

SERVICES=(
    "https://toolkuy.com|Website Utama"
    "https://api.toolkuy.com/health|API Health"
    "https://status.toolkuy.com|Status Page"
)

echo "=== Health Check $(date) ==="
for entry in "${SERVICES[@]}"; do
    IFS='|' read -r url name <<< "$entry"
    status=$(curl -s -o /dev/null -w "%{http_code}" --max-time 10 "$url")
    if [ "$status" = "200" ]; then
        echo "✅ $name: OK ($status)"
    else
        echo "❌ $name: FAILED ($status)"
    fi
done

# Check disk space
disk_usage=$(df -h / | awk 'NR==2{print $5}' | tr -d '%')
if [ "$disk_usage" -gt 85 ]; then
    echo "⚠️  WARNING: Disk usage at ${disk_usage}%"
fi

# Check SSL certificates
echo ""
echo "=== SSL Certificate Status ==="
for entry in "${SERVICES[@]}"; do
    IFS='|' read -r url name <<< "$entry"
    domain=$(echo "$url" | sed 's|https://||' | sed 's|/.*||')
    expiry=$(echo | openssl s_client -servername "$domain" -connect "$domain":443 2>/dev/null | openssl x509 -noout -enddate 2>/dev/null | cut -d= -f2)
    if [ -n "$expiry" ]; then
        echo "📜 $name ($domain): expires $expiry"
    fi
done

Best Practices untuk Status Page

  • Uptime 99.9%+ — status page harus lebih reliable dari services yang di-monitor. Kalau status page lo sendiri sering down, user gak akan trust.
  • Historical data — simpan minimal 90 hari uptime data untuk reporting. Uptime Kuma udah handle ini otomatis.
  • Clear communication — gunakan Bahasa Indonesia yang jelas dan actionable untuk incident updates. Gak perlu teknikal — user cuma mau tau: kapan selesai?
  • Subscribe options — kasih user opsi untuk subscribe via email atau Telegram. Mereka gak mau harus cek status page secara manual.
  • Mobile-friendly — pastikan status page responsif dan bisa diakses dari HP. User biasanya cek status dari mobile saat lagi urgent.

Kesimpulan

Status page self-hosted itu bukan cuma "nice to have" — ini essential tool untuk setiap developer yang manage services untuk user lain. Dengan Uptime Kuma, lo bisa setup monitoring + status page dalam 5 menit, dan langsung kasih user lo transparansi yang mereka butuhkan. Mulai hari ini, sebelum next incident datang tanpa persiapan.

💬 Komentar (0)

Belum ada komentar. Jadilah yang pertama! 💬

Komentar akan muncul setelah moderasi.