MAATRIX / Блог / Graylog на Ubuntu 24.04: пошаговая установка

Graylog на Ubuntu 24.04: пошаговая установка

MAATRIX

Когда логов больше пяти серверов, grep по /var/log через SSH превращается в квест: пока найдёшь нужный файл на нужной машине, инцидент уже забудется. Graylog решает эту задачу — собирает логи со всех источников в одно место, даёт быстрый полнотекстовый поиск и умеет сам стучать в Telegram или почту, если что-то пошло не так. Ниже — установка с нуля на чистой Ubuntu 24.04, без магии и с объяснением, зачем каждый шаг нужен.

Обсудить статью, задать вопрос или начать новую тему

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

Перейти в сообщество →

Что такое Graylog и когда он оправдан

Graylog — это надстройка с собственным веб-интерфейсом над поисковым движком (OpenSearch или Elasticsearch), которая берёт на себя разбор логов, маршрутизацию по потокам (streams), хранение с ротацией и алертинг. По сути это конкурент связки ELK/EFK (Elasticsearch + Logstash/Fluentd + Kibana), но с одним UI вместо трёх компонентов и встроенными алертами без отдельного ElastAlert.

Есть смысл ставить Graylog, если:

  • у вас больше 2-3 серверов и логи нужно смотреть в одном месте, а не бегать по SSH;
  • нужен поиск по логам за секунды, а не zgrep по архивам за полчаса;
  • требуется алерт «если в логе N ошибок за 5 минут — написать в Slack/Telegram»;
  • есть требования по хранению логов (compliance, аудит) с настраиваемым сроком.

Если у вас один сервер и десяток докер-контейнеров — возможно, хватит связки полегче вроде Grafana Loki или Netdata. Graylog оправдан там, где логов действительно много и с ними работает не один человек.

Требования к серверу

Graylog тянет за собой три процесса — MongoDB (метаданные, конфигурация), OpenSearch (хранение и индексация логов) и сам graylog-server (JVM). Это не лёгкий стек, экономить на ресурсах не получится:

РесурсТест/devПродакшен от 5 источников
CPU2 vCPU4+ vCPU
RAM4 GB (впритык)8-16 GB
Диск40 GB SSDот 100 GB SSD, зависит от объёма логов и ретеншена
ОСUbuntu 24.04 LTSUbuntu 24.04 LTS

Ориентир по памяти: под OpenSearch и Graylog обычно уходит по 1-4 GB heap каждому плюс накладные расходы MongoDB и системы — это ориентир, точная цифра зависит от объёма трафика логов и глубины поиска, у вас она может отличаться. Если сомневаетесь, сколько нужно железа — почитайте сколько RAM нужно для Elasticsearch, логика для OpenSearch аналогичная, это форк того же движка.

Дальше всё выполняется от пользователя с правами sudo на свежей Ubuntu 24.04.

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.

Арендовать сервер

Шаг 1. Подготовка системы и установка MongoDB

Обновляем систему и ставим базовые зависимости:

sudo apt update && sudo apt upgrade -y
sudo apt install -y curl gnupg apt-transport-https wget pwgen uuid-runtime

Graylog хранит конфигурацию (не сами логи) в MongoDB. Подключаем официальный репозиторий MongoDB 7.0:

curl -fsSL https://pgp.mongodb.com/server-7.0.asc | \
  sudo gpg -o /usr/share/keyrings/mongodb-server-7.0.gpg --dearmor

echo "deb [ arch=amd64,arm64 signed-by=/usr/share/keyrings/mongodb-server-7.0.gpg ] \
https://repo.mongodb.org/apt/ubuntu noble/mongodb-org/7.0 multiverse" | \
  sudo tee /etc/apt/sources.list.d/mongodb-org-7.0.list

sudo apt update
sudo apt install -y mongodb-org

Запускаем и добавляем в автозагрузку:

sudo systemctl enable --now mongod
sudo systemctl status mongod

Проверить, что сервис живой, можно так: mongosh --eval "db.runCommand({ ping: 1 })" — в ответ должно прийти { ok: 1 }.

Шаг 2. Установка и настройка OpenSearch

Graylog начиная с 5-й ветки использует OpenSearch как хранилище логов вместо Elasticsearch (Elasticsearch тоже поддерживается, но OpenSearch — рекомендуемый и бесплатный вариант). Ставим OpenSearch из официального репозитория:

curl -o- https://artifacts.opensearch.org/publickeys/opensearch.pgp | \
  sudo gpg --dearmor -o /usr/share/keyrings/opensearch-keyring

echo "deb [signed-by=/usr/share/keyrings/opensearch-keyring] \
https://artifacts.opensearch.org/releases/bundle/opensearch/2.x/apt stable main" | \
  sudo tee /etc/apt/sources.list.d/opensearch-2.x.list

sudo apt update
sudo apt install -y opensearch

Точную поддерживаемую ветку OpenSearch для вашей версии Graylog сверьте в таблице совместимости на docs.graylog.org — привязка версий там меняется от релиза к релизу.

Настраиваем /etc/opensearch/opensearch.yml под одноузловую установку:

cluster.name: graylog
node.name: graylog-node-1
network.host: 127.0.0.1
discovery.type: single-node
action.auto_create_index: false
plugins.security.disabled: true

Поле plugins.security.disabled: true отключает встроенный security-плагин OpenSearch — это нормально для локальной установки, где OpenSearch слушает только 127.0.0.1 и наружу не торчит. Если планируете кластер из нескольких нод, security лучше не выключать, а настроить.

Выставляем heap для JVM (правило: не больше 50% RAM сервера и не больше ~31 GB) в /etc/opensearch/jvm.options.d/heap.options:

-Xms2g
-Xmx2g

И системный параметр, без которого OpenSearch не стартует:

echo "vm.max_map_count=262144" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p

Запускаем:

sudo systemctl enable --now opensearch
curl -X GET "localhost:9200" 

В ответ должен прийти JSON с версией кластера — значит, движок жив.

Шаг 3. Установка и первичная настройка Graylog

Подключаем репозиторий Graylog (замените номер ветки на актуальный LTS-релиз с download-страницы graylog.org на момент установки):

wget https://packages.graylog2.org/repo/packages/graylog-6.1-repository_latest.deb
sudo dpkg -i graylog-6.1-repository_latest.deb
sudo apt update
sudo apt install -y graylog-server

Перед стартом нужно сгенерировать секрет и хеш пароля администратора:

pwgen -N 1 -s 96
echo -n "ваш_будущий_пароль" | sha256sum

Первая команда даёт случайную строку для password_secret (используется для подписи сессий, генерировать заново после установки нельзя — слетят все сессии). Вторая — sha256-хеш пароля учётки admin.

Правим /etc/graylog/server/server.conf:

password_secret = <строка из pwgen>
root_password_sha2 = <хеш из sha256sum>
root_timezone = Europe/Moscow

http_bind_address = 0.0.0.0:9000
http_publish_uri = http://ваш-домен-или-ip:9000/

mongodb_uri = mongodb://localhost:27017/graylog

elasticsearch_hosts = http://127.0.0.1:9200

Параметр в конфиге по-прежнему называется elasticsearch_hosts даже при работе с OpenSearch — это унаследованное имя, менять его не нужно.

Запускаем:

sudo systemctl enable --now graylog-server
sudo systemctl status graylog-server

Если сервис не поднялся — первым делом смотрим лог:

sudo journalctl -u graylog-server -f

Типовые причины падения на этом шаге — OpenSearch ещё не готов принимать соединения (Graylog стартует раньше и падает в retry-цикл, обычно самовосстанавливается за 30-60 секунд) или неверный mongodb_uri. Через минуту-две интерфейс должен открыться на http://IP-сервера:9000 с логином admin и вашим паролем.

Шаг 4. Nginx как обратный прокси и SSL

Открывать порт 9000 наружу — плохая идея: HTTP без шифрования, плюс это лишняя точка входа для сканеров. Ставим перед Graylog nginx с сертификатом.

sudo apt install -y nginx

Конфиг /etc/nginx/sites-available/graylog:

server {
    listen 80;
    server_name graylog.ваш-домен.ru;

    location / {
        proxy_pass http://127.0.0.1:9000;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-Server $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        # Graylog использует WebSocket для живого обновления поиска
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}
sudo ln -s /etc/nginx/sites-available/graylog /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx

SSL через certbot:

sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d graylog.ваш-домен.ru

После certbot не забудьте вернуть в server.conf http_publish_uri на https:// и перезапустить graylog-server. И закрыть порт 9000 в фаерволе для внешнего доступа — открытыми наружу оставляем только 80/443. Если ещё не настраивали фаервол на сервере, вот пошаговая настройка ufw с нуля.

Шаг 5. Настраиваем приём логов, потоки и алерты

Свежий Graylog не собирает ничего, пока вы не создали Input — точку приёма логов. Идём в веб-интерфейсе в System → Inputs, выбираем тип (для начала хватит GELF UDP — универсальный JSON-формат Graylog, его понимают rsyslog, Docker, множество библиотек логирования) и жмём Launch new input на нужном узле.

Проверить, что вход принимает данные, можно с любой машины:

echo '{"version": "1.1", "host": "test-host", "short_message": "hello from test"}' | \
  nc -u -w1 ваш-graylog-ip 12201

Сообщение должно появиться в разделе Search буквально сразу.

Дальше — базовая гигиена, без которой продакшен-инсталляция быстро превратится в проблему:

  • Streams (System → Streams) — правила маршрутизации сообщений по потокам. Например, отдельный поток для nginx-логов, отдельный — для логов приложения, с разными правами доступа для разных команд.
  • Index Sets (System → Indices) — здесь настраивается ротация и время хранения. По умолчанию Graylog хранит логи, пока не кончится место, что на боевом сервере обычно плохая идея — задайте явный лимит по размеру или по времени (например, ротация раз в сутки, хранить 14 индексов). Логика та же, что при ротации логов на сервере — только на уровне индексов, а не файлов.
  • Alerts → Event Definitions — условие вроде «больше 20 сообщений с уровнем ERROR за 5 минут в потоке nginx-errors» плюс уведомление (email, HTTP-вебхук в Telegram-бота, Slack). Это и есть основной практический плюс Graylog перед голым ELK — алерты встроены, без отдельного ElastAlert2 или сторонних скриптов.

Для докер-контейнеров логи в Graylog можно отправлять напрямую через gelf-драйвер Docker (--log-driver=gelf --log-opt gelf-address=udp://ваш-ip:12201), без установки агентов внутри контейнеров.

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.

Арендовать сервер

Нужны сами нейросети для контента?

Генерируйте изображения, видео и озвучку нейросетями на falapi.io — десятки моделей в одном окне. Оплата картой РФ и по СБП.

Частые вопросы

Чем Graylog отличается от связки ELK (Elasticsearch + Logstash + Kibana)?

Graylog заменяет Logstash и Kibana своим собственным сборщиком (Inputs/Extractors/Pipelines) и веб-интерфейсом, а хранит данные в OpenSearch или Elasticsearch — то есть компонентов в стеке меньше. Плюс встроенный алертинг из коробки, тогда как в связке с Kibana для алертов обычно ставят ElastAlert отдельно.

Можно использовать Elasticsearch вместо OpenSearch?

Да, Graylog поддерживает обе версии, конфигурация в server.conf та же (elasticsearch_hosts). OpenSearch чаще выбирают из-за лицензии — он полностью открытый, тогда как последние версии Elasticsearch распространяются по более ограничивающей лицензии Elastic. Разница подробнее разобрана в статье OpenSearch или Elasticsearch — что выгоднее.

Сколько ресурсов реально нужно в продакшене?

Зависит от объёма логов в сутки и глубины хранения. Для небольшой инфраструктуры (5-15 серверов, обычные веб-приложения) 8 GB RAM и 4 vCPU обычно достаточно с запасом; если счёт идёт на десятки гигабайт логов в день — потребуется отдельный узел под OpenSearch и больше памяти под heap.

Как отправлять логи с Windows-серверов или из приложений без GELF?

Через Input типа Syslog (UDP/TCP) с rsyslog/nxlog на источнике, либо через Beats-совместимый вход, либо пишите GELF напрямую — библиотеки есть под большинство языков (Python, Java, Go, PHP, Node.js).

Нужен ли отдельный сервер под Graylog или можно на том же, где крутится приложение?

Для теста и небольших проектов можно совместить, но в проде лучше выносить на отдельную машину — OpenSearch агрессивно потребляет RAM и диск, и вы не хотите, чтобы индексация логов конкурировала за ресурсы с основным приложением.

Обсудить статью, задать вопрос или начать новую тему

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

Перейти в сообщество →