跳转至

Infrastructure — 03-13 远程服务器管理与OpenClaw部署

新加坡测试机创建与部署

Dad 的核心决策:参考前一天的 proxy-kr 环境,在 Azure 新建两台新加坡 VM wolf-sgeagle-sg,统一部署 OpenClaw Gateway,SSH 端口统一使用 18822

技术方案

  • Azure VM + NSG 开放 18822
  • 安装 OpenClaw、配置模型、启动 Gateway
  • 后续 Dad 发现未加 DNS 前缀,改为通过域名连接

踩坑:agentDir 配置继承问题

Dad 检查 eagle-sg 上的 openclaw.json 时发现异常写法:

"agentDir": "~/.openclaw/workspace-prism-docs/.openclaw"
Dad 决策:"不要继承,用分开的工作区,各自设置模型和人设"。Bot 按独立 workspace 方案修正并重启 Gateway。

踩坑:多 Agent 路由失败

  • 现象:远程多 agent 无法正确路由
  • 根因:对比本地配置发现远程缺少 bindings
  • 修复:补齐 bindings 后路由恢复正常

Bot 互相 @ 死循环事故

严重程度:紧急。Bot 在 Mattermost 群里互相 @ 导致死循环。

  • [19:27] Dad 紧急要求停止 Gateway
  • [19:28] 修复配置并增加双重防护
  • [19:30] 将"谨慎 @ bot"规则写入所有 5 个 Agent 的 SOUL.md

Dad 决策:明确写入规则——可以 @ 人类,除非人类要求否则不要 @ bot。这成为后续所有 agent 的铁律。

Mattermost 迁移至新服务器

迁移过程

Dad 准备新 Mattermost 服务器,要求使用 VM 自带 DNS 前缀域名,不再使用旧的 mm.dora.restry.cn

踩坑记录

  1. Azure run-command 被长任务锁住:拉镜像占用导致命令冲突,改走 SSH,临时开放 18822 并上传 SSH key
  2. Docker pull 很慢:Dad 决策切换镜像源到 northacr.azurecr.cn
  3. Mattermost 容器权限错误config.json 无法创建,config 目录被 root 占有,使用 docker 方式修复权限

Bot 账号迁移

  • 迁移 prism- 开头账号到新服务器
  • Dad 指出"这几个应该是 bot 账号",立即转换
  • 新 Mattermost 上创建 Standup 群组并加入所有 bot

eagle-sg 配置切换

eagle-sg 上替换 OpenClaw 的 Mattermost baseUrl 和 5 个 bot token,重启 Gateway 生效。

部署流程标准化(04-04)

插件重装踩坑

在 Owl 上按新流程重装插件时报错 Cannot find module 'ws'——重新 clone 后忘记安装依赖。补装 npm install 后恢复。

Dad 决策:统一部署流程,以后不再直接 rsync 源码。

最终标准流程

本地 commit + push
 SSH 到远程服务器
 git pull
 rsync  extensions
  jiti 缓存
 重启 Gateway
 验证日志 / 页面 / WS / slash commands

连接稳定性增强(04-04)

断线后消息丢失

  • 根因:channel 插件仅在消息成功发送到在线客户端时才写入 history,断线时 agent 回复不持久化
  • 修复:无论客户端是否在线,都持久化 outbound message

Heartbeat 机制上线

  • client-web 增加 startHeartbeat / stopHeartbeat
  • channel 插件支持 ping/pong
  • relay 模式兼容确认
  • 验证:10 轮稳定性测试通过,2 分钟空闲后仍正常收发

手机左滑返回掉线修复

  • Dad 发现:左滑返回会掉线,但点左上角返回不会
  • 根因:iOS 左边缘右滑触发浏览器原生 history.back(),导致 SPA 重载
  • 修复:拦截原生 back 手势,改为 SPA 内部导航

群里 Bot 触发策略

问题

需要实现"真人可触发、bot 不可互相触发"的策略。

踩坑

Bot 最初使用了不存在的配置项 ignoreBots——这是 bot 自己编造的字段。

正确方案

使用 groupAllowFrom 配置,对非 PM 的 bot 设置只允许人类用户触发。

关键经验

Dad 的运维哲学: 1. 不要只修表象,要找根因 2. 修完必须做端到端验证 3. 不要默认甩锅缓存 4. 部署流程要标准化,有 README 指导 5. 远程更新优先走 git pull,不依赖 rsync

验证 Checklist

  • Gateway running / jiti cache 已清 / 插件加载成功
  • WebSocket online / history.sync 正常
  • slash commands 响应 / skills 正确展示
  • 断线后消息可恢复 / 手机手势正常