---
# System prepended metadata

title: OpenClaw + WSL + Ollama + ngrok + LINE 本地部署完整指南

---

# 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 任務順暢執行。