Skip to content
ВозможностиДокументацияЦеныПартнёрыPlaygroundFAQ

systemd

Unit files для relay, shield, gateway и агентов

~15 мин чтения

Relay (сервер)

Основной relay-сервис — точка входа для всех агентов. Подключается к PostgreSQL для хранения конфигураций и логов аудита.

ini
1# /etc/systemd/system/flowlink.service
2[Unit]
3Description=FlowLink Relay
4After=network.target postgresql.service
5Wants=postgresql.service
6
7[Service]
8Type=simple
9User=root
10WorkingDirectory=/opt/flowlink
11EnvironmentFile=/etc/default/flowlink
12ExecStart=/opt/flowlink/bin/flowlink-relay relay --config /opt/flowlink/relay.json
13ExecStopPost=/bin/rm -f /run/flowlink.pid
14KillMode=mixed
15TimeoutStopSec=15
16Restart=always
17RestartSec=5
18LimitNOFILE=65536
19ProtectSystem=strict
20ReadOnlyPaths=/opt/flowlink /etc/flowlink
21
22[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 и определяет путь к конфигу.

ini
1# /etc/systemd/system/flowlink-agent@.service
2[Unit]
3Description=FlowLink Agent %i
4After=network.target
5Wants=flowlink.service
6
7[Service]
8Type=simple
9User=root
10WorkingDirectory=/opt/flowlink
11EnvironmentFile=/etc/default/flowlink
12ExecStart=/opt/flowlink/bin/flowlink-agent \
13 --config /opt/flowlink/agent/%i.json
14Restart=always
15RestartSec=5
16LimitNOFILE=32768
17
18[Install]
19WantedBy=multi-user.target

Переопределение для конкретного агента

Если агенту нужен кастомный конфиг или дополнительные лимиты, создайте override:

bash
1# Переопределение для агента «db-primary»
2systemctl edit flowlink-agent@db-primary
ini
1# /etc/systemd/system/flowlink-agent@db-primary.service.d/override.conf
2[Service]
3ExecStart=
4ExecStart=/opt/flowlink/bin/flowlink-agent \
5 --config /etc/flowlink/agents/db-primary.json
6LimitNOFILE=65536
7MemoryMax=512M
8CPUQuota=50%

Shield (eBPF монитор)

FlowLink Shield — eBPF-монитор, который перехватывает системные вызовы и сетевую активность в реальном времени. Требует расширенных capabilities.

ini
1# /etc/systemd/system/flowlink-shield.service
2[Unit]
3Description=FlowLink Shield (eBPF Monitor)
4After=network.target
5Wants=flowlink.service
6
7[Service]
8Type=simple
9User=root
10WorkingDirectory=/opt/flowlink
11EnvironmentFile=/etc/default/flowlink
12ExecStart=/opt/flowlink/bin/flowlink-relay shield \
13 --config /opt/flowlink/shield.json
14Restart=always
15RestartSec=5
16
17# eBPF capabilities
18AmbientCapabilities=CAP_BPF CAP_SYS_ADMIN CAP_PERFMON
19CapabilityBoundingSet=CAP_BPF CAP_SYS_ADMIN CAP_PERFMON
20
21# Socket access
22SocketBindAllow=inet:9093
23SocketBindDeny=any
24
25[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-клиентов. Маршрутизирует запросы к агентам и управляет сессиями.

ini
1# /etc/systemd/system/flowlink-gateway.service
2[Unit]
3Description=FlowLink Gateway
4After=network.target postgresql.service flowlink.service
5Wants=postgresql.service flowlink.service
6
7[Service]
8Type=simple
9User=root
10WorkingDirectory=/opt/flowlink
11EnvironmentFile=/etc/default/flowlink
12ExecStart=/opt/flowlink/bin/flowlink-gateway gateway \
13 --config /opt/flowlink/gateway.json
14Restart=always
15RestartSec=5
16TimeoutStartSec=30
17TimeoutStopSec=15
18
19# Health check
20ExecStartPost=/bin/sleep 3
21ExecStartPost=/usr/bin/curl -sf http://127.0.0.1:LISTEN_PORT:-9081/health || true
22
23[Install]
24WantedBy=multi-user.target

Health check

Gateway предоставляет endpoint /health для проверки состояния. Используйте systemd watchdog для автоматического рестарта при зависаниях:

ini
1# Добавьте в [Service]:
2WatchdogSec=30
3ExecStart=/opt/flowlink/bin/flowlink-gateway gateway \
4 --config /opt/flowlink/gateway.json \
5 --watchdog-notify

Управление

Базовые операции со всеми сервисами FlowLink.

bash
1# Запуск relay
2systemctl enable --now flowlink
3
4# Запуск shield
5systemctl enable --now flowlink-shield
6
7# Запуск gateway
8systemctl enable --now flowlink-gateway
9
10# Запуск агента
11systemctl enable --now flowlink-agent@my-server
12
13# Несколько агентов
14systemctl enable --now flowlink-agent@web-1
15systemctl enable --now flowlink-agent@db-1
16systemctl enable --now flowlink-agent@cache-1
17
18# Статус всех сервисов
19systemctl status flowlink-relay flowlink-shield flowlink-gateway
20systemctl status flowlink-relay-agent@my-server
21
22# Рестарт конкретного сервиса
23systemctl restart flowlink-gateway
24
25# Логи (follow)
26journalctl -u flowlink-relay -f
27journalctl -u flowlink-relay-shield -f
28journalctl -u flowlink-relay-gateway -f
29journalctl -u flowlink-relay-agent@my-server -f
30
31# Логи за последний час
32journalctl -u flowlink-relay --since "1 hour ago"
33
34# Ресурсы (память, CPU)
35systemctl status flowlink-relay | grep -E "Memory|CPU"
36systemd-cgtop | grep flowlink

EnvironmentFile

Все переменные окружения хранятся в одном файле. Каждый unit-файл ссылается на него через EnvironmentFile.

bash
1# /etc/default/flowlink
2# ── Общие ──────────────────────────────
3LOG_LEVEL=info
4RUST_LOG=info,flowlink=debug
5RUST_BACKTRACE=1
6
7# ── Relay ──────────────────────────────
8LISTEN_PORT=9080
9LISTEN_HOST=0.0.0.0
10DB_URL=postgresql://flowlink:secret@127.0.0.1:5432/flowlink
11DB_MAX_CONNECTIONS=20
12
13# ── Gateway ────────────────────────────
14GATEWAY_PORT=9081
15GATEWAY_HOST=0.0.0.0
16GATEWAY_SESSION_TTL=3600
17
18# ── Shield ─────────────────────────────
19SHIELD_PORT=9093
20SHIELD_SAMPLING_RATE=100
21
22# ── TLS ────────────────────────────────
23TLS_CERT=/etc/flowlink/certs/relay.crt
24TLS_KEY=/etc/flowlink/certs/relay.key
25
26# ── Agent ──────────────────────────────
27AGENT_RELAY_URL=https://relay.example.com:9080
28AGENT_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:

bash
1# На хосте агента
2# /etc/default/flowlink
3AGENT_RELAY_URL=https://control-plane.example.com:9080
4TLS_CERT=/etc/flowlink/certs/agent.crt
5TLS_KEY=/etc/flowlink/certs/agent.key
6CA_CERT=/etc/flowlink/certs/ca.crt

Убедитесь, что порты открыты в firewall:

bash
1# Control Plane
2ufw allow 9080/tcp # relay
3ufw allow 9081/tcp # gateway
4
5# Data Plane
6ufw allow 9093/tcp # shield metrics

Ротация логов

FlowLink пишет логи в journald. Настройте persistent storage и лимиты в /etc/systemd/journald.conf:

ini
1# /etc/systemd/journald.conf
2[Journal]
3Storage=persistent
4SystemMaxUse=500M
5SystemMaxFileSize=100M
6MaxRetentionSec=30day
7Compress=yes

Перезапустите journald после изменения конфигурации:

bash
1systemctl restart systemd-journald
2
3# Проверить размер логов FlowLink
4journalctl -u flowlink-relay --disk-usage
5
6# Очистить логи старше 7 дней
7journalctl --vacuum-time=7d

Решение проблем

Permission denied при загрузке eBPF

Shield требует CAP_BPF. Проверьте, что capabilities установлены:

bash
1# Проверить capabilities
2getcap /opt/flowlink/bin/flowlink
3
4# Установить capabilities
5sudo setcap cap_bpf,cap_sys_admin,cap_perfmon+ep \
6 /opt/flowlink/bin/flowlink
7
8# Также проверьте AmbientCapabilities в unit-файле
9systemctl show flowlink-relay-shield -p AmbientCapabilities

Порт уже занят

Если сервис не стартует из-за занятого порта:

bash
1# Узнать, кто занял порт
2ss -tlnp | grep 9080
3
4# Или
5journalctl -u flowlink-relay -n 20 --no-pager
6
7# Изменить порт через EnvironmentFile
8# Отредактируйте /etc/default/flowlink:
9LISTEN_PORT=9090
10systemctl restart flowlink

Не удалось подключиться к PostgreSQL

Проверьте, что PostgreSQL запущен и credentials верные:

bash
1# Статус PostgreSQL
2systemctl status postgresql
3
4# Проверьте подключение
5psql "postgresql://flowlink:secret@127.0.0.1:5432/flowlink" -c "SELECT 1;"
6
7# Проверьте DB_URL в EnvironmentFile
8grep DB_URL /etc/default/flowlink
9
10# Проверьте логи relay на предмет ошибки подключения
11journalctl -u flowlink-relay --since "5 min ago" | grep -i "database\|db\|postgres"

Сервис падает в цикле (restart loop)

Если сервис постоянно рестартится:

bash
1# Кол-во рестартов
2systemctl show flowlink-relay -p NRestarts
3
4# Временная остановка для диагностики
5systemctl stop flowlink
6
7# Запуск вручную для просмотра ошибки
8/opt/flowlink/bin/flowlink-relay relay --config /opt/flowlink/relay.json
Edit this page