運行一個 OpenClaw 實例很簡單。但在同一台伺服器上運行 20 或 50 個——每個給不同的使用者、完全隔離、帶有 HTTPS 和獨立子網域——就需要事前規劃了。本指南涵蓋多租戶 OpenClaw 部署的架構、資源管理和運維實踐。這與 ClawTank 託管數百個 OpenClaw 實例所使用的方法相同。
架構概覽
每個使用者都會獲得:
- 一個運行
openclaw-stack映像檔的專用 Docker 容器 - 從管理池中分配的唯一連接埠(例如 18800-18899)
- 一個子網域(例如
alice.yourdomain.com),透過 Caddy 進行路由 - 透過 Let's Encrypt 的自動 TLS
- 隔離的檔案系統、網路和資源
使用者 A ──→ alice.yourdomain.com ──→ Caddy ──→ localhost:18800 ──→ 容器 A
使用者 B ──→ bob.yourdomain.com ──→ Caddy ──→ localhost:18801 ──→ 容器 B
使用者 C ──→ carol.yourdomain.com ──→ Caddy ──→ localhost:18802 ──→ 容器 C
Docker 容器設定
建立使用者容器
docker run -d \
--name openclaw-alice \
--restart unless-stopped \
-p 18800:3001 \
-m 512m \
--cpus=1 \
-v openclaw-alice-data:/app/data \
-e OPENCLAW_GATEWAY_TOKEN=alice-unique-token \
-e ANTHROPIC_API_KEY=sk-ant-alice-key \
openclaw/openclaw:latest
關鍵參數:
-m 512m— 硬性記憶體限制 512MB--cpus=1— 限制為 1 個 CPU 核心- 每個使用者有獨立的資料卷
- 唯一的 gateway token(防止重啟時 token 重新生成)[1]
- 每個使用者提供自己的 API 金鑰
用 Docker Compose 管理多個使用者
以宣告式方式管理多個容器:
version: '3.8'
services:
openclaw-alice:
image: openclaw/openclaw:latest
container_name: openclaw-alice
restart: unless-stopped
ports:
- "18800:3001"
volumes:
- alice_data:/app/data
environment:
- OPENCLAW_GATEWAY_TOKEN=alice-unique-token-here
- ANTHROPIC_API_KEY=${ALICE_API_KEY}
deploy:
resources:
limits:
memory: 512M
cpus: '1.0'
reservations:
memory: 256M
cpus: '0.25'
openclaw-bob:
image: openclaw/openclaw:latest
container_name: openclaw-bob
restart: unless-stopped
ports:
- "18801:3001"
volumes:
- bob_data:/app/data
environment:
- OPENCLAW_GATEWAY_TOKEN=bob-unique-token-here
- ANTHROPIC_API_KEY=${BOB_API_KEY}
deploy:
resources:
limits:
memory: 512M
cpus: '1.0'
reservations:
memory: 256M
cpus: '0.25'
volumes:
alice_data:
bob_data:
在實際情況中,你會想要以程式化方式生成這些設定,而不是為每個使用者手動編輯 YAML。
連接埠分配策略
指定一個連接埠範圍,並在資料庫或設定檔中追蹤分配:
| 連接埠範圍 | 用途 |
|---|---|
| 18800-18899 | 使用者 OpenClaw 實例(100 位使用者) |
| 18900-18999 | 預留給未來的服務 |
| 3000 | 管理面板 |
配置新使用者時:
- 查詢資料庫找到範圍內的下一個可用連接埠
- 使用該連接埠映射建立容器
- 儲存使用者-連接埠的對應關係
- 更新 Caddy 設定
系統化的方法可以避免連接埠衝突,也容易找到哪個容器屬於哪個使用者。
資源限制與記憶體使用量
OpenClaw 需要多少記憶體?
單個 OpenClaw 容器在閒置時大約使用 200-300MB 的 RAM。在活躍使用時(處理訊息、執行技能),可能飆升到 400-600MB。Gateway 行程本身佔了大部分的基礎使用量。[2]
每個容器的建議限制:
| 工作負載 | 記憶體限制 | CPU 限制 |
|---|---|---|
| 輕量(僅 Telegram Bot) | 384MB | 0.5 CPU |
| 標準(Telegram + 技能) | 512MB | 1.0 CPU |
| 重度(瀏覽器自動化、Ralph Loop) | 1024MB | 2.0 CPU |
伺服器規格
託管多個實例的 VPS 建議:
| 使用者數 | RAM | vCPU | 儲存空間 |
|---|---|---|---|
| 5-10 | 4GB | 4 | 40GB |
| 10-25 | 8GB | 6 | 80GB |
| 25-50 | 16GB | 8 | 160GB |
| 50-100 | 32GB | 16 | 320GB |
這些估算假設標準工作負載。執行瀏覽器自動化或 Ralph Loop 的重度使用者需要更多餘裕。
超額分配資源
不是所有使用者都會同時活躍。只要為每個容器設定硬性限制,你就可以安全地分配比實際可用更多的總記憶體。Docker 的記憶體限制防止任何單一容器耗盡所有可用 RAM。
合理的超額比例是 1.5 倍——如果你有 16GB 的 RAM,你可以在所有容器中分配最多 24GB。監控 swap 使用量;如果伺服器頻繁使用 swap,就降低比例。
Caddy 反向代理搭配 Auto-TLS
Caddy 非常適合多租戶設定,因為它能自動為每個子網域處理 TLS 憑證[3]。
Caddyfile 結構
alice.yourdomain.com {
reverse_proxy localhost:18800
}
bob.yourdomain.com {
reverse_proxy localhost:18801
}
carol.yourdomain.com {
reverse_proxy localhost:18802
}
重新生成 Caddyfile
新增或移除使用者時,從資料庫重新生成整個 Caddyfile 並重新載入:
# 從資料庫生成 Caddyfile
./generate-caddyfile.sh > /etc/caddy/Caddyfile
# 使用 adapter 旗標重新載入(很重要!)
caddy reload --config /etc/caddy/Caddyfile --adapter caddyfile
重新載入時一定要使用 --adapter caddyfile 旗標。沒有這個旗標,Caddy 可能會靜默失敗。
DNS 設定
建立一個萬用字元 DNS A 記錄指向你的伺服器:
Type: A
Name: *.yourdomain.com
Value: YOUR_SERVER_IP
TTL: 300
Cloudflare 使用者注意: Cloudflare 免費方案不支援代理的萬用字元 DNS。將記錄設為 DNS only(灰色雲朵圖示),而非 Proxied。Caddy 會直接透過 Let's Encrypt HTTP-01 挑戰來處理 TLS。
Trusted Proxies
每個 OpenClaw 容器都需要信任 Caddy 代理。在容器設定中加入:
docker exec openclaw-alice openclaw config set gateway.trustedProxies '["127.0.0.1"]'
或者透過 docker-compose.yml 中的環境變數設定。
安全隔離
Docker 提供的防護
- 檔案系統隔離 — 容器無法存取彼此的檔案
- 行程隔離 — 一個容器無法看到或終止另一個容器中的行程
- 網路隔離 — 容器只能透過明確映射的連接埠通訊
- 使用者命名空間映射 — 容器內的 root 對應到主機上的非特權使用者
額外的加固措施
docker run -d \
--name openclaw-alice \
--read-only \
--cap-drop=ALL \
--cap-add=NET_BIND_SERVICE \
--security-opt no-new-privileges \
-v openclaw-alice-data:/app/data \
...
--read-only— 檔案系統唯讀,除了掛載的資料卷--cap-drop=ALL— 移除所有 Linux capabilities--no-new-privileges— 防止容器內的權限提升
API 金鑰隔離
每個使用者提供自己的 AI 供應商 API 金鑰。永遠不要在使用者之間共用一個 API 金鑰——這會造成帳單模糊和單點故障。如果某個使用者的金鑰被撤銷或受到速率限制,只有他們的實例受到影響。
監控
容器健康檢查
加入健康檢查以偵測無回應的容器:
docker inspect --format='{{.State.Health.Status}}' openclaw-alice
資源使用量
監控每個容器的記憶體和 CPU:
docker stats --no-stream --format "table {{.Name}}\t{{.MemUsage}}\t{{.CPUPerc}}"
用 cron 排程執行此命令,並在任何容器超過記憶體限制的 90% 時發出警報。
日誌彙總
收集所有容器的日誌以供除錯:
docker logs --tail 50 openclaw-alice
在正式環境中,將容器日誌轉發到集中式系統(Loki、ELK,或即使是簡單的日誌輪替設定也好)。
擴展考量
垂直擴展
最簡單的方法:升級到更大的 VPS。從 4GB 升到 16GB RAM,你就從 10 個使用者擴展到 50 個,其他什麼都不用改。
水平擴展
當單一伺服器不夠用時:
- 在多台伺服器前方執行一個負載平衡器(或基於 DNS 的路由)
- 每台伺服器運行一部分使用者容器
- 一個中央資料庫追蹤哪個使用者在哪台伺服器上
- Caddy 在每台伺服器上運行,為其使用者處理 TLS
容器編排
超過 100 位使用者時,可以考慮 Kubernetes 或 Docker Swarm 做自動排程、擴展和故障轉移。代價是顯著的運維複雜度。
對於大多數 100 位使用者以下的部署,一台配置充裕的伺服器搭配本指南描述的方法更簡單且綽綽有餘。
或者讓 ClawTank 來處理
本指南中描述的所有事情——容器配置、連接埠分配、Caddy 設定、TLS、資源限制、監控——正是 ClawTank 自動化處理的內容。每個使用者都能獲得一個帶有 auto-TLS、資源保證和管理儀表板的隔離容器。如果你想為他人提供 OpenClaw 託管而不想自己建構基礎設施,ClawTank 就是現成的平台。
