From 5f5bfa8a83f2c6acd9d5c098522589f4d584c509 Mon Sep 17 00:00:00 2001 From: bot-backend Date: Sat, 12 Sep 2026 01:22:56 +0500 Subject: [PATCH] =?UTF-8?q?fix(caddy):=20=D1=80=D0=B5=D1=82=D1=80=D0=B0?= =?UTF-8?q?=D0=B9=20=D0=BF=D0=BE=D0=B4=D0=BA=D0=BB=D1=8E=D1=87=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D1=8F=20=D0=BA=20=D1=84=D1=80=D0=BE=D0=BD=D1=82=D1=83=20?= =?UTF-8?q?=D0=9C=D0=95=D0=A0=D0=AB=20=E2=80=94=20=D0=BE=D1=81=D1=82=D0=B0?= =?UTF-8?q?=D1=82=D0=BE=D0=BA=20=D0=BE=D0=BA=D0=BD=D0=B0=20=D0=BF=D0=BE?= =?UTF-8?q?=D0=B4=D0=BC=D0=B5=D0=BD=D1=8B=20(#3274,=20=D1=87=D0=B0=D1=81?= =?UTF-8?q?=D1=82=D1=8C=202a/3)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Только caddy/sites/apps.caddy: по фильтру deploy.yml это caddy_only=true → джоба deploy-caddy с 'caddy reload' (~1 с), без полного деплоя ПТИЦЫ. Гейт и шаг ci.yml едут отдельной частью 2b, которая не триггерит ничего. --- caddy/sites/apps.caddy | 43 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) 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 } } -- 2.45.3