ELK Stack — centralne logowanie dla serwera i aplikacji
Opublikowano: 9 kwietnia 2026 · Kategoria: VPS / Monitoring
SSH na serwer, grep przez gigabajt logów, korelowanie zdarzeń z pięciu plików... to strata czasu. ELK Stack (Elasticsearch + Logstash + Kibana) centralizuje logi ze wszystkich serwerów w jednym miejscu — przeszukujesz je w milisekundy, wizualizujesz trendy i dostajesz alerty gdy pojawi się burst błędów. Oto jak go postawić na VPS.
Architektura ELK Stack
| Komponent | Rola | Port | RAM |
|---|---|---|---|
| Filebeat | Agent na serwerach aplikacyjnych — czyta logi i wysyła do Logstash | — | ~50 MB |
| Logstash | Pipeline: parsuje, filtruje, transformuje logi | 5044 | ~500 MB |
| Elasticsearch | Baza danych — indeksuje i przechowuje logi | 9200 | 2–8 GB |
| Kibana | UI — dashboardy, Discover, Alerting | 5601 | ~500 MB |
Instalacja przez Docker Compose (rekomendowane)
Najszybszy sposób na uruchomienie ELK to Docker Compose. Oficjalny stack od Elastic:
# docker-compose.yml dla ELK Stack
services:
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:8.12.0
restart: unless-stopped
environment:
- discovery.type=single-node # Single-node — bez klastra
- ES_JAVA_OPTS=-Xms1g -Xmx1g # 1 GB heap (dla 2 GB RAM VPS)
- xpack.security.enabled=false # Wyłącz security dla dev/small setups
volumes:
- es_data:/usr/share/elasticsearch/data
ports:
- "127.0.0.1:9200:9200" # Tylko localhost!
networks:
- elk
ulimits:
memlock:
soft: -1
hard: -1
kibana:
image: docker.elastic.co/kibana/kibana:8.12.0
restart: unless-stopped
environment:
- ELASTICSEARCH_HOSTS=http://elasticsearch:9200
ports:
- "127.0.0.1:5601:5601" # Dostęp przez SSH tunnel lub Nginx
networks:
- elk
depends_on:
- elasticsearch
logstash:
image: docker.elastic.co/logstash/logstash:8.12.0
restart: unless-stopped
volumes:
- ./logstash/pipeline:/usr/share/logstash/pipeline:ro
ports:
- "127.0.0.1:5044:5044" # Beats input
networks:
- elk
depends_on:
- elasticsearch
volumes:
es_data:
networks:
elk:
driver: bridge # Ustaw vm.max_map_count (Elasticsearch wymaga) sudo sysctl -w vm.max_map_count=262144 echo "vm.max_map_count=262144" | sudo tee -a /etc/sysctl.conf # Uruchom stack docker compose up -d
Konfiguracja Logstash Pipeline
Plik pipeline definiuje jak przetwarzać przychodzące logi:
# logstash/pipeline/nginx.conf
input {
beats {
port => 5044
}
}
filter {
if [fields][log_type] == "nginx_access" {
grok {
match => {
"message" => '%{COMBINEDAPACHELOG}'
}
}
date {
match => ["timestamp", "dd/MMM/yyyy:HH:mm:ss Z"]
target => "@timestamp"
}
geoip {
source => "clientip" # Geolokalizacja IP
}
mutate {
convert => {
"bytes" => "integer"
"response" => "integer"
}
}
}
}
output {
elasticsearch {
hosts => ["http://elasticsearch:9200"]
index => "nginx-logs-%{+YYYY.MM.dd}" # Indeks per dzień
}
} Instalacja Filebeat na serwerze aplikacyjnym
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
# /etc/filebeat/filebeat.yml
filebeat.inputs:
- type: filestream
id: nginx-access
paths:
- /var/log/nginx/access.log
fields:
log_type: nginx_access
- type: filestream
id: nginx-error
paths:
- /var/log/nginx/error.log
fields:
log_type: nginx_error
- type: filestream
id: app-logs
paths:
- /var/log/myapp/*.log
fields:
log_type: application
output.logstash:
hosts: ["elk-server-ip:5044"]
# Lub bezpośrednio do Elasticsearch (bez Logstash):
# output.elasticsearch:
# hosts: ["elk-server-ip:9200"]
# index: "filebeat-%{+yyyy.MM.dd}" sudo systemctl enable --now filebeat # Sprawdź czy dane płyną sudo filebeat test output sudo journalctl -u filebeat -f
Kibana — dashboardy i wyszukiwanie
Dostęp do Kibany przez SSH tunnel: ssh -L 5601:localhost:5601 user@serwer,
następnie otwórz http://localhost:5601.
- Discover — surowe logi z filtrowaniem (KQL:
response:500,clientip:1.2.3.4) - Dashboard — wizualizacje: top 10 IP, mapa geograficzna, błędy w czasie, status codes pie chart
- Alerts — powiadomienia gdy liczba błędów 5xx przekroczy próg (email, Slack, PagerDuty)
- Index Management — ILM policies: po 7 dniach hot → warm, po 30 dniach → delete
Alternatywy dla pełnego ELK
ELK jest potężny, ale zasobożerny. Lżejsze opcje dla małych VPS:
- Grafana Loki + Promtail — specjalizuje się w logach, ~10x mniej RAM niż Elasticsearch, integruje się z Grafaną
- OpenSearch — fork Elasticsearch od AWS, open source bez ograniczeń licencyjnych
- Graylog — gotowe UI dla logów, prostszy w konfiguracji niż ELK
- Vector (vectordev) — wydajny pipeline logów w Rust, zamiennik dla Logstash/Filebeat