2026 年 OpenClaw Docker Compose 生產基線:記憶體上限、健康檢查、重啟策略與 json-file 日誌輪替可復現案例(VPS 24/7)

mem_limit · healthcheck 與 start_period · restart 退避 · json-file 輪替與磁碟巡檢

2026 OpenClaw Docker Compose 生產基線

VPS 24/7OpenClaw 的團隊常被三類問題打穿:Gateway 首輪冷啟動被過短的 healthcheck 判死、mem_limit 低於 WASM 尖峰觸發 Exit 137、以及預設 json-file 日誌寫滿宿主磁碟。本文給出開發 compose 與生產 compose 的最小差異集六步可復現基線抖動重啟的人工介入條件,並與Exit 137 與 allowedOrigins 排障長文鏡像釘扎與回滾互鏈閱讀。

01

為什麼「筆電上能跑」的 Compose 常在第三週開始誤殺自己

開發機上的 compose 往往關閉資源上限、縮短健康檢查視窗、並把日誌打到主控台;這些設定在長期無人值守場景會疊加成重啟風暴:容器在 Gateway 尚未就緒時被判定 unhealthy,restart: always 以秒級頻率拉起,日誌檔在退避前就把 inode 或磁碟配額打滿。

與純應用容器不同,OpenClaw 的首輪編譯與模型載入會抬高 RSS 尖峰;若你只按穩定運行後的均值設 mem_limit,會在凌晨被 OOM killer 靜默處決。本文刻意把可觀測訊號寫進基線:每條參數都能在工單裡對應到 docker inspect 或宿主指標。

  1. 01

    start_period 過短:健康探針在 Gateway 監聽 18789 之前就失敗,面板顯示一直重啟。

  2. 02

    mem_limit 與尖峰脫節:首輪 WASM 或依賴安裝尖峰超過 cgroup 上限,退出碼 137 卻無明確應用日誌。

  3. 03

    json-file 預設無限增長:通道回呼與模型偵錯日誌在高流量 PR 驗證期把根分割區寫成唯讀。

  4. 04

    restart 無退避:設定錯誤與健康誤判疊加,形成 CPU 與 IO 雙重飢餓。

  5. 05

    開發卷掛載進生產:熱重載目錄與寬鬆權限把金鑰面暴露在備份腳本之外。

02

開發 compose 與生產 compose:資源與日誌的最小差異對照表

下列對照以同一倉庫兩份 override為前提:docker-compose.yml 保留通用服務定義,docker-compose.prod.yml 僅追加生產差異,避免複製貼上漂移。

維度開發預設生產基線建議
記憶體不設上限或僅宿主物理上限顯式 mem_limit,並預留首輪尖峰餘量;與 Exit 137 文交叉覆核
健康檢查短 interval、無 start_periodstart_period 覆蓋冷啟動;retriestimeout 與 SLA 對齊
重啟unless-stopped 或無on-failure 或帶上限的 always,並配宿主級告警
日誌驅動json-file 預設或 localmax-size + max-file;禁止依賴手工 truncate
卷與金鑰綁定掛載原始碼目錄唯讀掛載設定;金鑰來自 env_file 或 secret,不進鏡像層

生產 compose 的差異應能逐條在 Grafana 或工單系統裡找到對應指標,否則只是願望清單。

03

六步基線:從 mem_limit 標定到健康探針對齊 Gateway 就緒

以下步驟假設鏡像已按釘扎策略固定標籤;若仍使用 :latest,請先在 staging 實例完成一次完整冷啟動取樣再遷移到生產 override。

  1. 01

    取樣尖峰:在 staging 跑 docker stats --no-stream 與容器內 ps,記錄 Gateway 首次 Ready 前後 10 分鐘的 RSS 尖峰。

  2. 02

    寫入 mem_limit:將尖峰乘以約定安全係數寫入 compose;同時在宿主保留 swap 策略說明,避免 silent OOM。

  3. 03

    定義就緒探針:使用與 Gateway 監聽同環回位址的 HTTP 或 CMD,避免探針走公網鏈路。

  4. 04

    設定 start_period:覆蓋首輪依賴安裝與 WASM 編譯視窗;數值應大於 p95 冷啟動時長而非均值。

  5. 05

    收緊 json-file:為每個服務宣告 logging 塊並設 max-sizemax-file;在磁碟巡檢腳本中校驗日誌目錄增長率。

  6. 06

    演練重啟:人為注入一次失敗探針,確認重啟間隔、退避與告警路由符合值班手冊。

yaml
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-SHELLnc 探測,但要在工單中寫明與 HTTP 探針的差異與誤報面。

04

restart 抖動與 json-file:何時必須人工停機

docker events 顯示同一服務在 5 分鐘內重啟超過值班手冊閾值,應優先懷疑設定錯誤與健康誤判而非單純記憶體不夠。此時繼續依賴自動重啟只會放大日誌寫放大效應。

若根分割區已進入唯讀模式,先切流量或停反代,再按Exit 137 長文中的順序釋放空間;切勿在未確認磁碟健康時強行 compose up -d 覆蓋資料卷。

注意:降低 max-file 會加快舊日誌輪轉丟失速度;若合規要求保留更久,應同步把冷日誌推到物件儲存或獨立日誌宿主,而不是無限增大單檔。

  1. A

    凍結發布:連續重啟超過閾值時先停用自動部署流水線入口。

  2. B

    抓取現場:匯出 inspect 中 Health 與 OOM 相關段落與最近 200 行日誌。

  3. C

    回滾設定:恢復到上一版 compose override 並保留復現包供覆盤。

05

可引用參數與容量評審起點

下列數值為立案與值班手冊起點,須用你們真實冷啟動直方圖與磁碟增長率替換;不得直接宣稱為對客 SLA。

當同一 VPS 還承擔反代或小型資料庫時,mem_limit 與日誌 IO 會與鄰居爭用;評審時應要求負責人同時給出容器 RSS、宿主可用記憶體與磁碟寫延遲三條曲線。

  • start_period 下限:應至少覆蓋一次完整冷啟動的 p95 時長;若連續兩週無逾時,才允許收緊並保留回滾視窗。
  • json-file 增長率:當單服務日誌日增量超過磁碟可接受預算的固定比例時,應拆分通道日誌級別或外發集中日誌。
  • 重啟頻率閾值:將「每 15 分鐘超過 N 次重啟」寫進告警與人工介入條款,避免自動化掩蓋設定缺陷。
宿主規格訊號日誌策略起點與鏡像釘扎關係
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 基線與反代、備份策略放在同一容量故事裡驗收。

FAQ

常見問題

核對探針執行使用者與 PATH、以及 start_period 是否涵蓋冷啟動;仍異常時對照allowedOrigins 與反代長文檢查是否走了錯誤環回位址。

先看宿主 dmesg 與容器退出碼,再回到尖峰取樣調整 limit;詳細步驟見Exit 137 排障文。選型可參考價格頁

會縮短本地熱日誌視窗,需要更長留存時應外發集中儲存或物件儲存;維運政策見說明中心