收起左侧

Hermes Agent 三合一 Docker 部署指南

23
回复
1424
查看
[ 复制链接 ]

12

主题

76

回帖

0

牛值

初出茅庐

fnOS1.0上线纪念勋章

Hermes Agent 三合一 Docker 部署指南

这是什么

Hermes Agent 是一个 AI 代理框架,官方推荐用三个容器分别跑网关、监控面板和聊天界面。这篇文章记录我怎么把它们跑起来的,踩了哪些坑,以及最终的配置方案。

为什么需要三个容器

简单说就是职责分离:

  • hermes — 网关 API,处理所有请求,端口 8642
  • dashboard — 监控面板,看运行状态和会话,端口 9119
  • webui — 浏览器聊天界面,端口 8787

三个容器共享同一份数据(配置、会话、记忆、技能),靠挂载同一个目录实现。

踩坑记录

坑 1:端**露

默认端口直接映射到 0.0.0.0,意味着外网可以直接访问。生产环境必须加防火墙或者反向代理。

坑 2:权限问题

三个容器默认用户可能不一样,导致同一个挂载目录互相读写报 Permission denied。解决方法是给三个容器统一指定 user: "1000:1000",同时把宿主机目录 owner 设为 1000:1000,权限 755。

坑 3:WebUI 需要 agent 源码

WebUI 启动时会检查 agent 源码目录,没有的话功能受限。源码在 agent 容器的 /opt/hermes 里,需要复制到宿主机再挂载给 webui。

坑 4:webui 的 HERMES_HOME

agent 和 dashboard 设置了 HERMES_HOME=/opt/data,但 webui 没有设置这个变量,导致它读不到 config.yaml,报 "No LLM provider configured"。加一行 HERMES_HOME=/home/hermeswebui/.hermes 就解决了。

坑 5:配置变更不会自动生效

在 agent 里通过 hermes setup 配置了模型,webui 不会自动感知,需要重启 webui 容器。

最终配置

目录结构

project/
**── docker-compose.yml
**── init.sh              # 从镜像复制 agent 源码,只需跑一次
**── hermes/
    **── data/            # 配置、会话、记忆、skills
    **── hermes/          # agent 源码(init.sh 自动复制)

docker-compose.yml

services:
  hermes:
    image: nousresearch/hermes-agent:latest
    container_name: hermes
    restart: unless-stopped
    command: gateway run
    user: "1000:1000"
    ports:
      - "8642:8642"
    volumes:
      - ./hermes/data:/opt/data
    environment:
      # - GATEWAY_ALLOW_ALL_USERS=true  #(实测关闭没有问题)
      - TZ=Asia/Shanghai
      - PATH=/opt/hermes/.venv/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin # 配置环境变量,避免 hermes 找不到命令
    networks:
      - hermes-net

  dashboard:
    image: nousresearch/hermes-agent:latest
    container_name: hermes-dashboard
    restart: unless-stopped
    command: dashboard --host 0.0.0.0 --insecure
    user: "1000:1000"
    ports:
      - "9119:9119"
    volumes:
      - ./hermes/data:/opt/data
    environment:
      - GATEWAY_HEALTH_URL=http://hermes:8642
      - TZ=Asia/Shanghai
    networks:
      - hermes-net
    depends_on:
      - hermes

  webui:
    image: ghcr.io/nesquena/hermes-webui:latest
    container_name: hermes-webui
    restart: unless-stopped
    ports:
      - "8787:8787"
    volumes:
      - ./hermes/data:/home/hermeswebui/.hermes
      - ./hermes/hermes:/home/hermeswebui/.hermes/hermes-agent
      - ./hermes/data/workspace:/workspace
    environment:
      - HERMES_HOME=/home/hermeswebui/.hermes
      - HERMES_WEBUI_HOST=0.0.0.0
      - HERMES_WEBUI_PORT=8787
      - HERMES_WEBUI_STATE_DIR=/home/hermeswebui/.hermes/webui
      - TZ=Asia/Shanghai
      - WANTED_UID=1000
      - WANTED_GID=1000
      # - HERMES_WEBUI_PASSWORD=your-password
    networks:
      - hermes-net
    depends_on:
      - hermes

networks:
  hermes-net:
    driver: bridge

init.sh

#!/bin/bash
set -e

SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
DEST="$SCRIPT_DIR/hermes/hermes"
DATA="$SCRIPT_DIR/hermes/data"
IMAGE="nousresearch/hermes-agent:latest"

mkdir -p "$DATA"
mkdir -p "$DEST"

echo "Fixing permissions to UID 1000..."

sudo chown -R 1000:1000 "$DATA"
sudo chmod -R 755 "$DATA"

if [ -f "$DEST/pyproject.toml" ]; then
    echo "Source already exists at $DEST"
else
    echo "Copying agent source from $IMAGE ..."
    docker run --rm \
        --user 0:0 \
        --entrypoint sh \
        -v "$DEST:/dest" \
        "$IMAGE" \
        -c 'cd /opt/hermes && tar \
            --exclude=.venv \
            --exclude=.playwright \
            --exclude=node_modules \
            --exclude=package.json \
            --exclude=package-lock.json \
            --exclude=__pycache__ \
            --exclude=hermes_agent.egg-info \
            --exclude=.git \
            --exclude=tests \
            --exclude=docs \
            --exclude=website \
            -cf - . | (cd /dest && tar xf -)'
    echo "Done. Source copied to $DEST"
fi

sudo chown -R 1000:1000 "$DEST"
sudo chmod -R 755 "$DEST"

echo ""
echo "Ready. Run: docker compose up -d"

部署步骤

chmod +x init.sh
./init.sh
docker compose up -d

三条命令,完事。

访问地址:

  • http://localhost:8642 — Gateway API
  • http://localhost:9119 — Dashboard
  • http://localhost:8787 — WebUI

配置模型

docker exec hermes hermes setup

按提示选 provider,填 API key。配完后重启 webui:

docker compose restart webui

可能遇到的问题

1. init.sh 报 Permission denied

需要 sudo 权限。如果不想用 sudo,手动 chown 也行。

2. webui 报 "No LLM provider configured"

确认 config.yaml 里有 providers 配置,然后 docker compose restart webui

3. skills 同步报 "File exists"

无害。两个容器都会往 skills 目录写入,第二次启动时文件已存在就跳过了。

4. 上游镜像更新了

拉最新镜像重新启动:

docker compose pull
docker compose up -d

源码如果也需要更新,删掉 ./hermes/hermes/ 然后重新跑 init.sh

5. 迁移

整个目录打包带走:

tar czf hermes.tar.gz hermes/ docker-compose.yml init.sh

目标机器解压后 docker compose up -d 就行。

为什么不用命名卷

命名卷迁移时需要 docker volume 操作,不直观。绑定挂载就是普通目录,打包复制就行,对运维更友好。代价是需要手动处理权限,但 init.sh 已经帮你搞定了。

已知问题

问题 风险
端**露 0.0.0.0 外网直接访问,无防火墙(自行修改配置)
无 webui 密码 任何人能进聊天界面(自行修改配置)
SQLite 并发写 两个容器同时写 state.db 可能损坏
skills 目录冲突 两个容器都往 skills 写入
无健康检查 依赖服务没就绪就启动
源码只复制一次 镜像更新后代码过时(删除源码目录重新初始化)
收藏
送赞 2
分享

12

主题

76

回帖

0

牛值

初出茅庐

fnOS1.0上线纪念勋章

6 天前 楼主 显示全部楼层

有关
$ hermes <命令>
/bin/sh: 2: hermes: not found
$

使用 /opt/hermes/.venv/bin/hermes <命令>

脚本忘记更新了 感谢提醒 docker cp 目录需要管理员权限 这边修正一下 init.sh ` #!/bin/bash set -e SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" DEST="$SCRIPT_DIR/hermes/hermes" DATA="$SCRIPT_DIR/herme  详情 回复
4 天前

0

主题

12

回帖

0

牛值

江湖小虾

飞牛百度网盘玩家

部署成功了,有几个问题,还请修改下:

  1. init.sh中在容器内拷贝目录失败,原因是/dest目录需要root权限,容器需要指定root用户。增加- u root
  2. docker compose中当前的配置会导致Hermes Gateway无法启动(需要API SERVER KEY),补充环境变量API_SERVER_KEY=xxxxx
不好意思 init.sh 忘记更新了 ` #!/bin/bash set -e SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" DEST="$SCRIPT_DIR/hermes/hermes" DATA="$SCRIPT_DIR/hermes/data" IMAGE="nousresearch/hermes-agent:latest  详情 回复
4 天前
不会启动失败的,除非容器更新了,这个我测试了很多次  详情 回复
4 天前

0

主题

12

回帖

0

牛值

江湖小虾

飞牛百度网盘玩家

容器中hermes命令无法执行的问题,可以修改compose,增加path的环境变量:

PATH=/opt/hermes/.venv/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

好的谢谢了  详情 回复
5 天前

12

主题

76

回帖

0

牛值

初出茅庐

fnOS1.0上线纪念勋章

5 天前 楼主 显示全部楼层
lmd9008 发表于 2026-4-21 00:33
容器中hermes命令无法执行的问题,可以修改compose,增加path的环境变量:
PATH=/opt/hermes/.venv/bin:/us ...

好的谢谢了

0

主题

1

回帖

0

牛值

江湖小虾

请问一下这个init.sh要怎么创建现在就是webui怎不好
不好意思 init.sh 忘记更新了 ` #!/bin/bash set -e SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" DEST="$SCRIPT_DIR/hermes/hermes" DATA="$SCRIPT_DIR/hermes/data" IMAGE="nousresearch/hermes-agent:latest  详情 回复
4 天前
这边在 终端命令行创建才可以  详情 回复
4 天前
什么意思可用描述一下吗  详情 回复
4 天前

12

主题

76

回帖

0

牛值

初出茅庐

fnOS1.0上线纪念勋章

4 天前 楼主 显示全部楼层
情绪备忘录 发表于 2026-4-22 11:38
请问一下这个init.sh要怎么创建现在就是webui怎不好

什么意思可用描述一下吗

12

主题

76

回帖

0

牛值

初出茅庐

fnOS1.0上线纪念勋章

4 天前 楼主 显示全部楼层
情绪备忘录 发表于 2026-4-22 11:38
请问一下这个init.sh要怎么创建现在就是webui怎不好

这边在 终端命令行创建才可以

12

主题

76

回帖

0

牛值

初出茅庐

fnOS1.0上线纪念勋章

4 天前 楼主 显示全部楼层
lmd9008 发表于 2026-4-20 17:36
部署成功了,有几个问题,还请修改下:

init.sh中在容器内拷贝目录失败,原因是/dest目录需要root权限,容 ...

不会启动失败的,除非容器更新了,这个我测试了很多次

12

主题

76

回帖

0

牛值

初出茅庐

fnOS1.0上线纪念勋章

4 天前 楼主 显示全部楼层
情绪备忘录 发表于 2026-4-22 11:38
请问一下这个init.sh要怎么创建现在就是webui怎不好

不好意思 init.sh
忘记更新了
&#96
#!/bin/bash
set -e

SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
DEST="$SCRIPT_DIR/hermes/hermes"
DATA="$SCRIPT_DIR/hermes/data"
IMAGE="nousresearch/hermes-agent:latest"

mkdir -p "$DATA"
mkdir -p "$DEST"

echo "Fixing permissions to UID 1000..."

sudo chown -R 1000:1000 "$DATA"
sudo chmod -R 755 "$DATA"

if [ -f "$DEST/pyproject.toml" ]; then
    echo "Source already exists at $DEST"
else
    echo "Copying agent source from $IMAGE ..."
    docker run --rm \
        --user 0:0 \
        --entrypoint sh \
        -v "$DEST:/dest" \
        "$IMAGE" \
        -c 'cd /opt/hermes && tar \
            --exclude=.venv \
            --exclude=.playwright \
            --exclude=node_modules \
            --exclude=package.json \
            --exclude=package-lock.json \
            --exclude=__pycache__ \
            --exclude=hermes_agent.egg-info \
            --exclude=.git \
            --exclude=tests \
            --exclude=docs \
            --exclude=website \
            -cf - . | (cd /dest && tar xf -)'
    echo "Done. Source copied to $DEST"
fi

sudo chown -R 1000:1000 "$DEST"
sudo chmod -R 755 "$DEST"

echo ""
echo "Ready. Run: docker compose up -d"
&#96

12

主题

76

回帖

0

牛值

初出茅庐

fnOS1.0上线纪念勋章

4 天前 楼主 显示全部楼层
lmd9008 发表于 2026-4-20 17:36
部署成功了,有几个问题,还请修改下:

init.sh中在容器内拷贝目录失败,原因是/dest目录需要root权限,容 ...

不好意思 init.sh
忘记更新了
&#96
#!/bin/bash
set -e

SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
DEST="$SCRIPT_DIR/hermes/hermes"
DATA="$SCRIPT_DIR/hermes/data"
IMAGE="nousresearch/hermes-agent:latest"

mkdir -p "$DATA"
mkdir -p "$DEST"

echo "Fixing permissions to UID 1000..."

sudo chown -R 1000:1000 "$DATA"
sudo chmod -R 755 "$DATA"

if [ -f "$DEST/pyproject.toml" ]; then
    echo "Source already exists at $DEST"
else
    echo "Copying agent source from $IMAGE ..."
    docker run --rm \
        --user 0:0 \
        --entrypoint sh \
        -v "$DEST:/dest" \
        "$IMAGE" \
        -c 'cd /opt/hermes && tar \
            --exclude=.venv \
            --exclude=.playwright \
            --exclude=node_modules \
            --exclude=package.json \
            --exclude=package-lock.json \
            --exclude=__pycache__ \
            --exclude=hermes_agent.egg-info \
            --exclude=.git \
            --exclude=tests \
            --exclude=docs \
            --exclude=website \
            -cf - . | (cd /dest && tar xf -)'
    echo "Done. Source copied to $DEST"
fi

sudo chown -R 1000:1000 "$DEST"
sudo chmod -R 755 "$DEST"

echo ""
echo "Ready. Run: docker compose up -d"
&#96

12

主题

76

回帖

0

牛值

初出茅庐

fnOS1.0上线纪念勋章

4 天前 楼主 显示全部楼层
清风小道君 发表于 2026-4-20 09:50
有关
$ hermes &lt;命令&gt;
/bin/sh: 2: hermes: not found

脚本忘记更新了
感谢提醒 docker cp 目录需要管理员权限 这边修正一下
init.sh

&#96
#!/bin/bash
set -e

SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
DEST="$SCRIPT_DIR/hermes/hermes"
DATA="$SCRIPT_DIR/hermes/data"
IMAGE="nousresearch/hermes-agent:latest"

mkdir -p "$DATA"
mkdir -p "$DEST"

echo "Fixing permissions to UID 1000..."

sudo chown -R 1000:1000 "$DATA"
sudo chmod -R 755 "$DATA"

if [ -f "$DEST/pyproject.toml" ]; then
    echo "Source already exists at $DEST"
else
    echo "Copying agent source from $IMAGE ..."
    docker run --rm \
        --user 0:0 \
        --entrypoint sh \
        -v "$DEST:/dest" \
        "$IMAGE" \
        -c 'cd /opt/hermes && tar \
            --exclude=.venv \
            --exclude=.playwright \
            --exclude=node_modules \
            --exclude=package.json \
            --exclude=package-lock.json \
            --exclude=__pycache__ \
            --exclude=hermes_agent.egg-info \
            --exclude=.git \
            --exclude=tests \
            --exclude=docs \
            --exclude=website \
            -cf - . | (cd /dest && tar xf -)'
    echo "Done. Source copied to $DEST"
fi

sudo chown -R 1000:1000 "$DEST"
sudo chmod -R 755 "$DEST"

echo ""
echo "Ready. Run: docker compose up -d"
&#96

0

主题

2

回帖

0

牛值

江湖小虾

No response received: No module named 'agent.transports'

Verify your API key is valid and the selected model is available for your account.

不知道为啥,一直报这个错误.webui在聊天的时候.本身agent里面我是可以聊天的.用微信也可以聊天.

你看看挂载目录 `hermes/hermes` 有没有文件 没有的话用脚本重新初始化一次 之前脚本忘记更新了  详情 回复
3 天前

12

主题

76

回帖

0

牛值

初出茅庐

fnOS1.0上线纪念勋章

3 天前 楼主 显示全部楼层
zlm_525 发表于 2026-4-22 22:51
No response received: No module named 'agent.transports'
Verify your API key is valid and the select ...

你看看挂载目录 `hermes/hermes` 有没有文件 没有的话用脚本重新初始化一次
之前脚本忘记更新了
我是导出了源码的. 不知道为啥.可能是minimax不支持webiui?  详情 回复
3 天前

12

主题

76

回帖

0

牛值

初出茅庐

fnOS1.0上线纪念勋章

3 天前 楼主 显示全部楼层
目前 Hermes 不支持自定义 OpenResponses  响应,所以注意一下模型请求的响应方式,目前测试的支持这个响应的好像就 Openclaw 还好点,别的自行测试

0

主题

2

回帖

0

牛值

江湖小虾

清风小道君 发表于 2026-4-23 10:23
你看看挂载目录 `hermes/hermes` 有没有文件 没有的话用脚本重新初始化一次
之前脚本忘记更新了
...

我是导出了源码的.
不知道为啥.可能是minimax不支持webiui?
可以先用 其他模型测试一下,看看是不是配置的问题  详情 回复
3 天前

0

主题

2

回帖

0

牛值

系统先锋体验团🛩️

Hermes Agent 三合一  顶一个~

12

主题

76

回帖

0

牛值

初出茅庐

fnOS1.0上线纪念勋章

3 天前 楼主 显示全部楼层
zlm_525 发表于 2026-4-23 19:15
我是导出了源码的.
不知道为啥.可能是minimax不支持webiui?

可以先用 其他模型测试一下,看看是不是配置的问题

2

主题

9

回帖

0

牛值

fnOS系统内测组

社区上线纪念勋章

/vol1/1000/docker/hermes-agent# ./init.sh
-bash: ./init.sh: cannot execute: required file not found 提示这个问题

根据deepseek提示 执行了

`# 1. 检查镜像是否存在

docker images | grep hermes-agent

2. 如果镜像不存在,需要先拉取

docker pull nousresearch/hermes-agent:latest

3. 或者检查是否能访问 Docker Hub

docker pull hello-world

4. 手动运行脚本中的关键命令来测试

cd /vol1/1000/docker/hermes-agent
docker run --rm nousresearch/hermes-agent:latest --entrypoint sh -c 'ls -la /opt/'`

之后再执行docker compose up -d 成功

image.png

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

0

主题

1

回帖

0

牛值

江湖小虾

楼主好,想请教一下,我直接用docker-compose.yml的,容器运行正常,绑定到微信对话正常,但是打开8787端口,输入对话就不行,提示:

Error: AIAgent not available -- check that hermes-agent is on sys.path

init.sh 执行了吗  详情 回复
3 天前
看一下日志 webui 的日志  详情 回复
3 天前

12

主题

76

回帖

0

牛值

初出茅庐

fnOS1.0上线纪念勋章

3 天前 楼主 显示全部楼层
jfla 发表于 2026-4-23 23:06
楼主好,想请教一下,我直接用docker-compose.yml的,容器运行正常,绑定到微信对话正常,但是打开8787端口 ...

看一下日志 webui 的日志

12

主题

76

回帖

0

牛值

初出茅庐

fnOS1.0上线纪念勋章

3 天前 楼主 显示全部楼层
jfla 发表于 2026-4-23 23:06
楼主好,想请教一下,我直接用docker-compose.yml的,容器运行正常,绑定到微信对话正常,但是打开8787端口 ...

init.sh 执行了吗

12

主题

76

回帖

0

牛值

初出茅庐

fnOS1.0上线纪念勋章

3 天前 楼主 显示全部楼层

upload 附件:fn-hermes.zip

如果还是不行的话用这个试试

目录在 @appdata/fn-hermes 管理员视角

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

0

主题

1

回帖

0

牛值

江湖小虾

感谢,部署成功,有个下插曲,NAS 连接WINDOWS 下的 ollama,配置文件错误,试错了很久,找到了正确的方法

http://192.168.110.111:11434

ollama-local

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则