fix(metrics): гасим crash-loop tg-relay через профиль relay #3492

Merged
lekss361 merged 2 commits from fix/3471-relay-secret-wiring into main 2026-09-12 11:48:41 +00:00
Owner

Что сломалось

  1. PR #3487 добавил сервис tg-relay в docker-compose.metrics.yml без profiles:. Он читает TG_RELAY_SECRET и делает SystemExit при пустом значении. Секрет не был прокинут в deploy-metrics.yml, поэтому сервис поднимался всегда — на проде gendesign-tg-relay в бесконечном Restarting (1).
  2. alert-ack и tg-relay получают код бинд-маунтом файла (./ops/metrics/{alert-ack,tg-relay}/app.py:/app/app.py:ro), а не сборкой образа. docker compose up -d сравнивает ОПИСАНИЕ сервиса, не содержимое бинд-маунта — правка app.py не пересоздаёт уже запущенный контейнер, он продолжает работать на старом коде в памяти интерпретатора. Подтверждено на проде 12.09.2026: PR #3490 (фикс alert-ack) слился, деплой обновил файл на диске хоста, а gendesign-alert-ack, запущенный 25 минут назад, отвечал по старой логике. Помог только ручной перезапуск контейнера.

Что сделано

  • .forgejo/workflows/deploy-metrics.yml:
    • TG_RELAY_SECRET прокинут в env:/envs: шага деплоя (по образцу ALERT_ACK_GLITCHTIP_SECRET). Введён профиль relay, включаемый независимо от alerts, только когда секрет непуст; ::warning, когда пуст. Сравнение PROFILES с "alerts" переведено на case, т.к. значение теперь может быть комбинацией через запятую (alerts,relay).
    • После up -d --remove-orphans добавлен условный up -d --force-recreate для alert-ack (если профиль alerts включён) и tg-relay (если включён relay) — устраняет класс бага из п. 2 без ручного SSH.
  • docker-compose.metrics.yml: tg-relay получил profiles: ["relay"] — не поднимается, пока профиль не включён.
  • tradein-mvp/docker-compose.prod.yml: комментарий у tgbotdeploy-tradein.yml не инжектит секреты приложения через CI (в отличие от deploy-metrics.yml), поэтому TELEGRAM_RELAY_BASE_URL/TELEGRAM_RELAY_SECRET на продуктовом хосте (Selectel) нужно завести так же, как остальные TELEGRAM_* — строкой в user-managed runtime-файле окружения backend на хосте. Это существующий механизм файла, не новый.

Проверка

  • python -c "import yaml; yaml.safe_load(open(...))" — все файлы валидны
  • docker compose -f docker-compose.metrics.yml config --profilesalerts, relay
  • bash -n на извлечённом теле деплой-скрипта — синтаксис валиден
  • После деплоя: gendesign-tg-relay не создан (секрет пуст) либо Up/healthy (секрет задан), не Restarting
  • После деплоя с изменением ops/metrics/alert-ack/app.py или ops/metrics/tg-relay/app.py: контейнер пересоздан (новый CreatedAt), а не работает на старом коде
  • alerts-профиль по-прежнему поднимает Alertmanager штатно (регрессия на case-сравнении)

Секреты TG_RELAY_SECRET, TELEGRAM_RELAY_SECRET, TELEGRAM_RELAY_BASE_URL уже заведены в Forgejo Actions пользователем — значения в этот PR не попадали.

🤖 Generated with Claude Code

https://claude.ai/code/session_01JY6iWDnGDthdvsMWgK1BMG

## Что сломалось 1. PR #3487 добавил сервис `tg-relay` в `docker-compose.metrics.yml` без `profiles:`. Он читает `TG_RELAY_SECRET` и делает `SystemExit` при пустом значении. Секрет не был прокинут в `deploy-metrics.yml`, поэтому сервис поднимался всегда — на проде `gendesign-tg-relay` в бесконечном `Restarting (1)`. 2. `alert-ack` и `tg-relay` получают код бинд-маунтом файла (`./ops/metrics/{alert-ack,tg-relay}/app.py:/app/app.py:ro`), а не сборкой образа. `docker compose up -d` сравнивает ОПИСАНИЕ сервиса, не содержимое бинд-маунта — правка `app.py` не пересоздаёт уже запущенный контейнер, он продолжает работать на старом коде в памяти интерпретатора. Подтверждено на проде 12.09.2026: PR #3490 (фикс alert-ack) слился, деплой обновил файл на диске хоста, а `gendesign-alert-ack`, запущенный 25 минут назад, отвечал по старой логике. Помог только ручной перезапуск контейнера. ## Что сделано - `.forgejo/workflows/deploy-metrics.yml`: - `TG_RELAY_SECRET` прокинут в `env:`/`envs:` шага деплоя (по образцу `ALERT_ACK_GLITCHTIP_SECRET`). Введён профиль `relay`, включаемый независимо от `alerts`, только когда секрет непуст; `::warning`, когда пуст. Сравнение `PROFILES` с `"alerts"` переведено на `case`, т.к. значение теперь может быть комбинацией через запятую (`alerts,relay`). - После `up -d --remove-orphans` добавлен условный `up -d --force-recreate` для `alert-ack` (если профиль `alerts` включён) и `tg-relay` (если включён `relay`) — устраняет класс бага из п. 2 без ручного SSH. - `docker-compose.metrics.yml`: `tg-relay` получил `profiles: ["relay"]` — не поднимается, пока профиль не включён. - `tradein-mvp/docker-compose.prod.yml`: комментарий у `tgbot` — `deploy-tradein.yml` не инжектит секреты приложения через CI (в отличие от `deploy-metrics.yml`), поэтому `TELEGRAM_RELAY_BASE_URL`/`TELEGRAM_RELAY_SECRET` на продуктовом хосте (Selectel) нужно завести так же, как остальные `TELEGRAM_*` — строкой в user-managed runtime-файле окружения backend на хосте. Это существующий механизм файла, не новый. ## Проверка - [x] `python -c "import yaml; yaml.safe_load(open(...))"` — все файлы валидны - [x] `docker compose -f docker-compose.metrics.yml config --profiles` → `alerts`, `relay` - [x] `bash -n` на извлечённом теле деплой-скрипта — синтаксис валиден - [ ] После деплоя: `gendesign-tg-relay` не создан (секрет пуст) либо `Up`/healthy (секрет задан), не `Restarting` - [ ] После деплоя с изменением `ops/metrics/alert-ack/app.py` или `ops/metrics/tg-relay/app.py`: контейнер пересоздан (новый `CreatedAt`), а не работает на старом коде - [ ] `alerts`-профиль по-прежнему поднимает Alertmanager штатно (регрессия на `case`-сравнении) Секреты `TG_RELAY_SECRET`, `TELEGRAM_RELAY_SECRET`, `TELEGRAM_RELAY_BASE_URL` уже заведены в Forgejo Actions пользователем — значения в этот PR не попадали. 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_01JY6iWDnGDthdvsMWgK1BMG
lekss361 added 1 commit 2026-09-12 11:45:41 +00:00
fix(metrics): гасим crash-loop tg-relay пустым секретом через профиль relay
All checks were successful
CI Trade-In / changes (pull_request) Successful in 10s
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / backend-tests (pull_request) Has been skipped
CI Trade-In / backend-tests (pull_request) Has been skipped
CI Trade-In / browser-tests (pull_request) Has been skipped
CI / changes (pull_request) Successful in 13s
CI / openapi-codegen-check (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
347342bb5c
PR #3487 добавил сервис tg-relay без profiles: контейнер поднимался
всегда и падал в SystemExit на пустом TG_RELAY_SECRET (на проде
подтверждён Restarting в бесконечном цикле).

- deploy-metrics.yml: TG_RELAY_SECRET прокинут в ssh-action по образцу
  ALERT_ACK_GLITCHTIP_SECRET; профиль relay включается независимо от
  alerts, только когда секрет непуст; ::warning на пустом секрете.
  Сравнение PROFILES с "alerts" переведено на case, иначе комбинация
  "alerts,relay" сломала бы прежнюю точную строковую проверку.
- docker-compose.metrics.yml: tg-relay получил profiles: ["relay"].
- tradein-mvp/docker-compose.prod.yml: комментарий у tgbot — deploy-tradein.yml
  секреты приложения в CI не инжектит, TELEGRAM_RELAY_BASE_URL и
  TELEGRAM_RELAY_SECRET на продуктовом хосте заводятся так же, как
  прочие TELEGRAM_* — строкой в user-managed runtime-файле окружения
  backend на хосте, без правок workflow (существующий механизм этого
  файла, см. README-АДМИНУ.md).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JY6iWDnGDthdvsMWgK1BMG
bot-backend added 1 commit 2026-09-12 11:47:24 +00:00
fix(metrics): force-recreate alert-ack/tg-relay после up -d — код монтируется с хоста
All checks were successful
CI Trade-In / backend-tests (pull_request) Has been skipped
CI / changes (pull_request) Successful in 15s
CI Trade-In / browser-tests (pull_request) Has been skipped
CI / backend-tests (pull_request) Has been skipped
CI Trade-In / changes (pull_request) Successful in 12s
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
4b74356c60
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 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JY6iWDnGDthdvsMWgK1BMG
lekss361 merged commit 192e10d32d into main 2026-09-12 11:48:41 +00:00
lekss361 deleted branch fix/3471-relay-secret-wiring 2026-09-12 11:48:41 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
2 participants
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#3492
No description provided.