Skip to content

HACK-WU/openclaw-multiuser

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

OpenClaw Multi-User Gateway

基于 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

安装步骤

1. 构建 OpenClaw Docker 镜像

需要 OpenClaw 源码。将源码放到任意目录,然后构建:

cd /path/to/openclaw-source
docker build -t openclaw:local .

或从已有机器导出/导入:

# 导出(源机器)
docker save openclaw:local -o openclaw-local.tar

# 导入(目标机器)
docker load -i openclaw-local.tar

2. 配置项目

cd openclaw-multiuser
cp .env.example .env
vim .env

必须修改:

# 改为你的实际域名
OPENCLAW_DOMAIN=openclaw.yourdomain.com

3. 运行安装脚本

sudo ./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

访问方式

通过登录页面(推荐)

  1. 浏览器访问 https://your-domain.com/alice/
  2. 自动跳转到登录页面
  3. 输入用户名和令牌(Gateway Token)
  4. 登录成功后自动跳转到用户的 OpenClaw 控制台
  5. 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

配置说明

模型配置 (openclaw.default.json)

默认配置模板定义了可用的 AI 模型。安装后用户可通过 OpenClaw 控制台自行修改:

vim /opt/openclaw/users/alice/data/.openclaw/openclaw.json
/opt/openclaw/manage.sh restart alice

Caddy 配置

Caddy 使用自动 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

故障排查

容器状态为 restarting

# 查看错误日志
/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 配置

WebSocket 连接失败

# 检查 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

登录页面返回 400

# 检查认证服务日志
journalctl -u openclaw-auth --since "5 minutes ago"

# 常见原因:认证服务版本不一致(代码更新后未重启)
systemctl restart openclaw-auth

项目文件说明

openclaw-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 服务配置模板

About

基于 Docker 的 OpenClaw 多用户管理方案。通过 Caddy 反向代理实现路径隔离,集成 Flask + Redis 认证服务,支持用户创建/删除/重启等生命周期管理,一键部署。

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors