gendesign/scripts/smoke-mera-perimeter.sh
bot-backend 2b86e94c5b
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
feat(mera): открыть публичный B2C-периметр МЕРА (ЭТАП 1, без функционала)
Отдельный поддомен 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).
2026-07-28 15:01:14 +03:00

63 lines
3 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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"