基于 Docker 的 OpenClaw 多用户隔离部署方案,支持统一登录认证、Caddy 反向代理和自动化用户管理。
┌─────────────────────────────────┐
│ Caddy (443) │
用户浏览器 ──HTTPS──▶│ forward_auth → auth-server │
│ /alice/* → localhost:18801 │
│ /bob/* → localhost:18803 │
│ /auth/* → localhost:8080 │
└──────┬──────────┬───────────┬────┘
│ │ │
┌──────────▼──┐ ┌─────▼─────┐ ┌──▼──────────┐
│ auth-server │ │ Docker │ │ Docker │
│ (Flask+Redis│ │ openclaw- │ │ openclaw- │
│ port 8080) │ │ alice │ │ bob │
└─────────────┘ │ port 18801 │ │ port 18803 │
└────────────┘ └─────────────┘
核心组件:
| 组件 | 说明 |
|---|---|
manage.sh |
用户生命周期管理(创建/启动/停止/删除) |
auth-server.py |
Flask 认证服务,Caddy forward_auth 集成 |
Caddyfile |
反向代理 + 认证网关 + 自动 HTTPS |
openclaw.default.json |
用户配置模板 |
| Docker 容器 | 每用户独立隔离运行 |
- Docker (含 docker compose)
- Caddy v2
- Python 3.10+
- Redis
- 一个指向服务器的域名(Caddy 自动签发 HTTPS 证书)
Ubuntu/Debian 快速安装依赖:
# Docker
curl -fsSL https://get.docker.com | sh
# Caddy
apt install -y debian-keyring debian-archive-keyring apt-transport-https curl
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | tee /etc/apt/sources.list.d/caddy-stable.list
apt update && apt install -y caddy
# Python & Redis
apt install -y python3 python3-venv redis-server需要 OpenClaw 源码。将源码放到任意目录,然后构建:
cd /path/to/openclaw-source
docker build -t openclaw:local .或从已有机器导出/导入:
# 导出(源机器)
docker save openclaw:local -o openclaw-local.tar
# 导入(目标机器)
docker load -i openclaw-local.tarcd openclaw-multiuser
cp .env.example .env
vim .env必须修改:
# 改为你的实际域名
OPENCLAW_DOMAIN=openclaw.yourdomain.comsudo ./install.sh安装脚本会自动完成:
- 部署管理脚本到
/opt/openclaw/ - 安装认证服务到
/opt/openclaw-auth/(含 Python 虚拟环境) - 配置 systemd 服务(自启动)
- 生成 Caddy 配置(自动 HTTPS)
- 验证各组件状态
所有操作通过 manage.sh 完成:
# 创建用户(自动分配端口、生成令牌、配置 Caddy)
/opt/openclaw/manage.sh create alice
# 启动用户实例
/opt/openclaw/manage.sh start alice
# 查看所有用户状态
/opt/openclaw/manage.sh list
# 查看用户令牌
/opt/openclaw/manage.sh token alice
# 查看实时日志
/opt/openclaw/manage.sh logs alice
# 重启用户实例
/opt/openclaw/manage.sh restart alice
# 停止用户实例
/opt/openclaw/manage.sh stop alice
# 删除用户实例(数据保留)
/opt/openclaw/manage.sh remove alice正在创建用户实例: alice
网关端口: 18801
桥接端口: 18802
Caddy 配置已生成
Caddy 配置已重载
用户实例创建成功!
用户目录: /opt/openclaw/users/alice
令牌: 9139b224...
访问地址: https://openclaw.yourdomain.com/alice/
直连地址: http://127.0.0.1:18801/
启动命令: manage.sh start alice
- 浏览器访问
https://your-domain.com/alice/ - 自动跳转到登录页面
- 输入用户名和令牌(Gateway Token)
- 登录成功后自动跳转到用户的 OpenClaw 控制台
- Token 和 WebSocket URL 自动填充,无需手动配置
绕过认证,直接访问容器端口(仅限本机):
http://127.0.0.1:18801/
每个用户占用 2 个端口,从 18801 开始:
| 用户序号 | 网关端口(HTTP/WS) | 桥接端口(CLI) |
|---|---|---|
| 第 1 个 | 18801 | 18802 |
| 第 2 个 | 18803 | 18804 |
| 第 3 个 | 18805 | 18806 |
| ... | +2 | +1 |
/opt/openclaw/ # 主安装目录
├── manage.sh # 管理脚本
├── openclaw.default.json # 配置模板
├── .env # 域名配置
└── users/ # 用户数据
└── <username>/
├── .env # 令牌和端口
├── docker-compose.yml # 容器编排
└── data/
├── .openclaw/
│ ├── openclaw.json # 用户配置
│ ├── agents/ # Agent 会话
│ └── cron/ # 定时任务
└── workspace/ # 工作区文件
/opt/openclaw-auth/ # 认证服务
├── auth-server.py # Flask 应用
└── venv/ # Python 虚拟环境
/etc/caddy/
├── Caddyfile # 主配置
└── sites/ # 用户配置片段
├── alice.caddy # (manage.sh 自动生成)
└── bob.caddy
请求 → Caddy → forward_auth → auth-server(/auth/verify)
│ │
│ 401(未登录) │ 200(已登录)
▼ ▼
302 → /auth/login 放行到后端容器
│
用户输入令牌
│
验证通过 → 302 → /{username}/?token=XXX&gatewayUrl=wss://...
(前端自动填充认证信息)
- Session 存储: Redis(7 天 TTL)
- Cookie: HttpOnly + Secure + SameSite=Lax
- 频率限制: 10 次失败后锁定 15 分钟
- 令牌比较: 使用
hmac.compare_digest防止时序攻击 - WebSocket 兼容: forward_auth 子请求自动剥离 Upgrade 头
# 查看认证服务状态
systemctl status openclaw-auth
# 查看认证日志
journalctl -u openclaw-auth -f
# 重启认证服务
systemctl restart openclaw-auth
# 健康检查
curl http://localhost:8080/health默认配置模板定义了可用的 AI 模型。安装后用户可通过 OpenClaw 控制台自行修改:
vim /opt/openclaw/users/alice/data/.openclaw/openclaw.json
/opt/openclaw/manage.sh restart aliceCaddy 使用自动 HTTPS(Let's Encrypt)。域名的 DNS 需要正确指向服务器。
- WebSocket: Caddy 原生支持 WebSocket 代理,无需手动设置 Upgrade 头
- forward_auth + WebSocket: 认证子请求需剥离 WebSocket 头(已在模板中配置)
- 容器内端口: 所有容器内部统一使用 18789(gateway)和 18790(bridge)
tar -czf alice-backup.tar.gz /opt/openclaw/users/alice/data/tar -xzf alice-backup.tar.gz -C /
chown -R 1000:1000 /opt/openclaw/users/alice/data/
/opt/openclaw/manage.sh restart alice# 启动所有用户
for user in /opt/openclaw/users/*/; do
/opt/openclaw/manage.sh start "$(basename "$user")"
done
# 停止所有用户
for user in /opt/openclaw/users/*/; do
/opt/openclaw/manage.sh stop "$(basename "$user")"
done# 查看错误日志
/opt/openclaw/manage.sh logs <username>
# 常见原因:
# 1. openclaw.json 配置有误 → 检查 JSON 语法
# 2. 端口冲突 → ss -tlnp | grep 188
# 3. 权限问题 → chown -R 1000:1000 /opt/openclaw/users/<username>/data/
# 4. 插件引用不存在 → 检查 openclaw.json 中的 plugins/skills 配置# 检查 Caddy 访问日志
tail -f /var/log/caddy/openclaw-access.log | python3 -c "
import sys, json
for line in sys.stdin:
d = json.loads(line)
req = d.get('request',{})
print(f'{req.get(\"method\")} {req.get(\"uri\")} -> {d.get(\"status\")}')
"
# 检查容器是否收到请求
docker logs --tail 20 openclaw-<username>
# 可能原因:
# 1. allowedOrigins 不包含访问域名 → 检查 openclaw.json
# 2. forward_auth 向认证服务传了 WebSocket 头 → 检查 Caddyfile 中的 header_up 配置
# 3. Cookie 未携带 → 检查浏览器 DevTools# 检查认证服务日志
journalctl -u openclaw-auth --since "5 minutes ago"
# 常见原因:认证服务版本不一致(代码更新后未重启)
systemctl restart openclaw-authopenclaw-multiuser/
├── README.md # 本文档
├── .env.example # 全局配置模板
├── manage.sh # 用户管理脚本
├── openclaw.default.json # OpenClaw 用户配置模板
├── Dockerfile # Docker 镜像构建文件
├── install.sh # 一键安装脚本
├── auth/
│ ├── auth-server.py # Flask 认证服务
│ └── requirements.txt # Python 依赖
├── caddy/
│ ├── Caddyfile.template # Caddy 配置模板
│ └── sites/
│ └── example.caddy # 用户配置示例
└── systemd/
└── openclaw-auth.service # systemd 服务配置模板