P1: лендинг отдавался без витрины — имя сервиса двоится между продуктами #3282
No reviewers
Labels
No labels
Fable 5 ревью
GG-форсайт
admin
analytics
auth
automation
bug
business
chore
ci
compliance
data
data-moat
docs
duplicate
dx
enhancement
feedback/max
generative
needs-discussion
needs-human
observability
pause-bots
performance
priority/p0
priority/p1
priority/p2
priority/p3
scope/backend
scope/db
scope/devops
scope/frontend
scope/qa
scrapers
security
site-finder
stage/1
stage/2
status/blocked
status/done
status/needs-analysis
status/needs-fix
status/qa
status/ready
status/review
status/wip
tech-debt
tradein
ux
week ревью 1
wontfix
ИРД
вторичка
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: lekss361/gendesign#3282
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "fix/mera-ambiguous-service-names"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Симптом
Публичный лендинг на проде отдавался без витрины целиком: без ленты сделок, без строк сверки «прогноз против факта», без подписи разброса. Страница про точность — без единого доказательства. 106 КБ вместо 241 КБ.
Нашлось не по жалобе, а потому что в проверке деплоя стоял положительный контроль — маркер, который обязан присутствовать и в старой, и в новой версии. Новый токен контраста приехал, а контроль дал ноль. Без него я бы отчитался «правка выкачена» на странице, потерявшей половину содержимого.
Причина
ПТИЦА и МЕРА — разные compose-проекты, но оба назвали свой сервис
backendи оба подключены к общей сетиgendesign_shared. Изнутри фронта МЕРЫ:BACKEND_URL=http://backend:8000уводил серверный рендер в бэкенд ПТИЦЫ. Тот отвечал401 no authenticated user— и страница рендерилась пустой.Почему это не заметили раньше
Отказ тихий вдвойне:
fetchне бросает — приходит валидный HTTP-ответ, просто из чужого сервиса. Никакой ошибки в логах.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, и страница рендерилась пустой. Отказ тихий вдвойне. fetch не бросает — приходит валидный HTTP-ответ, просто чужой. И имя двоится, поэтому часть перегенераций попадала в правильный адрес: утром страница была с данными, к обеду без них, и это выглядело случайной поломкой, а не ошибкой конфигурации. DATABASE_URL болен тем же: @postgres:5432 мог уйти в базу ПТИЦЫ. Там спасало лишь несовпадение кредов — отказ вместо тихого чтения не тех данных. Полагаться на это нельзя: защита держится на том, что у чужой базы нет пользователя с нашим паролем. Переведён на однозначное имя во всех трёх сервисах. Гейт check-compose-ambiguous-hosts.py: пересечение имён сервисов обоих compose и запрет ссылаться на них как на хост. Селфтест по конвенции соседних гейтов — он провалился дважды на моих же фикстурах (в них не было общего имени, то есть ловить было нечего), и это ровно то, ради чего селфтест и нужен. Фальсификация на настоящем файле: возврат backend:8000 даёт точную строку 479, возврат @postgres — все четыре ссылки.