feat: add auto-updater service for Docker stack with configurable settings
CI / changes (push) Successful in 6s
CI / openapi (push) Has been skipped
CI / go (push) Has been skipped
CI / docker-web (deploy/docker/evobgp-web/Dockerfile, , evobgp-web) (push) Has been skipped
CI / docker-web (deploy/docker/evobgp-web/Dockerfile, evobgp-all, evobgp-web-all) (push) Has been skipped
CI / docker-bird (push) Has been skipped
CI / bird2 (push) Has been skipped
CI / docker-go-prime (push) Has been skipped
CI / docker-go (deploy/docker/evobgp-agent/Dockerfile, , evobgp-agent) (push) Has been skipped
CI / docker-go (evobgp-all, 1, deploy/docker/gobinary/Dockerfile, , evobgp-all) (push) Has been skipped
CI / docker-go (evobgp-api, 1, deploy/docker/gobinary/Dockerfile, , evobgp-api) (push) Has been skipped
CI / docker-go (evobgp-deploy, 0, deploy/docker/gobinary/Dockerfile, , evobgp-deploy) (push) Has been skipped
CI / docker-go (evobgp-ingest, 0, deploy/docker/gobinary/Dockerfile, , evobgp-ingest) (push) Has been skipped
CI / docker-go (evobgp-node, 0, deploy/docker/gobinary/Dockerfile, , evobgp-node) (push) Has been skipped
CI / docker-go (evobgp-render, 0, deploy/docker/gobinary/Dockerfile, , evobgp-render) (push) Has been skipped
CI / docker-go (evobgp-scheduler, 0, deploy/docker/gobinary/Dockerfile, , evobgp-scheduler) (push) Has been skipped
CI / changes (push) Successful in 6s
CI / openapi (push) Has been skipped
CI / go (push) Has been skipped
CI / docker-web (deploy/docker/evobgp-web/Dockerfile, , evobgp-web) (push) Has been skipped
CI / docker-web (deploy/docker/evobgp-web/Dockerfile, evobgp-all, evobgp-web-all) (push) Has been skipped
CI / docker-bird (push) Has been skipped
CI / bird2 (push) Has been skipped
CI / docker-go-prime (push) Has been skipped
CI / docker-go (deploy/docker/evobgp-agent/Dockerfile, , evobgp-agent) (push) Has been skipped
CI / docker-go (evobgp-all, 1, deploy/docker/gobinary/Dockerfile, , evobgp-all) (push) Has been skipped
CI / docker-go (evobgp-api, 1, deploy/docker/gobinary/Dockerfile, , evobgp-api) (push) Has been skipped
CI / docker-go (evobgp-deploy, 0, deploy/docker/gobinary/Dockerfile, , evobgp-deploy) (push) Has been skipped
CI / docker-go (evobgp-ingest, 0, deploy/docker/gobinary/Dockerfile, , evobgp-ingest) (push) Has been skipped
CI / docker-go (evobgp-node, 0, deploy/docker/gobinary/Dockerfile, , evobgp-node) (push) Has been skipped
CI / docker-go (evobgp-render, 0, deploy/docker/gobinary/Dockerfile, , evobgp-render) (push) Has been skipped
CI / docker-go (evobgp-scheduler, 0, deploy/docker/gobinary/Dockerfile, , evobgp-scheduler) (push) Has been skipped
Introduced an auto-updater service in the Docker Compose configuration to enable automatic updates for specified services without restarting protected services like BIRD2. Configurable settings include update interval, enabled status, and a list of services to update, enhancing deployment efficiency. Updated documentation to reflect new features and usage instructions.
This commit is contained in:
@@ -12,3 +12,13 @@ WEBUI_DOMAIN=bgp.shz.su
|
|||||||
WEBUI_IP_WHITELIST=109.174.26.78/32,87.103.241.8/32
|
WEBUI_IP_WHITELIST=109.174.26.78/32,87.103.241.8/32
|
||||||
LETSENCRYPT_EMAIL=[email protected]
|
LETSENCRYPT_EMAIL=[email protected]
|
||||||
CF_DNS_API_TOKEN=cfut_3D1i0MNBVX6MNSsjcFytsfSlyB4B15t7H3DYXuzq22011588
|
CF_DNS_API_TOKEN=cfut_3D1i0MNBVX6MNSsjcFytsfSlyB4B15t7H3DYXuzq22011588
|
||||||
|
|
||||||
|
# Auto-updater (проверка registry образов и точечный restart контейнеров)
|
||||||
|
# 0 = выключен, 1 = включен
|
||||||
|
AUTO_UPDATE_ENABLED=0
|
||||||
|
# Интервал проверки обновлений (сек), минимум 30
|
||||||
|
AUTO_UPDATE_INTERVAL_SEC=300
|
||||||
|
# Сервисы для автообновления (через запятую)
|
||||||
|
AUTO_UPDATE_SERVICES=evobgp-all,evobgp-web
|
||||||
|
# Защищенные сервисы, которые updater никогда не перезапускает
|
||||||
|
AUTO_UPDATE_PROTECTED_SERVICES=bird2
|
||||||
|
|||||||
@@ -16,6 +16,9 @@
|
|||||||
#
|
#
|
||||||
# Долгий сбор логов в файлы на хосте: сервис stack-runtime-logs пишет в каталог
|
# Долгий сбор логов в файлы на хосте: сервис stack-runtime-logs пишет в каталог
|
||||||
# ./runtime-logs/ (рядом с этим compose-файлом) по одному файлу на сервис.
|
# ./runtime-logs/ (рядом с этим compose-файлом) по одному файлу на сервис.
|
||||||
|
# Автообновление сервисов из registry (без перезапуска bird2): stack-auto-updater.
|
||||||
|
# Настройки через .env: AUTO_UPDATE_ENABLED, AUTO_UPDATE_INTERVAL_SEC,
|
||||||
|
# AUTO_UPDATE_SERVICES, AUTO_UPDATE_PROTECTED_SERVICES.
|
||||||
# Имя проекта в Docker должно совпадать с label com.docker.compose.project:
|
# Имя проекта в Docker должно совпадать с label com.docker.compose.project:
|
||||||
# при смене `name:` или имени стека в Portainer задайте COMPOSE_PROJECT_NAME.
|
# при смене `name:` или имени стека в Portainer задайте COMPOSE_PROJECT_NAME.
|
||||||
# Требуется доступ к docker.sock (полные права на демон — осознанно).
|
# Требуется доступ к docker.sock (полные права на демон — осознанно).
|
||||||
@@ -259,6 +262,78 @@ services:
|
|||||||
for s in $$SERVICES; do log_one "$$s" & done
|
for s in $$SERVICES; do log_one "$$s" & done
|
||||||
wait
|
wait
|
||||||
|
|
||||||
|
stack-auto-updater:
|
||||||
|
image: docker:27-cli
|
||||||
|
restart: unless-stopped
|
||||||
|
depends_on:
|
||||||
|
evobgp-all:
|
||||||
|
condition: service_started
|
||||||
|
environment:
|
||||||
|
COMPOSE_PROJECT_NAME: ${COMPOSE_PROJECT_NAME:-evobgp-microvps-full}
|
||||||
|
AUTO_UPDATE_ENABLED: ${AUTO_UPDATE_ENABLED:-0}
|
||||||
|
AUTO_UPDATE_INTERVAL_SEC: ${AUTO_UPDATE_INTERVAL_SEC:-300}
|
||||||
|
AUTO_UPDATE_SERVICES: ${AUTO_UPDATE_SERVICES:-evobgp-all,evobgp-web}
|
||||||
|
AUTO_UPDATE_PROTECTED_SERVICES: ${AUTO_UPDATE_PROTECTED_SERVICES:-bird2}
|
||||||
|
volumes:
|
||||||
|
- /var/run/docker.sock:/var/run/docker.sock
|
||||||
|
- type: bind
|
||||||
|
source: ./stack.microvps-full.yaml
|
||||||
|
target: /stack/stack.microvps-full.yaml
|
||||||
|
read_only: true
|
||||||
|
entrypoint: ["/bin/sh", "-c"]
|
||||||
|
command:
|
||||||
|
- |
|
||||||
|
set -eu
|
||||||
|
PROJECT=$$COMPOSE_PROJECT_NAME
|
||||||
|
INTERVAL=$$AUTO_UPDATE_INTERVAL_SEC
|
||||||
|
ENABLED=$$AUTO_UPDATE_ENABLED
|
||||||
|
if [ "$$ENABLED" != "1" ]; then
|
||||||
|
echo "auto-updater disabled: AUTO_UPDATE_ENABLED=$$ENABLED"
|
||||||
|
while true; do sleep 3600; done
|
||||||
|
fi
|
||||||
|
if [ "$$INTERVAL" -lt 30 ]; then
|
||||||
|
echo "auto-updater interval too low ($$INTERVAL), forcing to 30"
|
||||||
|
INTERVAL=30
|
||||||
|
fi
|
||||||
|
echo "auto-updater started: project=$$PROJECT interval=$$INTERVAL services=$$AUTO_UPDATE_SERVICES protected=$$AUTO_UPDATE_PROTECTED_SERVICES"
|
||||||
|
while true; do
|
||||||
|
TS=$$(date -u +"%Y-%m-%dT%H:%M:%SZ")
|
||||||
|
SERVICES_LIST=$$(echo "$$AUTO_UPDATE_SERVICES" | tr ',' ' ')
|
||||||
|
PROTECTED_LIST=$$(echo "$$AUTO_UPDATE_PROTECTED_SERVICES" | tr ',' ' ')
|
||||||
|
for svc in $$SERVICES_LIST; do
|
||||||
|
if [ -z "$$svc" ]; then
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
skip=0
|
||||||
|
for protected in $$PROTECTED_LIST; do
|
||||||
|
if [ "$$svc" = "$$protected" ]; then
|
||||||
|
echo "$$TS skip protected service '$$svc'"
|
||||||
|
skip=1
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
if [ "$$skip" = "1" ]; then
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
before=$$(docker image inspect "$$(docker compose -p "$$PROJECT" -f /stack/stack.microvps-full.yaml config --images $$svc | tail -n1)" --format '{{.Id}}' 2>/dev/null || true)
|
||||||
|
pull_out=$$(docker compose -p "$$PROJECT" -f /stack/stack.microvps-full.yaml pull $$svc 2>&1 || true)
|
||||||
|
echo "$$TS pull $$svc: $$pull_out"
|
||||||
|
after=$$(docker image inspect "$$(docker compose -p "$$PROJECT" -f /stack/stack.microvps-full.yaml config --images $$svc | tail -n1)" --format '{{.Id}}' 2>/dev/null || true)
|
||||||
|
if [ -n "$$after" ] && [ "$$before" != "$$after" ]; then
|
||||||
|
echo "$$TS update detected for $$svc, restarting container"
|
||||||
|
docker compose -p "$$PROJECT" -f /stack/stack.microvps-full.yaml up -d --no-deps $$svc
|
||||||
|
else
|
||||||
|
echo "$$TS no update for $$svc"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
sleep "$$INTERVAL"
|
||||||
|
done
|
||||||
|
logging:
|
||||||
|
driver: json-file
|
||||||
|
options:
|
||||||
|
max-size: "10m"
|
||||||
|
max-file: "3"
|
||||||
|
|
||||||
volumes:
|
volumes:
|
||||||
pgdata:
|
pgdata:
|
||||||
bird_etc:
|
bird_etc:
|
||||||
|
|||||||
@@ -156,6 +156,21 @@ docker compose --env-file .env --env-file .env.web-sec --profile microvps-full u
|
|||||||
|
|
||||||
Health API: `http://<IP>:8080/v1/health`.
|
Health API: `http://<IP>:8080/v1/health`.
|
||||||
|
|
||||||
|
### 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`):
|
Остановка (если поднимали с двумя `-f`):
|
||||||
|
|
||||||
```powershell
|
```powershell
|
||||||
|
|||||||
Reference in New Issue
Block a user