# OpenClaw + WSL + Ollama + ngrok + LINE 本地部署完整指南
> 紀錄日期:2026-03-15
>
> 環境:Windows 11 + WSL2 (Ubuntu) + i7-12700h (筆電) + NVIDIA RTX 3050 Ti 4GB + RAM 32GB
***
## 環境架構
```
Windows 11
└── WSL2 (ubuntu_openclaw)
├── Ollama(背景服務,port 11434)
│ ├── qwen3.5:4b
│ ├── qwen3.5:9b
│ ├── qwen3.5-4b-32k(自訂 32k context 版本)
│ └── qwen3.5-9b-32k(自訂 32k context 版本)
├── OpenClaw(gateway,port 18789)
│ └── Web UI:http://localhost:18789
└── ngrok(Webhook 轉發,port 18789 → HTTPS 公開網址)
```
***
## 安裝步驟
### 1. 建立專用 WSL Distro
```powershell
# 若沒有現有 distro,先安裝 Ubuntu
wsl --install Ubuntu
# 備份乾淨環境
wsl --export <乾淨的 distro 名稱> <匯出位置>
# 匯入為 OpenClaw 專用 distro
wsl --import <distro 名稱> <安裝位置> <匯入位置>
# 啟用
wsl -d <你的 distro 名稱>
```
### 2. 更新系統與安裝套件
```bash
sudo apt update && sudo apt upgrade -y
sudo apt install -y build-essential curl git wget zip unzip npm zstd jq
```
### 3. 透過 nvm 安裝 Node.js v22
> OpenClaw 需要 Node.js 22+,系統預設版本通常不夠新。
```bash
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash
# 重新載入 shell 後執行
nvm install 22
nvm use 22
nvm alias default 22
```
**讓每次開新終端機自動切到 v22:**
```bash
# 確認 nvm 初始化已在 .bashrc(應在第 119~121 行附近)
grep -n "nvm" ~/.bashrc
# 在 nvm bash_completion 那行後面插入自動切換
sed -i '/bash_completion/a nvm use 22 --silent' ~/.bashrc
source ~/.bashrc
```
### 4. 安裝 Ollama
```bash
curl -fsSL https://ollama.com/install.sh | sh
# 確認能正常執行
ollama
```
> 執行 `ollama serve` 時若出現 `address already in use`,代表服務已在背景運作,屬正常現象。
### 5. 啟用 KV Cache 量化(減少記憶體壓力)
> 建議在拉取模型前完成此設定。`q8_0` 量化可將 KV cache 記憶體用量減半,讓更多模型層留在 VRAM,對速度有顯著幫助,且對輸出品質影響極小。
```bash
sudo systemctl edit ollama --force
```
加入以下內容:
```ini
[Service]
Environment="OLLAMA_KV_CACHE_TYPE=q8_0"
```
儲存後套用:
```bash
sudo systemctl daemon-reload
sudo systemctl restart ollama
```
### 6. 拉取模型
```bash
# 推薦先拉 4b(較快驗證環境)
ollama pull qwen3.5:4b
# 確認可正常運作
ollama run qwen3.5:4b "hello"
# 之後再拉 9b
ollama pull qwen3.5:9b
```
### 7. 建立自訂 32k context 模型
> **為什麼是 32k,不是更小的值?**
>
> OpenClaw 以 agent 模式運作,叫他執行任務(clone repo、讀檔、寫程式)時,每一輪 tool call 的輸入指令與執行結果都會累積進 context,比純對話消耗快很多。幾次 tool call 後就可能撞到上限導致任務卡住。
>
> 此外,OpenClaw 的 compaction 機制(當 context 快滿時自動壓縮對話歷史)需要至少 32k 才能正常運作,低於這個值會在 agent 執行任務時連續 abort,造成整個 agent 卡死。
>
> 因此最低建議使用 32k。OpenClaw 預設的 262144 context 會超出 4GB VRAM 可負擔的量,必須改用自訂版本。
**4b 版本:**
```bash
cat > ~/Modelfile4b << 'EOF'
FROM qwen3.5:4b
PARAMETER num_ctx 32768
EOF
ollama create qwen3.5-4b-32k -f ~/Modelfile4b
```
**9b 版本:**
```bash
cat > ~/Modelfile9b << 'EOF'
FROM qwen3.5:9b
PARAMETER num_ctx 32768
EOF
ollama create qwen3.5-9b-32k -f ~/Modelfile9b
```
確認 num_ctx 正確:
```bash
ollama show qwen3.5-9b-32k --modelfile | grep num_ctx
```
### 8. 安裝並啟用 OpenClaw
```bash
ollama launch openclaw
```
互動介面裡選擇模型(建議先選 `qwen3.5:4b`),OpenClaw 會自動設定 `openclaw.json` 並備份。
啟動成功後終端機會顯示:
```
✓ OpenClaw is running
Open the Web UI:
http://localhost:18789/#token=ollama
```
> 若出現 npm 相關錯誤,確認 nvm 的 Node.js v22 已正確設為 default。
> **重要:** `ollama launch openclaw` 安裝完後,`openclaw` CLI 的路徑不會自動加進 PATH。需完成步驟 3 的「自動切換 v22」設定,否則每次開新終端機都會出現 `openclaw: command not found`。
### 9. 修正 OpenClaw 設定
**9-1. 使用 jq 更新模型 id/name 與 contextWindow:**
> `openclaw config set` 對 JSON 陣列元素的路徑語法無效,必須用 `jq` 直接操作。
```bash
jq '
.models.providers.ollama.models[0].id = "qwen3.5-4b-32k" |
.models.providers.ollama.models[0].name = "qwen3.5-4b-32k" |
.models.providers.ollama.models[0].contextWindow = 32768
' ~/.openclaw/openclaw.json > /tmp/openclaw_tmp.json && mv /tmp/openclaw_tmp.json ~/.openclaw/openclaw.json
```
確認寫入:
```bash
cat ~/.openclaw/openclaw.json | jq '{id: .models.providers.ollama.models[0].id, contextWindow: .models.providers.ollama.models[0].contextWindow}'
```
**9-2. 設定 primary model:**
```bash
openclaw config set agents.defaults.model.primary ollama/qwen3.5-4b-32k
```
**9-3. 設定 compaction 與 timeout:**
> `reserveTokensFloor` 預設值為 20000,這個值是 compaction 作業所需的保留空間。若 context 總量不夠大,compaction 會直接 abort,造成 agent 執行任務時卡死。必須設為 0 讓 compaction 能正常啟動。
```bash
openclaw config set agents.defaults.compaction.reserveTokensFloor 0
openclaw config set agents.defaults.timeoutSeconds 1800
```
**9-4. 關閉 thinking mode(避免回應過慢):**
```bash
sed -i 's/"reasoning": true/"reasoning": false/' ~/.openclaw/openclaw.json
```
> 注意:`openclaw config set agents.defaults.model.thinking false` 對此版本會報 validation error,須改用 `sed` 直接修改 json。
**9-5. 重啟 gateway 套用設定:**
```bash
openclaw gateway stop && sleep 2 && openclaw gateway start
```
### 10. 串接 LINE Official Account
#### 10-1. 在 LINE Developers Console 建立 Messaging API Channel
1. 前往 [LINE Developers Console](https://developers.line.biz/console/)
2. 選擇或建立 Provider
3. 點「**Create a Messaging API channel**」
4. 填入必要資訊後送出
5. 建立完成後,LINE 會自動在 [LINE Official Account Manager](https://manager.line.biz/) 產生對應的官方帳號
6. 回到 Developers Console,進入剛建立的 channel
7. 「**Basic settings**」分頁 → 複製並記錄 **Channel Secret**
8. 「**Messaging API**」分頁 → **Channel access token** → 點「**Issue**」產生並複製
#### 10-2. 安裝 LINE Plugin
> 執行前確認 `openclaw` 指令可用(先 `source ~/.bashrc`)
```bash
openclaw plugins install @openclaw/line
```
#### 10-3. 設定 config
```bash
openclaw config set channels.line.channelAccessToken "你的_channel_access_token"
openclaw config set channels.line.channelSecret "你的_channel_secret"
```
確認寫入:
```bash
cat ~/.openclaw/openclaw.json | jq '.channels'
```
#### 10-4. 安裝 ngrok
LINE Webhook 必須是 HTTPS,本地環境需透過 ngrok 轉發:
```bash
curl -sSL https://ngrok-agent.s3.amazonaws.com/ngrok.asc \
| sudo tee /etc/apt/trusted.gpg.d/ngrok.asc >/dev/null && \
echo "deb https://ngrok-agent.s3.amazonaws.com buster main" \
| sudo tee /etc/apt/sources.list.d/ngrok.list && \
sudo apt update && sudo apt install ngrok -y
```
前往 <https://dashboard.ngrok.com/signup> 註冊免費帳號,取得 authtoken 後執行:
```bash
ngrok config add-authtoken 你的_authtoken
```
啟動轉發(此視窗需保持開啟):
```bash
ngrok http 18789
```
另開終端機取得完整網址:
```bash
curl http://127.0.0.1:4040/api/tunnels | python3 -m json.tool | grep public_url
```
#### 10-5. 填入 Webhook URL
1. 前往 Developers Console → 你的 channel →「**Messaging API**」分頁
2. 找到「**Webhook URL**」欄位,填入:
```
https://xxxxxxxx.ngrok-free.app/line/webhook
```
> **注意:** 路徑必須是 `/line/webhook`,不是 `/webhooks/line`。
1. 點「**Verify**」確認連線正常(需要 gateway 和 ngrok 同時在跑)
2. 開啟「**Use webhook**」開關
#### 10-6. 設定 LINE Official Account Manager
前往 <https://manager.line.biz/> → 你的帳號 → **Settings → Response settings**:
- **Chat** → **關閉**
- **Webhooks** → **開啟**
- **Auto-response messages** → **關閉**
> 這步驟容易漏做,未開啟 Webhooks 的話 LINE 訊息不會送到 OpenClaw,gateway log 也不會有任何反應。
#### 10-7. 重啟 Gateway 並完成配對
```bash
openclaw gateway stop && sleep 2 && openclaw gateway start
```
從 LINE 傳訊息給 bot,會收到類似:
```
OpenClaw: access not configured.
Your lineUserId: Uxxxxxxxxx
Pairing code: XXXXXXXX
Ask the bot owner to approve with:
openclaw pairing approve line XXXXXXXX
```
執行配對:
```bash
openclaw pairing approve line <配對碼>
```
完成後即可透過 LINE 與 OpenClaw AI 對話。
> **注意:** ngrok 免費版每次重啟網址會改變,需重新更新 Developers Console 的 Webhook URL。若要固定網址,可使用 ngrok 付費方案或改用 Cloudflare Tunnel(需自有網域),可參考這裡 [OpenClaw + WSL + Ollama + Cloudflare Tunnel + LINE 本地部署與外部連線 Web UI 完整指南 10-4 步驟](https://hackmd.io/@80hB8lX2SvWaxYO715T4Ig/Sk2rXUX5Zg#10-4-%E8%A8%AD%E5%AE%9A-Cloudflare-Tunnel)。
***
## 遇到的問題與解法
### 問題一:`LLM request timed out` / `model failed to load`
**症狀:**
OpenClaw Web UI 顯示 `Ollama API error 500: model failed to load`。
**原因:**
OpenClaw 預設 `contextWindow: 262144`(262K tokens),要求 Ollama 分配大量 KV cache,遠超過 4GB VRAM 可負擔的量。Xwayland(WSL GUI 服務)額外佔用 600MB~1.5GB,讓可用 VRAM 更少。
**查看 Ollama log 確認:**
```bash
journalctl -u ollama -f
```
Log 會看到 Ollama 不斷嘗試從 7 個 GPU layers 降到 1,最後全部 offload 失敗。
**解法:** 執行步驟 7 建立 32k 自訂模型,並依步驟 9 更新設定。
***
### 問題二:thinking mode 造成回應過慢
**症狀:**
TUI 底部顯示 `think low`,每次回應前都有大量推理過程。
**原因:**
`openclaw.json` 裡模型的 `reasoning` 預設為 `true`。
**解法:**
```bash
sed -i 's/"reasoning": true/"reasoning": false/' ~/.openclaw/openclaw.json
openclaw gateway stop && sleep 2 && openclaw gateway start
```
> 注意:`openclaw config set agents.defaults.model.thinking false` 對此版本會報 validation error,須改用 `sed` 直接修改 json。
***
### 問題三:`100% context used` 對話卡住
**症狀:**
Web UI 底部出現紅色警告 `100% context used`,模型無法繼續回應。
**解法:**
開新對話,點左側「聊天」旁的 **+** 按鈕,或直接在瀏覽器輸入:
```
http://localhost:18789/chat?session=new
```
***
### 問題四:切換模型後 Web UI 仍顯示舊模型名稱
**說明:**
這是 UI 快取問題,實際使用的模型以回應訊息下方的 tag 為準。強制重新整理瀏覽器(`Ctrl + Shift + R`)或開新對話後 tag 就會正確顯示新模型名稱。
***
### 問題五:`ollama serve` 報 `address already in use`
**說明:** 這不是錯誤,代表 Ollama 服務已在背景運作,可直接進行後續步驟。
***
### 問題六:`openclaw: command not found`
**原因:**
`openclaw` CLI 安裝在 nvm 管理的 node 路徑下,開新終端機時若 nvm 沒有自動切到 v22,PATH 就不包含 openclaw。
**解法:**
```bash
grep "nvm use 22" ~/.bashrc
```
若沒有,手動加入:
```bash
sed -i '/bash_completion/a nvm use 22 --silent' ~/.bashrc
source ~/.bashrc
```
***
### 問題七:LINE Webhook Verify 回傳 404
**原因:** Webhook URL 路徑填錯。
**正確路徑:**
```
https://xxxxxxxx.ngrok-free.app/line/webhook
```
**錯誤路徑(不可用):**
```
https://xxxxxxxx.ngrok-free.app/webhooks/line
```
***
### 問題八:LINE 訊息沒有進到 OpenClaw
**症狀:**
Verify 成功(200 OK),但從 LINE 傳訊息後 ngrok 沒有收到任何 POST,gateway log 也沒反應。
**原因:**
LINE Official Account Manager 的 **Webhooks 開關未開啟**。
**解法:**
前往 <https://manager.line.biz/> → Settings → Response settings → 把 **Webhooks** 開關打開。
***
### 問題九:agent 執行任務到一半卡住,gateway log 出現 compaction 連續失敗
**症狀:**
叫 agent 執行多步驟任務(如 clone repo、讀檔後處理)時,沒有回應,gateway log 出現:
```
[compaction] Full summarization failed, trying partial: Summarization failed: This operation was aborted
[compaction] Partial summarization also failed: Summarization failed: This operation was aborted
```
**原因:**
agent 執行任務時,tool call 的輸入輸出快速累積 context,觸發 compaction(自動壓縮對話歷史的機制)。但 OpenClaw 的 `reserveTokensFloor` 預設值為 20000,代表 compaction 啟動時必須保留 20000 tokens 的作業空間。若 context 總量不夠大,compaction 會直接 abort,造成 agent 卡死。
**解法:**
```bash
openclaw config set agents.defaults.compaction.reserveTokensFloor 0
openclaw config set agents.defaults.timeoutSeconds 1800
openclaw gateway stop && sleep 2 && openclaw gateway start
```
> 根本解法是確保使用 32k context model,讓 compaction 有足夠空間正常運作。
***
### 問題十:`openclaw config set` 修改 contextWindow 無效
**症狀:**
執行 `openclaw config set models.providers.ollama.models.contextWindow 32768` 後,`openclaw.json` 裡的值沒有改變。
**原因:**
`models` 欄位是 JSON 陣列,`openclaw config set` 的路徑語法無法定址陣列元素。
**解法:** 使用 `jq` 直接修改:
```bash
jq '
.models.providers.ollama.models[0].id = "qwen3.5-9b-32k" |
.models.providers.ollama.models[0].name = "qwen3.5-9b-32k" |
.models.providers.ollama.models[0].contextWindow = 32768
' ~/.openclaw/openclaw.json > /tmp/openclaw_tmp.json && mv /tmp/openclaw_tmp.json ~/.openclaw/openclaw.json
```
***
### 問題十一:透過 LINE 叫 agent 執行任務時沒有回應
**症狀:**
從 LINE 叫 agent 執行任務(如 clone repo),ngrok log 顯示請求有進來,但 agent 沒有回應。
**原因:**
LINE Webhook 有 **30 秒**硬性 timeout,無法修改。agent 執行任務時需要多輪 tool call,若 model 推理速度太慢(如 context 過大導致 100% CPU offload),就會在 30 秒內無法回應,LINE 端直接切斷連線。
透過 `ollama ps` 可確認 PROCESSOR 欄位是否為 `100% CPU`。
**解法:**
使用 32k context model,在 4GB VRAM 環境下約 74% CPU / 26% GPU offload,推理速度足以在 timeout 前完成 LINE 的簡短指令。
複雜的多步驟 coding 任務建議改用 **Web UI**,不受 30 秒 timeout 限制。
***
## 硬體限制與模型選擇
| 模型 | 大小 | PROCESSOR | 適合情境 | 備註 |
| :---------------------------- | :----- | :---------------- | :----------------------------- | :-------------------------- |
| `qwen3.5:4b`(預設 262k ctx) | 3.4 GB | 無法載入 | - | contextWindow 太大 |
| `qwen3.5-4b-32k`(32k ctx) | 3.4 GB | 完整 GPU | LINE + Web UI 皆可 | **推薦,速度最快** |
| `qwen3.5:9b`(預設 262k ctx) | 6.6 GB | 無法載入 | - | contextWindow 太大 |
| `qwen3.5-9b-32k`(32k ctx) | 6.6 GB | 74% CPU / 26% GPU | LINE 簡單指令、Web UI 複雜任務 | 效果較好,速度可接受 |
| `qwen3.5-9b-128k`(128k ctx) | 6.6 GB | 100% CPU | 僅 Web UI | LINE 30 秒 timeout 必定觸發 |
> RTX 3050 Ti 只有 4GB VRAM,Xwayland 會額外佔用 600MB~1.5GB。啟用 `OLLAMA_KV_CACHE_TYPE=q8_0` 可將 KV cache 記憶體用量減半,改善 GPU offload 比例。
***
## 切換模型
```bash
# 切換到 9b
jq '
.models.providers.ollama.models[0].id = "qwen3.5-9b-32k" |
.models.providers.ollama.models[0].name = "qwen3.5-9b-32k" |
.models.providers.ollama.models[0].contextWindow = 32768
' ~/.openclaw/openclaw.json > /tmp/openclaw_tmp.json && mv /tmp/openclaw_tmp.json ~/.openclaw/openclaw.json
openclaw config set agents.defaults.model.primary ollama/qwen3.5-9b-32k
# 切換回 4b
jq '
.models.providers.ollama.models[0].id = "qwen3.5-4b-32k" |
.models.providers.ollama.models[0].name = "qwen3.5-4b-32k" |
.models.providers.ollama.models[0].contextWindow = 32768
' ~/.openclaw/openclaw.json > /tmp/openclaw_tmp.json && mv /tmp/openclaw_tmp.json ~/.openclaw/openclaw.json
openclaw config set agents.defaults.model.primary ollama/qwen3.5-4b-32k
# 重啟套用
openclaw gateway stop && sleep 2 && openclaw gateway start
```
> 切換後須開新對話,回應 tag 才會正確顯示新模型名稱。
***
## 常用指令速查
```bash
# 查看目前 VRAM 使用量
nvidia-smi
# 確認 Ollama 模型列表
ollama list
# 查看目前載入中的模型與 PROCESSOR 比例
ollama ps
# 強制釋放模型佔用的記憶體
ollama stop qwen3.5-9b-32k
# 重啟 OpenClaw gateway
openclaw gateway stop && sleep 2 && openclaw gateway start
# 查看 OpenClaw gateway log
journalctl --user -u openclaw-gateway.service -f
# 查看 Ollama log
journalctl -u ollama -f
# 開啟 TUI
openclaw tui
# 讓 gateway 在關閉終端機後繼續運作
sudo loginctl enable-linger $USER
# 啟動 ngrok(LINE Webhook 用,需保持視窗開啟)
ngrok http 18789
# 取得目前 ngrok 公開網址
curl http://127.0.0.1:4040/api/tunnels | python3 -m json.tool | grep public_url
```
***
## 備註
- OpenClaw 設定檔位置:`~/.openclaw/openclaw.json`
- OpenClaw Web UI:`http://localhost:18789/#token=ollama`
- Node.js 版本需要 22+,建議透過 nvm 管理,避免系統套件版本過舊
- 新對話入口:左側「聊天」旁的 **+** 按鈕,或網址 `http://localhost:18789/chat?session=new`
- LINE Webhook URL 格式:`https://<ngrok-subdomain>.ngrok-free.app/line/webhook`
- LINE Webhook 有 **30 秒**硬性 timeout,無法修改;複雜的 agent 任務請使用 Web UI
- `openclaw config set` 無法修改 JSON 陣列元素,需改用 `jq`
- ngrok 免費版每次重啟網址會變,固定網址需付費方案或改用 Cloudflare Tunnel(需自有網域)
- LINE Official Account Manager 的 Webhooks 開關需手動開啟,與 Developers Console 的 Use webhook 是兩個不同設定
- `OLLAMA_KV_CACHE_TYPE=q8_0` 設定位於 `/etc/systemd/system/ollama.service.d/override.conf`
## 性能與穩定性最佳化:遷移至雲端 API 解決方案
若同學在部署過程中發現本地硬體資源不足(例如 **RTX 3050 Ti 4GB** 顯存過小),或遇到以下不穩定現象:
- **載入失敗**:頻繁出現 `model failed to load` 或 `Ollama API error 500`。
- **任務卡死**:受限於顯存,Context Window 無法開高,導致 Agent 任務因 `compaction` 失敗而中斷。
建議參考我另一篇雲端遷移指南,改用 **阿里雲百煉 (Qwen)** 作為後端模型以獲得更穩定的體驗:
> **[OpenClaw + 雲模型 Qwen3.5:從本地 Ollama 遷移至阿里雲百煉 (Qwen)](https://hackmd.io/@80hB8lX2SvWaxYO715T4Ig/SyIlD3H9Wl)**
### 遷移至雲端的優勢
- **解除顯存限制**:API 運算不佔用本地 GPU,解決 4GB VRAM 無法處理長文本的困境。
- **提升回應速度**:雲端推理速度顯著優於本地運行,約快 3 至 5 倍。
- **高額免費試用**:目前阿里雲國際版提供新用戶高達 **7,000 萬個 Tokens** 的免費試用額度。
- **穩定支援長文本**:支援 **131K** 以上的 Context Window,確保複雜 Agent 任務順暢執行。