Привіт, я Kernelka. Якщо ви хочете бачити всі log-файли Linux з різних машин у зручних дашбордах і швидко ловити помилки — час подружити Promtail, Loki і Grafana. Нижче — мій дружній покроковий гайд: від встановлення до першого запиту, плюс альтернативи і часті питання. Поїхали! 🚀

Як це працює і що знадобиться

Схема проста: Promtail на кожному хості читає логи й шле їх у Loki (центральне сховище). Grafana підключається до Loki як джерела даних і малює графіки та списки логів.

  • Promtail — агент-збирач логів.
  • Loki — легке та дешеве сховище логів.
  • Grafana — GUI для дашбордів і пошуку.

Порти за замовчуванням: Loki — 3100/tcp, Grafana — 3000/tcp. Якщо у вас увімкнений firewall Linux, відкрийте їх на центральному вузлі.

Покрокова інсталяція (How‑to)

1) Підготуйте систему

sudo apt update && sudo apt install -y wget unzip curl ufw

Далі налаштуємо Loki та Promtail на ваш сервер Linux. Grafana — для зручного пошуку і дашбордів. Це відмінна база для Linux моніторинг логів.

2) Встановіть Loki (сховище логів)

# Користувач і каталоги
sudo useradd --system --no-create-home --shell /sbin/nologin loki
sudo mkdir -p /etc/loki /var/lib/loki/{chunks,index,boltdb-cache,compactor}
sudo chown -R loki:loki /etc/loki /var/lib/loki

# Бінарник Loki
cd /usr/local/bin
sudo wget -O loki.zip https://github.com/grafana/loki/releases/latest/download/loki-linux-amd64.zip
sudo unzip -o loki.zip
sudo mv loki-linux-amd64 loki
sudo chmod +x loki
sudo rm loki.zip

# Конфіг Loki (filesystem + boltdb-shipper, ретеншн 7 днів)
sudo tee /etc/loki/config.yml >/dev/null <<'YAML'
server:
  http_listen_port: 3100
  log_level: info
storage_config:
  boltdb_shipper:
    active_index_directory: /var/lib/loki/index
    cache_location: /var/lib/loki/boltdb-cache
    shared_store: filesystem
  filesystem:
    directory: /var/lib/loki/chunks
schema_config:
  configs:
    - from: 2024-01-01
      store: boltdb-shipper
      object_store: filesystem
      schema: v13
      index:
        prefix: index_
        period: 24h
compactor:
  working_directory: /var/lib/loki/compactor
  shared_store: filesystem
limits_config:
  retention_period: 168h
ingester:
  lifecycler:
    ring:
      kvstore:
        store: inmemory
      replication_factor: 1
  chunk_idle_period: 1h
  chunk_retain_period: 30s
YAML

# Сервіс systemd
echo "[Unit]
Description=Loki Log Aggregation System
After=network-online.target
Wants=network-online.target

[Service]
User=loki
Group=loki
ExecStart=/usr/local/bin/loki -config.file=/etc/loki/config.yml
Restart=on-failure
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target" | sudo tee /etc/systemd/system/loki.service >/dev/null

sudo systemctl daemon-reload
sudo systemctl enable --now loki

# Дозволити порт (за потреби)
sudo ufw allow 3100/tcp || true

# Перевірка здоров'я (має повернути HTTP 200)
curl -sS http://localhost:3100/ready

3) Встановіть Promtail (збирач логів)

# Користувач і каталоги
sudo useradd --system --no-create-home --shell /sbin/nologin promtail
sudo mkdir -p /etc/promtail /var/lib/promtail
sudo chown -R promtail:promtail /etc/promtail /var/lib/promtail

# Бінарник Promtail
cd /usr/local/bin
sudo wget -O promtail.zip https://github.com/grafana/loki/releases/latest/download/promtail-linux-amd64.zip
sudo unzip -o promtail.zip
sudo mv promtail-linux-amd64 promtail
sudo chmod +x promtail
sudo rm promtail.zip

# Дозволи для читання журналів
sudo usermod -aG adm,systemd-journal promtail

# Конфіг Promtail: читаємо /var/log/*.log та systemd-journal, шлемо у Loki
sudo tee /etc/promtail/config.yml >/dev/null <<'YAML'
server:
  http_listen_port: 9080
  log_level: info
positions:
  filename: /var/lib/promtail/positions.yaml
clients:
  - url: http://localhost:3100/loki/api/v1/push
scrape_configs:
  - job_name: varlogs
    static_configs:
      - targets: [localhost]
        labels:
          job: varlogs
          host: ${HOSTNAME}
          __path__: /var/log/*.log
  - job_name: journal
    journal:
      path: /var/log/journal
      max_age: 12h
      labels:
        job: systemd-journal
    relabel_configs:
      - source_labels: ['__journal__systemd_unit']
        target_label: 'unit'
YAML

# Сервіс systemd
echo "[Unit]
Description=Promtail for Loki
After=network-online.target
Wants=network-online.target

[Service]
User=promtail
Group=promtail
ExecStart=/usr/local/bin/promtail -config.file=/etc/promtail/config.yml
Restart=on-failure
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target" | sudo tee /etc/systemd/system/promtail.service >/dev/null

sudo systemctl daemon-reload
sudo systemctl enable --now promtail

# Перевірити, що логи течуть у Loki
journalctl -u promtail -n 50 --no-pager

4) Встановіть Grafana (дашборди)

# Репозиторій Grafana OSS
sudo apt-get install -y apt-transport-https software-properties-common
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://packages.grafana.com/gpg.key | sudo gpg --dearmor -o /etc/apt/keyrings/grafana.gpg
echo "deb [signed-by=/etc/apt/keyrings/grafana.gpg] https://packages.grafana.com/oss/deb stable main" | sudo tee /etc/apt/sources.list.d/grafana.list >/dev/null
sudo apt update && sudo apt install -y grafana
sudo systemctl enable --now grafana-server
sudo ufw allow 3000/tcp || true

Відкрийте Grafana: http://<IP>:3000 (логін/пароль за замовчуванням — admin/admin, вас попросять змінити пароль).

5) Додайте джерело Loki і перший запит

  1. У Grafana: Connections → Data sources → Add data source → Loki → URL: http://localhost:3100 → Save & test.
  2. Перейдіть Explore і виконайте запит LogQL: {job="varlogs"} |= "error" — побачите помилки з /var/log/*.log.
  3. Ще приклад: {job="systemd-journal", unit="sshd.service"} — фільтр за юнітом.

Альтернативні способи

Docker на Linux (компонуємо весь стек)

# docker-compose.yml з Loki, Promtail, Grafana
cat > docker-compose.yml <<'YAML'
version: '3.8'
services:
  loki:
    image: grafana/loki:2.9.0
    command: -config.file=/etc/loki/config/config.yml
    ports:
      - "3100:3100"
    volumes:
      - ./loki:/etc/loki/config
      - loki-data:/loki
  promtail:
    image: grafana/promtail:2.9.0
    command: -config.file=/etc/promtail/config.yml
    volumes:
      - /var/log:/var/log:ro
      - /var/lib/docker/containers:/var/lib/docker/containers:ro
      - ./promtail:/etc/promtail
  grafana:
    image: grafana/grafana:latest
    ports:
      - "3000:3000"
    volumes:
      - grafana-data:/var/lib/grafana
volumes:
  loki-data:
  grafana-data:
YAML

docker compose up -d

Цей варіант зручний для швидкого старту і тестів. У прод середовищі стежте за диском і бекапами.

Збір лише з journald (без файлів)

У Promtail можна лишити тільки блок journal: в scrape_configs, якщо ваші сервіси логують у системний журнал. Це зменшує навантаження на файлову систему та спрощує ротацію.

GUI-спосіб у Grafana

  1. Джерело Loki вже додано? Супер ✅
  2. Import готового дашборда: Dashboards → Import → введіть ID (наприклад, 12019 або 15141), виберіть свій Loki.
  3. Створіть алерти: Alerting → New alert rule → виберіть запит LogQL (наприклад, кількість «error» за 5 хвилин > 10) → канал сповіщень.
  4. Налаштуйте панелі: використовуйте трансформації і поля labels (host, job, unit) для фільтрів.

FAQ

Логи не з'являються в Grafana. З чого почати діагностику?

Перевірте, що Loki здоровий (curl http://localhost:3100/ready) і що Promtail шле дані: journalctl -u promtail -f. У Grafana перевірте Data source → Save & test.

Promtail не читає systemd‑journal

Додайте користувача promtail у групу systemd-journal і перезапустіть сервіс:

sudo usermod -aG systemd-journal promtail
sudo systemctl restart promtail

Які порти відкрити у firewall Linux?

На вузлі з Loki: 3100/tcp. На вузлі з Grafana: 3000/tcp. Додатково (не обов'язково): 9080/tcp для локального UI Promtail.

sudo ufw allow 3100/tcp
sudo ufw allow 3000/tcp

Диск стрімко заповнюється. Як обмежити?

Встановіть ретеншн у Loki (приклад вище — 7 днів), винесіть дані на диск з достатнім об'ємом, увімкніть моніторинг використання диска та алерти Grafana. Для великих обсягів — зовнішнє object storage.

Багато лейблів — усе гальмує. Чому?

Уникайте «вибуху кардинальності» — не додавайте у labels унікальні значення на кожний рядок (типу довгих UUID, шляхів файлів, повідомлень). Краще парсити це в поля і фільтрувати через |= або |~.

Час у логах «пливе»

Синхронізуйте час на всіх вузлах (NTP/chrony). Різниця часу заважає коректному пошуку та побудові графіків.

Як збирати логи з кількох серверів?

Ставте Promtail на кожен хост і в clients.url вказуйте центральний Loki (http://<FQDN>:3100). За потреби налаштуйте TLS/автентифікацію через реверс‑проксі.

Порада від Kernelka

Тримайте конфіги чистими: мінімум лейблів, зрозумілі job і host, окрема папка під дані Loki. Для критичних сервісів додайте окремий scrape_config із власними лейблами — так легше будувати дашборди і алерти. І не забувайте про бекапи! 🔍

Підсумок

  • Promtail збирає log-файли Linux і передає їх у Loki.
  • Loki зберігає логи економно, з ретеншном та пошуком LogQL.
  • Grafana дає швидкий пошук, дашборди та алерти.
  • Є варіант через Docker на Linux для швидкого деплою.
  • Не забудьте про firewall, доступи до journald і синхронізацію часу.