← 返回作品
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 自动部署;发音评分落库后可在历史回看时查看。