Halo Sobat Online! Sebuah VPS yang menyala 24 jam itu mirip mobil yang dipakai terus tanpa pernah membuka kap mesinnya. Selama tidak ada lampu peringatan, kita baru sadar ada masalah setelah mesinnya benar-benar mati. Di artikel ini kita akan membangun monitoring VPS sendiri memakai Grafana + Prometheus: sepenuhnya self-hosted, tanpa biaya bulanan, dan tanpa mengirim data server ke pihak ketiga.
Setelah selesai, kamu punya satu papan dasbor yang menampilkan pemakaian CPU, RAM, disk, dan trafik jaringan setiap 15 detik. Jadi saat RAM mulai bocor atau disk mulai penuh, kamu tahu berminggu-minggu sebelum pengunjung website merasakannya.
Kenapa Monitoring VPS dengan Grafana dan Prometheus Layak Dicoba?
Masalah di server hampir tidak pernah datang tiba-tiba. Biasanya ada gejala lebih dulu:
- RAM naik pelan dari 40% ke 85% selama beberapa hari karena ada proses yang tidak pernah berhenti.
- Disk terisi 2 GB per hari karena file log tumbuh tanpa pernah diputar.
- Load average naik di jam tertentu karena ada bot yang menggerogoti halaman login.
- Trafik keluar melonjak karena ada yang menyalahgunakan servermu.
Pertanyaan “apakah website saya masih terbuka?” tidak bisa menjawab semua itu. Yang bisa menjawab adalah angka historis — dan itulah inti dari monitoring, bukan sekadar cek hidup atau mati.
Bedanya dengan Uptime Kuma
Kita sudah pernah membahas Uptime Kuma untuk memantau website. Perannya tetap penting, tapi fokusnya berbeda:
- Uptime Kuma menjawab pertanyaan “layanan ini masih hidup atau mati?” dengan tes ringan dari luar server.
- Prometheus + Grafana menjawab “bagaimana kondisi mesinnya?” dengan mengumpulkan ratusan angka dari dalam server, lalu menyimpannya sebagai riwayat yang bisa digambar.
- Uptime Kuma memanggil kita saat ada yang tumbang; Grafana memberi tahu kita sebelum ada yang tumbang.
Anggap saja Uptime Kuma itu alarm kebakaran, dan Prometheus + Grafana itu panel suhu mesin lengkap dengan grafiknya. Keduanya butuh dijalankan.
Tiga Kontainer yang Akan Kita Pasang
Semua yang kita pasang berjalan sebagai kontainer Docker, jadi sistem Ubuntu-mu tetap bersih. Ada tiga servis dengan pembagian tugas yang jelas:
- node_exporter (versi stabil 1.12.1) — alat pengukur. Ia membaca angka dari
/procdan/sysmilik server lalu menyajikannya di satu halamanhttp://IP:9100/metrics. Ibaratnya petugas yang berdiri di ruang mesin dan membacakan semua instrumen tiap beberapa detik. - Prometheus (versi 3.15.0, rilis 24 September 2026; jalur LTS 3.13 yang didukung sampai Juli 2027) — perekamnya. Ia menarik data dari node_exporter setiap 15 detik lalu menyimpannya di basis data deret waktu sendiri.
- Grafana (versi 13.2.3, rilis 29 September 2026) — papannya. Ia membaca angka dari Prometheus, lalu menggambarnya menjadi grafik yang enak dilihat dan bisa memicu notifikasi.
Ketiganya ringan. Satu VPS 2 GB RAM sudah cukup lega; 1 GB masih bisa asal retensinya tidak berlebihan.
Persiapan Sebelum Memasang
Bereskan lima hal ini dulu supaya tidak tersandung di tengah jalan:
- VPS dengan Ubuntu 22.04 atau 24.04, plus akses root lewat SSH.
- Docker Engine dan plugin Docker Compose sudah terpasang. Cek dengan
docker compose version. - Ruang disk minimal 10 GB. Prometheus menyimpan deret waktu di disk, bukan di RAM.
- Domain khusus untuk Grafana, misalnya
grafana.domainmu.com— atau lewati saja kalau kamu memilih akses lewat terowongan SSH. - Password kuat untuk akun admin Grafana, disiapkan sebelum instalasi karena kita akan mengisinya lewat variabel lingkungan di langkah berikutnya.
Perhatikan satu keputusan desain penting: seluruh port kita ikat hanya ke 127.0.0.1, bukan ke semua antarmuka. Artinya, baik Prometheus, node_exporter, maupun Grafana tidak bisa diakses dari internet. Cara mengaksesnya ada dua — terowongan SSH untuk sesekali, atau reverse proxy dengan HTTPS untuk pemakaian harian. Kita bahas keduanya nanti.
Langkah 1: Siapkan Folder dan Konfigurasi Prometheus
Masuk ke server sebagai root, lalu buat struktur folder yang rapi. Semua file kita tinggal di /opt/monitoring:
mkdir -p /opt/monitoring/prometheus
mkdir -p /opt/monitoring/grafana/provisioning/datasources
cd /opt/monitoring
Sekarang buat file prometheus.yml berisi target yang akan dipantau:
global:
scrape_interval: 15s
evaluation_interval: 15s
storage:
tsdb:
retention:
time: 30d
size: 2GB
scrape_configs:
- job_name: node
static_configs:
- targets: ['127.0.0.1:9100']
Tiga hal yang perlu dicatat dari file sekecil ini:
job_name: nodejangan diganti. Dasbor populer yang akan kita impor nanti mencari label job dengan nama itu; kalau diganti, grafiknya kosong.storage.tsdb.retentionmenjaga server dari kehabisan disk: data dipangkas setelah 30 hari, dan ikut dipangkas kalau ukurannya menembus 2 GB.- Sejak Prometheus 3.15, setelan retensi lewat flag
--storage.tsdb.retention.timesudah deprecated; cara yang dianjurkan adalah blokstorage:di file konfigurasi seperti di atas.
Langkah 2: Susun docker-compose.yml
Tiga kontainer, satu file. Simpan sebagai /opt/monitoring/docker-compose.yml:
services:
node-exporter:
image: quay.io/prometheus/node-exporter:v1.12.1
container_name: node-exporter
restart: unless-stopped
network_mode: host
pid: host
command:
- '--path.rootfs=/host'
- '--web.listen-address=127.0.0.1:9100'
volumes:
- '/:/host:ro,rslave'
prometheus:
image: prom/prometheus:v3.15.0
container_name: prometheus
restart: unless-stopped
network_mode: host
command:
- '--config.file=/etc/prometheus/prometheus.yml'
- '--web.listen-address=127.0.0.1:9090'
volumes:
- ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml:ro
- prometheus-data:/prometheus
grafana:
image: grafana/grafana:13.2.3
container_name: grafana
restart: unless-stopped
network_mode: host
depends_on:
- prometheus
environment:
GF_SECURITY_ADMIN_USER: admin
GF_SECURITY_ADMIN_PASSWORD: 'Ganti-Dengan-Password-Kuat'
GF_SERVER_HTTP_ADDR: 127.0.0.1
GF_SERVER_HTTP_PORT: '3000'
volumes:
- grafana-data:/var/lib/grafana
- ./grafana/provisioning/datasources:/etc/grafana/provisioning/datasources:ro
volumes:
prometheus-data:
grafana-data:
Kenapa node_exporter memakai network_mode: host dan pid: host? Karena alat ini memang dirancang membaca metrik host, bukan metrik kontainernya sendiri. Dokumentasi resminya meminta dua hal itu supaya ia bisa melihat seluruh proses di server, ditambah pemasangan /:/host:ro,rslave yang membuat angka disk dan CPU milik server asli, bukan milik kontainer.
Dua catatan kecil yang berguna:
- Kalau kamu lebih suka Grafana dan Prometheus tetap di jaringan bridge Docker, ganti target scrape menjadi
host.docker.internal:9100dan tambahkanextra_hosts: ['host.docker.internal:host-gateway']pada Prometheus. Pola ini resmi didokumentasikan Docker, tetapi hanya berlaku untuk Docker 20.10 ke atas. - Beberapa panel di dasbor nanti menampilkan daftar service systemd atau jumlah proses. Datanya butuh flag tambahan
--collector.systemddan--collector.processes. Di dalam kontainer, collector systemd perlu akses socket D-Bus host, jadi kalau panel itu kosong, jalankan node_exporter langsung sebagai service di host — bukan kesalahan instalasimu.
Terakhir, siapkan file agar Grafana langsung mengenali Prometheus saat pertama kali dinyalakan:
apiVersion: 1
datasources:
- name: Prometheus
type: prometheus
access: proxy
url: http://127.0.0.1:9090
isDefault: true
Simpan sebagai /opt/monitoring/grafana/provisioning/datasources/prometheus.yml. Dengan provisioning, kamu tidak perlu klik-klik menambahkan data source di antarmuka.
Langkah 3: Jalankan Stack dan Pastikan Target Terdeteksi
cd /opt/monitoring
docker compose up -d
docker compose ps
curl -s http://127.0.0.1:9090/api/v1/targets
Yang kita cari di keluaran terakhir adalah status "health":"up" untuk job node. Kalau masih down, urutan pemeriksaannya sederhana: cek kontainer node-exporter hidup, cek curl -s http://127.0.0.1:9100/metrics mengeluarkan angka, lalu cek ulang ejaan target di prometheus.yml.
Langkah 4: Masuk ke Grafana Lewat Terowongan SSH
Karena Grafana hanya mendengarkan di localhost server, kita buat terowongan dari komputer sendiri:
ssh -L 3000:127.0.0.1:3000 -L 9090:127.0.0.1:9090 user@IP-VPS
Biarkan terminal itu terbuka, lalu buka http://localhost:3000 di browser. Masuk dengan username admin dan password yang kamu tulis di GF_SECURITY_ADMIN_PASSWORD. Kalau kamu membiarkan password default admin, Grafana akan meminta kamu menggantinya saat login pertama — perilaku ini memang disengaja, jadi langsung pakai password sendiri sejak awal.
Setelah masuk, cek Connections → Data sources: di situ harus sudah ada Prometheus berlabel default. Klik Save & test untuk memastikan Grafana benar-benar tersambung.
Langkah 5: Impor Dasbor Node Exporter Full
Menulis grafik satu per satu jelas tidak efisien, dan memang tidak perlu. Grafana punya perpustakaan dasbor siap pakai:
- Buka menu Dashboards → New → Import.
- Isi kolom ID dengan 1860, lalu klik Load. Dasbor ini bernama Node Exporter Full dan grafiknya sudah lengkap dari CPU per core sampai suhu perangkat.
- Pada pilihan data source, pilih Prometheus, lalu klik Import.
- Tunggu beberapa menit sampai data terkumpul. Panel pertama yang layak kamu perhatikan adalah Memory, Disk Space, dan Network Traffic.
Simpan juga ID dasbor ini di catatanmu. Kalau suatu hari Grafana perlu dibangun ulang dari nol, impor ulang nomor yang sama jauh lebih cepat daripada menyusun grafik dari awal.
Bikin Alarm Sederhana Sebelum Menutup Artikel
Dasbor yang tidak pernah dibuka itu tidak ada gunanya. Karena itu, pindahkan penjagaan ke Grafana Alerting supaya kamu yang dihubungi, bukan kamu yang harus mengecek. Dua aturan yang paling sering menyelamatkan server:
- RAM dan CPU tinggi — ekspresi
100 - (avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 85artinya pemakaian CPU rata-rata di atas 85% selama 5 menit. - Disk hampir penuh — ekspresi
node_filesystem_avail_bytes{mountpoint="/",fstype!~"tmpfs|overlay"} / node_filesystem_size_bytes{mountpoint="/"} * 100 < 15artinya sisa ruang disk tinggal di bawah 15%.
Buka Alerting → Alert rules → New alert rule, tempel salah satu ekspresi di atas, lalu pasang ambang dan durasi for 10 menit supaya alarm tidak berisik hanya karena lonjakan sesaat. Untuk pengirimannya, tambahkan contact point Telegram atau email di Alerting → Contact points.
Amankan Panel Monitoring
Grafana menyimpan seluruh riwayat server dan punya akses baca ke metrikmu. Karena itu, jangan pernah membuka port 3000 dan 9090 ke internet. Dua jalan yang aman:
- Terowongan SSH seperti di Langkah 4, cocok untuk pemakaian sesekali.
- Reverse proxy dengan HTTPS untuk akses harian, dengan subdomain khusus dan sertifikat Let’s Encrypt. Pola ini sama seperti yang kita pakai saat membahas Nginx dan Cloudflare Tunnel: proxy di depan, aplikasi tetap mendengarkan di localhost.
Di sisi firewall server, cukup izinkan SSH dan layanan web saja:
ufw allow 22/tcp
ufw allow 80/tcp
ufw allow 443/tcp
ufw enable
Perlu diingat, GF_SECURITY_ADMIN_PASSWORD hanya berpengaruh saat volume Grafana masih kosong. Kalau kamu salah menulisnya, ubah saja lewat Administration → Users di antarmuka, atau reset dari dalam kontainer memakai perintah grafana cli admin reset-admin-password. Dan seperti biasa: jangan tinggalkan port 22 tanpa pengamanan — langkah-langkahnya sudah kita bahas di artikel cara amankan SSH dari brute force.
Kesimpulan
Monitoring VPS dengan Grafana + Prometheus adalah investasi satu jam yang akan terbayar berkali-kali. Tiga kontainer, tiga file konfigurasi, dan kamu sudah punya riwayat lengkap tentang kesehatan server sendiri: CPU, RAM, disk, dan jaringan, tanpa langganan bulanan dan tanpa mengirim data ke mana pun.
Praktik terbaiknya sederhana: biarkan angka terkumpul beberapa hari dulu, perhatikan polanya, baru pasang alarm pada ambang yang benar-benar masuk akal untuk servermu. Server yang terukur adalah server yang bisa dipercaya — dan sekarang kamu yang memegang alat ukurnya. Selamat mencoba, Sobat Online!

