跳转到内容
全部开发指南

Beszel 轻量服务器监控教程,Docker 部署、容器监控与告警配置

AIGoCode发布于 更新于

手上的机器一多,查看状态就成了体力活。两台 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 原文配图 1

Beszel 的架构:一个面板加多个 agent

hub:负责展示

hub 基于 PocketBase 构建,一个二进制文件或一个容器就能运行,数据存放在内置的 SQLite 中,不需要另装数据库。用户管理、权限、OAuth 登录和自动备份到 S3 都已内置。

agent:负责采集

每台机器运行一个 agent,定时把指标发给 hub。agent 本身不保存历史数据,也没有界面,所以体积可以做得很小。

两种连接方式

hub 和 agent 之间有两种连接方式,按网络环境选择:

方式连接方向安全机制适用场景
SSH 模式hub 主动连接 agenthub 首次启动生成 ED25519 密钥,agent 只认这把密钥;agent 端的 SSH 服务不分配终端、不接收输入,即使私钥泄露也无法在机器上执行命令hub 在内网、agent 不便反向连接
WebSocket 模式agent 主动连接 hubagent 携带 token 发起连接,hub 先签名证明身份,agent 再提交与本机绑定的指纹,双向验证后才传数据机器在 NAT 后面、没有公网 IP,agent 端不需要开放任何端口

Beszel 原文配图 2

Docker 容器监控:每个容器的资源占用

agent 只要挂载 docker.sock,就会自动记录机器上所有容器的 CPU、内存和网络用量,也支持 Podman。

系统页面中有 Docker CPU 和 Docker 内存两张堆叠图。鼠标悬停时,会按占用大小列出该时间点每个容器的用量。自建服务多了以后,这个功能很实用:半夜内存突然升高,不用再逐个执行 docker stats,图上哪一层突然变厚就是哪个容器。

近几个版本在容器方面补充了不少功能:

  • 容器健康检查失败时发送通知,并附带一段日志;
  • 容器镜像有新版本时在面板上标出;
  • 不跑 Docker 的服务也能监控,systemd 服务挂掉会告警,最新版本还能在面板中直接查看服务日志。

宿主机层面可以采集温度、风扇、GPU 占用和功耗、S.M.A.R.T. 硬盘健康状态以及 ZFS 存储池。硬盘出现异常迹象时会提前告警,对跑 NAS 的用户比较有用。

Beszel 原文配图 3

历史数据保留与告警配置

采样精度与数据压缩

Beszel 默认每分钟记录一个数据点。和 Netdata 的每秒采集相比精度低不少,但用来看趋势、查昨晚几点开始出问题已经足够。

数据按时间自动压缩:最近一小时保留每分钟一个点,更早的数据依次合并为 10 分钟、20 分钟、2 小时、8 小时的平均值,最多保留 30 天。数据库因此一直保持很小,也不用手动清理。

告警规则

CPU、内存、磁盘、带宽、温度、负载都可以设置阈值,机器离线也会通知。通知渠道覆盖 Telegram、Discord、Slack、ntfy、Gotify、邮件、Webhook,以及国内常用的飞书、企业微信和 Bark 等。

网络监控

新增的网络监控可以在面板中添加目标,让每台 agent 从自身位置 ping 网关、测试 DNS 或请求网站,支持 ICMP、TCP、HTTP、DNS 四种方式,丢包超过阈值就告警。HTTPS 目标还会顺带检查证书到期时间,避免等网站打不开才发现证书没续期。

Beszel 原文配图 4

安装 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 怎么选

对比项BeszelNetdata
资源占用agent 很小,可随手装在每台机器上默认配置占用一百多 MB 内存
采样精度每分钟一个点每秒采集
指标范围常用指标:CPU、内存、磁盘、网络、容器、硬件健康数千个指标,带异常检测
适合用途日常看全局、告警排查疑难问题

两者并不冲突:大部分机器用 Beszel 看全局,重要的那一台再单独装 Netdata。

Beszel 的短板是没有 PromQL 这类查询语言,也不能自己拼装仪表盘,展示哪些内容基本由作者决定。需要的指标它不采集,就只能等后续更新。

总结

如果手上有几台 VPS、一台 NAS 或者一屋子 homelab,又不想为了监控再维护一套 Prometheus,Beszel 值得花十分钟装上:hub 一个容器,agent 一条命令,面板上的图正好是平时最常看的那些。

参考链接