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

Foto oleh Unsplash

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.
blog.posts.grafanaPrometheusMonitoring.content.subsection2Content
┌──────────────────────────────────────────────────────────────┐
│ 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']blog.posts.grafanaPrometheusMonitoring.content.section3Content
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.