写在前面:
🟡 快速体验 & 项目反馈 欢迎大家下载并体验我们最新版本的 OpenChat,亲自感受本地多模型调度与智能助手融合的强大能力。
🌐 官方主页:欢迎访问 OpenChat 官方网站,了解更多关于我们的团队愿景、产品动态与最新公告
🧩 项目地址:访问 OpenChat github 主页 | 访问 OpenChat gitee 主页
🔗 下载应用:点击下载OpenChat最新版本
我们非常期待您的宝贵反馈,无论是功能建议、使用体验,还是 Bug 报告,都将是我们持续优化的重要动力。
在运维和开发的世界里,我们经常会遇到这样的尴尬场景:
“嘿,张三,你的 Node.js 进程怎么把服务器内存占满了?我的服务挂了!”
“李四,你的配置文件怎么把我的覆盖了?!”
“王五,你要开哪个端口?别跟别的服务冲突了……”
当团队里有多个人需要使用同一个工具(比如 OpenClaw 网关)时,传统的部署方式往往让人头疼:要么给每个人起一个 Docker 容器(资源浪费严重,维护成本高),要么就在宿主机上混跑(隔离性差,牵一发而动全身)。
有没有一种既省资源、隔离性又好、管理还特别方便的折中方案呢?
答案是肯定的。今天,我就毫无保留地分享一套**“单容器多用户”**的 OpenClaw 部署架构方案。这套方案是我们经过实战检验的,不仅能有效节省服务器资源,还能通过严密的隔离机制,让每个用户都拥有独立、安全的“小天地”。
不仅如此,我还为你准备了一个强大的管理脚本(CLI) ,让你管理用户就像打 10086 一样简单。
话不多说,全是干货,我们直接开始!
💡 核心架构:一图胜千言
首先,我们来看看这套架构的长相。核心理念是:在一个 Docker 容器内,通过 Linux 原生的用户机制和进程管理工具(Supervisor),实现多用户的共存与隔离。
部署架构图
Plaintext
┌──────────────────── Docker 容器 (openclaw-multiuser) ───────────────┐
│ │
│ Supervisor / systemd (容器内总管,负责所有用户进程的启停和监控) │
│ │ │
│ ├─► 用户 tech_zhang (UID 10001) ─── 应用独立 HOME 目录 ─── node dist/index.js gateway --port 18789 │
│ │ │
│ ├─► 用户 tech_li (UID 10002) ─── 应用独立 HOME 目录 ─── node dist/index.js gateway --port 18809 │
│ │ │
│ └─► 用户 ops_wang (UID 10003) ─── 应用独立 HOME 目录 ─── node dist/index.js gateway --port 18829 │
│ │
└───────────────────────────────────┬─────────────────────────────────┘
│
├─ 端口映射: 18789→18789, 18809→18809, ... (按需暴露)
└─ 卷挂载: /data → 主机持久化存储 (保证数据不丢失)
为什么这套方案很“香”?
通过上面的架构,我们实现了:
| 特性 | 方案优势 |
|---|---|
| 多用户支持 | ✓ 完美支持,每个用户拥有独立的身份。 |
| 容器数量 | 仅需 1 个,极大地减少了 Docker 容器管理的开销。 |
| 镜像存储 | 共享镜像,不需要为每个用户构建单独的镜像。 |
| 内存开销 | 共享基础设施(操作系统内核、Node.js 运行时),资源利用率极高。 |
| 启动速度 | 快,只需在容器内创建一个用户并启动进程。 |
| 依赖更新 | 更新一次,所有用户的应用基础环境同步更新。 |
🔒 四重隔离:让每个用户都感觉在“独占”服务器
你可能会问:“混在一个容器里,安全吗?”这正是我们要重点解决的问题。我们构建了四重隔离机制,确保用户之间互不干扰。
1. 文件系统隔离:不仅分家,还锁门
- 独立用户: 每个用户对应容器内一个独立的 Linux 用户(UID 10000+)。
- 独立 HOME: 每个用户拥有自己的
/home/<username>/.openclaw/目录。 - 严密的权限: 配置文件权限设为
600(仅用户自己可读写),工作区权限755。利用 Linux 内核强制的权限机制,张三绝对进不去李四的家。
2. 进程隔离:各跑各的,互不相干
- Supervisor 管理: 我们使用 Supervisor 来管理所有用户的 Node.js 网关进程。
- 身份运行: 最关键的是,Supervisor 被配置为以特定用户的身份(
user=<username>)来运行其进程。这意味着,即便 Node.js 进程出了安全漏洞,攻击者也只能拿到该用户的权限,无法越权访问其他用户的数据或系统核心文件。
3. 网络隔离:端口不“撞车”
- 独立端口范围: 我们为每个用户分配了独立的端口范围(例如,每个用户 20 个端口)。
- 计算规则:
BASE_PORT + (用户序号 * 20)。 - 容量: 这套配置默认支持 50 个用户(端口范围 18789-19789),完全满足中小型团队的需求。
4. 资源配额 (cgroup v2):不让任何人“吃独食”
这是最核心的一环,防止某个用户的进程疯狂抢占系统资源。
- CPU 配额: 默认限制(例如,每个用户 1 核心)。
- 内存限制: 默认限制(例如,每个用户 2GB)。
- 进程/文件描述符限制: 限制最大进程数(256)和 ulimit,防止 Fork 炸弹。
⚠️ 注意: 资源配额需要 cgroup v2 支持,且容器需要开启特权模式(
privileged: true)。我们的配置中已经包含了相关设置。
🛠️ 项目文件结构:井井有条
清晰的文件结构是项目成功的关键。以下是我们精心设计的目录结构:
Plaintext
docker-multiuser/
├── Dockerfile.multiuser # 多用户容器镜像构建文件
├── docker-compose.multiuser.yml # Docker Compose 一键启动配置
├── .env.example # 环境变量示例文件
├── bin/
│ └── openclaw-mgr # ★ 主机端:管理 CLI 脚本(你的瑞士军刀)
├── config/
│ ├── supervisord.conf # Supervisor 主配置文件
│ └── user-template.conf # 用户 Supervisor 配置模板
├── scripts/ # 容器内使用的辅助脚本
│ ├── create-user.sh # 创建用户及环境
│ ├── start-gateway.sh # 启动网关进程
│ ├── setup-quota.sh # 配置 cgroup 资源限制
│ └── healthcheck.sh # 健康检查脚本
└── docs/
└── README.md # 详细的部署和使用文档
🚀 快速实战:5 分钟搭建完毕
说了这么多,我们来动手操作一下。保证简单,只需四步。
Step 1: 准备环境
Bash
# 1. 进入项目目录
cd docker-multiuser
# 2. 准备环境变量文件
cp .env.example .env
# 3. (可选) 编辑 .env 文件,按需调整基础端口等配置
nano .env
Step 2: 构建和启动容器
Bash
# 使用 Docker Compose 构建镜像并后台启动
docker compose -f docker-compose.multiuser.yml build
docker compose -f docker-compose.multiuser.yml up -d
Step 3: 创建你的第一个用户
这里就要用到我们强大的 bin/openclaw-mgr 脚本了。
Bash
# 1. 赋予管理脚本执行权限
chmod +x bin/openclaw-mgr
# 2. 创建一个名为 tech_zhang 的用户,真实姓名叫“张三”
./bin/openclaw-mgr create tech_zhang "张三"
脚本会自动完成以下工作:
- 进入容器。
- 创建 Linux 用户
tech_zhang。 - 生成随机 Token。
- 配置 Supervisor 进程。
- 启动网关。
- 最后,它会把访问 URL 和 Token 打印给你。
Step 4: 访问网关
打开浏览器,访问脚本输出的 URL(例如):
http://YOUR_HOST:18789/?token=生成的随机Token
大功告成! 你现在拥有了一个独立、安全的 OpenClaw 网关环境。
🎮 管理员手册:像打地鼠一样管理用户
为了让你真正拉近与这套系统的距离,摆脱繁琐的 Docker 命令,我们把所有常用的管理操作都封装到了 ./bin/openclaw-mgr 脚本中。
用户管理
| 操作 | 命令 | 说明 |
|---|---|---|
| 创建用户 | ./bin/openclaw-mgr create <username> [realname] | 创建用户、生成 Token、启动网关。 |
| 删除用户 | ./bin/openclaw-mgr delete <username> --confirm | 彻底删除用户及其数据(需确认)。 |
| 列出用户 | ./bin/openclaw-mgr list | 查看所有用户及其状态。 |
| 查看信息 | ./bin/openclaw-mgr info <username> | 查看用户的端口、Token、状态等。 |
进程控制
| 操作 | 命令 |
|---|---|
| 启动网关 | ./bin/openclaw-mgr start <username> |
| 停止网关 | ./bin/openclaw-mgr stop <username> |
| 重启网关 | ./bin/openclaw-mgr restart <username> |
| 查看状态 | ./bin/openclaw-mgr status [username] |
监控和调试
| 操作 | 命令 | 说明 |
|---|---|---|
| 查看日志 | ./bin/openclaw-mgr logs <username> [-f] | 实时查看某个用户的网关日志。 |
| 进入环境 | ./bin/openclaw-mgr shell <username> | 强烈推荐! 以该用户身份进入其独立的 Shell 环境,方便调试。 |
| 资源统计 | ./bin/openclaw-mgr stats | 查看所有用户进程的 CPU 和内存占用情况。 |
🌟 总结
这套“单容器多用户”的部署方案,完美平衡了资源效率、隔离安全和管理便捷性。它不仅适用于 OpenClaw,其核心思想也可以推广到许多类似的 Node.js 应用部署中。
希望这篇实战指南能帮到你,让你从资源的乱战中解脱出来。如果你在部署过程中遇到任何问题,或者有更好的改进建议,欢迎在评论区留言交流!
动手试一试,你的服务器会感谢你的! 😉