Compare commits

...
Sign in to create a new pull request.

1 commit

Author SHA1 Message Date
4b89138db5 fix(ops): канарейка смоука сработала на мерже PR-D3 — обновляю ожидания вместе с ней
После мержа платёжного роутера (#3231) perimeter-smoke стал красным на проде:

  FAIL: trade-in payments/notify — 401 anonymous (rbac закрыт до PR-D3)
        gendsgn.ru/.../payments/notify -> got '405', expected 401

Это НЕ поломка, а срабатывание канарейки, которую сам скрипт и обещал:
«осознанно станет красной, когда PR-D3 явно откроет эти пути — тогда ожидания
здесь надо обновить вместе с ними». Я смержил PR-D3 и ожидание не обновил.

Что изменилось по существу: /payments/notify теперь в rbac._PUBLIC_PATHS —
вебхук Т-Банка не умеет присылать X-Authenticated-User, аутентификация там
подписью тела. /payments/checkout НЕ открывался и остаётся под 401.

Проверка переведена с GET на POST: GET по POST-only маршруту даёт 405 и не
говорит ничего ни про rbac, ни про флаг. POST с пустым телом проходит rbac
(иначе 401) и упирается в выключенный контур — 503.

Заодно закрыты три дыры в покрытии смоука, все замерены на проде:
· /stats и /showcase — ручки, из которых лэндинг берёт числа. При их отказе
  страница по построению рендерится БЕЗ блоков (честная деградация), то есть
  тихо. Ничем другим это не ловится.
· /estimate и /estimate/read — обязаны быть неотличимы от несуществующего
  пути при выключенном флаге. До #3233 отвечали 422 с перечнем своих полей.

Путь длинный (/trade-in/api/public/...) намеренно: короткого на публичном
домене нет, а по нему ходит фронт — проба обязана идти рабочим трактом.

Следующая канарейка отмечена в комментарии: при включении PAYMENTS_ENABLED
503 станет отказом по подписи, и ожидание надо будет обновить вместе с флагом.

Прогон на проде: ALL CHECKS PASSED.
2026-08-29 20:49:49 +05:00

View file

@ -190,11 +190,51 @@ check "meraocenka.ru payments/notify — must 404 (Caddy не проксируе
"$BASE_MERA/trade-in/api/v1/trade-in/payments/notify" 404
check "meraocenka.ru payments/checkout — must 404 (Caddy не проксирует, PR-D4)" \
"$BASE_MERA/trade-in/api/v1/trade-in/payments/checkout" 404
check "trade-in payments/notify — 401 anonymous (rbac закрыт до PR-D3)" \
"$BASE_MAIN/trade-in/api/v1/trade-in/payments/notify" 401
check "trade-in payments/checkout — 401 anonymous (rbac закрыт до PR-D3)" \
# PR-D3 СМЕРЖЕН 29.08.2026 — канарейка сработала ровно как обещано выше, и её
# ожидания обновлены вместе с ней (иначе смоук остался бы красным навсегда и
# перестал бы что-либо значить).
#
# Что изменилось: `/payments/notify` теперь В `rbac._PUBLIC_PATHS` — иначе
# вебхук Т-Банка получал бы 401, а банк не умеет присылать X-Authenticated-User.
# Аутентификация там — подпись `Token` тела, её проверяет сам хендлер.
# `/payments/checkout` открыт НЕ был и остаётся под 401: его зовёт наш же фронт.
#
# Проверяем POST'ом, а не GET'ом: GET по POST-only маршруту даёт 405, и это
# ничего не говорит ни про rbac, ни про флаг. POST с пустым телом проходит
# rbac (иначе 401) и упирается в выключенный контур — 503.
#
# ⚠️ СЛЕДУЮЩАЯ КАНАРЕЙКА ЗДЕСЬ ЖЕ: когда владелец включит PAYMENTS_ENABLED,
# этот 503 станет отказом по подписи (400/403). Тогда ожидание надо обновить
# ВМЕСТЕ с включением флага — не подгонять задним числом.
check_post "trade-in payments/notify — 503 anonymous (rbac пропускает, контур выключен)" \
"$BASE_MAIN/trade-in/api/v1/trade-in/payments/notify" '{}' 503
check "trade-in payments/checkout — 401 anonymous (закрыт, зовёт только наш фронт)" \
"$BASE_MAIN/trade-in/api/v1/trade-in/payments/checkout" 401
# ── Публичные ручки витрины лэндинга (29.08.2026) ────────────────────────────
#
# Числа на лэндинге приходят из этих двух ручек. Если они отвалятся, страница
# по построению отрендерится БЕЗ блоков (честная деградация) — то есть тихо и
# незаметно. Поэтому проверяем их здесь: молчаливое исчезновение витрины
# ничем другим не ловится.
#
# Путь длинный (`/trade-in/api/public/...`) НАМЕРЕННО: короткого
# `/api/public/...` на публичном домене нет, и один и тот же адрес обязан
# работать с обоих хостов — см. шапку frontend/src/app/mera-public/public-api.ts.
check "meraocenka.ru /stats — public 200" \
"$BASE_MERA/trade-in/api/public/mera/stats" 200
check "meraocenka.ru /showcase — public 200" \
"$BASE_MERA/trade-in/api/public/mera/showcase" 200
# Анонимный расчёт закрыт флагом public_estimate_enabled и обязан быть
# НЕОТЛИЧИМ от несуществующего пути. До 29.08 он отвечал 422 с перечнем своих
# полей: проверка флага стояла в теле хендлера, а FastAPI валидирует тело
# раньше. Гейт переехал в зависимости маршрута; здесь — прод-подтверждение.
check_post "meraocenka.ru /estimate — 404 при выключенном флаге (схема не течёт)" \
"$BASE_MERA/trade-in/api/public/mera/estimate" '{}' 404
check_post "meraocenka.ru /estimate/read — 404 при выключенном флаге" \
"$BASE_MERA/trade-in/api/public/mera/estimate/read" '{}' 404
echo "========================================"
if [ "$fail" -eq 0 ]; then
echo "ALL CHECKS PASSED"