docs: fix docker-compose files + add three-container config — v0.50.96 (PR #708)

Fixes gateway port exposure, workspace path expansion, HERMES_WEBUI_STATE_DIR default, and adds three-container reference config with dashboard. All ports localhost-bound by default.
This commit is contained in:
nesquena-hermes
2026-04-19 00:10:05 -07:00
committed by GitHub
parent 067d96bb30
commit da1fdca22c
4 changed files with 153 additions and 6 deletions

View File

@@ -1,5 +1,29 @@
# Hermes Web UI -- Changelog # Hermes Web UI -- Changelog
## [v0.50.96] — 2026-04-19
### Added
- **Three-container Docker Compose reference config** — new `docker-compose.three-container.yml` adds an agent + dashboard + WebUI configuration on a shared `hermes-net` bridge, with memory/CPU limits and localhost-only port bindings by default.
### Fixed
- **Two-container compose: gateway port now exposed** — `127.0.0.1:8642:8642` added so the gateway is reachable from the host for debugging. Explicit `command: gateway run` replaces entrypoint defaults.
- **Workspace path expansion** — `${HERMES_WORKSPACE:-~/workspace}` uses tilde in the default value, which Docker Compose correctly expands. `docker-compose.yml` also fixed to use `${HERMES_WORKSPACE:-${HOME}/workspace}` instead of nesting workspace inside the hermes home dir.
- **`HERMES_WEBUI_STATE_DIR` default corrected** — `webui-mvp``webui`, matching the current default in `config.py`. Prevents silent state directory split for new deployments.
(PR #708)
## [v0.50.95] — 2026-04-19
### Added
- **Full Russian (ru-RU) localization** — 389/389 English keys covered, Slavic plural forms correctly implemented, native Cyrillic characters throughout. Login page Russian added. Russian locale now leads all non-English locales on key coverage. (PR #713, credit: @DrMaks22 and @renheqiang)
## [v0.50.92] — 2026-04-19
### Fixed
- **XML tool-call syntax no longer leaks into chat bubbles** — `<function_calls>` blocks stripped server-side in the streaming pipeline and client-side in both the live stream and history render. Fixes the default DeepSeek profile showing raw XML on starter prompts. (#702)
- **Workspace file panel shows an empty-state message** instead of a blank pane when no workspace is configured or the directory is empty. (#703)
- **Notification settings description uses "app" instead of "tab"** — more accurate for native Mac app users. (#704)
(PR #712)
## [v0.50.94] — 2026-04-19 ## [v0.50.94] — 2026-04-19
### Fixed ### Fixed

View File

@@ -0,0 +1,105 @@
# Three-container Docker Compose: Hermes Agent + Dashboard + WebUI
#
# This extends the two-container setup with the Hermes Dashboard for
# monitoring agent activity, sessions, and resource usage.
#
# Usage:
# docker compose -f docker-compose.three-container.yml up -d
#
# Services:
# hermes-agent — gateway API on port 8642 (CLI, Telegram, cron, tools)
# hermes-dashboard — monitoring dashboard on port 9119
# hermes-webui — browser chat interface on port 8787
#
# All three share the same hermes-home volume so config, sessions,
# skills, and memory are consistent across all surfaces.
services:
hermes-agent:
image: nousresearch/hermes-agent:latest
container_name: hermes-agent
command: gateway run
ports:
- "127.0.0.1:8642:8642"
volumes:
# Persist config, state, sessions, skills, memory across restarts
- hermes-home:/root/.hermes
# Expose agent source so the WebUI can install dependencies from it
- hermes-agent-src:/opt/hermes
environment:
- HERMES_HOME=/root/.hermes
restart: unless-stopped
deploy:
resources:
limits:
memory: 4G
cpus: "2.0"
networks:
- hermes-net
hermes-dashboard:
image: nousresearch/hermes-agent:latest
container_name: hermes-dashboard
command: dashboard --host 0.0.0.0 --insecure
ports:
- "127.0.0.1:9119:9119"
volumes:
- hermes-home:/root/.hermes
environment:
- HERMES_HOME=/root/.hermes
# Dashboard connects to the gateway for health/session data
- GATEWAY_HEALTH_URL=http://hermes-agent:8642
depends_on:
- hermes-agent
restart: unless-stopped
deploy:
resources:
limits:
memory: 512M
cpus: "0.5"
networks:
- hermes-net
hermes-webui:
image: ghcr.io/nesquena/hermes-webui:latest
container_name: hermes-webui
depends_on:
- hermes-agent
ports:
# Expose on localhost only. Remove 127.0.0.1: to expose on all interfaces
# (set HERMES_WEBUI_PASSWORD if doing so).
- "127.0.0.1:8787:8787"
volumes:
# Same hermes home as the agent — shares config, sessions, state
- hermes-home:/home/hermeswebui/.hermes
# Agent source mounted where docker_init.bash expects it.
# At startup the init script runs:
# uv pip install /home/hermeswebui/.hermes/hermes-agent
# which installs the agent and all its Python dependencies.
- hermes-agent-src:/home/hermeswebui/.hermes/hermes-agent
# Workspace directory — browse and edit files from the WebUI.
# Adapt the host path to your project directory.
- ${HERMES_WORKSPACE:-~/workspace}:/workspace
environment:
- HERMES_WEBUI_HOST=0.0.0.0
- HERMES_WEBUI_PORT=8787
- HERMES_WEBUI_STATE_DIR=/home/hermeswebui/.hermes/webui
# Match your host user's UID/GID for correct file permissions.
# Run `id -u` and `id -g` to find your values.
# On macOS, UIDs start at 501 (not 1000) — set these in a .env file:
# echo "UID=$(id -u)" >> .env && echo "GID=$(id -g)" >> .env
- WANTED_UID=${UID:-1000}
- WANTED_GID=${GID:-1000}
# Optional: set a password for remote access
# - HERMES_WEBUI_PASSWORD=your-secret-password
restart: unless-stopped
networks:
- hermes-net
networks:
hermes-net:
driver: bridge
volumes:
hermes-home:
hermes-agent-src:

View File

@@ -15,6 +15,12 @@ services:
hermes-agent: hermes-agent:
image: nousresearch/hermes-agent:latest image: nousresearch/hermes-agent:latest
container_name: hermes-agent container_name: hermes-agent
command: gateway run
ports:
# Gateway API — exposed on localhost only.
# Other containers on hermes-net reach it via http://hermes-agent:8642.
# Remove 127.0.0.1: to expose on the host network (e.g. for remote clients).
- "127.0.0.1:8642:8642"
volumes: volumes:
# Persist config, state, sessions, skills, memory across restarts # Persist config, state, sessions, skills, memory across restarts
- hermes-home:/root/.hermes - hermes-home:/root/.hermes
@@ -23,6 +29,8 @@ services:
environment: environment:
- HERMES_HOME=/root/.hermes - HERMES_HOME=/root/.hermes
restart: unless-stopped restart: unless-stopped
networks:
- hermes-net
hermes-webui: hermes-webui:
image: ghcr.io/nesquena/hermes-webui:latest image: ghcr.io/nesquena/hermes-webui:latest
@@ -41,19 +49,29 @@ services:
- hermes-agent-src:/home/hermeswebui/.hermes/hermes-agent - hermes-agent-src:/home/hermeswebui/.hermes/hermes-agent
# Workspace directory — browse and edit files from the WebUI. # Workspace directory — browse and edit files from the WebUI.
# Adapt the host path to your project directory. # Adapt the host path to your project directory.
- ~/workspace:/workspace # Override with: HERMES_WORKSPACE=/your/path docker compose up
- ${HERMES_WORKSPACE:-~/workspace}:/workspace
environment: environment:
- HERMES_WEBUI_HOST=0.0.0.0 - HERMES_WEBUI_HOST=0.0.0.0
- HERMES_WEBUI_PORT=8787 - HERMES_WEBUI_PORT=8787
- HERMES_WEBUI_STATE_DIR=/home/hermeswebui/.hermes/webui-mvp - HERMES_WEBUI_STATE_DIR=/home/hermeswebui/.hermes/webui
# Match your host user's UID/GID for correct file permissions. # Match your host user's UID/GID for correct file permissions.
# In two-container setups the WebUI auto-detects UID/GID from the shared # In two-container setups the WebUI auto-detects UID/GID from the shared
# hermes-home volume, but you can override explicitly if needed (#668): # hermes-home volume, but you can override explicitly if needed (#668):
# Run `id -u` and `id -g` to find your values.
# On macOS, UIDs start at 501 — set these in a .env file:
# echo "UID=$(id -u)" >> .env && echo "GID=$(id -g)" >> .env
- WANTED_UID=${UID:-1000} - WANTED_UID=${UID:-1000}
- WANTED_GID=${GID:-1000} - WANTED_GID=${GID:-1000}
# Optional: set a password for remote access # Optional: set a password for remote access
# - HERMES_WEBUI_PASSWORD=your-secret-password # - HERMES_WEBUI_PASSWORD=***
restart: unless-stopped restart: unless-stopped
networks:
- hermes-net
networks:
hermes-net:
driver: bridge
volumes: volumes:
hermes-home: hermes-home:

View File

@@ -15,7 +15,7 @@ services:
# macOS note: set UID and GID below to match your user ID (run `id -u` and `id -g`). # macOS note: set UID and GID below to match your user ID (run `id -u` and `id -g`).
- ${HERMES_HOME:-${HOME}/.hermes}:/home/hermeswebui/.hermes - ${HERMES_HOME:-${HOME}/.hermes}:/home/hermeswebui/.hermes
# Your workspace directory shown on first launch (adapt if yours is different, the container will use the mounted /workspace) # Your workspace directory shown on first launch (adapt if yours is different, the container will use the mounted /workspace)
- ${HERMES_HOME:-${HOME}}/workspace:/workspace - ${HERMES_WORKSPACE:-${HOME}/workspace}:/workspace
environment: environment:
# Set to your host user ID: run `id -u` and `id -g` to find them. # Set to your host user ID: run `id -u` and `id -g` to find them.
# On macOS, UIDs start at 501 (not 1000), so set UID and GID in a .env file: # On macOS, UIDs start at 501 (not 1000), so set UID and GID in a .env file:
@@ -27,8 +27,8 @@ services:
# Required: bind address and port # Required: bind address and port
- HERMES_WEBUI_HOST=0.0.0.0 - HERMES_WEBUI_HOST=0.0.0.0
- HERMES_WEBUI_PORT=8787 - HERMES_WEBUI_PORT=8787
# Where to store sessions, workspaces, and other state (default: ~/.hermes/webui-mvp) # Where to store sessions, workspaces, and other state (default: ~/.hermes/webui)
- HERMES_WEBUI_STATE_DIR=/home/hermeswebui/.hermes/webui-mvp - HERMES_WEBUI_STATE_DIR=/home/hermeswebui/.hermes/webui
# Default workspace directory shown on first launch # Default workspace directory shown on first launch
# - HERMES_WEBUI_DEFAULT_WORKSPACE=/workspace # - HERMES_WEBUI_DEFAULT_WORKSPACE=/workspace
# Optional: set a password for remote access # Optional: set a password for remote access