Контрольный список перед запуском
Выполните все пункты перед выходом в production. Каждый пункт ссылается на соответствующий раздел ниже.1
Защита от повторного воспроизведения настроена для нескольких экземпляров
Адаптер по умолчанию хранит данные только в памяти. Если вы запускаете более одного процесса (воркеры Gunicorn, кластер PM2, Kubernetes), задайте
SUPABASE_URL + SUPABASE_ANON_KEY или используйте RedisReplayAdapter. Подробнее →2
Переменные окружения хранятся в менеджере секретов
Никогда не вставляйте API-ключи напрямую в код. Используйте
.env локально, менеджер секретов — в production. Подробнее →3
Эндпоинт проверки работоспособности существует
Запросы мониторинга не должны инициировать создание инвойсов. Добавьте маршрут
/health перед платными маршрутами. Подробнее →4
Ответы об ошибках не раскрывают внутренние данные
Перехватывайте ошибки провайдера и возвращайте чистый 503 — без трассировки стека. Подробнее →
5
Цена задана осознанно
priceSats должен отражать реальную ценность. При курсе 1 sat ≈ 0.06 за premium-эндпоинт — разумная цена. Не устанавливайте значение 0 по ошибке.6
Мониторинг доступности эндпоинта инвойсов
Отслеживайте ответ 402 (это обычный ответ, не ошибка). Инструменты вроде UptimeRobot поддерживают ожидаемые пользовательские коды статуса.
7
Ограничение частоты запросов при создании инвойсов
Каждый неаутентифицированный запрос создаёт Lightning-инвойс. Без ограничения частоты злоумышленник может бесплатно исчерпать квоту инвойсов вашего провайдера. Добавьте
express-rate-limit перед публичным развёртыванием. Подробнее →Важно: защита от повторного воспроизведения в production
Переменные окружения
Никогда не вставляйте ключи напрямую в код. Всегда используйте переменные окружения:Журналирование платежей (Supabase)
Записывайте каждый платёж в Supabase для панели управления расширения VS Code и аналитики:Развёртывание на Cloudflare Workers
l402-kit API работает на Cloudflare Workers (изоляты V8, без холодного старта). Хранилище повторного воспроизведения в памяти сбрасывается для каждого изолята — для высоконагруженных API используйте Cloudflare KV или Durable Objects для защиты от повторного воспроизведения.Docker
Удаление пользовательских данных
Предоставьте эндпоинт удаления, чтобы пользователи могли безвозвратно удалить свои данные. Бэкенд l402-kit включает/api/delete-data из коробки:
Обработка ошибок
Перехватывайте ошибки провайдера до того, как они проявятся как неформатированные 500:- Никогда не возвращайте клиентам трассировку стека — записывайте её на стороне сервера.
- Таймауты провайдера (503) являются временными — безопасно повторять с задержкой.
- Ошибки токена (401) никогда не являются временными — не повторяйте запрос автоматически, требуйте новый инвойс.
- Ошибки ограничения частоты (429) — передавайте поле
retryAfterвызывающей стороне.
Ограничение частоты запросов
Каждый неаутентифицированный запрос вызываетcreateInvoice() у вашего Lightning-провайдера. Без ограничения частоты любой может перегрузить ваш эндпоинт и бесплатно исчерпать квоту API провайдера — не заплатив ни одного sat.
Добавьте express-rate-limit перед вашими L402-маршрутами:
Клиенты, уже совершившие оплату, пропускаются функцией
skip — ограничение применяется только к неаутентифицированным вызовам, инициирующим создание нового инвойса. Законопослушные плательщики никогда не получают ограничений.Эндпоинт проверки работоспособности
Всегда добавляйте бесплатную проверку работоспособности, чтобы инструменты мониторинга не инициировали создание инвойсов:Мониторинг
Ключевые метрики для отслеживания:- Частота ответов 402 — здоровый базовый уровень высокий (большинство вызывающих должны платить)
- Доля верифицированных платежей — соотношение оплаченных и неоплаченных вызовов
- Задержка провайдера —
blink.createInvoice()должен выполняться менее чем за 500 мс - Попытки повторного воспроизведения — всплеск указывает на атаки с повторным использованием токена
Производительность
- Верификация токена выполняется за O(1) — чистая криптография, без БД, без сети
- Создание инвойса (путь 402) обращается к API вашего Lightning-провайдера — добавьте кэш, если ожидаете повторные обращения к одному эндпоинту до совершения оплаты
- Хранилище повторного воспроизведения —
Setв памяти — для многоэкземплярных развёртываний замените на Redis