#!/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:-}', 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"