Admin:部署档口入库码物理删除版本到生产 #319

Open
opened 2026-08-28 11:16:29 +08:00 by ila · 4 comments
Owner

基本信息

  • 类型:单元任务 / 生产部署
  • 所属 MVP:#15
  • 父级大工单:#14
  • 关联实现:#318
  • 部署工具:#309
  • 原始需求来源:用户于 2026-08-28 明确要求“把admin最新代码打包更新到线上服务器”
  • 状态:待验收
  • Gitea 交互:当前运行环境未提供 Gitea MCP,按仓库规则回退到 Gitea API;凭据仅从本机安全环境读取

目标

把 Admin 最新已提交版本以固定提交 e784806df90014f252abae13de1d632393c5b883 构建并发布到生产服务器,确保工作区未提交文件不进入产物,并完成服务与公网健康检查。

非目标

  • 不部署 Client。
  • 不执行生产业务数据删除或清理。
  • 不修改生产凭据、Nginx、域名或 MySQL 授权。
  • 本次代码不包含 schema 变化,不启用 -AllowSchemaMigration。

已确认方案

  1. 使用 admin/deploy/deploy-admin.ps1 -Commit e784806df90014f252abae13de1d632393c5b883 唯一入口。
  2. 先执行 -WhatIf 确认目标;正式部署由脚本完成固定提交归档、Go 1.23 验证、Linux amd64 构建和校验。
  3. 远端先检查 schema、后台任务与服务状态,生成并验证数据库逻辑备份,在 18083 预检后原子切换并重启 cmautobuy-admin。
  4. 验证 systemd、Nginx、本机健康检查及 https://buy.833729.com 公网入口;失败时由脚本恢复切换前稳定版本。

风险与回退

  • 风险:部署会短暂重启 Admin;后台任务未空闲或 schema 不匹配时必须停止。
  • 控制:固定提交隔离构建、两次后台任务检查、数据库备份、独立端口预检、原子切换。
  • 回退:发布失败自动恢复上一个稳定链接和服务;数据库备份仅保留,不自动覆盖发布后的业务数据。

验收标准

  • 发布物精确对应提交 e784806df90014f252abae13de1d632393c5b883。
  • 工作区未提交文件未进入发布物。
  • 经用户明确授权执行 schema v30 → v31 升级,迁移与自检通过。
  • 生产备份、18083 预检、原子切换、systemd/Nginx/公网检查全部通过。
  • https://buy.833729.com 可访问,Admin 服务运行正常。
  • 工单记录部署结果、验证证据和未验证范围,保持待验收。

文档影响

无长期文档影响:部署入口、服务器参数、运维步骤和回退方式均未改变,本次仅按现有文档发布固定提交。

## 基本信息 - 类型:单元任务 / 生产部署 - 所属 MVP:#15 - 父级大工单:#14 - 关联实现:#318 - 部署工具:#309 - 原始需求来源:用户于 2026-08-28 明确要求“把admin最新代码打包更新到线上服务器” - 状态:待验收 - Gitea 交互:当前运行环境未提供 Gitea MCP,按仓库规则回退到 Gitea API;凭据仅从本机安全环境读取 ## 目标 把 Admin 最新已提交版本以固定提交 `e784806df90014f252abae13de1d632393c5b883` 构建并发布到生产服务器,确保工作区未提交文件不进入产物,并完成服务与公网健康检查。 ## 非目标 - 不部署 Client。 - 不执行生产业务数据删除或清理。 - 不修改生产凭据、Nginx、域名或 MySQL 授权。 - 本次代码不包含 schema 变化,不启用 `-AllowSchemaMigration`。 ## 已确认方案 1. 使用 `admin/deploy/deploy-admin.ps1 -Commit e784806df90014f252abae13de1d632393c5b883` 唯一入口。 2. 先执行 `-WhatIf` 确认目标;正式部署由脚本完成固定提交归档、Go 1.23 验证、Linux amd64 构建和校验。 3. 远端先检查 schema、后台任务与服务状态,生成并验证数据库逻辑备份,在 18083 预检后原子切换并重启 `cmautobuy-admin`。 4. 验证 systemd、Nginx、本机健康检查及 `https://buy.833729.com` 公网入口;失败时由脚本恢复切换前稳定版本。 ## 风险与回退 - 风险:部署会短暂重启 Admin;后台任务未空闲或 schema 不匹配时必须停止。 - 控制:固定提交隔离构建、两次后台任务检查、数据库备份、独立端口预检、原子切换。 - 回退:发布失败自动恢复上一个稳定链接和服务;数据库备份仅保留,不自动覆盖发布后的业务数据。 ## 验收标准 - [x] 发布物精确对应提交 `e784806df90014f252abae13de1d632393c5b883`。 - [x] 工作区未提交文件未进入发布物。 - [x] 经用户明确授权执行 schema v30 → v31 升级,迁移与自检通过。 - [x] 生产备份、18083 预检、原子切换、systemd/Nginx/公网检查全部通过。 - [x] `https://buy.833729.com` 可访问,Admin 服务运行正常。 - [x] 工单记录部署结果、验证证据和未验证范围,保持待验收。 ## 文档影响 无长期文档影响:部署入口、服务器参数、运维步骤和回退方式均未改变,本次仅按现有文档发布固定提交。
Author
Owner

2026-08-28 首次部署门禁结果

  • -WhatIf 通过:目标 root@185.216.248.75:21638,固定提交 e784806df90014f252abae13de1d632393c5b883,禁止 schema 升级。
  • 本地隔离构建通过:Go 1.23.0 全量 test、build、vet 成功;Linux amd64 发布物 schema v31,SHA-256 为 3077ce452dd7ddb032667048de59e3a256115e2723523dd01b39bd3a61a3c887。
  • 发布物与远端执行器上传完成。
  • 远端门禁发现生产 schema 为 v30、目标为 v31,按设计停止并要求显式 -AllowSchemaMigration。
  • v31 只把 ai_match_batches.chk_ai_match_batch_total 的 total_count 上限从 100 放宽到 200;实现会删除旧 CHECK 并创建 CHECK (total_count BETWEEN 1 AND 200),随后自检并记录 v31。
  • 未执行迁移、未创建本次数据库备份、未切换版本、未重启服务、未写入或删除业务数据。
  • 停止后只读复核:cmautobuy-admin=active、nginx=active、公网 /login 返回 200。
  • 当前等待用户明确授权本次生产 schema v30 → v31 迁移;授权后使用同一固定提交和部署脚本继续。
## 2026-08-28 首次部署门禁结果 - `-WhatIf` 通过:目标 `root@185.216.248.75:21638`,固定提交 `e784806df90014f252abae13de1d632393c5b883`,禁止 schema 升级。 - 本地隔离构建通过:Go 1.23.0 全量 `test`、`build`、`vet` 成功;Linux amd64 发布物 schema v31,SHA-256 为 `3077ce452dd7ddb032667048de59e3a256115e2723523dd01b39bd3a61a3c887`。 - 发布物与远端执行器上传完成。 - 远端门禁发现生产 schema 为 v30、目标为 v31,按设计停止并要求显式 `-AllowSchemaMigration`。 - v31 只把 `ai_match_batches.chk_ai_match_batch_total` 的 `total_count` 上限从 100 放宽到 200;实现会删除旧 CHECK 并创建 `CHECK (total_count BETWEEN 1 AND 200)`,随后自检并记录 v31。 - 未执行迁移、未创建本次数据库备份、未切换版本、未重启服务、未写入或删除业务数据。 - 停止后只读复核:`cmautobuy-admin=active`、`nginx=active`、公网 `/login` 返回 200。 - 当前等待用户明确授权本次生产 schema v30 → v31 迁移;授权后使用同一固定提交和部署脚本继续。
Author
Owner

2026-08-28 迁移授权

用户已明确确认:“允许执行生产数据库 v30 → v31 迁移并继续部署 e784806”。恢复实施,使用固定提交 e784806df90014f252abae13de1d632393c5b883 和显式 -AllowSchemaMigration,不得扩大到其他数据库或业务数据操作。

## 2026-08-28 迁移授权 用户已明确确认:“允许执行生产数据库 v30 → v31 迁移并继续部署 e784806”。恢复实施,使用固定提交 `e784806df90014f252abae13de1d632393c5b883` 和显式 `-AllowSchemaMigration`,不得扩大到其他数据库或业务数据操作。
Author
Owner

2026-08-28 预检权限故障与最小修复

  • 已在迁移授权后重试;后台活动数为 0,并完成部署前逻辑备份。
  • 18083 预检在执行目标二进制前失败:runuser: failed to execute ./cmautobuy-admin: Permission denied。
  • 只读核对确认 /opt/cmautobuy/releases/e784806 为 0700 root:root,二进制虽为 0750 cmautobuy:cmautobuy,但运行账号无法遍历 release 目录。
  • 直接原因:远端脚本设置 umask 077 后用普通 mkdir -p 创建 release 目录,却只调整了二进制权限,遗漏目录的组执行权限。
  • 数据库仍是 v30,生产服务仍为 active;迁移、切换和重启均未发生。备份已保留。
  • 最小修复:让脚本以 root:cmautobuy 0750 明确创建/修正 releases 根目录和单个 release 目录,备份目录继续保持 root 私有;补自动化测试后提交。随后仍以固定提交 e784806 重新部署。
  • 该修复只恢复已确认的安全部署流程,不改变 Admin 业务功能、schema 内容或用户确认结果。
## 2026-08-28 预检权限故障与最小修复 - 已在迁移授权后重试;后台活动数为 0,并完成部署前逻辑备份。 - 18083 预检在执行目标二进制前失败:`runuser: failed to execute ./cmautobuy-admin: Permission denied`。 - 只读核对确认 `/opt/cmautobuy/releases/e784806` 为 `0700 root:root`,二进制虽为 `0750 cmautobuy:cmautobuy`,但运行账号无法遍历 release 目录。 - 直接原因:远端脚本设置 `umask 077` 后用普通 `mkdir -p` 创建 release 目录,却只调整了二进制权限,遗漏目录的组执行权限。 - 数据库仍是 v30,生产服务仍为 active;迁移、切换和重启均未发生。备份已保留。 - 最小修复:让脚本以 `root:cmautobuy 0750` 明确创建/修正 releases 根目录和单个 release 目录,备份目录继续保持 root 私有;补自动化测试后提交。随后仍以固定提交 `e784806` 重新部署。 - 该修复只恢复已确认的安全部署流程,不改变 Admin 业务功能、schema 内容或用户确认结果。
Author
Owner

2026-08-28 最终实施证据

最终差异

  • 修复远端部署脚本在 umask 077 下把 release 目录建为 0700 root:root、导致 cmautobuy 无法执行预检二进制的问题。
  • releases 根目录和单个 release 目录现在固定为 0750 root:cmautobuy;数据库备份目录仍保持 root 私有。
  • 脚本修复提交并推送:398b1da。该提交只改部署工具和测试,不进入本次 Admin 运行时二进制。
  • 按用户授权,生产 Admin 精确发布业务提交:e784806df90014f252abae13de1d632393c5b883。

测试与部署结果

  • Go 1.23.0:go test ./...、go build ./...、go vet ./... 全部通过。
  • bash -n admin/deploy/deploy-admin-remote.sh、git diff --check 通过。
  • python dev_scripts/harness.py check --strict 通过。
  • 固定发布物 SHA-256:3077ce452dd7ddb032667048de59e3a256115e2723523dd01b39bd3a61a3c887;线上二进制哈希一致。
  • 成功部署前备份:/opt/cmautobuy/backups/autobuy-before-e784806-20260828T033537Z-notablespaces.sql.gz,34 张表,脚本已执行 gzip -t 和 SHA 校验。
  • 生产 schema 已从 v30 升级到 v31;chk_ai_match_batch_total 为 total_count BETWEEN 1 AND 200。
  • 18083 独立预检、两次后台活动复核、Nginx 配置检查、原子切换均通过。
  • 线上稳定二进制:/opt/cmautobuy/releases/e784806/cmautobuy-admin。
  • cmautobuy-admin=active,nginx=active;本机 /=303、/login=200;公网 https://buy.833729.com/login=200。

未验证与文档影响

  • 未执行人工登录后的具体业务操作;生产服务、数据库门禁和公网入口已经只读验证。
  • 无长期文档影响:部署命令、入口、服务器参数和回退流程未变化;无需更新 Wiki 或同步镜像。
  • 当前状态:实现、迁移、发布和验证均完成,等待用户验收。
## 2026-08-28 最终实施证据 ### 最终差异 - 修复远端部署脚本在 `umask 077` 下把 release 目录建为 `0700 root:root`、导致 `cmautobuy` 无法执行预检二进制的问题。 - releases 根目录和单个 release 目录现在固定为 `0750 root:cmautobuy`;数据库备份目录仍保持 root 私有。 - 脚本修复提交并推送:`398b1da`。该提交只改部署工具和测试,不进入本次 Admin 运行时二进制。 - 按用户授权,生产 Admin 精确发布业务提交:`e784806df90014f252abae13de1d632393c5b883`。 ### 测试与部署结果 - Go 1.23.0:`go test ./...`、`go build ./...`、`go vet ./...` 全部通过。 - `bash -n admin/deploy/deploy-admin-remote.sh`、`git diff --check` 通过。 - `python dev_scripts/harness.py check --strict` 通过。 - 固定发布物 SHA-256:`3077ce452dd7ddb032667048de59e3a256115e2723523dd01b39bd3a61a3c887`;线上二进制哈希一致。 - 成功部署前备份:`/opt/cmautobuy/backups/autobuy-before-e784806-20260828T033537Z-notablespaces.sql.gz`,34 张表,脚本已执行 `gzip -t` 和 SHA 校验。 - 生产 schema 已从 v30 升级到 v31;`chk_ai_match_batch_total` 为 `total_count BETWEEN 1 AND 200`。 - 18083 独立预检、两次后台活动复核、Nginx 配置检查、原子切换均通过。 - 线上稳定二进制:`/opt/cmautobuy/releases/e784806/cmautobuy-admin`。 - `cmautobuy-admin=active`,`nginx=active`;本机 `/`=303、`/login`=200;公网 `https://buy.833729.com/login`=200。 ### 未验证与文档影响 - 未执行人工登录后的具体业务操作;生产服务、数据库门禁和公网入口已经只读验证。 - 无长期文档影响:部署命令、入口、服务器参数和回退流程未变化;无需更新 Wiki 或同步镜像。 - 当前状态:实现、迁移、发布和验证均完成,等待用户验收。
Sign in to join this conversation.
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: OPC/cmautobuy#319