Files
cloud-ip-validator/deploy/docker/RUN.txt
T
ayurishchevandClaude Sonnet 5.5 debf2afed2 Add authentication: admin/agent bearer tokens for the API, login for the dashboard
control-api: every route now carries a mandatory access level (admin / agent /
open) in a route table. All /api/v1/admin/* require the admin token; the
write calls of validator-agent and prober (self-check, events, results,
complete) require a separate static agent token; register, heartbeat and
fetching the assignment stay open. Tokens come from env vars, are compared in
constant time and never logged. An empty token leaves that level open with a
startup warning (backward compatible).

validator-agent / prober: apiclient sends the agent token only to control-api.

admin-dashboard: login/password (from env) with a stateless HMAC session
cookie, Origin-based CSRF check, per-IP brute-force throttle, HX-Redirect for
htmx polls, logout in the sidebar; the dashboard calls control-api with the
admin token. Login page layout fixed after review.

Also: env plumbing in docker-compose/rxprod-compose/systemd/config examples,
e2e script with token assertions, tests, docs (API, SETUP, USAGE, DASHBOARD,
README), plan and review under docs/changes/, bin/ rebuilt with new
SHA256SUMS.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-01 11:35:24 +03:00

181 lines
10 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
Для совместного запуска всех компонентов теперь есть docker-compose:
docker-compose.yml (база) + docker-compose.override.yml (dev, подхватывается
автоматически) + docker-compose.prod.yml (прод). Быстрый старт:
cp .env.example .env
cp control-api/control-api.docker.example.yaml control-api/control-api.docker.yaml
docker compose up -d --build
Подробности — в README.md, раздел "Развёртывание в Docker". Команды ниже
документируют то же самое на уровне отдельного docker build/docker run —
пригодятся для точечной отладки одного компонента без compose.
===============================================================================
Сборка образа (из корня репозитория):
docker build --platform linux/amd64 -t cloud-ip-validator-prober -f deploy/docker/prober/Dockerfile .
Запуск контейнера-пробера:
docker run -d --platform linux/amd64 --cap-add NET_RAW --name prober \
-e PROBER_SITE_ID=<site_id> \
-e PROBER_CONTROL_API_URL=<http://control-api-host:port> \
-e PROBER_POLL_INTERVAL_SECONDS=5 \
-e PROBER_TCP_TIMEOUT_SECONDS=5 \
-e PROBER_ICMP_TIMEOUT_SECONDS=5 \
-e PROBER_ICMP_COUNT=3 \
-e CONTROL_API_AGENT_TOKEN=<agent_token> \
cloud-ip-validator-prober
Рабочий пример (стенд 62.176.10.113):
docker run -d --platform linux/amd64 --cap-add NET_RAW --name prober \
-e PROBER_SITE_ID=sbas \
-e PROBER_CONTROL_API_URL=http://62.176.10.113:8081 \
cloud-ip-validator-prober
Переменные окружения:
PROBER_SITE_ID обязательная, должна быть зарегистрирована в
control-api (PUT /api/v1/admin/config/sites/{index})
PROBER_CONTROL_API_URL обязательная
PROBER_POLL_INTERVAL_SECONDS опциональная, дефолт 5
PROBER_TCP_TIMEOUT_SECONDS опциональная, дефолт 5
PROBER_ICMP_TIMEOUT_SECONDS опциональная, дефолт 5
PROBER_ICMP_COUNT опциональная, дефолт 3
CONTROL_API_AGENT_TOKEN опциональная: токен агентов control-api (то же
значение, что у control-api); без него результаты
проверок будут отклонены, если токен включён
Примечания:
--platform linux/amd64 бинарник в bin/ собран под Linux x86_64
--cap-add NET_RAW нужен проберу для ICMP-проверок
===============================================================================
Сборка образа admin-dashboard (из корня репозитория):
docker build --platform linux/amd64 -t cloud-ip-validator-admin-dashboard -f deploy/docker/admin-dashboard/Dockerfile .
Запуск контейнера admin-dashboard:
docker run -d --platform linux/amd64 -p 8090:8090 --name admin-dashboard \
-e ADMIN_DASHBOARD_CONTROL_API_URL=<http://control-api-host:port> \
-e ADMIN_DASHBOARD_LISTEN_ADDR=:8090 \
-e ADMIN_DASHBOARD_CONTROL_API_TIMEOUT_SECONDS=10 \
-e ADMIN_DASHBOARD_LAST_COMPLETED_COUNT=20 \
-e ADMIN_DASHBOARD_POLL_INTERVAL_SECONDS=5 \
-e ADMIN_DASHBOARD_CONTROL_API_TOKEN=<admin_token> \
-e ADMIN_DASHBOARD_USERNAME=<login> \
-e ADMIN_DASHBOARD_PASSWORD=<password> \
-e ADMIN_DASHBOARD_SESSION_SECRET=<random_hex> \
cloud-ip-validator-admin-dashboard
Рабочий пример (стенд 62.176.10.113):
docker run -d --platform linux/amd64 -p 8090:8090 --name admin-dashboard \
-e ADMIN_DASHBOARD_CONTROL_API_URL=http://62.176.10.113:8081 \
cloud-ip-validator-admin-dashboard
Переменные окружения:
ADMIN_DASHBOARD_CONTROL_API_URL обязательная
ADMIN_DASHBOARD_LISTEN_ADDR опциональная, дефолт :8090
ADMIN_DASHBOARD_CONTROL_API_TIMEOUT_SECONDS опциональная, дефолт 10
ADMIN_DASHBOARD_LAST_COMPLETED_COUNT опциональная, дефолт 20
ADMIN_DASHBOARD_POLL_INTERVAL_SECONDS опциональная, дефолт 5
ADMIN_DASHBOARD_CONTROL_API_TOKEN опциональная: admin-токен control-api
ADMIN_DASHBOARD_USERNAME / _PASSWORD опциональные: логин дашборда; если не
заданы оба — вход не требуется (в логе
предупреждение)
ADMIN_DASHBOARD_SESSION_SECRET опциональная: ключ подписи cookie сессии;
без неё случайный, сессии сбрасываются
рестартом
(секреты генерируются так: openssl rand -hex 32)
Примечания:
--platform linux/amd64 бинарник в bin/ собран под Linux x86_64
-p 8090:8090 проброс порта дашборда наружу
===============================================================================
Сборка образа control-api (из корня репозитория):
docker build --platform linux/amd64 -t cloud-ip-validator-control-api -f deploy/docker/control-api/Dockerfile .
У control-api конфиг содержит списки (validators/sites/check_types/targets/
ip_addresses) и имена env-переменных для OpenStack-креденшлов — это не
шаблонизируется через docker run -e, как у остальных компонентов. Конфиг
монтируется файлом (по образцу configs/control-api.example.yaml, который
также лежит в образе как /etc/cloud-ip-validator/control-api.yaml.example),
а сама база данных — volume'ом для персистентности.
Запуск контейнера control-api:
docker run -d --platform linux/amd64 -p 8080:8080 --name control-api \
-v /path/to/control-api.yaml:/etc/cloud-ip-validator/control-api.yaml:ro \
-v cloud-ip-validator-db:/var/lib/cloud-ip-validator \
-e OS_AUTH_URL=<keystone_url> \
-e OS_PROJECT_ID=<project_id> \
-e OS_REGION_NAME=<region> \
-e OS_TOKEN=<token> \
-e CONTROL_API_ADMIN_TOKEN=<admin_token> \
-e CONTROL_API_AGENT_TOKEN=<agent_token> \
cloud-ip-validator-control-api
(при auth_method: password — вместо OS_TOKEN передать OS_USERNAME,
OS_USER_DOMAIN_NAME, OS_PASSWORD; для openstack.mode: mock креденшлы не
нужны)
CONTROL_API_ADMIN_TOKEN закрывает /api/v1/admin/*, CONTROL_API_AGENT_TOKEN —
запись результатов/событий агентами и пробером; не заданный токен оставляет
соответствующий уровень открытым (в логе предупреждение).
Примечания:
--platform linux/amd64 бинарник в bin/ собран под Linux x86_64
-p 8080:8080 проброс порта control-api наружу
-v .../control-api.yaml обязателен: конфиг с validators/sites/targets/ip_addresses
-v cloud-ip-validator-db volume для /var/lib/cloud-ip-validator/control-api.db
===============================================================================
Сборка образа validator-agent (из корня репозитория):
docker build --platform linux/amd64 -t cloud-ip-validator-validator-agent -f deploy/docker/validator-agent/Dockerfile .
Запуск контейнера validator-agent:
docker run -d --platform linux/amd64 --cap-add NET_RAW --name validator-agent \
-e VALIDATOR_AGENT_VALIDATOR_ID=<validator_id> \
-e VALIDATOR_AGENT_CONTROL_API_URL=<http://control-api-host:port> \
-e VALIDATOR_AGENT_POLL_INTERVAL_SECONDS=5 \
-e VALIDATOR_AGENT_SELF_CHECK_TIMEOUT_SECONDS=10 \
-e VALIDATOR_AGENT_HTTPS_TIMEOUT_SECONDS=10 \
-e VALIDATOR_AGENT_ICMP_TIMEOUT_SECONDS=5 \
-e VALIDATOR_AGENT_ICMP_COUNT=3 \
-e VALIDATOR_AGENT_SSH_ENABLED=false \
-e VALIDATOR_AGENT_SSH_TIMEOUT_SECONDS=5 \
-e CONTROL_API_AGENT_TOKEN=<agent_token> \
cloud-ip-validator-validator-agent
Переменные окружения:
VALIDATOR_AGENT_VALIDATOR_ID обязательная, должен совпадать с
control-api config's validators[].validator_id
VALIDATOR_AGENT_CONTROL_API_URL обязательная
VALIDATOR_AGENT_POLL_INTERVAL_SECONDS опциональная, дефолт 5
VALIDATOR_AGENT_SELF_CHECK_TIMEOUT_SECONDS опциональная, дефолт 10
VALIDATOR_AGENT_HTTPS_TIMEOUT_SECONDS опциональная, дефолт 10
VALIDATOR_AGENT_ICMP_TIMEOUT_SECONDS опциональная, дефолт 5
VALIDATOR_AGENT_ICMP_COUNT опциональная, дефолт 3
VALIDATOR_AGENT_SSH_ENABLED опциональная, дефолт false
VALIDATOR_AGENT_SSH_TIMEOUT_SECONDS опциональная, дефолт 5
CONTROL_API_AGENT_TOKEN опциональная: токен агентов control-api
(то же значение, что у control-api)
Примечания:
--platform linux/amd64 бинарник в bin/ собран под Linux x86_64
--cap-add NET_RAW нужен агенту для ICMP-проверок
ip_echo_urls в шаблон не выведены — при отсутствии в конфиге
агент сам подставляет дефолт (api.ipify.org,
ifconfig.me/ip); свой список задавайте через
смонтированный конфиг вместо шаблона при необходимости