上线前检查清单
在正式上线前逐项确认。每个条目都链接到下方对应章节。1
多实例环境已配置重放保护
默认适配器仅使用内存存储。如果你运行多个进程(Gunicorn workers、PM2 cluster、Kubernetes),请设置
SUPABASE_URL + SUPABASE_ANON_KEY 或使用 RedisReplayAdapter。详情 →2
环境变量已存入密钥管理器
永远不要硬编码 API 密钥。本地使用
.env,生产环境使用密钥管理器。详情 →3
健康检查端点已存在
监控探测请求不应触发发票创建。在付费路由之前添加
/health 路由。详情 →4
错误响应不泄露内部信息
捕获 provider 错误并返回干净的 503——而不是堆栈跟踪。详情 →
5
价格设置经过深思熟虑
priceSats 应当反映真实价值。1 sat ≈ 0.06 是合理的。不要意外将其设置为 0。6
对发票端点进行正常运行时间监控
监控 402 响应(这是正常响应,而非错误)。UptimeRobot 等工具支持自定义状态码预期。
7
对发票创建进行速率限制
每个未认证请求都会创建一个 Lightning 发票。没有速率限制,攻击者可以免费耗尽你的 provider 发票配额。在公开部署前添加
express-rate-limit。详情 →重要:生产环境中的重放保护
环境变量
永远不要硬编码密钥。始终使用环境变量:支付日志(Supabase)
将每笔支付记录到 Supabase,用于 VS Code 扩展仪表板和数据分析:Cloudflare Workers 部署
l402-kit API 可运行在 Cloudflare Workers(V8 隔离环境,零冷启动)上。内存重放存储在每个隔离实例重置——对于高流量 API,请使用 Cloudflare KV 或 Durable Objects 进行重放保护。Docker
用户数据删除
提供一个删除端点,让用户可以永久删除其数据。l402-kit 后端内置了/api/delete-data:
错误处理
在 provider 错误以未格式化的 500 形式出现之前将其捕获:- 永远不要向客户端返回堆栈跟踪——在服务端记录日志。
- Provider 超时(503)是暂时性的——可以使用退避策略安全重试。
- Token 错误(401)永远不是暂时性的——不要自动重试,需要重新获取发票。
- 速率限制错误(429)——将
retryAfter字段返回给调用方。
速率限制
每个未认证请求都会触发 Lightning provider 的createInvoice()。没有速率限制,任何人都可以向你的端点发起大量请求并免费耗尽 provider 的 API 配额——即使一个 sat 都没有支付。
在你的 L402 路由前添加 express-rate-limit:
已付费的客户端通过
skip 函数跳过限制——该限制仅适用于触发新发票的未认证调用。合法付款方永远不会受到限流。健康检查端点
始终添加一个免费的健康检查端点,以防监控工具触发发票创建:监控
需要追踪的关键指标:- 402 响应率 — 健康基线较高(大多数调用方需要付费)
- 支付验证率 — 已付费与未付费调用的比率
- Provider 延迟 —
blink.createInvoice()应低于 500ms - 重放尝试次数 — 峰值表明存在 token 重用攻击
性能
- Token 验证为 O(1)——纯加密运算,无数据库,无网络请求
- 发票创建(402 路径)会调用你的 Lightning provider API——如果预计同一端点在支付前被频繁访问,请添加缓存
- 重放存储使用内存
Set——对于多实例部署,请替换为 Redis