一句话结论:Beszel agent 连不上 hub 时,docker-compose 部署优先重置 fingerprint 和 hub token;二进制部署如果经过反向代理仍失败,可以先绕过域名,直接使用 hub IP 验证链路。
1. 问题背景
我部署了 Beszel,后面发现有两台机器挂了:
- A 服务器:使用 docker-compose 部署
- B 服务器:使用二进制方式部署
虽然表面现象都像是 agent 没有正常连上 hub,但最终根因并不一样。
2. A 服务器排查过程
A 服务器是之前已经跑起来过的,后面状态异常。
2.1 先查资料
我先搜了一下 Google,找到一篇和我遇到的问题比较接近的讨论:
2.2 先检查 fingerprint 和 token
根据这篇讨论,我先看了 A 服务器的 fingerprint,发现它和 hub 里 /settings/tokens 看到的不一致。
一开始我的思路很直接:既然两边不一致,那先改成一致再说。
但改完之后问题依旧,agent 还是没有恢复。
2.3 最终修复方式
后面我直接把 agent 本地的 fingerprint 删掉,同时把 hub 里的 token 清空,再重新启动 docker,结果就恢复了。
我这里实际做的事情是:
- 删除
/var/lib/beszel-agent/fingerprint - 清空 hub 里
/settings/tokens - 重启 docker 对应服务
最终 A 服务器恢复正常。
2.4 小结
对于 docker-compose 部署的 Beszel agent,如果已经出现 fingerprint / token 状态不一致,并且单纯改成一致仍然无效,那更直接的做法是:重置 fingerprint 和 token,让 agent 重新建立关系。
3. B 服务器排查过程
B 服务器不是掉线,而是第一次部署就一直没成功。
3.1 一开始的怀疑点
B 服务器走的是二进制安装方式。排查时我注意到安装脚本里会涉及一个具体域名,也就是 Beszel hub 的域名。
而我的 hub 前面套了 Nginx Proxy Manager,所以我当时的怀疑是:
- agent 到 hub 的连接过程里可能依赖 websocket
- Nginx Proxy Manager 这层代理没有把 Beszel hub 的 websocket 正确处理好
这一步我没有继续先深挖代理配置,而是先做了一个更直接的验证:绕过域名和代理链路,看 agent 能不能直接连上 hub。
3.2 最终修复方式
所以我把二进制安装脚本里的 hub 地址改成了 Beszel hub 的 IP 地址,然后卸载后重新安装,最后启动成功。
这部分我参考的是官方文档:
3.3 小结
对于二进制部署的 Beszel agent,如果首次安装一直失败,而 hub 前面又套了反向代理,那应该优先排除这些问题:
- 域名解析
- 代理转发
- websocket 链路
这种场景下,先把 hub 地址改成 IP 做验证,是一个很快的排查办法。
4. 两个问题的区别
虽然表面现象都是 agent 没起来,但本质上这两个问题并不一样:
| 服务器 | 部署方式 | 问题类型 | 最终处理方式 |
|---|---|---|---|
| A 服务器 | docker-compose | 运行一段时间后异常 | 删除 fingerprint,清空 hub token,重启服务 |
| B 服务器 | 二进制部署 | 首次安装失败 | 将 hub 地址改为 IP,卸载后重新安装 |
所以这次排查里我最大的体会是:不要因为现象一样,就默认根因一样。
5. 这次排查的经验
- 先看已有案例。 遇到这类比较新的工具,GitHub discussion 往往比零散博客更有效。
- 先做最短链路验证。 如果怀疑代理有问题,就先绕过代理;如果怀疑身份信息异常,就先重置本地状态。
- 先区分“掉线”还是“首次部署失败”。 这两个场景的排查方向完全不一样。
- 表面同类问题,不代表根因一致。 A 服务器更像状态异常,B 服务器更像接入链路异常。
6. 总结
这次 Beszel 的问题,A 服务器最终是通过 重置 fingerprint 和 token 解决的,B 服务器最终是通过 绕过域名代理,直接使用 hub IP 重装 解决的。
如果后面再遇到类似问题,我会优先按这个顺序排查:
- 先区分是老机器掉线,还是新机器首次接入失败
- 老机器优先检查 fingerprint / token
- 新机器优先检查域名、代理和 websocket 链路
- 先用最短路径验证,再决定要不要继续深挖代理配置