1
Deployment-and-Operations
ila edited this page 2026-08-26 17:07:26 +08:00
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.

Admin 部署与运维

本页用途

本页供 cmautobuy 内部维护者部署和运维生产 Admin。日常发布以仓库 admin/deploy/deploy-admin.ps1 为唯一入口;本页解释它的安全门禁、预期结果和人工停止位置,不另造一套会漂移的手工发布流程。

安全边界

  • 部署会连接生产服务器、备份 MySQL、安装 release、重启 systemd 并改变公网服务;只有用户明确要求部署时才能执行。
  • 本页只记录配置名称和安全来源,不记录真实密码、Token、Cookie、私钥或证书内容。
  • 默认禁止 schema 升级;只有确认迁移和回退兼容性后显式使用 -AllowSchemaMigration。
  • 脚本可以在切换失败时恢复上一稳定二进制,但数据库迁移不会自动反向恢复。
  • 恢复数据库备份会覆盖备份后的业务数据,必须停止服务、确认影响并由负责人单独授权。
  • 发布脚本不会触发顺运宝同步、目录导入、AI 调用、采集、采购、下单或付款。

服务概览

项目 当前值
systemd 服务 cmautobuy-admin
运行账号 cmautobuy:cmautobuy
工作目录 /opt/cmautobuy
稳定二进制 /opt/cmautobuy/cmautobuy-admin,指向 release
release 目录 /opt/cmautobuy/releases/<提交短号>/
稳定配置 /opt/cmautobuy/config.yaml
稳定数据目录 /opt/cmautobuy/data/
环境文件 /etc/cmautobuy/admin.env,权限受控
AI 密钥目录 /etc/cmautobuy/secrets/
内部监听 127.0.0.1:18080
预检监听 127.0.0.1:18083,临时
公网入口 https://buy.833729.com,由 nginx 反向代理
数据库 MySQL 8.4,数据库 autobuy
备份目录 /opt/cmautobuy/backups/

systemd 单元模板在 admin/deploy/cmautobuy-admin.service。服务只监听本机地址,不把 18080/18083 直接暴露到公网。

环境要求

Windows 构建机

从仓库根目录检查:

git --version
go version
tar --version
ssh -V
scp

预期这些命令均存在。部署脚本会强制使用 Go 1.23.0,运行 Admin 全量 test、build、vet,再交叉构建 linux/amd64、CGO_ENABLED=0 单文件。

Linux 服务器

远端执行器要求 bash、sha256sum、mysql、mysqldump、gzip、curl、systemctl、ss、runuser、install、readlink 和 nginx。缺少任一命令都会在修改生产前停止。

只读检查:

systemctl is-enabled cmautobuy-admin
systemctl is-active cmautobuy-admin
nginx -t
curl -sS -o /dev/null -w '%{http_code}\n' http://127.0.0.1:18080/

预期:systemd 已启用且 active;nginx 配置测试成功;Admin 根路径返回 303。

配置与凭据来源

名称 用途 安全来源 敏感
CMAUTOBUY_DB_HOST / PORT / NAME / USER MySQL 连接定位 /etc/cmautobuy/admin.env 部分
CMAUTOBUY_DB_PASSWORD MySQL 业务账号密码 同一权限受控环境文件 是
CMAUTOBUY_DB_TLS_MODE / TLS_CA MySQL TLS 验证 环境文件和服务器 CA 路径 CA 路径否,内容不写入本页
CMAUTOBUY_CATALOG_SOURCE 商品目录来源名 环境文件 否
CMAUTOBUY_CATALOG_TOKEN 商品目录接口认证 环境文件 是
CMAUTOBUY_AI_SECRETS_PATH AI 密钥文件目录 /etc/cmautobuy/secrets/ 路径否,内容是
CMAUTOBUY_AI_ALLOWED_HOSTS AI 服务允许主机 环境文件 否
MySQL 管理 defaults 文件 部署备份和 schema 只读检查 服务器 root 专用受控文件 是
SSH 私钥 生产 SSH 认证 维护者本机受控路径或 ssh-agent 是

脚本使用 BatchMode=yes 和严格主机密钥检查,不接收或保存 SSH 密码。

首次部署

首次准备 systemd、nginx、运行账号、目录、环境文件、TLS CA 和数据库权限属于独立运维变更,不能用日常发布脚本替代。最少要完成:

  1. 创建 cmautobuy 系统账号及 /opt/cmautobuy、/etc/cmautobuy 必要目录。
  2. 将受控配置和环境文件按最小权限放置,真实值不进入 Git。
  3. 安装并启用 cmautobuy-admin.service,确认内部只监听 127.0.0.1:18080。
  4. 配置 nginx 和 HTTPS,nginx -t 通过后才 reload。
  5. 建立 MySQL 8.4 数据库、业务账号、TLS 与备份管理配置。
  6. 先用独立测试库验证当前 schema,再对生产执行有明确授权的首次迁移。
  7. 运行本文“健康检查”。

首次部署涉及生产权限和数据,必须有独立工单、回退方案和实际运维确认。

日常发布

1. 只读预览

从仓库根目录:

.\admin\deploy\deploy-admin.ps1 -WhatIf

预期只显示固定提交、目标服务器和是否允许迁移;不构建、不上传、不备份、不重启。

2. 发布无 schema 变化的版本

.\admin\deploy\deploy-admin.ps1 -Commit <已提交的完整哈希或可解析引用>

脚本只使用 git archive <固定提交> 的内容。工作区可以有无关未提交修改,但不会进入发布物;需要发布的新代码必须先提交并推送。

3. 发布含 schema 迁移的版本

当前 2026-08-26 代码声明 MySQL schema v31。生产低于目标版本时,普通发布会在修改前停止并提示目标版本。确认 v31 迁移、自检、旧二进制兼容性和备份恢复代价后,显式执行:

.\admin\deploy\deploy-admin.ps1 -Commit <目标提交> -AllowSchemaMigration

-AllowSchemaMigration 只允许新 release 在备份完成后、18083 独立端口预检时执行仓库中已有迁移;它不跳过 schema 自检,也不授权恢复备份。

固定安全步骤

  1. 解析并记录 40 位 Git 提交和目标 schema。
  2. 在隔离源码上用 Go 1.23.0 执行 test、build、vet。
  3. 构建 Linux amd64 二进制并计算 SHA-256。
  4. 上传到随机 /tmp 路径,服务器核对 SHA。
  5. 检查当前 systemd、schema 和四类后台活动任务。
  6. 创建 MySQL 单事务 gzip 备份并检查 gzip、建表语句和 SHA-256。
  7. 安装到新 release,只链接稳定配置和数据。
  8. 在 127.0.0.1:18083 启动预检,核对根路径、登录页、目标 schema 和后台空闲。
  9. 原子切换稳定二进制并重启 systemd。
  10. 核对稳定链接、systemd、nginx、本机 18080、公网根路径和登录页。

任一步失败都不能宣称部署成功。

健康检查与日志

每次发布或回退后:

systemctl is-active cmautobuy-admin
readlink -f /opt/cmautobuy/cmautobuy-admin
nginx -t
curl -sS -o /dev/null -w '%{http_code}\n' http://127.0.0.1:18080/
curl -sS -o /dev/null -w '%{http_code}\n' https://buy.833729.com/
curl -sS -o /dev/null -w '%{http_code}\n' https://buy.833729.com/login
journalctl -u cmautobuy-admin -n 100 --no-pager

预期:服务 active;稳定链接指向目标 release;nginx 测试通过;根路径返回 303;登录页返回 200;日志没有新的致命错误。

schema 和后台任务核对使用服务器本机受控 MySQL 管理配置执行,不把命令输出中的业务数据复制到工单或文档。

数据库迁移、备份与恢复

部署前备份写入 /opt/cmautobuy/backups/autobuy-before-<release>-<UTC时间>-notablespaces.sql.gz,权限 0600。脚本验证:

  • gzip 可完整解压;
  • 备份至少包含一条 CREATE TABLE;
  • 记录 SHA-256;
  • 使用 --single-transaction --routines --triggers --no-tablespaces。

脚本不会删除历史 release 和备份。

恢复备份不是日常自动回退步骤。需要恢复时必须先停止 Admin,确认将丢失的备份后数据,保存当前故障库证据,在独立环境演练恢复和 schema 自检,再由负责人授权生产恢复。恢复后重新执行登录、schema、任务关系和关键业务数量核对。

回退

  • 切换后 systemd、本机 18080、nginx 或公网健康检查失败时,远端执行器会把稳定链接恢复到上一可执行 release 并重启服务。
  • 自动回退只处理二进制链接,不恢复数据库。
  • 如果新版本已经把 schema 从 v30 升到 v31,只有确认上一二进制兼容 v31 时才能继续使用自动代码回退;不兼容时停止发布并走人工数据库恢复决策。
  • 手工回退前先记录当前 release、上一 release、当前 schema、备份路径与 SHA,不删除故障 release。
  • 回退后必须重新执行健康检查,未全部通过时立即人工处理。

已知限制

  • 当前为单机 systemd 部署,没有灰度、多实例滚动发布。
  • #309 的脚本已完成本地语法、测试、隔离构建和失败上传路径验证;截至其验收记录,尚未在该脚本下实际演练生产备份、18083 预检、v31 迁移、原子切换和自动回退。
  • 数据库备份恢复不会自动执行,也尚未作为日常脚本能力提供。
  • 本页不代替生产变更工单和用户明确部署授权。