Contents

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)      │                                  │
│  └─────────────────┘                                  │
└─────────────────────────────────────────────────────┘

通信流程

  1. 用户在浏览器访问 Open WebUI(端口 8443)
  2. Open WebUI 通过 Docker 内部网络调用 Hermes API(端口 8642)
  3. Hermes Agent 接收请求,调用小米 MiMo API 获取 LLM 响应
  4. 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)
Docker20.10+
Docker Composev2.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 version

2.3 准备 Hermes Agent 数据目录

Hermes 的配置和数据存储在宿主机目录中,容器删除后数据不丢失:

# 创建数据目录(与目录结构约定一致)
mkdir -p /root/.hermes

2.4 获取 API 密钥

本教程以小米 MiMo API 为例,你需要:

  1. 注册小米 MiMo 开放平台账号
  2. 获取 API Key(格式类似 tp-xxxxxxxxxxxxxxxxxxxxxxxx
  3. 确认 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-data

4.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
EOF

4.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 -f

4.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.tool

5. Open WebUI 配置

5.1 首次访问

  1. 浏览器打开 http://你的服务器IP:8443
  2. 首次访问会要求注册管理员账户
  3. 第一个注册的用户自动成为管理员

5.2 确认 Hermes 连接

注册并登录后,Open WebUI 应该已经自动检测到 Hermes 连接:

  • 在聊天界面顶部的模型下拉菜单中,应该能看到 hermes-agent
  • 如果没有显示,进入 管理员设置 → 连接 → OpenAI API,确认连接配置:
字段
URLhttp://hermes-gateway:8642/v1
密钥<your-api-key>

5.3 开始对话

  1. 在模型下拉菜单选择 hermes-agent
  2. 输入消息,开始与 Hermes Agent 对话
  3. Hermes 会根据需要自动调用工具(文件操作、代码执行等)

6. 多模型接入

你可以在 Open WebUI 中同时使用 Hermes Agent 和小米直连模型,实现不同场景的最优选择。

6.1 添加小米 API 直连

在 Open WebUI 中进入 管理员设置 → 连接 → OpenAI API → 添加新连接

字段
名称Xiaomi MiMo
URLhttps://token-plan-cn.xiaomimimo.com/v1
密钥你的小米 API Key

保存后,模型列表中会出现所有小米模型。

6.2 模型使用建议

场景推荐模型说明
复杂任务(文件操作、代码执行、多步推理)hermes-agentHermes 调度工具完成复杂工作流
快速问答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-gateway

7. 常见问题与排查

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.35

7.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-gateway

7.4 HuggingFace 模型下载失败

错误信息

huggingface_hub.errors.LocalEntryNotFoundError:
'[Errno 101] Network is unreachable'

原因:国内网络无法直接访问 huggingface.co。

解决:在 Compose 文件中设置国内镜像环境变量:

open-webui:
  environment:
    - HF_ENDPOINT=https://hf-mirror.com

7.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/v1

7.6 PVE 改 CPU 后无法启动

症状:修改虚拟机 CPU 类型为 host 后进入 emergency mode。

原因:fstab 中有不存在的磁盘 UUID 导致挂载超时。

解决

# 在 emergency shell 中执行
# 1. 注释掉 fstab 中有问题的行
nano /etc/fstab
# 找到包含不存在 UUID 的行,在行首加 #

# 2. 重启
reboot

8. 运维管理

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 bash

8.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/hermes

8.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