Files
EvoBGP/docs/architecture.md
T
Denozordec 7a3eae98b1
CI / changes (push) Successful in 12s
CI / commitlint (push) Has been skipped
CI / openapi (push) Successful in 25s
CI / web (push) Successful in 46s
CI / go (push) Successful in 1m15s
CI / bird2 (push) Successful in 18s
CI / release (push) Successful in 3m59s
feat(firewall): implement firewall blocklist feature with client management and policy rules
Introduced a comprehensive firewall blocklist feature, allowing for the management of firewall clients and their associated rules. This includes endpoints for enrolling clients, listing clients and rules, and reporting apply statuses. Enhanced the API to support firewall operations, including the ability to handle block/accept policies. Updated the documentation to reflect these changes and added necessary components in the web UI for better user interaction.

Additionally, modified the agent server to support firewall failover and integrated firewall functionality into the existing architecture.
2026-07-08 16:37:27 +07:00

8.1 KiB
Raw Blame History

Архитектура EvoBGP

Высокоуровневое описание компонентов и потоков. Детальный продуктовый и инфраструктурный чертёж также зафиксирован во внутреннем плане репозитория: .cursor/plans/evobgp_архитектура_0e73ef02.plan.md (удобно для истории решений; пользовательская навигация — через этот раздел и overview.md).

Назначение слоёв

  • Control plane — HTTP API, хранилище состояния (PostgreSQL), фоновые задачи (jobs), подпись артефактов (бандлы), observability.
  • Data plane — демон BIRD, локальные конфиги в /etc/bird, сокет управления birdc, агент evobgp-agent для наблюдения/сопутствующих действий.
  • Edge интеграция — CLI evobgp-node на машине спикера: получение бандла по API, проверка подписи, применение конфигурации.

Компоненты (бинарники cmd/)

Бинарник Роль
evobgp-api Только HTTP API и связанная логика в одном процессе.
evobgp-all Тот же API + in-process scheduler (очередь module_refresh в общем Registry), ingest (prefetch ETag CDN), render (опционально auto-publish), deploy (лог расхождений published/applied).
evobgp-scheduler По refresh_interval_sec ставит refresh: в одном процессе с API — через jobs.Registry; в reference Compose — HTTP POST /v1/modules/{id}/refresh (EVOBGP_CONTROL_PLANE_URL, EVOBGP_SCHEDULER_BEARER).
evobgp-ingest Периодический conditional GET по URL CDN-источников и обновление etag в БД.
evobgp-render По умолчанию только heartbeat; при EVOBGP_RENDER_AUTOPUBLISH=1 выставляет всем спикерам tenant последнюю ревизию (упрощение для демо).
evobgp-deploy Периодически логирует drift: last_applied_revision_id vs опубликованная ревизия для ноды.
evobgp-node CLI реплики: pull-bundle, verify-bundle, apply-bundle.
evobgp-agent Локальный агент рядом с BIRD: watch, serve (Panel→Node sync API на реплике).

В Docker Compose профиль reference запускает отдельные контейнеры под evobgp-api и четыре воркера; профиль microvps использует один контейнер evobgp-all.

Пакеты internal/ (сжатая карта)

Пакет Назначение
httpapi Маршруты REST, аутентификация, CORS, привязка к store и jobs.
store Абстракция бэкенда данных; реализации в памяти и через репозиторий.
repository Доступ к PostgreSQL, сущности и миграции на уровне приложения.
db Подключение к БД и применение миграций.
jobs Реестр и выполнение асинхронных задач, связанных с API.
bundle Упаковка и проверка бандлов для нод.
signing Криптографическая проверка подписей.
birdfmt Форматирование и фрагменты конфигурации BIRD, вызовы birdc.
birddeploy Логика применения конфигурации к BIRD (используется в цепочке деплоя).
config Переменные окружения EVOBGP_*.
observability Метрики Prometheus, HTTP middleware.
broker Опциональный EVOBGP_BROKER_URL для будущей шины; сейчас задачи только in-process (jobs.Registry), пакет лишь логирует факт настройки URL.
pipeline Ingest+render в одном шаге для module_refresh: выборка префиксов (CDN/AS/IP/пустые DOMAINS), CreateRenderRevision, превью BIRD через birdfmt.
nodedispatch Panel→Node HTTP wake-up (POST /v1/agent/sync) после deploy_apply.
agentserver HTTP API на реплике (serve): sync + health для Traefik; опционально firewall failover (/v1/firewall/*).
firewall Вычисление policy block/accept → плоский CIDR blocklist.

Удалённые спикеры

Реплики на отдельных VPS: remote-speakers.md. CP публикует ревизию и при EVOBGP_NODE_DISPATCH_ENABLED=1 будит agent; agent тянет signed bundle и применяет BIRD. Compose: deploy/compose/docker-compose.remote-speaker.yaml.

flowchart LR
  subgraph clients [Clients]
    WebUI[Web_UI]
    Operator[Operator_API_client]
    NodeCLI[evobgp_node]
  end
  subgraph control [Control_plane]
    API[evobgp_api]
    Sched[evobgp_scheduler]
    Ingest[evobgp_ingest]
    Render[evobgp_render]
    Deploy[evobgp_deploy]
    PG[(PostgreSQL)]
  end
  subgraph data [Data_plane]
    BIRD[BIRD2]
    Agent[evobgp_agent]
  end
  WebUI --> API
  Operator --> API
  NodeCLI --> API
  API --> PG
  Sched -->|HTTP_or_DB| API
  Sched --> PG
  Ingest --> PG
  Render --> PG
  Deploy --> PG
  Agent --> BIRD

Очередь задач по-прежнему in-memory в процессе API (jobs.Registry); отдельный контейнер evobgp-scheduler не разделяет память с API и дергает refresh по HTTP. Полноценный брокер (NATS) и общая очередь job_audit между процессами — в следующих итерациях.

Диаграмма: microvps (evobgp-all)

flowchart LR
  Client[HTTP_clients]
  All[evobgp_all_process]
  PG[(PostgreSQL)]
  BIRD[BIRD2]
  Client --> All
  All --> PG
  All --> BIRD

Внутри evobgp-all все воркеры используют тот же store и jobs.Registry, что и HTTP handlers, поэтому module_refresh выполняется в том же процессе без HTTP.

Профиль Compose microvps-full добавляет к этому стеку Web UI (nginx → evobgp-all), NATS и Prometheus без отдельных контейнеров воркеров (функционально то же, что отдельные scheduler/ingest/… в reference). Запуск и лимиты под ~1 ГиБ RAM — в quickstart.md.

Поток: ревизия и бандл для ноды

  1. Оператор (роль operator или выше по политике) изменяет модули и запускает цепочку, приводящую к новой ревизии (часть шагов может быть асинхронной через jobs — см. OpenAPI).
  2. Control plane формирует подписанный бандл для пары спикер + ревизия.
  3. evobgp-node pull-bundle с ключом роли node запрашивает GET /v1/speakers/{id}/revisions/latest и затем GET /v1/speakers/{id}/bundle/{revision_id}.
  4. Локально выполняется проверка подписи (публичный ключ выдаётся при старте API) и применение к BIRD (apply-bundle).

Связанные документы