Stack Monitoring #
Empat komponen, satu tujuan: kalau ada yang mati, ada yang memberi tahu — bukan baru ketahuan saat dibuka manual.
Peran masing-masing #
- Uptime Kuma (
127.0.0.1:3002) — sumber kebenaran alert. Menyimpan monitor dan heartbeat; notifikasi keluar dari sini. - Prometheus (
127.0.0.1:9090) + node-exporter (127.0.0.1:9100) — metrik historis (CPU, RAM, disk) untuk melihat tren, bukan untuk alarm. - Grafana (
127.0.0.1:3001) — panel metrik. - Ruang (
127.0.0.1:3010) — dashboard baca-saja. Tile uptime-nya membacakuma.db, jadi Ruang bukan jalur notifikasi; dia hanya menampilkan apa yang sudah diketahui Kuma.
Semua bind ke loopback. Akses dari luar hanya lewat Cloudflare tunnel per hostname.
Dua jenis monitor, dan kapan memakainya #
- HTTP — untuk layanan yang seharusnya selalu hidup (dashboard, situs, API).
Pilih endpoint yang tidak butuh autentikasi;
/yang mengembalikan SPA selalu 200 dan karena itu hanya membuktikan "ada yang menjawab", bukan "aplikasinya sehat". - Push — untuk pekerjaan yang jarang berjalan (backup harian, publish, pemeriksaan
berkala). Script yang mengerjakan job-nya mengirim
GET /api/push/<token>?status=up|down&msg=...&ping=<n>; Kuma menandai DOWN kalau tidak ada kabar dalam jendela yang ditentukan. Ini menangkap kegagalan yang paling berbahaya: job yang berhenti tanpa error.
Pelajaran yang mahal #
Monitor HTTP yang dipatok ke port ephemeral adalah DOWN permanen yang tidak pernah
berbunyi. Kasus nyata: hermes gateway run memilih port lokal baru setiap start, dan
monitor yang menunjuk port lama melaporkan 0% selama 9 hari padahal layanannya sehat.
Perbaikannya: monitor push + script yang mencari endpoint hidup dulu, lalu push verdict.
Aturan turunannya: sebelum percaya monitor, baca url/hostname/port di
kuma.db dan bandingkan dengan ss -ltnp. Nama monitor bukan bukti targetnya.
Menambah monitor #
Edit database hanya saat container berhenti — Kuma menyimpan konfigurasi di memori dan edit saat hidup bisa hilang pada flush berikutnya.
docker stop uptime-kumasqlite3 /var/lib/docker/volumes/uptime-kuma/_data/kuma.db \"insert into monitor (name,active,user_id,interval,retry_interval,maxretries,type,url,method,accepted_statuscodes_json,weight)values ('Nama',1,1,300,60,3,'http','https://target/','GET','[\"200-299\"]',2000);"# sambungkan notifikasi (id 1 = kanal utama)sqlite3 ... "insert into monitor_notification (monitor_id,notification_id) values (<id>,1);"docker start uptime-kuma
Setelah itu verifikasi heartbeat-nya benar-benar masuk — monitor yang dibuat tapi tidak pernah mengirim heartbeat akan tampil "pending" selamanya dan tidak memberi alarm.