MultiUserClaw
目前OpenClaw和NanoBot都是用于个人的,不太支持多用户,基于多用户重新修改Bot,没有对Openclaw进行任何更改,原生能力封装
Install / Use
/learn @johnson7788/MultiUserClawREADME
MultiUserClaw - 多用户 AI Sass OpenClaw平台。
基于Openclaw(其它分支有nanobot)改造的轻量级 AI 助手框架,可以很快打造商用Sass平台,支持多租户隔离部署、多平台渠道接入、工具调用、定时任务和 Web 实时通信。
在线体验地址,可以直接注册一个账号即可使用, https://ai.infox-med.com:13080/
🔔:simple_web分支是简单的单用户的Web界面。如果单用户的页面测试使用,可以使用simple_web分支。
🔔:nanobot014分支是nanobot的0.1.4版本
🔔:nanobot014v3分支是nanobot的0.1.4 post v3版本
🔔:openclaw_oldfrontend分支是基于openclaw版本的旧版本前端, 🦞 OpenClaw 2026.3.3 (eae1484)
🔔:当前的main分支是的Openclaw的版本:🦞 OpenClaw 2026.3.24
原理:
- 新增platform作为控制容器的网关,每个用户单独创建容器进行管理。
- frontend前端页面进行显示,调用platform进行交互, platform调用openclaw bridge对openclaw进行控制。
- openclaw目录就是官方的openclaw,新建了1个openclaw/bridge作为中间层,对openclaw的控制。
- 所以一共分有前端容器,platform容器,openclaw容器(包括bridge被platform控制,和控制openclaw)
- 如果要升级openclaw,只需要替换openclaw整个目录,注意保留bridge目录,运行upgrade_openclaw.py文件。
- 3月18日更新openclaw.json默认配置Agent2Agent模式,远程Terminal连接容器,对话完成的提示
更新:
- 容器的端口信息显示
- 可以直接下载目录了
- 分离代码: frontend/src/components/Brand.tsx 单独设置Logo和简介信息
- 离线部署脚本offline_deploy.py
- 对话框中的slash,斜杠命令添加, 显示会话时,和哪个Agent的对话,回答需要刷新才能显示完整的多轮回答的Bug
- 升级openclaw为0324版本和会话重命名
- Openbrowser的浏览器支持,Agent的状态显示,Minmax也加到环境变量里面,微信二维码显示需要更好的字体和间距
- simple_front 简化版本前端,只保留对话,微信扫码连接
目录
- 功能特性
- 界面预览
- 运行流程概览
- 多租户部署(Docker Compose)
- 单用户本地运行
- 整体架构
- 核心组件详解
- 安全设计
- 前端
- deploy_copy — 预置 Agent 与技能
- 文件索引
- API 调用示例
功能特性
本平台是一个功能丰富的多租户 AI 助手平台,支持以下核心功能:
🤖 AI Agent 管理
- 创建、配置和管理多个 AI Agents
- 每个 Agent 独立的对话上下文
- Agent 身份设置(名称、Emoji 图标)
- Agent 详情查看和删除
💬 智能对话
- WebSocket 实时通信
- Markdown 消息渲染(支持代码高亮)
- 斜杠命令自动补全
- 多会话管理
- 语音输入支持
- 文件/图片上传发送
⏰ 定时任务 (Cron Jobs)
- 固定间隔执行
- Cron 表达式调度
- 单次定时执行
- 任务启用/禁用
- 手动立即执行
- 执行结果通知(可选发送到渠道)
📚 知识库
- 每个 Agent 独立的知识库目录
- 支持上传文档、PDF、图片、数据文件
- 文件夹创建和管理
- 文件预览(支持文本、代码、JSON 等)
- 文件下载和删除
⚡ 技能商店 (Skills)
- 搜索和安装来自 skills.sh 的 AI 技能
- 技能启用/禁用
- 内置技能 + 用户自定义技能
🔌 多渠道支持
- Telegram
- Discord
- Email (SMTP)
- WhatsApp Web
- Signal
- Slack
- iMessage
- 其他扩展渠道
- 配置文档: https://my.feishu.cn/wiki/KfTlwurh7ix0PHkQmHic2L0Snue
🔑 API 访问
- API Token 生成和管理
- 支持命令行调用 Agent
- 会话复用
- 外部系统集成
🧠 多模型支持
| 提供商 | 模型示例 | |--------|---------| | DashScope | qwen3-coder-plus, qwen-turbo | | Anthropic | claude-sonnet-4-5, claude-opus-4-5 | | OpenAI | gpt-4o, gpt-4o-mini, o3-mini | | DeepSeek | deepseek-chat, deepseek-reasoner | | AiHubMix | aihubmix/模型名 | | OpenRouter | openrouter/任意模型(兜底) |
📊 仪表盘
- Agent 总数统计
- 会话总数统计
- 技能总数统计
- Agent 状态概览
📁 文件管理
- 工作空间文件浏览
- 文件上传/下载
- 目录创建/删除
⚙️ 系统管理
- 用户管理
- 渠道配置
- AI 模型配置
- 审计日志
- 系统设置
🏢 多租户隔离
- 每个用户独立 Docker 容器
- 容器级资源隔离(2GB RAM, 4 CPU)
- 按需创建,空闲自动暂停
- 数据完全隔离
界面示例截图
多个用户的聊天页面和它们独自隔离的容器环境

交互式创建skills

管理自己的skills


一键修复用户的容器配置修改错误

1. 运行流程概览
本项目的核心思路:用 OpenClaw 替代原来的 nanobot 作为每个用户的 AI Agent 运行时,通过一个 Bridge 适配层将 OpenClaw 接入到平台的多租户体系中。
1.1 一条消息的完整旅程
用户在浏览器输入消息
|
v
[Frontend] Vite+React (端口 3080)
| WebSocket 连接
v
[Platform Gateway] FastAPI (端口 8080) --对应platform目录和项目
| 1. JWT 认证
| 2. 查找/启动用户容器
| 3. WebSocket 代理
v
[用户容器] — 每个用户一个独立 Docker 容器
|
| 容器内部结构:
| ┌─────────────────────────────────────────┐
| │ Bridge (Node.js, 端口 18080) │
| │ - HTTP API 服务器 │
| │ - WebSocket 中继 │
| │ | │
| │ v │
| │ OpenClaw Gateway (端口 18789, loopback) │
| │ - Agent 处理引擎 │
| │ - 工具调用 (bash/文件/搜索等) │
| │ - Skills 系统 │
| │ - Session 管理 │
| └─────────────────────────────────────────┘
|
| Agent 需要调用 LLM 时:
v
[Platform Gateway] /llm/v1/chat/completions
| 1. 验证容器 Token
| 2. 检查用户配额
| 3. 根据模型名匹配 Provider
| 4. 注入真实 API Key
v
[LLM 提供商] (Anthropic / OpenAI / DashScope / DeepSeek / ...)
|
| 响应沿原路返回
v
用户在浏览器看到回复
核心转发Openclaw的API的流程
1. Frontend (前端)
- 运行在 3080 端口
- Vite 配置将 /api 代理到 http://localhost:8080(gateway)
2. Gateway / Platform (平台后端)
- 运行在 8080 端口,由 ./platform 构建
- 处理认证、用户管理、数据库
- 对于 /api/openclaw/* 路径,通过 platform/app/routes/proxy.py 反向代理到用户的 OpenClaw 容器
3. OpenClaw Bridge (用户容器内)
- 每个用户有独立的 Docker 容器
- Bridge 服务运行在 18080 端口(WebSocket)和 8080 端口(HTTP API)
- 提供 agents、sessions、skills、cron 等功能
1.2 关键设计决策
| 决策 | 说明 | |------|------| | OpenClaw 作为 Agent 核心 | 替代原有 nanobot Python Agent,使用 OpenClaw(TypeScript/Node.js)作为每个用户的 AI 运行时,功能更强大 | | Bridge 适配层 | 在 OpenClaw 外包装一层 Bridge,提供 HTTP API + WS 中继,适配平台的多租户管理 | | API Key 不进容器 | 所有 LLM API Key 只存在于 Gateway 环境变量中,容器通过 Token 代理访问 | | 容器级隔离 | 每个用户独立容器、独立 Volume,互不干扰 | | 按需创建 | 用户首次聊天时才创建容器,空闲 30 分钟暂停,30 天归档 |
2. 多租户部署(Docker Compose)
2.1 架构
浏览器 --> frontend:3080 --(JS请求)--> gateway(platform):8080 --> 用户容器(openclaw)
| |
postgres:5432 gateway/llm/v1
(用户/配额) (注入API Key)
|
实际 LLM 提供商
- Frontend:Vite + React Web 界面,用户注册、登录、聊天
- Gateway:平台网关(Python FastAPI),负责认证、用户容器管理、LLM 代理、配额控制
- 用户容器:每个用户一个独立的 OpenClaw 实例(通过 Bridge 启动),自动创建,数据隔离
- PostgreSQL:存储用户账户、容器元数据、用量记录
2.2 前置条件
- Docker & Docker Compose
- 至少一个 LLM 提供商的 API Key
2.3 配置 .env 文件
在项目根目录创建 .env 文件,填入你的 API Key 和配置:
# .env — docker compose 自动读取此文件
# ========== 必填:至少配置一个 LLM 提供商 ==========
# 阿里 DashScope(通义千问系列)
DASHSCOPE_API_KEY=sk-xxxxxxxxxxxx
# Anthropic(Claude 系列)
ANTHROPIC_API_KEY=sk-ant-xxxxxxxxxxxx
# OpenAI(GPT 系列)
OPENAI_API_KEY=sk-xxxxxxxxxxxx
# DeepSeek
DEEPSEEK_API_KEY=sk-xxxxxxxxxxxx
# OpenRouter(支持路由到任意模型,作为兜底)
OPENROUTER_API_KEY=sk-or-xxxxxxxxxxxx
# AiHubMix
AIHUBMIX_API_KEY=sk-xxxxxxxxxxxx
# ========== 可选配置 ==========
# 默认模型(新用户容器使用此模型)
DEFAULT_MODEL=dashscope/qwen3-coder-plus
# JWT 密钥(生产环境务必修改)
JWT_SECRET=your-secure-random-string
2.4 支持的模型
配置对应的 API Key 后,用户可以使用以下模型:
| 提供商 | 模型示例 | .env 变量 |
|--------|---------|-------------|
| DashScope | dashscope/qwen3-coder-plus, dashscope/qwen-turbo | DASHSCOPE_API_KEY |
| Anthropic | claude-sonnet-4-5, claude-opus-4-5 | ANTHROPIC_API_KEY |
| OpenAI | gpt-4o, gpt-4o-mini, o3-mini | OPENAI_API_KEY |
| DeepSeek | deepseek/deepseek-chat, deepseek/deepseek-reasoner | DEEPSEEK_API_KEY |
| AiHubMix | aihubmix/模型名 | AIHUBMIX_API_KEY |
| OpenRouter | openrouter/任意模型(兜底) | OPENROUTER_API_KEY |
Gateway 根据模型名自动匹配提供商并注入对应的 API Key,用户容器内不存储任何密钥。
2.5 构建与启动
方式1:一键部署脚本
# 准备环境(检查 Docker、下载镜像等)
python prepare.py
# === Docker 部署(推荐) ===
# 本地 Docker 部署(localhost 访问)
python deploy_docker.py
# 重新构建指定服务
python deploy_docker.py --rebuild openclaw,gateway,frontend
# 仅重建某个服务
python deploy_docker.py --rebuild frontend
# 仅构建镜像不启动
python deploy_docker.py --build-only
# 完全清理重建,删除部署的数据
python deploy_docker.py --clean
# === 本地开发模式 ===
# 启动所有本地服务(postgres + bridge + gateway + frontend dev server)
python start_local.py
# 停止所有服务
python start_local.py --stop
# 检查服务状态
python check_status.py
提示:换网不需要重新 build 前端。前端使用相对路径
/api/...,由 nginx 反代转发,与 IP 无关。
本地测试启动后:
本地开发环境已启动
PostgreSQL http://127.0.0.1:5432 (存储用户表信息,参考doc/table.md)
OpenClaw Bridge http://127.0.0.1:18080 (每个用户容器启动时都会创建,用于控制openclaw)
Platform Gateway http://127.0.0.1:8080 # 控制openclaw的网关
Frontend Dev http://127.0.0.1:3080 #用户使用界面
Manage Admin http://127.0.0.1:3081 #管理界面
方式2:手动启动
-
PostgreSQL (端口 5432)
启动 Docker 容器
docker run -d
--name openclaw-local-postgres
-e POSTGRES_USER=nanobot
-e POSTGRES_PASSWORD=nanobot
-e POSTGRES_DB=nanobot_platform
-v openclaw-local-pgdata:/var/lib/postgresql/data
-p 5432:5432
postgres:16-alpine
- OpenClaw Bridge (端口 18080)
cd openclaw
方式一:使用 tsx(推荐)
tsx bridge/start.ts
方式二:使用 npx
npx tsx bridge/start.ts
方式三:使用编译后的 JS
node bridge/dist/start.js
- Platform Gateway (端口 8080)
cd platform
设置必要的环境变量
export PLATFORM_DATABASE_URL="postgresql+asyncpg://nanobot:nanobot@localhost:5432/nanobot_platform" export PLATFORM_DEV_OPENCLAW_URL="http://127.0.0.1:18080" export PLATFORM_DEV_GATEWAY_URL="ws://127.0.0.1:18789"
启动 uvicorn
python -m uvicorn app.main:app --host 0.0.0.0 --port 8080 --reload
注意:从项目根目录 .env 文件读取 _API_KEY、_API_BASE、JWT_SECRET、DEFAULT_MODEL 等配置。
- Frontend Dev Server (端口 3080)
cd frontend
安装依赖(首次)
npm install
启动开发服务器
VITE_API_URL=http://127.0.0.1:8080 npm run dev
快速启动单个服务
你也可以用脚本指定只启动某个服务:
✦ # 只启动 bridge python start_local.py --only bridge
启动 gateway + frontend,跳过 db
python start_local.py --skip db,gateway
停止所有服务
python start_local.py --stop
容器方式手动启动
# 1. 构建 openclaw 基础镜像(包含 openclaw + bridge)
docker build -f openclaw/Dockerfile.bridge -t openclaw:latest openclaw/
# 2. 构建并启动所有服务
docker compose up -d --build
# 查看日志
docker compose logs -f
注意:前端使用相对路径
/api/...访问后端,由 nginx 反代到 gateway 容器。 换网或更换 IP 不需要重新 build 前端。
2.6 使用
- 打开浏览器访问 `http://local
