EZTor 运维日志:一次涉及全模块的深度打磨
时间:2026-05-19 ~ 2026-05-20 服务器:阿里云 2核3.4G · 宝塔面板 · PM2 · Docker 编译 域名:eztor.dogeggcode.cyou
一、访客首页裁剪
开发伙伴提交的 UI 重构 PR 把多套主题风格揉在了一个页面里,线上环境仅保留白色风格页面。
对GuestHomepage.tsx原565行代码进行精简,直接删除深色背景区块、对比表格、CTA宣传横幅、深色底部栏,移除DarkStep专属深色组件及配套数据源,精简后页面仅剩余241行代码,最终页面结构固定为白色顶部视觉区、三步核心工作流、数据查询结果展示区。
同步优化导航组件GuestHomeHeader,移除页面内已删除的产品功能锚点入口;对「免费开始」按钮增设移动端隐藏样式hidden sm:inline-flex,规避移动端页面布局挤压错乱问题。
二、QQ 群反馈按钮 + 零编译热更新
业务需求
页面全局增设反馈入口按钮,点击直接跳转QQ社群加群链接;链接地址支持随时修改,修改后无需重新打包编译项目。
实现方案
舍弃Next.js内置构建时固化的NEXT_PUBLIC_*环境变量,采用运行时读取静态配置文件方案实现免编译更新。
- 在项目
public目录新建site-config.json全局静态配置文件
{"qqGroupUrl":"https://qm.qq.com/q/7NNZCF2dHi"}
- 重构
src/lib/siteConfig.ts为客户端请求钩子,页面初始化时请求本地静态配置文件,读取链接并做内存缓存,请求异常自动兜底默认链接地址 - 在访客端、用户端头部导航
GuestHomeHeader与HomeHeader统一挂载反馈按钮,通过自定义钩子动态获取社群链接
快速改链流程(无需编译)
echo '{"qqGroupUrl":"新QQ群链接"}' > .next/standalone/public/site-config.json
rm -rf /www/server/nginx/proxy_cache_dir/*
三、默写「分组取词失败」BUG 修复
故障现象
用户创建单词分组后,分组内存在有效单词,开启单词默写功能持续提示生词本数量不足,无法开启默写,全站所有用户、所有单词分组均出现同款故障。
问题定位
查看服务器PM2运行日志,抛出数据库异常:column rgw.wordid does not exist。
故障根源位于接口文件src/app/api/dictation/smart/route.ts原生SQL语句,PostgreSQL数据库严格区分大小写,未添加双引号包裹的驼峰命名字段会被数据库自动转为小写字段名;项目Prisma数据表字段定义为wordId,SQL语句内未添加标识符双引号,导致字段匹配失败触发数据库500异常,前端统一拦截判定为单词数量不足。
同SQL语句内reviewGroupId已规范添加双引号无异常,仅wordId字段遗漏格式处理。
代码修复
- JOIN "ReviewGroupWord" rgw ON w.id = rgw.wordId
+ JOIN "ReviewGroupWord" rgw ON w.id = rgw."wordId"
修正字段标识符格式后,全站单词默写功能恢复正常。
四、管理看板 BUG 三连修复
BUG1 日活用户统计逻辑错误
原统计逻辑采用用户ID聚合去重统计,固定时间段内统计数值固定,7日、30日活跃用户数据完全一致,无法区分每日日活数据。
优化方案:使用COUNT(DISTINCT "userId")函数,按照DATE("createdAt")日期维度分组统计单日独立访客,后台看板自动计算展示日均活跃用户数据。
BUG2 统计数据混入测试账号
翻译事件、翻译错误事件统计接口中,冗余写入userId: { not: null }字段,通过对象解构覆盖基础查询条件内屏蔽测试用户规则,导致后台数据统计纳入内部测试账号数据,数据统计失真。
直接删除冗余用户ID判定条件,依靠事件类型字段区分游客与正式用户,保留原生屏蔽测试用户规则。
BUG3 游客行为数据被误过滤
后台趋势数据查询SQL使用NOT IN排除测试用户ID,PostgreSQL数据库中NULL空值执行NOT IN判定结果为false,导致无登录游客的所有行为数据被同步过滤丢失。
优化SQL查询条件,新增OR "userId" IS NULL判定规则,精准排除测试账号同时完整保留游客行为数据。
后台冗余代码清理
- 删除前端页面未调用的
totalWords、totalErrors无效数据查询接口 - 统一全局单词统计默认数值,由1调整为0,对齐游客端数据展示规则
五、全局UI细节微调
- 单词默写页面
/dictation:移除主题切换按钮;完成答题、切换题目后自动滚动视图至题目展示卡片,优化移动端浏览体验 - 生词记录页面
/history:移除主题切换按钮;页面功能入口「密钥导入」正式更名「四六级词」,贴合项目核心业务定位
六、标准化线上部署流程
项目上线固定步骤
- 本地开发代码通过
rsync同步完整源码至业务服务器 - 清空项目旧构建缓存:
rm -rf .next - 调用
node:20-slim轻量化Docker容器打包构建,限制容器CPU1核、运行内存2G - 执行Python修复脚本,修正打包后
required-server-files.json与server.js部署路径异常 - 复制Prisma数据库依赖文件至打包运行目录:
cp -r node_modules/.prisma .next/standalone/node_modules/ - 同步静态资源目录:
cp -r public .next/standalone/public - 清空Nginx全站代理缓存目录
- 执行
pm2 reload cet4-web实现零停机滚动重启,双进程实例保障服务不间断在线
服务器资源运行画像
- 物理配置:2核CPU,编译构建限制1核运行
- 运行内存:整机3.4G内存,编译上限2G,日常业务常驻可用内存约1.3G
- 进程部署:PM2集群模式启动2个服务实例,单实例内存占用约100MB
- 业务承载:当前架构稳定承载日活用户3000-5000人
本文由 Opencode Agent 辅助编辑与部署验证。