services: hermes: container_name: hermes image: nousresearch/hermes-agent:v2026.4.23 restart: unless-stopped tty: true stdin_open: true command: [ "gateway", "run" ] volumes: - hermes-data:/opt/data environment: API_SERVER_ENABLED: "true" API_SERVER_KEY: ${HERMES_API_KEY} API_SERVER_HOST: 0.0.0.0 API_SERVER_PORT: "8642" GATEWAY_ALLOW_ALL_USERS: "true" networks: - internal # No ports published - only the bridge is reachable from outside. # Dashboard (config/env/sessions/cron/tools APIs) — required: many # bridge endpoints proxy to it. On by default. hermes-dashboard: container_name: hermes-dashboard image: nousresearch/hermes-agent:v2026.4.23 restart: unless-stopped command: [ "dashboard", "--host", "0.0.0.0", "--port", "9119", "--no-open", "--insecure", ] volumes: - hermes-data:/opt/data environment: API_SERVER_KEY: ${HERMES_API_KEY} networks: - internal bridge: container_name: hermes-bridge image: ghcr.io/fathah/hermes-bridge:latest restart: unless-stopped depends_on: - hermes ports: - "8080:8080" volumes: - hermes-data:/opt/data # Needed for `docker exec hermes hermes gateway ...` gap-fill (PLAN §14 option A). # Socket access == root on host; remove if you do not need gateway lifecycle. - /var/run/docker.sock:/var/run/docker.sock environment: BRIDGE_TOKEN: ${BRIDGE_TOKEN} HERMES_API_KEY: ${HERMES_API_KEY} HERMES_CHAT_URL: http://hermes:8642 HERMES_DASH_URL: http://hermes-dashboard:9119 HERMES_HOME: /opt/data HERMES_CONTAINER_NAME: ${HERMES_CONTAINER_NAME:-hermes} networks: - internal volumes: hermes-data: networks: internal: