fix(tradein/deploy): подключить selectel-оверрайд — иначе после переезда бот умрёт молча #3093

Merged
lekss361 merged 1 commit from fix/tradein-deploy-telegram-pin into main 2026-08-25 16:39:41 +00:00
Owner

Что было

tradein-mvp/docker-compose.selectel.yml лежит в репозитории с 23.08 и закрепляет рабочий IP api.telegram.org через extra_hosts у backend и tgbot. Но ни один вызов compose в deploy-tradein.yml его не подключал — везде жёстко -f docker-compose.prod.yml.

Написанный, но никем не подключённый оверрайд выглядит как решённая проблема, оставаясь нерешённой. Первый же деплой на новом хосте поднял бы МЕРУ без закрепления, и телеграм-бот вместе с пересылкой алертов умерли бы молча: у api.telegram.org семь публикуемых адресов, с Selectel отвечает ровно один (149.154.167.220), а штатный резолвер отдаёт мёртвый.

Отказ скрывает сам себя — канал, которым мы узнали бы о беде, тот же самый Telegram.

Сейчас на Poincare спасает ручная запись в /etc/hosts хоста (проверено: из контейнера имя резолвится в живой адрес, TLS отвечает за 0.08 с), но это файл вне git.

Что стало

Вводится COMPOSE_FILES, подставляется в три вызова, которые создают контейнеры: pull, up -d --no-deps postgres, up -d --no-deps $SERVICES. Остальные вызовы в файле — exec -T против уже поднятых контейнеров, им набор -f не нужен.

Подключается безусловно, на обоих хостах. Замер 25.08 с Beget:

149.154.167.220        -> 302 за 0.18 с
Bot API /getMe (fake)  -> {"ok":false,"error_code":401,"description":"Unauthorized: invalid token specified"}

То есть отвечает именно Telegram, а не заглушка. Условная логика «оверрайд только на Selectel» была бы лишней машинерией ради хоста, который после 30.08 перестанет быть продовым.

Цена решения: на Beget пропадает запасной путь через резолвер. Принято сознательно — в шапке файла это уже оговорено как единственная точка отказа, и на Poincare та же точка отказа существует независимо от этого PR (пин в /etc/hosts).

Пропажа файла валит деплой, а не печатает предупреждение. Файл git-tracked, а шагом выше рабочее дерево принудительно приводится к origin/main — значит его отсутствие означает поломку, а не штатный сценарий. Зелёный лог с предупреждением был бы ровно тем классом тихого отказа, от которого защищает сам PR. Тот же принцип, что у health-check'ов #2214 ниже по файлу. (Замечание ревьюера, изначально было WARNING.)

Попутно: шапка docker-compose.selectel.yml

Файл больше не Selectel-only, шапка переписана. Там же зафиксировано, почему его нельзя подмешивать к стеку ПТИЦЫ:

service "tgbot" has neither an image nor a build context specified: invalid compose project

Сервиса tgbot в стеке Птицы нет вовсе, поэтому compose отвергает весь проект. Тише вторая беда: backend есть в обоих стеках, и закрепление молча легло бы на бэкенд Птицы.

Раннбук окна (runbooks/cutover_beget_selectel_0830.md, шаг 5) предлагал именно такую команду — проверено, падает с кодом 1. Раннбук поправлен отдельно, см. #3057.

Test plan

  • YAML обоих файлов парсится
  • docker compose -p gendesign-tradein -f docker-compose.prod.yml -f docker-compose.selectel.yml config — код 0, шесть сервисов, extra_hosts: api.telegram.org=149.154.167.220 доходит и до backend, и до tgbot
  • команда из раннбука (оверрайд в проекте Птицы) воспроизводимо падает — подтверждает необходимость правки шапки
  • COMPOSE_FILES определяется в том же блоке script: | раньше всех трёх использований, после cd tradein-mvp — проверено ревьюером по номерам строк
  • пропущенных вызовов, создающих контейнеры, нет; down/stop/create/run в файле отсутствуют
  • на Beget файл присутствует — ветка с exit 1 не сработает
  • прод-верификация после мержа: в логе деплоя строка «compose-оверрайд: docker-compose.selectel.yml подключён», а docker inspect tradein-tgbot показывает extra_hosts
  • бот отвечает после деплоя (он и сейчас жив на Beget — правка не должна этого изменить)

Refs #3059

## Что было `tradein-mvp/docker-compose.selectel.yml` лежит в репозитории с 23.08 и закрепляет рабочий IP `api.telegram.org` через `extra_hosts` у `backend` и `tgbot`. **Но ни один вызов compose в `deploy-tradein.yml` его не подключал** — везде жёстко `-f docker-compose.prod.yml`. Написанный, но никем не подключённый оверрайд выглядит как решённая проблема, оставаясь нерешённой. Первый же деплой на новом хосте поднял бы МЕРУ без закрепления, и телеграм-бот вместе с пересылкой алертов умерли бы молча: у `api.telegram.org` семь публикуемых адресов, с Selectel отвечает **ровно один** (`149.154.167.220`), а штатный резолвер отдаёт мёртвый. Отказ скрывает сам себя — канал, которым мы узнали бы о беде, тот же самый Telegram. Сейчас на Poincare спасает ручная запись в `/etc/hosts` хоста (проверено: из контейнера имя резолвится в живой адрес, TLS отвечает за 0.08 с), но это файл вне git. ## Что стало Вводится `COMPOSE_FILES`, подставляется в три вызова, которые создают контейнеры: `pull`, `up -d --no-deps postgres`, `up -d --no-deps $SERVICES`. Остальные вызовы в файле — `exec -T` против уже поднятых контейнеров, им набор `-f` не нужен. **Подключается безусловно, на обоих хостах.** Замер 25.08 **с Beget**: ``` 149.154.167.220 -> 302 за 0.18 с Bot API /getMe (fake) -> {"ok":false,"error_code":401,"description":"Unauthorized: invalid token specified"} ``` То есть отвечает именно Telegram, а не заглушка. Условная логика «оверрайд только на Selectel» была бы лишней машинерией ради хоста, который после 30.08 перестанет быть продовым. Цена решения: на Beget пропадает запасной путь через резолвер. Принято сознательно — в шапке файла это уже оговорено как единственная точка отказа, и на Poincare та же точка отказа существует независимо от этого PR (пин в `/etc/hosts`). **Пропажа файла валит деплой, а не печатает предупреждение.** Файл git-tracked, а шагом выше рабочее дерево принудительно приводится к `origin/main` — значит его отсутствие означает поломку, а не штатный сценарий. Зелёный лог с предупреждением был бы ровно тем классом тихого отказа, от которого защищает сам PR. Тот же принцип, что у health-check'ов #2214 ниже по файлу. (Замечание ревьюера, изначально было `WARNING`.) ## Попутно: шапка `docker-compose.selectel.yml` Файл больше не Selectel-only, шапка переписана. Там же зафиксировано, **почему его нельзя подмешивать к стеку ПТИЦЫ**: ``` service "tgbot" has neither an image nor a build context specified: invalid compose project ``` Сервиса `tgbot` в стеке Птицы нет вовсе, поэтому compose отвергает весь проект. Тише вторая беда: `backend` есть в **обоих** стеках, и закрепление молча легло бы на бэкенд Птицы. Раннбук окна (`runbooks/cutover_beget_selectel_0830.md`, шаг 5) предлагал именно такую команду — проверено, падает с кодом 1. Раннбук поправлен отдельно, см. #3057. ## Test plan - [x] YAML обоих файлов парсится - [x] `docker compose -p gendesign-tradein -f docker-compose.prod.yml -f docker-compose.selectel.yml config` — код 0, шесть сервисов, `extra_hosts: api.telegram.org=149.154.167.220` доходит и до `backend`, и до `tgbot` - [x] команда из раннбука (оверрайд в проекте Птицы) воспроизводимо падает — подтверждает необходимость правки шапки - [x] `COMPOSE_FILES` определяется в том же блоке `script: |` раньше всех трёх использований, после `cd tradein-mvp` — проверено ревьюером по номерам строк - [x] пропущенных вызовов, создающих контейнеры, нет; `down`/`stop`/`create`/`run` в файле отсутствуют - [x] на Beget файл присутствует — ветка с `exit 1` не сработает - [ ] прод-верификация после мержа: в логе деплоя строка «compose-оверрайд: docker-compose.selectel.yml подключён», а `docker inspect tradein-tgbot` показывает `extra_hosts` - [ ] бот отвечает после деплоя (он и сейчас жив на Beget — правка не должна этого изменить) Refs #3059
lekss361 added 1 commit 2026-08-25 16:21:22 +00:00
fix(tradein/deploy): подключить selectel-оверрайд — иначе после переезда бот умрёт молча
All checks were successful
CI / changes (pull_request) Successful in 10s
CI Trade-In / changes (pull_request) Successful in 7s
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 / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Successful in 2m5s
CI / backend-tests (pull_request) Successful in 17m28s
13269d8ebb
docker-compose.selectel.yml лежит в репозитории с 23.08 и закрепляет рабочий IP
api.telegram.org через extra_hosts у backend и tgbot. Но ни один вызов compose в
deploy-tradein.yml его не подключал — везде было жёстко `-f docker-compose.prod.yml`.

Написанный, но никем не подключённый оверрайд выглядит как решённая проблема,
оставаясь нерешённой: первый же деплой на новом хосте поднял бы МЕРУ БЕЗ
закрепления, и телеграм-бот вместе с пересылкой алертов умерли бы молча. У
api.telegram.org семь публикуемых адресов, с Selectel отвечает РОВНО ОДИН
(149.154.167.220), и штатный резолвер отдаёт мёртвый. Отказ скрывает сам себя:
канал, которым мы узнали бы о беде, — тот же самый Telegram.

Вводится COMPOSE_FILES, подставляется в три вызова, создающих контейнеры (pull,
up -d postgres, up -d $SERVICES). Остальные вызовы в файле — exec -T против уже
поднятых контейнеров, им набор -f не нужен.

Подключается безусловно, на обоих хостах. Замер 25.08 с Beget:
    149.154.167.220 -> 302 за 0.18 с
    реальный Bot API /getMe -> {"ok":false,"error_code":401}
то есть отвечает именно Telegram. Условная логика «оверрайд только на Selectel»
была бы лишней машинерией ради хоста, который после 30.08 перестанет быть
продовым. Цена: на Beget пропадает запасной путь через резолвер — принято
сознательно, в файле это оговорено как единственная точка отказа.

Пропажа файла валит деплой, а не печатает предупреждение: файл git-tracked, а
шагом выше рабочее дерево принудительно приводится к origin/main, поэтому его
отсутствие означает поломку. Зелёный лог с предупреждением был бы ровно тем
тихим отказом, от которого защищает правка.

Шапка docker-compose.selectel.yml переписана: файл больше не Selectel-only.
Там же зафиксировано, почему его нельзя подмешивать к стеку ПТИЦЫ — сервиса
tgbot там нет, compose отвергает весь проект ("has neither an image nor a build
context"), а сервис backend есть в обоих, и закрепление молча легло бы на
бэкенд Птицы. Раннбук окна предлагал именно такую команду — проверено, падает.

Refs #3059
lekss361 merged commit 729e9acc52 into main 2026-08-25 16:39:41 +00:00
lekss361 deleted branch fix/tradein-deploy-telegram-pin 2026-08-25 16:39:41 +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#3093
No description provided.