Post

Deploy Hermes Agent & Web UI with Docker Compose

用 Docker Compose 一站式部署 Hermes Agent 同 Hermes Web UI,適合 home server / VPS 長時間運行。

架構概覽

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
+------------------+     +------------------+
|  Hermes Agent    |     |  Hermes Web UI   |
|  (Gateway)       |     |  (Dashboard)     |
|  :8642 (API)     |     |  :8787 (UI)      |
+--------+---------+     +--------+---------+
         |                         |
         +----------+--------------+
                    |
            +-------v--------+
            |  ~/.hermes     |
            |  (persistent)  |
            |  config.yaml   |
            |  .env          |
            |  sessions/     |
            |  skills/       |
            |  memories/     |
            +----------------+

兩個 container:

  • hermes — Hermes Agent gateway(跑 agent 邏輯)
  • hermes-webui — Web dashboard(瀏覽器介面)

共用同一個 ~/.hermes host directory,保持 config、memory、sessions 一致。

環境要求

  • Docker 24+
  • Docker Compose v2+
  • 最少 2GB RAM(Agent 4GB limit)

步驟

1. 建立專案目錄

1
mkdir -p ~/hermes-docker && cd ~/hermes-docker

2. 設定 UID / GID

確認你嘅 user ID 同 group ID(通常係 1000):

1
2
id
# uid=1000(heston) gid=1000(heston) ...

3. 建立 .env 檔案

1
2
3
# .env
HERMES_UID=1000
HERMES_GID=1000

[!warning] 安全提醒 .env 必須入 .gitignore

4. 建立 docker-compose.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
services:
  hermes:
    image: nousresearch/hermes-agent:latest
    container_name: hermes
    restart: unless-stopped
    environment:
      - HERMES_UID=${HERMES_UID:-1000}
      - HERMES_GID=${HERMES_GID:-1000}
      - HERMES_WRITE_SAFE_ROOT=/opt/data:/workspace
    command: gateway run
    ports:
      - "8642:8642"
    volumes:
      - ~/.hermes:/opt/data
      - ~/hermes-workspace:/workspace
      - /var/run/docker.sock:/var/run/docker.sock
      - hermes-agent-src:/opt/hermes     # 新增:畀 WebUI 讀 agent source
    deploy:
      resources:
        limits:
          memory: 4G
          cpus: "2.0"
    shm_size: 1g
    networks:
      - hermes-net

  hermes-webui:
    image: ghcr.io/nesquena/hermes-webui:latest
    container_name: hermes-webui
    restart: unless-stopped
    depends_on:
      - hermes
    ports:
      - "127.0.0.1:8787:8787"    # 要 LAN/Tailscale 存取先好拎走 127.0.0.1
    volumes:
      - ~/.hermes:/home/hermeswebui/.hermes # 同 agent 同一個 host dir
      - hermes-agent-src:/home/hermeswebui/.hermes/hermes-agent:ro
      - ~/hermes-workspace:/workspace
    environment:
      - WANTED_UID=${HERMES_UID:-1000}
      - WANTED_GID=${HERMES_GID:-1000}
      - HERMES_WEBUI_HOST=0.0.0.0
      - HERMES_WEBUI_PORT=8787
      - HERMES_WEBUI_STATE_DIR=/home/hermeswebui/.hermes/webui
      # - HERMES_WEBUI_PASSWORD=your-secret   # expose 出網必設
      # - HERMES_SKIP_CHMOD=1          # 若 host ~/.hermes/.env 係 0640
    networks:
      - hermes-net

networks:
  hermes-net:
    driver: bridge

volumes:
  hermes-agent-src:      # 首次 up 會自動從 image /opt/hermes 填入

5. 啟動

1
docker compose up -d

6. 驗證

1
2
3
4
5
6
7
8
9
10
11
# 檢查 container 狀態
docker compose ps

# 檢查 logs
docker compose logs -f hermes

# Smoke test
docker compose exec hermes hermes doctor

# 發送一個測試訊息
docker compose exec hermes hermes chat -q "Say hello"

目錄結構

1
2
3
4
5
6
7
8
9
10
11
12
~/hermes-docker/
├── docker-compose.yml
├── .env
├── .gitignore
├── ~/.hermes/              # host 端,container 掛載到 /opt/data
│   ├── config.yaml
│   ├── .env
│   ├── skills/
│   ├── memories/
│   ├── sessions/
│   └── logs/
└── ~/hermes-workspace/     # 工作區,agent + webui 共用

常見操作

查看 logs

1
docker compose logs -f hermes

更新版本

1
2
docker compose pull
docker compose up -d   # ~/.hermes 不變,只會重建 image

進入 shell

1
docker compose exec hermes sh

重啟 gateway

1
docker compose restart hermes

停止服務

1
docker compose down

關鍵設定說明

HERMES_WRITE_SAFE_ROOT

將 Agent 嘅 safe write root 映射到你嘅 workspace,令到 container 內寫文件會落返 host ~/hermes-workspace/

/var/run/docker.sock

畀 Hermes Agent 有權限控制 Docker(例如跑 docker compose 命令)。如果唔需要可移除。

Web UI 綁定 127.0.0.1

hermes-webui 嘅 port 8787 綁定 127.0.0.1,即係只可從 server 本機訪問。如果要 LAN / Tailscale 外部訪問:

1
2
ports:
  - "8787:8787"

並且建議設定密碼:

1
2
environment:
  - HERMES_WEBUI_PASSWORD=your-secret

LXC 注意事項

如果跑喺 Proxmox LXC 度,可能缺 iptable_nat kernel module 導致 port mapping 失效。解決方案:

方案 A:用 network_mode: host 代替 ports:

1
2
3
4
services:
  hermes:
    network_mode: host
    # 去掉 'ports:' 配置

方案 B:用 Nginx reverse proxy 喺 host 度转发,container 只 listen 127.0.0.1:8642

問題排查

問題解法
hermes doctor 報 provider 錯誤檢查 ~/.hermes/.env 入面 API key 是否正確
Gateway 無法連接確認 port 8642 無衝突,docker compose logs 睇 error
Web UI 打唔開檢查 port 8787 是否被 bind,127.0.0.1 代表只能本機訪問
Permission denied 寫 files檢查 UID/GID 是否同 host user 一致,docker compose exec hermes id
Volume hermes-agent-src首次 build 會由 image 複製,docker compose up --build 重試
Memory 不足調整 deploy.resources.limits.memory,最少 2G

相關連結

This post is licensed under CC BY 4.0 by the author.