From 4b74356c604e8330f3595a9f8e23a5b1d9da85a9 Mon Sep 17 00:00:00 2001 From: bot-backend Date: Sat, 12 Sep 2026 14:47:17 +0300 Subject: [PATCH] =?UTF-8?q?fix(metrics):=20force-recreate=20alert-ack/tg-r?= =?UTF-8?q?elay=20=D0=BF=D0=BE=D1=81=D0=BB=D0=B5=20up=20-d=20=E2=80=94=20?= =?UTF-8?q?=D0=BA=D0=BE=D0=B4=20=D0=BC=D0=BE=D0=BD=D1=82=D0=B8=D1=80=D1=83?= =?UTF-8?q?=D0=B5=D1=82=D1=81=D1=8F=20=D1=81=20=D1=85=D0=BE=D1=81=D1=82?= =?UTF-8?q?=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit up -d сравнивает описание сервиса, не содержимое бинд-маунта. alert-ack и tg-relay получают app.py именно бинд-маунтом (не сборкой образа), поэтому правка файла не пересоздаёт уже работающий контейнер — он продолжает исполнять старый код в памяти интерпретатора. Подтверждено на проде 12.09.2026: PR #3490 (фикс alert-ack) слился, файл на диске обновился (git reset --hard), а gendesign-alert-ack, запущенный 25 минут назад, отвечал по старой логике. Помог только ручной docker restart. force-recreate для обоих сервисов сделан условным по PROFILES (case ",$PROFILES,"), чтобы не падать на несуществующем контейнере, когда профиль alerts/relay в этом прогоне не включён. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01JY6iWDnGDthdvsMWgK1BMG --- .forgejo/workflows/deploy-metrics.yml | 37 +++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/.forgejo/workflows/deploy-metrics.yml b/.forgejo/workflows/deploy-metrics.yml index 5f2b8dc6..80a648ae 100644 --- a/.forgejo/workflows/deploy-metrics.yml +++ b/.forgejo/workflows/deploy-metrics.yml @@ -326,6 +326,43 @@ jobs: COMPOSE_PROFILES="$PROFILES" \ docker compose -p gendesign-metrics -f docker-compose.metrics.yml up -d --remove-orphans + # ── alert-ack / tg-relay: код монтируется с хоста ──────────────── + # Тот же класс бага, что у Alertmanager (см. ниже) и Caddyfile: + # `up -d` сравнивает ОПИСАНИЕ сервиса, а не содержимое бинд-маунта. + # alert-ack и tg-relay получают код именно бинд-маунтом файла + # (./ops/metrics/{alert-ack,tg-relay}/app.py:/app/app.py:ro), а не + # сборкой образа — правка app.py оставляет уже запущенный + # контейнер работать на СТАРОМ коде в памяти интерпретатора сколько + # угодно, и `up -d` этого не видит вовсе. + # + # Пойман на проде 12.09.2026: PR #3490 (фикс alert-ack) слился, + # `git reset --hard` обновил файл на диске (grep по новому + # комментарию находил его), а gendesign-alert-ack, запущенный за + # 25 минут до этого, продолжал отвечать по старой логике — + # зелёный деплой, тихо неверное поведение. Починил только ручной + # `docker restart gendesign-alert-ack`. force-recreate здесь — + # замена этому ручному шагу. + # + # case ",$PROFILES," — пересоздаём только если профиль сервиса + # реально включён в ЭТОМ прогоне, иначе force-recreate ругается на + # несуществующий контейнер (сервис не создан вовсе). + case ",$PROFILES," in + *,alerts,*) + COMPOSE_PROFILES="$PROFILES" \ + docker compose -p gendesign-metrics -f docker-compose.metrics.yml \ + up -d --force-recreate alert-ack + echo "alert-ack: контейнер пересоздан — код монтируется с хоста, up -d его не подхватывает (#3490)." + ;; + esac + case ",$PROFILES," in + *,relay,*) + COMPOSE_PROFILES="$PROFILES" \ + docker compose -p gendesign-metrics -f docker-compose.metrics.yml \ + up -d --force-recreate tg-relay + echo "tg-relay: контейнер пересоздан — код монтируется с хоста, up -d его не подхватывает (#3490)." + ;; + esac + # ── Alertmanager: пересоздать, если конфиг перерисовали ───────── # `up -d` выше СЧИТАЕТ alertmanager неизменившимся: он сравнивает # описание сервиса, а содержимое бинд-маунта в это сравнение не