diff --git a/README.md b/README.md index 494670c..36e3633 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ Web Docker-образ устанавливает зависимости чере Идёт исправление аудита: актуальные изменения и ограничения перечислены в [AUDIT_FIXES.md](docs/AUDIT_FIXES.md). Production Compose включает community scheduler; страницы rules/privacy реализованы. Для запуска остаются сервер, DNS/TLS, секреты, внешний backup и контакты. Шкала 72 часов использует полную выборку по времени поступления; одинаковые поля разных источников больше не считаются доказательством одного события. Фоновая публикация обновляет кэш API в пределах TTL, не мгновенно. -Полный аудит 8 сентября: [отчёт](docs/PROJECT_AUDIT_2026-09-08.md), [приоритетный план](docs/ROADMAP.md#ближайший-рабочий-пакет). Перед production нужно исправить Caddy-маршруты формы, конфликт Basic/Bearer admin-аутентификации и исходящую сеть community scheduler. Затем — клиентский rate limit, надёжность парсеров, согласованность фильтров/оценок и HTTP/SEO-контракт ошибок. +Полный аудит 8 сентября: [отчёт](docs/PROJECT_AUDIT_2026-09-08.md), [приоритетный план](docs/ROADMAP.md#ближайший-рабочий-пакет). T01 выполнен: Caddy-маршруты формы исправлены и проверены через временный proxy командой `sh deploy/test-proxy-routing.sh` на запущенном локальном Compose. Перед production остаются конфликт Basic/Bearer admin-аутентификации и исходящая сеть community scheduler. Затем — клиентский rate limit, надёжность парсеров, согласованность фильтров/оценок и HTTP/SEO-контракт ошибок. На ширинах 320, 390, 768 и 1280 px ранее проверено отсутствие горизонтального переполнения основных страниц. Это не полная визуальная приёмка: аудит обнаружил неверную desktop-компоновку фильтров; наполненные карточки, длинные названия, клавиатура и zoom остаются отдельной задачей. diff --git a/deploy/test-proxy-routing.sh b/deploy/test-proxy-routing.sh new file mode 100644 index 0000000..7fb217e --- /dev/null +++ b/deploy/test-proxy-routing.sh @@ -0,0 +1,47 @@ +#!/bin/sh +# Verify the actual production Caddy routes against an already running local stack. +# Invalid form submissions exercise Astro redirects without creating database rows. +set -eu +repo=$(CDPATH= cd -- "$(dirname "$0")/.." && pwd) +cd "$repo" +web_id=$(docker compose ps -q web) +test -n "$web_id" || { echo "Start the local Compose stack first" >&2; exit 1; } +network=$(docker inspect --format '{{range $name, $_ := .NetworkSettings.Networks}}{{$name}}{{println}}{{end}}' "$web_id") +test "$(printf '%s\n' "$network" | wc -l)" -eq 1 || { + echo "Routing test requires a local web container with exactly one network" >&2; exit 1; +} +container="rf4-proxy-routing-$$" +cleanup() { docker stop "$container" >/dev/null 2>&1 || true; } +trap cleanup EXIT INT TERM +# Test-only Basic Auth hash from the Caddy documentation. No production secrets. +docker run --rm -d --name "$container" --network "$network" \ + -p 127.0.0.1::8080 \ + -e SITE_DOMAIN=http://localhost:8080 \ + -e FILES_DOMAIN=http://localhost:8081 \ + -e ACME_EMAIL=routing-test@example.com \ + -e ADMIN_BASIC_USER=route-test \ + -e 'ADMIN_BASIC_PASSWORD_HASH=$2a$14$Zkx19XLiW6VYouLHR5NmfOFU0z2GTNmpkT/5qqR7hx4IjWJPDhjvG' \ + -v "$repo/deploy/Caddyfile:/etc/caddy/Caddyfile:ro" \ + caddy:2.10.2-alpine >/dev/null +port=$(docker inspect --format '{{(index (index .NetworkSettings.Ports "8080/tcp") 0).HostPort}}' "$container") +base="http://127.0.0.1:$port" +attempt=0 +until curl -fsS --max-time 2 -H 'Host: localhost:8080' "$base/health" >/dev/null 2>&1; do + attempt=$((attempt + 1)) + if [ "$attempt" -ge 20 ]; then docker logs "$container" >&2; exit 1; fi + sleep 1 +done +check_redirect() { + headers=$(curl -sS --max-time 15 -D - -o /dev/null \ + -H 'Host: localhost:8080' -H 'Origin: http://localhost:8080' --data '' "$base$1") + if ! printf '%s\n' "$headers" | grep -Eq '^HTTP/[0-9.]+ 303 ' || + ! printf '%s\n' "$headers" | grep -Fi "location: $2" >/dev/null; then + printf 'Unexpected response for %s:\n%s\n' "$1" "$headers" >&2 + exit 1 + fi +} +check_redirect /api/report '/report?state=create_error' +check_redirect /api/report-screenshot '/report?state=screenshot_error&report_id=' +curl -fsS --max-time 15 -H 'Host: localhost:8080' "$base/api/v1/fishes?limit=1" >/dev/null +curl -fsS --max-time 15 -H 'Host: localhost:8080' "$base/ready" >/dev/null +echo "Proxy routing passed: Astro form redirects, FastAPI catalog and health/readiness" diff --git a/docs/AUDIT_FIXES.md b/docs/AUDIT_FIXES.md index 14eed88..9fe2beb 100644 --- a/docs/AUDIT_FIXES.md +++ b/docs/AUDIT_FIXES.md @@ -4,6 +4,8 @@ ## Исправлено в рабочей версии +- [x] T01 полного аудита: маршруты `/api/report` и `/api/report-screenshot` достигают Astro через Caddy; FastAPI получает `/api/v1/*`, health/readiness. 9 сентября: `sh deploy/test-proxy-routing.sh` проходит на локальном стенде с корректным Origin; создание реальной заявки через production proxy остаётся частью T06. + - [x] Очередь внешних наблюдений фильтруется в SQL до limit/offset; UI показывает по 50 записей с навигацией, опубликованные записи не вытесняют ожидающие проверки. - [x] Таймаут SSR-запроса к API: 8 секунд. Все пять страниц каталогов возвращают 503, Retry-After и no-store при сбое API; отсутствие сущности по-прежнему даёт 404. diff --git a/docs/PROJECT_AUDIT_2026-09-08.md b/docs/PROJECT_AUDIT_2026-09-08.md index 9ec4357..734fe68 100644 --- a/docs/PROJECT_AUDIT_2026-09-08.md +++ b/docs/PROJECT_AUDIT_2026-09-08.md @@ -1,5 +1,7 @@ # Аудит RF4 Spotter — 8 сентября 2026 +Обновление 9 сентября: T01 исправлен (`bb61d21`) и проверен скриптом `deploy/test-proxy-routing.sh`. Ниже сохранены исходные находки аудита; актуальные отметки выполнения — в ROADMAP. T02/T03 остаются блокерами production. + База проверки: commit `486b4e9`. Аудит охватывает production-конфигурацию, API, импорт и публикацию данных, Astro, пользовательские сценарии, визуальную идентичность и SEO. Это отчёт о текущем состоянии, а не подтверждение готовности к запуску. Исправления приложения в этот пакет не входят. ## Вывод diff --git a/docs/ROADMAP.md b/docs/ROADMAP.md index b48cdca..309bf82 100644 --- a/docs/ROADMAP.md +++ b/docs/ROADMAP.md @@ -180,11 +180,11 @@ ## Ближайший рабочий пакет -Production-контур требует исправлений до запуска. Доказательства и критерии приёмки каждого ID находятся в [полном аудите](PROJECT_AUDIT_2026-09-08.md). Следующая задача — **T01**, затем T02 и T03. Инфраструктурные изменения можно объединить в один проверочный Compose-прогон. +Production-контур требует исправлений до запуска. Доказательства и критерии приёмки каждого ID находятся в [полном аудите](PROJECT_AUDIT_2026-09-08.md). Следующая задача — **T02**, затем T03. Инфраструктурные изменения можно объединить в один проверочный Compose-прогон. ### P0 — блокеры production -- [ ] T01: исправить Caddy-маршруты формы и повторной загрузки скриншота. +- [x] T01: Caddy направляет в FastAPI только `/api/v1/*`, `/health`, `/ready`, обработчики формы остаются в Astro (правка `bb61d21`). Проверено 9 сентября: `sh deploy/test-proxy-routing.sh`, оба POST дают ожидаемый 303, каталог и readiness доступны. Тест использует временный proxy и не создаёт уловов; успешная отправка с сохранением входит в T06. - [ ] T02: согласовать Basic/Bearer admin-аутентификацию через production proxy. - [ ] T03: обеспечить исходящую сеть community scheduler при изоляции БД/MinIO.