Skip to main content

Контрольный список перед запуском

Выполните все пункты перед выходом в production. Каждый пункт ссылается на соответствующий раздел ниже.
1

Защита от повторного воспроизведения настроена для нескольких экземпляров

Адаптер по умолчанию хранит данные только в памяти. Если вы запускаете более одного процесса (воркеры Gunicorn, кластер PM2, Kubernetes), задайте SUPABASE_URL + SUPABASE_ANON_KEY или используйте RedisReplayAdapter. Подробнее →
2

Переменные окружения хранятся в менеджере секретов

Никогда не вставляйте API-ключи напрямую в код. Используйте .env локально, менеджер секретов — в production. Подробнее →
3

Эндпоинт проверки работоспособности существует

Запросы мониторинга не должны инициировать создание инвойсов. Добавьте маршрут /health перед платными маршрутами. Подробнее →
4

Ответы об ошибках не раскрывают внутренние данные

Перехватывайте ошибки провайдера и возвращайте чистый 503 — без трассировки стека. Подробнее →
5

Цена задана осознанно

priceSats должен отражать реальную ценность. При курсе 1 sat ≈ 0.0006,100sats0.0006, 100 sats ≈ 0.06 за premium-эндпоинт — разумная цена. Не устанавливайте значение 0 по ошибке.
6

Мониторинг доступности эндпоинта инвойсов

Отслеживайте ответ 402 (это обычный ответ, не ошибка). Инструменты вроде UptimeRobot поддерживают ожидаемые пользовательские коды статуса.
7

Ограничение частоты запросов при создании инвойсов

Каждый неаутентифицированный запрос создаёт Lightning-инвойс. Без ограничения частоты злоумышленник может бесплатно исчерпать квоту инвойсов вашего провайдера. Добавьте express-rate-limit перед публичным развёртыванием. Подробнее →

Важно: защита от повторного воспроизведения в production

Адаптер повторного воспроизведения по умолчанию хранит данные только в памяти — он сбрасывается при каждом перезапуске процесса и не работает в нескольких экземплярах сервера. В production с более чем одним процессом (воркеры Gunicorn, поды Kubernetes, кластер PM2) один и тот же preimage может быть принят дважды.Решение: Задайте SUPABASE_URL + SUPABASE_ANON_KEY в окружении. Middleware автоматически использует Supabase как хранилище повторного воспроизведения, которое является общим для всех экземпляров.Для Redis: передайте RedisReplayAdapter явно (см. TypeScript SDK или Python SDK).

Переменные окружения

Никогда не вставляйте ключи напрямую в код. Всегда используйте переменные окружения:

Журналирование платежей (Supabase)

Записывайте каждый платёж в Supabase для панели управления расширения VS Code и аналитики:

Развёртывание на Cloudflare Workers

l402-kit API работает на Cloudflare Workers (изоляты V8, без холодного старта). Хранилище повторного воспроизведения в памяти сбрасывается для каждого изолята — для высоконагруженных API используйте Cloudflare KV или Durable Objects для защиты от повторного воспроизведения.

Docker


Удаление пользовательских данных

Предоставьте эндпоинт удаления, чтобы пользователи могли безвозвратно удалить свои данные. Бэкенд l402-kit включает /api/delete-data из коробки:
Расширение VS Code отображает это как панель Danger Zone в нижней части панели управления — пользователи должны ввести свой Lightning-адрес для подтверждения, после чего вся история платежей и доступ Pro удаляются. Операция использует сервисный ключ Supabase на стороне сервера; anon-ключ не имеет прав на DELETE.

Обработка ошибок

Перехватывайте ошибки провайдера до того, как они проявятся как неформатированные 500:
Практические правила:
  • Никогда не возвращайте клиентам трассировку стека — записывайте её на стороне сервера.
  • Таймауты провайдера (503) являются временными — безопасно повторять с задержкой.
  • Ошибки токена (401) никогда не являются временными — не повторяйте запрос автоматически, требуйте новый инвойс.
  • Ошибки ограничения частоты (429) — передавайте поле retryAfter вызывающей стороне.
Полный список структурированных кодов ошибок см. в справочнике ошибок.

Ограничение частоты запросов

Каждый неаутентифицированный запрос вызывает createInvoice() у вашего Lightning-провайдера. Без ограничения частоты любой может перегрузить ваш эндпоинт и бесплатно исчерпать квоту API провайдера — не заплатив ни одного sat. Добавьте express-rate-limit перед вашими L402-маршрутами:
Клиенты, уже совершившие оплату, пропускаются функцией skip — ограничение применяется только к неаутентифицированным вызовам, инициирующим создание нового инвойса. Законопослушные плательщики никогда не получают ограничений.
Для FastAPI:

Эндпоинт проверки работоспособности

Всегда добавляйте бесплатную проверку работоспособности, чтобы инструменты мониторинга не инициировали создание инвойсов:

Мониторинг

Ключевые метрики для отслеживания:
  • Частота ответов 402 — здоровый базовый уровень высокий (большинство вызывающих должны платить)
  • Доля верифицированных платежей — соотношение оплаченных и неоплаченных вызовов
  • Задержка провайдераblink.createInvoice() должен выполняться менее чем за 500 мс
  • Попытки повторного воспроизведения — всплеск указывает на атаки с повторным использованием токена

Производительность

  • Верификация токена выполняется за O(1) — чистая криптография, без БД, без сети
  • Создание инвойса (путь 402) обращается к API вашего Lightning-провайдера — добавьте кэш, если ожидаете повторные обращения к одному эндпоинту до совершения оплаты
  • Хранилище повторного воспроизведения — Set в памяти — для многоэкземплярных развёртываний замените на Redis