All checks were successful
CI Trade-In / changes (pull_request) Successful in 11s
CI / changes (pull_request) Successful in 12s
CI Trade-In / backend-tests (pull_request) Has been skipped
CI / backend-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
CI Trade-In / frontend-checks (pull_request) Successful in 1m17s
Отдельный поддомен mera.gendsgn.ru вместо дырки в auth-gate gendsgn.ru — на новом site-блоке B2B-маршруты (v2, admin, scrapers, /trade-in/api/*) физически не объявлены, basic_auth не импортируется вообще. Allowlist-by-default: только корень "/" (rewrite на /trade-in/mera-public) + статика Next _next/*, всё остальное — 404. Публичная страница-заглушка (tradein-mvp/frontend/src/app/mera-public/) не тянет RouteGuard/SupportChatProvider функционально — RouteGuard получил безусловный bypass для этого пути (аналог существующего /ui-preview, но always-on, не за dev-флагом); сама страница — server component без useMe/useQuota/useHistory. robots: noindex на этом этапе. CI-регресс на периметр: scripts/smoke-mera-perimeter.sh (4 проверки: публичный поддомен 200, B2B-путь на нём 404, gendsgn.ru/trade-in/v2 и /api/v1/admin/* по-прежнему 401 анониму) + .forgejo/workflows/perimeter-smoke.yml (workflow_dispatch + daily cron — не pre-merge гейт, требует реального DNS). Требуется DNS: A-record mera.gendsgn.ru → IP VPS. До появления записи ACME для нового хоста будет ретраить с backoff, остальные site-блоки не страдают (автоматический HTTPS в Caddy изолирован per-hostname).
63 lines
3 KiB
Bash
63 lines
3 KiB
Bash
#!/usr/bin/env bash
|
||
# Регресс-тест публичного B2C-периметра МЕРА (ЭТАП 1 плана B2C-запуска).
|
||
#
|
||
# Проверяет 4 инварианта периметра (см. корневой Caddyfile):
|
||
# 1. mera.gendsgn.ru отдаёт 200 анонимно (публичная заглушка).
|
||
# 2. mera.gendsgn.ru/v2 (B2B-путь) отдаёт 404 — allowlist-by-default,
|
||
# НЕ был случайно проброшен на B2B-дерево tradein-frontend.
|
||
# 3. gendsgn.ru/trade-in/v2 по-прежнему отдаёт 401 анониму (basic_auth gate
|
||
# не тронут этим этапом).
|
||
# 4. gendsgn.ru/api/v1/admin/* отдаёт 401 анониму (тот же gate).
|
||
#
|
||
# ВАЖНО: проверки 1 и 2 требуют, чтобы DNS A-record mera.gendsgn.ru → IP VPS
|
||
# уже существовал И деплой прошёл (сертификат Let's Encrypt выпущен). Пока
|
||
# записи нет — они ожидаемо падают (DNS resolution failure / TLS handshake
|
||
# failure), это НЕ регресс периметра gendsgn.ru. Проверки 3 и 4 не зависят от
|
||
# DNS нового поддомена и обязаны быть зелёными всегда.
|
||
#
|
||
# Запуск вручную:
|
||
# bash scripts/smoke-mera-perimeter.sh
|
||
# Запуск в CI: .forgejo/workflows/perimeter-smoke.yml (workflow_dispatch + daily cron).
|
||
set -uo pipefail
|
||
|
||
BASE_MERA="${SMOKE_MERA_BASE:-https://mera.gendsgn.ru}"
|
||
BASE_MAIN="${SMOKE_MAIN_BASE:-https://gendsgn.ru}"
|
||
|
||
fail=0
|
||
|
||
check() {
|
||
local desc="$1" url="$2" expected="$3"
|
||
local code
|
||
code=$(curl -s -o /dev/null -w '%{http_code}' --max-time 15 "$url" 2>/dev/null)
|
||
if [ "$code" = "$expected" ]; then
|
||
echo "PASS: $desc ($url -> $code)"
|
||
else
|
||
echo "FAIL: $desc ($url -> got '${code:-<no response>}', expected $expected)"
|
||
fail=1
|
||
fi
|
||
}
|
||
|
||
echo "== МЕРА B2C perimeter smoke (ЭТАП 1) =="
|
||
|
||
# 1. Публичный поддомен отдаёт 200 анонимно.
|
||
check "mera.gendsgn.ru root — public 200" "$BASE_MERA/" 200
|
||
|
||
# 2. B2B-путь на публичном поддомене — 404 (allowlist-by-default), не 200/401.
|
||
check "mera.gendsgn.ru/v2 — B2B path must 404" "$BASE_MERA/v2" 404
|
||
|
||
# 3. gendsgn.ru/trade-in/v2 по-прежнему закрыт basic_auth анониму.
|
||
check "gendsgn.ru/trade-in/v2 — still 401 anonymous" "$BASE_MAIN/trade-in/v2" 401
|
||
|
||
# 4. gendsgn.ru/api/v1/admin/* отдаёт 401 анониму (auth gate стоит ДО роутинга
|
||
# в FastAPI — конкретный путь неважен, любой /api/v1/admin/* перехватывается
|
||
# на уровне Caddy до бэкенда).
|
||
check "gendsgn.ru/api/v1/admin/* — 401 anonymous" "$BASE_MAIN/api/v1/admin/users" 401
|
||
|
||
echo "========================================"
|
||
if [ "$fail" -eq 0 ]; then
|
||
echo "ALL CHECKS PASSED"
|
||
else
|
||
echo "SOME CHECKS FAILED — see FAIL lines above"
|
||
fi
|
||
|
||
exit "$fail"
|