1. 项目概述:一个网关,两个AI助手
如果你和我一样,既想拥有一个私密的、功能强大的AI助手,又想在Discord服务器里部署一个对外的、可控的公共AI客服,同时还不希望维护两套独立的系统,那么这个基于OpenClaw的多智能体Discord部署方案,可能就是你在找的答案。
简单来说,这是一个生产级的参考架构,它让你能在一台服务器、一个OpenClaw网关上,同时运行两个独立的AI智能体,并通过两个不同的Discord机器人账号与它们交互。一个机器人是你的“私人秘书”,拥有完整的系统权限和记忆能力,只响应你;另一个则是“公共客服”,权限受限、行为可控,服务于整个Discord群组。整个方案通过Docker容器化部署,配置清晰,并且深度集成了Claude Code,让你能像管理本地代码仓库一样,通过AI来远程管理和维护你的服务器实例。这不仅仅是把两个机器人绑在一起,更是一套关于权限隔离、资源分配和高效运维的完整实践。
2. 核心架构与设计思路拆解
2.1 为什么选择“单网关,多智能体”架构?
在AI助手领域,一个常见的需求是角色分离。你肯定不希望一个在公共频道里插科打诨、回答简单问题的AI,拥有执行rm -rf /的Shell权限,或者能访问你的私人日程和邮件。传统的做法可能是部署两个完全独立的OpenClaw实例,但这意味着双倍的资源消耗(内存、CPU)、双倍的配置维护工作,以及更复杂的网络和监控体系。
本方案的核心设计思想是逻辑隔离而非物理隔离。OpenClaw网关本身支持多智能体绑定,我们可以利用这一点,在同一个运行时内创建两个具有完全不同配置、权限和记忆空间的智能体。它们共享底层的模型调用、工具加载等基础设施,但在应用层是完全独立的。这样做的好处显而易见:
- 资源高效:共享模型连接池、共享内存缓存,显著降低总体开销。
- 管理统一:一个Docker Compose文件,一套日志系统,一次版本更新搞定所有。
- 配置清晰:所有智能体的差异都集中体现在一个
openclaw.json配置文件中,一目了然。
2.2 智能体职责与权限边界设计
架构的成功关键在于清晰的职责划分和严格的权限边界。本方案定义了两种智能体角色:
主智能体 (Agent:main)
- 定位:私人全能助手。
- 服务对象:仅限服务器所有者(通过Discord User ID白名单控制)。
- 权限:拥有完整的Shell访问权限,可以执行命令、读写文件、安装软件。
- 记忆:启用持久化记忆,通过
MEMORY.md文件记录与用户的长期对话历史和关键信息,实现上下文延续。 - 通信范围:仅限与私有Discord机器人的私信(DM)通道。确保对话的绝对私密性。
公共智能体 (Agent:public)
- 定位:群组公共客服/娱乐机器人。
- 服务对象:Discord服务器内所有成员(可进一步通过频道白名单细化)。
- 权限:严格受限。禁止执行Shell命令(
bash,exec等),仅能使用安全的预定义工具,如网页搜索、信息查询等。 - 记忆:无状态。每次对话都是新鲜的,不保留上下文到下一次交互。这是防止公共对话信息泄露或产生不可控累积效应的关键。
- 通信范围:指定的公共文本频道。通常需要@提及才会响应(
requireMention: true),避免刷屏。
这个设计模式的核心在于bindings配置。在openclaw.json中,我们会将两个不同的Discord机器人令牌(Token)分别绑定到main和public智能体。OpenClaw网关会根据接收到的消息来自哪个Bot Token,自动将消息路由到对应的智能体进行处理,实现了完美的流量隔离。
注意:这意味着你需要创建两个独立的Discord Application,获取两个Bot Token。千万不要用一个Token绑定两个智能体,那将完全破坏隔离性。
2.3 技术栈选型与工具链整合
这个方案不是空中楼阁,它紧密集成了当下最实用的开发者工具链,形成一个高效闭环:
- OpenClaw:作为智能体运行时框架。选择它是因为其设计简洁、配置驱动,对多智能体和Discord集成的支持原生且强大。
- Docker & Docker Compose:实现环境标准化和一键部署。将OpenClaw、其依赖以及我们的自定义工具打包成一个可复现的镜像,通过Compose管理容器生命周期和网络。
- VPS (如Hetzner):提供稳定、可控的自托管环境。相比家用NAS,VPS拥有公网IP、更好的可用性和支持Docker的干净系统。
- Claude Code:这是方案的“管理大脑”。我们创建了一套
.claude/skills/,将服务器文件同步、配置编辑、操作记录等流程技能化。你可以直接在本地IDE中,用自然语言指挥Claude Code去安全地修改服务器上的配置文件、同步工作区,实现“AI运维”。 - 辅助工具链:通过自定义Docker镜像,我们可以在基础OpenClaw镜像上预装
gh(GitHub CLI)、gmail-oauth2-tools、google-places等CLI工具,极大扩展了智能体能处理的任务范围。
这套工具链的选择,体现了从部署、运行到日常维护的全流程自动化与AI辅助思想。
3. 从零开始的详细部署指南
3.1 前期准备:Discord与服务器环境
部署的第一步发生在云端控制台和Discord开发者门户。
创建Discord机器人
- 访问 Discord Developer Portal ,点击“New Application”。创建两个应用,分别命名为“MyPrivateAssistant”和“MyPublicBot”。
- 在每个应用的“Bot”页面,点击“Add Bot”。务必为两个机器人分别操作。
- 在Bot设置中:
- 私有机器人:建议关闭“PUBLIC BOT”选项。在“Privileged Gateway Intents”中,根据你的需要开启
MESSAGE CONTENT INTENT(如需读取消息内容)和SERVER MEMBERS INTENT(如需识别用户)。妥善保存生成的Token。 - 公共机器人:同样根据需要开启Intents。保存其Token。
- 私有机器人:建议关闭“PUBLIC BOT”选项。在“Privileged Gateway Intents”中,根据你的需要开启
- 邀请机器人到服务器:在“OAuth2” -> “URL Generator”页面,为两个机器人分别生成邀请链接。所需权限通常包括
Send Messages,Read Message History,Mention Everyone等。用生成的链接将两个机器人都邀请到你的Discord服务器。
配置VPS基础环境假设你使用Ubuntu 22.04 LTS的VPS。
# 1. 更新系统并安装基础依赖 sudo apt update && sudo apt upgrade -y sudo apt install -y curl git # 2. 安装Docker和Docker Compose插件 # 使用官方脚本安装Docker curl -fsSL https://get.docker.com -o get-docker.sh sudo sh get-docker.sh # 将当前用户加入docker组,避免每次都用sudo sudo usermod -aG docker $USER # 登出再登录,或执行以下命令使组生效 newgrp docker # 安装Docker Compose插件 sudo apt install -y docker-compose-plugin # 验证安装 docker --version docker compose version3.2 配置文件解析与定制
这是整个项目的核心,config/openclaw.json模板需要你仔细填充。我们来拆解关键部分。
智能体绑定 (Bindings)
{ "agents": { "main": { "bindings": ["discord:your_private_bot_token_here"] }, "public": { "bindings": ["discord:your_public_bot_token_here"] } } }将之前保存的两个Token分别填入。这就是路由的基石。
Discord配置细化在discord绑定配置块中,有许多精细控制:
"discord": { "accounts": { "your_private_bot_token_here": { "streaming": true, // 是否启用打字机流式输出效果 "dmPolicy": "allow", // 私信策略,对于私有机器人设为allow "groupPolicy": "deny" // 是否允许群组,私有机器人通常deny }, "your_public_bot_token_here": { "streaming": true, "requireMention": true, // 在频道中是否需要@提及才响应 "allowedGuilds": ["your_guild_id_here"], // 允许服务的服务器ID "allowedChannels": ["channel_id_1", "channel_id_2"], // 允许响应的频道ID(可选,更精细) "dmPolicy": "deny", // 公共机器人通常拒绝私信 "groupPolicy": "allow" } } }获取Guild ID和Channel ID:需要在Discord设置中开启“开发者模式”,然后在服务器、频道上右键点击即可复制ID。
模型与技能配置
"model": { "provider": "openai", // 或 anthropic, groq 等 "name": "gpt-4o", "fallbacks": ["gpt-4-turbo-preview", "gpt-3.5-turbo"] // 降级策略 }, "skills": { "loadFrom": ["/app/workspace/.claw/skills"] // 技能加载路径 }模型配置直接关系到智能体的“智力”水平和成本。fallbacks配置非常实用,当主模型因速率限制或故障不可用时,会自动尝试备用模型,保证服务可用性。
3.3 构建自定义Docker镜像与部署
OpenClaw提供了基础镜像,但我们需要添加自己的工具。
创建Dockerfile.custom
# 基于官方镜像 FROM openclaw/openclaw:latest # 切换到root用户安装系统包 USER root # 安装额外工具,例如GitHub CLI, Google Cloud SDK CLI工具等 RUN apt-get update && apt-get install -y \ curl \ gnupg \ && curl -fsSL https://cli.github.com/packages/githubcli-archive-keyring.gpg | dd of=/usr/share/keyrings/githubcli-archive-keyring.gpg \ && echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main" | tee /etc/apt/sources.list.d/github-cli.list > /dev/null \ && apt-get update \ && apt-get install -y gh \ && apt-get clean \ && rm -rf /var/lib/apt/lists/* # 切换回OpenClaw使用的非root用户(通常是`claw`) USER claw这个Dockerfile示例安装了GitHub CLI (gh)。你可以按需添加其他工具,如gmail-oauth2-tools的安装步骤。
配置docker-compose.yml
version: '3.8' services: openclaw: # 构建自定义镜像,而非直接使用latest build: context: . dockerfile: Dockerfile.custom container_name: openclaw-multiagent restart: unless-stopped environment: - NODE_ENV=production volumes: # 挂载配置文件 - ./config/openclaw.json:/app/config/openclaw.json:ro # 挂载工作区目录,持久化记忆和技能 - ./workspace:/app/workspace # 挂载日志目录(可选) - ./logs:/app/logs # 将容器内端口映射到主机(如果需要HTTP API) # ports: # - "3000:3000"关键点在于volumes挂载。将本地的config和workspace目录挂载到容器内,这样你修改本地文件就能直接影响容器运行,并且数据可以持久化。
部署与启动
- 将项目文件(
docker-compose.yml,Dockerfile.custom,config/,templates/等)上传到VPS的某个目录,例如~/openclaw-deploy。 - 在该目录下执行:
如果看到智能体成功连接Discord网关的日志信息,说明部署成功。# 构建并启动服务 docker compose up -d --build # 查看日志,确认启动无误 docker compose logs -f openclaw
4. 工作区文件与智能体人格塑造
部署完成后,智能体还只是一个空壳。我们需要通过工作区文件来赋予它们“人格”、规则和能力。这些文件位于挂载的workspace目录下,每个智能体可以有自己独立的工作区,本方案通过配置指定了共享或独立的路径。
4.1 核心工作区文件详解
SOUL.md/SOUL.public.md(灵魂/人格文件)- 作用:定义智能体的核心身份、性格、说话风格和价值观。这是塑造其“人设”的关键。
- 私有助手示例:“你是Alex的私人数字助理,名叫Clio。你专业、高效、细致,并且极度忠诚。你的目标是理解并优先满足Alex的每一个请求...”
- 公共客服示例:“你是‘TechHub’社区的官方助手,名叫Spark。你热情、乐于助人、幽默,但始终保持专业。你的职责是解答关于编程、项目和技术讨论的问题...”
- 实操心得:人格描述要具体,避免空洞的“乐于助人”。可以加入“你讨厌冗长的解释,喜欢用比喻和代码示例”、“你会在确认复杂操作前,先简述步骤并请求最终确认”等行为指令,使其更具象。
AGENTS.md/AGENTS.public.md(行为规则文件)- 作用:定义智能体的具体行为规则、限制和操作流程。这是其“操作手册”。
- 内容:
- 权限边界:明确写出“你绝对不能执行删除根目录、格式化磁盘等危险命令”。
- 响应格式:“代码块必须标注语言类型”、“提供链接时,请同时说明链接内容”。
- 隐私规则:“你绝不能透露与主智能体的任何对话历史”、“对于用户个人信息,需模糊处理”。
- 工具使用规范:“使用
gh命令前,需先确认操作的目标仓库和分支”。
TOOLS.md(工具清单文件)- 作用:向智能体说明环境中可用的工具及其用法。这能有效提升工具使用的准确率。
- 内容:列出通过Dockerfile安装的所有CLI工具(如
gh,gmail工具等),并给出常用命令示例。例如:“gh pr create --title \"Fix bug\" --body \"Details\"用于创建Pull Request。”
MEMORY.md(仅限私有助手)- 作用:存储智能体与用户的长期记忆、重要事实、待办事项和偏好。
- 格式:建议采用简单的Markdown列表或键值对。例如:
## 用户偏好 - 喜欢用Python解决问题。 - 每周三下午有团队会议。 ## 项目上下文 - [项目A] 正在使用FastAPI和PostgreSQL,部署在AWS ECS。 - [项目B] 的Git仓库地址是 https://github.com/username/project-b。 ## 待办事项 - [ ] 提醒Alex在周五前审查PR #123。 - 重要提示:智能体可以读写此文件。务必在
AGENTS.md中设定规则,防止它误删或混乱格式化记忆文件。定期备份此文件是明智之举。
4.2 利用Claude Code进行远程管理
这是本方案最具创新性的运维部分。你不需要总是SSH到服务器去修改配置。
- 技能加载:将项目中的
.claude/skills/目录复制到你的本地项目根目录。当你用Claude Code打开这个项目时,这些技能就会被加载。 - 建立SSH隧道:在本地,通过SSH隧道将远程服务器的工作区目录映射到本地的一个路径。这让你感觉像是在编辑本地文件,实则修改的是服务器文件。
# 在本地终端执行 ssh -N -L ./local_workspace:/home/user/openclaw-deploy/workspace user@your_vps_ip - 使用技能:
sync技能:在Claude Code中,你可以说“同步服务器工作区到Git仓库”。技能会先比较差异,让你确认后再执行,防止覆盖未提交的更改。edit技能:你可以说“帮我修改公共机器人的SOUL文件,让它更幽默一些”。Claude Code会通过安全协议读取文件,提出修改建议,并在你确认后应用。self-improve技能:在解决一个复杂问题后,你可以触发此技能,它会将本次的解决方案和学到的经验结构化地记录到知识库中,优化未来的操作流程。
注意事项:Claude Code管理依赖于稳定的SSH连接和清晰的文件权限。确保服务器上的
workspace目录对Docker容器用户和你的SSH用户都有正确的读写权限。首次使用sync技能前,务必在本地建立好Git仓库并关联远程。
5. 生产环境运维与问题排查
5.1 日常操作与监控
- 查看日志与状态:
# 实时查看日志 docker compose logs -f openclaw # 查看容器状态和资源占用 docker compose ps docker stats openclaw-multiagent - 重启与更新:
# 修改配置后,重启服务 docker compose restart openclaw # 如果需要重建镜像(如Dockerfile.custom更新) docker compose up -d --build # 更新基础OpenClaw镜像(先更新本地镜像,再重建) docker pull openclaw/openclaw:latest docker compose up -d --build - 成本监控:OpenClaw的日志或相关中间件通常会记录Token使用量。你需要定期分析,特别是当公共机器人活跃度高时。可以编写简单的脚本解析日志,估算API调用成本。
5.2 常见问题与排查技巧
问题1:机器人无响应,日志显示连接Discord失败。
- 排查步骤:
- 检查Token:确认
openclaw.json中的Token是否正确,是否含有多余空格或换行。可以尝试用echo -n "TOKEN" | wc -c检查长度。 - 检查Intents:前往Discord开发者门户,确认Bot所需的Gateway Intents(如
MESSAGE CONTENT INTENT)已正确开启。 - 检查网络:确认VPS可以访问Discord API (
api.discord.com)。可能是防火墙或VPS供应商的网络策略问题。 - 查看详细日志:OpenClaw启动时会有更详细的连接日志。确保没有SSL证书或代理相关错误。
- 检查Token:确认
问题2:公共机器人在频道里响应了不该响应的消息。
- 排查步骤:
- 确认
requireMention:检查openclaw.json中该公共机器人账户的requireMention是否设置为true。 - 检查
allowedChannels:确认你是否配置了allowedChannels,并且ID是否正确。如果此数组为空或未设置,机器人可能会响应所有频道。 - 检查智能体绑定:确保两个Bot Token没有错误地绑定到同一个智能体,或者配置错误导致路由混乱。
- 确认
问题3:私有助手无法执行Shell命令。
- 排查步骤:
- 检查
TOOLS.md:确认文件中说明了Shell是可用的工具。 - 检查
AGENTS.md:确认行为规则中没有过度限制Shell使用。 - 检查Docker权限:虽然不太常见,但需确认Docker容器是否以足够权限运行(在
docker-compose.yml中,我们使用了默认的非root用户claw,对于大多数操作是足够的)。可以尝试在docker-compose.yml中临时将user: root来测试是否是权限问题。
- 检查
问题4:记忆 (MEMORY.md) 没有被保存或读取。
- 排查步骤:
- 检查挂载卷:运行
docker compose exec openclaw ls -la /app/workspace,确认MEMORY.md文件存在且可读写。 - 检查文件路径:确认OpenClaw配置中,智能体的工作区路径指向了正确的挂载目录。
- 检查文件格式:如果文件格式错误(如错误的编码、不完整的Markdown),智能体可能会读取失败。确保它是有效的UTF-8文本文件。
- 检查挂载卷:运行
问题5:Claude Code的sync技能报告冲突。
- 处理流程:这是正常的安全机制。不要强行覆盖。
- 仔细阅读冲突报告,了解服务器版本和本地版本的差异。
- 通过Claude Code的
edit技能,手动合并有意义的更改。 - 或者,通过SSH登录服务器,手动备份服务器上的更改,然后将本地版本推送到服务器,再重新应用服务器上的特定更改。
5.3 安全与备份建议
- 密钥管理:
openclaw.json中的Discord Token和API密钥是最高机密。务必通过.env文件注入环境变量,并在docker-compose.yml中引用,而不是硬编码在JSON文件里。确保.env文件不被提交到Git仓库(已加入.gitignore)。 - 定期备份:定期备份整个
workspace目录,尤其是MEMORY.md。你可以使用cron任务执行docker compose cp命令或直接打包目录到云存储。 - 权限最小化:公共智能体的权限一定要遵循最小化原则。除非绝对必要,否则不开放任何具有写权限或系统访问能力的工具。
- 监控与告警:设置简单的监控,例如用
cron定时检查Docker容器状态,如果宕机则发送通知(可以通过邮件、Telegram Bot等)。
这个架构在我自己的服务器上稳定运行了数月,它完美地平衡了功能、安全与维护成本。最让我满意的是Claude Code集成带来的运维体验提升,让我能像开发一个普通应用一样,用自然语言和版本控制来管理一个复杂的AI智能体系统。如果你在搭建过程中遇到任何本文未覆盖的细节问题,我的经验是,首先去仔细核对配置文件的每一个标点,其次查看Docker容器的完整日志,九成的问题都能在这两步中找到答案。