Files
cmautobuy/docs/task/247-admin部署档口入库码后台回写版本.md
T
2026-08-15 17:36:34 +08:00

103 lines
6.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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`:本次生产目标代码基线。