Деплой Flowlink
Полное руководство по развёртыванию Runtime AI Firewall: Gateway, Relay, Agent и Shield — через Docker, systemd или Kubernetes
~12 мин чтения
Архитектура деплоя
Flowlink состоит из четырёх компонентов. Каждый может разворачиваться независимо на разных узлах кластера.
# Архитектура Flowlink
┌─────────────────────┐
AI-агенты ──────▶│ Gateway (:443) │
(Claude, Cursor) │ HTTP API / MCP │
└─────────┬───────────┘
│
┌─────────▼───────────┐
│ Relay (:9081) │◀──── PostgreSQL
│ Control Plane │ (:5432)
│ + WSS (:9080) │
└──┬──────────────┬───┘
│ │
WSS │ │ WSS
┌─▼───────┐ ┌──▼────────┐
│ Agent 1 │ │ Agent 2 │ ...
│ + Shield│ │ + Shield │
│ (eBPF) │ │ (eBPF) │
└────────┘ └──────────┘
# Компоненты
Gateway — HTTP API / MCP endpoint для AI-агентов (прокси → Relay)
Relay — control plane: маршрутизация, политики, аудит, WSS для агентов
Agent — лёгкий демон на каждом управляемом сервере, подключается через WSS
Shield — eBPF security module, работает на уровне ядра (Linux 5.4+)
Системные требования
Минимальные ресурсы для каждого компонента Flowlink при производственной нагрузке.
| Компонент | CPU | RAM | Диск | Доп. требования |
|---|---|---|---|---|
| Gateway | 2 CPU | 4 GB | 20 GB | PostgreSQL 15+ |
| Relay | 1 CPU | 2 GB | 10 GB | WSS (порт 9080/9081) |
| Agent | 0.5 CPU | 256 MB | 1 GB | macOS / Linux / Windows |
| Shield | — | — | — | Linux, ядро 5.4+, eBPF |
Shield не требует дополнительных ресурсов — работает в пространстве ядра через eBPF. Для HA-деплоя умножьте ресурсы Relay и Gateway на количество инстансов.
Быстрый старт через Docker
Весь стек Flowlink в одном docker-compose. Идеально для staging и быстрого тестирования.
1# docker-compose.yml2version: "3.9"34services:5 db:6 image: postgres:16-alpine7 environment:8 POSTGRES_DB: ${POSTGRES_DB:-flowlink}9 POSTGRES_USER: ${POSTGRES_USER:-flowlink}10 POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-flowlink_secret}11 volumes:12 - pgdata:/var/lib/postgresql/data13 ports:14 - "5432:5432"15 healthcheck:16 test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-flowlink}"]17 interval: 5s18 timeout: 3s19 retries: 102021 relay:22 image: ghcr.io/flow-masters/flowlink-relay:latest23 depends_on:24 db:25 condition: service_healthy26 environment:27 DATABASE_URL: postgres://${POSTGRES_USER:-flowlink}:${POSTGRES_PASSWORD:-flowlink_secret}@db:5432/${POSTGRES_DB:-flowlink}28 RELAY_PORT: 908129 WSS_PORT: 908030 JWT_SECRET: ${JWT_SECRET:-change-me-in-production}31 MCP_MODE: ${MCP_MODE:-gateway}32 SHIELD_ENABLED: ${SHIELD_ENABLED:-true}33 LOG_LEVEL: info34 ports:35 - "9080:9080"36 - "9081:9081"37 restart: unless-stopped3839 gateway:40 image: ghcr.io/flow-masters/flowlink-gateway:latest41 depends_on:42 - relay43 environment:44 RELAY_URL: http://relay:908145 GATEWAY_PORT: 44346 TLS_CERT: /etc/flowlink/certs/cert.pem47 TLS_KEY: /etc/flowlink/certs/key.pem48 ports:49 - "443:443"50 volumes:51 - ./certs:/etc/flowlink/certs:ro52 restart: unless-stopped5354 agent:55 image: ghcr.io/flow-masters/flowlink-agent:latest56 depends_on:57 - relay58 environment:59 RELAY_URL: wss://relay:908060 AGENT_TOKEN: ${AGENT_TOKEN:-generate-via-signup}61 SHIELD_ENABLED: ${SHIELD_ENABLED:-false}62 volumes:63 - /var/run/docker.sock:/var/run/docker.sock64 - /:/host:ro65 privileged: true66 pid: host67 restart: unless-stopped6869volumes:70 pgdata:
1# Запуск2docker compose up -d34# Проверка статуса5docker compose ps67# Логи8docker compose logs -f relay
Ручная установка
Пошаговая установка без Docker. Подходит для production-окружений с systemd или custom orchestration.
Шаг 1 — Установка Gateway
1# 1.1. Скачать бинарник2curl -L https://flowlink.flow-masters.ru/downloads/flowlink-gateway \3 -o /usr/local/bin/flowlink-gateway4chmod +x /usr/local/bin/flowlink-gateway56# 1.2. Создать директории7mkdir -p /etc/flowlink/gateway /etc/flowlink/certs /var/log/flowlink89# 1.3. Конфигурация10cat > /etc/flowlink/gateway/config.toml << 'EOF'11listen_addr = "0.0.0.0:443"12relay_url = "http://127.0.0.1:9081"1314[tls]15cert = "/etc/flowlink/certs/cert.pem"16key = "/etc/flowlink/certs/key.pem"1718[mcp]19mode = "gateway"20max_connections = 102421timeout_ms = 3000022EOF2324# 1.4. Systemd unit25cat > /etc/systemd/system/flowlink-gateway.service << 'EOF'26[Unit]27Description=Flowlink Gateway28After=network.target2930[Service]31Type=simple32ExecStart=/usr/local/bin/flowlink-gateway --config /etc/flowlink/gateway/config.toml33Restart=always34RestartSec=535LimitNOFILE=655353637[Install]38WantedBy=multi-user.target39EOF4041systemctl daemon-reload42systemctl enable --now flowlink-gateway
Шаг 2 — Инициализация базы данных
1# 2.1. Установить PostgreSQL 162apt install -y postgresql-16 # Debian/Ubuntu34# 2.2. Создать базу и пользователя5sudo -u postgres psql << 'SQL'6CREATE DATABASE flowlink;7CREATE USER flowlink WITH PASSWORD 'your_secure_password';8GRANT ALL PRIVILEGES ON DATABASE flowlink TO flowlink;9SQL1011# 2.3. Запустить миграции12flowlink-relay migrate \13 --database-url postgres://flowlink:your_secure_password@127.0.0.1:5432/flowlink1415# 2.4. Проверить16flowlink-relay migrate --status \17 --database-url postgres://flowlink:your_secure_password@127.0.0.1:5432/flowlink
Шаг 3 — Запуск Relay
1# 3.1. Скачать бинарник Relay2curl -L https://flowlink.flow-masters.ru/downloads/flowlink-relay \3 -o /usr/local/bin/flowlink-relay4chmod +x /usr/local/bin/flowlink-relay56# 3.2. Конфигурация7cat > /etc/flowlink/relay/config.toml << 'EOF'8listen_http = "0.0.0.0:9081"9listen_wss = "0.0.0.0:9080"1011[database]12url = "postgres://flowlink:your_secure_password@127.0.0.1:5432/flowlink"13max_connections = 501415[security]16jwt_secret = "your_jwt_secret_at_least_32_chars"17mcp_mode = "gateway"18shield_enabled = true1920[logging]21level = "info"22format = "json"23EOF2425# 3.3. Systemd unit26cat > /etc/systemd/system/flowlink-relay.service << 'EOF'27[Unit]28Description=Flowlink Relay (Control Plane)29After=network.target postgresql.service30Wants=postgresql.service3132[Service]33Type=simple34ExecStart=/usr/local/bin/flowlink-relay --config /etc/flowlink/relay/config.toml35Restart=always36RestartSec=537LimitNOFILE=655353839[Install]40WantedBy=multi-user.target41EOF4243systemctl daemon-reload44systemctl enable --now flowlink-relay
Шаг 4 — Установка Agent на целевые серверы
1# 4.1. Скачать бинарник агента2curl -L https://flowlink.flow-masters.ru/downloads/flowlink \3 -o /usr/local/bin/flowlink-relay4chmod +x /usr/local/bin/flowlink-relay56# 4.2. Регистрация агента на Relay7flowlink-relay signup \8 --relay-url https://relay.example.com:9081 \9 --name "$(hostname)"1011# 4.3. Создать конфиг12mkdir -p /etc/flowlink/agent13cat > /etc/flowlink/agent/$(hostname).json << EOF14{15 "agent_id": "$(hostname)",16 "token": "...",17 "relay_url": "wss://relay.example.com:9093",18 "reconnect_interval": 5,19 "log_level": "info"20}21EOF2223# 4.4. Systemd unit24cat > /etc/systemd/system/flowlink-agent.service << 'EOF'25[Unit]26Description=Flowlink Agent27After=network-online.target28Wants=network-online.target2930[Service]31Type=simple32ExecStart=/usr/local/bin/flowlink-agent --config /etc/flowlink/agent/$(hostname).json33Restart=always34RestartSec=53536[Install]37WantedBy=multi-user.target38EOF3940systemctl daemon-reload41systemctl enable --now flowlink-agent4243# 4.5. Проверить подключение44systemctl status flowlink-agent45journalctl -u flowlink-agent --no-pager -n 20
Шаг 5 — Включение Shield (опционально, только Linux)
1# 5.1. Проверить поддержку eBPF2uname -r # должен быть 5.4+34# 5.2. Загрузить Shield модуль5flowlink-relay shield --load67# 5.3. Добавить в конфиг агента8cat >> /etc/flowlink/agent/$(hostname).json << 'EOF'9,10 "shield": {11 "enabled": true,12 "mode": "enforce",13 "rules_path": "/etc/flowlink/shield/rules.yaml"14 }15EOF1617# 5.4. Перезапустить агент18systemctl restart flowlink-agent1920# 5.5. Проверить статус Shield21flowlink-relay shield --status
Переменные окружения
Все переменные могут быть заданы через .env файл или переданы напрямую в Docker/systemd.
| Переменная | Обязательная | По умолчанию | Описание |
|---|---|---|---|
| DATABASE_URL | Да | — | PostgreSQL connection string |
| RELAY_URL | Да | — | URL Relay для Gateway/Agent (http или wss) |
| JWT_SECRET | Да | — | Секрет для подписи JWT-токенов (минимум 32 символа) |
| MCP_MODE | Нет | gateway | gateway | proxy | embedded |
| SHIELD_ENABLED | Нет | true | Включить eBPF Shield модуль |
| LOG_LEVEL | Нет | info | trace | debug | info | warn | error |
| GATEWAY_PORT | Нет | 443 | Порт прослушивания Gateway |
| RELAY_PORT | Нет | 9081 | HTTP порт Relay |
| WSS_PORT | Нет | 9080 | WebSocket порт Relay |
| AGENT_TOKEN | Да* | — | *Только для Agent. Получается при signup |
| TLS_CERT | Нет | — | Путь к TLS сертификату |
| TLS_KEY | Нет | — | Путь к приватному ключу TLS |
SSL/TLS
Все соединения между компонентами Flowlink должны быть зашифрованы. TLS обязателен для WSS подключений агентов и рекомендуется для HTTP API.
Конфигурация TLS для Relay
1# /etc/flowlink/relay/config.toml23[tls]4cert = "/etc/flowlink/certs/relay.example.com.pem"5key = "/etc/flowlink/certs/relay.example.com.key"67# Минимальная версия TLS8min_version = "1.2"9# Принудительное использование HTTPS (HSTS)10hsts_max_age = 31536000
Let's Encrypt (автоматическое)
1# Установка certbot2apt install -y certbot34# Получить сертификат5certbot certonly --standalone -d relay.example.com -d gateway.example.com67# Скопировать в директорию Flowlink8cp /etc/letsencrypt/live/relay.example.com/fullchain.pem /etc/flowlink/certs/relay.example.com.pem9cp /etc/letsencrypt/live/relay.example.com/privkey.pem /etc/flowlink/certs/relay.example.com.key1011# Автообновление через cron12(crontab -l 2>/dev/null; echo "0 3 * * * certbot renew --quiet && systemctl restart flowlink-relay flowlink-gateway") | crontab -
mTLS для Agent ↔ Relay
1# На стороне Relay — обязательно проверять сертификаты клиентов23[tls]4cert = "/etc/flowlink/certs/relay.pem"5key = "/etc/flowlink/certs/relay.key"6ca_cert = "/etc/flowlink/certs/ca.pem"7client_auth = "require"
1// На стороне Agent — в конфиге агента:2{3 "relay_url": "wss://relay.example.com:9080",4 "tls": {5 "cert": "/etc/flowlink/agent/agent.pem",6 "key": "/etc/flowlink/agent/agent.key",7 "ca_cert": "/etc/flowlink/agent/ca.pem"8 }9}
High Availability
Flowlink поддерживает горизонтальное масштабирование Relay и Gateway. Для production рекомендуется минимум 2 инстанса каждого компонента.
# HA Topology
┌──── Load Balancer (L4) ────┐
│ :443 / :9081 │
└──┬──────────────────┬──────┘
│ │
┌─────▼─────┐ ┌─────▼─────┐
│ Gateway 1 │ │ Gateway 2 │
└─────┬─────┘ └─────┬─────┘
│ │
┌─────▼─────┐ ┌─────▼─────┐
│ Relay 1 │ │ Relay 2 │
└─────┬─────┘ └─────┬─────┘
│ │
┌────────▼──────────────────▼────────┐
│ PostgreSQL (Primary) ◀─ (Replica)
└─────────────────────────────────────┘
Multi-Relay через Kubernetes
1# relay-deployment.yaml2apiVersion: apps/v13kind: Deployment4metadata:5 name: flowlink-relay6spec:7 replicas: 38 selector:9 matchLabels:10 app: flowlink-relay11 template:12 metadata:13 labels:14 app: flowlink-relay15 spec:16 containers:17 - name: relay18 image: ghcr.io/flow-masters/flowlink-relay:latest19 ports:20 - containerPort: 908021 - containerPort: 908122 env:23 - name: DATABASE_URL24 valueFrom:25 secretKeyRef:26 name: flowlink-secrets27 key: database-url28 - name: JWT_SECRET29 valueFrom:30 secretKeyRef:31 name: flowlink-secrets32 key: jwt-secret33 livenessProbe:34 httpGet:35 path: /health36 port: 908137 initialDelaySeconds: 1038 periodSeconds: 1539 readinessProbe:40 httpGet:41 path: /ready42 port: 908143 initialDelaySeconds: 544 periodSeconds: 1045---46apiVersion: v147kind: Service48metadata:49 name: flowlink-relay50spec:51 selector:52 app: flowlink-relay53 ports:54 - name: http55 port: 908156 targetPort: 908157 - name: wss58 port: 908059 targetPort: 908060 type: ClusterIP
Репликация PostgreSQL
1# На primary-сервере postgresql.conf:2wal_level = replica3max_wal_senders = 54wal_keep_size = 1GB5hot_standby = on67# pg_hba.conf — разрешить репликацию:8host replication flowlink_replica 10.0.0.0/8 scram-sha-256910# На replica-сервере:11pg_basebackup -h primary.example.com -U flowlink_replica \12 -D /var/lib/postgresql/16/main -Fp -Xs -P -R1314# Рекомендуется Patroni или Stolon для авто-failover
Load Balancing
Используйте L4 load balancer (HAProxy, nginx stream, AWS NLB) для распределения трафика. WSS соединения sticky по IP или cookie.
1# nginx stream proxy — sticky sessions по IP2stream {3 upstream relay_wss {4 hash $remote_addr consistent;5 server relay1:9080;6 server relay2:9080;7 server relay3:9080;8 }910 server {11 listen 9093;12 proxy_pass relay_wss;13 proxy_timeout 86400s;14 }15}
Обновление
Flowlink поддерживает zero-downtime обновление. Следуйте строгому порядку для минимизации простоя.
# Порядок обновления (zero-downtime)
1. Agents — rolling restart (переподключаются автоматически)
2. Relay — rolling restart через K8s / systemctl
3. Gateway — rolling restart (HTTP drain gracefully)
4. Database — run migrations (backward compatible)
Ручное обновление (systemd)
1#!/bin/bash2# upgrade-flowlink.sh3set -euo pipefail45# 1. Rolling restart агентов6for host in agent-node-1 agent-node-2; do7 ssh "$host" "systemctl restart flowlink-agent"8done9sleep 51011# 2. Обновление Relay12curl -L https://flowlink.flow-masters.ru/downloads/flowlink-relay \13 -o /usr/local/bin/flowlink-relay-new14chmod +x /usr/local/bin/flowlink-relay-new15mv /usr/local/bin/flowlink-relay /usr/local/bin/flowlink-relay.bak16mv /usr/local/bin/flowlink-relay-new /usr/local/bin/flowlink-relay17systemctl restart flowlink-relay18sleep 31920# 3. Обновление Gateway21curl -L https://flowlink.flow-masters.ru/downloads/flowlink-gateway \22 -o /usr/local/bin/flowlink-gateway-new23chmod +x /usr/local/bin/flowlink-gateway-new24mv /usr/local/bin/flowlink-gateway /usr/local/bin/flowlink-gateway.bak25mv /usr/local/bin/flowlink-gateway-new /usr/local/bin/flowlink-gateway26systemctl restart flowlink-gateway2728# 4. Запуск миграций29flowlink-relay migrate \30 --database-url "postgres://flowlink:pass@127.0.0.1:5432/flowlink"3132# Обновление завершено
Kubernetes Rolling Update
1# Обновить образ Relay2kubectl set image deployment/flowlink-relay \3 relay=ghcr.io/flow-masters/flowlink-relay:1.2.045# Следить за rollout6kubectl rollout status deployment/flowlink-relay78# Откат при необходимости9kubectl rollout undo deployment/flowlink-relay
Бэкап и восстановление
Регулярные бэкапы критически важны. Flowlink хранит все состояния в PostgreSQL и конфигурационных файлах.
Бэкап базы данных
1#!/bin/bash2# ежедневный бэкап PostgreSQL34BACKUP_DIR="/var/backups/flowlink"5DATE=$(date +%Y-%m-%d_%H%M%S)6RETENTION_DAYS=307mkdir -p "$BACKUP_DIR"89# Полный бэкап10pg_dump -Fc -h 127.0.0.1 -U flowlink -d flowlink \11 > "$BACKUP_DIR/flowlink_$DATE.dump"12gzip -f "$BACKUP_DIR/flowlink_$DATE.dump"13find "$BACKUP_DIR" -name "flowlink_*.dump.gz" -mtime +"$RETENTION_DAYS" -delete
Бэкап конфигурации
1#!/bin/bash2# Бэкап всех конфигов Flowlink34BACKUP_DIR="/var/backups/flowlink/config"5DATE=$(date +%Y-%m-%d_%H%M%S)6mkdir -p "$BACKUP_DIR"78tar czf "$BACKUP_DIR/flowlink-config_$DATE.tar.gz" \9 /etc/flowlink/ \10 /etc/systemd/system/flowlink-*.service
Восстановление
1#!/bin/bash2# Восстановление из бэкапа3BACKUP_FILE="/var/backups/flowlink/flowlink_2026-05-15_030000.dump.gz"45# 1. Остановить сервисы6systemctl stop flowlink-agent flowlink-gateway flowlink-relay78# 2. Восстановить базу данных9gunzip -c "$BACKUP_FILE" | pg_restore \10 -h 127.0.0.1 -U flowlink -d flowlink \11 --clean --if-exists1213# 3. Проверить целостность14flowlink-relay migrate --status \15 --database-url "postgres://flowlink:pass@127.0.0.1:5432/flowlink"1617# 4. Запустить сервисы18systemctl start flowlink-relay19sleep 320systemctl start flowlink-gateway21systemctl start flowlink-agent
Состояние агента
Agent stateless — вся конфигурация хранится в JSON-файле и на Relay. При потере агента достаточно переподписать его через flowlink-relay signup и скопировать конфиг.