把Beszel Hub和agent放在同一台ECS上,可以集中查看主机CPU、内存历史和单个Docker容器的资源变化。关键连接不必绕公网:共享Unix socket承接同机连接,SSH隧道提供浏览器入口。本文给出完整配置,并用容器名称、采样数据与重建前后的历史完成一次使用验收。
这是按官方0.21.1资料整理的参考方案,尚未执行Docker部署或SSH操作。适用对象是常规Linux上的Docker Engine与Compose V2;LXC、rootless或Docker Desktop需另核宿主统计条件。
分清网页入口、采集入口与Docker入口
这份配置涉及三种不同连接:
| 连接 | 本文使用方式 | 用途 |
|---|---|---|
| 电脑到Hub | SSH隧道转发到服务器回环8090 | 登录和看历史 |
| Hub到同机agent | /beszel_socket/beszel.sock共享路径 |
取得采样数据 |
| agent到Docker | /var/run/docker.sock |
读取容器指标 |
Hub与agent所在网络不同,给Hub填localhost:45876会把请求送到Hub容器自身。官方同机方案使用Unix socket;agent保留host网络以取得宿主网络接口数据。本例agent也能通过宿主回环的HUB_URL向Hub建立WebSocket连接,socket路径仍按同机方案配置。

在新的项目目录写入完整配置
在ECS终端用有Docker权限的账号执行:
docker version
docker compose version
test -S /var/run/docker.sock && printf 'Docker socket exists\n'
docker compose ls -a
版本命令应正常返回,socket检查应显示Docker socket exists。若daemon不可连接、未见这行或已有beszel-local-demo项目,先处理运行方式或更换全新项目名;不要重置已有环境。
mkdir ~/beszel-local-demo && cd ~/beszel-local-demo && mkdir beszel_data beszel_socket beszel_agent_data
mkdir提示已存在时停止写入,先确认目录用途。接着将以下内容保存为compose.yaml:
name: beszel-local-demo
services:
hub:
image: docker.1ms.run/henrygd/beszel:0.21.1
restart: unless-stopped
ports:
- "127.0.0.1:8090:8090"
environment:
APP_URL: http://127.0.0.1:8090
CONTAINER_DETAILS: "false"
volumes:
- ./beszel_data:/beszel_data
- ./beszel_socket:/beszel_socket
agent:
image: docker.1ms.run/henrygd/beszel-agent:0.21.1
restart: unless-stopped
network_mode: host
environment:
LISTEN: /beszel_socket/beszel.sock
HUB_URL: http://127.0.0.1:8090
KEY: ${
BESZEL_KEY:-}
TOKEN: ${
BESZEL_TOKEN:-}
DOCKER_IMAGE_CHECK: "false"
volumes:
- ./beszel_agent_data:/var/lib/beszel-agent
- ./beszel_socket:/beszel_socket
- /var/run/docker.sock:/var/run/docker.sock:ro
两个固定镜像标签同为0.21.1,不使用浮动最新版。Hub的数据目录存历史和账号,agent目录保留自身数据;socket目录是通信入口。先关闭网页中的容器详情/日志功能和周期性镜像更新检查,本次只完成指标采集。直接挂载Docker socket需要可信管理员维护,:ro不等于对Docker API做了只读权限隔离。
在ECS原目录先拉取并单独启动Hub:
docker compose config --quiet && docker compose pull && docker compose up -d hub
docker compose ps -a
docker compose logs --tail=80 hub
首行任一步失败就停止,按报错处理网络、标签或配置;hub应保持运行。可以进一步在容器内检查网页服务:
docker compose exec hub /beszel health --url http://127.0.0.1:8090
成功退出只说明Hub健康接口可用;失败先查Hub日志。这个检查不证明agent已接通,也不证明已经收集到容器资源。
从电脑进入Hub,取得这次配对参数
在电脑终端运行,替换自己的SSH账号及ECS地址:
ssh -N -o ExitOnForwardFailure=yes -L 127.0.0.1:8090:127.0.0.1:8090 your_user@your_ecs
保留隧道窗口,在电脑浏览器访问http://127.0.0.1:8090,创建首个管理员账号。没有默认登录密码;若初次配置就出现旧账号登录页,先核对实例与挂载。隧道报端口占用或认证失败时先处理,安全组无需新增8090或45876公网入口。
登录后点击Add System,名称填ecs-local-01,Host / IP填/beszel_socket/beszel.sock。从对话框复制完整KEY与TOKEN,暂不关闭;需要时先显示隐藏的令牌。在ECS项目目录保存.env:
BESZEL_KEY='粘贴Add System提供的完整公钥'
BESZEL_TOKEN='粘贴Add System提供的令牌'
公钥类型、内容和空格完整保留,令牌按原值填入;两项都来自本次Hub,不使用SSH登录私钥。然后在ECS执行:
chmod 600 .env
docker compose config --quiet && docker compose up -d agent
docker compose logs --tail=80 agent
回到浏览器完成添加;系统行已存在则等待该行上线,不再建一条同名记录。上线后应开始积累CPU、内存数据点。若agent运行但系统离线,检查.env、公钥、令牌及共享socket路径,再看Hub与agent日志。配置修改后用docker compose up -d agent应用,单独restart不会把新环境变量写入已有容器。
用实际容器名找到对应曲线
在ECS执行:
docker ps --format 'table {
{.Names}}\t{
{.Status}}'
docker stats --no-stream --format 'table {
{.Name}}\t{
{.CPUPerc}}\t{
{.MemUsage}}'
在网页打开ecs-local-01,先查看主机CPU、内存历史,再在容器区按上面命令的名称查找一个运行容器。没有业务容器时直接选本次Hub。验收看名称对应、资源数据出现并继续更新,不要求两个不同时刻的百分比相等。
命令里没有目标容器,先确认它是否已停止或重建改名;命令有而网页无,先核agent日志中的Docker连接及挂载。内存值缺失或一直为0,先检查docker stats本身和cgroup统计条件,不把空白补写成0。宿主内存、容器内存和缓存的口径不同,也不据此推算业务剩余容量。
重建前后核对同一条历史
先记下系统名和当前图表时间范围,再在ECS原目录执行:
docker compose up -d --force-recreate
docker compose ps -a
docker compose logs --tail=80 hub agent
重新登录后应仍能找到ecs-local-01和重建前的历史,并看到新采样点。系统或历史消失时先核是否换了项目目录、beszel_data是否接回原目录;没有查清前不重新初始化。暂停用docker compose stop,恢复用docker compose up -d。保留这三个目录和.env,重建测试不替代备份。
需要提醒时,在Settings → Notifications先配置已有通知渠道并发送测试消息,再到系统表的告警入口设一项规则。可以从“内存超过80%持续5分钟”这个示例开始,根据实际基线调整。测试消息验证的是通道,规则是否触发仍需独立观察;本文没有发送通知或制造高负载。先取得连续、可信的主机与容器曲线,再决定哪些异常值得通知。