EMS 知识库
首页 / output

迁移方案:`8.133.19.10` → `47.239.25.159`

需求号:REQ-002 | 决策:ADR-015(方案 A:旧机退役,整套迁移) 出具日期:2026-10-15 | 状态:待前置条件就绪(缺两台机器的 SSH 访问权)


一、核心原则(先记住这条)

旧机全程保持原样,一个新文件都不改。

理由:旧机是唯一在对外服务的环境,只要它不动,回滚就等于改一条 DNS 解析。 这是方案 A 相对 B/C 最大的优势,绝不能为了"顺手清理一下"而放弃。

因此所有工作都是只读旧机、只写新机。

二、两个不可绕过的前置条件

#前置谁做当前状态
1阿里云安全组放行新机 80 / 443(现在实测全不通,只在机器内改防火墙没用,安全组在云平台层)你(控制台操作,我做不了)❌ 未做
2两台机器的 SSH 访问权你给新机用户名 + 装公钥;旧机从未取得❌ 未做

这两项没完成,本方案一步都执行不了。

三、迁移清单(旧机上要搬走的东西)

#项旧机位置(待盘点确认)新机目标
1nginx 主配置/etc/nginx/nginx.conf同路径
2nginx 站点配置(含 /mcp、/healthz 转发规则)/etc/nginx/sites-enabled/ 或 conf.d/同上
3站点根目录(index.html、test.html)待盘点同上
4agent-gateway systemd 服务单元/etc/systemd/system/agent-gateway.service同上
5网关环境变量(MCP_API_KEY、DeepSeek 配置)/etc/agent/agent.env同上(凭据不经过聊天、不落项目文件)
6/mcp 网关运行时(页面自述链路里的 pi)待盘点:是什么、怎么装的、哪些版本按原样重建
7TLS 证书待盘点(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 + 改飞书指向」期间:

所以实际中断 = 你在飞书后台点保存的那一刻起,到新机 /mcp 验证通过为止

再改飞书指向 —— 这样中断窗口能压到一次配置保存的时间

六、回滚方案

触发条件回滚动作耗时
新机验证不通过停手即可,DNS 从未切过,无需回滚0
切换后新机异常DNS 改回 8.133.19.10;飞书指向改回旧机分钟级
新机数据损坏从第 1 步的备份还原分钟级

前提:旧机在观察期结束前不删、不改。 这是回滚能力的唯一来源。

七、待盘点清单(拿到 SSH 后立刻要查的)

这些我目前完全不知道,不能凭猜写方案:

旧机(只读)

新机

两台都要核对(新旧域名不同,最容易漏)

八、备份要求(进入第 1 步的硬门槛)

+ /etc/agent/(含密钥,包必须加密或仅本地保存,不得提交进 git、不得放 docs/) + 证书目录 + 运行时清单

九、安全约定(迁移期尤其重要)