Pendahuluan
Saat aplikasi kamu sudah production, pertanyaan yang sering muncul adalah: "Error ini datangnya dari mana? Kapan mulai terjadi? Berapa kali per jam?"
Tanpa sistem log yang terstruktur, menjawab pertanyaan itu berarti grep di file log yang ribuan baris.
Elasticsearch + Kibana menghadirkan pencarian full-text dan visualisasi log dalam satu paket. Cari "error 500" dari 30 hari ke belakang dalam hitungan detik.
Apa Itu ELK Stack?
- Elasticsearch — mesin pencari dan penyimpan dokumen berbasis JSON
- Kibana — dashboard visualisasi dan query builder untuk Elasticsearch
- Logstash — pipeline untuk parse dan transform log (opsional)
- Filebeat/Fluentd — agent ringan untuk kirim log dari server ke Elasticsearch
Persiapan VPS
Set parameter kernel yang dibutuhkan Elasticsearch:
# Elasticsearch butuh vm.max_map_count yang cukup besar
echo 'vm.max_map_count=262144' | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
# Verifikasi
cat /proc/sys/vm/max_map_count
Pastikan Docker dan Docker Compose sudah terinstall, lalu buat direktori:
mkdir -p /opt/elk
cd /opt/elk
Install Elasticsearch + Kibana dengan Docker Compose
Buat file /opt/elk/.env:
ELASTIC_VERSION=8.12.0
ELASTIC_PASSWORD=password_elastic_kuat
KIBANA_PASSWORD=password_kibana_kuat
Buat file /opt/elk/docker-compose.yml:
version: '3.8'
services:
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:${ELASTIC_VERSION}
container_name: elasticsearch
restart: unless-stopped
environment:
- discovery.type=single-node
- ELASTIC_PASSWORD=${ELASTIC_PASSWORD}
- xpack.security.enabled=true
- "ES_JAVA_OPTS=-Xms1g -Xmx1g"
volumes:
- es_data:/usr/share/elasticsearch/data
ports:
- "9200:9200"
ulimits:
memlock:
soft: -1
hard: -1
kibana:
image: docker.elastic.co/kibana/kibana:${ELASTIC_VERSION}
container_name: kibana
restart: unless-stopped
depends_on:
- elasticsearch
environment:
- ELASTICSEARCH_HOSTS=http://elasticsearch:9200
- ELASTICSEARCH_USERNAME=kibana_system
- ELASTICSEARCH_PASSWORD=${KIBANA_PASSWORD}
ports:
- "5601:5601"
volumes:
es_data:
docker compose up -d
docker compose logs -f elasticsearch # tunggu sampai "started"
Setup Password Kibana di Elasticsearch
Setelah Elasticsearch siap, set password untuk user kibana_system:
docker exec -it elasticsearch \
elasticsearch-users passwd kibana_system \
-p password_kibana_kuat
Atau via API:
curl -X POST "localhost:9200/_security/user/kibana_system/_password" \
-H "Content-Type: application/json" \
-u "elastic:password_elastic_kuat" \
-d '{"password": "password_kibana_kuat"}'
Restart Kibana:
docker compose restart kibana
Akses Dashboard Kibana
Buka browser ke http://IP_VPS_KAMU:5601. Login dengan username elastic dan password yang kamu set.
Dari Kibana kamu bisa:
- Buat index pattern untuk data log
- Query log dengan Kibana Query Language (KQL)
- Buat visualisasi dan dashboard
- Setup alerting jika ada error rate tinggi
Kirim Log Aplikasi ke Elasticsearch
Install Filebeat di server yang mau dikirim lognya:
curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-8.12.0-amd64.deb
sudo dpkg -i filebeat-8.12.0-amd64.deb
Konfigurasi /etc/filebeat/filebeat.yml:
filebeat.inputs:
- type: log
enabled: true
paths:
- /var/log/nginx/access.log
- /var/www/myapp/storage/logs/*.log
output.elasticsearch:
hosts: ["https://IP_VPS_ELASTICSEARCH:9200"]
username: "elastic"
password: "password_elastic_kuat"
ssl.verification_mode: none
sudo systemctl enable filebeat
sudo systemctl start filebeat
Nginx Reverse Proxy untuk Kibana
Agar Kibana bisa diakses via domain dengan HTTPS:
server {
listen 80;
server_name kibana.domain-kamu.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name kibana.domain-kamu.com;
ssl_certificate /etc/letsencrypt/live/kibana.domain-kamu.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/kibana.domain-kamu.com/privkey.pem;
# Basic auth tambahan (opsional, untuk double protection)
auth_basic "Kibana Access";
auth_basic_user_file /etc/nginx/.htpasswd;
location / {
proxy_pass http://localhost:5601;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
Alternatif: OpenSearch (100% Open Source)
Elasticsearch sejak versi 7.11 tidak lagi full open source (BSL license). OpenSearch adalah fork yang benar-benar open source, dikembangkan AWS.
Docker image: opensearchproject/opensearch dan opensearchproject/opensearch-dashboards. Konfigurasi hampir identik dengan ELK.
Kenapa VPS SufaNet Cocok untuk ELK?
- RAM yang cukup — Elasticsearch butuh RAM besar
- SSD NVMe — indexing data cepat
- Bisa scale storage sesuai volume log
- Dedicated resource tanpa noise neighbor
Log management butuh server yang tidak pelit resource
Elasticsearch adalah aplikasi yang haus RAM. VPS dengan resource yang dijamin adalah syarat minimal.
🚀 Lihat VPS Singapore SufaNetFAQ
Elasticsearch bisa dipakai sebagai database biasa?
Bisa untuk read-heavy use case. Tapi bukan pengganti database relasional — tidak ada foreign keys atau strong consistency seperti PostgreSQL/MySQL.
Berapa lama log sebaiknya disimpan?
Tergantung regulasi dan kapasitas. Kebanyakan setup menyimpan 30-90 hari. Gunakan Index Lifecycle Management (ILM) di Kibana untuk auto-delete index lama.
Elasticsearch vs Loki untuk log?
Loki (dari Grafana) lebih ringan dan cocok untuk log tanpa full-text indexing. Elasticsearch lebih powerful untuk search kompleks tapi butuh resource lebih besar.
Kesimpulan
Elasticsearch + Kibana mengubah cara kamu melihat server dan aplikasi. Dari "coba grep dulu" menjadi "query di dashboard dalam 2 detik".
Investasi RAM dan disk yang dibutuhkan terbayar saat pertama kali kamu berhasil menemukan root cause bug production dalam hitungan menit, bukan jam.