Рабочая связка на конец 2026 года: Graylog 6.x, OpenSearch 2.x, MongoDB 6.0 или 7.0 и OpenJDK 17. Graylog принимает и обрабатывает сообщения, OpenSearch хранит индексы и обслуживает поиск, MongoDB держит конфигурацию: пользователей, потоки, правила, дашборды. Java нужна Graylog и OpenSearch, MongoDB работает на собственном движке.
Все три сервиса поднимаются на одном хосте, если поток логов не превышает 10 ГБ в день. При потоке 10-50 ГБ в день выносите OpenSearch на отдельный сервер или хотя бы на отдельный том: индексы активно пишутся, а MongoDB и Graylog в это же время читают свою конфигурацию.
Минимальные требования: 4 vCPU, 8 ГБ RAM, SSD на 50 ГБ под систему и отдельный диск под индексы. Комфортный старт небольшого продакшена: 8 vCPU и 16-32 ГБ RAM. OpenSearch не запустится, пока vm.max_map_count меньше 262144.
| Компонент | Версия | Назначение | Порт по умолчанию |
|---|---|---|---|
| Graylog Server | 6.x | приём, обработка, веб-интерфейс | 9000 (UI и REST), 12201 (GELF), 514 (Syslog) |
| OpenSearch | 2.x | хранение индексов и поиск | 9200 (HTTP), 9300 (transport) |
| MongoDB | 6.0/7.0 | конфигурация Graylog | 27017 |
| OpenJDK | 17 | среда для Graylog и OpenSearch | - |
Что понадобится для установки Graylog в 2026
Если хранилище логов ещё не выбрано, сначала пройдитесь по критериям из материала о централизованном сборе логов в 2026 году: там Graylog, Elastic Stack, OpenSearch и Loki разобраны по ресурсам, сложности эксплуатации и сценариям.
Минимальные требования к серверу и ОС
| Ресурс | Минимум | Для продакшена | Примечание |
|---|---|---|---|
| CPU | 4 vCPU | 8 vCPU | JVM и OpenSearch чувствительны к количеству ядер |
| RAM | 8 ГБ | 16-32 ГБ | минимум 4 ГБ остаётся ОС и файловому кэшу |
| Системный диск | 50 ГБ SSD | 100 ГБ SSD | пакеты, журнал Graylog, логи OpenSearch |
| Диск под индексы | отдельный том | NVMe | растёт пропорционально потоку логов |
| ОС | Ubuntu 22.04 LTS, Debian 12 | Ubuntu 24.04 LTS, RHEL 9, Rocky 9 | пакеты есть для apt и dnf |
Проверьте хост до установки:
nproc
free -h
df -h
lsblk
grep -o avx /proc/cpuinfo | head -1
sysctl vm.max_map_count
Две последние команды важны для MongoDB. Сборки MongoDB 5.0 и новее требуют поддержки инструкций AVX: на Xeon E5 v1/v2 и части старых AMD mongod падает с ошибкой Illegal instruction. Команда grep должна вернуть avx. Пустой вывод означает, что нужен другой хост: ветки MongoDB до 5.0 с Graylog 6.x несовместимы.
Значение vm.max_map_count в большинстве дистрибутивов равно 65530, OpenSearch требует 262144. При меньшем значении узел не проходит bootstrap checks и не стартует.
Матрица совместимости Graylog, OpenSearch и MongoDB
| Graylog | Хранилище индексов | MongoDB | Java |
|---|---|---|---|
| 6.1 | OpenSearch 2.11-2.15 | 6.0, 7.0 | OpenJDK 17 |
| 6.0 | OpenSearch 2.9-2.15 | 6.0, 7.0 | OpenJDK 17 |
| 5.2 | OpenSearch 2.4-2.11 | 5.0, 6.0 | OpenJDK 17 |
| 4.3 | Elasticsearch 7.x, OpenSearch 1.x | 4.4, 5.0 | OpenJDK 11 |
Диапазоны в таблице отражают ветки, совместимость с которыми заявлена для релиза. Перед обновлением минорной версии сверяйтесь с release notes конкретного патча: поддержка новых мажорных версий OpenSearch появляется не в день релиза, а через один-два минорных выпуска Graylog.
Elasticsearch остался вариантом для старых веток Graylog 4.x. Если у вас уже работает Elasticsearch 7.x под Graylog 4.x, миграцию на OpenSearch планируйте одновременно с обновлением Graylog: настроить новый сервер рядом и переключить elasticsearch_hosts получится без простоя.
MongoDB распространяется под лицензией SSPL. Для продакшена держите её на отдельном хосте с ограниченным сетевым доступом: открытый порт 27017 без аутентификации означает потерю всей конфигурации Graylog, включая пользователей и правила маршрутизации.
Подготовка хоста и установка зависимостей
Порядок работ: обновление пакетов, Java 17, параметры ядра, репозитории, затем установка сервисов. Шаг с vm.max_map_count не пропускайте, иначе OpenSearch придётся перенастраивать после первой же ошибки.
Установка Java 17 и проверка версии
Ubuntu и Debian:
apt update
apt upgrade -y
apt install -y openjdk-17-jre-headless curl gnupg lsb-release pwgen
RHEL 9 и Rocky 9:
dnf update -y
dnf install -y java-17-openjdk-headless curl gnupg2 pwgen
Проверка:
java -version
Ожидаемый вывод: openjdk version 17.0.x. Graylog 6.x требует Java 17, Java 21 в этой ветке не поддерживается. Если в системе несколько JDK, переключитесь командой update-alternatives --config java и выберите 17.
Настройка vm.max_map_count и swap
sysctl -w vm.max_map_count=262144
echo "vm.max_map_count=262144" больше /etc/sysctl.d/99-opensearch.conf
sysctl --system
sysctl vm.max_map_count
Отключение swap:
swapoff -a
sed -i '/ swap / s/^/#/' /etc/fstab
free -h
OpenSearch деградирует при свопе: страницы индексов уходят на диск, latency поиска растёт, а при нехватке памяти ядро убивает процесс по OOM. Если swap нужен другим сервисам на хосте, оставьте его и задайте в opensearch.yml параметр bootstrap.memory_lock: true вместе с лимитом памяти в systemd-юните.
Добавление репозиториев MongoDB, OpenSearch и Graylog
Пакеты ставьте только из официальных репозиториев вендоров, не из сторонних PPA. Состав шагов одинаков для всех трёх продуктов: импорт GPG-ключа, файл репозитория, обновление индекса пакетов.
Ubuntu и Debian, общая схема:
1) скачайте GPG-ключ вендора и сохраните его через gpg --dearmor в /usr/share/keyrings/
2) создайте файл репозитория в /etc/apt/sources.list.d/ с атрибутом signed-by на этот ключ
3) apt update
Для MongoDB 7.0 используйте файл /etc/apt/sources.list.d/mongodb-org-7.0.list и ключ /usr/share/keyrings/mongodb-server-7.0.gpg. Для OpenSearch 2.x имя файла opensearch-2.x.list и ключ opensearch.gpg. Для Graylog 6.x достаточно установить пакет репозитория graylog-6.x-repository, он положит ключ и файл списка сам.
RHEL и Rocky:
rpm --import со ключом вендора
создайте /etc/yum.repos.d/mongodb-org-7.0.repo, /etc/yum.repos.d/opensearch-2.x.repo, /etc/yum.repos.d/graylog.repo
dnf makecache
Точные адреса зеркал и актуальные версии пакетов сверяйте на официальных страницах вендоров: здесь приведены пути файлов и состав команд, а внешние ссылки на источники пакетов сознательно не дублируются.
Установка и первичная настройка MongoDB
apt install -y mongodb-org
systemctl enable --now mongod
systemctl status mongod
mongosh --eval 'db.runCommand({ping:1})'
Ответ с ok: 1 подтверждает, что демон слушает порт 27017. В /etc/mongod.conf задайте net.port: 27017 и net.bindIp: 127.0.0.1, затем перезапустите сервис: systemctl restart mongod.
Не открывайте 27017 во внешнюю сеть. Graylog на том же хосте обращается к MongoDB через loopback, доступ извне не нужен. Ролевую модель, TLS и лимиты памяти для mongod разбираем в отдельном руководстве по MongoDB в продакшене.
Создание пользователя и базы для Graylog
Пароль сгенерируйте, а не придумайте:
openssl rand -base64 24
Дальше в mongosh:
use graylog
db.createUser({ user: "graylog", pwd: "ВСТАВЬТЕ_СГЕНЕРИРОВАННЫЙ_ПАРОЛЬ", roles: [ { role: "readWrite", db: "graylog" } ] })
Проверка подключения под новым пользователем:
mongosh -u graylog -p --authenticationDatabase graylog
Роль readWrite на базу graylog даёт Graylog ровно те права, которые нужны: чтение и запись своей конфигурации без доступа к системным базам.
Установка и настройка OpenSearch
apt install -y opensearch
systemctl enable --now opensearch
Настройка opensearch.yml для Graylog
Минимальный набор строк для /etc/opensearch/opensearch.yml:
cluster.name: graylog
node.name: node-1
path.data: /var/lib/opensearch
path.logs: /var/log/opensearch
network.host: 127.0.0.1
http.port: 9200
discovery.type: single-node
bootstrap.memory_lock: true
plugins.security.disabled: true
discovery.type: single-node снимает проверки кворума для одного узла. network.host: 127.0.0.1 закрывает 9200 от сети, Graylog на том же хосте ходит на localhost. cluster.name должен совпадать с тем, что вы потом укажете в elasticsearch_hosts, иначе Graylog не увидит кластер.
plugins.security.disabled: true отключает плагин безопасности OpenSearch. Режим допустим только в закрытом контуре, где 9200 слушает loopback. В продакшене включайте плагин, выпускайте сертификаты для HTTP и transport слоёв и прописывайте логин с паролем в строке подключения Graylog.
Расчёт JVM heap и проверка cluster health
Правило heap: половина RAM, но не более 32 ГБ, выше этого порога JVM перестаёт использовать сжатые указатели. Для хоста с 16 ГБ RAM ставьте -Xms8g -Xmx8g в /etc/opensearch/jvm.options. Значения Xms и Xmx держите равными, иначе JVM будет перераспределять память на старте.
Перезапуск и проверки:
systemctl restart opensearch
curl -s localhost:9200/_cat/nodes?v
curl -s localhost:9200/_cluster/health?pretty
green означает, что все primary и replica шарды размещены. yellow на одиночном узле нормален, если replicas больше нуля: реплику некуда положить, поставьте Replicas: 0 в настройках Index Set Graylog. red показывает потерю primary шардов: проверьте df -h, curl -s localhost:9200/_cat/allocation?v и /var/log/opensearch/opensearch.log. По умолчанию OpenSearch переводит индексы в read-only при заполнении диска на 95%.
Политики жизненного цикла индексов OpenSearch (ISM) и шаблоны индексов описаны в руководстве по сбору логов в OpenSearch.
Установка Graylog и генерация секретов
apt install -y graylog-server, для RHEL и Rocky: dnf install -y graylog-server.
Генерация password_secret и root_password_sha2
pwgen -N 1 -s 96 создаёт 96-символьный password_secret. Альтернатива без pwgen: openssl rand -hex 48. Хеш пароля администратора: echo -n 'ВашПароль' | sha256sum.
password_secret шифрует пароли пользователей и токены API. После первого запуска его менять нельзя: все сохранённые секреты станут нечитаемыми, а пользователи потеряют доступ. root_password_sha2 хранит только SHA-256 хеш пароля admin, сам пароль в конфиг не попадает. Держите оба значения в менеджере секретов, а не в git рядом с конфигами.
Разбор server.conf: ключевые параметры
| Параметр | Что задаёт | Пример значения |
|---|---|---|
| password_secret | соль шифрования паролей и токенов | 96 случайных символов |
| root_password_sha2 | хеш пароля admin | вывод sha256sum |
| root_timezone | часовой пояс интерфейса | UTC |
| http_bind_address | адрес веб-интерфейса | 127.0.0.1:9000 за reverse proxy |
| http_external_uri | внешний URL для ссылок в UI | https://graylog.example.com/ |
| elasticsearch_hosts | адреса OpenSearch | http://127.0.0.1:9200 |
| mongodb_uri | строка подключения к MongoDB | mongodb://graylog:ПАРОЛЬ@127.0.0.1:27017/graylog |
| message_journal_dir | журнал необработанных сообщений | /var/lib/graylog-server/journal |
| journal_size | лимит журнала в байтах | 5 ГБ по умолчанию |
После правки /etc/graylog/server/server.conf запуск и проверка:
systemctl enable --now graylog-server
systemctl status graylog-server
tail -f /var/log/graylog-server/server.log
message_journal_dir выносите на отдельный диск. Когда OpenSearch недоступен, Graylog складывает входящие сообщения в журнал, и на медленном системном разделе он быстро займёт место. Для потока 20 ГБ в день поднимайте journal_size до 20-30 ГБ, чтобы пережить перезапуск хранилища без потери логов.
Первый вход и создание input для syslog и GELF
Веб-интерфейс открывается по адресу сервера на порту 9000, логин admin, пароль из root_password_sha2. Сразу после входа смените этот пароль в меню пользователя.
Syslog UDP input: настройка и проверка
System - Inputs - Select input - Syslog UDP - Launch new input. Заполните поля: Title (например, syslog-udp), Bind address 0.0.0.0, Port 514. Для непривилегированного запуска и контейнеров берите 1514: порты ниже 1024 требуют прав root.
Проверка с другого хоста:
logger -n 127.0.0.1 -P 514 "test message"
В Search ищите запросом message:test или source:*
Если сообщений нет, сначала проверьте firewall: ufw allow 514/udp или, для firewalld, добавьте правило для порта 514/udp с флагом --permanent и перезагрузите правила через firewall-cmd --reload. Второй частый виновник: input слушает 127.0.0.1, а пакеты приходят на внешний интерфейс.
GELF UDP и GELF HTTP: когда что использовать
GELF UDP даёт низкую задержку и не гарантирует доставку: подходит Docker и приложениям, которые шлют много коротких сообщений. GELF HTTP работает по TCP и подходит сервисам, умеющим только HTTP POST, а также скриптам, где важно знать, что сообщение принято.
Подключение Docker-контейнера:
--log-driver gelf --log-opt gelf-address=udp://graylog.example.com:12201
Отправка через curl:
curl -X POST -H "Content-Type: application/json" -d '{"version":"1.1","host":"test","short_message":"hello"}' http://127.0.0.1:12201/gelf
Для GELF HTTP заголовок Content-Type: application/json обязателен, без него Graylog вернёт 400. Проверка UDP-канала: echo "test" | nc -u -w1 127.0.0.1 12201. Маршрутизация по потокам, pipelines и дашборды собраны в отдельном руководстве по Graylog: централизованный сбор и анализ логов.
Ротация индексов и ретенция: чтобы диск не переполнился
По умолчанию Graylog ротирует индекс при достижении 20 ГБ или 30 дней. Для активного потока это слишком крупно: индекс на 20 ГБ долго восстанавливается, а поиск по нему идёт медленнее, чем по нескольким мелким.
Настройка Index Set и rotation strategy
System - Indices - Default index set - Edit. Поля: Index prefix (graylog), Shards, Replicas, Rotation strategy, Rotation period, Max size per index.
| Поток логов в день | Rotation period | Max size per index | Shards |
|---|---|---|---|
| до 5 ГБ | 7 дней | 5 ГБ | 1 |
| 10-50 ГБ | 1 день | 10-20 ГБ | 1-2 |
| больше 50 ГБ | 1 день | 20-30 ГБ | 2-3 |
Стратегия Index Time Size Optimization ротирует индекс при достижении лимита по размеру, но не чаще заданного периода. Для одного узла ставьте Replicas: 0, иначе кластер останется в статусе yellow. Новые параметры применяются к индексам, созданным после сохранения настроек, уже существующие остаются с прежними значениями. Период в один час без причины не ставьте: получите сотни мелких шардов и рост нагрузки на cluster state.
Retention strategy: удаление старых индексов
В том же окне Retention strategy. Варианты: Delete Index, Close Index, Do Nothing. Для продакшена берите Delete Index с ограничением по числу индексов или по возрасту.
Расчёт простой: 30 индексов по одному дню дают 30 дней хранения. Для аудита ставьте 90 индексов, но проверьте запас места: 90 индексов по 10 ГБ это около 900 ГБ диска.
Проверка:
curl -s localhost:9200/_cat/indices?v | grep graylog | wc -l
curl -s localhost:9200/_cat/indices?v | grep graylog
df -h /var/lib/opensearch
Не удаляйте индексы graylog_ напрямую через API OpenSearch. Graylog ведёт собственный список индексов, и ручное удаление оставит в нём ссылки на отсутствующие данные: поиск по диапазону дат начнёт падать с ошибкой, а часть сообщений станет недоступной.
Типовые ошибки первого запуска и как их диагностировать
Graylog не стартует: куда смотреть в первую очередь
systemctl status graylog-server
journalctl -u graylog-server -n 200 --no-pager
tail -n 100 /var/log/graylog-server/server.log
Что искать в выводе:
- упоминание password_secret - параметр пустой или отсутствует в server.conf;
- root_password_sha2 not set - не задан хеш пароля admin;
- Unable to connect to MongoDB - неверный mongodb_uri, остановленный mongod или bindIp без нужного адреса;
- Couldn't connect to Elasticsearch - недоступен 9200 либо в elasticsearch_hosts указан чужой cluster.name;
- Address already in use - порт 9000 занят, проверьте ss -tulpn | grep 9000.
OpenSearch: red/yellow cluster и что с этим делать
Команды диагностики:
curl -s localhost:9200/_cluster/health?pretty
curl -s localhost:9200/_cat/shards?v
curl -s localhost:9200/_cat/allocation?v
df -h
tail -n 100 /var/log/opensearch/opensearch.log
yellow на одиночном узле лечится настройкой Replicas: 0. red означает потерю primary шардов, и причин обычно три: закончилось место на диске, узел убит по OOM, индекс повреждён после аварийного выключения. Освободите место и снимите блокировку записи, после чего дождитесь восстановления шардов.
| Симптом | Причина | Команда проверки | Решение |
|---|---|---|---|
| Graylog не стартует, в логе про password_secret | секрет не задан | journalctl -u graylog-server -n 100 | прописать password_secret в server.conf |
| Ошибка подключения к MongoDB | неверный URI или net.bindIp | systemctl status mongod; mongosh -u graylog -p --authenticationDatabase graylog | исправить mongodb_uri, добавить 127.0.0.1 в bindIp |
| Authentication failed | пароль в URI не совпадает с паролем пользователя | mongosh --authenticationDatabase graylog | пересоздать пользователя graylog или обновить строку подключения |
| OpenSearch не запускается | vm.max_map_count меньше 262144 | sysctl vm.max_map_count | sysctl -w vm.max_map_count=262144 и файл /etc/sysctl.d/99-opensearch.conf |
| Кластер в статусе red | нет места на диске или упал узел | df -h; curl -s localhost:9200/_cat/allocation?v | освободить место, вывести индексы из read-only |
| Input активен, сообщений нет | firewall или неверный Bind address | ss -ulpn | grep 514 | открыть порт, поставить Bind address 0.0.0.0 |
| Порт 9000 занят | конфликт с другим сервисом | ss -tulpn | grep 9000 | сменить http_bind_address |
Минимальная безопасность и продакшн-готовность
Firewall и закрытие портов
Правило простое: 9000 и 9200 доступны только из доверенной сети или через VPN, 514/udp и 12201 принимают трафик только от источников логов, 27017 закрыт полностью.
Ubuntu, ufw:
ufw allow from 10.0.0.0/8 to any port 9000 proto tcp
ufw allow from 10.0.0.0/8 to any port 514 proto udp
ufw allow from 10.0.0.0/8 to any port 12201
ufw deny 9200
ufw deny 27017
ufw enable
RHEL и Rocky, firewalld:
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.0.0.0/8" port port="9000" protocol="tcp" accept'
firewall-cmd --reload
Проверка: ss -tulpn на самом хосте и скан с внешней машины, например nmap -p 9000,9200,27017 graylog.example.com.
Reverse proxy и TLS для Graylog
Пример серверного блока Nginx:
server {
listen 443 ssl http2;
server_name graylog.example.com;
ssl_certificate /etc/letsencrypt/live/graylog.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/graylog.example.com/privkey.pem;
location / {
proxy_pass http://127.0.0.1:9000;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
В server.conf при работе за прокси задайте http_bind_address = 127.0.0.1:9000 и http_external_uri = https://graylog.example.com/. Без http_external_uri ссылки в интерфейсе и в уведомлениях будут вести на внутренний адрес. Проверка: curl -I https://graylog.example.com.
Дальше по списку: смена пароля admin, отдельные роли для чтения логов и администрирования через RBAC, TLS между Graylog и OpenSearch. Плагин безопасности OpenSearch включайте вместе с сертификатами для HTTP и transport слоёв, иначе строку подключения придётся править в момент, когда логи уже идут.
Чек-лист проверки после установки
- systemctl status mongod, opensearch, graylog-server показывают active (running).
- mongosh --eval 'db.runCommand({ping:1})' возвращает ok: 1.
- curl -s localhost:9200/_cluster/health?pretty возвращает green, yellow допустим только при Replicas больше нуля.
- Вход в веб-интерфейс под admin выполнен, пароль изменён.
- Создан минимум один input (Syslog UDP или GELF) со статусом Running.
- Тестовое сообщение найдено в Search по запросу message:test.
- В Index Set заданы rotation period и max size per index.
- Включена retention strategy Delete Index с лимитом по числу индексов.
- curl -s localhost:9200/_cat/indices?v показывает индексы graylog_ с текущей датой.
- Firewall закрывает 9200 и 27017 для внешних адресов, проверено ss -tulpn и сканом с другого хоста.
- Graylog отдаётся по HTTPS через reverse proxy, http_external_uri указывает на внешний домен.
- df -h показывает запас места, а tail -n 200 /var/log/graylog-server/server.log | grep ERROR не выдаёт строк за последние 15 минут.
Начинайте с первых трёх пунктов: если Graylog стартует, а кластер зелёный, останется приёма логов и хранение. Тестовое сообщение отправляйте сразу после создания input, иначе пустой Search не подскажет, где искать проблему: в firewall, в bind address или в конфиге сервера.