用 Beszel 搭一套轻量监控:hub + agent 的 Docker Compose 部署笔记
Beszel 是一个 Go 写的服务器监控平台,分两个组件:hub 是基于 PocketBase 的 Web 应用,负责看板、用户和数据管理;agent 跑在被监控机器上,负责采集并上报指标。项目 MIT 许可,仓库 henrygd/beszel,文档 beszel.dev。
以下步骤按官方文档(文档版本 0.21.0)整理,未逐项实测的部分会在对应位置注明。
为什么用它
- 单二进制,hub 和 agent 都能直接跑,也能用 Docker/Podman 起,配置项不多,不用先搭数据库、再装采集器、再配 exporter。
- 自带 Docker 容器指标与历史:每个容器的 CPU、内存、网络都能在界面上看曲线。
- 告警覆盖多数指标,可接多种通知服务。
- 硬件层面覆盖得比较全:S.M.A.R.T.(含 eMMC 磨损与 Linux mdraid 健康)、ZFS(池容量/健康/IO/scrub/数据集用量)、温度、风扇转速(读 Linux 的
/sys/class/hwmon)、GPU 使用率与功耗(Nvidia/AMD/Intel)、电池。 - 另外有网络监控(从 agent 侧测响应时间与中断)、多用户、OAuth/OIDC(可禁用密码登录)、自动备份到磁盘或 S3 兼容存储、API 访问。
官方 README 称它比主流方案更小更省资源——这是官方说法,选型时按自己机器实测判断,别当结论抄。
Docker Compose 部署 hub 与本地 agent
先建目录 beszel,在里面写 docker-compose.yml。官方给的完整版本如下,包含一个本地 agent:
services:
beszel:
image: henrygd/beszel:latest
container_name: beszel
restart: unless-stopped
environment:
APP_URL: http://localhost:8090
ports:
- 8090:8090
volumes:
- ./beszel_data:/beszel_data
- ./beszel_socket:/beszel_socket
# healthcheck:
# test: ['CMD', '/beszel', 'health', '--url', 'http://localhost:8090']
beszel-agent:
image: henrygd/beszel-agent:latest
container_name: beszel-agent
restart: unless-stopped
network_mode: host
volumes:
- ./beszel_agent_data:/var/lib/beszel-agent
- ./beszel_socket:/beszel_socket
- /var/run/docker.sock:/var/run/docker.sock:ro
environment:
LISTEN: /beszel_socket/beszel.sock
HUB_URL: http://localhost:8090
TOKEN:
KEY: ""
# healthcheck: test: ['CMD', '/agent', 'health']
几处要点:
APP_URL改成实际访问地址。走反向代理时填外部域名,否则界面里的链接会指向错误地址。./beszel_data是 hub 的数据目录,./beszel_socket是 hub 与同机 agent 之间共享的 unix socket 目录,两侧都要挂。- agent 用
network_mode: host,直接占用宿主网络栈,所以没有ports段,HUB_URL写http://localhost:8090才通。 LISTEN: /beszel_socket/beszel.sock让 agent 监听 socket 而不是 TCP 端口。/var/run/docker.sock以只读方式挂进来,用于采集容器指标。- healthcheck 在官方 compose 里是注释状态,需要的话取消注释。
改完 APP_URL 后启动:
docker compose up -d
打开 http://:8090,先创建管理员账号。
添加第一台被监控机器
进入后台点 Add System,弹窗会给出这台机器的 agent 配置。
走本地 unix socket 时,Web UI 里的 Host/IP 填 /beszel_socket/beszel.sock;同时要把 compose 里的 KEY 和 TOKEN 换成这次添加系统时生成的公钥与 token,然后重启 agent 容器。回到后台再点一次 Add System 完成添加,状态变绿就说明通了。
从 0.12.0 起还可以用 universal token(在 /settings/tokens 里管理),不必预先在 agent 侧配好 KEY/TOKEN 就能连 hub,多机部署时省一步替换。
被监控机器不在同一台宿主上时,按文档的二进制方式装 agent,脚本目前只支持 Linux:下载对应架构的二进制、创建 beszel 用户、启动 agent、写一个 systemd 服务做开机自启,可选开启每日自动更新。
告警与通知
文档列出的通知渠道包括 Telegram、Slack、Discord、Gotify、ntfy、Bark、企业微信 WeCom、钉钉/Lark、MQTT,以及 OpsGenie、PagerDuty 一类值班平台。
配置思路是先在通知渠道里填好凭据,再为具体指标设阈值或状态变化触发;S.M.A.R.T. 故障、容器状态变化这类事件走同一套通知。各渠道的具体字段与入口见文档对应页面。
取舍与几个坑
network_mode: host 的影响:agent 和同宿主的其他容器共享端口与网络命名空间,端口冲突会直接起不来;也意味着 agent 看到的网络指标就是宿主网络,不经过 Docker 的 NAT。如果改成 bridge 模式,socket 路径与 HUB_URL 都要相应调整,本机场景下不建议改。
KEY/TOKEN 泄露:这两个值等价于 agent 的上报凭据。写进 compose 文件并提交到版本库、或者贴进聊天记录,等于允许别人冒充你的 agent 向 hub 推数据。多机部署时每台机器的凭据要分开。
外网暴露:8090 不要直接开到公网。前置反向代理加 TLS,并在代理层或应用层加鉴权,APP_URL 同步改成外部地址。hub 自身有账号体系,但这不构成把它裸奔到公网的理由。
S.M.A.R.T. 需要权限:读磁盘健康信息通常需要 root 或额外能力(把设备节点挂进容器、加相应 capabilities 之类),容器默认权限下拿不到数据,界面上会表现为该项为空。这一条依发行版和容器运行时差异较大,我没有在多种环境逐一验证。
轻量监控的边界:Beszel 适合单机到小规模机器群的看板与告警,装完就能看,指标是预置的。需要自定义指标、长期保留、跨维度聚合查询或复杂告警规则时,还是 Prometheus + Grafana 那一套更合适。两者不冲突,可以在同一批机器上并行跑。
仓库地址:https://github.com/henrygd/beszel 文档:https://beszel.dev 社区 Matrix 房间:#beszel:matrix.org