← 返回作品
02 / 02
TypeNow 码上英语
在线英语学习网站。从产品设计、数据建模到部署运维全部自己完成,含发音评分、练习计分与定时生命周期任务。
- Next.js 16
- React 19
- Tailwind v4
- MySQL
- Drizzle ORM
- pm2 + nginx
- 背景与目标
- 想要一个能真正用起来的英语练习产品,而不是玩具项目。成功标准是自己每天愿意用它练,且能在低配服务器上稳定跑。
- 我的角色
- 独立完成全部工作:产品设计、数据建模、前后端实现、部署与运维。
- 架构
浏览器 │ HTTP nginx(Let's Encrypt 终止 TLS,统一入口) │ 反向代理 Next.js 16 应用(pm2 常驻) │ Drizzle ORM MySQL 8 另有 webhook 服务监听 :9000,GitHub push 自动触发部署
- 关键取舍
构建到暂存目录再原子切换,而不是就地覆写
就地构建一旦中途失败会留下坏一半的产物,用户请求到未加载的 chunk 就 404,失败从「发布没生效」升级成「线上报错」。代价是磁盘多占一份构建产物。
逐词评分用第三方返回的分词,不按自己的字段切词
库里句子的标点是独立 token(如「Seven , eight」),自己切词会与评分服务的分词对不上。代价是逐词区只能显示对方给了分的词。
生命周期任务寄生在应用内的 HTTP 端点,由 crontab 触发
复用现有应用与鉴权,不必再维护一个独立定时服务。代价是任务可用性绑在应用上,应用重启期间到点的任务会被跳过,且密钥要交给 crontab。
部署串行化并带拉取重试
GitHub webhook 只触发一次、没有补偿机制,一次网络抖动就静默漏掉一次发布。代价是部署会排队等待。
- 结果
- 稳定运行在 2 核 3.5G 的服务器上;每次 push 自动部署;发音评分落库后可在历史回看时查看。