MAATRIX / Блог / Как установить и настроить Graylog на VPS

Как установить и настроить Graylog на VPS

MAATRIX

Когда логи разбросаны по десятку серверов и контейнеров, а найти причину сбоя нужно за пять минут, grep по файлам уже не спасает. Graylog собирает логи со всей инфраструктуры в одном месте, даёт полнотекстовый поиск, дашборды и алерты — и в отличие от классического ELK-стека ставится и живёт заметно проще. Дальше — рабочая установка на чистый VPS, от подготовки сервера до первых алертов.

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

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

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

Требования к серверу и подготовка

Graylog — это не одна программа, а связка из трёх компонентов: сам Graylog Server, OpenSearch (хранит и индексирует логи) и MongoDB (хранит конфигурацию — стримы, дашборды, пользователей). Все три любят RAM, и именно её обычно не хватает.

Ориентиры по ресурсам:

НагрузкаRAMCPUДиск
Тест / небольшой проект (до ~5 GB логов/день)4 GB2 ядра40 GB SSD
Продакшен, несколько сервисов8 GB4 ядра100+ GB SSD/NVMe
Много источников, долгое хранение16 GB+4-8 ядерпо объёму хранения

Диск обязательно SSD или NVMe — OpenSearch активно пишет и мержит сегменты индекса, на HDD поиск будет тормозить. Закладывайте запас под рост индексов на 2-3 месяца вперёд.

Систему беру Ubuntu 24.04 LTS — под неё ниже все команды. Перед установкой:

sudo apt update && sudo apt upgrade -y
sudo timedatectl set-timezone Europe/Moscow
sudo apt install -y curl gnupg apt-transport-https ca-certificates pwgen

Синхронизированное время критично: если оно "плывёт", таймстемпы событий будут врать, а поиск по временным диапазонам — ломаться.

OpenSearch требует увеличенного vm.max_map_count, иначе он просто не запустится:

echo "vm.max_map_count=262144" | sudo tee /etc/sysctl.d/99-opensearch.conf
sudo sysctl --system

Устанавливаем зависимости: MongoDB и OpenSearch

Сначала MongoDB. Ставим из официального репозитория, а не из Ubuntu-пакетов — там версия обычно старая:

curl -fsSL https://pgp.mongodb.com/server-7.0.asc | sudo gpg -o /usr/share/keyrings/mongodb-server-7.0.gpg --dearmor
echo "deb [ 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

Проверка: mongosh --eval "db.runCommand({ ping: 1 })" должна вернуть ok: 1.

Дальше OpenSearch — начиная с 5-й ветки Graylog это основной поддерживаемый бэкенд для поиска. Если уже держите отдельный кластер поиска, у нас есть разбор установки OpenSearch на VPS и сравнение OpenSearch и Elasticsearch — для Graylog логика та же.

curl -o- https://artifacts.opensearch.org/publickeys/opensearch.pgp | \
  sudo gpg --dearmor --batch --yes -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

В процессе установки скрипт попросит задать пароль администратора встроенного security-плагина — сохраните его, даже если ниже мы этот плагин отключим.

Правим /etc/opensearch/opensearch.yml. Для одного узла, который слушает только localhost, конфигурацию можно упростить:

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

Отключение security-плагина оправдано только когда порт 9200 недоступен снаружи вообще (см. раздел про безопасность ниже). Если хотите оставить security включённым — пропишите логин/пароль OpenSearch в конфиге Graylog, это тоже поддерживается.

Память под JVM — правило "половина RAM сервера, но не больше 32 GB" в /etc/opensearch/jvm.options.d/heap.options:

-Xms2g
-Xmx2g

Запуск и проверка:

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

В ответ должен прийти JSON с именем кластера и версией OpenSearch.

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

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

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

Устанавливаем и настраиваем Graylog Server

Подключаем официальный репозиторий Graylog (проверьте на docs.graylog.org актуальную ветку — на конец августа 2026 это 6.1):

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

Перед запуском нужно сгенерировать два значения для /etc/graylog/server/server.conf:

# случайная строка не короче 96 символов
pwgen -N 1 -s 96

# хэш пароля администратора
echo -n 'ВАШ_ПАРОЛЬ' | sha256sum

Открываем конфиг и правим ключевые параметры:

sudo nano /etc/graylog/server/server.conf
password_secret = <строка из pwgen>
root_password_sha2 = <хэш из sha256sum>
root_email = admin@example.com
root_timezone = Europe/Moscow

http_bind_address = 127.0.0.1:9000
http_publish_uri = https://graylog.example.com/

elasticsearch_hosts = http://127.0.0.1:9200

mongodb_uri = mongodb://localhost:27017/graylog

http_bind_address смотрит только на localhost — наружу веб-интерфейс отдаст Nginx по HTTPS. http_publish_uri — адрес, под которым Graylog "знает" себя, используется во внутренних ссылках интерфейса.

Запускаем:

sudo systemctl enable --now graylog-server
sudo journalctl -fu graylog-server

Первый старт занимает минуту-две — Graylog создаёт индексы в OpenSearch. В логе должна появиться строка Graylog server up and running. Веб-интерфейс уже отвечает на http://127.0.0.1:9000, но снаружи пока недоступен — это исправим следующим шагом.

Nginx и HTTPS для веб-интерфейса

Ставим Nginx и Certbot, если их ещё нет:

sudo apt install -y nginx certbot python3-certbot-nginx

Конфиг реверс-прокси /etc/nginx/sites-available/graylog:

server {
    listen 80;
    server_name graylog.example.com;

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

        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_read_timeout 300s;
    }
}
sudo ln -s /etc/nginx/sites-available/graylog /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx
sudo certbot --nginx -d graylog.example.com

Заголовки Upgrade/Connection важны — интерфейс использует веб-сокеты, без них он будет работать рывками. После сертификата зайдите на https://graylog.example.com под admin и паролем, который хэшировали выше.

Настройка приёма логов: Syslog и GELF

Логи попадают в Graylog через input'ы — их создают в System → Inputs. Два самых востребованных:

Syslog UDP — для системных логов Linux-серверов (rsyslog умеет слать логи напрямую):

В интерфейсе: Inputs → Syslog UDP → Launch new input, порт 514. На стороне сервера-источника добавьте в /etc/rsyslog.d/graylog.conf:

*.* @@graylog.example.com:514;RSYSLOG_SyslogProtocol23Format

(двойной @@ — это TCP, надёжнее для важных логов; одинарный @ — UDP, быстрее, но без гарантии доставки).

GELF UDP — родной формат Graylog, умеет структурированные поля и особенно удобен для Docker: контейнеры пишут логи прямо через logging-драйвер, без промежуточных файлов.

Создаём input GELF UDP на порту 12201, затем в docker-compose.yml нужного сервиса:

services:
  app:
    image: myapp:latest
    logging:
      driver: gelf
      options:
        gelf-address: "udp://graylog.example.com:12201"
        tag: "myapp"

Такую конфигурацию удобно вынести в общий шаблон логирования и подключать её ко всем сервисам в docker-compose.yml сразу при продакшен-настройке стека.

Firewall для входящих логов открывайте точечно — только нужные порты (514, 12201) и по возможности только с IP источников логов, а не "из интернета":

sudo ufw allow from <IP_источника> to any port 12201 proto udp

Стримы, поиск и алерты

Сырые логи без структуры — просто мусор в базе. Дальше три вещи, которые превращают их в рабочий инструмент.

Стримы (Streams) — правила маршрутизации: логи с определённым полем (например, application: nginx) попадают в отдельный стрим со своим индексом и retention. Создаются в Streams → Create Stream, правила — по совпадению полей source/application/severity.

Поиск — строка запроса поддерживает Lucene-синтаксис:

level:ERROR AND application:payment-service
source:web-01 AND NOT message:"health check"
timestamp:[2026-08-28 TO 2026-08-30] AND status_code:>=500

Сохранённые поиски можно закрепить как виджеты на дашборде — Dashboards → Create new dashboard, дальше перетаскиваете виджеты из результатов поиска.

Алерты (Event Definitions) — условие + уведомление. Например, "больше 20 записей с level:ERROR за 5 минут по стриму payment-service":

Alerts → Event Definitions → Create event definition → Filter & Aggregation, задаёте условие, дальше Notifications — email, HTTP-вебхук (подходит и для Telegram-бота через шлюз), Slack. Алерт без разумного порога быстро превращается в спам, на который перестают реагировать — начинайте с широких условий (5xx, критичные ошибки) и сужайте по мере того, как разберётесь, где в системе реальный сигнал, а где шум.

Если основная задача — не поиск по логам, а метрики и графики, часто разумнее держать Graylog для логов отдельно от Grafana с Prometheus для метрик — это разные по природе данные.

Безопасность, ротация индексов и обслуживание

Firewall. Наружу должны смотреть только 80/443 (Nginx) и порты приёма логов, которые реально нужны (514, 12201 — и то ограниченные по source IP, где возможно). Порты 9000 (Graylog), 9200 (OpenSearch), 27017 (MongoDB) наружу не открывайте вообще:

sudo ufw default deny incoming
sudo ufw allow 22/tcp
sudo ufw allow 80,443/tcp
sudo ufw enable

Ротация и retention. Индексы в OpenSearch растут постоянно, и без ротации диск рано или поздно закончится. В System → Indices задаётся Index Set: rotation strategy (по размеру или времени) и retention — сколько старых индексов хранить перед удалением. Точка старта — ротация раз в сутки, хранение 14-30 индексов, дальше подстраивайте под объём. Общие принципы разобраны в статье про ротацию логов — механика в Graylog та же, просто автоматизирована через UI.

Бэкапы. Конфигурация Graylog (стримы, дашборды, пользователи) живёт в MongoDB — mongodump по расписанию:

mongodump --db graylog --out /backup/mongo/$(date +%F)

Сами логи в OpenSearch бэкапить обычно не нужно — это оперативные данные с ограниченным сроком жизни. Если важна история логов на годы, настройте snapshot-репозиторий OpenSearch отдельно.

Обновления. Graylog, OpenSearch и MongoDB обновляйте по отдельности, сначала на тестовом стенде — при мажорных апгрейдах Graylog иногда требуется миграция схемы индексов.

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

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

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

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

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

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

Сколько реально нужно RAM на старте?

Для теста хватит 4 GB, но впритык — OpenSearch и Graylog оба JVM-приложения и любят память. Для продакшена с несколькими источниками закладывайте от 8 GB.

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

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

Чем это лучше связки ELK/Kibana?

Не "лучше" в абсолютном смысле — Graylog проще в администрировании и сразу даёт готовый UI под логи (стримы, алерты, роли), тогда как ELK гибче, но требует больше ручной настройки Kibana и Logstash.

Как принимать логи с Windows-серверов?

Через NXLog или Winlogbeat, настроенные на отправку в Syslog или GELF input — сам Windows Event Log напрямую в Graylog не льётся, нужен агент-посредник.

Диск быстро заполняется — что делать в первую очередь?

Проверьте retention policy в Index Set (System → Indices) и не льётся ли в Graylog избыточно "болтливый" источник (debug-логи в проде) — его стоит либо отфильтровать на входе, либо перевести на отдельный стрим с коротким retention.

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

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

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