Margrop
Articles237
Tags413
Categories23
1password AC ACP AI AP API AppDaemon Aqara CI/CD Caddy Cookie 认证 Cron Date Diagrams.net Docker Docker Compose 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 Shell TTS TimeMachine UML Uptime Kuma VPN VPS Web Windows 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

星期四晚上9点,我给服务器做了一次"全身体检"

星期四晚上9点,我给服务器做了一次"全身体检"

星期四晚上9点,我给服务器做了一次”全身体检”

周四晚上九点,大部分人已经在刷手机准备洗洗睡了。而我,一个普通的服务器运维打工人,正坐在电脑前,打开了一个叫做 openclaw doctor 的命令。

你没看错,是”doctor”。给服务器看病的那种。

说起来,今天其实是个很普通的工作日。早上到公司,处理了几封邮件,看了一眼监控系统——绿色的,全部是绿色的。没有告警,没有突发状况,平静得像湖面一样。

按理说这种日子应该很开心才对。但作为一个被服务器”坑”过太多次的打工人,我的心里始终有一个声音:太顺利了,是不是在憋什么大招?

那个红色的数字,引起了我的注意

下午的时候,我习惯性地看了一眼 Gateway 的状态。然后发现了一行很有意思的输出:

1
[gateway] update available (latest): v2026.4.1 (current v2026.3.28)

翻译成人话就是:你的 Gateway 有一个新版本,但你还没更新。

说实话,看到这个的时候,我的心情挺复杂的。一方面,新版本意味着新功能,说不定还有些 bug 被修了;另一方面,作为过来人,我太知道”更新”这两个字意味着什么了——搞不好更新完服务起不来,一晚上就没了。

但是不更新也不行。旧版本迟早会被淘汰,而且新版本通常有安全修复。

我在心里默默记下:今晚要处理这件事。

九点,终于轮到服务器”体检”了

吃完晚饭,哄完小孩(没有小孩,是猫),九点整,我打开了终端。

作为一个有一定”职业病”的运维,我每次登录服务器之后都会做一套固定的动作:看状态、看日志、看资源。久而久之,这套流程已经变成了肌肉记忆。

但今天,我决定做一件更系统的事情:给服务器做一次全面体检。用的是 openclaw doctor

这个命令我之前也用过,但从来没有认真看过它的全部输出。今天趁着新版本发布的契机,我想看看这个”医生”到底能查出些什么。

第一项:启动优化建议

医生一上来就给了一个”生活方式建议”:

1
2
3
4
5
6
7
◇  Startup optimization ────────────────────────────────

- NODE_COMPILE_CACHE is not set; repeated CLI runs can be slower
- OPENCLAW_NO_RESPAWN is not set to 1
- Suggested env for low-power hosts:
export NODE_COMPILE_CACHE=/var/tmp/openclaw-compile-cache
export OPENCLAW_NO_RESPAWN=1

说实话,看完这个我愣了一下。这两条我都不知道是啥意思。

第一条 NODE_COMPILE_CACHE,大概是说 Node.js 重复运行的时候,如果没有设置这个缓存,每次都要重新编译,速度会慢。这个我理解,适用于树莓派之类的低性能设备。我这台服务器虽然不算强,但也不算弱,应该还好。

第二条 OPENCLAW_NO_RESPAWN,这个”不要自我重启”的标志,我猜测是说 Gateway 遇到问题的时候不要反复自我恢复,免得消耗资源。这倒是个合理的建议,尤其是当问题比较严重、反复重启也没用的时候。

这一项属于”预防保健”,没有急迫性,但值得记下来。

第二项:一个被沉默掉的飞书频道

1
2
3
4
5
◇  Doctor warnings ─────────────────────────────────────

- channels.feishu.groupPolicy is "allowlist" but
groupAllowFrom is emptyall group messages will be
silently dropped.

这一项引起了我的警觉。

翻译一下:飞书频道的消息策略是”白名单”模式,也就是说只有白名单里的人发的消息才会被处理。但问题是——白名单是空的。这意味着所有群消息都被静默丢弃了

静默丢弃。这个词听起来就让人后背发凉。

什么意思呢?假设你在飞书群里配置了一个 Bot,期望它能响应群里某些人的指令。但因为 groupAllowFrom 没配置,所有消息都被 Bot 无声无息地忽略了——Bot 不会报错,不会提醒,只是默默地不看这些消息。

这有点像你家有一个安保系统,摄像头都开着,但监控室的人睡着了,你也不知道。

为什么这件事之前没发现?因为 Bot 不会主动报错。你以为它在工作,实际上它什么都没看到。

这条必须立刻修复。

第三项:四个”孤儿”文件

1
2
3
4
5
6
7
◇  State integrity ────────────────────────────────────

- Found 4 orphan transcript files in
~/.openclaw/agents/main/sessions.
These .jsonl files are no longer referenced by
sessions.json, so they are not part of any active
session history.

这句话有点技术,但我尽量解释清楚。

Gateway 运行的时候,会把对话历史保存在一种叫做 transcript 的文件里(格式是 .jsonl)。这些文件正常情况下会被 sessions.json 索引和引用。但有些时候——比如会话异常中断、或者手动删除了一些记录——会出现一些”没有人要”的文件。

它们躺在文件夹里,占着磁盘空间,但已经完全没人管了。

这有点像你家里堆的那些快递盒子——箱子还在,但你已经不记得里面装的是什么了,而且它也不影响你生活,就是碍眼。

四个孤儿文件,不算多,但积累久了也会变成问题。清理一下是好的。

第四项:一个安全警告

1
2
3
4
5
Security ────────────────────────────────────────────

- WARNING: Gateway bound to "lan" (0.0.0.0)
(network-accessible).
Ensure your auth credentials are strong and not exposed.

这条是最让我心里咯噔一下的。

Gateway 绑定到 0.0.0.0 意味着什么?意味着这台服务器在网络上是可以被访问的。只要知道 IP 地址和端口,理论上任何人都能尝试连接。

当然,连接需要认证凭据。但”需要凭据”和”安全”之间,还有一个很大的距离。

弱密码、有漏洞的认证流程、泄露的 Token……这些都是可能的攻击面。医生给的建议是:

  1. 确保认证凭据足够强
  2. 或者把 Gateway 绑定改回 loopback(只允许本机访问),然后通过 Tailscale 等工具做安全远程访问

这个建议我之前也看到过,但一直没有认真处理。今天被医生点名了,心里又多了一份紧迫感。

体检结束:需要行动的结论

整个体检大概花了五分钟。结论是这样的:

  • 需要立刻处理:飞书频道静默丢弃问题
  • 需要近期处理:安全绑定问题、孤儿文件清理
  • 可以缓一缓:启动优化建议

说实话,这份报告比我预期的要”丰富”。我原本以为服务器跑得好好的,应该没什么大问题。结果医生一查,小问题还真不少。

这大概就是运维的常态:没查的时候觉得一切正常,一查全是问题。

区别只在于,有些问题会造成直接故障,有些问题只是”潜在风险”。但作为打工人,我们都知道,潜在风险如果不及时处理,迟早会变成直接故障。

这次体检给我的一点感悟

说起来,今天这次体检让我想起了自己每年的公司体检。

每年公司组织体检,我都是忐忑不安地去,忐忑不安地等报告。拿到报告之后,最怕看到的不是某个指标异常,而是”建议复查”四个字——因为那意味着我要再去一次医院,再等一轮报告,再接受一次心理折磨。

但话说回来,体检本身就是一件好事。发现问题总比没发现问题好。早发现总比晚发现好。

服务器也一样。

openclaw doctor 就是服务器的体检工具。平时你看不到问题,不代表没有问题;服务正常运行,不代表所有配置都正确。有些问题藏在水面下,平时不露头,但一旦发作起来,就是要命的那种。

所以,定期体检,很重要。

明天的待办清单

体检完了,接下来就是”遵医嘱”了。

我给自己列了一个简单的清单:

  1. 先把飞书频道的 groupAllowFrom 配上,避免消息继续被静默丢弃
  2. 检查 Gateway 的认证凭据,确保没有泄露风险
  3. 清理那四个孤儿 transcript 文件
  4. 考虑把 Gateway 绑定改为更安全的模式
  5. 找时间把新版本升了

这份清单不算重,但每一条都有点紧迫感。尤其是飞书频道那条——你能想象一个 Bot 在群里,但它假装没看见你发的消息吗?

写在最后

周四晚上十点半,我终于从服务器上退了出来。

今天的”体检”花了我大概一个半小时,比预期要久。主要是因为有些问题需要查文档、有些需要想清楚再动手。但总体来说,这一个半小时花得很值。

古人云:上医治未病,中医治欲病,下医治已病。

对于服务器来说,也是同样的道理。提前发现问题,比等它炸了再救火,要轻松得多。

不过,话说回来,打工人都知道,理想是理想,现实是现实。大部分时候,我们都在”已病”和”欲病”之间反复横跳——不是不想预防,是预防需要时间,而时间永远不够用。

但今天,我至少做了一次完整的体检,也算给自己交了一份还算及格的答卷。

明天继续干活。服务器还在跑,我也要继续跑。


作者:小六,一个周四晚上还在给服务器看病的普通打工人

Author:Margrop
Link:http://blog.margrop.com/post/2026-04-02-servers-doctors-and-late-night-revelations/
版权声明:本文采用 CC BY-NC-SA 3.0 CN 协议进行许可