1. Матчер статики сужен с /trade-in/_next/* до /trade-in/_next/static/* — тот
же, что у @uipreview (Caddyfile:78), проверенный в проде. Широкий вариант
открывал анонимам /_next/image (оптимизатор картинок, CPU по запросу), который
лэндингу не нужен: next/image, <img> и url() в mera-public не встречаются
вообще, картинок нет, шрифты — next/font/google self-hosted в _next/static/media.
2. Во все три reverse_proxy блока добавлен header_up -X-Authenticated-User —
единообразие с остальным периметром (:87, :129, :169). Блок не под basic_auth,
т.е. анонимный клиент тем более может прислать свой заголовок. Сейчас инертно
(лэндинг статичен), но станет дырой на этапе 5, когда откроется публичный
/estimate.
3. Регресс-тест на сужение: /trade-in/_next/image должен отдавать 404.
Конфликты (add/add + content) разрешены в пользу main: лэндинг #2615 и рефакторинг RouteGuard (вынос GuardedRoute в отдельный чанк, хелпер isPublicPath) уже содержат всё, что добавляла заглушка этой ветки.
Плюс закрыт разрыв на стыке #2615 и этого PR: футер лэндинга ссылается на политику ПДн через next/link, Next с basePath эмитит её как /trade-in/mera-public/privacy — такого handle в блоке периметра не было, ссылка уходила в catch-all 404. Добавлен узкий handle ровно на поддерево лэндинга (НЕ /trade-in/*) + два регресс-теста в смоук на то, что matcher не шире задуманного.
Отдельный поддомен mera.gendsgn.ru вместо дырки в auth-gate gendsgn.ru — на
новом site-блоке B2B-маршруты (v2, admin, scrapers, /trade-in/api/*) физически
не объявлены, basic_auth не импортируется вообще. Allowlist-by-default: только
корень "/" (rewrite на /trade-in/mera-public) + статика Next _next/*, всё
остальное — 404.
Публичная страница-заглушка (tradein-mvp/frontend/src/app/mera-public/) не
тянет RouteGuard/SupportChatProvider функционально — RouteGuard получил
безусловный bypass для этого пути (аналог существующего /ui-preview,
но always-on, не за dev-флагом); сама страница — server component без
useMe/useQuota/useHistory. robots: noindex на этом этапе.
CI-регресс на периметр: scripts/smoke-mera-perimeter.sh (4 проверки: публичный
поддомен 200, B2B-путь на нём 404, gendsgn.ru/trade-in/v2 и /api/v1/admin/*
по-прежнему 401 анониму) + .forgejo/workflows/perimeter-smoke.yml
(workflow_dispatch + daily cron — не pre-merge гейт, требует реального DNS).
Требуется DNS: A-record mera.gendsgn.ru → IP VPS. До появления записи ACME
для нового хоста будет ретраить с backoff, остальные site-блоки не страдают
(автоматический HTTPS в Caddy изолирован per-hostname).