# 在 NovaScale 中用一般 SSH 使用者監控 Docker Stats

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

設定一個非 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 變成一個遠端暴露的服務。


