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

Canonical: https://galaxnet.dev/zh-hans/nova/articles/docker-stats-ssh-normal-user/
Language: zh-Hans

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







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

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

```bash
docker ps
docker stats --no-stream
```

本文说明如何为这个工作流准备一个普通 SSH 用户，也包含 Synology DSM 的处理方式。Synology 部分参考了 Nataraj Basappa 的文章 [Configuring Docker on Synology NAS (DSM 7.x)](https://www.natarajmb.com/2022/01/docker-synology/)。同样需要注意 Docker 官方的 [Linux post-installation guidance](https://docs.docker.com/engine/install/linux-postinstall/) 中的安全模型：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 用户：

```bash
sudo adduser novascale
```

确认 `docker` group 存在，并把用户加入这个 group：

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

检查 Docker socket：

```bash
ls -l /var/run/docker.sock
```

常见结果应类似：

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

如果 group 不是 `docker`，可以修正 socket 的 group：

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

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

```bash
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：

```bash
ls -l /var/run/docker.sock
```

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

```bash
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 会话：

```bash
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 终端中快速手动验证，可以连接同一台主机后运行：

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

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

Docker 官方的 [`docker container stats` CLI reference](https://docs.docker.com/reference/cli/docker/container/stats/) 记录了 `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 变成一个远程暴露的服务。


