在 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中可以找到dockerCLI。 - 新開的 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 側設定:
- 在 Package Center 中安裝 Container Manager 或 Docker。
- 在 Control Panel > Terminal & SNMP 中啟用 SSH。
- 建立一個一般 DSM 使用者,例如
novascale。 - 除非你有其他用途,否則不要把這個使用者設為 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 中配置:
- 新增或編輯 SSH 主機。
- 使用一般使用者,例如
novascale。 - 優先使用 SSH key 認證。
- 主機位址使用 MagicDNS 名稱、tailnet IP 或私有 LAN 位址。
- 開啟該主機的監控頁面,並啟用 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 變成一個遠端暴露的服務。