fix(smoke): периметр требовал 401 от вебхука, который PR-D3 открыл намеренно #3238

Merged
bot-backend merged 1 commit from fix/smoke-payments-notify-after-d3 into main 2026-08-29 15:51:08 +00:00
Owner

Main сейчас красный на деплое. Чинит его.

Что упало

Деплой после мержа #3237 прошёл (deploy и deploy-status зелёные), но perimeter-smoke дал:

FAIL: trade-in payments/notify — 401 anonymous → got '405', expected 401

Это не регрессия, а сработавшая канарейка

PR-D3 (#3231, платёжный роутер) смержен сегодня и внёс payments/notify в _PUBLIC_PATHSосознанно: это вебхук банка, он обязан быть достижим без наших заголовков. В теле #3231 прямо написано, что 401 здесь означал бы поломку: «401 — что путь не попал в _PUBLIC_PATHS и вебхук банка получил бы отказ».

Комментарий в самом смоуке (заведён в PR-D2) это и предсказывал: «канарейка: осознанно станет красной, когда PR-D3/PR-D4 явно откроют эти пути — тогда ожидания здесь надо обновить вместе с ними». Открыли, обновить забыли.

Периметр проверен фактически, а не по намерению

проверка результат
POST /payments/notify 503 — флаг payments_enabled выключен
GET /payments/notify 405 — маршрут только для POST
POST /payments/checkout 401 — не публичный, таким и остаётся
meraocenka.ru оба пути 404 — Caddy не проксирует
payments / payment_notifications / payment_entitlements 0 / 0 / 0

PAYMENTS_ENABLED на проде не задан. Утечки нет.

Правка усиливает проверку, а не ослабляет

Вместо GET → 401 теперь POST → 503. Это утверждает сразу два факта, которых прежняя проверка не давала:

  • маршрут существует (404 означал бы, что выкатился старый образ);
  • приём платежей выключен (200 поймает включение флага, сделанное мимо этого смоука).

Плюс отдельная GET → 405 закрепляет, что путь принимает только POST.

Ожидания под meraocenka.ru не тронуты: PR-D4 не смержен, 404 там остаётся канарейкой. Заодно снята устаревшая подпись у checkout («rbac закрыт до PR-D3» → «не публичный по построению»), и в комментарии над блоком записано, что ожидания правятся в одном PR с тем, который путь открывает.

Приёмка

Полный прогон scripts/smoke-mera-perimeter.sh против живого прода — ALL CHECKS PASSED. bash -n чист.

Refs #3231, #3237.

**Main сейчас красный на деплое.** Чинит его. ## Что упало Деплой после мержа #3237 прошёл (`deploy` и `deploy-status` зелёные), но `perimeter-smoke` дал: ``` FAIL: trade-in payments/notify — 401 anonymous → got '405', expected 401 ``` ## Это не регрессия, а сработавшая канарейка PR-D3 (#3231, платёжный роутер) смержен сегодня и внёс `payments/notify` в `_PUBLIC_PATHS` — **осознанно**: это вебхук банка, он обязан быть достижим без наших заголовков. В теле #3231 прямо написано, что 401 здесь означал бы поломку: «401 — что путь не попал в `_PUBLIC_PATHS` и вебхук банка получил бы отказ». Комментарий в самом смоуке (заведён в PR-D2) это и предсказывал: «канарейка: осознанно станет красной, когда PR-D3/PR-D4 явно откроют эти пути — тогда ожидания здесь надо обновить вместе с ними». Открыли, обновить забыли. ## Периметр проверен фактически, а не по намерению | проверка | результат | |---|---| | `POST /payments/notify` | **503** — флаг `payments_enabled` выключен | | `GET /payments/notify` | 405 — маршрут только для POST | | `POST /payments/checkout` | 401 — не публичный, таким и остаётся | | `meraocenka.ru` оба пути | 404 — Caddy не проксирует | | `payments` / `payment_notifications` / `payment_entitlements` | **0 / 0 / 0** | `PAYMENTS_ENABLED` на проде не задан. Утечки нет. ## Правка усиливает проверку, а не ослабляет Вместо `GET → 401` теперь `POST → 503`. Это утверждает сразу два факта, которых прежняя проверка не давала: - маршрут **существует** (404 означал бы, что выкатился старый образ); - приём платежей **выключен** (200 поймает включение флага, сделанное мимо этого смоука). Плюс отдельная `GET → 405` закрепляет, что путь принимает только POST. Ожидания под `meraocenka.ru` не тронуты: PR-D4 не смержен, 404 там остаётся канарейкой. Заодно снята устаревшая подпись у `checkout` («rbac закрыт до PR-D3» → «не публичный по построению»), и в комментарии над блоком записано, что ожидания правятся в одном PR с тем, который путь открывает. ## Приёмка Полный прогон `scripts/smoke-mera-perimeter.sh` против живого прода — **ALL CHECKS PASSED**. `bash -n` чист. Refs #3231, #3237.
lekss361 added 1 commit 2026-08-29 15:50:19 +00:00
fix(smoke): периметр требовал 401 от вебхука, который PR-D3 открыл намеренно
All checks were successful
CI Trade-In / changes (pull_request) Successful in 9s
CI / changes (pull_request) Successful in 10s
CI Trade-In / backend-tests (pull_request) Has been skipped
CI Trade-In / browser-tests (pull_request) Has been skipped
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / backend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
e13374e319
Деплой main после #3237 покраснел на perimeter-smoke:
  FAIL: trade-in payments/notify — 401 anonymous -> got '405', expected 401

Это не регрессия, а сработавшая канарейка. PR-D3 (#3231) внёс notify в
`_PUBLIC_PATHS` осознанно: это вебхук банка, он обязан быть достижим без наших
заголовков. В теле того PR прямо сказано, что 401 здесь стал бы признаком
поломки («вебхук банка получил бы отказ»). Ожидание в смоуке обновить забыли —
ровно то, о чём предупреждал комментарий над блоком в PR-D2.

Замена не ослабляет проверку, а усиливает: вместо GET→401 теперь POST→503,
что утверждает сразу два факта — маршрут существует (404 означал бы старый
образ) И приём платежей выключен (`payments_enabled=False`). 200 здесь поймает
включение флага, сделанное мимо этого смоука. Плюс GET→405 закрепляет, что путь
принимает только POST.

Проверено на живом проде: POST notify 503, GET notify 405, checkout 401,
meraocenka 404 на обоих путях; payments/payment_notifications/
payment_entitlements пусты. Полный прогон скрипта — ALL CHECKS PASSED.

Ожидания под meraocenka.ru не тронуты: PR-D4 не смержен, 404 там остаётся
канарейкой.
bot-backend merged commit 9e243fd643 into main 2026-08-29 15:51:08 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#3238
No description provided.