From 45032ccf114df7c66bd12769077d0ce408b84bfc Mon Sep 17 00:00:00 2001 From: chengma Date: Mon, 10 Aug 2026 10:36:09 +0800 Subject: [PATCH] =?UTF-8?q?docs:=20=E5=BD=92=E6=A1=A3=E4=BB=BB=E5=8A=A1=20?= =?UTF-8?q?#81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/task/81-Admin部署到线上服务器.md | 80 +++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 docs/task/81-Admin部署到线上服务器.md diff --git a/docs/task/81-Admin部署到线上服务器.md b/docs/task/81-Admin部署到线上服务器.md new file mode 100644 index 0000000..29bf1fa --- /dev/null +++ b/docs/task/81-Admin部署到线上服务器.md @@ -0,0 +1,80 @@ +# 81 Admin:部署到线上服务器 + +- 类型:需求 +- 父级大工单:#76 +- 所属 MVP / 版本:#77 +- 状态:已完成 +- 日期:2026-08-10 +- Gitea 工单:http://ilaer.eicp.net:8418/chengma/cmautobuy/issues/81 + +## 背景与目标 + +将 Admin 从 Windows 本地运行方式迁移到 `185.216.248.75`,使用同机 MySQL 8.4, +通过 `https://buy.833729.com` 提供服务,并保证历史 SQLite 数据、迁移窗口内新产生的 +顺运宝数据及服务器上原有 cmhub 服务不受损。 + +## 最终方案 + +- 使用 Go 1.23.0 交叉编译 Linux amd64 单文件,按提交 `f0715ee` 建立只读发布目录, + 由固定符号链接指向当前版本;持久数据目录独立于发布目录。 +- systemd 使用专用 `cmautobuy` 用户运行,数据库凭据仅保存在 root-only 环境文件, + 应用只监听 `127.0.0.1:18080`,并设置为开机自启和失败重启。 +- 迁移前分别备份线上 MySQL 和本地 SQLite,并建立迁移前 MySQL 独立快照库。 + 先把 SQLite 的 15 张业务表迁入空的 MySQL `autobuy`,完成逐表数量和全列摘要核对, + 再按更新时间合并迁移窗口内已同步的数据。 +- 迁移窗口内的 1,098 条顺运宝数据与 SQLite 中的订单主键全部重合,因此最终订单数 + 仍为 5,334 条;保留较新的订单版本,不制造重复数据。进行中的同步记录改为 + `interrupted`,避免上线后误判任务仍在运行。 +- Nginx 将 `buy.833729.com` 反向代理到 Admin;HTTP 仅保留 ACME challenge 并将其他 + 请求 301 跳转到 HTTPS。HTTPS 使用 Let's Encrypt ECDSA 证书、TLS 1.2、HSTS 和常用 + 安全响应头,向应用传递可信的反向代理协议头。 +- 复用服务器现有每日 Certbot 续期任务;模拟续期成功后才完成交付。 + +与原方案相比,目标 MySQL 在正式迁移前已由本地联调产生顺运宝数据,不能直接按空库 +覆盖。实际实施增加“迁移前快照库 + SQLite 完整迁移 + 按更新时间合并增量”步骤, +以同时保留旧库完整数据和联调期间的新数据。 + +## 改了哪些 + +- 服务器 `/opt/cmautobuy/releases/f0715ee/`:部署 Admin 和一次性迁移工具。 +- 服务器 `/etc/systemd/system/cmautobuy-admin.service`:增加 Admin 常驻服务及开机自启。 +- 服务器 `/etc/cmautobuy/admin.env`、`/opt/cmautobuy/config.yaml`:配置线上 MySQL 和 + 顺运宝运行参数,文件权限均为 `600`,未写入仓库、日志或工单。 +- 服务器 `/www/server/panel/vhost/nginx/buy.833729.com.conf`:增加 HTTP、HTTPS、 + ACME challenge、反向代理和安全响应头。 +- 线上 MySQL `autobuy`:迁入历史 SQLite 数据并合并迁移窗口内的较新顺运宝数据。 +- `docs/task/81-Admin部署到线上服务器.md`:记录最终部署、迁移和验收结果。 + +## 验收结果 + +| 验收标准 | 结果 | +|---|---| +| Go 1.23.0 Linux 发布包在服务器校验一致并正常运行 | 通过 | +| SQLite 15 张业务表迁移后逐表数量与全列摘要一致 | 通过 | +| 迁移窗口内新增数据不丢失、不重复 | 通过 | +| Admin 仅监听服务器回环地址并由 systemd 管理 | 通过 | +| HTTP 自动跳转 HTTPS,登录页可通过域名访问 | 通过 | +| HTTPS 证书域名、HSTS 和 Secure Cookie 正确 | 通过 | +| Certbot 模拟续期成功且每日续期任务存在 | 通过 | +| MySQL、Nginx、cmhub 和 66 个图片 worker 无回归 | 通过 | +| 敏感配置未进入 Git、工单、归档或运行日志 | 通过 | + +## 测试 + +- 执行的命令:Go 1.23.0 Linux amd64 交叉编译及 SHA-256 核对; + `migrate-sqlite-to-mysql --execute`、`--verify-only`;MySQL 逐表数量、主键重合和同步状态 + 查询;`systemctl is-active/is-enabled`;`ss -lnt`;`nginx -t`;公网 HTTP/HTTPS `curl`; + 证书域名校验;`certbot renew --dry-run --no-random-sleep-on-renew`;cmhub 服务及 worker + 状态检查。 +- 结果:Admin、MySQL 8.4、Nginx、cmhub-web、cmhub-generate 均为 active;Admin 开机 + 自启且只监听 `127.0.0.1:18080`;HTTP 返回 301,HTTPS 根路径返回 303,登录页返回 + 200,`https://cm.833729.com/` 保持 200;66 个图片 worker 正常。线上保留 2 个用户、 + 5,195 个蝦皮商品、6,092 个蝦皮 SKU、4 个 PDD 商品、5,334 条顺运宝货运单和 2 个 + 任务,运行中同步为 0。证书有效期至 2026-11-08,模拟续期通过。 +- **没验证到的部分**:未使用真实浏览器人工登录并逐页点击;服务端页面、重定向、 + Cookie 安全属性、数据库数据和进程状态已通过 HTTP 与数据库检查验证。 + +## 相关提交 + +- `f0715ee` 增加 MySQL 公网 TLS CA 校验(本次线上发布代码版本) +