Stack Monitoring Grafana + Prometheus untuk VPS Anda: Panduan Setup Lengkap

Foto oleh Unsplash
Prometheus adalah database time-series open-source yang dijalankan sendiri di VPS atau VM Anda, sehingga Anda memiliki kendali penuh atas retensi data, fleksibilitas query, dan biaya. Untuk lingkungan VPS di DigitalOcean atau Google Cloud Compute Engine, menjalankan stack di Docker Compose pada Droplet terpisah seharga $6/bulan sering kali lebih murah dan lebih fleksibel dibandingkan produk monitoring SaaS berbayar. Konsekuensinya, Anda harus mengelola infrastruktur sendiri, termasuk penyimpanan dan pembaruan.
Node Exporter mengekspos lebih dari 1.000 metrik tingkat host melalui endpoint HTTP /metrics dalam format teks OpenMetrics, mencakup penggunaan CPU per mode, breakdown memori, disk I/O per perangkat, network bytes masuk/keluar per interface, dan penggunaan filesystem per mount point. Prometheus melakukan scrape endpoint ini pada interval yang dapat dikonfigurasi — post ini merekomendasikan scrape_interval 15 detik untuk keseimbangan granularitas dan efisiensi penyimpanan. Prometheus menarik data; bukan menerima push dari target.
Post ini mengidentifikasi empat query yang mencakup 80% kebutuhan operasional: penggunaan CPU sebagai persentase menggunakan irate pada node_cpu_seconds_total, memori tersedia sebagai rasio MemAvailable terhadap MemTotal, persentase penggunaan disk pada root filesystem, dan HTTP request rate menggunakan rate(http_requests_total[5m]). Untuk dashboard, mengimpor dashboard komunitas Grafana ID 1860 (Node Exporter Full) menyediakan lebih dari 30 panel siap pakai dan menghemat 2–3 jam membangun dashboard secara manual.
Sejak Grafana 9, engine alerting bawaannya dapat merutekan alert langsung ke Telegram tanpa perlu men-deploy Alertmanager terpisah. Anda membuat bot Telegram via @BotFather, mendapatkan chat ID, lalu mengonfigurasi Contact Point di Grafana melalui Alerting → Contact Points. Aturan alert ditulis dalam PromQL — misalnya, dipicu ketika ruang disk tersisa kurang dari 15% — dan interval evaluasi dapat diatur ke 1 menit untuk alert kritis dan 5 menit untuk informasional.
Prometheus tidak memiliki autentikasi bawaan, sehingga post ini sangat menyarankan untuk menempatkannya di belakang NGINX dengan HTTP Basic Auth atau membatasi akses via firewall rules hanya ke IP monitoring server. Grafana harus diakses melalui HTTPS menggunakan certbot dan NGINX reverse proxy dengan password admin yang kuat. Node Exporter di host remote hanya boleh dapat dijangkau melalui private networking DigitalOcean atau IP internal VPC GCP, tidak boleh pernah di IP publik.

Foto oleh Unsplash
Menjalankan VPS tanpa monitoring seperti mengemudi dengan mata tertutup. Anda tidak tahu kapan CPU melonjak, memory bocor, atau disk penuh sampai aplikasi Anda down dan klien sudah menelepon. Setelah beberapa insiden menyakitkan di Commsult Indonesia di mana kami menemukan masalah secara reaktif bukan proaktif, saya menjadikan stack Grafana + Prometheus sebagai standar untuk setiap VPS yang kami kelola — baik DigitalOcean Droplet maupun Google Cloud Compute Engine. Panduan ini memandu setup lengkap menggunakan Docker Compose, menjelaskan query PromQL kunci yang benar-benar Anda butuhkan, dan menunjukkan cara menghubungkan alert Telegram agar Anda tahu masalah sebelum pengguna Anda tahu.
Prometheus adalah database time-series yang dibangun khusus untuk metrik. Ia melakukan scrape endpoint HTTP (disebut exporter) pada interval yang dapat dikonfigurasi dan menyimpan data dalam format TSDB terkompresi miliknya sendiri di disk. Bahasa query-nya, PromQL, cukup powerful untuk mengekspresikan agregasi kompleks, kalkulasi rate, dan join multi-metrik. Grafana adalah lapisan visualisasi yang terhubung ke Prometheus (dan puluhan sumber data lain) untuk merender dashboard, grafik, dan heatmap. Grafana juga mengelola alert — Anda menulis aturan alert dalam PromQL, dan Grafana merutekannya melalui Alertmanager (atau engine alerting bawaannya) ke Telegram, Slack, PagerDuty, atau email.
Prometheus tidak menerima data — ia menariknya. Setiap target mengekspos endpoint HTTP /metrics yang mengembalikan metrik key-value teks biasa dalam format OpenMetrics. Node Exporter mengekspos lebih dari 1000 metrik tingkat host: penggunaan CPU per mode, breakdown memory, disk I/O per perangkat, network bytes masuk/keluar per interface, dan penggunaan filesystem per mount point. Aplikasi Anda dapat mengekspos metrik kustom menggunakan library client Prometheus (tersedia untuk Node.js, Python, Go, Java, dan banyak lagi). Untuk kontainer, cAdvisor mengekspos metrik CPU, memori, dan jaringan per kontainer yang dapat di-scrape langsung oleh Prometheus.
Mempelajari PromQL adalah keterampilan leverage tertinggi dalam ekosistem Prometheus. Query yang paling sering digunakan: penggunaan CPU sebagai persentase — `100 - (avg by(instance) (irate(node_cpu_seconds_total{mode='idle'}[5m])) * 100)`. Memori tersedia — `node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes * 100`. Penggunaan disk — `100 - ((node_filesystem_avail_bytes{mountpoint='/'} / node_filesystem_size_bytes{mountpoint='/'}) * 100)`. Request rate HTTP — `rate(http_requests_total[5m])`. Empat query ini mencakup 80% kebutuhan untuk visibilitas operasional sehari-hari.
┌──────────────────────────────────────────────────────────────┐
│ Monitoring Stack Architecture │
│ │
│ ┌─────────────┐ scrape ┌──────────────────────────┐ │
│ │ Node │◄──────────────│ │ │
│ │ Exporter │ :9100 │ Prometheus │ │
│ │ (VPS host) │ │ (metrics store) │ │
│ └─────────────┘ │ :9090 │ │
│ │ │ │
│ ┌─────────────┐ scrape │ Retention: 15 days │ │
│ │ App │◄──────────────│ TSDB on disk │ │
│ │ /metrics │ :3000 └──────────┬───────────────┘ │
│ │ (custom) │ │ │
│ └─────────────┘ │ query │
│ ▼ │
│ ┌─────────────┐ alert ┌──────────────────────────┐ │
│ │ Alertmanager│◄──────────────│ Grafana │ │
│ │ :9093 │ │ (dashboards) │ │
│ │ → Telegram │ │ :3000 │ │
│ └─────────────┘ └──────────────────────────┘ │
└──────────────────────────────────────────────────────────────┘Import dashboard Grafana ID 1860 (Node Exporter Full) dari grafana.com/grafana/dashboards setelah menghubungkan Prometheus sebagai data source. Dashboard komunitas ini memiliki lebih dari 30 panel siap pakai yang mencakup semua metrik Node Exporter dan menghemat 2-3 jam membangun dashboard. Anda kemudian dapat menghapus panel yang tidak diperlukan dan menyesuaikan sisanya.
Cara tercepat untuk menjalankan seluruh stack adalah dengan Docker Compose. Setup di bawah menjalankan Prometheus, Node Exporter, dan Grafana sebagai kontainer di host yang sama, dengan named volume untuk persistensi data. Dalam produksi, jalankan monitoring stack di Droplet atau VM ringan yang terpisah (Droplet Basic DigitalOcean $6/bulan dengan 1 vCPU dan 1GB RAM sudah cukup untuk memonitor 5-10 host). Prometheus kemudian melakukan scrape target remote melalui jaringan daripada localhost.
File prometheus.yml mengontrol target mana yang di-scrape dan pada interval berapa. Untuk host remote, gunakan daftar target static_configs dengan IP server dan port exporter. Pastikan Node Exporter berjalan di host remote dan port-nya (9100) dapat diakses dari monitoring server. Gunakan private networking DigitalOcean atau IP internal VPC GCP untuk menjaga traffic scrape dari internet publik. Atur scrape_interval 15 detik untuk keseimbangan granularitas dan efisiensi penyimpanan.
# docker-compose.yml — Full monitoring stack
version: "3.9"
services:
prometheus:
image: prom/prometheus:v2.51.0
container_name: prometheus
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
- prometheus_data:/prometheus
command:
- '--config.file=/etc/prometheus/prometheus.yml'
- '--storage.tsdb.retention.time=15d'
ports:
- "9090:9090"
restart: unless-stopped
node-exporter:
image: prom/node-exporter:v1.7.0
container_name: node-exporter
pid: host
volumes:
- /proc:/host/proc:ro
- /sys:/host/sys:ro
- /:/rootfs:ro
command:
- '--path.procfs=/host/proc'
- '--path.sysfs=/host/sys'
- '--collector.filesystem.ignored-mount-points=^/(sys|proc|dev|host|etc)($$|/)'
ports:
- "9100:9100"
restart: unless-stopped
grafana:
image: grafana/grafana:10.4.2
container_name: grafana
environment:
- GF_SECURITY_ADMIN_PASSWORD=${GRAFANA_PASSWORD}
- GF_USERS_ALLOW_SIGN_UP=false
volumes:
- grafana_data:/var/lib/grafana
ports:
- "3000:3000"
restart: unless-stopped
depends_on:
- prometheus
volumes:
prometheus_data:
grafana_data:
# prometheus.yml
# global:
# scrape_interval: 15s
# scrape_configs:
# - job_name: 'node'
# static_configs:
# - targets: ['node-exporter:9100']Engine alerting bawaan Grafana (sejak Grafana 9) dapat merutekan alert langsung ke Telegram tanpa memerlukan instance Alertmanager terpisah. Buat bot Telegram via @BotFather, dapatkan chat ID Anda, lalu tambahkan Contact Point di Grafana di bawah Alerting → Contact Points. Tulis aturan alert menggunakan PromQL: `node_filesystem_avail_bytes{mountpoint='/'} / node_filesystem_size_bytes{mountpoint='/'} < 0.15` dipicu ketika kurang dari 15% ruang disk tersisa. Gabungkan beberapa kondisi menggunakan operator `and` dan `or`. Atur interval evaluasi ke 1m untuk alert kritis dan 5m untuk informasional.
Jangan mengekspos port Prometheus, Grafana, atau Node Exporter langsung ke internet publik tanpa autentikasi. Prometheus tidak memiliki auth bawaan — letakkan di belakang NGINX dengan HTTP Basic Auth atau batasi akses via firewall rules hanya ke IP monitoring server Anda. Grafana harus menggunakan HTTPS (certbot + NGINX reverse proxy) dengan password admin yang kuat. Node Exporter di host remote hanya boleh diakses via jaringan private/internal, jangan pernah di IP publik.
Secara default, Prometheus menyimpan data selama 15 hari secara lokal. Untuk monitoring server dengan 5-10 host dan scrape interval 15 detik, perkirakan 5-15GB penyimpanan per bulan. Untuk retensi jangka panjang di atas 90 hari, integrasikan Prometheus dengan Thanos atau Grafana Mimir — keduanya menambah skalabilitas horizontal dan backend object storage (DigitalOcean Spaces atau GCP Cloud Storage). Untuk sebagian besar proyek sampingan dan deployment klien kecil, retensi lokal 15-30 hari sudah cukup dan merupakan opsi paling sederhana.
Setelah stack berjalan, menambahkan host baru sangat mudah: install dan jalankan Node Exporter di server baru, buka port firewall yang diperlukan (9100) ke IP private monitoring server, dan tambahkan target baru ke prometheus.yml diikuti `docker restart prometheus` (atau gunakan file-based service discovery dengan `file_sd_configs` untuk menghindari restart). Satu instance Prometheus dapat dengan nyaman menangani 100+ host dengan scrape interval 15 detik di server 2 vCPU / 4GB RAM. Lebih dari itu, pertimbangkan federation atau Thanos untuk horizontal scaling.