首页 / output
迁移方案:`8.133.19.10` → `47.239.25.159`
本页目录一、核心原则(先记住这条)二、两个不可绕过的前置条件三、迁移清单(旧机上要搬走的东西)关于证书:不能复用四、执行顺序(不可颠倒)五、唯一的对外中断窗口六、回滚方案七、待盘点清单(拿到 SSH 后立刻要查的)八、备份要求(进入第 1 步的硬门槛)九、安全约定(迁移期尤其重要)
需求号:REQ-002 | 决策:ADR-015(方案 A:旧机退役,整套迁移) 出具日期:2026-10-15 | 状态:待前置条件就绪(缺两台机器的 SSH 访问权)
一、核心原则(先记住这条)
旧机全程保持原样,一个新文件都不改。
理由:旧机是唯一在对外服务的环境,只要它不动,回滚就等于改一条 DNS 解析。 这是方案 A 相对 B/C 最大的优势,绝不能为了"顺手清理一下"而放弃。
因此所有工作都是只读旧机、只写新机。
二、两个不可绕过的前置条件
| # | 前置 | 谁做 | 当前状态 |
|---|---|---|---|
| 1 | 阿里云安全组放行新机 80 / 443(现在实测全不通,只在机器内改防火墙没用,安全组在云平台层) | 你(控制台操作,我做不了) | ❌ 未做 |
| 2 | 两台机器的 SSH 访问权 | 你给新机用户名 + 装公钥;旧机从未取得 | ❌ 未做 |
这两项没完成,本方案一步都执行不了。
三、迁移清单(旧机上要搬走的东西)
| # | 项 | 旧机位置(待盘点确认) | 新机目标 |
|---|---|---|---|
| 1 | nginx 主配置 | /etc/nginx/nginx.conf | 同路径 |
| 2 | nginx 站点配置(含 /mcp、/healthz 转发规则) | /etc/nginx/sites-enabled/ 或 conf.d/ | 同上 |
| 3 | 站点根目录(index.html、test.html) | 待盘点 | 同上 |
| 4 | agent-gateway systemd 服务单元 | /etc/systemd/system/agent-gateway.service | 同上 |
| 5 | 网关环境变量(MCP_API_KEY、DeepSeek 配置) | /etc/agent/agent.env | 同上(凭据不经过聊天、不落项目文件) |
| 6 | /mcp 网关运行时(页面自述链路里的 pi) | 待盘点:是什么、怎么装的、哪些版本 | 按原样重建 |
| 7 | TLS 证书 | 待盘点(Let's Encrypt?阿里云 SSL?) | 必须重签,见下 |
关于证书:不能复用
旧证书签的是 maxiao.xoato.com,新域名是 xiao-ma.xoato.com,域名不同,证书必须重新签发。
两条路:Let's Encrypt(certbot 自动续期)或阿里云免费 SSL 证书(控制台申请后下载部署)。
建议 Let's Encrypt,省去人工续期。
四、执行顺序(不可颠倒)
0 前置:安全组放行 80/443(你) + 两台 SSH 就绪
│
1 两台都做全量备份,写 rollback.sh 并实际演练还原
│ ← 未通过不得进入下一步
2 盘点旧机(只读):nginx conf / 站点根目录 / systemd 单元 / /etc/agent / 运行时清单
│ → 产出 docs/output/服务器现状盘点.md
3 新机装运行时(nginx + node/网关依赖),按盘点结果对齐版本
│
4 部署到新机,此时 DNS 仍指向旧机 ──► 对外完全无感
▲ 验证手段:curl --resolve xiao-ma.xoato.com:80:47.239.25.159 http://xiao-ma.xoato.com/
或 curl -H 'Host: xiao-ma.xoato.com' http://47.239.25.159/
│
5 签 xiao-ma.xoato.com 证书,启用 HTTPS,本地同样方式验证
│
6 新机加 /ems/ 子路径(知识库 + 故障速查 + 问答 + skill-ems.html)
│
7 切换:改 DNS / 改飞书 aily 指向 ◄── 唯一的对外中断窗口
│
8 观察期(建议 ≥ 3 天),确认无异常后旧机退役
第 7 步之前,对外服务始终由旧机承担,用户侧零感知。 这是本方案的价值所在。
五、唯一的对外中断窗口
第 7 步「切 DNS + 改飞书指向」期间:
- 网页:DNS 有其固有 TTL 传播时间,新旧并存过渡,通常无感知
- 飞书智能体:aily 里的回调地址改完才能用,改之前它会一直打旧机。
所以实际中断 = 你在飞书后台点保存的那一刻起,到新机 /mcp 验证通过为止
- 建议:先把新机
/mcp用旧机同一把MCP_API_KEY验证通过(第 4~5 步就做),
再改飞书指向 —— 这样中断窗口能压到一次配置保存的时间
六、回滚方案
| 触发条件 | 回滚动作 | 耗时 |
|---|---|---|
| 新机验证不通过 | 停手即可,DNS 从未切过,无需回滚 | 0 |
| 切换后新机异常 | DNS 改回 8.133.19.10;飞书指向改回旧机 | 分钟级 |
| 新机数据损坏 | 从第 1 步的备份还原 | 分钟级 |
前提:旧机在观察期结束前不删、不改。 这是回滚能力的唯一来源。
七、待盘点清单(拿到 SSH 后立刻要查的)
这些我目前完全不知道,不能凭猜写方案:
旧机(只读)
- [ ] nginx 版本、站点配置文件的实际路径与内容
- [ ] 站点根目录在哪、里面有什么文件
- [ ]
agent-gateway.service的ExecStart/WorkingDirectory/EnvironmentFile/User - [ ]
/etc/agent/下有哪些文件(只看键名,不抄值) - [ ]
pi是什么:可执行文件?容器?npm 包?怎么启动的? - [ ] 证书怎么签的:
/etc/letsencrypt/?还是手工放的 pem? - [ ] 系统版本、已装运行时及版本
- [ ] 有没有 crontab / 其他 systemd 服务 / 反向代理别的端口
新机
- [ ] 系统版本、已装运行时及版本
- [ ] 端口占用情况
- [ ] 是否已有任何站点目录或 web 服务残留
- [ ] 有无 sudo 权限(若用户名不是 root)
两台都要核对(新旧域名不同,最容易漏)
- [ ] 任何写死
maxiao.xoato.com的配置文件、脚本、systemd 单元 - [ ] 飞书 aily 侧配置的回调地址(只有你能看)
- [ ] DeepSeek 侧的调用白名单/限制是否绑了旧 IP
八、备份要求(进入第 1 步的硬门槛)
- 旧机:打包 nginx 全部配置 + 站点根目录 +
/etc/systemd/system/agent-gateway.service
+ /etc/agent/(含密钥,包必须加密或仅本地保存,不得提交进 git、不得放 docs/)
+ 证书目录 + 运行时清单
- 新机:部署前的原始状态快照(即使是空机也要留档,便于确认"确实是空机")
- 备份包拉回本机留一份,并写
rollback.sh rollback.sh必须实际演练过一次还原,不能只写不测
九、安全约定(迁移期尤其重要)
MCP_API_KEY、agent.env内容、私钥 一律不写入本仓库任何文件,也不在聊天里粘贴- 迁移过程中我从旧机读、直接写到新机,凭据不经过对话
- 旧机退役时,
/etc/agent/与备份包要确认妥善处置(不要留在快照里裸奔)