# `server.yuban.co` 生产发布清单 当前 DNS 指向华为云公网地址 `121.37.7.67`。本清单只描述发布和验证步骤,不包含任何账号、密钥或自动登录脚本。 ## 发布前 1. 备份 `/etc/yuban-server.env` 和持久任务目录。 2. 确认服务器为 Node.js 22+,并能执行 `ffmpeg`、`ffprobe`。 3. 配置持久绝对路径 `JOB_STORE_DIR`;不能放在版本发布时会被替换的目录中。 4. 设置 `MAX_JOB_CONCURRENCY=2`、`MAX_JOB_ATTEMPTS=5`、`JOB_RETENTION_MS=2592000000`。 5. 设置 `CANONICAL_PERSISTENCE_ENABLED=true`,并在服务器环境变量中提供 `PARSE_MASTER_KEY`;该密钥不得进入 Git、网页或日志。 6. 记录本次 `SERVICE_VERSION` 和 `GIT_SHA`,便于从 `/health` 确认实际运行版本。 ## 灰度发布 1. 先执行 `npm test` 和 `npm run check`。 2. 发布新版本,但保留上一版本镜像或目录以便快速回滚。 3. 重启服务后确认 `GET https://server.yuban.co/health` 返回新版本、`workerReady=true`、`storeReady=true`。 4. 用测试账号提交一条短录音,验证 `queued → running → completed`,以及 `ChatVoice` 回读的 hash、字数和 `long_complete` 一致。 5. 人工模拟一次可重试失败,验证任务进入 `retry_wait` 并自动增加 attempt;模拟永久失败后调用 `/retry`,必须得到新的 jobId。 6. 再用 30 分钟录音验收,确认页面离开后任务仍继续、故事任务从 `waiting_for_transcript` 自动推进。 ## 观察与回滚 - 至少观察 24 小时:任务成功率、`retry_wait` 数量、最终失败码、平均排队时间、任务目录磁盘占用、Parse 回读失败率。 - 日志只记录 jobId、attempt、stage、错误码和耗时,不得记录音频 URL、Session Token、逐字稿或 Parse Master Key。 - 若权威落库异常,可先关闭 `CANONICAL_PERSISTENCE_ENABLED` 并回滚服务版本;持久任务目录不可删除,前端仍可通过已有 jobId 恢复查询。