Установка ELK Stack 7 на Alma Linux 10

Изображение современного рабочего места с двойными мониторами, где отображается установка ELK Stack 7 на Alma Linux 10.

Описание установки ELK Stack 7 (Elasticsearch, Logstash, Kibana)

Инструкция составлена по результатам реальной установки ELK Stack 7.17.9 на сервер с Alma Linux 10 и Docker 29.4.0. Все шаги, команды и решения проблем проверены на практике.

Версия ELK: 7.17.9     ОС: Alma Linux 10     Лицензия: Elastic Basic (бесплатная)

Требования

Характеристики сервера

ПараметрМинимумРекомендуется
ОЗУ4 GB8 GB и более
CPU2 ядра4 ядра и более
Диск20 GB50–100 GB SSD
ОСAlma Linux 10Alma Linux 10 (ядро 6.x)
Docker20.x и выше29.x (проверено)

Предварительные условия

Перед началом установки на сервере должны быть установлены и запущены:

  1. Docker Engine (проверено на версии 29.4.0)
  2. Docker Compose plugin (проверено на версии v5.1.2)
  3. Доступ к интернету для скачивания образов (~2 GB)
  4. Пользователь с правами sudo или root

ПРИМЕЧАНИЕ Данная инструкция предполагает, что Docker уже установлен. Все команды выполняются от пользователя root.

Инструкция по установке Docker смотри тут.

Подготовка системы

Проверка vm.max_map_count

Elasticsearch требует увеличенного лимита виртуальной памяти ядра. Проверьте текущее значение:

sysctl vm.max_map_count

Если значение меньше 262144 — увеличьте его:

# Применить немедленно
sudo sysctl -w vm.max_map_count=262144
 
# Сохранить постоянно (после перезагрузки)
echo 'vm.max_map_count=262144' | sudo tee -a /etc/sysctl.conf
sudo sysctl -p

На Alma Linux 10 с ядром 6.x значение по умолчанию может уже быть равно 1048576 — это больше необходимого минимума. В таком случае шаг можно пропустить.

Проверка Docker

docker --version
docker compose version
 
# Убедиться что служба запущена
sudo systemctl status docker

РЕЗУЛЬТАТ

Ожидаемый вывод:

Docker version 29.4.0, build 9d7ad9f Docker Compose version v5.1.2

Создание структуры проекта

Создайте рабочую директорию и все необходимые вложенные папки:

mkdir -p ~/elk7/{logstash/pipeline,logstash/config}
cd ~/elk7

Итоговая структура:

~/elk7/
├── .env                        # версия ELK
├── docker-compose.yml          # оркестрация контейнеров
└── logstash/
    ├── config/
    │   └── logstash.yml        # параметры Logstash
    └── pipeline/
        └── logstash.conf       # конвейер: input → filter → output

Конфигурационные файлы

Файл .env

Создайте файл переменных окружения:

cat > .env << 'EOF'
ELK_VERSION=7.17.9
EOF
 
# Проверить
cat .env

ВАЖНО Убедитесь что в файл попало только содержимое, без строки cat и EOF. Проверьте командой cat .env — должна быть только одна строка: ELK_VERSION=7.17.9

Файл docker-compose.yml

Откройте редактор и вставьте содержимое:

nano docker-compose.yml

Содержимое файла:

services:
 
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:${ELK_VERSION}
    container_name: elasticsearch
    environment:
      - node.name=es01
      - cluster.name=elk-cluster
      - discovery.type=single-node
      - xpack.security.enabled=false
      - bootstrap.memory_lock=true
      - 'ES_JAVA_OPTS=-Xms1g -Xmx1g'
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - esdata:/usr/share/elasticsearch/data
    ports:
      - '9200:9200'
    networks:
      - elk-net
    restart: unless-stopped
 
  logstash:
    image: docker.elastic.co/logstash/logstash:${ELK_VERSION}
    container_name: logstash
    environment:
      - 'LS_JAVA_OPTS=-Xms512m -Xmx512m'
    volumes:
      - ./logstash/config/logstash.yml:/usr/share/logstash/config/logstash.yml:ro
      - ./logstash/pipeline:/usr/share/logstash/pipeline:ro
    ports:
      - '5044:5044'
      - '5000:5000'
      - '9600:9600'
    networks:
      - elk-net
    restart: unless-stopped
    depends_on:
      - elasticsearch
 
  kibana:
    image: docker.elastic.co/kibana/kibana:${ELK_VERSION}
    container_name: kibana
    environment:
      - ELASTICSEARCH_HOSTS=http://elasticsearch:9200
    ports:
      - '5601:5601'
    networks:
      - elk-net
    restart: unless-stopped
    depends_on:
      - elasticsearch
 
volumes:
  esdata:
    driver: local
 
networks:
  elk-net:
    driver: bridge
    ipam:
      config:
        - subnet: 172.30.0.0/24

Сохраните: Ctrl+O → Enter → Ctrl+X

Проверьте корректность файла:

docker compose config --quiet && echo "OK"

РЕЗУЛЬТАТ

Ожидаемый вывод: OK Предупреждение про атрибут version — безопасно, можно игнорировать.

Файл logstash/config/logstash.yml

nano logstash/config/logstash.yml
http.host: '0.0.0.0'
xpack.monitoring.elasticsearch.hosts: ['http://elasticsearch:9200']

Сохраните: Ctrl+O → Enter → Ctrl+X

Файл logstash/pipeline/logstash.conf

nano logstash/pipeline/logstash.conf
input {
  beats {
    port => 5044
  }
  tcp {
    port  => 5000
    codec => json_lines
    tags  => ['tcp']
  }
}
 
filter {
  if 'syslog' in [tags] or [type] == 'syslog' {
    grok {
      match => {
        'message' => '%{SYSLOGTIMESTAMP:ts} %{SYSLOGHOST:src_host} %{DATA:prog}(?:\[%{POSINT:pid}\])?: %{GREEDYDATA:msg}'
      }
    }
    date {
      match        => ['ts', 'MMM  d HH:mm:ss', 'MMM dd HH:mm:ss']
      target       => '@timestamp'
      remove_field => ['ts']
    }
  }
}
 
output {
  elasticsearch {
    hosts => ['http://elasticsearch:9200']
    index => 'logstash-%{+YYYY.MM.dd}'
  }
}

Сохраните: Ctrl+O → Enter → Ctrl+X

Проверка структуры

find ~/elk7 -type f

РЕЗУЛЬТАТ

Ожидаемый вывод:

/root/elk7/logstash/pipeline/logstash.conf

/root/elk7/logstash/config/logstash.yml

/root/elk7/.env /root/elk7/docker-compose.yml

Запуск стека

Скачивание образов

cd ~/elk7
docker compose pull

  ПРИМЕЧАНИЕ Скачается ~2 GB. Ожидаемый результат: три строки с Pulled для elasticsearch, logstash, kibana.

Запуск контейнеров

docker compose up -d

РЕЗУЛЬТАТ

Ожидаемый вывод:

✔ Network elk7_elk-net    Created

✔ Volume elk7_esdata      Created

✔ Container elasticsearch Started

✔ Container kibana        Started ✔ Container logstash      Started

Проверка статуса

docker compose ps

  РЕЗУЛЬТАТ

Все три контейнера должны иметь статус Up:

elasticsearch   Up

kibana          Up

logstash        Up

ПРИМЕЧАНИЕ Подождите 1–2 минуты после запуска — Kibana и Logstash проходят внутреннюю инициализацию.

Проверка работоспособности

Elasticsearch

curl -s http://localhost:9200/_cluster/health?pretty
  РЕЗУЛЬТАТ
Ожидаемый ответ — status green или yellow:
{
  "cluster_name" : "elk-cluster",
  "status" : "green",
  "number_of_nodes" : 1,
}

Тестовое событие через Logstash

Установите утилиту ncat если не установлена:

sudo dnf install nmap-ncat -y

Отправьте тестовое JSON-событие по TCP на порт 5000:

echo '{"message":"hello elk","level":"info","app":"test"}' | nc --send-only localhost 5000

ВАЖНО Используйте флаг —send-only вместо -q1 — на Alma Linux 10 флаг -q не поддерживается.

Через 5–10 секунд проверьте что событие появилось в Elasticsearch:

curl -s 'http://localhost:9200/logstash-*/_search?pretty&size=1'
  РЕЗУЛЬТАТ
В ответе должен быть объект с полями:
"message" : "hello elk"
"level" : "info"
"app" : "test"
"_index" : "logstash-YYYY.MM.DD"

Kibana

Откройте в браузере: http://<IP_сервера>:5601

Первоначальная настройка — создание Index Pattern:

  1. Нажмите Explore on my own
  2. В левом меню → Stack Management
  3. Kibana → Index Patterns → Create index pattern
  4. Index pattern name: logstash-*  →  Next step
  5. Time field: @timestamp  →  Create index pattern
  6. Перейти в Analytics → Discover — видны входящие события

ПРИМЕЧАНИЕ Kibana показывает «Ready to try Kibana? First, you need data» — это нормально до первой отправки события. После отправки тестового события через nc страница обновится.

Известные проблемы и решения

Проблемы, выявленные в ходе реальной установки на Alma Linux 10:

Ошибка создания сети Docker

Error: all predefined address pools have been fully subnetted failed to create network elk7_elk-net

Причина: Docker исчерпал пул адресов по умолчанию. Решение — указать подсеть вручную в секции networks файла docker-compose.yml:

docker-compose.yml — секция networks

networks:
  elk-net:
    driver: bridge
    ipam:
      config:
        - subnet: 172.30.0.0/24

Ошибка при создании файлов через heredoc

ВАЖНО

Симптом: команда cat > file << ‘EOF’ записала в файл саму себя вместо содержимого. Причина: heredoc был выполнен в уже открытом файле или с лишними символами.

Решение — всегда использовать nano для создания конфигурационных файлов:

nano имя_файла
# Вставить содержимое
# Сохранить: Ctrl+O → Enter → Ctrl+X
 
# Проверить корректность YAML:
docker compose config --quiet && echo "OK"

Elasticsearch unhealthy при healthcheck

ВАЖНО

Симптом: Container elasticsearch Error — dependency elasticsearch failed to start (unhealthy) При этом Elasticsearch реально работает и отвечает на curl.

Причина: в Docker Compose v5.x символ | в строке healthcheck test обрабатывается иначе — команда grep -q yellow\|green не работает корректно.

Решение — убрать healthcheck из docker-compose.yml и использовать простую зависимость depends_on без condition:

docker-compose.yml

# Вместо:
depends_on:
  elasticsearch:
    condition: service_healthy
 
# Использовать:
depends_on:
  - elasticsearch

ПРИМЕЧАНИЕ Logstash и Kibana имеют встроенный механизм повторных подключений — они сами переподключатся к Elasticsearch когда он будет готов.

nc: invalid option — ‘q’

ВАЖНО Команда echo ‘…’ | nc -q1 localhost 5000 завершается с ошибкой на Alma Linux 10.

Решение — использовать флаг —send-only:

echo '{"message":"test"}' | nc --send-only localhost 5000

Управление стеком

КомандаОписание
docker compose up -dЗапустить все сервисы в фоне
docker compose stopОстановить (данные сохраняются)
docker compose startЗапустить остановленные
docker compose restart [сервис]Перезапустить всё или один сервис
docker compose downУдалить контейнеры (том сохраняется)
docker compose down -vУдалить контейнеры и данные (необратимо!)
docker compose psСтатус контейнеров
docker compose logs -f [сервис]Логи в реальном времени
docker exec -it elasticsearch bashЗайти в контейнер
docker stats —no-streamИспользование CPU и RAM
Стек установлен и проверен
Elasticsearch:  http://<IP>:9200
Kibana UI:      http://<IP>:5601
Logstash Beats: <IP>:5044
Logstash TCP:   <IP>:5000

Оцените статью
IT-Sierra