Added public HTTPS endpoints for firewall installation and enrollment scripts, allowing access without API keys. Updated the URL handling in the firewall code to ensure all suggested control plane URLs are served over HTTPS. Enhanced documentation to reflect the new public endpoints and their usage. Updated tests to verify the correct behavior of the new URL handling logic.
18 KiB
Быстрый запуск
Примеры команд для PowerShell. Репозиторий: корень EvoBGP, Docker Compose лежит в deploy\compose.
Требования
- Docker с поддержкой Compose v2 — для готового стека.
- Go 1.22+ (версию см. в
go.mod) — для локального запуска бинарников из исходников. - Node.js и npm — для разработки веб-интерфейса в
web/. - PostgreSQL — если запускаете API вне Compose; строка подключения в
EVOBGP_DATABASE_URL.
Готовые образы без сборки (Container Registry Gitea)
После успешного CI (push в main или master) образы публикуются в Container Registry вашего Gitea. В workflow зафиксирован хост реестра git.shts.su; имя владельца в пути образа — в нижнем регистре, как у github.repository_owner в CI (например, пользователь Denozord → префикс denozord).
Шаблон имени и теги
git.shts.su/<owner>/<имя_образа>:<тег>
Теги: latest, короткий SHA коммита (7 символов), sha-<полный_sha> — см. .gitea/README.md.
Платформа образов из CI: linux/amd64 (на другой архитектуре pull пройдёт, но запуск может быть невозможен без своей сборки).
Вход в реестр (если пакеты не публичные)
На сервере или в PowerShell перед docker pull:
docker login git.shts.su
Укажите учётную запись Gitea и PAT / пароль приложения с правом чтения пакетов (или токен, который принимает ваш реестр).
Ссылки и команды docker pull
Ниже пример для владельца denozord — замените сегмент пути на своего владельца репозитория в нижнем регистре. В веб-интерфейсе все контейнерные пакеты можно открыть разом: список пакетов denozord на git.shts.su. Если прямая ссылка на версию latest не открывается (зависит от версии Gitea), откройте общий список пакетов и выберите нужный образ по имени.
| Образ | Назначение | Страница пакета (пример) | Pull |
|---|---|---|---|
evobgp-api |
HTTP API (с birdc в образе) |
packages/…/evobgp-api | docker pull git.shts.su/denozord/evobgp-api:latest |
evobgp-all |
Монолит microVPS: API + in-process воркеры scheduler/ingest/render/deploy | packages/…/evobgp-all | docker pull git.shts.su/denozord/evobgp-all:latest |
evobgp-scheduler |
Планировщик (reference) | packages/…/evobgp-scheduler | docker pull git.shts.su/denozord/evobgp-scheduler:latest |
evobgp-ingest |
Ingest CDN / ETag | packages/…/evobgp-ingest | docker pull git.shts.su/denozord/evobgp-ingest:latest |
evobgp-render |
Render | packages/…/evobgp-render | docker pull git.shts.su/denozord/evobgp-render:latest |
evobgp-deploy |
Deploy | packages/…/evobgp-deploy | docker pull git.shts.su/denozord/evobgp-deploy:latest |
evobgp-node |
Нода на площадке | packages/…/evobgp-node | docker pull git.shts.su/denozord/evobgp-node:latest |
evobgp-web |
Статика UI + nginx (прокси на evobgp-api) | packages/…/evobgp-web | docker pull git.shts.su/denozord/evobgp-web:latest |
evobgp-web-all |
Тот же UI, прокси на evobgp-all (профиль microvps-full) |
packages/…/evobgp-web-all | docker pull git.shts.su/denozord/evobgp-web-all:latest |
evobgp-agent |
Агент (bird2 в образе) | packages/…/evobgp-agent | docker pull git.shts.su/denozord/evobgp-agent:latest |
evobgp-bird2 |
Только BIRD2 | packages/…/evobgp-bird2 | docker pull git.shts.su/denozord/evobgp-bird2:latest |
На Linux-сервере команды docker pull и docker login такие же (выполняйте в обычном shell).
Запуск контейнера с готового образа (минимум)
После pull, например только API (порты и переменные подставьте свои):
docker run --rm -p 8080:8080 `
-e EVOBGP_DATABASE_URL="postgres://user:pass@host:5432/evobgp?sslmode=disable" `
-e EVOBGP_HTTP_ADDR=":8080" `
git.shts.su/denozord/evobgp-api:latest
Compose в deploy/compose поднимает стек только из образов реестра (image:, без локальной сборки). Префикс и тег задаются через .env рядом с compose-файлами (шаблон — deploy/compose/.env.example): EVOBGP_REGISTRY=git.shts.su/<owner> (владелец в нижнем регистре), EVOBGP_IMAGE_TAG=latest или SHA. Перед первым запуском: docker login git.shts.su, затем docker compose pull и docker compose ... up -d. Имена пакетов и CI — .gitea/README.md.
Вариант 1: Docker, профиль microvps
Один процесс evobgp-all (HTTP API + in-process воркеры scheduler, ingest, render, deploy), PostgreSQL, BIRD2, evobgp-agent.
cd deploy\compose
Copy-Item .env.example .env -Force # или создайте .env вручную; укажите EVOBGP_REGISTRY / EVOBGP_IMAGE_TAG
docker login git.shts.su
docker compose --profile microvps pull
docker compose --profile microvps up -d
Ожидаемые сервисы:
- API:
http://localhost:8080(внутри контейнераEVOBGP_HTTP_ADDR=:8080). - BGP: порт 179/tcp проброшен с контейнера BIRD (для отладки; в проде часто нужен
network_mode: hostили отдельная сеть — см. комментарии вdocker-compose.yaml).
Проверка живости (без ключа):
Invoke-RestMethod -Uri "http://localhost:8080/v1/health"
Остановка:
docker compose --profile microvps down
Полная очистка томов (осторожно, удалит данные БД):
docker compose --profile microvps down -v
Вариант 1b: microVPS ~1 ГиБ RAM — полный набор + Web UI
Один монолит evobgp-all (те же in-process воркеры, что и в варианте 1), плюс статическая панель за nginx (evobgp-web-microvps), NATS JetStream (как в reference, для EVOBGP_BROKER_URL и будущей интеграции) и Prometheus со скрейпом метрик с evobgp-all. Отдельные контейнеры evobgp-scheduler / evobgp-ingest / … не нужны — это не дублирование логики, а тот же код в одном процессе.
Рекомендация: на хосте с ровно 1 ГиБ включите swap (1–2 ГиБ), иначе при пиках возможен OOM. На 2+ ГиБ можно поднять тот же профиль без второго файла — останутся более мягкие лимиты из основного docker-compose.yaml.
Из каталога deploy\compose (как в варианте 1: .env из .env.example, при необходимости docker login git.shts.su):
- Подготовьте отдельный файл параметров защищенного UI:
Copy-Item .env.web-sec.example .env.web-sec -Force
- Заполните в
.env.web-sec:
WEBUI_DOMAIN— домен панели;WEBUI_IP_WHITELIST— список разрешенных IP/CIDR через запятую;LETSENCRYPT_EMAIL— email для ACME;CF_DNS_API_TOKEN— Cloudflare token дляDNS challenge(минимальные праваZone:DNS:Editна нужной зоне).
-
В Cloudflare для
WEBUI_DOMAINиспользуйте запись в режиме DNS only (серый облачок), указывающую на публичный IP VPS. -
Запускайте compose с двумя env-файлами:
# С ужатыми лимитами и EVOBGP_BROKER_URL=nats://… (ориентир под ~1 ГиБ RAM на хосте)
docker compose --env-file .env --env-file .env.web-sec -f docker-compose.yaml -f docker-compose.microvps-full.yaml --profile microvps-full pull
docker compose --env-file .env --env-file .env.web-sec -f docker-compose.yaml -f docker-compose.microvps-full.yaml --profile microvps-full up -d
Только профиль microvps-full и без файла docker-compose.microvps-full.yaml (лимиты как в базовом compose, без принудительной подстановки брокера в evobgp-all):
docker compose --env-file .env --env-file .env.web-sec --profile microvps-full pull
docker compose --env-file .env --env-file .env.web-sec --profile microvps-full up -d
При необходимости задайте брокер вручную для evobgp-all (override или .env рядом с compose): EVOBGP_BROKER_URL=nats://nats:4222.
| Порт | Назначение |
|---|---|
| 80 | HTTP вход (редирект на HTTPS через Traefik) |
| 443 | HTTPS Web UI (Traefik + Let's Encrypt) |
| 8080 | Прямой HTTP API (evobgp-all) |
| 9090 | Prometheus (prometheus-microvps) |
| 4222 | NATS |
| 179 | BGP (BIRD2), как в варианте 1 |
Проверка UI:
http://<WEBUI_DOMAIN>должен редиректить наhttps://<WEBUI_DOMAIN>;- с IP из
WEBUI_IP_WHITELISTUI доступен по HTTPS; - с неразрешенного IP Traefik вернет
403. - исключение:
GET /v1/firewall/install.sh,GET /v1/firewall/sync-script,POST /v1/firewall/enroll— публичные, без whitelist (см. firewall.md).
Health API: http://<IP>:8080/v1/health.
Файловые runtime-логи (API /v1/runtime-logs/*)
В профиле microvps-full и в standalone stack.microvps-full.yaml sidecar stack-runtime-logs пишет docker logs каждого сервиса в *.log на хосте. Каталог по умолчанию — ./runtime-logs рядом с compose-файлами; на production-хосте задайте EVOBGP_RUNTIME_LOGS_HOST_DIR=/opt/evobgp/runtime-logs (см. deploy/compose/.env.stack.microvps-full.example).
Контейнер evobgp-all монтирует тот же каталог в /opt/evobgp/runtime-logs и включает FS API при EVOBGP_SERVICE=evobgp-all и EVOBGP_RUNTIME_LOGS_DIR=/opt/evobgp/runtime-logs (уже в compose). Просмотр и очистка — в Web UI (Monitoring → «Файловые логи») или через REST; детали — docs/access.md.
На evobgp-api (профиль reference) volume не монтируется — эндпоинты отвечают 503 (runtime_logs_unavailable).
Auto-updater для standalone stack (без рестарта BIRD2)
Для stack.microvps-full.yaml можно включить автообновление только выбранных сервисов (например, evobgp-all,evobgp-web) по digest образов в registry.
В файле deploy\compose\.env.stack.microvps-full:
AUTO_UPDATE_ENABLED=1— включить updater;AUTO_UPDATE_INTERVAL_SEC=300— период проверки;AUTO_UPDATE_SERVICES=evobgp-all,evobgp-web— allowlist сервисов;AUTO_UPDATE_PROTECTED_SERVICES=bird2— список защищённых сервисов (по умолчаниюbird2).
Updater делает pull и при изменении образа выполняет up -d --no-deps только для сервиса из allowlist. bird2 в обновление не попадает, пока явно указан в protected-списке.
Важно: updater использует доступ к docker.sock (высокие привилегии), включайте осознанно.
Остановка (если поднимали с двумя -f):
docker compose --env-file .env --env-file .env.web-sec -f docker-compose.yaml -f docker-compose.microvps-full.yaml --profile microvps-full down
Вариант 2: Docker, профиль reference
Эталонное разбиение: отдельные контейнеры evobgp-api, evobgp-scheduler, evobgp-ingest, evobgp-render, evobgp-deploy, сервис NATS JetStream (в compose; привязка очереди задач к брокеру — следующая итерация), веб UI за nginx, опционально Prometheus.
cd deploy\compose
Copy-Item .env.example .env -Force
docker login git.shts.su
docker compose --profile reference pull
docker compose --profile reference up -d
Полезные порты:
| Порт | Назначение |
|---|---|
| 8080 | HTTP API (evobgp-api) |
| 3000 | Веб UI (evobgp-web → nginx, прокси на API) |
| 4222 | NATS |
| 9090 | Prometheus (в compose) |
| 179 | BGP (BIRD2) |
Воркеры reference: evobgp-scheduler ходит в API по HTTP (EVOBGP_CONTROL_PLANE_URL, EVOBGP_SCHEDULER_BEARER); в docker-compose.yaml для локального запуска включены EVOBGP_DEV_INSECURE=1 на API и токен dev у планировщика. evobgp-ingest обновляет ETag CDN-источников; evobgp-render по умолчанию не трогает published_revision (включите EVOBGP_RENDER_AUTOPUBLISH=1 осознанно); evobgp-deploy пишет в лог расхождение applied vs published. Очередь jobs остаётся in-process у evobgp-api; общий брокер — в планах.
В evobgp-all (microvps) те же пакеты крутятся в одном процессе и используют общий jobs.Registry без HTTP.
Удалённые BGP-спикеры
Реплики на отдельных VPS (bird2 + agent + Traefik): см. remote-speakers.md. На CP включите EVOBGP_NODE_DISPATCH_ENABLED=1 и зафиксируйте EVOBGP_BUNDLE_SEED_HEX. Compose: deploy/compose/docker-compose.remote-speaker.yaml.
Вариант 3: Локально без Docker (только API)
- Поднимите PostgreSQL и создайте БД (или используйте существующую).
- Установите переменные окружения в текущей сессии PowerShell:
$env:EVOBGP_DATABASE_URL = "postgres://user:pass@localhost:5432/evobgp?sslmode=disable"
$env:EVOBGP_HTTP_ADDR = ":8080"
# Ключи обязательны для защищённых маршрутов (пример формата см. access.md)
$env:EVOBGP_API_KEYS = "op|YOUR_TENANT_ID|operator"
- Запуск только HTTP API:
cd <корень-клона-репозитория>
go run .\cmd\evobgp-api
Или монолит microVPS (тот же API плюс горутины тех же воркеров scheduler/ingest/render/deploy):
go run .\cmd\evobgp-all
При старте в лог выводится публичный ключ бандла (base64) — его нужно передать на сторону evobgp-node для проверки подписи. При включённом демо-сиде (EVOBGP_SEED_DEMO не равен 0, поведение по умолчанию) сервер также печатает подсказку с примером EVOBGP_API_KEYS.
Для разработки без настройки ключей (только демо-данные):
$env:EVOBGP_DEV_INSECURE = "1"
go run .\cmd\evobgp-api
Запросы с заголовком Authorization: Bearer dev получают роль operator в демо-tenant. Не включайте в продакшене.
Вариант 4: Веб-интерфейс (разработка)
cd web
npm install
npm run dev
Укажите в окружении API список разрешённых origin для CORS (пример для Vite на порту 5173):
$env:EVOBGP_CORS_ORIGINS = "http://localhost:5173,http://127.0.0.1:5173"
В эталонном Compose для evobgp-api уже заданы origin для 5173 и 3000 — см. deploy/compose/docker-compose.yaml.
Пересборка HTML из OpenAPI
После правок docs/openapi.yaml:
.\scripts\build-openapi-html.ps1
Подробности — OPENAPI-GITEA.md.
Дальше
- access.md — как выдать ключи и настроить ноду.
- architecture.md — состав сервисов и пакетов.