# 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`,并设置为开机自启和失败重启。 - 程序会按真实二进制目录寻找 `config.yaml`。发布目录通过符号链接读取 `/opt/cmautobuy/config.yaml`,既满足顺运宝模块的路径要求,也避免在每个版本目录 复制一份含凭据的配置。 - 迁移前分别备份线上 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`,未写入仓库、日志或工单。 - 服务器 `/opt/cmautobuy/releases/f0715ee/config.yaml`:指向稳定配置路径的符号链接, 修复顺运宝页面按真实二进制目录读取配置时提示文件不存在的问题。 - 服务器 `/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 状态检查;`readlink -f`、`runuser -u cmautobuy -- test -r` 和不输出值的顺运宝必填项 检查。 - 结果: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,模拟续期通过。发布目录配置链接 指向稳定配置文件,目标权限为 `600`,服务账号可读且顺运宝必填项完整;修复后服务 保持 active,近期错误日志为 0。 - **没验证到的部分**:未使用真实浏览器人工登录并逐页点击;服务端页面、重定向、 Cookie 安全属性、数据库数据和进程状态已通过 HTTP 与数据库检查验证。 ## 相关提交 - `f0715ee` 增加 MySQL 公网 TLS CA 校验(本次线上发布代码版本)