Skip to content

v0.5.0(2026-09-05)

主题:邮件通道完善 + 对象存储接入 + 可观测性落地

v0.5.0 清偿了 v0.4.0 邮件设计的全部欠账,把对象存储从 ADR 推进为生产代码, 并补齐了 cron worker 的可观测性。安全域完成登录限流收口、会话设备管理与 Passkey 试点。

邮件通道完善

  • 摘要折叠:同一用户的通知合并为一封摘要邮件;同类型 ≥3 条折叠为 「N 条 ×类型」一行,明细最多 5 条、溢出计总数。
  • 失败重试与死信:单用户发送失败不再阻断整轮,逐条累加重试计数并记录 最近错误;达到 3 次进入死信(不再进入队列),需人工排查。
  • 实时单发:安全告警、团队邀请、角色变更、支付成功四类高优先级通知在 事件触发时即时发送(偏好门控 + 发送回执),cron 作为失败兜底重试。
  • 时区错峰:digest 仅发送处于本地 08:00 的用户(外部 cron 建议每小时调度); 时区取自用户资料,为空或非法回退 Asia/Shanghai。
  • 营销邮件独立通道:double opt-in(开关 → 确认邮件 → 点击确认), 公开确认/退订路由凭 token 操作,每封营销邮件强制带退订页脚。

对象存储

  • StorageDriver 双驱动抽象:默认 Supabase Storage(零配置可用), 配齐 OSS_* 四项环境变量切换阿里云 OSS(SDK 动态加载,默认不引入)。
  • 服务端中转上传:≤2MB 图片,content-type 白名单,扩展名取自白名单映射防路径穿越。
  • 头像上传(资料编辑页)与项目封面(项目设置页)已接入。

可观测性

  • Appark APM:轻量第一方封装(无厂商 SDK),默认旁路关闭,两项环境变量齐备才启用; 结账与 cron 运行两个关键流程埋点。
  • Worker 运行记录:每轮 digest 落一行(拉取/发送/失败/耗时),供看板查询。
  • 积压告警:待发通知超过 500 条时上报 Sentry。

认证安全

  • 登录限流收口:邮箱维度(5 次/15 分钟)+ 新增 IP 维度(20 次/15 分钟), 统一进 rate-limit 键控滑窗实现。
  • 会话设备管理:设备列表(UA/IP/最后活跃)+ 单设备吊销; 会话经登录回调与 dashboard 心跳自动登记。
  • Passkey 试点:通行密钥注册/验证闭环(feature flag NEXT_PUBLIC_FEATURE_PASSKEY 门控,默认关闭);登录会话签发待 Supabase 原生支持后接入。

性能与质量

  • Tailwind v4 原生主题:移除 @config 桥接与 tailwind.config.ts, 全部主题走 @theme inline / @custom-variant / @utility(ADR-013)。
  • TanStack Query 缓存收口:查询 key 单一来源 + 三档缓存档位,8 个调用点统一。
  • 覆盖率门禁:branches 78% → 85%(实测 85.7%),单测 556 → 668 个。

升级注意

  • 需执行迁移 016–019(营销订阅 / worker 运行记录 / 会话设备 / passkey 凭据)。
  • digest 外部 cron 建议改为每小时调度(配合时区错峰)。
  • 可选启用:OSS_*(对象存储切换)、NEXT_PUBLIC_APPARK_*(APM)、 NEXT_PUBLIC_FEATURE_PASSKEY=true(通行密钥)。

完整变更清单见仓库根目录 CHANGELOG.md

基于 MIT 协议开源