diff --git a/docs/task/247-admin部署档口入库码后台回写版本.md b/docs/task/247-admin部署档口入库码后台回写版本.md new file mode 100644 index 0000000..9a0eec2 --- /dev/null +++ b/docs/task/247-admin部署档口入库码后台回写版本.md @@ -0,0 +1,102 @@ +# 247 Admin:部署档口入库码后台回写版本到生产服务器 + +- 类型:部署 +- 父级大工单:#14 +- 所属 MVP / 版本:#15 / Admin 生产部署 +- 状态:已完成,待用户验收 +- 日期:2026-08-15 +- Gitea 工单:http://ilaer.eicp.net:8418/chengma/cmautobuy/issues/247 + +## 背景与目标 + +生产 Admin 原来运行 `17c2d45`,尚未包含 #245 按货运单号直查顺运宝和 #246 档口入库码 +后台批量回写。本任务把固定提交 `7736ab7` 构建并发布到 `185.216.248.75`,继续通过 +`https://buy.833729.com` 提供服务。 + +发布前预检发现生产数据库已于 `2026-08-15T08:53:04Z` 记录 schema v25,两个新增字段、 +批次索引和包含 `queued` 的状态约束均已存在;但线上仍是只支持 v24 的旧进程。旧进程尚未 +重启所以仍在线,一旦重启将拒绝连接版本更高的数据库。本次发布因此同时恢复“线上二进制 +与数据库版本一致”的安全状态。 + +## 最终方案 + +- 在 Windows 系统临时目录建立 `7736ab7` detached worktree,与主工作区未提交的 Client + 文件隔离;使用固定 Go 1.23.0 完成 vet、全量构建和全量测试,再交叉编译 Linux amd64 + 静态二进制。 +- 上传后核对本地、暂存和最终 release 的 SHA-256、文件大小和 ELF 类型;正式 release + 继续通过符号链接复用 `/opt/cmautobuy/config.yaml` 和 `/opt/cmautobuy/data`,没有复制 + 或输出凭据。 +- 因生产 schema 已是 v25,先在不对公网开放的 `127.0.0.1:18081` 使用生产环境启动目标 + 二进制,确认数据库自检、稳定配置和登录页均正常,随后才进入切换窗口。 +- 三次核对运行中的 SYB 同步、AI 匹配、档口入库码排队/回写均为 0。切换前使用生产业务 + 账号生成 `--no-tablespaces` 单事务逻辑备份,权限设为 `0600`,完成 gzip、建表段和 + SHA-256 校验。 +- 停止 systemd 后原子切换稳定二进制链接并启动。目标版本通过本机登录页检查后,再核对 + schema v25 字段/索引/约束、systemd、监听、Nginx、公网 HTTPS 和最新静态资源标识。 +- 预检发现改变了原回退条件:旧 `17c2d45` 不能在 v25 上直接启动。当前只允许修复前进; + 只有确认没有任何新业务写入时,才能同时恢复数据库备份和原 release。不得只切旧二进制。 +- 部署过程没有触发顺运宝同步、档口入库码匹配/回写、AI 匹配、采集、采购、下单或付款。 + +## 改了哪些 + +- `/opt/cmautobuy/releases/7736ab7/`:新增并启用目标 Admin release。 +- `/opt/cmautobuy/cmautobuy-admin`:稳定链接从 `17c2d45` 原子切换到 `7736ab7`。 +- `/opt/cmautobuy/backups/autobuy-before-247-20260815T093211Z-v25-notablespaces.sql.gz`: + 新增部署前生产 v25 备份。 +- `docs/task/247-admin部署档口入库码后台回写版本.md`:新增本次部署归档。 + +原 `17c2d45` release 继续保留,但不能单独作为 v25 应用回退。服务器上传暂存文件和预检 +日志已删除;本地 detached worktree 已移除。已校验的 Linux 二进制暂时保留在系统临时目录 +`cmautobuy-deploy-247-20260815-172931/artifacts`,不在仓库中且不含配置或数据。 + +## 验收结果 + +| 验收标准 | 结果 | +|---|---| +| 发布物只来自固定提交 `7736ab7`,固定 Go 1.23.0 验证通过 | 通过 | +| 切换前 SYB、AI 和档口入库码运行数均为 0 | 通过(三次核对) | +| 数据库备份权限、gzip、建表段和哈希校验通过 | 通过:`0600`、31 个建表段 | +| 本地、上传和最终 release 哈希一致 | 通过 | +| systemd active/enabled,只监听 `127.0.0.1:18080` | 通过 | +| schema v25 字段、索引和状态约束自检通过 | 通过 | +| 本机和公网根路径、登录页、静态资源正常 | 通过 | +| 配置、AI 密钥和业务记录保持,未触发真实业务动作 | 通过 | + +发布结果: + +- 目标二进制:28,012,696 字节,SHA-256 + `a6bc35265c57942a5ffc54e7a547ca129b14f439ce1bf494c4d06eb10162cef1`。 +- 数据库备份:4,845,905 字节,SHA-256 + `1f0b763a4c50cffd0bfec64ea76026c6da9922f23751632a2e8870ab7532a891`。 +- 新服务 PID 为 `30494`,启动时间 `2026-08-15 17:32:41 CST`;启动日志显示数据库就绪, + fatal、panic 和迁移错误均为 0。 +- MySQL 服务端为 8.4.8,schema 为 v25;`apply_batch_id`、`apply_queued_at`、 + `idx_inner_code_apply_batch` 和含 `queued` 的状态约束均存在。 +- 本机根路径 303、登录页 200;公网根路径 303、登录页 200、`app.js` 200,且最新脚本包含 + `apply_batch_id` 标识。 +- 部署后运行中的 SYB、AI 和档口入库码后台任务均为 0;档口入库码记录仍为 110 条。 +- 稳定配置和数据链接正常,AI 密钥文件可由服务读取且权限仍为 `0600`;未读取或输出内容。 + +## 测试 + +- 执行的命令: + - 隔离 worktree:`GOTOOLCHAIN=go1.23.0 go vet ./...`、`go build ./...`、 + `go test ./... -count=1` + - `GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -trimpath -ldflags='-s -w'` + - 上传前后 `sha256sum`、`stat`、`file` + - 独立端口生产环境启动预检、生产运行态 SQL、`mysqldump --no-tablespaces`、`gzip -t` + - `readlink`、`systemctl`、`ss`、`nginx -t`、`journalctl`、本机和公网 `curl` +- 结果:固定 Go 1.23.0 验证、静态构建、启动预检、备份、切换及全部发布后健康检查通过。 +- **没验证到的部分**:未使用生产账号登录后人工选择超过 20 条档口入库码并观察后台进度; + 未向真实顺运宝发送匹配、删除或写入请求;未触发真实同步、AI 匹配、采集、采购、下单或 + 付款;未实际执行数据库覆盖恢复或旧 release 回退。当前环境仍没有独立 MySQL 8.4 `_test` + 库执行 v24→v25 DDL 演练,但生产现有 v25 已由目标二进制启动自检通过。 + +## 遗留问题 + +旧 `17c2d45` 只支持 schema v24,不能单独启动。生产发生故障时优先修复前进;如确需恢复 +本次备份,必须先确认备份后没有需要保留的新业务数据,并同时恢复数据库与原 release。 + +## 相关提交 + +- `7736ab7`:本次生产目标代码基线。