多台服务器不想上重型监控?用 Beszel 搭一套轻量主机与 Docker 看板
前言
手里只有一两台服务器时,我通常不会一上来就搭很重的监控体系。真正麻烦往往发生在机器慢慢变多以后:极空间上跑着 Docker,旁边还有 Linux 主机和 Windows 电脑,平时没事各自安静运行,一旦 CPU、内存、磁盘或者容器出了问题,又得一台台登录查看。对我来说,这种规模更需要的是一个轻量、能快速集中看状态的入口,而不是为了监控几台机器,先给自己增加一套更难维护的监控平台。尤其是家里和小团队环境,监控本身最好别变成新的运维负担;我更希望打开一个页面就能先判断哪台机器有异常,再决定要不要继续 SSH 进去排查。
这次我在极空间上用 Docker 部署 Beszel Hub,把 Web 端口映射到 8091;随后分别演示 Docker 方式的 beszel-agent 和 Windows PowerShell 安装方式,让不同主机接进同一个看板,再实际查看主机指标、Docker 容器、日志和设备详情。局域网链路跑通以后,再安装 cpolar,把 Beszel 的 8091 页面提供到公网,先验证随机地址,再配置固定二级子域名 beszel。我更关心的是 Hub、Agent 和公网入口三层能不能各自跑通,而不是看到一个漂亮首页就直接把"多服务器监控"算作完成。

1. Beszel 适合什么样的监控场景?
Beszel 的定位比较直接:
用一个 Hub 集中看多台主机,再通过 Agent 把各台机器的数据送回来。
当前功能入口里包括:
- CPU、内存、磁盘、网络等主机指标;
- Docker 容器统计;
- 历史数据;
- 告警;
- Web 管理界面;
- 多用户、OAuth、API 和自动备份等能力。
这次真正动手跑的是更基础也更关键的一条链:
极空间 Beszel Hub → Linux / Windows Agent → 主机与容器信息 → Web 看板。
我更喜欢先把这条最基本的监控链跑稳,再去考虑更多扩展。
2. 先通过 SSH 登录极空间
先在极空间中开启:
SSH 服务
然后使用 Windows PowerShell 或 Mac Terminal 连接:
shell
ssh root@IP
连接成功后继续后面的 Docker 操作。

如果极空间还没有开启 SSH,需要先把 SSH 这一层准备好。
3. 确认 Docker 环境
接着检查 Docker:
shell
docker -v
systemctl status -v

Beszel Hub 这次通过 Docker Compose 部署,所以在继续之前,至少先确认 Docker 环境已经可用。
4. 创建 Beszel 安装目录
创建目录并进入:
shell
sudo mkdir -p /docker/beszel
cd /docker/beszel

这次把 Hub 的 Compose 文件和持久化目录都集中放在:
/docker/beszel
下面。
5. 用 Docker Compose 部署 Beszel Hub
创建:
docker-compose.yml
内容如下:
shell
version: "3"
services:
beszel:
image: henrygd/beszel
container_name: beszel
restart: unless-stopped
ports:
- 8091:8090
volumes:
- ./beszel_data:/beszel_data
- ./beszel_socket:/beszel_socket
这里几个参数需要先看清:
- 镜像:
henrygd/beszel - 容器名:
beszel - 重启策略:
unless-stopped - 宿主机端口:
8091 - 容器端口:
8090 - 数据目录:
./beszel_data - Socket 目录:
./beszel_socket
然后启动:
shell
docker-compose up -d

部署完成以后,在浏览器访问:
http://极空间IP:8091

页面能正常打开以后,Hub 这一层就已经跑起来。
6. 第一次进入 Beszel,先注册管理账号
第一次打开 Beszel,需要先注册账户和密码。

完成注册以后进入主页。

到这里我只会确认:
Beszel Hub → 8091 → Web 页面
已经正常。
真正的监控数据还要等 Agent 接入以后才有意义。
7. 第一台主机:用 Docker 跑 beszel-agent
接下来开始添加被监控主机。
如果目标机器有 Docker,可以直接运行 Agent 容器:
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 AAAAC3NzaC1lZDI1NTE5AAAAIEVghS28S9ON4Ppffa2K2JgBiqSiSACPKk6GTYJwnfe/" -e LISTEN=45876 -e TOKEN="1380-d81b442ca4-2275-dfc4219154" -e HUB_URL="http://192.168.50.213:8091" henrygd/beszel-agent

Agent 启动以后,页面会继续显示需要添加的主机信息。

然后填写执行这条命令的主机 IP,再点击:
添加系统

回到首页刷新。

这时已经可以看到新加入的监控主机。
这一层真正形成的是:
被监控主机 Agent → Beszel Hub → Web 看板。
这里的 KEY、TOKEN、HUB_URL 和 45876 都属于 Agent 接入参数。实际增加其他主机时,应使用对应系统添加流程里生成或要求的参数,不要把一台机器的接入信息当成所有主机的固定模板。
8. 没有 Docker 的 Windows 主机也能接入
如果目标机器没有 Docker,也可以走二进制 / 服务方式。
这里演示的是 Windows PowerShell:
shell
& iwr -useb https://get.beszel.dev -OutFile "$env:TEMP\install-agent.ps1"; & Powershell -ExecutionPolicy Bypass -File "$env:TEMP\install-agent.ps1" -Key "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIEVghS28S9ON4Ppffa2K2JgBiqSiSACPKk6GTYJwnfe/" -Port 45876 -Token "1380-d81b442ca4-2275-dfc4219154" -Url "http://192.168.50.213:8091"

执行后继续完成 Agent 安装。

回到 Beszel,添加 Windows 主机信息。

添加完成以后,Windows 主机已经出现在页面里。

这一步说明 Beszel 的监控对象不必全部采用同一种 Agent 部署方式。
当前实际展示了两条:
Docker Agent → Linux / 服务器主机
以及:
PowerShell 安装 Agent → Windows 主机。
9. 主机接进来以后,实际能看到什么?
点击刚才添加的客户端,可以进入详细监控页面。

这里才是我真正关心的部分:
Agent 有没有持续把主机状态送回来。
如果只是系统名称出现在列表里,但后面的 CPU、内存、磁盘和网络信息没有正常变化,我不会把它当成接入成功。
10. Docker 容器信息也能集中查看
点击右上角的容器入口。

可以看到当前主机上 Docker 容器的详细信息。

对于极空间这种本身就会跑很多容器的设备,这一块很实用。
至少不必为了确认某个容器的状态,再单独切回 Docker 管理界面。
11. 日志和设备详情
Beszel 页面里还可以继续查看日志。

右上角还有更多设备操作入口。

展开以后可以看到更多设备信息。

界面语言也可以切换。

到这里,这次真正展示出来的功能已经比较明确:
多主机列表 → 单机指标 → Docker 容器 → 日志 → 更多设备信息。
至于功能说明里提到的告警、多用户、OAuth、API、自动备份等能力,这次没有继续逐项做完整验证,所以我不会把"页面支持"直接写成"全部已经跑通"。
12. 局域网监控够用以后,再解决远程查看
如果 Beszel 只在家里或者公司内网使用,直接访问:
http://极空间IP:8091
已经够了。
但监控最尴尬的场景往往恰恰是:
人不在服务器旁边的时候,才最想看服务器现在怎么样。
所以接下来再加入 cpolar。
cpolar 在这套方案里只负责:
把 Beszel Hub 的
8091Web 页面提供到公网。
它不采集 CPU、内存和磁盘数据,也不替 beszel-agent 上报。
所以职责可以拆成:
Agent 负责采集 → Beszel Hub 负责集中展示 → cpolar 负责远程 Web 入口。
13. 安装 cpolar
执行:
shell
sudo curl https://get.cpolar.sh | sh

安装完成以后查看服务状态:
shell
sudo systemctl status cpolar

服务正常后,在浏览器打开:
http://ip:9200
进入 cpolar Web UI。

登录以后开始配置 Beszel 隧道。
14. 给 Beszel 的 8091 创建随机公网地址
进入:
隧道管理 → 创建隧道
当前参数为:
- 隧道名称:
beszel - 协议:
http - 本地地址:
8091 - 域名类型:随机域名
- 地区:
China Top

创建完成以后打开在线隧道列表。

从其他电脑或者移动设备打开公网地址。

页面可以正常访问。
这一层验证的是:
Beszel Hub 8091 → cpolar HTTP 公网地址 → 外部浏览器。
至于 Agent 数据是否正常,仍然要回到 Beszel 自己的主机状态里确认。
15. 长期查看再换固定二级子域名
随机公网地址适合先测试。
如果以后准备把这个监控页面长期收藏,我更希望入口固定下来。
进入预留页面,选择:
保留二级子域名

这里使用:
- 地区:
china Top - 二级子域名:
beszel

然后回到:
隧道管理 → 隧道列表
找到需要修改的 Beszel 隧道。

把域名类型修改成:
二级子域名
并填写:
Sub Domain:前面保留成功的二级子域名- 地区:
China Top
点击更新。

更新以后进入在线隧道列表。

此时随机地址已经切换成固定二级子域名。
最后继续从浏览器访问。

页面能够正常打开。
到这里,Beszel 的固定公网 Web 入口就跑通了。
总结
Beszel 对我来说最合适的地方,不是去替代所有 Prometheus、Grafana 或 Zabbix 场景,而是在主机数量还不算特别多、又希望快速集中看状态的时候,把监控先搭得足够简单。
这次实际跑通的主线是:
极空间 → SSH → Docker → Beszel Hub → 8091:8090 → 注册管理账号 → Docker beszel-agent → Linux / 服务器主机 → Windows PowerShell Agent → 主机指标 → Docker 容器 → 日志 → cpolar → 随机公网 → 固定二级子域名 beszel。
几个边界需要一直分清:
- Hub 负责集中展示,Agent 负责被监控主机的数据采集;
- 当前 Docker Agent 使用
45876、KEY、TOKEN和HUB_URL完成接入; - Windows 示例使用 PowerShell 脚本安装 Agent;
- 这次真正展示了主机指标、Docker 容器、日志和设备信息,告警、多用户、OAuth、API、自动备份等功能没有逐项完整测试;
- Hub 容器实际是宿主机
8091映射到容器8090; - cpolar 只负责 Beszel
8091Web 页面的公网入口,不参与 Agent 数据采集; - 固定二级子域名
beszel解决的是远程入口变化问题,不会替代 Beszel 自己的账号和监控逻辑。
如果只是管理几台机器,我更愿意先把"谁在线、资源怎么样、容器有没有异常、日志能不能直接看到"这些基础问题解决。监控平台轻不轻,最后不是看安装包多小,而是日常使用时有没有让我少登录几次服务器、少开几个后台。