Skip to content

fix(docker): loopback dashboard bind + shared netns for hermes-agent auth gate - #694

Open
rameshio wants to merge 1 commit into
outsourc-e:mainfrom
rameshio:fix/dashboard-auth-gate-loopback
Open

fix(docker): loopback dashboard bind + shared netns for hermes-agent auth gate#694
rameshio wants to merge 1 commit into
outsourc-e:mainfrom
rameshio:fix/dashboard-auth-gate-loopback

Conversation

@rameshio

@rameshio rameshio commented Jul 7, 2026

Copy link
Copy Markdown

What changed

  • Bind the Hermes Agent dashboard to 127.0.0.1 instead of 0.0.0.0 in docker-compose.yml.
  • Run the hermes-workspace container with network_mode: 'service:hermes-agent' (shared network namespace) so it can still reach the dashboard and gateway over loopback.
  • Publish port 3000 on the hermes-agent service, since a container joining another service's network namespace cannot publish its own ports.

Why

nousresearch/hermes-agent:latest (June 2026 hardening, post hermes-0day campaign) refuses to bind the dashboard to any non-loopback host unless an auth provider is registered — there is no longer an unauthenticated public-bind option. This breaks the stock compose setup in two ways:

  1. With no auth provider configured, the agent exits at startup (Refusing to bind dashboard to 0.0.0.0) and never becomes healthy, so docker compose up fails on the service_healthy dependency.
  2. With a password provider configured, the dashboard root 302s to a login page, so the workspace can never scrape the ephemeral session token (fetchDashboardToken in src/server/gateway-capabilities.ts). Every dashboard-backed API then 401s and the chat UI shows "Authentication required — Hermes Agent rejected the connection token", even when API_SERVER_KEY/HERMES_API_TOKEN match correctly.

A loopback bind keeps the auth gate disengaged (trusted-operator model upstream intends for loopback), and the shared network namespace keeps the dashboard reachable from the workspace while making it less exposed than before — it is no longer on the compose bridge network at all.

Notes for reviewers

  • Verified on Windows 11 + Docker Desktop with the prebuilt images: agent becomes healthy, dashboard root returns 200 from the workspace container, capability probe reports missing=[] (sessions, skills, memory, config, jobs all available), and the auth banner is gone.
  • Host-published ports are unchanged in spirit: 127.0.0.1:3000 (workspace UI) and 127.0.0.1:8642 (gateway); 9119 remains unpublished.
  • The gateway keeps API_SERVER_HOST: 0.0.0.0 + API_SERVER_KEY auth as before; only the dashboard moves to loopback.

🤖 Generated with Claude Code

nousresearch/hermes-agent:latest (June 2026 hardening) refuses to bind
the dashboard to a non-loopback host unless an auth provider is
registered, so the stock compose setup (HERMES_DASHBOARD_HOST=0.0.0.0)
now fail-closes and the agent container never becomes healthy. And with
a password provider configured instead, the workspace cannot scrape the
ephemeral session token from the gated dashboard root, so every
dashboard-backed API 401s and chat shows 'Hermes Agent rejected the
connection token'.

Bind the dashboard to 127.0.0.1 (no auth gate on loopback) and run the
workspace container in the agent service network namespace
(network_mode: service:hermes-agent) so it can still reach the
dashboard and gateway over loopback. Port 3000 moves to the agent
service since a container joining another netns cannot publish ports.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@rameshio
rameshio requested a review from outsourc-e as a code owner July 7, 2026 00:20
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant