# 4. 已知問題與修復 ### 4.1 Node.js 22/24 fetch 無法連線 Telegram API **症狀**:`Telegram: failed - fetch failed`,但 curl 可以正常連線 **根因**:Node.js 22+ 的 `fetch`(基於 undici)有 `autoSelectFamily`(happy eyeballs),優先嘗試 IPv6。伺服器沒有可用的 IPv6 對外連線。 **修復(三層)**: 1. 系統層停用 IPv6: ```bash # 永久設定(/etc/sysctl.conf) net.ipv6.conf.all.disable_ipv6=1 net.ipv6.conf.default.disable_ipv6=1 net.ipv6.conf.lo.disable_ipv6=1 ``` 2. gateway.env 加入 NODE_OPTIONS: ``` NODE_OPTIONS=--dns-result-order=ipv4first --no-network-family-autoselection ``` 3. openclaw.json config 層覆蓋(**Node 24 必須,因 OpenClaw 內部 hardcode `autoSelectFamily:true`**): ```json { "channels": { "telegram": { "network": { "autoSelectFamily": false, "dnsResultOrder": "ipv4first" } } } } ``` **注意**:sysctl + NODE_OPTIONS 在 Node 22 就夠了,但 Node 24 的 undici 不吃這些設定,必須用 openclaw.json config 覆蓋(見 §4.13)。 ### 4.2 OpenClaw 腳本顯示「未運行」 **症狀**:`sudo bash kejilion.sh app OpenClaw` 顯示「已安裝 未運行」,但 Gateway 實際在跑 **根因**:腳本用 `pgrep -f "openclaw gateway"` 判斷,但 pm2/systemd 啟動的進程名稱不符 **修復**:改用 tmux 啟動(若要讓腳本正確識別),或改用 systemd(推薦) ### 4.3 Docker nginx 開機後無法啟動 **症狀**:`nginx: bind() to 0.0.0.0:80 failed (98: Address in use)` **根因**:系統安裝的 nginx(`/usr/sbin/nginx`)設為 enabled,開機時搶先佔用 port 80 **修復**: ```bash sudo systemctl stop nginx sudo systemctl disable nginx ``` ### 4.4 Multi-Agent Config Schema 與文件不符(v2026.2.17) **症狀**:修改 `openclaw.json` 後 Gateway 啟動失敗,報 `Unrecognized key: "agentId"` 和 `bindings.0.match: Invalid input` **根因**:官方文件範例使用舊版 schema,與實際 v2026.2.17 不相容 **正確格式**: - `agents.list[].id`(不是 `agentId`) - `bindings[]` 需要 `{ "agentId": "xxx", "match": { "channel": "telegram", "accountId": "yyy" } }` - 詳見 [06-config.md 6.2 節](06-config.md) ### 4.5 新 Bot /start 無配對碼回應 **症狀**:在新 Telegram Bot 按 /start 沒有任何回應 **根因**:按 /start 時 Gateway 尚未載入新 Bot Token,Telegram update 被消耗但無人處理 **修復**:確保 config 已正確 + Gateway 重啟成功後再按 /start ### 4.6 使用 accounts 後主 Bot 通道不啟動(2026-02-25) **症狀**:`openclaw channels list` 只顯示 `life-bot`,主 Bot(@Cimon168_bot)不啟動,啟動日誌無 `[default] starting provider` 訊息 **根因**:當 `channels.telegram.accounts` 區塊存在時,OpenClaw 只啟動 `accounts` 裡明確列出的帳號。頂層 `botToken` 不再被視為獨立通道。 **修復**:將主 Bot token 從頂層移入 `accounts.default`: ```json "accounts": { "default": { "botToken": "<主 Bot Token>" }, "life-bot": { "botToken": "<生活 Bot Token>" } } ``` 修改後重啟:`systemctl --user restart openclaw-gateway` ### 4.7 Multi-Agent 後 workspace skills 消失(2026-02-25) **症狀**:Gateway 重啟後 `openclaw skills list` 只顯示 bundled skills,workspace skills(daily-briefing、qmd-brain、task-capture)消失。Agent 回覆不認識這些 skills。 **根因**:`agents.list` 只有具名 agent(如 `life-assistant`)時,隱含的預設 agent(main)不會觸發 workspace skills 掃描。OpenClaw 只對 `agents.list` 中明確列出的 agent 執行 workspace 目錄的 skills 發現。 **修復**:在 `agents.list` 明確加入 `main` agent,並在 `bindings` 加入 `default → main` 綁定: ```json "agents": { "list": [ { "id": "main", "name": "主 Agent", "model": { "primary": "cliapi/gpt-5.3-codex" }, "workspace": "/home/selig/.openclaw/workspace" }, { "id": "life-assistant", "..." } ] }, "bindings": [ { "agentId": "main", "match": { "channel": "telegram", "accountId": "default" } }, { "agentId": "life-assistant", "match": { "channel": "telegram", "accountId": "life-bot" } } ] ``` 修改後重啟:`systemctl --user restart openclaw-gateway` **驗證**:檢查啟動 log 是否有 workspace skills 的 sanitization 記錄: ```bash journalctl --user -u openclaw-gateway --since "1 min ago" --no-pager | grep daily-briefing ``` ### 4.8 OpenClaw WebUI 配對問題 **症狀**:`https://oclaw.nature.edu.kg/#token=...` 顯示 "backend not paired yet" **修復**:在後端核准配對請求 ```bash sudo openclaw devices list # 查看 pending request ID sudo openclaw devices approve ``` ### 4.9 升級 2026.2.25 後 Gateway 啟動失敗(2026-02-27) **症狀**:`Error: Unsafe fallback OpenClaw temp dir: /tmp/openclaw-1000` **根因**:新版加強 temp 目錄安全檢查,要求 `/tmp/openclaw-` 權限必須 `700`(owner-only),舊版建立的目錄權限為 `775`。 **修復**: ```bash chmod 700 /tmp/openclaw-1000 # selig (UID 1000) # root 的 temp dir 也需清理 sudo rm -rf /tmp/openclaw-0 && sudo mkdir -p /tmp/openclaw-0 && sudo chmod 700 /tmp/openclaw-0 ``` ### 4.10 升級後 `google-antigravity-auth` plugin 警告(2026-02-27) **症狀**:`plugin removed: google-antigravity-auth (stale config entry ignored)` **根因**:`google-antigravity-auth` plugin 已從 2026.2.25 移除,但 `openclaw.json` 仍有殘留設定。 **修復**:從 `openclaw.json` 的 `plugins.entries` 刪除 `google-antigravity-auth` 條目。此 plugin 用於 OpenClaw 直連 Google API 認證,與 CLIProxyAPI 代理的 Gemini 模型無關。 ### 4.11 `sudo openclaw skills list` 偵測不到 selig 環境的 CLI(2026-02-27) **症狀**:`coding-agent` 和 `summarize` 顯示 `✗ missing`,但實際 CLI 已安裝。 **根因**:`sudo openclaw` 以 root 執行,PATH 不含 selig 的 `~/.local/bin` 和 nvm 路徑。 **修復**:使用 `openclaw skills list`(不加 sudo)即可正確偵測。Gateway 以 selig user service 運行,不受影響。 ### 4.12 Browser control 連線逾時(2026-03-02) **症狀**:Telegram Agent 嘗試操控瀏覽器時報 `Browser control service 連線逾時(15 秒)` **根因**(多層問題): 1. **Node service 未安裝**:OpenClaw 的瀏覽器控制需要 Node Host service 作為 Gateway 和本機瀏覽器之間的 relay 2. **Node service 未配對**:首次連線 Gateway 時需經過 device pairing 核准 3. **缺少 DISPLAY 環境變數**:Gateway 和 Node service 的 systemd unit 都沒有 `DISPLAY=:99`,導致無法操控 Xvfb 上的瀏覽器 4. **Snap Chromium 限制**:Ubuntu snap 版 Chromium 的包裝器會剝掉 `--load-extension` 和 `--remote-debugging-port` 旗標,無法載入 OpenClaw 擴充套件或啟用 CDP **修復**: ```bash # 1. 安裝 Node service 並加入 DISPLAY openclaw node install # 編輯 ~/.config/systemd/user/openclaw-node.service 加入 Environment=DISPLAY=:99 # 2. 在 gateway.env 加入 DISPLAY,Gateway service 也要加 echo 'DISPLAY=:99' >> ~/.config/openclaw/gateway.env # 編輯 ~/.config/systemd/user/openclaw-gateway.service 加入 Environment=DISPLAY=:99 # 3. 啟動 Node service 並配對 systemctl --user daemon-reload systemctl --user enable --now openclaw-node.service openclaw devices list # 等待 pending request openclaw devices approve # 核准 # 4. 改用 Playwright Chromium(非 snap,支援 CDP 直連) # 建立 playwright-chrome.service 並啟用 systemctl --user enable --now playwright-chrome.service # 5. 建立 cdp-direct profile 設為預設 openclaw browser create-profile --name cdp-direct --cdp-url http://127.0.0.1:18801 # openclaw.json → browser.defaultProfile: "cdp-direct" # 6. 重啟 Gateway systemctl --user restart openclaw-gateway ``` ### 4.16 Agent browser tool timeout — `openclaw` profile 啟動失敗(2026-03-11) **症狀**:CLI 的 `openclaw browser navigate` 正常,但 Agent 透過 tool call 使用瀏覽器時 15 秒 timeout: ``` [tools] browser failed: timed out. Restart the OpenClaw gateway... ``` **根因**:v2026.3.7 內建了 `openclaw` browser profile(port 18800),Gateway 啟動時會嘗試用 `detectedPath`(`/usr/bin/chromium-browser`,snap 版)啟動這個 profile。snap Chromium 會剝掉 `--remote-debugging-port` 參數,導致 CDP 永遠無法建立。`openclaw browser profiles` 顯示此 profile 為 `stopped` 狀態。 **關鍵差異**:CLI 指令走 `defaultProfile`(cdp-direct),但 agent tool call 可能嘗試使用 `openclaw` profile。 **修復**: 1. 在 `openclaw.json` 的 `browser.profiles` 覆寫 `openclaw` profile,讓它指向 Playwright CDP: ```json { "browser": { "profiles": { "openclaw": { "cdpUrl": "http://127.0.0.1:18801", "color": "#FF4500" } } } } ``` 2. 確認 Gateway service 有 `Environment=DISPLAY=:99`(`~/.config/systemd/user/openclaw-gateway.service`) **驗證**: ```bash openclaw browser profiles # 三個 profile(cdp-direct、chrome、openclaw)都應顯示 running,port 18801 ``` ### 4.13 Node.js 24 undici autoSelectFamily 導致 Telegram 連線逾時(2026-03-02) **症狀**:Gateway 重啟後 Telegram 持續 `Network request failed`,但 `curl` 可正常連線 Telegram API **根因**:Node.js 24 的 `fetch()`(undici)有 `autoSelectFamily`(happy eyeballs),會同時嘗試 IPv4/IPv6。即使系統 sysctl 停用 IPv6 + `NODE_OPTIONS=--dns-result-order=ipv4first`,OpenClaw 內部(`ssrf-D_av5wos.js`)hardcode `autoSelectFamily: true`,覆蓋了 NODE_OPTIONS。 **修復**:在 `openclaw.json` 用 config 層級覆蓋: ```json { "channels": { "telegram": { "network": { "autoSelectFamily": false, "dnsResultOrder": "ipv4first" } } } } ``` 同時在 `gateway.env` 的 NODE_OPTIONS 加入 `--no-network-family-autoselection`(雙保險)。 **驗證**:Gateway log 應顯示 `autoSelectFamily=false (config)` ### 4.14 GPU driver suspend/resume 死鎖導致 Bot 全卡(2026-03-02) **症狀**:所有 Telegram Bot 收到訊息後無回應,`nvidia-smi` 掛起不返回 **根因(三層連鎖故障)**: 1. **系統觸發 suspend/resume** → `nvidia-sleep.sh` 在 kernel 的 `uvm_suspend()` 死鎖(狀態 `Ds` 不可中斷) 2. **GPU driver 無法存取** → llama-embed 的 port 11435 雖然 listen,但 embedding 請求永遠無回應 3. **memory-lancedb-pro 的 `before_agent_start` hook 阻塞** → 每個 agent 啟動時呼叫 embedding API 做 autoRecall,因 llama-embed 無回應而無限等待,導致所有 agent 卡死 **診斷流程**: ```bash # 1. 確認 GPU 死鎖 timeout 5 nvidia-smi || echo "GPU driver 死鎖" # 2. 確認 llama-embed 無回應 timeout 5 curl -s http://127.0.0.1:11435/v1/embeddings \ -H "Content-Type: application/json" \ -d '{"input":"test","model":"nomic-embed-text-v1.5"}' || echo "embedding 無回應" # 3. 確認殘留 process ps aux | grep nvidia-sleep # 看到 Ds 狀態 = 死鎖 ps aux | grep llama-server # 可能有殘留舊 process 占住 port ``` **緊急修復(免重開機讓 Bot 恢復)**: ```bash # 關閉 autoRecall,讓 agent 不依賴 embedding 即可啟動 openclaw config set plugins.entries.memory-lancedb-pro.config.autoRecall false # Gateway 會自動偵測 config 變更並重啟 ``` **根治**:重開機修復 GPU driver **預防**:停用系統休眠 ```bash sudo systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target ``` ### 4.15 Embedding 容錯策略(2026-03-02) llama-embed(GPU)是唯一的 production embedding 路徑。Ollama CPU 模式雖有 `nomic-embed-text`(port 11434,~1.4s/call),但在 4 核心 + 高 load 系統上會拖垮效能,**不適合作為常態 fallback**。 **容錯層級**(由 `~/clawd/scripts/embed-health.sh` 自動執行,cron */30 分鐘,2026-03-02 已實作): | 層級 | 條件 | 動作 | |------|------|------| | 正常 | llama-embed port 11435 回應 < 2s | `autoRecall: true`, `autoCapture: true` | | 降級 | llama-embed 無回應或逾時 | 自動設定 `autoRecall: false`, `autoCapture: false`;Telegram 通知使用者 | | 恢復 | 重開機後 llama-embed 恢復 | 自動設定 `autoRecall: true`, `autoCapture: true`;Telegram 通知 | **設計原則**: - 不使用 Ollama CPU fallback(CPU 資源不足) - 不使用線上 embedding API(隱私考量 + 增加外部依賴) - embedding 掛了 = 記憶暫停,不影響 Bot 核心回覆功能 - 健康檢查腳本放入 crontab 每 30 分鐘執行