NovaScale
NovaScale 菜单

在 NovaScale 中用普通 SSH 用户监控 Docker Stats

配置一个非 root SSH 用户,让 NovaScale 可以通过 SSH 读取 Docker 容器状态,而不需要把 Docker daemon 暴露到公网。

NovaScale 的 Docker 监控在网络侧尽量保持简单:先通过 SSH 连接到主机,然后在主机上运行 Docker CLI 命令。你不需要把 Docker daemon 暴露到 TCP 端口,也不需要为了手机监控额外发布一个公网 API。

SSH 用户需要具备的能力很明确:它必须能在主机本地运行 Docker 命令,例如:

docker ps
docker stats --no-stream

本文说明如何为这个工作流准备一个普通 SSH 用户,也包含 Synology DSM 的处理方式。Synology 部分参考了 Nataraj Basappa 的文章 Configuring Docker on Synology NAS (DSM 7.x)。同样需要注意 Docker 官方的 Linux post-installation guidance 中的安全模型:Docker socket 权限非常强,只应该给可信用户。

NovaScale 需要什么

NovaScale 的 Docker 监控需要一个可连接的 SSH 配置,以及一个能在远端运行 Docker CLI 且不会弹出交互式 sudo 提示的用户。

最低检查项如下:

  • 主机已经启用 SSH。
  • NovaScale 可以访问这台主机,最好通过你的 tailnet。
  • SSH 用户可以用密码或更推荐的 SSH key 登录。
  • 远端用户的 PATH 中可以找到 docker CLI。
  • 新开的 SSH 会话中,docker ps 和 docker stats --no-stream 可以正常运行。

如果你还会在 NovaScale 中使用容器启动、停止、重启等生命周期操作,要记住这些不是只读操作。能控制 Docker 的用户通常也能获得主机上的很高权限,所以不要把 Docker group 权限理解成狭义的监控权限。

安全说明

常见 Linux 做法是把用户加入 docker group。它很方便,但不是只读权限。Docker 官方文档把这个 group 视为接近 root 的权限,因为 Docker daemon 本身以高权限运行,而 Unix socket 可以控制这个 daemon。

我的建议是:

  • 为 NovaScale 创建一个专用 SSH 用户,不要复用日常管理员账号。
  • 尽量使用 SSH key 登录。
  • 让主机只通过 Tailscale 或其他私有网络路径访问。
  • 不要为了移动端监控去开放 Docker TCP API。
  • 只把 Docker 权限授予你愿意信任其拥有主机管理能力的账号。

这样 NovaScale 使用的仍然是普通登录用户。只是需要明确:Docker 本身并不是只读接口。

标准 Linux 设置

在通过系统包安装 Docker Engine 的普通 Linux 服务器上,Docker socket 通常属于 root:docker。先创建或选择一个 SSH 用户:

sudo adduser novascale

确认 docker group 存在,并把用户加入这个 group:

sudo groupadd docker 2>/dev/null || true
sudo usermod -aG docker novascale

检查 Docker socket:

ls -l /var/run/docker.sock

常见结果应类似:

srw-rw---- 1 root docker 0 Jul  2 10:00 /var/run/docker.sock

如果 group 不是 docker,可以修正 socket 的 group:

sudo chgrp docker /var/run/docker.sock
sudo chmod 660 /var/run/docker.sock

然后用 NovaScale 用户重新打开一个 SSH 会话。group membership 会在登录时重新计算,所以旧会话可能仍然失败:

ssh novascale@your-host
id
docker ps
docker stats --no-stream

如果这些命令不需要 sudo 就能运行,这台主机已经可以用于 NovaScale Docker 监控。

Synology DSM 设置

Synology 的情况稍有不同,因为 Docker 或 Container Manager 是 DSM 打包管理的,Docker socket 可能属于 root:root。前面提到的 DSM 7.x 文章指出了关键点:非 root 用户想通过命令行访问 Docker,最终取决于 /var/run/docker.sock 的所有权。

在 DSM 7.2 及更新版本中,套件通常叫 Container Manager。在较早的 DSM 7.x 中,它可能仍然叫 Docker。原理相同。

先完成一次 DSM 侧设置:

  1. 在 Package Center 中安装 Container Manager 或 Docker。
  2. 在 Control Panel > Terminal & SNMP 中启用 SSH。
  3. 创建一个普通 DSM 用户,例如 novascale。
  4. 除非你有其他用途,否则不要把这个用户设为 DSM 管理员。

然后用管理员账号 SSH 到 Synology,检查 socket:

ls -l /var/run/docker.sock

如果看到的是 root root,创建 Docker group,把 socket 移到这个 group,并把 NovaScale 用户加入 group:

sudo synogroup --add docker 2>/dev/null || true
sudo chown root:docker /var/run/docker.sock
sudo chmod 660 /var/run/docker.sock
sudo synogroup --member docker novascale

如果你的 docker group 里已经有其他用户,执行后建议在 DSM UI 中再检查一次 group 成员。Synology 上更稳妥的做法是先用命令创建 group,再在 DSM UI 中确认最终成员。

现在用普通用户重新打开 SSH 会话:

ssh novascale@your-synology
id
docker ps
docker stats --no-stream

如果 docker stats 可以运行,NovaScale 就可以使用同一个 SSH 配置进行 Docker 监控。

一个实际的 DSM 细节:套件重启或 DSM 升级可能会重新创建 /var/run/docker.sock,并恢复原来的 group。如果监控突然开始报 socket 权限错误,先重新检查 socket 所有权,再重新执行 chown root:docker。如果你的 NAS 每次重启后都会这样,可以创建一个 DSM scheduled task,在开机后执行这一步修正。

配置 NovaScale

主机侧命令测试通过后,在 NovaScale 中配置:

  1. 添加或编辑 SSH 主机。
  2. 使用普通用户,例如 novascale。
  3. 优先使用 SSH key 认证。
  4. 主机地址使用 MagicDNS 名称、tailnet IP 或私有 LAN 地址。
  5. 打开该主机的监控页面,并启用 Docker 监控。

想从 NovaScale 终端中快速手动验证,可以连接同一台主机后运行:

docker stats --no-stream --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}\t{{.NetIO}}\t{{.BlockIO}}\t{{.PIDs}}"

这个命令会返回适合在手机上阅读的紧凑快照。NovaScale 的监控视图会把同类数据整理成卡片和可刷新的主机状态。

Docker 官方的 docker container stats CLI reference 记录了 docker stats 可用的列和格式化字段。

排错

如果看到 permission denied while trying to connect to the Docker daemon socket,说明 SSH 用户仍然无法访问 /var/run/docker.sock。请从新开的 SSH 会话中检查 id、groups 和 ls -l /var/run/docker.sock。

如果看到 docker: command not found,可能是 Docker 未安装,或者非交互式 SSH 环境中的 PATH 找不到 Docker CLI。可以用 which docker 测试;如果平台把 Docker 放在不常见的位置,必要时使用完整路径。

如果 Synology 设置后可以工作,但过一段时间又失败,通常是 DSM 在套件重启或系统更新时重新创建了 socket。重新检查 socket group,并重新应用 group ownership 修改。

如果在 LAN 内 SSH 正常,但 NovaScale 连接失败,单独检查网络路径。对于 tailnet 主机,确认 MagicDNS 或 tailnet IP 正确,并确认主机在 Tailscale 中在线。

最终建议

用 SSH 做传输,让 Docker 继续留在主机本地,只把 Docker 权限授予一个你信任的专用账号。

这样 NovaScale 就可以在 iPhone 或 iPad 上显示容器 CPU、内存、网络、block I/O 和进程数,而不需要把 Docker daemon 变成一个远程暴露的服务。