Запуск связки Elasticsearch + Logstash + Kibana на Docker Compose
В этой статье мы запустим связку для удобной работы с вашими логами. Для реализации нам понадобится: Elasticsearch - одно из лучших решений по полнотекстовому поиску и фильтрации данных, Logstash - удобный интерфейс к Elasticsearch для записи логов (фильтрация, сбор и трансформация), ну а Kibana - это веб-интерфейс для визуализации и чтения данных из Elasticsearch.
Данную связку мы используем для хранения логов запущенных API на Smappi.
Всю эту связку проще запустить в контейнерах, которые будет контролировать Docker Compose. Для этих целей хорошо подходит проект docker-elk, в который входит всё что нам нужно, настроим его и запустим.
Установка Docker Compose и ELK
Помимо docker.io и docker-compose нам ещё понадобится git:
sudo apt update
sudo apt install docker.io docker-compose git
Теперь скачаем docker-elk:
cd ~
git clone
Я использую свой приватный форк, в котором переопределены настройки для Elasticsearch и Logstash, рекомендую вам иметь тоже свой форк, а не использовать оригинал. Так вы сможете хранить свои изменения и делиться ими со своей командой.
Настройка ELK
Чтобы была возможность работы с Docker от вашего пользователя, необходимо его добавить в группу "docker":
sudo usermod -a -G docker <USERNAME>
Чтобы после перезапуска контейнера не потерялись данные, которые хранятся в Elasticsearch, рекомендую подключить свой Volume. Для этого надо добавить запись в volumes секции elasticsearch файла docker-compose.yml:
services:
elasticsearch:
volumes:
- ./elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml:ro
- <Абсолютный путь до вашего хранилища>elasticsearch/data:/usr/share/elasticsearch/data:rw
Теперь если перезапустить контейнер данные подцепятся к вашему Elasticsearch автоматически.
Запуск ELK
Перейдём в каталог "docker-elk" и запустим команду, которая поднимет нам все 3 сервиса, объединенные в одну сеть:
cd docker-elk
docker-compose up
Если все запустилось без ошибок, то остановим контейнеры по Ctrl+C и ниже напишем service-файл для systemd, чтобы после перезагрузки системы он сам запускал и следил за состоянием запущенных контейнеров.
Настроим Nginx
Сначала создадим htpasswd-файл для Базовой HTTP авторизации. Укажите свой USERNAME и по запросу введите пароль:
echo "<USERNAME>:`openssl passwd -apr1`" > /etc/nginx/htpasswd
Для примера хост для Elasticsearch будет "elastic.example.org", а хост для Kibana "kibana.example.org". Теперь создайте файл /etc/nginx/sites-available/elk.conf и разместите в нём следующее содержимое:
server { listen 80; server_name elastic.example.org kibana.example.org; return 301 } server { listen 443 ssl; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_certificate /etc/nginx/certs/fullchain.pem; # managed by Certbot ssl_certificate_key /etc/nginx/certs/privkey.pem; # managed by Certbot ssl_session_cache shared:SSL:10m; client_max_body_size 20M; server_name elastic.example.org; satisfy any; allow <TRUSTED IP ADDRESS HERE>; # Укажите IP адрес, которому вы доверяете (например соседний сервер откуда вы отправляете запросы к Elastic) allow <LOCAL IP ADDRESS HERE>; # Если вы на одном сервере запустились, то укажите локальный адрес (127.0.0.1, 192.168.0.1 или какой-либо другой, посмотрите через какой интерфейс осуществяется передача данных) # allow 172.17.0.0/24; deny all; auth_basic "closed site"; auth_basic_user_file htpasswd; location / { proxy_pass } } server { listen 443 ssl; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_certificate /etc/nginx/certs/fullchain.pem; # managed by Certbot ssl_certificate_key /etc/nginx/certs/privkey.pem; # managed by Certbot ssl_session_cache shared:SSL:10m; client_max_body_size 20M; server_name kibana.example.org; auth_basic "closed site"; auth_basic_user_file htpasswd; location / { proxy_pass } }
Как получить SSL/TSL ключи читайте мою другую статью "Получаем бесплатный SSL/TLS-сертификат от Let's Encrypt и настраиваем Nginx".
Если по какой-либо причине вы не хотите использовать HTTPS, то можно использовать вот такой конфиг:client_max_body_size 20M; auth_basic "closed site"; auth_basic_user_file htpasswd; server { listen 80; server_name elastic.example.org; location / { proxy_pass } } server { listen 80; server_name kibana.example.org; location / { proxy_pass } }
Создадим симлинк для активации конфига и перезапустим Nginx:
ln -s /etc/nginx/sites-available/elk.conf /etc/nginx/sites-enabled/elk.conf
nginx -s reload
Зайдём браузером по адресу kibana.example.org, вы должны увидеть примерно следующий интерфейс:

Перейдите в Management > Index Patterns и нажмите на кнопку Create Index Pattern, введите "logstash-*" в поле Index pattern, а в качестве значения для поля Time Filter field name укажите "datetime", таким образом вы настроите шаблон для матчинга всех данных от Logstash.
Автозапуск ELK
Создадим service-файл в каталоге systemd:
sudo emacs /etc/systemd/system/docker-compose-elk.service
И внесём следующее содержимое:
[Unit] Description=ELK: Docker Compose Application Service Requires=docker.service After=docker.service [Service] WorkingDirectory=/home/<USERNAME>/docker-elk ExecStart=/usr/bin/docker-compose up ExecStop=/usr/bin/docker-compose down TimeoutStartSec=0 Restart=on-failure [Install] WantedBy=multi-user.target
Теперь активируем и запустим наш сервис:
sudo systemctl enable docker-compose-elk
sudo systemctl start docker-compose-elk
Вы также можете узнать статус, остановить или перезапустить сервис:
sudo systemctl status docker-compose-elk
sudo systemctl stop docker-compose-elk
sudo systemctl restart docker-compose-elk
Не забывайте после каждого изменения service-файла перезапускать systemd:
systemctl daemon-reload
Собственно это всё что требуется знать для начального запуска ELK, свои вопросы можете оставить в комментариях к этой статье.
Комментарии
"надо добавить запись в volumes секции elasticsearch:"
Если у вас свой форк вы бы хоть файл конфигурационный указывали куда это надо добавить
Спасибо, добавил в статье путь к файлу. Про форк не понял, зачем вы его упомянули в предложении?
Ещё бы nginx тоже в тот же стэк впилить
@drros да, было бы удобно
В этой сборке Kibana генерит на elasticsearch огромное число логов, которые не несут никакой полезной нагрузки.
Оставьте свой комментарий