linger · XDG_RUNTIME_DIR · Daemon 安裝驗證 · 分層排障 · API 區域與出口撥測
平台工程師、SRE 與自建 Agent 維護者在 2026 年把 OpenClaw 放到 Linux VPS 上時,最常見的失敗模式不是「命令敲錯一次」,而是SSH 一斷使用者層級 systemd 就停、XDG_RUNTIME_DIR 不在非互動環境裡、Gateway 與 Channel 與模型設定混在同一行日誌裡猜,再加上主控台裡選的 API 區域與機器實際出口不一致導致鑑權或路由看起來「隨機壞」。本文先拆五條上線前隱性成本,再給裸機 systemd 對照容器內 systemd 與純 Docker表,隨後給出六步可重現安裝與驗證 Runbook,整理常駐清單與三條可引用技術事實,用決策矩陣收斂選型;裝機與 Gateway 基線請交叉閱讀 安裝與 doctor 排障清單,Compose 常駐語意請對照 Docker Compose 生產基準;下單路徑見 訂購頁。
Linux VPS 上跑 OpenClaw,本質是把長期行程、通訊端目錄、日誌與重啟語意從個人習慣遷移成可稽核單元。下面五條在真實工單裡幾乎總是成組出現,它們共同指向同一句結論:先把 loginctl linger 與 XDG_RUNTIME_DIR 寫進驗收表,再討論要不要 Docker。
工作階段綁定:未啟用 linger 時,互動式 SSH 工作階段結束可能帶走 systemd 使用者管理器,導致單元在夜裡靜默退出;排障日誌裡常只剩「昨天還能用」。
執行時目錄缺失:用 cron、最小化 shell 或錯誤 service 類型啟動時,XDG_RUNTIME_DIR 為空會導致通訊端與狀態目錄建立失敗,錯誤訊息分散在應用程式與 systemd 兩側。
分層排障被跳過:把 Gateway 未監聽、Channel 憑證、模型路由與上游 HTTP 429 混讀成同一類「OpenClaw 壞了」,缺少按層取樣與對照命令輸出。
API 區域與出口漂移:供應商主控台或環境變數指向區域 A,而 VPS 實體出口經骨幹或對等互聯呈現區域 B 的提示標頭,症狀像間歇鑑權失敗而非穩定 403。
邊界混用:同一主機上既有 Docker 又有使用者層級單元,重啟順序與健康檢查口徑不一致,回滾時不知道停哪一層。
若你正在對比「宿主機 systemd 使用者服務」與「容器內 PID 1」,請把下一節表格當作評審投屏頁,而不是口號對比。
決策應先落在誰來提供重啟語意、日誌輪替與 linger 語意,以及通訊端與宿主機埠的邊界。沒有銀彈,只有與團隊技能棧匹配的維運邊界。
| 模型 | 典型適用 | 主要收益 | 主要代價 |
|---|---|---|---|
| 裸機 systemd(使用者層級) | 單 VPS、需要與宿主機防火牆與本機回環緊密協作 | 與發行版工具鏈一致、單元與 journal 對齊清晰 | 必須正確處理 linger 與登入工作階段邊界 |
| systemd-in-container | 映像內多行程監督與單元化 | 行程模型接近傳統 Linux 服務機 | 映像與特權邊界更敏感,排障要同時看容器內外 |
| Docker-only | Compose 或編排器已覆蓋健康檢查與重啟 | 交付物版本化與回滾路徑直觀 | 使用者層級 linger 與宿主機單元語意不再自動成立 |
可重現的驗收不是「我本地能跑」,而是斷開 SSH 後單元仍在、journal 裡原因可定位,以及區域與出口提示標頭可被同組命令重複擷取。
下面六步按「先讓使用者管理器在無人值守下存活,再確認執行時目錄,再裝單元,再做分層排障,最後做出口一致性撥測」排序;每一步都應有可保存的命令輸出。安裝與 Gateway 基線細節可回到 安裝與 doctor 清單。
確認部署使用者:固定執行使用者名稱與主群組,避免 root 與部署使用者混跑兩套單元;輸出物:id 與 loginctl user-status 片段。
啟用 linger:為部署使用者開啟 linger,使 user@ 在無活躍登入時仍可執行;輸出物:linger 欄位由 show-user 列印為 yes。
校驗 XDG_RUNTIME_DIR:在與 systemd 單元相同的環境 profile 中列印該變數,確認指向 /run/user/<uid> 形態路徑。
安裝並啟用單元:將 vendor 或發行版單元放入使用者層級目錄,執行 daemon-reload 與 enable --now;用 status 核對 Active 與主行程 pid。
分層取樣:先核對 Gateway 監聽與設定解析,再核對 Channel 憑證與 webhook 可達,最後核對模型上游配額與區域標頭;每層保留最近兩百行 journal 片段。
出口一致性撥測:對同一主機名稱執行解析與 TLS 交握觀察,保存變更前後輸出;不把單次往返時間寫成效能結論。
loginctl show-user "${USER}" -p Linger
sudo loginctl enable-linger "${USER}"
systemctl --user show-environment | grep XDG_RUNTIME_DIR || true
echo "${XDG_RUNTIME_DIR}"
systemctl --user daemon-reload
systemctl --user status openclaw-gateway.service --no-pager
journalctl --user -u openclaw-gateway.service -n 200 --no-pager
提示:將 openclaw-gateway.service 替換為你實際單元名;若映像使用不同閘道行程名,仍以單元檔中的 ExecStart 為準。
下列清單應能映射到責任人與複查週期。API 區域撥測只收集可重複的交握與回應中繼資料,不宣稱未測量的吞吐或延遲排名。
Linger 門禁:變更單裡必須附 show-user Linger=yes 輸出截圖或文字。
單元邊界:明確哪些埠由使用者單元監聽、哪些由容器發布,防火牆規則與文件同步更新。
日誌保留:journal 持久化或遠端轉送策略寫清,避免磁碟被偵錯日誌寫滿導致假死。
分層 Runbook:Gateway、Channel、Model 各層至少三條「通過即進入下一層」的檢查命令或 URL。
區域與出口快照:發布視窗前後各保存一份解析與回應標頭取樣,便於回滾對比。
loginctl enable-linger 作用於使用者層級 systemd 管理器存活邊界,與是否使用 Docker 無自動等價關係。/run/user/<uid>;在非登入環境缺失時,通訊端路徑會退化為不可寫或不可預測位置。注意:把「一次成功的 curl」當成區域證明會在 CDN 切換後失效;以可重複命令與固定主機名稱建立基線更重要。
當你能把 linger、單元名、埠矩陣與區域快照寫成版本化文件,Linux 常駐才算完成一半;另一半是與 Gateway 排障語言同一套責任模型。下列矩陣用於評審投屏。
| 團隊狀態 | 推薦預設 | 關鍵驗收訊號 | 常見誤區 |
|---|---|---|---|
| 單人維護 · 快速試錯 | Docker Compose 基線 | 健康檢查與重啟策略在 compose 檔可審 | 忽略 mem_limit 與日誌輪替導致假死 |
| 多租戶同機 | 容器邊界 + 獨立網路別名 | 每棧有獨立專案名與資料目錄 | 與使用者層級單元混用導致重啟競態 |
| 需要宿主機緊耦合 | 使用者層級 systemd + linger | 斷 SSH 後 journal 仍連續 | 未校驗 XDG_RUNTIME_DIR 在非互動路徑 |
長期只用互動式 bash、無 linger 的 nohup 或手寫迴圈守護,往往在變更與稽核階段一次性還清成本;上游區域策略調整時也更難證明「出口未漂移」。相較之下,獨佔、地區可選、網路檔位可預期的雲端 Mac 節點更容易把穩定雲出口與黃金映像沉澱成團隊資產,並與 iOS 建置或桌面接力同一套稽核欄位。
常見誤區:以為「進了 Docker 就不需要 systemd 語意」;在 Compose 之外仍用使用者層級單元託管閘道時,linger 與執行時目錄仍是硬門檻。
個人指令稿與無版本化環境匯出在交接、合規與回滾上很難寫入對外 SLA;當 OpenClaw 需要與上游區域策略、TLS 指紋與固定出口說明一併歸檔時,純 bash 替代路徑往往缺少可稽核變更單。對於要把 iOS 接力、CI 迴歸與自動化 Agent 一併納入驗收、並希望以訂購與地區檔位取代自建出口博弈的團隊,VpsMesh 的 Mac Mini 雲端租賃通常是較優解:獨佔節點便於固化 ACL 與主機名,主協作鏈路可貼近高頻往返,並與 團隊私網建置節點 Runbook 同一套語言描述維運;價格與地區組合見 價格頁,稽核欄位與連線邊界請以 說明中心 為準。
互動式工作階段結束後,systemd --user 可能停止,使用者層級 OpenClaw 單元隨之退出;上線前應核對 linger,並在 說明中心 對照官方連線與常駐說明,避免把「夜裡掛了」誤報為上游故障。
固定主機名稱與工具版本,保存 dig 或等價解析輸出,以及對同一端點執行 TLS 交握可見資訊;對比環境變數與主控台區域設定是否一致。需要 Compose 級健康檢查口徑時見 Docker Compose 生產基準。
當重啟、日誌輪替、資源上限與健康檢查全部由 Compose 或編排器宣告,且不需要宿主機使用者層級 socket 與 linger 語意時,Docker-only 往往更簡單;與 systemd 使用者層混用前請先完成第三節的分層驗收。