Hermes Agent + Open WebUI Docker 部署指南
基于 Docker Compose 一键部署 Hermes Agent 网关与 Open WebUI 聊天界面,以小米 MiMo API + 微信网关为实例完成全流程配置。本文涵盖环境准备、Hermes Agent 配置、容器编排及 Open WebUI 接入的完整步骤。
目录
1. 背景与架构
1.1 什么是 Hermes Agent
Hermes Agent 是 Nous Research 开源的 AI Agent 框架,具备:
- 工具调用:文件操作、代码执行、浏览器控制、网络搜索等
- 技能系统:85+ 内置技能,覆盖开发、研究、创意等领域
- 多平台接入:支持微信、Discord、Telegram 等消息平台
- API 服务器:内置 OpenAI 兼容 API,可被第三方前端调用
1.2 什么是 Open WebUI
Open WebUI 是一个功能丰富的自托管 AI 聊天前端,特点:
- 兼容 OpenAI API 格式的后端连接
- 多用户管理、聊天记录、知识库
- 支持多模型切换和对比
1.3 整体架构
┌─────────────────────────────────────────────────────┐
│ 宿主机 (Ubuntu) │
│ │
│ ┌─────────────────┐ ┌──────────────────────┐ │
│ │ hermes-gateway │ │ open-webui │ │
│ │ │◄─────│ │ │
│ │ - Hermes Agent │ API │ - Web 聊天界面 │ │
│ │ - API Server │ 调用 │ - 用户管理 │ │
│ │ :8642 │ │ :8443 │ │
│ └───────┬─────────┘ └──────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────┐ │
│ │ 小米 MiMo API │ │
│ │ (云端 LLM) │ │
│ └─────────────────┘ │
└─────────────────────────────────────────────────────┘通信流程:
- 用户在浏览器访问 Open WebUI(端口 8443)
- Open WebUI 通过 Docker 内部网络调用 Hermes API(端口 8642)
- Hermes Agent 接收请求,调用小米 MiMo API 获取 LLM 响应
- Hermes 根据需要执行工具调用(文件操作、代码执行等),返回最终结果
1.4 Docker 网络说明
两个容器通过自定义 Docker 网络 hermes-net 互联:
- Open WebUI 通过
http://hermes-gateway:8642/v1访问 Hermes hermes-gateway是容器名,Docker 内部 DNS 自动解析- 无需
host.docker.internal,也不需要暴露端口到宿主机网络
2. 环境准备
2.1 系统要求
| 项目 | 要求 |
|---|---|
| 操作系统 | Ubuntu 20.04+(推荐 22.04/24.04) |
| Docker | 20.10+ |
| Docker Compose | v2.0+(docker compose 命令) |
| 内存 | 建议 2GB+ |
| 磁盘 | 建议 10GB+ 可用空间 |
2.2 安装 Docker
# 更新系统
sudo apt update && sudo apt upgrade -y
# 安装 Docker
curl -fsSL https://get.docker.com | sudo sh
# 将当前用户加入 docker 组(免 sudo)
sudo usermod -aG docker $USER
# 重新登录后生效,验证
docker --version
docker compose version2.3 准备 Hermes Agent 数据目录
Hermes 的配置和数据存储在宿主机目录中,容器删除后数据不丢失:
# 创建数据目录(与目录结构约定一致)
mkdir -p /root/.hermes2.4 获取 API 密钥
本教程以小米 MiMo API 为例,你需要:
- 注册小米 MiMo 开放平台账号
- 获取 API Key(格式类似
tp-xxxxxxxxxxxxxxxxxxxxxxxx) - 确认 Base URL(本例为
https://token-plan-cn.xiaomimimo.com/v1)
3. Hermes Agent 配置
3.1 配置文件说明
Hermes 的配置主要涉及两个文件,都位于 HERMES_HOME 目录(默认 /root/.hermes/):
| 文件 | 作用 |
|---|---|
.env | 环境变量配置(API 密钥、消息平台凭据等) |
config.yaml | 运行时配置(模型选择、工具集、Agent 参数等) |
3.2 配置 .env 文件
cat > /root/.hermes/.env << 'EOF'
# =============================================================================
# LLM 提供商配置 - 小米 MiMo
# =============================================================================
XIAOMI_API_KEY=你的小米API密钥
XIAOMI_BASE_URL=https://token-plan-cn.xiaomimimo.com/v1
# =============================================================================
# 微信网关配置(可选,如需接入微信)
# =============================================================================
WEIXIN_ACCOUNT_ID=你的微信账号ID
WEIXIN_TOKEN=你的微信Token
WEIXIN_BASE_URL=https://ilinkai.weixin.qq.com
WEIXIN_CDN_BASE_URL=https://novac2c.cdn.weixin.qq.com/c2c
WEIXIN_DM_POLICY=pairing
WEIXIN_ALLOW_ALL_USERS=false
WEIXIN_ALLOWED_USERS=你的微信用户ID
WEIXIN_GROUP_POLICY=disabled
WEIXIN_GROUP_ALLOWED_USERS=
WEIXIN_HOME_CHANNEL=你的微信用户ID
# =============================================================================
# API SERVER(Open WebUI 连接所需)
# =============================================================================
# 启用内置 API 服务器
API_SERVER_ENABLED=true
# API 认证密钥,Open WebUI 连接时需要提供此密钥
API_SERVER_KEY=<your-api-key>
# 监听地址:必须为 0.0.0.0 才能让 Docker 容器网络访问
# 默认为 127.0.0.1(仅容器内部可访问),这是最常见的坑
API_SERVER_HOST=0.0.0.0
EOF关键配置解释:
API_SERVER_ENABLED=true:启用内置 API 服务器,使 Open WebUI 可以通过 HTTP 调用API_SERVER_KEY:认证密钥,两边必须一致API_SERVER_HOST=0.0.0.0:必须设置。默认绑定127.0.0.1,Docker 容器之间无法通过网络访问
3.3 配置 config.yaml
cat > /root/.hermes/config.yaml << 'EOF'
# 模型配置
model:
# 默认使用的模型(对应小米 API 中的模型 ID)
default: mimo-v2.5
# 推理提供商(auto 会根据环境变量自动检测)
provider: xiaomi
# 小米 API 端点
base_url: https://token-plan-cn.xiaomimimo.com/v1
# 工具集配置
toolsets:
- hermes-cli
# Agent 参数
agent:
max_turns: 90
gateway_timeout: 1800
restart_drain_timeout: 180
api_max_retries: 3
EOF可用的小米模型:
| 模型 ID | 说明 |
|---|---|
mimo-v2.5 | 最新版通用模型(默认推荐) |
mimo-v2.5-pro | 高性能版本 |
mimo-v2-pro | 上一代专业版 |
mimo-v2-omni | 多模态模型 |
mimo-v2.5-tts | 语音合成 |
3.4 验证 Hermes 配置
启动 Hermes 容器验证配置是否正确:
# 临时启动 Hermes 测试
docker run --rm -it \
-v /root/.hermes:/opt/data \
-e API_SERVER_ENABLED=true \
-e API_SERVER_KEY=<your-api-key> \
nousresearch/hermes-agent
# 如果看到以下内容说明配置成功:
# Hermes Gateway Starting...
# ...
# Welcome to Hermes Agent!按 Ctrl+C 退出测试。
4. Docker Compose 部署
4.1 目录结构
建议将 Compose 文件放在统一的管理目录下:
/etc/docker/
├── nginx_proxy_manager/ # 已有的 Nginx Proxy Manager
│ ├── docker-compose.yml
│ ├── data/
│ └── letsencrypt/
└── hermes/ # Hermes + Open WebUI
├── docker-compose.yml # Compose 配置文件
└── open-webui-data/ # Open WebUI 数据持久化4.2 创建目录
mkdir -p /etc/docker/hermes/open-webui-data4.3 Docker Compose 配置文件
cat > /etc/docker/hermes/docker-compose.yml << 'EOF'
# ============================================================
# Hermes Agent + Open WebUI Docker Compose 配置
# 路径: /etc/docker/hermes/docker-compose.yml
# 启动: cd /etc/docker/hermes && docker compose up -d
# ============================================================
services:
# ──────────────────────────────────────────────────────────
# Hermes Agent 网关
# - 提供 AI Agent 能力(工具调用、文件操作、代码执行等)
# - 启动内置 API 服务器,供 Open WebUI 通过 HTTP 调用
# ──────────────────────────────────────────────────────────
hermes-gateway:
image: nousresearch/hermes-agent
container_name: hermes-gateway
restart: always
ports:
# 宿主机 8642 端口映射到容器 8642 端口
# 主要用于外部调试(如 curl 测试 API)
# Open WebUI 不需要通过此端口访问(使用 Docker 内部网络)
- "8642:8642"
volumes:
# 将宿主机的 Hermes 数据目录挂载到容器内 /opt/data
# 所有配置(.env、config.yaml)、会话记录、插件数据都保存在这里
# 容器删除后数据不丢失
- /root/.hermes:/opt/data
# ── 关键:解决 TTY 问题 ──
# Hermes CLI 检测到非 TTY 环境会直接退出("Input is not a terminal")
# 需要绕过 tini 初始化进程,直接运行 entrypoint
entrypoint: ["/opt/hermes/docker/entrypoint.sh"]
command: ["gateway", "run"] # 启动网关模式(消息平台 + API 服务器)
tty: true # 分配伪终端
stdin_open: true # 保持标准输入打开
environment:
- API_SERVER_ENABLED=true
- API_SERVER_KEY=<your-api-key>
logging:
driver: json-file
options:
max-size: "50m" # 单个日志文件最大 50MB
max-file: "3" # 最多保留 3 个日志文件(自动轮转)
networks:
- hermes-net
# ──────────────────────────────────────────────────────────
# Open WebUI 聊天界面
# - 提供 Web 界面供用户与 AI 对话
# - 通过 OpenAI 兼容 API 连接到 Hermes Agent
# ──────────────────────────────────────────────────────────
open-webui:
image: ghcr.io/open-webui/open-webui:main
container_name: open-webui
restart: always
ports:
# 浏览器访问地址: http://服务器IP:8443
- "8443:8080"
volumes:
# Open WebUI 数据持久化(用户账户、聊天记录、设置)
# 使用相对路径 ./open-webui-data,即当前目录下的子目录
# 宿主机位置: /etc/docker/hermes/open-webui-data
- ./open-webui-data:/app/backend/data
environment:
# Hermes API 地址
# hermes-gateway 是 Docker 容器名,通过内部 DNS 解析
# 必须以 /v1 结尾,否则模型列表无法加载
- OPENAI_API_BASE_URL=http://hermes-gateway:8642/v1
# 认证密钥,必须与 Hermes 的 API_SERVER_KEY 完全一致
- OPENAI_API_KEY=<your-api-key>
# 国内 HuggingFace 镜像
# Open WebUI 启动时需要下载嵌入模型(all-MiniLM-L6-v2)
# 国内无法直接访问 huggingface.co,必须设置镜像
- HF_ENDPOINT=https://hf-mirror.com
depends_on:
- hermes-gateway
logging:
driver: json-file
options:
max-size: "50m"
max-file: "3"
networks:
- hermes-net
# ──────────────────────────────────────────────────────────
# 自定义网络
# 两个容器通过此网络互相通信
# 容器名即 DNS,如 http://hermes-gateway:8642
# ──────────────────────────────────────────────────────────
networks:
hermes-net:
driver: bridge
EOF4.4 配置项速查表
| 配置项 | 值 | 说明 |
|---|---|---|
| Hermes API 端口 | 8642 | 外部调试用,Open WebUI 通过内部网络访问 |
| Open WebUI 端口 | 8443 | 浏览器访问聊天界面 |
| API 密钥 | <your-api-key> | 两个服务之间的认证凭据 |
| Hermes 数据目录 | /root/.hermes | 配置、会话、插件数据 |
| Open WebUI 数据 | ./open-webui-data | 用户账户、聊天记录 |
| HuggingFace 镜像 | hf-mirror.com | 国内环境必需 |
4.5 启动服务
cd /etc/docker/hermes
# 首次启动
docker compose up -d
# 查看运行状态
docker compose ps
# 查看实时日志(Ctrl+C 退出)
docker compose logs -f4.6 验证服务
# 1. 检查 Hermes API 是否正常
curl http://localhost:8642/health
# 预期输出: {"status": "ok", "platform": "hermes-agent"}
# 2. 从 Open WebUI 容器内测试连接
docker exec open-webui curl -s http://hermes-gateway:8642/health
# 预期输出: {"status": "ok", "platform": "hermes-agent"}
# 3. 查看可用模型
curl -s http://localhost:8642/v1/models \
-H "Authorization: Bearer <your-api-key>" | python3 -m json.tool5. Open WebUI 配置
5.1 首次访问
- 浏览器打开
http://你的服务器IP:8443 - 首次访问会要求注册管理员账户
- 第一个注册的用户自动成为管理员
5.2 确认 Hermes 连接
注册并登录后,Open WebUI 应该已经自动检测到 Hermes 连接:
- 在聊天界面顶部的模型下拉菜单中,应该能看到
hermes-agent - 如果没有显示,进入 管理员设置 → 连接 → OpenAI API,确认连接配置:
| 字段 | 值 |
|---|---|
| URL | http://hermes-gateway:8642/v1 |
| 密钥 | <your-api-key> |
5.3 开始对话
- 在模型下拉菜单选择
hermes-agent - 输入消息,开始与 Hermes Agent 对话
- Hermes 会根据需要自动调用工具(文件操作、代码执行等)
6. 多模型接入
你可以在 Open WebUI 中同时使用 Hermes Agent 和小米直连模型,实现不同场景的最优选择。
6.1 添加小米 API 直连
在 Open WebUI 中进入 管理员设置 → 连接 → OpenAI API → 添加新连接:
| 字段 | 值 |
|---|---|
| 名称 | Xiaomi MiMo |
| URL | https://token-plan-cn.xiaomimimo.com/v1 |
| 密钥 | 你的小米 API Key |
保存后,模型列表中会出现所有小米模型。
6.2 模型使用建议
| 场景 | 推荐模型 | 说明 |
|---|---|---|
| 复杂任务(文件操作、代码执行、多步推理) | hermes-agent | Hermes 调度工具完成复杂工作流 |
| 快速问答 | mimo-v2.5 | 响应更快,无工具调用开销 |
| 高质量生成 | mimo-v2.5-pro | 性能更强,适合深度分析 |
| 多模态(图文理解) | mimo-v2-omni | 支持图片输入 |
6.3 切换 Hermes 内部模型
如果想让 Hermes Agent 使用不同的小米模型执行任务:
# 编辑配置文件
nano /root/.hermes/config.yaml
# 修改 default 字段
# 例如切换到 mimo-v2.5-pro
# model:
# default: mimo-v2.5-pro
# 重启 Hermes 使配置生效
cd /etc/docker/hermes
docker compose restart hermes-gateway7. 常见问题与排查
7.1 NumPy 兼容性错误
错误信息:
RuntimeError: NumPy was built with baseline optimizations:
(X86_V2) but your machine doesn't support: (X86_V2).原因:宿主机 CPU 太老,不支持 NumPy 2.x 要求的 SSE4.2 指令集。
解决方案(二选一):
方案 A:升级虚拟机 CPU 类型(推荐)
如果在 PVE/ESXi 等虚拟化平台上运行:
# PVE:修改虚拟机配置
# 将 CPU 类型从默认值改为 host
sed -i 's/cpu:.*/cpu: host/' /etc/pve/qemu-server/<VMID>.conf
# 重启虚拟机
qm reboot <VMID>修改后验证:
lscpu | grep -i "sse\|avx"
# 应该能看到 SSE4.2、AVX2 等指令集方案 B:降级 Open WebUI 版本
# 在 docker-compose.yml 中将镜像改为旧版本
image: ghcr.io/open-webui/open-webui:0.3.357.2 Hermes 循环重启
症状:
Warning: Input is not a terminal (fd=0).
Goodbye! ⚕
hermes-gateway exited with code 0 (restarting)原因:Hermes CLI 检测到没有 TTY 终端环境,主动退出。
解决:确保 Compose 文件中包含以下配置:
hermes-gateway:
# 绕过 tini,直接运行 entrypoint
entrypoint: ["/opt/hermes/docker/entrypoint.sh"]
command: ["gateway", "run"]
tty: true # 分配伪终端
stdin_open: true # 保持标准输入打开7.3 Open WebUI 连接 Hermes 失败
错误信息:
ConnectionRefusedError: [Errno 111] Connect call failed ('172.20.0.2', 8642)原因:API 服务器绑定在 127.0.0.1(容器回环地址),Docker 网络无法访问。
排查步骤:
# 1. 检查 API 服务器监听地址
docker exec hermes-gateway cat /proc/net/tcp | grep 21C2
# 如果看到 0100007F:21C2(127.0.0.1:8642),说明绑定地址错误
# 如果看到 00000000:21C2(0.0.0.0:8642),说明绑定正确
# 2. 从 Open WebUI 容器测试连通性
docker exec open-webui curl -s http://hermes-gateway:8642/health解决:在 /root/.hermes/.env 中添加:
API_SERVER_HOST=0.0.0.0重启 Hermes:
cd /etc/docker/hermes
docker compose restart hermes-gateway7.4 HuggingFace 模型下载失败
错误信息:
huggingface_hub.errors.LocalEntryNotFoundError:
'[Errno 101] Network is unreachable'原因:国内网络无法直接访问 huggingface.co。
解决:在 Compose 文件中设置国内镜像环境变量:
open-webui:
environment:
- HF_ENDPOINT=https://hf-mirror.com7.5 模型列表为空
排查:
# 1. 确认 Hermes API 正常
curl http://localhost:8642/health
# 2. 查看返回的模型列表
curl -s http://localhost:8642/v1/models \
-H "Authorization: Bearer <your-api-key>"
# 3. 确认 Open WebUI 连接配置中 URL 以 /v1 结尾
# 常见错误:http://hermes-gateway:8642(缺少 /v1)
# 正确写法:http://hermes-gateway:8642/v17.6 PVE 改 CPU 后无法启动
症状:修改虚拟机 CPU 类型为 host 后进入 emergency mode。
原因:fstab 中有不存在的磁盘 UUID 导致挂载超时。
解决:
# 在 emergency shell 中执行
# 1. 注释掉 fstab 中有问题的行
nano /etc/fstab
# 找到包含不存在 UUID 的行,在行首加 #
# 2. 重启
reboot8. 运维管理
8.1 常用命令
cd /etc/docker/hermes
# 查看容器状态
docker compose ps
# 查看实时日志
docker compose logs -f
# 查看某个服务的日志
docker compose logs -f hermes-gateway
docker compose logs -f open-webui
# 重启服务
docker compose restart
# 停止服务
docker compose down
# 启动服务
docker compose up -d
# 更新镜像并重启
docker compose pull
docker compose up -d
# 进入容器调试
docker exec -it hermes-gateway bash
docker exec -it open-webui bash8.2 数据备份
# 备份 Hermes 数据
tar -czf hermes-backup-$(date +%Y%m%d).tar.gz /root/.hermes
# 备份 Open WebUI 数据
tar -czf openwebui-backup-$(date +%Y%m%d).tar.gz /etc/docker/hermes/open-webui-data
# 完整备份
tar -czf full-backup-$(date +%Y%m%d).tar.gz \
/root/.hermes \
/etc/docker/hermes8.3 日志管理
Compose 文件已配置日志轮转(每个容器最多 3 个 50MB 日志文件),无需手动清理。
如需调整:
logging:
driver: json-file
options:
max-size: "100m" # 改大单文件上限
max-file: "5" # 增加保留数量8.4 完整目录结构
/etc/docker/hermes/
├── docker-compose.yml # Compose 配置
└── open-webui-data/ # Open WebUI 数据
/root/.hermes/
├── .env # 环境变量(API 密钥等)
├── config.yaml # Hermes 运行时配置
├── skills/ # 技能数据
├── sessions/ # 会话记录
├── logs/ # 运行日志
├── memories/ # Agent 记忆
├── workspace/ # 工作空间
└── ...
这份教程涵盖了我们部署过程中遇到的所有关键问题和解决方案,其他人在 PVE 环境下部署时可以直接参考。本文章已被查看 0 次