Hermes Agent selbst mit ins Compose: alles auf einer Maschine
Stefan-Entscheidung: Hermes Agent (Nous Research) laeuft auf derselben
Maschine wie der Claude-Max-Proxy, nicht mehr remote. Ergaenzt:
- hermes-agent + hermes-agent-dashboard Services (offizielle Definition,
gebaut aus separat geklontem hermes-agent-src/), network_mode: host
- hermes-agent-config/config.yaml.example: seedet Hermes' model:-Block
automatisch auf provider: custom -> unser hermes-gateway, per ${VAR}-
Expansion aus .env (kein manuelles Config-Editieren mehr)
- hermes-gateway bindet jetzt nur noch auf 127.0.0.1 statt 0.0.0.0, da
Hermes lokal mitlaeuft und kein Remote-Zugriff mehr noetig ist
- .gitignore fuer hermes-agent-src/, hermes-data/, .env (Secrets/Sourcecode
gehoeren nicht ins Repo)
- README auf Single-Machine-Architektur aktualisiert, inkl. Setup-Schritten
und Einordnung des optionalen API_SERVER (fuer spaeteren mobilen Client,
andere Richtung als unser Proxy)
This commit is contained in:
+85
-32
@@ -72,30 +72,19 @@ services:
|
||||
# offen im Netz haengt.
|
||||
# Zum manuellen Testen direkt im Container: docker exec -it hermes-proxy curl -s localhost:3456/v1/chat/completions ...
|
||||
|
||||
# ─── Hermes Gateway (Auth + Netzwerk-Expose) ───────────────
|
||||
# Stefan deployt den eigentlichen Hermes-Agent-Client (Nous Research,
|
||||
# https://github.com/NousResearch/hermes-agent, CLI/Desktop-App) SELBST
|
||||
# auf einer ANDEREN Maschine — hier steht daher kein hermes-agent-Service,
|
||||
# nur die Proxy-Seite, die Hermes von aussen ansprechen kann.
|
||||
# ─── Hermes Gateway (Auth vor dem Claude-Proxy) ────────────
|
||||
# Stefan hat entschieden: Hermes Agent selbst laeuft auf DERSELBEN Maschine
|
||||
# wie dieser Proxy-Stack (alles zu Hermes gehoerige auf eine Box). Trotzdem
|
||||
# bleibt dieses Gateway davor — hermes-proxy selbst hat keine Authentifizierung
|
||||
# (genau wie ARIAs Proxy) und ein anderer Container im selben Docker-Host
|
||||
# (oder spaeter doch mal ein zweiter Rechner) soll nicht ungefragt an die
|
||||
# Claude-Max-Subscription rankommen. Das Gateway (proxy-patches/gateway.js,
|
||||
# pure Node, keine Extra-Deps) prueft den Authorization: Bearer <TOKEN>
|
||||
# Header, leitet nur bei Match an hermes-proxy weiter. Alles andere -> 401.
|
||||
#
|
||||
# Weil "von aussen" heisst: der Proxy braucht einen echten Netzwerk-Port.
|
||||
# hermes-proxy selbst hat aber keine Authentifizierung eingebaut (siehe
|
||||
# Kommentar oben) — ein offener Port waere ein frei nutzbarer Claude-Max-
|
||||
# Zugang fuer jeden der ihn erreicht. Deshalb dieses schlanke Gateway
|
||||
# (proxy-patches/gateway.js, pure Node, keine Extra-Deps): prueft den
|
||||
# Authorization: Bearer <TOKEN> Header, leitet nur bei Match an
|
||||
# hermes-proxy weiter. Alles andere -> 401.
|
||||
#
|
||||
# In Hermes' ~/.hermes/config.yaml traegst du ein:
|
||||
# model:
|
||||
# provider: custom
|
||||
# model: "sonnet" # oder "opus" / "haiku" — siehe MODEL_MAP
|
||||
# # in proxy-patches/openai-to-cli.js
|
||||
# base_url: "http://<diese-maschine>:${HERMES_GATEWAY_PORT:-8447}/v1"
|
||||
# api_key: "<HERMES_GATEWAY_TOKEN aus .env>"
|
||||
# OpenAI-kompatible Clients schicken api_key automatisch als
|
||||
# "Authorization: Bearer <api_key>" — genau das prueft das Gateway, kein
|
||||
# Extra-Schritt auf Hermes-Seite noetig.
|
||||
# Der Hermes-Agent-Service unten ist per ${HERMES_GATEWAY_TOKEN} + diesem
|
||||
# Gateway vorverdrahtet (siehe hermes-agent-config/config.yaml.example) —
|
||||
# kein manuelles config.yaml-Editieren mehr noetig.
|
||||
hermes-gateway:
|
||||
image: node:22-alpine
|
||||
container_name: hermes-gateway
|
||||
@@ -110,19 +99,83 @@ services:
|
||||
- UPSTREAM_PORT=3456
|
||||
- LISTEN_PORT=8080
|
||||
ports:
|
||||
# Bindet auf ALLE Interfaces, damit Hermes von der anderen Maschine
|
||||
# rankommt. HERMES_GATEWAY_PORT in .env setzen (Default 8447).
|
||||
# WICHTIG (lies auch README "Sicherheitshinweis"): wenn diese Maschine
|
||||
# direkt im Internet haengt statt in einem vertrauenswuerdigen
|
||||
# LAN/VPN, den Port zusaetzlich per Firewall auf Hermes' IP
|
||||
# einschraenken oder per VPN/SSH-Tunnel statt direktem Expose fahren
|
||||
# — Bearer-Token schuetzt vor Fremdnutzung, aber der Traffic selbst
|
||||
# laeuft hier unverschluesselt (HTTP, kein TLS).
|
||||
- "${HERMES_GATEWAY_PORT:-8447}:8080"
|
||||
# Seit "alles auf einer Maschine": nur noch auf localhost binden, nicht
|
||||
# mehr auf allen Interfaces. Hermes Agent laeuft ja jetzt selbst hier
|
||||
# (network_mode: host, siehe unten) und erreicht localhost direkt.
|
||||
# Falls Du spaeter doch von einer ANDEREN Maschine ranwillst (z.B. fuer
|
||||
# einen mobilen Client direkt gegen Hermes' eigenen API-Server, siehe
|
||||
# Kommentar unten bei API_SERVER_*): "127.0.0.1:" vorne weglassen, dann
|
||||
# bindet's wieder auf 0.0.0.0 — aber dann auch das Sicherheitshinweis-
|
||||
# Kapitel im README zu TLS/VPN beachten.
|
||||
- "127.0.0.1:${HERMES_GATEWAY_PORT:-8447}:8080"
|
||||
restart: unless-stopped
|
||||
networks:
|
||||
- hermes-net
|
||||
|
||||
# ─── Hermes Agent selbst (Nous Research) ───────────────────
|
||||
# Offizielle Service-Definition 1:1 aus NousResearch/hermes-agent/docker-compose.yml
|
||||
# (nur umbenannt gateway->hermes-agent, dashboard->hermes-agent-dashboard, damit
|
||||
# es nicht mit unserem eigenen "hermes-gateway" oben verwechselt wird — das ist
|
||||
# ein GANZ ANDERES Ding: Hermes' eigener Gateway-Begriff meint die Messaging-
|
||||
# Bruecke (Telegram/Discord/...) + optionalen OpenAI-API-Server, NICHT unseren
|
||||
# Auth-Proxy vor Claude).
|
||||
#
|
||||
# VORAUSSETZUNG: der echte Hermes-Agent-Sourcecode muss danebenliegen, weil
|
||||
# das Image nicht auf Docker Hub existiert, sondern per `build:` aus dem Repo
|
||||
# gebaut wird. Einmalig VOR dem ersten `docker compose up -d`:
|
||||
# git clone https://github.com/NousResearch/hermes-agent.git hermes-agent-src
|
||||
#
|
||||
# network_mode: host wie im Original — manche Messaging-Plattformen brauchen
|
||||
# echte Host-Ports, und dadurch erreicht Hermes unser hermes-gateway einfach
|
||||
# ueber "http://localhost:${HERMES_GATEWAY_PORT}/v1" statt ueber Docker-DNS.
|
||||
hermes-agent:
|
||||
build: ./hermes-agent-src
|
||||
image: hermes-agent
|
||||
container_name: hermes-agent
|
||||
restart: unless-stopped
|
||||
network_mode: host
|
||||
depends_on:
|
||||
- hermes-gateway
|
||||
volumes:
|
||||
# ~/.hermes-Aequivalent: Config, Sessions, Memory, Skills - alles persistent
|
||||
# hier drin. hermes-agent-config/config.yaml.example wird VOR dem ersten
|
||||
# Start einmalig hierher kopiert (siehe README) und dann von Hermes
|
||||
# NICHT mehr angefasst (nur geseedet wenn's fehlt).
|
||||
- ./hermes-data/agent-home:/opt/data
|
||||
environment:
|
||||
- HERMES_UID=${HERMES_UID:-10000}
|
||||
- HERMES_GID=${HERMES_GID:-10000}
|
||||
# Fuer die ${HERMES_GATEWAY_PORT}/${HERMES_GATEWAY_TOKEN}-Platzhalter in
|
||||
# hermes-data/agent-home/config.yaml (Hermes expandiert ${VAR} beim
|
||||
# Config-Laden aus os.environ — siehe hermes_cli/config.py _expand_env_vars).
|
||||
- HERMES_GATEWAY_PORT=${HERMES_GATEWAY_PORT:-8447}
|
||||
- HERMES_GATEWAY_TOKEN=${HERMES_GATEWAY_TOKEN:?HERMES_GATEWAY_TOKEN muss in .env gesetzt sein - siehe .env.example}
|
||||
# Optional: Hermes' EIGENER OpenAI-kompatibler API-Server, falls Du spaeter
|
||||
# einen mobilen Client (gpt_mobile, Maid, OpenWebUI, ...) direkt GEGEN
|
||||
# Hermes sprechen lassen willst (andere Richtung als unser Proxy oben!
|
||||
# Das hier ist Hermes ALS Server fuer einen Chat-Client, nicht Claude ALS
|
||||
# Backend fuer Hermes). Zum Aktivieren beide Zeilen einkommentieren und
|
||||
# API_SERVER_KEY in .env setzen:
|
||||
# - API_SERVER_HOST=0.0.0.0
|
||||
# - API_SERVER_KEY=${API_SERVER_KEY}
|
||||
command: ["gateway", "run"]
|
||||
|
||||
hermes-agent-dashboard:
|
||||
image: hermes-agent
|
||||
container_name: hermes-agent-dashboard
|
||||
restart: unless-stopped
|
||||
network_mode: host
|
||||
depends_on:
|
||||
- hermes-agent
|
||||
volumes:
|
||||
- ./hermes-data/agent-home:/opt/data
|
||||
environment:
|
||||
- HERMES_UID=${HERMES_UID:-10000}
|
||||
- HERMES_GID=${HERMES_GID:-10000}
|
||||
# Bindet nur auf localhost (Hermes' eigene Empfehlung, speichert API-Keys).
|
||||
# Fuer Zugriff von aussen: `ssh -L 9119:localhost:9119 <diese-maschine>`.
|
||||
command: ["dashboard", "--host", "127.0.0.1", "--no-open"]
|
||||
|
||||
networks:
|
||||
hermes-net:
|
||||
driver: bridge
|
||||
|
||||
Reference in New Issue
Block a user