Безопасность

fb-agent: однофайловый агент Fluent Bit для Linux на Go

Управлять Fluent Bit на десятках Linux-серверов — утомительная работа: добавление репозитория, генерация конфига, настройка systemd unit, ротация сертификатов, мониторинг здоровья — всё нужно делать консистентно на каждом хосте. Я написал fb-agent — однофайловый Fluent Bit агент на Go для Linux, который сводит весь этот жизненный цикл к одному статическому бинарнику без зависимостей. Компилируешь один раз, копируешь куда угодно, запускаешь несколько команд — и получаешь полноценный, защищённый mTLS-логовый пайплайн с мониторингом. Исходники опубликованы на GitHub.

Зачем мне понадобился однофайловый агент Fluent Bit

В своей инфраструктурной работе я управляю разнородными Linux-средами — bare-metal, LXC-контейнеры, Docker-хосты, облачные VM. Каждому нужен Fluent Bit: установленный, настроенный под конкретные сервисы (Nginx, PostgreSQL, Redis, Fail2Ban, Docker…), подключённый к центральному VictoriaLogs, и работающий стабильно. Поддерживать Ansible-плейбуки или per-host репозитории конфигов — дорого по времени.

Я хотел альтернативу: один артефакт после go build, который сам устанавливает, сам регистрирует хост, сам восстанавливается после сбоев. Никакого Python, никаких зависимостей от локального пакетного менеджера. Просто бинарник, который знает всё необходимое.

Пять команд: полный жизненный цикл Fluent Bit

Fluent Bit агент на Go для Linux построен вокруг пяти подкоманд, каждая из которых отвечает за отдельную фазу:

  • install — определяет ОС, добавляет официальный репозиторий Fluent Bit (с автоматическим фолбэком trixie → bookworm), устанавливает пакет, автодетектирует запущенные сервисы (SSH, Nginx, PostgreSQL, Redis, Rocket.Chat, Fail2Ban, Docker, HAProxy и 15+ других), генерирует fluent-bit.conf, деплоит enrich.lua, опционально настраивает mTLS, создаёт hardened systemd unit и запускает сервис.
  • register — собирает fingerprint хоста (публичные и приватные IP, открытые порты, железо, обнаруженные сервисы) и отправляет в VictoriaLogs — каждый хост становится видимым в центральном observability-стеке.
  • watchdog — разовая проверка health endpoint Fluent Bit и повтор упавших outputs, удобно как ручная диагностика или лёгкий шаг в cron.
  • daemon — долгоживущий процесс, заменяющий четыре systemd-таймера: watchdog каждые 5 минут, регистрация раз в 24 часа, обновление сертификатов раз в 7 дней, алерт если хост offline больше 6 часов.
  • mTLS — генерирует и подписывает клиентские/серверные сертификаты через чистый Go crypto, без openssl.

Статическая сборка: CGO_ENABLED=0

Ключевое ограничение дизайна — статическая компиляция. Сборка fb-agent — одна команда:

CGO_ENABLED=0 go build -o fb-agent .

Результат — полностью статический ELF-бинарник без зависимостей от glibc, без shared libraries, без интерпретатора — одинаково работающий на amd64 и arm64. Разворачиваешь на свежий Debian 12 minimal, Alpine-контейнер или LXC без полноценного init — и он просто работает.

Для инфраструктур, охватывающих разные архитектуры, этот подход заменяет инструменты управления конфигурацией. Я использую fb-agent в своей ИТ-консалтинговой работе — там, где нужен надёжный log pipeline без операционных накладных расходов.

Конфигурация через переменные окружения

fb-agent настраивается исключительно через ENV — никаких конфиг-файлов, никакого YAML для темплейтинга:

  • VL_HOST / VL_PORT — адрес VictoriaLogs
  • FB_HOSTNAME — переопределить hostname в лог-метках
  • FB_JOB — тип нагрузки: lxc, remote, docker или vm
  • FB_LOG_PATHS — дополнительные пути к логам через запятую
  • FB_GZIP — включить gzip-сжатие на output
  • CF_CLIENT_ID / CF_SECRET — сервисный токен Cloudflare Access для защищённых эндпоинтов

Подход ENV-first отлично интегрируется с Kubernetes, Nomad, директивами EnvironmentFile в systemd и обычными shell-скриптами. Для масштабных развёртываний это разница между 10-минутным роллаутом и многодневным проектом управления конфигурацией — я видел это воочию в своей работе по автоматизации инфраструктуры.

Автодетекция сервисов: 15+ источников логов

Одна из самых полезных фич — автодетекция сервисов во время install. Вместо ручного перечисления сервисов на каждом хосте fb-agent проверяет systemd units, ищет сокеты и сканирует список процессов. Поддерживаемые сервисы:

  • Система: SSH, systemd journal, kernel log, auth.log
  • Веб: Nginx, Apache, HAProxy
  • Базы данных: PostgreSQL, MySQL/MariaDB, Redis, MongoDB
  • Контейнеры: Docker (логи контейнеров + daemon log)
  • Безопасность: Fail2Ban, UFW/iptables
  • Приложения: Rocket.Chat, кастомные пути через FB_LOG_PATHS

Сгенерированный fluent-bit.conf содержит только те inputs, которые реально присутствуют на хосте. Прилагаемый enrich.lua добавляет метаданные хоста (hostname, тип задачи, окружение) как структурированные поля к каждой лог-записи — это делает фильтрацию по хостам в VictoriaLogs тривиальной задачей.

Режим демона: замена четырёх systemd-таймеров

Большинство мониторинговых стеков на базе Fluent Bit накапливают целый кластер systemd-таймеров: для health check, регистрации хоста, обновления сертификатов, алертинга. Управлять четырьмя timer units на каждом хосте — это накладно. Команда daemon объединяет всё в один долгоживущий процесс со встроенным планировщиком:

  • Каждые 5 минут: watchdog + повтор упавших outputs
  • Каждые 24 часа: повторная регистрация fingerprint хоста
  • Каждые 7 дней: обновление mTLS-сертификатов (pure Go, без openssl)
  • Порог алерта: если Fluent Bit offline больше 6 часов — триггер алерта

Запускаешь демон под собственным hardened systemd unit (генерируется при install) — и получаешь самоуправляемый агент логов без зависимости от cron. Именно такой операционной простоты я добиваюсь в инфраструктурных проектах по управлению рисками.

52 автоматические проверки

Репозиторий включает verify.py — тестовый фреймворк с 52 автоматическими проверками, которые валидируют всё: от размера бинарника и статической линковки до корректности конфига, валидности сертификатов и логики планировщика демона. Полный прогон занимает меньше минуты и ловит регрессии до того, как они попадут на продакшн-хосты.

Проект открыт и активно поддерживается. Исходный код, issues и форки — на github.com/razqqm/fb-agent.

FAQ

Работает ли fb-agent на ARM (Raspberry Pi, ARM-серверы)?

Да. Благодаря CGO_ENABLED=0 бинарник компилируется в полностью статический файл для amd64 и arm64. Кросс-компилируешь на любой машине с Go и копируешь результат на ARM-хост — никакой дополнительной настройки.

Можно ли использовать fb-agent без VictoriaLogs?

Команды install и watchdog работают без VictoriaLogs — они настраивают и мониторят Fluent Bit локально. Команды register и daemon требуют установленных VL_HOST и VL_PORT. Если используешь другой бэкенд логов — модифицируй output plugin в сгенерированном fluent-bit.conf.

Как работает обновление mTLS-сертификатов?

fb-agent реализует генерацию и подпись сертификатов полностью через стандартные пакеты Go crypto/tls и crypto/x509 — без openssl, cfssl и внешних CA-инструментов. В режиме демона обновление происходит автоматически каждые 7 дней. Для ручного обновления — запусти fb-agent mTLS напрямую.

Какие дистрибутивы Linux поддерживаются?

Команда install ориентирована на Debian/Ubuntu-дистрибутивы и использует официальный APT-репозиторий Fluent Bit. Сам бинарник запускается на любой Linux-системе, где можно выполнить статический ELF. Фолбэк-логика (trixie → bookworm) обрабатывает крайние случаи с новыми релизами Debian.

Если ты строишь Linux-инфраструктуру и хочешь обсудить архитектуру log pipeline, стратегию observability или безопасность инфраструктуры — напиши мне. Связаться здесь.

Ilya Arestov — Fractional CTO | Dubai Airport Free Zone (DAFZ), Dubai, UAE | Almaty, Zenkov Street 59, Kazakhstan | +971-585-930-600 | https://t.me/getmonolith
Оцените статью