# 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`:本次生产目标代码基线。