Margrop
Articles254
Tags428
Categories23
1password AC ACP AI AP API AppDaemon Aqara CI/CD Caddy Cloudflare Cookie 认证 Cron D1 Date Diagrams.net Docker Docker Compose Electerm Gateway GitHub Actions HA HADashboard Hexo HomeAssistant IP IPv4 Java LVM‑Thin Linux MacOS Markdown MiniMax Multi-Agent MySQL NAS Nginx Node.js OpenAI OpenClaw OpenResty PPPoE Portainer PostgreSQL ProcessOn Prometheus Proxmox VE SOCKS5 SSL Session Shell Subagent TTS TimeMachine UML Uptime Kuma VPN VPS Web Windows Workers activate ad adb adblock agent aligenie aliyun alpine annotation aop authy autofs backup baidupan bash bitwarden boot brew browser caddy2 cdn centos cert certbot charles chat chrome classloader client clone closures cloudflare cmd command commit container crontab ctyun ddsm demo dependency deploy developer devtools dll dns docker domain download draw drawio dsm dump dylib edge exception export fail2ban feign firewall-cmd flow frp frpc frps fuckgfw function gcc gfw git github golang gperftools gridea grub gvt-g hacs havcs heap hello hexo hibernate hidpi hoisting homeassistant hosts html htmlparser https idea image img img2kvm import index install intel io ios ip iptables iptv ipv6 iso java javascript jetbrains jni jnilib jpa js json jsonb jupter jupyterlab jvm k8s kernel key kid kms kodi koolproxy koolproxyr kvm lan lastpass launchctl learning lede letsencrypt linux live low-code lvm lxc m3u8 mac macos mariadb markdown maven md5 microcode mirror modem modules monitor mount mstsc mysql n2n n5105 nas network nfs node node-red nodejs nohup notepad++ npm nssm ntp oop openfeign openssl os otp ovz p14 packet capture pat pdf pem perf ping pip plugin png powerbutton print pro proxy pve pvekclean python qcow2 qemu qemu-guest-agent rar reboot reflog remote remote desktop renew repo resize retina root route router rule rules runtime safari sata scipy-notebook scoping scp server slmgr so socks source spk spring springboot springfox ssh ssl stash string supernode svg svn swagger sync synology systemctl systemd tap tap-windows tapwindows telecom template terminal tls token totp tvbox txt ubuntu udisk ui undertow uninstall unlocker upgrade url v2ray vhd vim vlmcsd vm vmdk web websocket wechat windows with worker wow xiaoya xml yum zip 中国电信 云电脑 交换机 人机协作 代理 体检 健康检查 光猫 公网IP 内存 内网IP 写作 升级 协作 博客 反向代理 启动 夏令时 多智能体 多节点 多节点管理 天猫精灵 天翼云 安全 安装 定时任务 容器 容器网络 导入 小米 常用软件 广告屏蔽 序列号 应用市场 异常 感悟 打工 打工人 技术 抓包 排查 描述文件 故障 故障排查 效率 效率工具 无服务器 日记 时区 显卡虚拟化 智能家居 智能音箱 服务管理 架构 梯子 模块 流程 流程图 浏览器 漫游 激活 火绒 玄学 生活 电信 画图 监控 直播源 端口扫描 管理 续期 网关 网络 网络风暴 群晖 脚本 腾讯 自动化 虚拟机 认证 证书 语雀 超时 路由 路由器 软件管家 软路由 运维 运维监控 通信机制 部署 配置 钉钉 镜像 镜像源 门窗传感器 问题排查 防火墙 阿里云 阿里源 集客

Hitokoto

Archive

早上刚到公司,就被钉钉告警叫醒了——一次 Gateway 紧急修复实录

早上刚到公司,就被钉钉告警叫醒了——一次 Gateway 紧急修复实录

早上刚到公司,就被钉钉告警叫醒了——一次 Gateway 紧急修复实录

说出来你们可能不信,今天早上我刚到公司,还没来得及喝一口咖啡,手机就开始疯狂震动。打开钉钉一看,好家伙——某VM的OpenClaw Gateway告警了。

作为一个在上海打工的运维人员,这种场景我已经见怪不怪了。我的第一反应不是”糟了”,而是”又是哪里出问题”。熟练地打开SSH,一顿操作猛如虎,先看看日志,再查查配置。

然后我发现了一个很有意思的问题:明明插件都没装,配置文件里却写了一个”dingtalk-connector”。

早上9点:告警来了

今天早上9点多,刚到公司,惯例性地看了一眼监控。

结果钉钉弹出一条消息:某VM的Gateway健康检查失败了。

我SSH连上去一看,发现openclaw-gateway服务确实没在跑。用systemctl查看状态,报的错误信息很有意思:

1
channels.dingtalk-connector: unknown channel id: dingtalk-connector

翻译成人话就是:配置文件里写了一个叫”dingtalk-connector”的渠道,但是系统里根本没有这个插件。

排查过程:配置文件是罪魁祸首

先确认一下服务状态:

1
systemctl --user status openclaw-gateway

好家伙,服务的状态是”inactive (dead)”,根本没起来。

再看看日志:

1
journalctl --user-unit openclaw-gateway -n 50

日志里刷出来的报错信息很明确:

1
[Gateway] Failed to start: channels.dingtalk-connector: unknown channel id: dingtalk-connector

这就很清楚了。OpenClaw Gateway在启动时会读取配置文件,加载所有配置的渠道。如果某个渠道配置了,但对应的插件没安装,就会报这个错误。

但问题是,这个dingtalk-connector是什么时候被写进配置文件的呢?明明这个插件我们从来没装过啊。

我翻了翻配置文件,发现了这段内容:

1
2
3
4
5
"channels": {
"dingtalk-connector": {
// 一堆配置
}
}

还有plugins相关的配置:

1
2
3
4
5
"plugins": {
"allow": ["dingtalk-connector"],
"entries": ["dingtalk-connector"],
"installs": ["dingtalk-connector"]
}

好家伙,这个插件的配置还挺完整的。可惜,系统里根本没有这个插件,所以Gateway启动直接失败。

修复过程:把”过期配置”清理掉

既然知道问题在哪,修复起来就简单了。只需要把这四个地方的dingtalk-connector配置全部删掉就好了。

第一步:找到配置文件

OpenClaw Gateway的配置文件通常在:

1
~/.openclaw/openclaw.json

先备份一下:

1
cp ~/.openclaw/openclaw.json ~/.openclaw/openclaw.json.bak.20260410

第二步:修改配置

把channels里的dingtalk-connector配置删掉:

1
2
3
"channels": {
// 删除 dingtalk-connector 相关配置
}

把plugins里的dingtalk-connector也从allow、entries、installs三个地方删掉:

1
2
3
4
5
"plugins": {
"allow": [], // 删除 dingtalk-connector
"entries": [], // 删除 dingtalk-connector
"installs": [] // 删除 dingtalk-connector
}

第三步:重启服务

修改完配置之后,重启systemd服务:

1
systemctl --user restart openclaw-gateway

等待几秒钟,然后查看状态:

1
systemctl --user status openclaw-gateway

这次,状态终于变成了”active (running)”!

结果:12:07分恢复正常

修复完成之后,Gateway终于能正常启动了。整个修复过程花了大概两三分钟,从发现问题到解决问题,还算比较顺利。

钉钉告警也随之消失,系统恢复了正常运行。

中午:顺便检查了一下其他节点

既然发现了这个问题,我顺手检查了一下其他节点:

节点 状态
p1 某VM ✅ 已修复
p2 某VM ✅ 正常
p3 某VM ✅ 正常
p14 某VPS ✅ 正常
Uptime Kuma ✅ 0 DOWN

其他节点都是正常的,没有类似的问题。只有p1这台机器,不知道什么时候被人写了一个无效的渠道配置。

反思:为什么会这样?

事后我在想,这个dingtalk-connector配置是怎么来的呢?可能的原因有几个:

第一种可能:之前的某次配置迁移。 可能在某个时间点,配置文件从别的机器复制过来的,带过来了一个已经废弃的渠道配置。

第二种可能:某次测试留下的痕迹。 可能之前测试过dingtalk-connector插件,配置了但后来插件删了,配置却忘了删。

第三种可能:某次升级时自动生成的。 某些版本的OpenClaw可能会在升级时生成默认配置,如果默认模板里包含了这个渠道,就会出现这种情况。

不管是哪种原因,这件事给我提了个醒:配置文件要定期清理。 那些已经不用的插件配置,最好及时删掉,不然哪天Gateway起不来,你还得花时间排查。

下午:顺便优化了一下健康检查

既然发现了这个问题,我顺便优化了一下健康检查脚本,加了一个检查项:检查Gateway能否正常启动。

之前的健康检查只检查进程在不在、服务状态是否正常。现在加了一个检查:如果服务处于inactive状态,尝试读取配置文件的channels配置,检查是否有不存在的插件。

这样下次再出现类似的问题,健康检查就能提前发现了。

晚上:总结今日感悟

终于熬到了下班点。回头看看今天的工作,虽然只是一个很小的修复,但有几个感悟想分享:

第一,告警响应要快,心态要稳。

今天这个问题虽然解决起来不复杂,但告警来得突然,很容易让人紧张。关键是要冷静分析,一步步排查,找到问题的根源。切忌一看到告警就慌了手脚,一通乱改反而可能改出新问题。

第二,配置文件要定期清理。

那些已经不用的配置,最好及时删掉。配置文件里的”历史遗留问题”,往往会在你最意想不到的时候给你一个”惊喜”。养成定期整理配置文件的习惯,能省去很多麻烦。

第三,自动化健康检查很重要。

如果今天不是健康检查脚本在凌晨跑了一遍又一遍,这个配置问题不知道要藏多久才被发现。很多问题在早期发现,处理起来很简单;等它发展成大故障,处理起来就复杂多了。

第四,打工要有好心态。

今天是修完了,但明天可能还有新的问题在等着。这是定律,改不了的。那怎么办?要么接受,要么转行。我选择前者。

写在最后

今天的工作虽然不算复杂,但又一次证明了运维工作的一个真理:问题往往藏在细节里。

一个不起眼的”unknown channel id”错误,背后可能是一个早已废弃的插件配置。这种问题,说大不大,说小不小,关键看你有没有及时发现。

在上海这座城市上班已经这么辛苦了,服务器的问题能少一点就少一点吧。希望明天的告警能少一些,希望明天的咖啡能好好喝完。

明天继续加油吧。


作者:小六,一个在上海努力生存的普通打工人

Author:Margrop
Link:http://blog.margrop.com/post/2026-04-10-gateway-emergency-repair-%E5%AE%9E%E5%BD%95/
版权声明:本文采用 CC BY-NC-SA 3.0 CN 协议进行许可