fix(caddy): окно деплоя — 503 «Сервис обновляется» с Retry-After вместо голого 502 на публичных путях МЕРЫ #3348
2 changed files with 25 additions and 7 deletions
|
|
@ -778,6 +778,9 @@ services:
|
||||||
# роняя ВСЕ сайты хоста, а не только metrics.gendsgn.ru.
|
# роняя ВСЕ сайты хоста, а не только metrics.gendsgn.ru.
|
||||||
- ./caddy/metrics-ingest.caddy.snippet:/etc/caddy/caddy/metrics-ingest.caddy.snippet:ro
|
- ./caddy/metrics-ingest.caddy.snippet:/etc/caddy/caddy/metrics-ingest.caddy.snippet:ro
|
||||||
- ./caddy/metrics-ui.caddy.snippet:/etc/caddy/caddy/metrics-ui.caddy.snippet:ro
|
- ./caddy/metrics-ui.caddy.snippet:/etc/caddy/caddy/metrics-ui.caddy.snippet:ro
|
||||||
|
# То же самое для страницы окна деплоя (#3274): caddy/sites/apps.caddy
|
||||||
|
# импортирует её как `import ../deploy-window.caddy.snippet`.
|
||||||
|
- ./caddy/deploy-window.caddy.snippet:/etc/caddy/caddy/deploy-window.caddy.snippet:ro
|
||||||
# Untracked локальные site-блоки (см. import в конце Caddyfile). Каталог
|
# Untracked локальные site-блоки (см. import в конце Caddyfile). Каталог
|
||||||
# держится в git через caddy/local/.gitignore — иначе docker создал бы
|
# держится в git через caddy/local/.gitignore — иначе docker создал бы
|
||||||
# отсутствующий bind-source сам, root-owned пустышкой.
|
# отсутствующий bind-source сам, root-owned пустышкой.
|
||||||
|
|
|
||||||
|
|
@ -52,15 +52,22 @@ check() {
|
||||||
}
|
}
|
||||||
|
|
||||||
check_post() {
|
check_post() {
|
||||||
local desc="$1" url="$2" body="$3" expected="$4"
|
local desc="$1" url="$2" body="$3" expected="$4" reject="${5:-}"
|
||||||
local code
|
local out code head_and_body
|
||||||
code=$(curl -s -o /dev/null -w '%{http_code}' --max-time 15 \
|
# -i: заголовки попадают в вывод вместе с телом — по ним отличаем ответ
|
||||||
|
# приложения от заглушки Caddy (см. $reject у вызова payments/notify).
|
||||||
|
out=$(curl -s -i -w '\n%{http_code}' --max-time 15 \
|
||||||
-X POST -H 'Content-Type: application/json' -d "$body" "$url" 2>/dev/null)
|
-X POST -H 'Content-Type: application/json' -d "$body" "$url" 2>/dev/null)
|
||||||
if [ "$code" = "$expected" ]; then
|
code=${out##*$'\n'}
|
||||||
echo "PASS: $desc ($url -> $code)"
|
head_and_body=${out%$'\n'*}
|
||||||
else
|
if [ "$code" != "$expected" ]; then
|
||||||
echo "FAIL: $desc ($url -> got '${code:-<no response>}', expected $expected)"
|
echo "FAIL: $desc ($url -> got '${code:-<no response>}', expected $expected)"
|
||||||
fail=1
|
fail=1
|
||||||
|
elif [ -n "$reject" ] && printf '%s' "$head_and_body" | grep -qEi "$reject"; then
|
||||||
|
echo "FAIL: $desc ($url -> $code, но ответ от заглушки окна деплоя, а не от приложения)"
|
||||||
|
fail=1
|
||||||
|
else
|
||||||
|
echo "PASS: $desc ($url -> $code)"
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -251,8 +258,16 @@ check "meraocenka.ru payments/checkout — must 404 (Caddy не проксиру
|
||||||
# маршрут существует (не 404 — старый образ) И что приём платежей выключен
|
# маршрут существует (не 404 — старый образ) И что приём платежей выключен
|
||||||
# (`payments_enabled=False`). 200 здесь означал бы, что флаг включили, не тронув
|
# (`payments_enabled=False`). 200 здесь означал бы, что флаг включили, не тронув
|
||||||
# этот смоук. GET → 405 закрепляет, что путь принимает только POST.
|
# этот смоук. GET → 405 закрепляет, что путь принимает только POST.
|
||||||
|
#
|
||||||
|
# С #3274 голый код 503 больше не доказывает ничего: Caddy сам отдаёт 503 на
|
||||||
|
# окне деплоя (`handle_errors` -> caddy/deploy-window.caddy.snippet), и тогда
|
||||||
|
# запрос до приложения не дошёл вовсе. Отличаем по признакам заглушки —
|
||||||
|
# заголовок `Retry-After: 30` и `"error":"service_unavailable"` в теле; у
|
||||||
|
# приложения тело `{"detail":"payments are disabled"}` и никакого Retry-After.
|
||||||
|
# Совпал код, но пришла заглушка → FAIL, а не молчаливый PASS.
|
||||||
check_post "trade-in payments/notify — 503 anonymous (маршрут есть, приём выключен)" \
|
check_post "trade-in payments/notify — 503 anonymous (маршрут есть, приём выключен)" \
|
||||||
"$BASE_MAIN/trade-in/api/v1/trade-in/payments/notify" '{}' 503
|
"$BASE_MAIN/trade-in/api/v1/trade-in/payments/notify" '{}' 503 \
|
||||||
|
'service_unavailable|^retry-after: *30'
|
||||||
check "trade-in payments/notify — 405 на GET (только POST)" \
|
check "trade-in payments/notify — 405 на GET (только POST)" \
|
||||||
"$BASE_MAIN/trade-in/api/v1/trade-in/payments/notify" 405
|
"$BASE_MAIN/trade-in/api/v1/trade-in/payments/notify" 405
|
||||||
check "trade-in payments/checkout — 401 anonymous (не публичный по построению)" \
|
check "trade-in payments/checkout — 401 anonymous (не публичный по построению)" \
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue