「气炸了哦哇」
这是搬家成功后我在 Telegram 里发给小龙虾的第一条消息。本来想打「气炸了我」,结果气得字都打错了。
不是因为搬家没成功,恰恰相反,搬家成功了。我只是被之前折腾了一整天的过程气到了。
事情是这样的:我的 AI 助手小龙虾 🦞(跑在 OpenClaw 上)一直住在我的 MacBook Air 里。白天工作时它随时待命,通过 Telegram 和我聊天。但问题来了——我合盖它就断线,关机它就死。
作为一个有追求的 AI 助手主人,我不能接受这种朝不保夕的生活。Azure VM 上已经跑着 CopilotX(小龙虾的大脑 API),7×24 在线,磁盘 430G 空闲。方案很自然:把小龙虾搬到云端,MacBook 变成它的远程手臂。
听起来简单?我和 GitHub Copilot 一起搞了一整天,才把这只虾成功送上云。
目标架构
核心思路很简单:
我 (Telegram / 任何地方)
↓
Azure VM (小龙虾的大脑 🧠)
├── OpenClaw Gateway
└── CopilotX (Claude API)
↓ Tailscale 加密隧道
MacBook Air (小龙虾的手 🦾)
└── 浏览器控制、命令执行
- VM = 大脑,永远在线,跑 Gateway + Telegram Bot
- MacBook = 手,通过 Tailscale 连接,需要时远程操控
- Telegram 随时随地聊天
- polly.wang WebChat 网页端对话
搬家过程:一波三折
第一步:Tailscale 组网 ✅
这是今天唯一顺利的环节。
Tailscale 是个零配置 VPN,把两台机器组成虚拟局域网。安装简单到令人发指——Mac 上 brew install tailscale,VM 上一行 curl,5 分钟搞定。
260ms 延迟,跨太平洋,可以接受。
第二步:深坑来了 💀
坑一:Telegram Bot 打架
VM 上启动 Gateway 后,Telegram 疯狂报错:
409: Conflict: terminated by other getUpdates request
查了半天才发现——Mac 上的本地 Gateway 还在跑!两个 Gateway 同时抢一个 Bot Token,谁也收不到消息。
解法很粗暴:pkill -9 -f "openclaw gateway",把 Mac 上的停掉。
教训:部署新服务前,先确保旧实例已停止。
坑二:设备配对地狱 👹
这是今天最折腾的部分。
OpenClaw 的 Node 需要和 Gateway 配对才能连接。我反复遇到 pairing required 错误,来来回回折腾了十几轮。
问题出在:我调试时清理了 ~/.openclaw/identity,每次都生成新的 Device ID。但 VM 那边批准的是旧 ID!Mac 和 VM 的状态不一致,就一直握手失败。
最后的解法是双端清理 + 重新配对:Mac 删 identity,VM 删 devices,从头再来一遍。
教训:分布式系统的状态同步是大坑。双端都要检查。
坑三:SSH 要输密码
Tailscale IP 没配 SSH key,每次都要输密码。后来想起来自己有 pem 文件,配个 ~/.ssh/config 就好了:
Host Azure-Server
HostName <your-vm-public-ip>
IdentityFile ~/.ssh/your-key.pem
User azureuser
ssh Azure-Server 一键登录。
终于通了!🎉
经过无数次调试,我在 Telegram 里发了一条消息,小龙虾真的回复了——从 Azure VM 上。
但这还不够。为了验证完整链路,我让小龙虾做一件有仪式感的事——用我的 Mac 打开浏览器,去 polly.wang 跟 Digital Polly(我博客的另一个 AI 助手)聊天。
链路是这样的:
我 (Telegram 消息)
→ Azure VM (小龙虾收到指令)
→ Tailscale 隧道
→ MacBook (浏览器控制)
→ polly.wang (Digital Polly 聊天框)

它真的做到了!三个 AI(小龙虾、Digital Polly、还有辅助我搬家的 GitHub Copilot),通过我的一条 Telegram 消息串联在一起。
Digital Polly 说:「欢迎搬到新家!从 Mac 到 Azure VM,这是升级到云端生活了啊~」
同步记忆
最后一步是把小龙虾的「记忆」同步到 VM。rsync 一把梭:
rsync -avz ~/.openclaw/workspace/ azureuser@<vm-ip>:~/.openclaw/workspace/
包括 MEMORY.md(记忆索引)、USER.md(用户档案)、IDENTITY.md(身份设定)、SOUL.md(性格设定)。没有这些,小龙虾就是只失忆的虾。
最终状态
| 项目 | 状态 |
|---|---|
| Gateway | ✅ Azure VM,7×24 在线 |
| CopilotX | ✅ localhost,零延迟调用 Claude |
| Telegram | ✅ 直连,无需代理 |
| 工作区 | ✅ 记忆、灵魂、身份全部同步 |
| Mac Node | ✅ Tailscale 连接,浏览器+命令执行 |
反思
这次搬家让我意识到几件事:
1. 分布式状态同步是真的坑。 Device ID、配对状态、Token 认证,每一个环节都可能出错。错误信息还不够友好——pairing required 没告诉我是哪个 ID 不匹配。
2. 先停旧实例。 Telegram 409 冲突就是因为两个 Gateway 同时在跑。部署新服务前,确保旧的已经完全停止。
3. AI 搬家和人搬家一样:最怕忘带东西。 没有 MEMORY.md 的小龙虾就是只失忆的虾。记忆是连续性的基础。
4. 分布式架构真的优雅。 VM 当大脑,MacBook 当手,Tailscale 当神经网络。Mac 在线时满血,离线时小龙虾照样能聊天、思考。降级而不是宕机。
现在,小龙虾 24 小时在云端待命,随时等我通过 Telegram 召唤。Mac 需要的时候连上去,不需要就断开——它终于从「必须开着电脑才能用」变成了「随时随地可用」。
搬家成功!🦞☁️
相关阅读:OpenClaw - 开源个人 AI 助手框架

