187 lines
6.6 KiB
YAML
187 lines
6.6 KiB
YAML
x-hermes-build: &hermes-build
|
|
context: .
|
|
dockerfile: Dockerfile
|
|
args:
|
|
HERMES_AGENT_REF: ${HERMES_AGENT_REF:-458a94e42568b332e8794ca8fbb8c8e1279160a3}
|
|
|
|
x-hermes-image: &hermes-image ${HERMES_IMAGE:-10.0.3.6:4000/zachariahsharma/hermes-control-plane:latest}
|
|
|
|
x-hermes-environment: &hermes-environment
|
|
HOME: /home/hermes
|
|
HERMES_HOME: /home/hermes/.hermes
|
|
HERMES_EXE: /opt/hermes-agent/venv/bin/hermes
|
|
CODEX_HOME: /home/hermes/.codex
|
|
CLAUDE_CONFIG_DIR: /home/hermes/.claude
|
|
GEMINI_CONFIG_DIR: /home/hermes/.gemini
|
|
BROWSER: ${HERMES_OAUTH_BROWSER:-echo}
|
|
NO_COLOR: "1"
|
|
HERMES_NO_TUI: "1"
|
|
|
|
x-hermes-volumes: &hermes-volumes
|
|
- type: bind
|
|
source: ${HERMES_HOME_HOST:-/opt/hermes-control-plane/hermes}
|
|
target: /home/hermes/.hermes
|
|
bind:
|
|
create_host_path: true
|
|
- type: bind
|
|
source: ${CODEX_HOME_HOST:-/opt/hermes-control-plane/codex}
|
|
target: /home/hermes/.codex
|
|
bind:
|
|
create_host_path: true
|
|
- type: bind
|
|
source: ${CLAUDE_HOME_HOST:-/opt/hermes-control-plane/claude}
|
|
target: /home/hermes/.claude
|
|
bind:
|
|
create_host_path: true
|
|
- type: bind
|
|
source: ${GEMINI_HOME_HOST:-/opt/hermes-control-plane/gemini}
|
|
target: /home/hermes/.gemini
|
|
bind:
|
|
create_host_path: true
|
|
|
|
x-db-url: &db-url "postgresql://hermes:${POSTGRES_PASSWORD:-hermes-change-me}@hermes-postgres:5432/hermes"
|
|
|
|
services:
|
|
hermes-postgres:
|
|
image: postgres:16-alpine
|
|
restart: unless-stopped
|
|
environment:
|
|
POSTGRES_USER: hermes
|
|
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-hermes-change-me}
|
|
POSTGRES_DB: hermes
|
|
volumes:
|
|
- hermes-postgres-data:/var/lib/postgresql/data
|
|
healthcheck:
|
|
test: ["CMD-SHELL", "pg_isready -U hermes -d hermes"]
|
|
interval: 10s
|
|
timeout: 5s
|
|
retries: 10
|
|
start_period: 30s
|
|
|
|
hermes-control-plane:
|
|
build: *hermes-build
|
|
image: *hermes-image
|
|
user: ${HERMES_CONTAINER_USER:-0:0}
|
|
restart: unless-stopped
|
|
ports:
|
|
- "${HERMES_PUBLISHED_BIND_IP:-127.0.0.1}:${HERMES_SETUP_UI_PORT:-7843}:7843"
|
|
environment:
|
|
<<: *hermes-environment
|
|
HERMES_SETUP_UI_HOST: 0.0.0.0
|
|
HERMES_SETUP_UI_PORT: 7843
|
|
DATABASE_URL: *db-url
|
|
HERMES_ADMIN_USERNAME: ${HERMES_ADMIN_USERNAME:-admin}
|
|
HERMES_ADMIN_PASSWORD: ${HERMES_ADMIN_PASSWORD}
|
|
HERMES_ADMIN_SESSION_TTL_HOURS: ${HERMES_ADMIN_SESSION_TTL_HOURS:-12}
|
|
HERMES_ADMIN_COOKIE_SECURE: ${HERMES_ADMIN_COOKIE_SECURE:-false}
|
|
HERMES_LOG_RETENTION_DAYS: ${HERMES_LOG_RETENTION_DAYS:-90}
|
|
volumes: *hermes-volumes
|
|
depends_on:
|
|
hermes-postgres:
|
|
condition: service_healthy
|
|
healthcheck:
|
|
test: ["CMD-SHELL", "node -e \"fetch('http://127.0.0.1:7843/health').then(r=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))\""]
|
|
interval: 30s
|
|
timeout: 10s
|
|
retries: 3
|
|
start_period: 10s
|
|
|
|
hermes-ai-upstream:
|
|
profiles: ["pre-gateway", "post-gateway"]
|
|
build: *hermes-build
|
|
image: *hermes-image
|
|
user: ${HERMES_CONTAINER_USER:-0:0}
|
|
restart: unless-stopped
|
|
expose:
|
|
- "8642"
|
|
command:
|
|
- /bin/sh
|
|
- -lc
|
|
- exec "$$HERMES_EXE" gateway run --replace --accept-hooks
|
|
environment:
|
|
<<: *hermes-environment
|
|
API_SERVER_ENABLED: "true"
|
|
API_SERVER_HOST: 0.0.0.0
|
|
API_SERVER_PORT: 8642
|
|
API_SERVER_KEY: ${HERMES_INTERNAL_API_SERVER_KEY:-change-this-internal-hermes-key}
|
|
volumes: *hermes-volumes
|
|
healthcheck:
|
|
test: ["CMD-SHELL", "node -e \"fetch('http://127.0.0.1:8642/health').then(r=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))\""]
|
|
interval: 30s
|
|
timeout: 10s
|
|
retries: 3
|
|
start_period: 20s
|
|
|
|
hermes-pre-api:
|
|
profiles: ["pre-gateway"]
|
|
build: *hermes-build
|
|
image: *hermes-image
|
|
user: ${HERMES_CONTAINER_USER:-0:0}
|
|
restart: unless-stopped
|
|
command: ["node", "/app/api-gateway.cjs"]
|
|
ports:
|
|
- "${HERMES_PUBLISHED_BIND_IP:-127.0.0.1}:${HERMES_PRE_AI_API_PORT:-8645}:8645"
|
|
environment:
|
|
DATABASE_URL: *db-url
|
|
HERMES_API_ROUTE_KIND: pre
|
|
HERMES_API_GATEWAY_HOST: 0.0.0.0
|
|
HERMES_API_GATEWAY_PORT: 8645
|
|
HERMES_UPSTREAM_URL: http://hermes-ai-upstream:8642
|
|
HERMES_UPSTREAM_API_KEY: ${HERMES_INTERNAL_API_SERVER_KEY:-change-this-internal-hermes-key}
|
|
HERMES_DEFAULT_PROVIDER: ${HERMES_DEFAULT_PROVIDER:-openai-codex}
|
|
HERMES_DEFAULT_THINKING_EFFORT: ${HERMES_DEFAULT_THINKING_EFFORT:-medium}
|
|
HERMES_DEFAULT_CLAUDE_MODEL: ${HERMES_DEFAULT_CLAUDE_MODEL:-claude-sonnet-4.6}
|
|
HERMES_DEFAULT_CODEX_MODEL: ${HERMES_DEFAULT_CODEX_MODEL:-gpt-5.4}
|
|
HERMES_DEFAULT_GEMINI_MODEL: ${HERMES_DEFAULT_GEMINI_MODEL:-gemini-3.5-flash}
|
|
HERMES_LOG_RETENTION_DAYS: ${HERMES_LOG_RETENTION_DAYS:-90}
|
|
HERMES_AUDIT_MAX_BYTES: ${HERMES_AUDIT_MAX_BYTES:-10485760}
|
|
depends_on:
|
|
hermes-postgres:
|
|
condition: service_healthy
|
|
hermes-ai-upstream:
|
|
condition: service_started
|
|
healthcheck:
|
|
test: ["CMD-SHELL", "node -e \"fetch('http://127.0.0.1:8645/health').then(r=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))\""]
|
|
interval: 30s
|
|
timeout: 10s
|
|
retries: 3
|
|
start_period: 10s
|
|
|
|
hermes-post-api:
|
|
profiles: ["post-gateway"]
|
|
build: *hermes-build
|
|
image: *hermes-image
|
|
user: ${HERMES_CONTAINER_USER:-0:0}
|
|
restart: unless-stopped
|
|
command: ["node", "/app/api-gateway.cjs"]
|
|
ports:
|
|
- "${HERMES_PUBLISHED_BIND_IP:-127.0.0.1}:${HERMES_POST_AI_API_PORT:-8646}:8646"
|
|
environment:
|
|
DATABASE_URL: *db-url
|
|
HERMES_API_ROUTE_KIND: post
|
|
HERMES_API_GATEWAY_HOST: 0.0.0.0
|
|
HERMES_API_GATEWAY_PORT: 8646
|
|
HERMES_UPSTREAM_URL: http://hermes-ai-upstream:8642
|
|
HERMES_UPSTREAM_API_KEY: ${HERMES_INTERNAL_API_SERVER_KEY:-change-this-internal-hermes-key}
|
|
HERMES_DEFAULT_PROVIDER: ${HERMES_DEFAULT_PROVIDER:-openai-codex}
|
|
HERMES_DEFAULT_THINKING_EFFORT: ${HERMES_DEFAULT_THINKING_EFFORT:-medium}
|
|
HERMES_DEFAULT_CLAUDE_MODEL: ${HERMES_DEFAULT_CLAUDE_MODEL:-claude-sonnet-4.6}
|
|
HERMES_DEFAULT_CODEX_MODEL: ${HERMES_DEFAULT_CODEX_MODEL:-gpt-5.4}
|
|
HERMES_DEFAULT_GEMINI_MODEL: ${HERMES_DEFAULT_GEMINI_MODEL:-gemini-3.5-flash}
|
|
HERMES_LOG_RETENTION_DAYS: ${HERMES_LOG_RETENTION_DAYS:-90}
|
|
HERMES_AUDIT_MAX_BYTES: ${HERMES_AUDIT_MAX_BYTES:-10485760}
|
|
depends_on:
|
|
hermes-postgres:
|
|
condition: service_healthy
|
|
hermes-ai-upstream:
|
|
condition: service_started
|
|
healthcheck:
|
|
test: ["CMD-SHELL", "node -e \"fetch('http://127.0.0.1:8646/health').then(r=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))\""]
|
|
interval: 30s
|
|
timeout: 10s
|
|
retries: 3
|
|
start_period: 10s
|
|
|
|
volumes:
|
|
hermes-postgres-data:
|