Files
EvoBGP/docs/architecture.md
T
Denozordec 7fac79c2e0
CI / changes (push) Successful in 5s
CI / openapi (push) Has been skipped
CI / go (push) Successful in 19s
CI / bird2 (push) Successful in 15s
CI / docker-images (deploy/docker/bird2/Dockerfile, , evobgp-bird2) (push) Successful in 39s
CI / docker-images (deploy/docker/evobgp-agent/Dockerfile, , evobgp-agent) (push) Successful in 1m7s
CI / docker-images (deploy/docker/evobgp-web/Dockerfile, , evobgp-web) (push) Successful in 56s
CI / docker-images (deploy/docker/evobgp-web/Dockerfile, evobgp-all, evobgp-web-all) (push) Successful in 53s
CI / docker-images (evobgp-all, 1, deploy/docker/gobinary/Dockerfile, , evobgp-all) (push) Successful in 1m26s
CI / docker-images (evobgp-api, 1, deploy/docker/gobinary/Dockerfile, , evobgp-api) (push) Successful in 1m27s
CI / docker-images (evobgp-deploy, 0, deploy/docker/gobinary/Dockerfile, , evobgp-deploy) (push) Successful in 1m31s
CI / docker-images (evobgp-ingest, 0, deploy/docker/gobinary/Dockerfile, , evobgp-ingest) (push) Successful in 1m36s
CI / docker-images (evobgp-node, 0, deploy/docker/gobinary/Dockerfile, , evobgp-node) (push) Successful in 1m20s
CI / docker-images (evobgp-render, 0, deploy/docker/gobinary/Dockerfile, , evobgp-render) (push) Successful in 1m30s
CI / docker-images (evobgp-scheduler, 0, deploy/docker/gobinary/Dockerfile, , evobgp-scheduler) (push) Successful in 1m23s
docs: update README and Docker Compose configurations to clarify usage of pre-built images from the Container Registry, introduce the new microvps-full profile with Web UI, NATS, and Prometheus, and enhance quickstart instructions for improved deployment guidance.
2026-04-05 18:44:47 +07:00

7.5 KiB
Raw Permalink 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 по сокету).

В 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.

Диаграмма: эталонный Compose (reference)

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).

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