diff --git a/caddy/sites/apps.caddy b/caddy/sites/apps.caddy index b01dbdea..5a47e1bd 100644 --- a/caddy/sites/apps.caddy +++ b/caddy/sites/apps.caddy @@ -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` отвергнут +# для окна 30–90 с — держать посетителя минуту в ожидании хуже честной +# ошибки, инструмент рассчитан на разрыв в сотни миллисекунд. Правка в +# 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 } }