Graylog на Ubuntu 24.04: пошаговая установка
Когда логов больше пяти серверов, 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 источников |
|---|---|---|
| CPU | 2 vCPU | 4+ vCPU |
| RAM | 4 GB (впритык) | 8-16 GB |
| Диск | 40 GB SSD | от 100 GB SSD, зависит от объёма логов и ретеншена |
| ОС | Ubuntu 24.04 LTS | Ubuntu 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 ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →