systemd
Unit files для relay, shield, gateway и агентов
~15 мин чтения
Relay (сервер)
Основной relay-сервис — точка входа для всех агентов. Подключается к PostgreSQL для хранения конфигураций и логов аудита.
1# /etc/systemd/system/flowlink.service2[Unit]3Description=FlowLink Relay4After=network.target postgresql.service5Wants=postgresql.service67[Service]8Type=simple9User=root10WorkingDirectory=/opt/flowlink11EnvironmentFile=/etc/default/flowlink12ExecStart=/opt/flowlink/bin/flowlink-relay relay --config /opt/flowlink/relay.json13ExecStopPost=/bin/rm -f /run/flowlink.pid14KillMode=mixed15TimeoutStopSec=1516Restart=always17RestartSec=518LimitNOFILE=6553619ProtectSystem=strict20ReadOnlyPaths=/opt/flowlink /etc/flowlink2122[Install]23WantedBy=multi-user.target
Описание директив
EnvironmentFile=/etc/default/flowlink — подгружает переменные окружения из файла (LISTEN_PORT, DB_URL, LOG_LEVEL и др.) без захламления unit-файла.
LimitNOFILE=65536 — увеличивает лимит открытых файловых дескрипторов. Relay держит много соединений с агентами, поэтому значение по умолчанию (1024) недостаточно.
ProtectSystem=strict — защищает файловую систему: сервис может писать только в /tmp, /var/tmp и указанные через ReadWritePaths директории. Предотвращает случайную или злонамеренную модификацию системных файлов.
ReadOnlyPaths=/opt/flowlink /etc/flowlink — монтирует указанные директории в режиме только для чтения. Конфигурации и бинарники доступны на чтение, но не на запись.
Agent (шаблон)
Template unit позволяет запускать несколько агентов на одном хосте. Имя экземпляра передаётся через %i и определяет путь к конфигу.
1# /etc/systemd/system/flowlink-agent@.service2[Unit]3Description=FlowLink Agent %i4After=network.target5Wants=flowlink.service67[Service]8Type=simple9User=root10WorkingDirectory=/opt/flowlink11EnvironmentFile=/etc/default/flowlink12ExecStart=/opt/flowlink/bin/flowlink-agent \13 --config /opt/flowlink/agent/%i.json14Restart=always15RestartSec=516LimitNOFILE=327681718[Install]19WantedBy=multi-user.target
Переопределение для конкретного агента
Если агенту нужен кастомный конфиг или дополнительные лимиты, создайте override:
1# Переопределение для агента «db-primary»2systemctl edit flowlink-agent@db-primary
1# /etc/systemd/system/flowlink-agent@db-primary.service.d/override.conf2[Service]3ExecStart=4ExecStart=/opt/flowlink/bin/flowlink-agent \5 --config /etc/flowlink/agents/db-primary.json6LimitNOFILE=655367MemoryMax=512M8CPUQuota=50%
Shield (eBPF монитор)
FlowLink Shield — eBPF-монитор, который перехватывает системные вызовы и сетевую активность в реальном времени. Требует расширенных capabilities.
1# /etc/systemd/system/flowlink-shield.service2[Unit]3Description=FlowLink Shield (eBPF Monitor)4After=network.target5Wants=flowlink.service67[Service]8Type=simple9User=root10WorkingDirectory=/opt/flowlink11EnvironmentFile=/etc/default/flowlink12ExecStart=/opt/flowlink/bin/flowlink-relay shield \13 --config /opt/flowlink/shield.json14Restart=always15RestartSec=51617# eBPF capabilities18AmbientCapabilities=CAP_BPF CAP_SYS_ADMIN CAP_PERFMON19CapabilityBoundingSet=CAP_BPF CAP_SYS_ADMIN CAP_PERFMON2021# Socket access22SocketBindAllow=inet:909323SocketBindDeny=any2425[Install]26WantedBy=multi-user.target
Capabilities
CAP_BPF — разрешает загрузку eBPF-программ в ядро. Обязательна для работы Shield.
CAP_SYS_ADMIN — необходима для tracepoint-хуков и perf event-ов. На ядрах ≥ 5.8 можно заменить комбинацией CAP_BPF + CAP_PERFMON.
CAP_PERFMON — позволяет читать perf events и tracepoints. Вместе с CAP_BPF заменяет CAP_SYS_ADMIN на новых ядрах.
Gateway
FlowLink Gateway — единая точка входа для MCP-клиентов. Маршрутизирует запросы к агентам и управляет сессиями.
1# /etc/systemd/system/flowlink-gateway.service2[Unit]3Description=FlowLink Gateway4After=network.target postgresql.service flowlink.service5Wants=postgresql.service flowlink.service67[Service]8Type=simple9User=root10WorkingDirectory=/opt/flowlink11EnvironmentFile=/etc/default/flowlink12ExecStart=/opt/flowlink/bin/flowlink-gateway gateway \13 --config /opt/flowlink/gateway.json14Restart=always15RestartSec=516TimeoutStartSec=3017TimeoutStopSec=151819# Health check20ExecStartPost=/bin/sleep 321ExecStartPost=/usr/bin/curl -sf http://127.0.0.1:LISTEN_PORT:-9081/health || true2223[Install]24WantedBy=multi-user.target
Health check
Gateway предоставляет endpoint /health для проверки состояния. Используйте systemd watchdog для автоматического рестарта при зависаниях:
1# Добавьте в [Service]:2WatchdogSec=303ExecStart=/opt/flowlink/bin/flowlink-gateway gateway \4 --config /opt/flowlink/gateway.json \5 --watchdog-notify
Управление
Базовые операции со всеми сервисами FlowLink.
1# Запуск relay2systemctl enable --now flowlink34# Запуск shield5systemctl enable --now flowlink-shield67# Запуск gateway8systemctl enable --now flowlink-gateway910# Запуск агента11systemctl enable --now flowlink-agent@my-server1213# Несколько агентов14systemctl enable --now flowlink-agent@web-115systemctl enable --now flowlink-agent@db-116systemctl enable --now flowlink-agent@cache-11718# Статус всех сервисов19systemctl status flowlink-relay flowlink-shield flowlink-gateway20systemctl status flowlink-relay-agent@my-server2122# Рестарт конкретного сервиса23systemctl restart flowlink-gateway2425# Логи (follow)26journalctl -u flowlink-relay -f27journalctl -u flowlink-relay-shield -f28journalctl -u flowlink-relay-gateway -f29journalctl -u flowlink-relay-agent@my-server -f3031# Логи за последний час32journalctl -u flowlink-relay --since "1 hour ago"3334# Ресурсы (память, CPU)35systemctl status flowlink-relay | grep -E "Memory|CPU"36systemd-cgtop | grep flowlink
EnvironmentFile
Все переменные окружения хранятся в одном файле. Каждый unit-файл ссылается на него через EnvironmentFile.
1# /etc/default/flowlink2# ── Общие ──────────────────────────────3LOG_LEVEL=info4RUST_LOG=info,flowlink=debug5RUST_BACKTRACE=167# ── Relay ──────────────────────────────8LISTEN_PORT=90809LISTEN_HOST=0.0.0.010DB_URL=postgresql://flowlink:secret@127.0.0.1:5432/flowlink11DB_MAX_CONNECTIONS=201213# ── Gateway ────────────────────────────14GATEWAY_PORT=908115GATEWAY_HOST=0.0.0.016GATEWAY_SESSION_TTL=36001718# ── Shield ─────────────────────────────19SHIELD_PORT=909320SHIELD_SAMPLING_RATE=1002122# ── TLS ────────────────────────────────23TLS_CERT=/etc/flowlink/certs/relay.crt24TLS_KEY=/etc/flowlink/certs/relay.key2526# ── Agent ──────────────────────────────27AGENT_RELAY_URL=https://relay.example.com:908028AGENT_HEARTBEAT_INTERVAL=30
Многоузловой деплой
Для production-окружения рекомендуется развести relay + gateway на отдельный хост, а агенты и shield — на хосты с workload.
Хост 1 — Control Plane
- • flowlink.service (relay)
- • flowlink-gateway.service
- • PostgreSQL
Хост 2..N — Data Plane
- • flowlink-shield.service
- • flowlink-agent@<name>.service
На хостах с агентами укажите адрес relay через AGENT_RELAY_URL в /etc/default/flowlink:
1# На хосте агента2# /etc/default/flowlink3AGENT_RELAY_URL=https://control-plane.example.com:90804TLS_CERT=/etc/flowlink/certs/agent.crt5TLS_KEY=/etc/flowlink/certs/agent.key6CA_CERT=/etc/flowlink/certs/ca.crt
Убедитесь, что порты открыты в firewall:
1# Control Plane2ufw allow 9080/tcp # relay3ufw allow 9081/tcp # gateway45# Data Plane6ufw allow 9093/tcp # shield metrics
Ротация логов
FlowLink пишет логи в journald. Настройте persistent storage и лимиты в /etc/systemd/journald.conf:
1# /etc/systemd/journald.conf2[Journal]3Storage=persistent4SystemMaxUse=500M5SystemMaxFileSize=100M6MaxRetentionSec=30day7Compress=yes
Перезапустите journald после изменения конфигурации:
1systemctl restart systemd-journald23# Проверить размер логов FlowLink4journalctl -u flowlink-relay --disk-usage56# Очистить логи старше 7 дней7journalctl --vacuum-time=7d
Решение проблем
Permission denied при загрузке eBPF
Shield требует CAP_BPF. Проверьте, что capabilities установлены:
1# Проверить capabilities2getcap /opt/flowlink/bin/flowlink34# Установить capabilities5sudo setcap cap_bpf,cap_sys_admin,cap_perfmon+ep \6 /opt/flowlink/bin/flowlink78# Также проверьте AmbientCapabilities в unit-файле9systemctl show flowlink-relay-shield -p AmbientCapabilities
Порт уже занят
Если сервис не стартует из-за занятого порта:
1# Узнать, кто занял порт2ss -tlnp | grep 908034# Или5journalctl -u flowlink-relay -n 20 --no-pager67# Изменить порт через EnvironmentFile8# Отредактируйте /etc/default/flowlink:9LISTEN_PORT=909010systemctl restart flowlink
Не удалось подключиться к PostgreSQL
Проверьте, что PostgreSQL запущен и credentials верные:
1# Статус PostgreSQL2systemctl status postgresql34# Проверьте подключение5psql "postgresql://flowlink:secret@127.0.0.1:5432/flowlink" -c "SELECT 1;"67# Проверьте DB_URL в EnvironmentFile8grep DB_URL /etc/default/flowlink910# Проверьте логи relay на предмет ошибки подключения11journalctl -u flowlink-relay --since "5 min ago" | grep -i "database\|db\|postgres"
Сервис падает в цикле (restart loop)
Если сервис постоянно рестартится:
1# Кол-во рестартов2systemctl show flowlink-relay -p NRestarts34# Временная остановка для диагностики5systemctl stop flowlink67# Запуск вручную для просмотра ошибки8/opt/flowlink/bin/flowlink-relay relay --config /opt/flowlink/relay.json