Merge pull request 'fix(caddy): ретрай подключения к фронту МЕРЫ — остаток окна подмены (#3274, часть 2a/3)' (#3446) from fix/3274-part2a-caddy-retry into main
All checks were successful
Deploy Infra Host / sync-infra-host (push) Successful in 5s
Deploy / changes (push) Successful in 7s
Deploy / deploy-caddy (push) Has been skipped
Deploy / build-backend (push) Successful in 38s
Deploy / build-worker (push) Successful in 41s
Deploy / build-frontend (push) Successful in 39s
Deploy / deploy (push) Successful in 1m30s
Deploy / deploy-status (push) Successful in 2s
Deploy / perimeter-smoke (push) Successful in 1m41s

This commit is contained in:
bot-backend 2026-09-11 20:37:57 +00:00
commit 84920e6cbd

View file

@ -42,6 +42,40 @@
# код.
# ═══════════════════════════════════════════════════════════════════════════
# ── (tradein_frontend_retry) — подмена контейнера фронта без 502 (#3274) ─────
#
# ЧТО ЭТО. Ретрай ПОДКЛЮЧЕНИЯ к tradein-frontend: пока идёт подмена
# контейнера, Caddy не отдаёт ошибку сразу, а до 2 с переспрашивает апстрим с
# шагом 100 мс. Импортируется ВНУТРЬ каждого `reverse_proxy tradein-frontend`
# в этом файле (9 блоков: gendsgn.ru/trade-in/* и все публичные пути
# meraocenka.ru).
#
# ПОЧЕМУ ЭТО НЕ ТО, ЧТО ОТВЕРГНУТО В #3274. Там `lb_try_duration` отвергнут
# для окна 3090 с — держать посетителя минуту в ожидании хуже честной
# ошибки, инструмент рассчитан на разрыв в сотни миллисекунд. Правка в
# deploy-tradein.yml (frontend вынесен из общего `up -d`) СНАЧАЛА сводит окно
# к этим сотням миллисекунд, и только после этого ретрай становится
# применим. Числа, на которых это стоит (замеры 11.09):
# - прод, ОДИН сервис в `up -d`: контейнер создан 16:42:17.5 → запущен
# 16:42:18.0 — 0,5 с;
# - прод, ПАЧКА сервисов в одном `up -d`: создан 15:01:40 → запущен
# 15:02:10 — 30 с (фаза start ждёт готовности зависимостей, а старый
# контейнер снесён ещё в фазе create);
# - стенд (реальный образ фронта + Caddy 2), одиночная подмена: без ретрая
# 1 × 502, с ретраем 241/241 × 200, один запрос подождал 0,55 с.
#
# ПОТОЛОК. 2 с — это ЦЕНА ОЖИДАНИЯ при настоящей аварии: если фронт лежит
# долго, каждый запрос сначала висит 2 с и лишь потом получает 503-заглушку
# (../deploy-window.caddy.snippet). Поэтому не «побольше на всякий случай»:
# запас над измеренными 0,5 с четырёхкратный, дальше растёт только вред.
# Бэкенду (tradein-backend) этот приём НАМЕРЕННО не дан: его старт — единицы
# секунд (uvicorn + подключение к БД), там 2 с не хватит, а больше — уже тот
# самый вред. Его окно закрывается отдельно, не этой правкой.
(tradein_frontend_retry) {
lb_try_duration 2s
lb_try_interval 100ms
}
# Caddy config.
#
# - gendsgn.ru — main production site, auto-TLS via Let's Encrypt.
@ -137,6 +171,7 @@ gendsgn.ru {
@uipreview path /trade-in/ui-preview/* /trade-in/_next/static/*
handle @uipreview {
reverse_proxy tradein-frontend:3000 {
import tradein_frontend_retry
# #2558 review: тот же периметр-scrub, что и у /trade-in/api/* и
# @tradein ниже — этот блок тоже теперь ДО basic_auth, клиент
# мог бы прислать свой X-Authenticated-User. Сейчас инертно
@ -240,6 +275,7 @@ gendsgn.ru {
handle @tradein {
# Next.js basePath=/trade-in — фронт сам ждёт префикса в URL
reverse_proxy tradein-frontend:3000 {
import tradein_frontend_retry
# См. комментарий над /trade-in/api/* выше — та же логика (явное
# удаление вместо Set с пустым {http.auth.user.id}), и по той же
# причине здесь больше нет инжекта X-Internal-Auth-Secret
@ -355,6 +391,7 @@ meraocenka.ru {
handle / {
rewrite * /trade-in/mera-public
reverse_proxy tradein-frontend:3000 {
import tradein_frontend_retry
# Тот же периметр-скраб, что у @uipreview (:87) и @tradein ниже.
# Этот блок вообще не под basic_auth, поэтому анонимный клиент
# тем более может прислать свой X-Authenticated-User. Сейчас
@ -405,6 +442,7 @@ meraocenka.ru {
handle @meraPages {
rewrite * /trade-in/mera-public{path}
reverse_proxy tradein-frontend:3000 {
import tradein_frontend_retry
header_up -X-Authenticated-User
}
}
@ -571,6 +609,7 @@ meraocenka.ru {
respond @foreignRouteChunk 404
reverse_proxy tradein-frontend:3000 {
import tradein_frontend_retry
header_up -X-Authenticated-User
}
}
@ -581,6 +620,7 @@ meraocenka.ru {
handle /favicon.ico {
rewrite * /trade-in/favicon.ico
reverse_proxy tradein-frontend:3000 {
import tradein_frontend_retry
header_up -X-Authenticated-User
}
}
@ -594,6 +634,7 @@ meraocenka.ru {
handle /robots.txt {
rewrite * /trade-in/robots.txt
reverse_proxy tradein-frontend:3000 {
import tradein_frontend_retry
header_up -X-Authenticated-User
}
}
@ -613,6 +654,7 @@ meraocenka.ru {
handle /og-mera.png {
rewrite * /trade-in/og-mera.png
reverse_proxy tradein-frontend:3000 {
import tradein_frontend_retry
header_up -X-Authenticated-User
}
}
@ -624,6 +666,7 @@ meraocenka.ru {
handle /logo-mera.png {
rewrite * /trade-in/logo-mera.png
reverse_proxy tradein-frontend:3000 {
import tradein_frontend_retry
header_up -X-Authenticated-User
}
}