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

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:
Denozordec
2026-04-08 15:52:49 +07:00
parent 9f021289c0
commit ae9fbe30b4
3 changed files with 100 additions and 0 deletions
@@ -12,3 +12,13 @@ WEBUI_DOMAIN=bgp.shz.su
WEBUI_IP_WHITELIST=109.174.26.78/32,87.103.241.8/32
LETSENCRYPT_EMAIL=admin@shz.su
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
+75
View File
@@ -16,6 +16,9 @@
#
# Долгий сбор логов в файлы на хосте: сервис stack-runtime-logs пишет в каталог
# ./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:
# при смене `name:` или имени стека в Portainer задайте COMPOSE_PROJECT_NAME.
# Требуется доступ к docker.sock (полные права на демон — осознанно).
@@ -259,6 +262,78 @@ services:
for s in $$SERVICES; do log_one "$$s" & done
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:
pgdata:
bird_etc:
+15
View File
@@ -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`.
### 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`):
```powershell