手上的机器一多,查看状态就成了体力活。两台 VPS、一台 NAS、家里还有一台跑 Docker 的小主机,哪台磁盘快满了、哪个容器在占用内存,只能挨个 SSH 上去执行 htop。
正经的监控方案通常是 Prometheus 加 Grafana,搭一套要小半天。Netdata 开箱即用,但它每秒采集、对每个指标做异常检测,默认配置会占用一百多 MB 内存,装在 1 GB 内存的小 VPS 上,监控本身就成了负担。
Beszel 走的是另一条路:只做最常看的几项指标,把体积压到最小。它用 Go 编写,分为 hub 和 agent 两部分。agent 的 Docker 镜像压缩后不到 5 MB,装在每台需要监控的机器上;hub 是一个网页面板,集中展示 CPU、内存、磁盘、网络和每个 Docker 容器的历史曲线,并提供告警。
这篇文章适合管理几台 VPS、NAS 或 homelab,又不想为监控单独维护一套 Prometheus 的开发者。下面依次介绍 Beszel 的架构、容器监控、历史数据与告警、安装步骤,以及它和 Netdata 的取舍。

Beszel 的架构:一个面板加多个 agent
hub:负责展示
hub 基于 PocketBase 构建,一个二进制文件或一个容器就能运行,数据存放在内置的 SQLite 中,不需要另装数据库。用户管理、权限、OAuth 登录和自动备份到 S3 都已内置。
agent:负责采集
每台机器运行一个 agent,定时把指标发给 hub。agent 本身不保存历史数据,也没有界面,所以体积可以做得很小。
两种连接方式
hub 和 agent 之间有两种连接方式,按网络环境选择:
| 方式 | 连接方向 | 安全机制 | 适用场景 |
|---|---|---|---|
| SSH 模式 | hub 主动连接 agent | hub 首次启动生成 ED25519 密钥,agent 只认这把密钥;agent 端的 SSH 服务不分配终端、不接收输入,即使私钥泄露也无法在机器上执行命令 | hub 在内网、agent 不便反向连接 |
| WebSocket 模式 | agent 主动连接 hub | agent 携带 token 发起连接,hub 先签名证明身份,agent 再提交与本机绑定的指纹,双向验证后才传数据 | 机器在 NAT 后面、没有公网 IP,agent 端不需要开放任何端口 |

Docker 容器监控:每个容器的资源占用
agent 只要挂载 docker.sock,就会自动记录机器上所有容器的 CPU、内存和网络用量,也支持 Podman。
系统页面中有 Docker CPU 和 Docker 内存两张堆叠图。鼠标悬停时,会按占用大小列出该时间点每个容器的用量。自建服务多了以后,这个功能很实用:半夜内存突然升高,不用再逐个执行 docker stats,图上哪一层突然变厚就是哪个容器。
近几个版本在容器方面补充了不少功能:
- 容器健康检查失败时发送通知,并附带一段日志;
- 容器镜像有新版本时在面板上标出;
- 不跑 Docker 的服务也能监控,systemd 服务挂掉会告警,最新版本还能在面板中直接查看服务日志。
宿主机层面可以采集温度、风扇、GPU 占用和功耗、S.M.A.R.T. 硬盘健康状态以及 ZFS 存储池。硬盘出现异常迹象时会提前告警,对跑 NAS 的用户比较有用。

历史数据保留与告警配置
采样精度与数据压缩
Beszel 默认每分钟记录一个数据点。和 Netdata 的每秒采集相比精度低不少,但用来看趋势、查昨晚几点开始出问题已经足够。
数据按时间自动压缩:最近一小时保留每分钟一个点,更早的数据依次合并为 10 分钟、20 分钟、2 小时、8 小时的平均值,最多保留 30 天。数据库因此一直保持很小,也不用手动清理。
告警规则
CPU、内存、磁盘、带宽、温度、负载都可以设置阈值,机器离线也会通知。通知渠道覆盖 Telegram、Discord、Slack、ntfy、Gotify、邮件、Webhook,以及国内常用的飞书、企业微信和 Bark 等。
网络监控
新增的网络监控可以在面板中添加目标,让每台 agent 从自身位置 ping 网关、测试 DNS 或请求网站,支持 ICMP、TCP、HTTP、DNS 四种方式,丢包超过阈值就告警。HTTPS 目标还会顺带检查证书到期时间,避免等网站打不开才发现证书没续期。

安装 Beszel:hub 与 agent 部署步骤
1. 用 Docker Compose 启动 hub
新建 docker-compose.yml:
services:
beszel:
image: henrygd/beszel:latest
container_name: beszel
restart: unless-stopped
environment:
APP_URL: http://你的IP:8090
ports:
- 8090:8090
volumes:
- ./beszel_data:/beszel_data
docker compose up -d
APP_URL 填访问 hub 时使用的地址,可以是域名或公网 IP 加端口。启动后在浏览器打开 http://你的IP:8090,创建管理员账号。
2. 添加机器并安装 agent
点击右上角 Add System,填写机器名称和地址。弹窗会直接生成 agent 的 docker-compose.yml 和安装命令,已经带好公钥和 token,复制到要监控的机器上执行即可。
不使用 Docker 时,Linux 上可以用一条命令安装二进制版本,脚本会自动创建用户并注册为系统服务:
curl -sL https://get.beszel.dev -o /tmp/install-agent.sh && chmod +x /tmp/install-agent.sh && /tmp/install-agent.sh
国内机器访问 GitHub 较慢时,可以加 --china-mirrors 参数使用镜像。macOS 可用 Homebrew 安装,Windows 支持 WinGet 和 Scoop,Home Assistant 也有现成插件。
3. 用通用 token 批量接入
机器较多时,可以在设置中生成通用 token。新机器安装 agent 时带上它,agent 连接后会自动出现在面板中,不需要先在网页里逐台添加。
Beszel 和 Netdata 怎么选
| 对比项 | Beszel | Netdata |
|---|---|---|
| 资源占用 | agent 很小,可随手装在每台机器上 | 默认配置占用一百多 MB 内存 |
| 采样精度 | 每分钟一个点 | 每秒采集 |
| 指标范围 | 常用指标:CPU、内存、磁盘、网络、容器、硬件健康 | 数千个指标,带异常检测 |
| 适合用途 | 日常看全局、告警 | 排查疑难问题 |
两者并不冲突:大部分机器用 Beszel 看全局,重要的那一台再单独装 Netdata。
Beszel 的短板是没有 PromQL 这类查询语言,也不能自己拼装仪表盘,展示哪些内容基本由作者决定。需要的指标它不采集,就只能等后续更新。
总结
如果手上有几台 VPS、一台 NAS 或者一屋子 homelab,又不想为了监控再维护一套 Prometheus,Beszel 值得花十分钟装上:hub 一个容器,agent 一条命令,面板上的图正好是平时最常看的那些。