Files
tamabox/.workbuddy/memory/2026-09-27.md
T
2026-10-15 11:41:19 +08:00

2.4 KiB
Raw Blame History

2026-09-27 工作日志

Serverless 迁移可行性评估(只读,未改源码)

用户问:TamaBox-v4 能否像 OpenListTeam/OpenList-Worker 那样改造成 TypeScript + Cloudflare Workers + D1。

产出:outputs/serverless-migration-feasibility-2026-09-27.md

结论:技术可行,但工程性价比低——是「整体重写」不是「改造」。

关键判据(两个项目形态根本不同):

  • OpenList = 无状态文件列表 + 反代(无会话、无可变状态、存储可降级 map/KV、无图像、无服务端模板)→ 边缘天然匹配。
  • TamaBox = 有状态多用户 Web 应用(Session/CSRF/Redis cache、PG 关系模型、cgo 图像管线、42 个服务端模板)。

标定数据:

  • TamaBox:34,664 行 Go(route 7645 / db 6950 / i18n 3689 / security 2675 / internal-route 1653 / template 825)。
  • OpenList 原版 9.8MB Go / 24.8k star;OpenList-Worker 21.7MB TS / 416 个 .ts(约 2.6MB 源码)/ 官方团队 / 2025-08-23 立项 → 约一年,且代码量反超原版。

P0 硬阻断(11 项)要点:

  1. internal/storage/s3.go cgo WebP(chai2010/webp)+ cwebp 子进程 + os.CreateTemp → Workers 无 cgo/无子进程/无磁盘。
  2. route/question/share.go freetype + os.ReadFile(font_path) 渲染中文分享图 → 需整体重写,且 CPU 密集易超 Workers 限额。
  3. Session/缓存/限流/自动封禁/去重/统计全在进程内(internal/cache、autoban、shared/duplicate.go、ratelimit.go)→ 必须迁 Durable Objects。
  4. internal/route/route.go:386-395 cache 中间件无条件硬编码 Redis(不判空配置)。
  5. D1=SQLite:无 PG 序列(db.go:211-234)、无 FOR UPDATE(follow_ups.go:68)、无 JSONB(datatypes.JSON)。
  6. SMTP(internal/mail/mail.go:129-147)Workers 禁裸 TCP → 换 HTTP 邮件 API。
  7. OTel/Uptrace gRPC 上报不可用。

顺带确认(对后续有用):internal/template/minify.go 当前未被路由装配使用(route.go:99 用的是 flamego template.EmbedFS),属死代码。internal/security/ipinfo 是离线签名、零 DNS。

建议方案:A 不迁移(推荐);B 只把静态资源+只读接口下沉边缘(EdgeOne/Workers),写路径与图像处理留 Go 源站——项目已有 EdgeOne 回源白名单脚本,该形态已在用;C 完全重写(需 2-3 个月专职 + 功能裁剪,优先 EdgeOne 因其有大陆节点)。