所有文章
運行多個 OpenClaw 實例:多租戶 Docker 指南

運行多個 OpenClaw 實例:多租戶 Docker 指南

|4 分鐘閱讀

運行一個 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 管理面板

配置新使用者時:

  1. 查詢資料庫找到範圍內的下一個可用連接埠
  2. 使用該連接埠映射建立容器
  3. 儲存使用者-連接埠的對應關係
  4. 更新 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 個,其他什麼都不用改。

水平擴展

當單一伺服器不夠用時:

  1. 在多台伺服器前方執行一個負載平衡器(或基於 DNS 的路由)
  2. 每台伺服器運行一部分使用者容器
  3. 一個中央資料庫追蹤哪個使用者在哪台伺服器上
  4. Caddy 在每台伺服器上運行,為其使用者處理 TLS

容器編排

超過 100 位使用者時,可以考慮 Kubernetes 或 Docker Swarm 做自動排程、擴展和故障轉移。代價是顯著的運維複雜度。

對於大多數 100 位使用者以下的部署,一台配置充裕的伺服器搭配本指南描述的方法更簡單且綽綽有餘。

或者讓 ClawTank 來處理

本指南中描述的所有事情——容器配置、連接埠分配、Caddy 設定、TLS、資源限制、監控——正是 ClawTank 自動化處理的內容。每個使用者都能獲得一個帶有 auto-TLS、資源保證和管理儀表板的隔離容器。如果你想為他人提供 OpenClaw 託管而不想自己建構基礎設施,ClawTank 就是現成的平台。

References

  1. OpenClaw Docker Setup Guide
  2. OpenClaw System Requirements
  3. Caddy — Automatic HTTPS
  4. Docker Resource Constraints Documentation
  5. Docker Security Best Practices

準備好部署 OpenClaw 了嗎?

不需要 Docker、SSH、DevOps。不到 1 分鐘即可部署。

免費開始使用