Описание установки 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 (бесплатная)
- Требования
- Характеристики сервера
- Предварительные условия
- Подготовка системы
- Проверка vm.max_map_count
- Проверка Docker
- Создание структуры проекта
- Конфигурационные файлы
- Файл .env
- Файл docker-compose.yml
- Файл logstash/config/logstash.yml
- Файл logstash/pipeline/logstash.conf
- Проверка структуры
- Запуск стека
- Скачивание образов
- Запуск контейнеров
- Проверка статуса
- Проверка работоспособности
- Elasticsearch
- Тестовое событие через Logstash
- Kibana
- Известные проблемы и решения
- Ошибка создания сети Docker
- Ошибка при создании файлов через heredoc
- Elasticsearch unhealthy при healthcheck
- nc: invalid option — ‘q’
- Управление стеком
Требования
Характеристики сервера
| Параметр | Минимум | Рекомендуется |
| ОЗУ | 4 GB | 8 GB и более |
| CPU | 2 ядра | 4 ядра и более |
| Диск | 20 GB | 50–100 GB SSD |
| ОС | Alma Linux 10 | Alma Linux 10 (ядро 6.x) |
| Docker | 20.x и выше | 29.x (проверено) |
Предварительные условия
Перед началом установки на сервере должны быть установлены и запущены:
- Docker Engine (проверено на версии 29.4.0)
- Docker Compose plugin (проверено на версии v5.1.2)
- Доступ к интернету для скачивания образов (~2 GB)
- Пользователь с правами 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:
- Нажмите Explore on my own
- В левом меню → Stack Management
- Kibana → Index Patterns → Create index pattern
- Index pattern name: logstash-* → Next step
- Time field: @timestamp → Create index pattern
- Перейти в 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








