From 399c64e8015be4b1f2c06895cf2d5bf80287d7fe Mon Sep 17 00:00:00 2001 From: ayurishchev Date: Mon, 14 Sep 2026 23:15:30 +0300 Subject: [PATCH] Add a simple, single-file docker-compose for the control-plane/dashboard/prober host MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The existing deploy/docker/docker-compose.yml (+ override/prod, Compose profiles) is flexible but requires understanding profiles and file layering. For a server that only ever runs these three fixed roles against a real OpenStack (VK Cloud) deployment, rxprod-compose/ adds a single flat docker-compose.yml with no profiles — control-api, admin-dashboard and prober wired together directly, both ports published on the host (control-api needs to be reachable by validator-agent running separately on real cloud VMs). OpenStack credentials and the prober's site_id come from a local .env (gitignored; .env.example is the template). Co-Authored-By: Claude Sonnet 5 Claude-Session: https://claude.ai/code/session_01NeVbMVEiE7XQAkBd7HQgj6 --- .gitignore | 1 + rxprod-compose/.env.example | 21 ++++++++ rxprod-compose/docker-compose.yml | 88 +++++++++++++++++++++++++++++++ 3 files changed, 110 insertions(+) create mode 100644 rxprod-compose/.env.example create mode 100644 rxprod-compose/docker-compose.yml diff --git a/.gitignore b/.gitignore index 7a82501..01db444 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,4 @@ !/deploy/docker/.env.example !/deploy/docker/.env.prod.example /deploy/docker/control-api/control-api.docker.yaml +/rxprod-compose/.env diff --git a/rxprod-compose/.env.example b/rxprod-compose/.env.example new file mode 100644 index 0000000..a089057 --- /dev/null +++ b/rxprod-compose/.env.example @@ -0,0 +1,21 @@ +# Скопировать в .env в этой же папке и заполнить реальными значениями — +# docker compose сам подхватывает .env из директории compose-файла. +# +# cp .env.example .env +# docker compose up -d --build + +# OpenStack (VK Cloud) креденшлы — control-api.yaml должен быть в +# openstack.mode: real. +OS_AUTH_URL= +OS_PROJECT_ID= +OS_REGION_NAME= +OS_INTERFACE= +OS_TOKEN= +# Парольная авторизация вместо токена — вместо OS_TOKEN заполнить эти три: +# OS_USERNAME= +# OS_USER_DOMAIN_NAME= +# OS_PASSWORD= + +# prober — обязателен, должен совпадать с site_id, уже настроенным в +# реальном control-api.yaml (validators/sites/targets/ip_addresses). +PROBER_SITE_ID= diff --git a/rxprod-compose/docker-compose.yml b/rxprod-compose/docker-compose.yml new file mode 100644 index 0000000..b59b1e0 --- /dev/null +++ b/rxprod-compose/docker-compose.yml @@ -0,0 +1,88 @@ +# Простой (без profiles/override/prod) docker-compose для сервера с ролями +# control-api + admin-dashboard + prober. Реальный OpenStack (mode: real) — +# validator-agent сюда не входит, он работает отдельно на реальных +# ВМ-валидаторах в облаке и обращается к control-api по адресу этого хоста. +# +# Запуск: +# cp .env.example .env # заполнить реальными OS_*-креденшлами и PROBER_SITE_ID +# # поправить путь к control-api.yaml ниже, если реальный файл лежит не в +# # /etc/cloud-ip-validator/control-api.yaml +# docker compose up -d --build +# curl -s http://localhost:8080/healthz +# +# (из корня репозитория тот же стек можно поднять гибче, с profiles и +# dev/prod-разделением — см. deploy/docker/docker-compose.yml) + +name: cloud-ip-validator + +networks: + backend: + name: cloud-ip-validator + +volumes: + control-api-db: + name: cloud-ip-validator-db + +services: + control-api: + build: + context: .. + dockerfile: deploy/docker/control-api/Dockerfile + image: cloud-ip-validator-control-api + platform: linux/amd64 + restart: unless-stopped + networks: [backend] + ports: + - "8080:8080" + volumes: + # Поправьте путь слева, если реальный control-api.yaml (mode: real, + # с настоящими validators/sites/targets/ip_addresses) лежит не здесь. + - /etc/cloud-ip-validator/control-api.yaml:/etc/cloud-ip-validator/control-api.yaml:ro + - control-api-db:/var/lib/cloud-ip-validator + environment: + OS_AUTH_URL: "${OS_AUTH_URL}" + OS_PROJECT_ID: "${OS_PROJECT_ID}" + OS_REGION_NAME: "${OS_REGION_NAME}" + OS_INTERFACE: "${OS_INTERFACE:-}" + OS_TOKEN: "${OS_TOKEN:-}" + OS_USERNAME: "${OS_USERNAME:-}" + OS_USER_DOMAIN_NAME: "${OS_USER_DOMAIN_NAME:-}" + OS_PASSWORD: "${OS_PASSWORD:-}" + healthcheck: + test: ["CMD", "wget", "--quiet", "--tries=1", "--spider", "http://127.0.0.1:8080/healthz"] + interval: 5s + timeout: 3s + retries: 10 + start_period: 5s + + admin-dashboard: + build: + context: .. + dockerfile: deploy/docker/admin-dashboard/Dockerfile + image: cloud-ip-validator-admin-dashboard + platform: linux/amd64 + restart: unless-stopped + networks: [backend] + ports: + - "8090:8090" + environment: + ADMIN_DASHBOARD_CONTROL_API_URL: http://control-api:8080 + depends_on: + control-api: + condition: service_healthy + + prober: + build: + context: .. + dockerfile: deploy/docker/prober/Dockerfile + image: cloud-ip-validator-prober + platform: linux/amd64 + restart: unless-stopped + networks: [backend] + cap_add: [NET_RAW] + environment: + PROBER_SITE_ID: "${PROBER_SITE_ID}" + PROBER_CONTROL_API_URL: http://control-api:8080 + depends_on: + control-api: + condition: service_healthy