P1: лендинг отдавался без витрины — имя сервиса двоится между продуктами #3282

Merged
bot-backend merged 1 commit from fix/mera-ambiguous-service-names into main 2026-08-31 09:10:10 +00:00
Collaborator

Симптом

Публичный лендинг на проде отдавался без витрины целиком: без ленты сделок, без строк сверки «прогноз против факта», без подписи разброса. Страница про точность — без единого доказательства. 106 КБ вместо 241 КБ.

Нашлось не по жалобе, а потому что в проверке деплоя стоял положительный контроль — маркер, который обязан присутствовать и в старой, и в новой версии. Новый токен контраста приехал, а контроль дал ноль. Без него я бы отчитался «правка выкачена» на странице, потерявшей половину содержимого.

Причина

ПТИЦА и МЕРА — разные compose-проекты, но оба назвали свой сервис backend и оба подключены к общей сети gendesign_shared. Изнутри фронта МЕРЫ:

backend         → 172.18.0.6 (МЕРА)  +  172.18.0.9 (ПТИЦА)
tradein-backend → 172.18.0.6

BACKEND_URL=http://backend:8000 уводил серверный рендер в бэкенд ПТИЦЫ. Тот отвечал 401 no authenticated user — и страница рендерилась пустой.

Почему это не заметили раньше

Отказ тихий вдвойне:

  1. fetch не бросает — приходит валидный HTTP-ответ, просто из чужого сервиса. Никакой ошибки в логах.
  2. Имя двоится, а не сломано: часть перегенераций попадала в правильный адрес. Утром страница была с данными, к обеду без них — это выглядит случайной поломкой, а не ошибкой конфигурации.

BACKEND_URL стоит с самого заведения подпроекта (#492/#493), где заводился ради кадастрового геокода через главный бэкенд — тогда это было верно. Новый публичный SSR переиспользовал переменную, и её смысл молча поменялся.

Та же болезнь в DSN, и цена там выше

Все три сервиса МЕРЫ ходили в базу по @postgres:5432/tradein, а postgres двоится точно так же (172.18.0.10 и 172.18.0.7).

Пока не стреляло, потому что у чужой базы другие креды — отказ вместо тихого чтения не тех данных. Полагаться на это нельзя: защита держится на том, что у соседа нет пользователя с нашим паролем. Переведено на однозначное имя во всех трёх сервисах.

Гейт

check-compose-ambiguous-hosts.py по конвенции соседних гейтов (--selftest, затем боевой прогон): берёт имена сервисов обоих compose, находит пересечение и запрещает ссылаться на них как на хост — и в URL, и в DSN.

Селфтест провалился дважды на моих же фикстурах — в них не было общего имени, то есть ловить было нечего, и «не поймал» означало бы «нечего было ловить». Это ровно то, ради чего в этой конвенции селфтест и стоит.

Фальсификация на настоящем файле: возврат backend:8000 даёт точную строку 479, возврат @postgres — все четыре ссылки.

Что гейт не ловит

Ссылки, собираемые в рантайме из кусков, и имена, попадающие в контейнер иным путём (.env на хосте, секреты CI). Читаются только два compose-файла.

После выкатки

Проверить, что страница вернулась к ~241 КБ и содержит ленту, строки сверки и подпись разброса. Отдельно перепроверить контраст по отрендеренным узлам — предыдущий замер шёл по неполной странице, и его результат «32 → 2» относится к ней.

## Симптом Публичный лендинг на проде отдавался **без витрины целиком**: без ленты сделок, без строк сверки «прогноз против факта», без подписи разброса. Страница про точность — без единого доказательства. **106 КБ вместо 241 КБ.** Нашлось не по жалобе, а потому что в проверке деплоя стоял **положительный контроль** — маркер, который обязан присутствовать и в старой, и в новой версии. Новый токен контраста приехал, а контроль дал ноль. Без него я бы отчитался «правка выкачена» на странице, потерявшей половину содержимого. ## Причина ПТИЦА и МЕРА — разные compose-проекты, но **оба назвали свой сервис `backend`** и оба подключены к общей сети `gendesign_shared`. Изнутри фронта МЕРЫ: ``` backend → 172.18.0.6 (МЕРА) + 172.18.0.9 (ПТИЦА) tradein-backend → 172.18.0.6 ``` `BACKEND_URL=http://backend:8000` уводил серверный рендер в бэкенд ПТИЦЫ. Тот отвечал `401 no authenticated user` — и страница рендерилась пустой. ## Почему это не заметили раньше Отказ **тихий вдвойне**: 1. `fetch` не бросает — приходит валидный HTTP-ответ, просто из чужого сервиса. Никакой ошибки в логах. 2. Имя **двоится**, а не сломано: часть перегенераций попадала в правильный адрес. Утром страница была с данными, к обеду без них — это выглядит случайной поломкой, а не ошибкой конфигурации. `BACKEND_URL` стоит с самого заведения подпроекта (#492/#493), где заводился ради кадастрового геокода **через главный бэкенд** — тогда это было верно. Новый публичный SSR переиспользовал переменную, и её смысл молча поменялся. ## Та же болезнь в DSN, и цена там выше Все три сервиса МЕРЫ ходили в базу по `@postgres:5432/tradein`, а `postgres` двоится точно так же (`172.18.0.10` и `172.18.0.7`). Пока не стреляло, потому что **у чужой базы другие креды** — отказ вместо тихого чтения не тех данных. Полагаться на это нельзя: защита держится на том, что у соседа нет пользователя с нашим паролем. Переведено на однозначное имя во всех трёх сервисах. ## Гейт `check-compose-ambiguous-hosts.py` по конвенции соседних гейтов (`--selftest`, затем боевой прогон): берёт имена сервисов **обоих** compose, находит пересечение и запрещает ссылаться на них как на хост — и в URL, и в DSN. **Селфтест провалился дважды на моих же фикстурах** — в них не было общего имени, то есть ловить было нечего, и «не поймал» означало бы «нечего было ловить». Это ровно то, ради чего в этой конвенции селфтест и стоит. Фальсификация на настоящем файле: возврат `backend:8000` даёт точную строку `479`, возврат `@postgres` — все четыре ссылки. ## Что гейт не ловит Ссылки, собираемые в рантайме из кусков, и имена, попадающие в контейнер иным путём (`.env` на хосте, секреты CI). Читаются только два compose-файла. ## После выкатки Проверить, что страница вернулась к ~241 КБ и содержит ленту, строки сверки и подпись разброса. Отдельно перепроверить контраст по отрендеренным узлам — предыдущий замер шёл по неполной странице, и его результат «32 → 2» относится к ней.
bot-backend added 1 commit 2026-08-30 11:08:20 +00:00
прод: лендинг ходил в чужой бэкенд — имя сервиса двоится между продуктами
All checks were successful
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 11s
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Successful in 2m12s
CI / backend-tests (pull_request) Successful in 17m35s
CI Trade-In / changes (pull_request) Successful in 8s
CI / frontend-tests (pull_request) Successful in 1m11s
f31cb56081
Публичный лендинг отдавался БЕЗ витрины: без ленты сделок, без строк сверки
«прогноз против факта», без подписи разброса. Страница про точность — без
единого доказательства. Отдавалось 106 КБ вместо 241 КБ.

Причина. ПТИЦА и МЕРА — разные compose-проекты, но оба назвали свой сервис
backend и оба подключены к общей сети gendesign_shared. Изнутри фронта:

    backend         → 172.18.0.6 (МЕРА) + 172.18.0.9 (ПТИЦА)
    tradein-backend → 172.18.0.6

BACKEND_URL=http://backend:8000 уводил серверный рендер в бэкенд ПТИЦЫ, тот
отвечал 401 no authenticated user, и страница рендерилась пустой.

Отказ тихий вдвойне. fetch не бросает — приходит валидный HTTP-ответ, просто
чужой. И имя двоится, поэтому часть перегенераций попадала в правильный адрес:
утром страница была с данными, к обеду без них, и это выглядело случайной
поломкой, а не ошибкой конфигурации.

DATABASE_URL болен тем же: @postgres:5432 мог уйти в базу ПТИЦЫ. Там спасало
лишь несовпадение кредов — отказ вместо тихого чтения не тех данных. Полагаться
на это нельзя: защита держится на том, что у чужой базы нет пользователя с
нашим паролем. Переведён на однозначное имя во всех трёх сервисах.

Гейт check-compose-ambiguous-hosts.py: пересечение имён сервисов обоих compose
и запрет ссылаться на них как на хост. Селфтест по конвенции соседних гейтов —
он провалился дважды на моих же фикстурах (в них не было общего имени, то есть
ловить было нечего), и это ровно то, ради чего селфтест и нужен.

Фальсификация на настоящем файле: возврат backend:8000 даёт точную строку 479,
возврат @postgres — все четыре ссылки.
bot-backend merged commit da6a6b6e82 into main 2026-08-31 09:10:10 +00:00
bot-backend deleted branch fix/mera-ambiguous-service-names 2026-08-31 09:10:11 +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#3282
No description provided.