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