Menu
Szybki wybór
Hosting Domeny VPS SSL Kalkulator Porównania FAQ
Aktywne kody
Wszystkie kody rabatowe

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

Najczęstsze pytania

Czym jest ELK Stack i do czego służy? +
ELK to akronim od Elasticsearch (baza danych do wyszukiwania), Logstash (pipeline przetwarzania danych) i Kibana (dashboard UI). Stack służy do centralnego zbierania, indeksowania i analizowania logów z wielu serwerów i aplikacji. Zamiast logować się SSH na każdy serwer i przeglądać pliki, masz jedno miejsce gdzie przeszukujesz gigabajty logów w milisekundy. Od wersji 7.x Elastic oficjalnie zmienił nazwę na "Elastic Stack".
Czym różni się Logstash od Filebeat? +
Filebeat to lekki agent (shipper) — czyta pliki logów i wysyła je do Elasticsearch lub Logstash. Zużywa minimalne zasoby (kilkadziesiąt MB RAM). Logstash to potężny pipeline z pluginami input/filter/output — może parsować złożone formaty, wzbogacać dane (GeoIP lookup, DNS), filtrować i routować do wielu destynacji. Typowa architektura: Filebeat na każdym serwerze → Logstash (parsowanie) → Elasticsearch. Dla prostych logów można pominąć Logstash: Filebeat → Elasticsearch bezpośrednio.
Ile RAM potrzebuje Elasticsearch? +
Elasticsearch jest zasobożerny — minimum 2 GB RAM dla pojedynczego noda, rekomendowane 4-8 GB dla produkcji. JVM heap powinien wynosić max 50% RAM (np. przy 4 GB RAM: -Xms2g -Xmx2g). Kibana potrzebuje kolejne ~500 MB. Logstash: ~500 MB–1 GB. Stack łącznie: minimum 4-5 GB RAM. Z tego powodu ELK często stawia się na osobnym VPS, a nie na serwerze aplikacyjnym. Lżejszą alternatywą jest Grafana Loki (specjalizuje się w logach, zużywa ~10x mniej RAM niż ES).
Jak długo przechowywać logi w Elasticsearch? +
Zależy od regulacji (GDPR, PCI-DSS) i potrzeb biznesowych. Praktyczne zasady: logi dostępu Nginx/Apache — 30-90 dni (analiza ruchu, debugging). Logi błędów aplikacji — 30-180 dni. Logi bezpieczeństwa (loginy, zmiany uprawnień) — 12 miesięcy (wymóg PCI-DSS). Elasticsearch ILM (Index Lifecycle Management) automatycznie przenosi stare indeksy do tańszego storage (warm → cold → delete). Archiwum długoterminowe (ponad rok) lepiej trzymać w S3/GCS w skompresowanych plikach.

Sprawdź oferty pasujące do tego scenariusza

Poniżej masz szybkie przejścia do ofert i stron z kodami rabatowymi tam, gdzie są dostępne.