Аудит Supabase backend для онлайн-заявок

Дата актуализации: 13 июля 2026 года.

Итоговый статус

Рабочий приём заявок сейчас обеспечивается Web3Forms. Supabase backend v2 подготовлен в репозитории как будущий второй канал, но не считается введённым в эксплуатацию.

Текущая конфигурация:

lead_capture:
  mode: "web3forms"
  endpoint: ""

Это означает:

Проверенные файлы

Что уже подготовлено в исходниках

Вложенный контракт формы

Edge Function принимает фактический payload:

{
  "schema_version": 1,
  "request_id": "UUID",
  "form_version": "2",
  "client": {},
  "mortgage": {},
  "tracking": {},
  "qualification": {},
  "spam_check": {},
  "personal_data_consent": "yes",
  "consent": true
}

Старый плоский контракт больше не используется новой версией функции.

Совместимая миграция

Новая миграция не удаляет существующую broker_leads и не переписывает базовую миграцию. Она добавляет:

Денежные значения сохраняются и как исходный текст. Это важно для вариантов маткапитал, пока нет, частично и других значений, которые нельзя безусловно преобразовать в число.

Идемпотентность

request_id используется до вставки и на уровне уникального индекса.

Edge Function:

Серверный rate limit

Rate limit выполняется атомарной RPC-функцией consume_broker_lead_rate_limit.

Fingerprint строится как SHA-256 от:

Таблица ограничений не хранит:

При отсутствии миграции или RPC Edge Function возвращает backend_migration_required и не продолжает приём. Это fail-closed поведение защищает от частичного запуска.

CORS и входной запрос

Подготовлены:

Серверная валидация

Функция повторно проверяет:

Клиентская маска телефона не считается доверенным источником.

События и Telegram

После записи создаётся событие created.

При наличии серверных секретов функция может отправить Telegram-уведомление. Результат отражается в:

Ошибка Telegram не удаляет уже сохранённую заявку.

Source-аудит

scripts/audit-supabase-backend.py проверяет:

Проверка запускается в GitHub Pages workflow до Jekyll-сборки.

Что пока не подтверждено

GitHub-репозиторий не подтверждает:

Безопасная последовательность запуска

  1. Подтвердить целевой Supabase-проект.
  2. Применить базовую и v2-миграции штатным migration workflow.
  3. Проверить созданные столбцы, индексы, таблицы, RLS и RPC.
  4. Развернуть актуальную broker-public-lead.
  5. Настроить secrets только в окружении Edge Function.
  6. Задать точные production и проверенные dev-origin.
  7. Проверить публичный браузерный вызов согласно политике проекта.
  8. Выполнить тесты invalid JSON, размер payload, validation и CORS.
  9. Выполнить success и duplicate-тест с одним request_id.
  10. Проверить почасовой rate limit и очистку счётчиков.
  11. Проверить строку заявки и событие created непосредственно в базе.
  12. Подключить тестовый Telegram-чат и проверить sent / failed.
  13. Утвердить роли доступа, срок хранения и удаление персональных данных.
  14. Обновить политику сайта под фактическое серверное хранение.
  15. Указать публичный HTTPS endpoint в _config.yml.
  16. Перевести lead_capture.mode в hybrid.
  17. Провести сквозной тест Web3Forms + Supabase + /spasibo/.

Решение на текущем этапе

ЗаявкаПозвонитьВК