mem_limit · healthcheck 與 start_period · restart 退避 · json-file 輪替與磁碟巡檢
在 VPS 24/7 跑 OpenClaw 的團隊常被三類問題打穿:Gateway 首輪冷啟動被過短的 healthcheck 判死、mem_limit 低於 WASM 尖峰觸發 Exit 137、以及預設 json-file 日誌寫滿宿主磁碟。本文給出開發 compose 與生產 compose 的最小差異集、六步可復現基線與抖動重啟的人工介入條件,並與Exit 137 與 allowedOrigins 排障長文、鏡像釘扎與回滾互鏈閱讀。
開發機上的 compose 往往關閉資源上限、縮短健康檢查視窗、並把日誌打到主控台;這些設定在長期無人值守場景會疊加成重啟風暴:容器在 Gateway 尚未就緒時被判定 unhealthy,restart: always 以秒級頻率拉起,日誌檔在退避前就把 inode 或磁碟配額打滿。
與純應用容器不同,OpenClaw 的首輪編譯與模型載入會抬高 RSS 尖峰;若你只按穩定運行後的均值設 mem_limit,會在凌晨被 OOM killer 靜默處決。本文刻意把可觀測訊號寫進基線:每條參數都能在工單裡對應到 docker inspect 或宿主指標。
start_period 過短:健康探針在 Gateway 監聽 18789 之前就失敗,面板顯示一直重啟。
mem_limit 與尖峰脫節:首輪 WASM 或依賴安裝尖峰超過 cgroup 上限,退出碼 137 卻無明確應用日誌。
json-file 預設無限增長:通道回呼與模型偵錯日誌在高流量 PR 驗證期把根分割區寫成唯讀。
restart 無退避:設定錯誤與健康誤判疊加,形成 CPU 與 IO 雙重飢餓。
開發卷掛載進生產:熱重載目錄與寬鬆權限把金鑰面暴露在備份腳本之外。
下列對照以同一倉庫兩份 override為前提:docker-compose.yml 保留通用服務定義,docker-compose.prod.yml 僅追加生產差異,避免複製貼上漂移。
| 維度 | 開發預設 | 生產基線建議 |
|---|---|---|
| 記憶體 | 不設上限或僅宿主物理上限 | 顯式 mem_limit,並預留首輪尖峰餘量;與 Exit 137 文交叉覆核 |
| 健康檢查 | 短 interval、無 start_period | start_period 覆蓋冷啟動;retries 與 timeout 與 SLA 對齊 |
| 重啟 | unless-stopped 或無 | on-failure 或帶上限的 always,並配宿主級告警 |
| 日誌驅動 | json-file 預設或 local | max-size + max-file;禁止依賴手工 truncate |
| 卷與金鑰 | 綁定掛載原始碼目錄 | 唯讀掛載設定;金鑰來自 env_file 或 secret,不進鏡像層 |
生產 compose 的差異應能逐條在 Grafana 或工單系統裡找到對應指標,否則只是願望清單。
以下步驟假設鏡像已按釘扎策略固定標籤;若仍使用 :latest,請先在 staging 實例完成一次完整冷啟動取樣再遷移到生產 override。
取樣尖峰:在 staging 跑 docker stats --no-stream 與容器內 ps,記錄 Gateway 首次 Ready 前後 10 分鐘的 RSS 尖峰。
寫入 mem_limit:將尖峰乘以約定安全係數寫入 compose;同時在宿主保留 swap 策略說明,避免 silent OOM。
定義就緒探針:使用與 Gateway 監聽同環回位址的 HTTP 或 CMD,避免探針走公網鏈路。
設定 start_period:覆蓋首輪依賴安裝與 WASM 編譯視窗;數值應大於 p95 冷啟動時長而非均值。
收緊 json-file:為每個服務宣告 logging 塊並設 max-size 與 max-file;在磁碟巡檢腳本中校驗日誌目錄增長率。
演練重啟:人為注入一次失敗探針,確認重啟間隔、退避與告警路由符合值班手冊。
services:
openclaw:
mem_limit: "2g"
logging:
driver: json-file
options:
max-size: "20m"
max-file: "5"
healthcheck:
test: ["CMD", "curl", "-f", "http://127.0.0.1:18789/health"]
interval: 30s
timeout: 5s
retries: 5
start_period: 180s
restart: on-failure:5
提示:具體健康路徑以你鏡像內實際路由為準;若僅 TCP 監聽可用,可改用 CMD-SHELL 與 nc 探測,但要在工單中寫明與 HTTP 探針的差異與誤報面。
當 docker events 顯示同一服務在 5 分鐘內重啟超過值班手冊閾值,應優先懷疑設定錯誤與健康誤判而非單純記憶體不夠。此時繼續依賴自動重啟只會放大日誌寫放大效應。
若根分割區已進入唯讀模式,先切流量或停反代,再按Exit 137 長文中的順序釋放空間;切勿在未確認磁碟健康時強行 compose up -d 覆蓋資料卷。
注意:降低 max-file 會加快舊日誌輪轉丟失速度;若合規要求保留更久,應同步把冷日誌推到物件儲存或獨立日誌宿主,而不是無限增大單檔。
凍結發布:連續重啟超過閾值時先停用自動部署流水線入口。
抓取現場:匯出 inspect 中 Health 與 OOM 相關段落與最近 200 行日誌。
回滾設定:恢復到上一版 compose override 並保留復現包供覆盤。
下列數值為立案與值班手冊起點,須用你們真實冷啟動直方圖與磁碟增長率替換;不得直接宣稱為對客 SLA。
當同一 VPS 還承擔反代或小型資料庫時,mem_limit 與日誌 IO 會與鄰居爭用;評審時應要求負責人同時給出容器 RSS、宿主可用記憶體與磁碟寫延遲三條曲線。
| 宿主規格訊號 | 日誌策略起點 | 與鏡像釘扎關係 |
|---|---|---|
| 2 vCPU / 4 GB | 更小 max-size、更短保留、更積極外發 | 必須釘 digest 避免隱性升級拉長冷啟動 |
| 4 vCPU / 8 GB | 可適度放寬 max-file,仍禁止關閉輪轉 | staging 與 prod 使用不同 tag 但同源 digest 驗證 |
| 混合負載 | 獨立資料碟或單獨日誌卷,避免與資料庫同分割區 | 升級視窗與回滾腳本與釘扎文對齊 |
把 OpenClaw 綁在臨時低配實例上,會在記憶體、磁碟與金鑰輪換三方面同時欠帳;自建裸金屬又被電力與線路 SLA 綁架。
對需要合約化算力、可選區域與可覆核頻寬、又要讓 Gateway 與通道在 24/7 場景保持可觀測的團隊,VpsMesh 的 Mac Mini 雲端租賃通常是更優解:可把 Compose 基線與反代、備份策略放在同一容量故事裡驗收。
核對探針執行使用者與 PATH、以及 start_period 是否涵蓋冷啟動;仍異常時對照allowedOrigins 與反代長文檢查是否走了錯誤環回位址。
先看宿主 dmesg 與容器退出碼,再回到尖峰取樣調整 limit;詳細步驟見Exit 137 排障文。選型可參考價格頁。
會縮短本地熱日誌視窗,需要更長留存時應外發集中儲存或物件儲存;維運政策見說明中心。