架构¶
myopenclaw 由主栈 16 个 Docker 服务 + zhixun 独立栈(默认 1 个 bot,另有 profile-gated 的本地 MCP 调试容器)+ tianyi 独立栈 1 个服务组成(不含 profile-gated 的 openclaw-cli)。主栈运行在共享的 myopenclaw-net 桥接网络上,zhixun 栈运行在独立的 zhixun-bot-net 上;tianyi 栈为独立 Compose 但共享主栈 myopenclaw-net(复用 repo-scanner-mcp)。
服务拓扑¶
核心服务¶
| 服务 | 镜像 | 端口 | 说明 |
|---|---|---|---|
| hermes | 自建(基于 nousresearch/hermes-agent:latest) |
8642 | Hermes gateway,默认 profile(爱玛士,deepseek-flash 多模态);接入 team server-monitoring MCP,每日 08:30 服务器日报 → 飞书私聊 |
| hermes-coder | 同 hermes 镜像 | 8643 | 爱码士,coder profile,飞书+Discord 双通道(deepseek-flash);接入 team server-monitoring MCP,每日 08:30 服务器日报 → 预报系统群 |
| hermes-daoyuan | 同 hermes 镜像 | 8645 | 道元·文献学者,daoyuan profile,仅指定用户可用(FEISHU_GROUP_POLICY=allowlist + FEISHU_ALLOWED_USERS;群聊仅 @;留空是 pairing 模式);接入 paper-queue MCP |
| hermes-finance | 同 hermes 镜像 | 8644 | 财经助手,finance profile |
| hermes-dashboard | nousresearch/hermes-agent:latest |
9119 | Hermes Web 面板(只读) |
| claude-code | 自建(基于 ubuntu:24.04) |
9090 | Claude Code + cc-connect 飞书直连(各 tier 均 deepseek-flash,1M 上下文) |
| openclaw-gateway | ghcr.io/openclaw/openclaw:2026.9.1(由 .env 的 OPENCLAW_IMAGE 钉住) |
18789 | OpenClaw gateway,虾酱 Discord bot(deepseek-flash + TTS 语音回复走 xiaomi) |
数据与支撑服务¶
| 服务 | 端口 | 说明 |
|---|---|---|
| zotero-mcp | 8002 | Zotero 文献 MCP 服务,12 个 tools(mylibrary 提供) |
| tdai-memory | 8420 | Agent 长期记忆 Gateway,L0→L3 分层管线 |
| aisecretary | 8000 | 事务数据库 MCP 服务,7 个 tools,SQLite 持久化 |
| repo-scanner-mcp | 8001 | 研发日报 MCP 数据服务,来自 git-contribution-stats |
| paper-queue-mcp | 8003(loopback) | 论文清单 MCP(FastMCP + streamable HTTP)。独立容器是刻意的:队列目录 ~/.myagentdata/paper-queue 只挂给它(另有 backup-cron 的窄 rw 热备挂载);道元通过 Bearer token 固定归属 Owen 写入,旧 OpenClaw HMAC 路径保留但默认休眠 |
| yuque-mcp | —(仅容器网络) | 语雀知识库 MCP(本机 SSE,自持只读 token,不发布宿主端口)。快照 06:00 / 变更报告 07:00(北京,容器内调度);来源 yuque_mcp_server,按 commit pin |
| freshrss | 8081 | RSS 聚合,dailyinfo 数据源 |
| uptime-kuma | 3001 | 服务监控面板,HTTP + Docker 容器状态 |
| backup-cron | — | 定时快照备份 |
zhixun 独立栈(docker-compose.zhixun-bot.yml,zhixun-bot-net 网络)¶
| 服务 | 端口 | 说明 |
|---|---|---|
| zhixun-water-mcp | 18201 | 可选调试回退(默认不启动,仅 --with-local-mcp):本地水文 MCP + v2 兼容层 |
| openclaw-zhixun | 18791 | OpenClaw gateway(知汛助手),飞书 bot,仅 MCP 工具无代码执行;默认连远程水文 MCP(Bearer) |
tianyi 独立栈(docker-compose.tianyi-bot.yml,共享 myopenclaw-net)¶
| 服务 | 端口 | 说明 |
|---|---|---|
| openclaw-tianyi | 18792 | OpenClaw gateway(天一·研发助手),飞书 bot(deepseek-flash),terminal + MCP profile:读走共享 repo-scanner-mcp,写走 gh/gc CLI 创建 GitHub/GitCode issue,另接本机 yuque-mcp 与团队 server-monitoring MCP(可选,URL 非空门控;13 只读工具;校园域名入口走公网证书、内网直连用随仓库提交的 CA,token 走 .env.tianyi-bot)。server-monitoring 保留按需查询;每日推送默认关闭(TIANYI_BOT_MONITORING_DIGEST_CRON=off,启动时回收既有 automation;日报已迁到 Hermes 爱玛士/爱码士) |
数据目录映射¶
所有持久化数据在宿主机,通过 Docker volume 挂载:
| 宿主机路径 | 容器内路径 | 容器 | 说明 |
|---|---|---|---|
~/.hermes |
/opt/data |
hermes 四兄弟 | Hermes 全部数据 |
~/.hermes-agents/<id> |
/opt/data |
hermes-bind-* |
扫码新增的助手,各自一份目录,不进四个 profile。见 扫码新增 Hermes |
~/.claude |
/opt/claude-config |
claude-code | Claude Code 配置和凭证 |
~/.cc-connect |
/opt/cc-config |
claude-code | cc-connect 配置 |
~/.openclaw |
/home/node/.openclaw |
openclaw | OpenClaw 配置和 memory |
~/.myagentdata/tdai-memory |
/opt/data/tdai-memory |
tdai-memory | L0→L3 记忆数据 |
~/.myagentdata/aisecretary |
/data |
aisecretary | 事务 SQLite |
~/.myagentdata/repo-scanner |
/data |
repo-scanner-mcp | 研发日报 SQLite(只读) |
~/.myagentdata/paper-queue |
/data |
paper-queue-mcp | 论文清单 SQLite(只挂给 MCP 容器,agent 走 MCP 接口;backup-cron 另有窄 rw 热备挂载) |
~/.myagentdata/yuque-mcp/change_data |
/app/yuque/change_data |
yuque-mcp | 语雀快照 + change_summary.db + snapshots/ 正文(db 在 backup-cron 热备清单) |
~/.myagentdata/yuque-mcp/backup |
/app/yuque/backup |
yuque-mcp | 语雀知识库备份工具输出(Markdown) |
~/.myagentdata/dailyinfo |
— | freshrss | RSS 数据 |
~/.config/gh |
/opt/gh-config |
hermes, claude-code | GitHub CLI 认证 |
~/.config/opencode |
/opt/opencode-config |
hermes | opencode 配置 |
~/.lark-cli |
/opt/lark-config |
hermes | lark-cli 配置 |
~/.uptime-kuma |
/app/data |
uptime-kuma | 监控 SQLite + 配置 |
~/.openclaw-zhixun |
/home/node/.openclaw |
openclaw-zhixun | zhixun bot 配置和插件 |
~/.openclaw-zhixun-mcp |
/var/lib/zhixun-water-mcp |
zhixun-water-mcp(仅本地调试 profile) | 水文站点名称索引缓存 |
~/.openclaw-tianyi |
/home/node/.openclaw |
openclaw-tianyi | tianyi bot 配置和插件 |
~/code + ~/Code |
/home/node/code + /home/node/Code |
claude-code | 代码仓库 |
安全边界¶
三个框架在本项目中承担不同角色,密钥隔离策略不同:
-
Hermes = 个人助手。持有 GitHub、飞书、邮箱等个人身份和密钥。
env_passthrough精确控制哪些变量能被 agent bash 子进程看到,redact_secrets机制自动脱敏。适合单人使用,不暴露给多人环境。 -
Claude Code = 编码 Agent。通过 cc-connect 直连飞书,专注于代码任务。持有
DEEPSEEK_API_KEY/ANTHROPIC_API_KEY,独立于 Hermes。 -
OpenClaw 虾酱 = 协作网关。不持有个人密钥,可安全开放到多人场景。配置与个人身份无关,适合工作流编排。
-
OpenClaw 知汛 = 团队侧公共水文 bot(与天一同类,服务器侧见 server-deploy;背后 zhixun-agent 水文 MCP 是团队服务)。完全隔离的 Compose 栈,独立网络、独立飞书应用凭据、独立模型 API Key。默认直连团队服务器上的远程水文 MCP(
Authorization: Bearer,背后是新版 zhixun-core);本地zhixun-water-mcp容器仅--with-local-mcp调试时启动。不接入主栈的 Hermes、长期记忆或任何其他共享服务。仅开放 MCP 查询工具,写工具默认关闭。 -
Hermes profile 内部隔离:四个 profile(爱玛士 / 爱码士 / 道元 / finance)是隔离实例 —— 默认 profile 的 home 就是
~/.hermes(配置 = 根config.yaml),其余 profile 在~/.hermes/profiles/<name>/各有独立配置与 token 目录。个人数据类接入(如千问办公 AI听记 MCP)刻意只注册默认 profile。验证某 profile 的真实视图必须hermes -p <profile> mcp list(裸hermes mcp list读到的是默认 profile 的配置)。详见 千问办公 AI听记。
简言之:需要你的 key 的 → Hermes / Claude Code;可以给别人用的 → OpenClaw 虾酱;查水文数据的 → OpenClaw 知汛。
密钥传递机制¶
被 Hermes 黑名单拦截的密钥(DEEPSEEK、OPENROUTER、OPENAI)通过特殊管道传递:
.env变量 →docker-compose.ymlenv- 容器 entrypoint 脚本写入
/opt/data/secrets/文件 - opencode.json 通过
{file:路径}引用
其他密钥(GH_TOKEN、OPENCODE_API_KEY、LARK_CLI_*)直接通过 env 传递。
网络¶
主栈所有服务在 myopenclaw-net 桥接网络上,通过 Docker DNS(容器名)互相访问。zhixun 栈使用独立的 zhixun-bot-net 桥接网络,与主栈物理隔离。tianyi 栈虽是独立 Compose,但把 myopenclaw-net 声明为外部网络复用,因此能按容器名直连 repo-scanner-mcp。部分服务需要访问外部 Chinese 域名时,可能需要配置 DNS —— 详见 DNS 配置。
容器内路径注意事项¶
不同容器的 HOME 不同:
| 容器 | HOME |
|---|---|
| hermes | /opt/data(实际 /root) |
| claude-code | /home/node |
| openclaw | /home/node |
| backup-cron | /root |
备份脚本中引用的路径需要对应各容器的 HOME。