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 membaca kuma.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.

bash
docker stop uptime-kuma
sqlite3 /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.