前言
当环境里只有一台服务器时,很多状态都可以靠"想起来就上去看一眼"解决。可一旦设备变成 NAS、VPS、虚拟机、Docker 主机同时存在,问题就开始变化:你关注的不再只是某一台机器有没有开机,而是哪些服务在持续吃资源、哪块磁盘正在接近上限、某个容器是不是连续几个小时都处在异常状态。
这类场景里,真正麻烦的往往不是"完全看不到数据",而是数据分散、检查被动、异常发现得太晚。比如一台主机当前 CPU 看起来正常,但磁盘空间已经连续几天下降;又或者某个 Docker 容器偶尔出现高内存占用,单次登录时未必能撞上,只有持续记录后才容易看出趋势。
Beszel 适合解决的就是这类基础监控问题:把多台主机和容器状态集中到一个界面,再把一部分"手动检查"变成"持续采集 + 条件告警"。本文会在 Ubuntu 22.04 环境中完成 Beszel Hub 部署,随后分别用 Docker、Linux 二进制和 Windows 方式接入 Agent,并实际配置 SMTP 告警。
至于 cpolar,它并不参与监控采集。只有当 Beszel Hub 位于内网、而你又确实需要从外部网络查看监控页面时,它才负责补上公网访问这一层。
所以这篇文章不把 Beszel + cpolar 当成一个"组合套装"来讲,而是按职责拆开:Beszel 负责看见状态,Agent 负责采集数据,cpolar 负责决定你从哪里能看到这些数据。
1 Beszel:把分散的服务器状态集中起来
1.1 Beszel简介
Beszel 是一套轻量级服务器监控平台,可以集中查看宿主机与 Docker 容器的运行指标。它把 CPU、内存、磁盘、网络、负载、温度以及容器资源使用情况放到统一界面中,并保留历史数据。
这里最值得关注的并不是"当前这一刻"的数字,而是变化过程。一台服务器现在 CPU 只有 20%,并不能说明过去几个小时没有出现峰值;磁盘今天还剩 30GB,也不代表日志增长速度正常。把这些数据连续记录下来,才能判断问题是偶发、持续,还是有明显周期。
从结构上看,Beszel 由 Hub 和 Agent 两部分组成:Hub 负责展示、管理和告警,Agent 负责在目标主机上采集数据。后面的部署也会一直围绕这两个角色展开。

1.2 Beszel的核心功能
如果从日常运维任务来理解,Beszel 的功能可以归为四类:看主机、看容器、看趋势、收告警。下面这些指标不是为了"图表更多",而是对应不同故障的判断入口。
- 轻量运行:Beszel 的监控端和 Agent 都适合长期驻留运行,比较适合 VPS、NAS、虚拟机这类不希望监控本身占用太多资源的环境。
- Docker容器监控:如果一台主机上同时跑着多个容器,只看宿主机总 CPU 或总内存往往不够。Beszel 可以继续下钻到具体容器,查看 CPU、内存、网络 I/O 等数据,用来判断到底是哪一个服务在消耗资源。
- 系统指标监控 :除容器外,还可以持续记录宿主机的主要运行指标,包括:
- CPU使用率:观察 CPU 负载变化。
- 内存使用率:查看物理内存和交换空间使用情况。
- 磁盘使用率与I/O:关注磁盘空间与读写变化。
- 网络使用率:记录网络流量情况。
- 负载平均值:用于观察系统一段时间内的整体繁忙程度。
- 温度监控:在硬件传感器可用时查看相关温度数据。
- GPU使用率/温度/功耗:在对应环境中查看 GPU 资源指标。
- 告警通知:可以根据 CPU、内存、磁盘、带宽、温度、负载平均值等指标设置阈值,并通过邮件、Webhook 等方式发送通知。监控真正从"看板"变成"运维工具",关键就在这一层:不需要一直盯着页面,指标越界时也能主动提醒。
Beszel 的定位并不是替代所有专业监控体系,而是让小规模服务器环境更快拥有状态展示、历史趋势和基础告警。
1.3 Beszel安装
下面先把 Beszel Hub 跑起来。这里选择 Docker 作为演示方式,原因不是"命令最少",而是后续升级、迁移和数据目录管理都比较清楚。Hub 正常以后,再逐步把不同系统的 Agent 接进来。
1.3.1 环境准备
本教程将在Ubuntu 22.04虚拟机上进行操作演示。在开始安装Beszel之前,请确保您的虚拟机环境满足以下条件:
-
操作系统:Ubuntu 22.04 LTS(本教程演示环境)
- 虚拟机配置建议:至少2GB内存、2核CPU、20GB磁盘空间
- 确保虚拟机网络连接正常,能够访问互联网
-
Docker环境:需要安装Docker
Docker安装步骤可以参考cpolar官网教程:Ubuntu使用Docker部署Nginx并结合内网穿透实现公网远程访问
-
端口配置:
- Beszel默认使用端口8090(Web界面)
- 确保虚拟机防火墙允许该端口访问
bash# 检查端口是否被占用 sudo ss -tlnp | grep :8090 # 如果启用了UFW防火墙,开放端口 sudo ufw allow 8090 #查看是否开放端口 sudo ufw status
-
系统要求:
- 内存:至少2GB(推荐4GB以获得更好的监控体验)
- CPU:至少2核心
- 磁盘空间:至少10GB可用空间用于存储监控数据
1.3.2 使用docker安装beszel
Beszel官网:https://beszel.dev/zh/
在Ubuntu上安装Beszel仅需一条命令即可安装,命令如下:
shell
# mkdir -p ./beszel_data :创建本地目录用于数据持久化,如果目录已存在不会报错
# docker run -d :以后台守护态启动容器
# --name beszel :指定容器名为 beszel,方便管理
# --restart=unless-stopped :容器自动重启,除非手动停止
# -v ./beszel_data:/beszel_data :挂载当前目录的 beszel_data 到容器内,实现数据持久化
# -p 8090:8090 :映射主机端口8090到容器端口8090,方便外部访问
# henrygd/beszel :使用的镜像名称
sudo mkdir -p ./beszel_data && sudo docker run -d --name beszel --restart=unless-stopped -v ./beszel_data:/beszel_data -p 8090:8090 henrygd/beszel

1.3.3 浏览器访问测试
如果您不知道本机的IP,可以使用如下命令查看:
shell
ip addr

获取到虚拟机的IP后,接下来咱们浏览器中访问测试一下:
shell
#您的虚拟机IP+8090 端口
http://192.168.184.132:8090

页面能够正常打开,说明 Beszel Hub 已经监听在 8090 端口。这里如果打不开,先不要急着继续后面的 Agent 配置,应优先检查端口占用、防火墙和容器运行状态。
1.3.4 beszel登录
首次访问会需要让您设置一个管理员账号进行创建(点击创建后会自动进行登录):

创建管理员账户后即可进入 Beszel 首页。此时只是"管理端已经可用",还没有任何被监控主机,真正的数据要等 Agent 接入以后才会出现。

1.4 Beszel配置
Hub 已经能打开,下一步才是把需要监控的服务器接进来。这里分别保留 Docker、Linux 二进制和 Windows 三种方式,可以根据目标主机本身的环境选择。
1.4.1 Docker方式添加客户端
点击首页的右上角的+添加 客户端`按钮:

接下来添加一台客户端(虚拟机/服务器),如下配置:

可以先暂时不用点击添加客户端按钮,将复制下来的docker run 命令到您要添加的服务器上执行:
shell
#参考如下:对应的配置按照复制下来的命令即可
docker run -d --name beszel-agent --network host --restart unless-stopped -v /var/run/docker.sock:/var/run/docker.sock:ro -v ./beszel_agent_data:/var/lib/beszel-agent -e KEY="ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIC2Ug9SXCey8SsYtf98m9gA1vBzF27XXXXXXXXXXXXX" -e LISTEN=45876 -e TOKEN="" -e HUB_URL="http://192.168.184.132:8090" henrygd/beszel-agent

然后需要开放一下45876端口,45876 是 beszel-agent 服务监听的端口号 ,这个端口是用来让 主控端(Hub)连接到 agent 的。
以CentOS7开放防火墙举例:
shell
# 永久开放 TCP 端口 45876
sudo firewall-cmd --permanent --add-port=45876/tcp
# 重新加载防火墙规则
sudo firewall-cmd --reload
# 可选:确认端口是否开放成功
sudo firewall-cmd --list-ports

接着点击添加客户端按钮,可以看到列表多了一条数据如下:

列表中出现目标服务器后,说明这台机器上的 Agent 已经能够向 Beszel 提供监控数据。对于本身就大量使用 Docker 的服务器,这种方式比较容易统一管理。
1.4.2 二进制方式添加客户端
1.4.2.1 二进制Linux方式添加客户端
并不是所有机器都适合再起一个 Docker 容器。对于只想放一个轻量 Agent 的 Linux 主机,可以直接使用二进制方式接入。
点击添加客户端按钮,tab页切换为二进制方式,如下配置:

接着把复制的Linux命令来到Ubuntu22.04这台服务器上执行:

接下来需要进行开放防火墙(前面开放的是另一台虚拟机CentOS,当前是Ubuntu):

然后点击添加客户端按钮,可以看到列表中又多了一条记录:

状态显示为绿色后,说明这台 Linux 主机已经通过二进制 Agent 接入。此时可以和前面的 Docker Agent 放在同一个 Hub 页面中统一查看。
1.4.2.2 二进制Windows方式添加客户端
如果环境里还有 Windows 设备,也不需要单独再找另一套监控平台。这里继续把 Windows 11 接入同一个 Beszel Hub,验证跨系统管理。
点击添加客户端按钮,然后如下操作:

接下来打开Powershell(管理员模式),打开方式:按windows键+X键,然后选择终端(管理员):

然后执行复制下来的windows 命令 :

如果出现同如上错误,请依次按照下面步骤进行复制windows命令:

然后执行刚才带token的windows命令:

回到浏览器后,可以看到这台 Windows 11 服务器已经出现在 Beszel 列表中。到这里,Docker 主机、Linux 主机和 Windows 主机已经能够放在同一个监控页面里查看:

1.4.3 查看服务器详细信息
多台主机都接入以后,首页解决的是"哪些机器在线",点进单台服务器后才进入"为什么这台机器现在变慢、资源去哪了"的细节判断。
选择一台服务器,点击进入:

这里可以继续查看 CPU、内存、磁盘、网络以及容器等图表。相比偶尔执行一次系统命令,图表真正有用的地方是能把变化过程保留下来,用于判断峰值、持续上涨或周期性波动:

2 cpolar:只解决"人在外面怎么看"
2.1 cpolar简介
前面的 Beszel 已经完成监控采集和多主机接入。如果运维人员始终在同一个局域网里,到这里其实已经可以正常使用。
问题通常出现在另一种场景:Beszel Hub 放在家里的 NAS、办公室服务器或实验室内网里,而你人在外面,只想临时看一眼昨晚的 CPU 峰值,或者确认某台机器是不是已经离线。这时缺少的不是监控能力,而是 Web 页面本身没有外部访问入口。
cpolar 在本文里只承担这一层:把本地 8090 Web 服务映射为公网地址。Beszel 的 Hub、Agent、监控数据和告警逻辑都不需要因此修改。

2.2 cpolar的工作原理
在这套部署中,可以把 cpolar 看成公网入口和本地 8090 端口之间的转发层。公网请求经由隧道到达 Beszel Hub,再由原路返回页面响应。
这也意味着两件事要分开判断:Beszel 能不能正常监控 ,和公网页面能不能打开不是同一个问题。即使公网入口异常,局域网内的 Hub 和 Agent 仍可能工作正常;反过来,公网地址能打开,也不代表某个 Agent 一定在线。
2.3 cpolar安装
以Linux(Ubuntu)为例,首先,我们需要先安装curl:
shell
sudo apt-get install curl
然后执行如下脚本(一键自动安装脚本):
shell
curl -L https://www.cpolar.com/static/downloads/install-release-cpolar.sh | sudo bash

安装脚本执行完成后,继续检查 cpolar 版本确认安装结果:
shell
cpolar version

2.4 配置cpolar系统服务
向系统添加及启动cpolar服务
shell
#添加cpolar服务
sudo systemctl enable cpolar
#启动cpolar服务
sudo systemctl start cpolar

查看服务状态
shell
sudo systemctl status cpolar

2.5 注册及登录cpolar Web管理界面
2.5.1 注册cpolar
访问cpolar官网,点击免费注册按钮,进行账号注册

注册页面:

2.5.2 放行9200端口(web页面端口)
在访问web页面前,需要先检查系统防火墙是否放行9200端口,避免访问不了
shell
sudo ufw status

这里的目标只是让管理页面可以访问。相比直接关闭防火墙,单独放行 9200 端口更容易控制访问范围,因此本文继续采用端口放行方式。
shell
#放行 9200 端口
sudo ufw allow 9200
#查看状态验证是否已放行
sudo ufw status

2.5.3 访问cpolar web ui管理界面
在访问之前,不确定ip地址可以通过ifconfig命令查看服务器ip
shell
ifconfig

确定好ip地址后,在浏览器中访问:
shell
http://<此处应为您的IP>:9200 #如:http://192.168.184.132:9200

使用前面注册的 cpolar 账号登录后即可进入管理页面。

2.6 配置Beszel隧道实现公网访问
现在 Beszel 本地端已经确认可用,cpolar 也已经运行,接下来才把两者连接起来:公网请求最终要落到 Beszel 的 8090 端口。
2.6.1 配置 HTTP 隧道绑定到8090端口
点击左侧菜单栏的隧道管理,展开进入隧道列表页面,页面下默认会有 2 个隧道:
- ssh隧道,指向22端口,tcp协议
- website隧道,指向8080端口,http协议(http协议默认会生成2个公网地址,一个是http,另一个https,免去配置ssl证书的繁琐步骤)

接着点击创建隧道菜单,进入到创建页面,如下图配置:

创建完成后,点击左侧菜单的状态菜单,接着点击在线隧道列表菜单按钮,可以看到有2个Beszel的隧道,一个为http协议,另一个为https协议

注意:每个用户创建的隧道显示的公网地址都不一样!
2.6.2 访问公网地址验证 Beszel是否可访问
在浏览器中访问创建Beszel隧道生成的公网地址(http和https皆可)
这里以https为例:

登录 Beszel 账号后能够进入首页,说明外部网络已经可以通过当前 HTTP 隧道访问 8090 服务。这里验证的是"远程可达",并没有改变原来的监控结构。

2.7 设置固定二级子域名(Pro用户)
2.7.1 保留二级子域名
如果只是临时从外网检查一次 Beszel,随机地址已经够用。只有准备长期使用这个远程入口时,地址变化才会开始带来维护成本,例如书签需要重做、固定管理入口需要重新记录。
因此这里继续配置二级子域名,目的是让长期访问入口更稳定、便于保存。
进入官网的预留页面:

列表中显示了一条已保留的二级子域名记录:
- 地区:显示为
China Top。 - 二级域名:显示为
beszel。
注:二级域名是唯一的,每个账号都不相同,请以自己设置的二级域名保留的为主
2.7.2 修改beszel隧道为子域名方式
进入侧边菜单栏的隧道管理>隧道列表,可以看到前面配置名为beszel-8090的隧道

点击编辑按钮进入编辑页面,修改域名类型为二级子域名,然后填写前面配置好的子域名,点击更新按钮:

2.7.3 访问子域名测试
来到状态菜单下的在线隧道列表可以看到隧道名称为beszel-8090的公网地址已经变更为二级子域名+固定域名主体及后缀的形式了:

这里以https协议做访问测试:

页面能够正常打开,说明固定二级子域名已经指向当前 Beszel 隧道。至此,监控数据的采集方式没有变化,只是外部访问入口从随机地址换成了固定入口。
3 Beszel配置Webhook与SMTP服务
监控页面能看见异常还不够。如果只有"你主动打开页面"才能发现问题,那么监控仍然偏被动。下面这一部分开始处理第二个核心能力:让异常主动找到你。
3.1 Webhook、SMTP与Shoutrrr
Beszel 监控到指标变化后,还需要一个通知出口,才能把"页面上的异常"转换成"主动提醒"。
Webhook 可以把事件发送到指定 HTTP 地址,适合继续接到聊天工具、自动化平台或自建通知服务。
SMTP 用于发送邮件。对于个人服务器或小团队环境,邮件仍然是一种容易验证、依赖较少的告警方式。
Shoutrrr 则提供多种通知渠道的统一配置能力。本文先用 SMTP 做一次完整验证:不是只把参数填进去,而是确认测试邮件和资源告警都能真正到达收件箱。
3.2 配置邮箱SMTP服务
本教程以网易邮箱作为 SMTP 演示示例。这里真正要验证的是"Beszel 触发通知 → SMTP 发送 → 收件箱收到"的完整链路,因此授权码是否正确、URL 是否填写正确、邮件是否真正送达,比单纯保存配置更重要。
首先需要登录网易邮箱获取SMTP配置信息:
登录网易账号进行设置SMTP,如图:

接下来点击开启POP3/SMTP服务,请一定记住授权码,该授权码只会显示一次,如果忘记复制,您可以选择重新生成一个即可:

点击确认后可以看到授权密码管理多出了一条信息:

将授权码保管好,待会需要用到!
3.3 配置Webhook地址
进入设置页面的通知菜单,配置Webhook地址:

使用Shoutrrr 来通过 SMTP 发送电子邮件通知。Email 服务的 URL 格式如下:
shell
#username 是 SMTP 登录用户名
#password 是对应的密码或授权码
#host 是 SMTP 服务器主机名
#port 是 SMTP 服务器端口(通常为 25、465、587 等)
#查询参数 from 表示发件人地址
#查询参数 to 表示收件人地址列表
smtp://username:password@host:port/?from=fromAddress&to=recipient1[,recipient2,...]
参考如下图:

配置完成后记得点击保存设置按钮,进行持久化。
接着打开收件人邮箱检查结果。能收到测试邮件,才说明 SMTP 通知链路已经真正可用:

3.4 测试Beszel的资源告警
测试邮件能收到,只能说明 SMTP 配置正确。下一步还要验证"资源达到告警条件以后,Beszel 是否真的会触发通知"。
点击想要进行设置警报的服务器右边的铃铛按钮:

点击后会弹出选择需要设置告警的服务器和需要告警的字段:

网页端的告警提示如下:

网页端出现告警以后,再检查邮箱。如果邮件也同步到达,就说明"指标触发 → Beszel 告警 → SMTP 投递"这条链路已经完整跑通:

4:钉钉与企业微信 Webhook 集成前瞻
邮件只是最容易验证的一条告警路径。真正放到团队环境里,很多人更希望异常直接出现在钉钉或企业微信,而不是等人去查邮箱。
问题在于,这类平台的 Webhook 往往要求特定 JSON 结构和安全校验,而通用通知工具不一定能直接适配。当前 Shoutrrr 在处理复杂嵌套 JSON 时仍有一定限制,所以这一部分更适合作为"扩展边界"来看:Beszel 已经能产生告警,但把告警送到不同平台,还取决于目标平台的消息格式。
4.1 现状与挑战
目前,Shoutrrr 虽然支持 Webhook 通知,但钉钉和企业微信这类需要嵌套 JSON 的消息结构并不能直接套用通用格式,因此通常还需要中间转换服务。
这也是一个很典型的监控落地问题:采集指标不难,真正难的是把告警送到团队正在使用的渠道里。 钉钉和企业微信还存在关键词等安全机制,所以即使 Beszel 已经能够触发事件,最终消息能否送达仍取决于后续格式转换和平台要求。原文所引用的 issue 讨论也表明,这部分仍处于持续改进中。

结语
如果只看安装步骤,这篇文章做了很多事:起 Beszel、接 Agent、开端口、配 cpolar、加 SMTP、测告警。但真正把这些步骤串起来以后,逻辑其实很清楚。
Beszel Hub 解决的是"多台机器的状态放在哪里看";Agent 解决的是"数据从哪里来";SMTP / Webhook 解决的是"异常发生后谁来提醒";cpolar 则只解决"人不在局域网时还能不能打开监控页面"。
这几层之间没有谁替代谁。比如没有公网访问,Beszel 在局域网里依然可以持续采集;没有 SMTP,监控页面仍然能看,只是异常需要主动检查;Agent 离线时,即使公网页面正常打开,对应主机也不会再产生有效监控数据。
对于 NAS、VPS、家庭服务器或小规模多机环境,这种分层结构反而更容易长期维护。设备增加时继续加 Agent,通知方式变化时只调整告警渠道,远程访问不需要时可以直接关闭公网入口。
真正值得保留的不是"搭出了一套监控面板",而是运维方式发生了变化:从逐台登录、临时检查,变成集中查看、持续记录和按条件提醒。等设备数量真正多起来时,这种变化才会越来越明显。