fix(deploy-metrics): пересоздавать alloy после выката конфига + гейт по иноду (#3380) #3381

Merged
bot-backend merged 1 commit from fix/3380-deploy-metrics-alloy-recreate into main 2026-09-05 21:17:53 +00:00
Collaborator

Closes #3380.

Дефект. Конфиг Alloy — bind-mount ОДНОГО файла (ops/metrics/alloy/alloy-*.alloy -> /etc/alloy/config.alloy); git reset --hard в деплое пишет файл новым инодом, а docker compose up -d изменения сервиса не видит и контейнер не пересоздаёт. Прод 06.09: после success-деплоя #3377 контейнер на Beget держал инод от 26.08 (grep -c apikey = 0 в контейнере при 1 на хосте) — второй слой маскировки не работал до ручного docker restart.

Фикс (оба agent-шага, apps и infra): после up -dup -d --force-recreate alloy с теми же env-префиксами (${METRICS_ROLE:?}/${METRICS_ALLOY_CONFIG:?} обязательны в компоузе); позиции чтения журнала — в volume alloy_data, пересоздание их не трогает. Затем гейт по значению: инод файла на хосте == инод /etc/alloy/config.alloy внутри контейнера, иначе ::error:: и красный деплой. Имя файла в гейте литералом (переменная задана только префиксом compose-команды; при set -u $METRICS_ALLOY_CONFIG дал бы unbound). stat в образе grafana/alloy:v1.6.1 есть — проверено на проде (docker exec gendesign-alloy stat -c %i … в #3377).

Проверки: yaml.safe_load rc=0; bash -n трёх script-блоков rc=0; scripts/check-workflow-ports.py и scripts/check-compose-ambiguous-hosts.py (+ --selftest) rc=0; pre-commit hooks passed.

Приёмка на проде (сам мерж и есть проба): мерж триггерит deploy-metrics (path .forgejo/workflows/deploy-metrics.yml) → на обоих хостах гейт должен пройти, docker inspect gendesign-alloy .Created обновится, инод в контейнере == на хосте без ручного рестарта.

Closes #3380. **Дефект.** Конфиг Alloy — bind-mount ОДНОГО файла (`ops/metrics/alloy/alloy-*.alloy -> /etc/alloy/config.alloy`); `git reset --hard` в деплое пишет файл новым инодом, а `docker compose up -d` изменения сервиса не видит и контейнер не пересоздаёт. Прод 06.09: после success-деплоя #3377 контейнер на Beget держал инод от 26.08 (`grep -c apikey` = 0 в контейнере при 1 на хосте) — второй слой маскировки не работал до ручного `docker restart`. **Фикс** (оба agent-шага, apps и infra): после `up -d` — `up -d --force-recreate alloy` с теми же env-префиксами (`${METRICS_ROLE:?}`/`${METRICS_ALLOY_CONFIG:?}` обязательны в компоузе); позиции чтения журнала — в volume `alloy_data`, пересоздание их не трогает. Затем **гейт по значению**: инод файла на хосте == инод `/etc/alloy/config.alloy` внутри контейнера, иначе `::error::` и красный деплой. Имя файла в гейте литералом (переменная задана только префиксом compose-команды; при `set -u` `$METRICS_ALLOY_CONFIG` дал бы unbound). `stat` в образе `grafana/alloy:v1.6.1` есть — проверено на проде (`docker exec gendesign-alloy stat -c %i …` в #3377). **Проверки:** yaml.safe_load rc=0; `bash -n` трёх script-блоков rc=0; `scripts/check-workflow-ports.py` и `scripts/check-compose-ambiguous-hosts.py` (+ `--selftest`) rc=0; pre-commit hooks passed. **Приёмка на проде (сам мерж и есть проба):** мерж триггерит `deploy-metrics` (path `.forgejo/workflows/deploy-metrics.yml`) → на обоих хостах гейт должен пройти, `docker inspect gendesign-alloy .Created` обновится, инод в контейнере == на хосте без ручного рестарта.
bot-backend added 1 commit 2026-09-05 21:14:55 +00:00
fix(deploy-metrics): пересоздавать alloy после выката конфига, гейт по иноду
All checks were successful
CI Trade-In / changes (pull_request) Successful in 9s
CI / changes (pull_request) Successful in 10s
CI Trade-In / backend-tests (pull_request) Has been skipped
CI Trade-In / browser-tests (pull_request) Has been skipped
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / backend-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
c9a9085df6
Конфиг Alloy смонтирован бинд-маунтом ОДНОГО файла, а `git reset --hard`
в деплое не правит его на месте, а пишет новым инодом. `up -d` сравнивает
описание сервиса, содержимое бинд-маунта в сравнение не входит — контейнер
не пересоздаётся и продолжает читать прежний, уже удалённый инод.

Отказ беззвучный: на диске новый конфиг, деплой зелёный, а фильтрация идёт
по старому. Пойман на проде 06.09: на Beget после success-деплоя контейнер
держал инод от 26.08, и новый фильтр заработал только после ручного
`docker restart gendesign-alloy`.

Тот же приём, что у alertmanager в джобе server. Позиции чтения журнала
лежат в томе alloy_data и пересоздание переживают.

Гейт после подъёма сверяет инод файла на хосте с инодом внутри контейнера:
расхождение = деплой красный, а не «зелёный со старым конфигом».
bot-backend merged commit 8a969c06c2 into main 2026-09-05 21:17:53 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#3381
No description provided.