From 200760f3900a4a7bd8f5965bea5a82e4356c9b95 Mon Sep 17 00:00:00 2001 From: ayurishchev Date: Sun, 30 Aug 2026 09:56:48 +0300 Subject: [PATCH] docker containers for all binaries --- deploy/docker/RUN.txt | 107 ++++++++++++++++++ deploy/docker/admin-dashboard/Dockerfile | 11 ++ .../admin-dashboard/admin-dashboard.yaml.tmpl | 10 ++ .../admin-dashboard/docker-entrypoint.sh | 14 +++ deploy/docker/control-api/Dockerfile | 12 ++ deploy/docker/validator-agent/Dockerfile | 11 ++ .../validator-agent/docker-entrypoint.sh | 18 +++ .../validator-agent/validator-agent.yaml.tmpl | 14 +++ 8 files changed, 197 insertions(+) create mode 100644 deploy/docker/admin-dashboard/Dockerfile create mode 100644 deploy/docker/admin-dashboard/admin-dashboard.yaml.tmpl create mode 100755 deploy/docker/admin-dashboard/docker-entrypoint.sh create mode 100644 deploy/docker/control-api/Dockerfile create mode 100644 deploy/docker/validator-agent/Dockerfile create mode 100755 deploy/docker/validator-agent/docker-entrypoint.sh create mode 100644 deploy/docker/validator-agent/validator-agent.yaml.tmpl diff --git a/deploy/docker/RUN.txt b/deploy/docker/RUN.txt index 7866a3a..d8bc87e 100644 --- a/deploy/docker/RUN.txt +++ b/deploy/docker/RUN.txt @@ -32,3 +32,110 @@ docker run -d --platform linux/amd64 --cap-add NET_RAW --name prober \ Примечания: --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= \ + -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 \ + 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 + +Примечания: + --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= \ + -e OS_PROJECT_ID= \ + -e OS_REGION_NAME= \ + -e OS_TOKEN= \ + cloud-ip-validator-control-api + +(при auth_method: password — вместо OS_TOKEN передать OS_USERNAME, +OS_USER_DOMAIN_NAME, OS_PASSWORD; для openstack.mode: mock креденшлы не +нужны) + +Примечания: + --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= \ + -e VALIDATOR_AGENT_CONTROL_API_URL= \ + -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 \ + 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 + +Примечания: + --platform linux/amd64 бинарник в bin/ собран под Linux x86_64 + --cap-add NET_RAW нужен агенту для ICMP-проверок + ip_echo_urls в шаблон не выведены — при отсутствии в конфиге + агент сам подставляет дефолт (api.ipify.org, + ifconfig.me/ip); свой список задавайте через + смонтированный конфиг вместо шаблона при необходимости diff --git a/deploy/docker/admin-dashboard/Dockerfile b/deploy/docker/admin-dashboard/Dockerfile new file mode 100644 index 0000000..1cacef5 --- /dev/null +++ b/deploy/docker/admin-dashboard/Dockerfile @@ -0,0 +1,11 @@ +FROM alpine:3.20 + +RUN apk add --no-cache gettext + +COPY bin/admin-dashboard /usr/local/bin/admin-dashboard +COPY deploy/docker/admin-dashboard/admin-dashboard.yaml.tmpl /etc/admin-dashboard/admin-dashboard.yaml.tmpl +COPY deploy/docker/admin-dashboard/docker-entrypoint.sh /usr/local/bin/docker-entrypoint.sh + +RUN chmod +x /usr/local/bin/docker-entrypoint.sh + +ENTRYPOINT ["/usr/local/bin/docker-entrypoint.sh"] diff --git a/deploy/docker/admin-dashboard/admin-dashboard.yaml.tmpl b/deploy/docker/admin-dashboard/admin-dashboard.yaml.tmpl new file mode 100644 index 0000000..a5e182e --- /dev/null +++ b/deploy/docker/admin-dashboard/admin-dashboard.yaml.tmpl @@ -0,0 +1,10 @@ +server: + listen_addr: "${ADMIN_DASHBOARD_LISTEN_ADDR}" + +control_api: + base_url: "${ADMIN_DASHBOARD_CONTROL_API_URL}" + timeout_seconds: ${ADMIN_DASHBOARD_CONTROL_API_TIMEOUT_SECONDS} + +overview: + last_completed_count: ${ADMIN_DASHBOARD_LAST_COMPLETED_COUNT} + poll_interval_seconds: ${ADMIN_DASHBOARD_POLL_INTERVAL_SECONDS} diff --git a/deploy/docker/admin-dashboard/docker-entrypoint.sh b/deploy/docker/admin-dashboard/docker-entrypoint.sh new file mode 100755 index 0000000..95ac9b8 --- /dev/null +++ b/deploy/docker/admin-dashboard/docker-entrypoint.sh @@ -0,0 +1,14 @@ +#!/bin/sh +set -eu + +: "${ADMIN_DASHBOARD_CONTROL_API_URL:?ADMIN_DASHBOARD_CONTROL_API_URL is required}" + +export ADMIN_DASHBOARD_LISTEN_ADDR="${ADMIN_DASHBOARD_LISTEN_ADDR:-:8090}" +export ADMIN_DASHBOARD_CONTROL_API_TIMEOUT_SECONDS="${ADMIN_DASHBOARD_CONTROL_API_TIMEOUT_SECONDS:-10}" +export ADMIN_DASHBOARD_LAST_COMPLETED_COUNT="${ADMIN_DASHBOARD_LAST_COMPLETED_COUNT:-20}" +export ADMIN_DASHBOARD_POLL_INTERVAL_SECONDS="${ADMIN_DASHBOARD_POLL_INTERVAL_SECONDS:-5}" + +envsubst '${ADMIN_DASHBOARD_LISTEN_ADDR} ${ADMIN_DASHBOARD_CONTROL_API_URL} ${ADMIN_DASHBOARD_CONTROL_API_TIMEOUT_SECONDS} ${ADMIN_DASHBOARD_LAST_COMPLETED_COUNT} ${ADMIN_DASHBOARD_POLL_INTERVAL_SECONDS}' \ + < /etc/admin-dashboard/admin-dashboard.yaml.tmpl > /etc/admin-dashboard/admin-dashboard.yaml + +exec /usr/local/bin/admin-dashboard -config /etc/admin-dashboard/admin-dashboard.yaml diff --git a/deploy/docker/control-api/Dockerfile b/deploy/docker/control-api/Dockerfile new file mode 100644 index 0000000..f0ad5e4 --- /dev/null +++ b/deploy/docker/control-api/Dockerfile @@ -0,0 +1,12 @@ +FROM alpine:3.20 + +RUN mkdir -p /var/lib/cloud-ip-validator /etc/cloud-ip-validator + +COPY bin/control-api /usr/local/bin/control-api +COPY configs/control-api.example.yaml /etc/cloud-ip-validator/control-api.yaml.example + +WORKDIR /var/lib/cloud-ip-validator +VOLUME ["/var/lib/cloud-ip-validator"] + +ENTRYPOINT ["/usr/local/bin/control-api"] +CMD ["-config", "/etc/cloud-ip-validator/control-api.yaml"] diff --git a/deploy/docker/validator-agent/Dockerfile b/deploy/docker/validator-agent/Dockerfile new file mode 100644 index 0000000..1ceb157 --- /dev/null +++ b/deploy/docker/validator-agent/Dockerfile @@ -0,0 +1,11 @@ +FROM alpine:3.20 + +RUN apk add --no-cache gettext + +COPY bin/validator-agent /usr/local/bin/validator-agent +COPY deploy/docker/validator-agent/validator-agent.yaml.tmpl /etc/validator-agent/validator-agent.yaml.tmpl +COPY deploy/docker/validator-agent/docker-entrypoint.sh /usr/local/bin/docker-entrypoint.sh + +RUN chmod +x /usr/local/bin/docker-entrypoint.sh + +ENTRYPOINT ["/usr/local/bin/docker-entrypoint.sh"] diff --git a/deploy/docker/validator-agent/docker-entrypoint.sh b/deploy/docker/validator-agent/docker-entrypoint.sh new file mode 100755 index 0000000..6839fdf --- /dev/null +++ b/deploy/docker/validator-agent/docker-entrypoint.sh @@ -0,0 +1,18 @@ +#!/bin/sh +set -eu + +: "${VALIDATOR_AGENT_VALIDATOR_ID:?VALIDATOR_AGENT_VALIDATOR_ID is required}" +: "${VALIDATOR_AGENT_CONTROL_API_URL:?VALIDATOR_AGENT_CONTROL_API_URL is required}" + +export VALIDATOR_AGENT_POLL_INTERVAL_SECONDS="${VALIDATOR_AGENT_POLL_INTERVAL_SECONDS:-5}" +export VALIDATOR_AGENT_SELF_CHECK_TIMEOUT_SECONDS="${VALIDATOR_AGENT_SELF_CHECK_TIMEOUT_SECONDS:-10}" +export VALIDATOR_AGENT_HTTPS_TIMEOUT_SECONDS="${VALIDATOR_AGENT_HTTPS_TIMEOUT_SECONDS:-10}" +export VALIDATOR_AGENT_ICMP_TIMEOUT_SECONDS="${VALIDATOR_AGENT_ICMP_TIMEOUT_SECONDS:-5}" +export VALIDATOR_AGENT_ICMP_COUNT="${VALIDATOR_AGENT_ICMP_COUNT:-3}" +export VALIDATOR_AGENT_SSH_ENABLED="${VALIDATOR_AGENT_SSH_ENABLED:-false}" +export VALIDATOR_AGENT_SSH_TIMEOUT_SECONDS="${VALIDATOR_AGENT_SSH_TIMEOUT_SECONDS:-5}" + +envsubst '${VALIDATOR_AGENT_VALIDATOR_ID} ${VALIDATOR_AGENT_CONTROL_API_URL} ${VALIDATOR_AGENT_POLL_INTERVAL_SECONDS} ${VALIDATOR_AGENT_SELF_CHECK_TIMEOUT_SECONDS} ${VALIDATOR_AGENT_HTTPS_TIMEOUT_SECONDS} ${VALIDATOR_AGENT_ICMP_TIMEOUT_SECONDS} ${VALIDATOR_AGENT_ICMP_COUNT} ${VALIDATOR_AGENT_SSH_ENABLED} ${VALIDATOR_AGENT_SSH_TIMEOUT_SECONDS}' \ + < /etc/validator-agent/validator-agent.yaml.tmpl > /etc/validator-agent/validator-agent.yaml + +exec /usr/local/bin/validator-agent -config /etc/validator-agent/validator-agent.yaml diff --git a/deploy/docker/validator-agent/validator-agent.yaml.tmpl b/deploy/docker/validator-agent/validator-agent.yaml.tmpl new file mode 100644 index 0000000..7477ca8 --- /dev/null +++ b/deploy/docker/validator-agent/validator-agent.yaml.tmpl @@ -0,0 +1,14 @@ +validator_id: "${VALIDATOR_AGENT_VALIDATOR_ID}" +control_api_url: "${VALIDATOR_AGENT_CONTROL_API_URL}" +poll_interval_seconds: ${VALIDATOR_AGENT_POLL_INTERVAL_SECONDS} + +self_check: + timeout_seconds: ${VALIDATOR_AGENT_SELF_CHECK_TIMEOUT_SECONDS} + +checks: + https_timeout_seconds: ${VALIDATOR_AGENT_HTTPS_TIMEOUT_SECONDS} + icmp_timeout_seconds: ${VALIDATOR_AGENT_ICMP_TIMEOUT_SECONDS} + icmp_count: ${VALIDATOR_AGENT_ICMP_COUNT} + ssh: + enabled: ${VALIDATOR_AGENT_SSH_ENABLED} + timeout_seconds: ${VALIDATOR_AGENT_SSH_TIMEOUT_SECONDS}