README: fehlenden Dashboard-Auth-Setup-Schritt ergaenzen + Henne-Ei-Bug fixen

README dokumentierte den seit 19.07.2026 pflichtigen Dashboard-Auth-Block
(HERMES_DASHBOARD_USER/PASSWORD_HASH, dashboard.basic_auth in config.yaml)
noch gar nicht - neuer Setup-Schritt 4, Schritt 7/8 umnummeriert, Architektur-
Diagramm und Sicherheitshinweis auf den 0.0.0.0-Dashboard-Stand gebracht.

Nebenbei echten Bug gefunden: .env.example und config.yaml.example sagten,
den Passwort-Hash per 'docker exec hermes-agent-dashboard' zu erzeugen -
aber genau dieser Container startet ohne bereits gesetztes
HERMES_DASHBOARD_PASSWORD_HASH gar nicht (docker-compose :?-Pflichtvar).
Hash muss gegen 'hermes-agent' erzeugt werden, der teilt sich das Image
ohne die Pflicht-Var.
This commit is contained in:
ARIA
2026-07-19 21:41:57 +00:00
parent 11341c8521
commit 68bdc0968f
3 changed files with 68 additions and 23 deletions
+5 -3
View File
@@ -23,10 +23,12 @@ HERMES_GID=10000
# Pflicht seit 19.07.2026, SOBALD hermes-agent-dashboard auf 0.0.0.0 bindet: # Pflicht seit 19.07.2026, SOBALD hermes-agent-dashboard auf 0.0.0.0 bindet:
# Hermes verweigert sonst den Start hart ("no auth providers are registered"). # Hermes verweigert sonst den Start hart ("no auth providers are registered").
# HERMES_DASHBOARD_USER ist Klartext (frei waehlbar), HERMES_DASHBOARD_PASSWORD_HASH # HERMES_DASHBOARD_USER ist Klartext (frei waehlbar), HERMES_DASHBOARD_PASSWORD_HASH
# ist NIEMALS das Klartext-Passwort, sondern der Hash daraus. Erzeugen (einmalig, # ist NIEMALS das Klartext-Passwort, sondern der Hash daraus. Erzeugen (einmalig):
# im laufenden Dashboard-Container): # docker exec -it hermes-agent python -c \
# docker exec -it hermes-agent-dashboard python -c \
# "from plugins.dashboard_auth.basic import hash_password; print(hash_password('DEIN-PASSWORT'))" # "from plugins.dashboard_auth.basic import hash_password; print(hash_password('DEIN-PASSWORT'))"
# WICHTIG: gegen den "hermes-agent"-Container, NICHT "hermes-agent-dashboard" —
# der braucht HERMES_DASHBOARD_PASSWORD_HASH schon zum Hochfahren (Henne-Ei-
# Problem, siehe docker-compose.yml), "hermes-agent" laeuft auch ohne.
# Den Output (nicht das Passwort selbst!) hier eintragen. # Den Output (nicht das Passwort selbst!) hier eintragen.
HERMES_DASHBOARD_USER=admin HERMES_DASHBOARD_USER=admin
HERMES_DASHBOARD_PASSWORD_HASH= HERMES_DASHBOARD_PASSWORD_HASH=
+56 -17
View File
@@ -28,7 +28,9 @@ hermes-agent (Nous Research, network_mode: host)
v v
Anthropic (ueber deine Claude-Max-Subscription) Anthropic (ueber deine Claude-Max-Subscription)
hermes-agent-dashboard (127.0.0.1:9119, Hermes' eigenes Web-UI/Setup) hermes-agent-dashboard (0.0.0.0:9119, Hermes' eigenes Web-UI/Setup, per
Basic-Auth gesichert seit 19.07.2026 — Stefans
Entscheidung, siehe Sicherheitshinweis)
``` ```
Warum das Gateway trotzdem noch da ist, obwohl alles auf einer Maschine Warum das Gateway trotzdem noch da ist, obwohl alles auf einer Maschine
@@ -81,22 +83,48 @@ aussen — kein anderer Rechner kommt mehr direkt ran.
beim Config-Laden aus den Container-Env-Vars expandiert, die kommen aus beim Config-Laden aus den Container-Env-Vars expandiert, die kommen aus
Deiner `.env`. Kein manuelles Ausfuellen noetig. Deiner `.env`. Kein manuelles Ausfuellen noetig.
4. **Stack starten:** 4. **Dashboard-Auth einrichten** (Pflicht seit 19.07.2026 — `hermes-agent-dashboard`
laeuft mit `--host 0.0.0.0` und Hermes verweigert diesen Bind hart, wenn
kein Auth-Provider registriert ist: `Refusing to bind dashboard to
0.0.0.0 — the auth gate engages on non-loopback binds, but no auth
providers are registered`. Ohne diesen Schritt kommt der Dashboard-
Container beim naechsten Schritt gar nicht hoch):
```bash
# HERMES_DASHBOARD_USER in .env ist Klartext, HERMES_DASHBOARD_PASSWORD_HASH
# ist NIEMALS das Klartext-Passwort, sondern der Hash daraus. Erzeugen kannst
# Du den erst NACHDEM Schritt 5 unten (docker compose up -d) mindestens
# hermes-agent hochgefahren hat -- gegen "hermes-agent", NICHT
# "hermes-agent-dashboard" (der braucht den Hash schon zum Start, Henne-Ei):
docker exec -it hermes-agent python -c \
"from plugins.dashboard_auth.basic import hash_password; print(hash_password('DEIN-PASSWORT'))"
```
Output (den Hash, nicht das Passwort) in `.env` bei `HERMES_DASHBOARD_PASSWORD_HASH`
eintragen, `HERMES_DASHBOARD_USER` nach Belieben setzen (Default `admin`).
Der `dashboard.basic_auth`-Block dazu liegt schon fertig in
`hermes-agent-config/config.yaml.example` (Platzhalter, die Hermes selbst
aus den Container-Env-Vars expandiert — kein manuelles Ausfuellen noetig,
siehe Schritt 3).
5. **Stack starten:**
```bash ```bash
docker compose up -d docker compose up -d
``` ```
Baut beim ersten Mal das Hermes-Image aus `hermes-agent-src` (dauert ein Baut beim ersten Mal das Hermes-Image aus `hermes-agent-src` (dauert ein
paar Minuten), startet dann `hermes-proxy`, `hermes-gateway`, paar Minuten), startet dann `hermes-proxy`, `hermes-gateway`,
`hermes-agent` (Gateway/Messaging-Prozess) und `hermes-agent-dashboard`. `hermes-agent` (Gateway/Messaging-Prozess) und `hermes-agent-dashboard`.
Falls `HERMES_DASHBOARD_PASSWORD_HASH` noch leer ist (Schritt 4 noch nicht
gemacht): `hermes-agent-dashboard` bricht beim Start ab, die anderen drei
Services laufen trotzdem — Hash nachtragen, dann
`docker compose up -d hermes-agent-dashboard`.
5. **Einmalig Claude-CLI-Login** (oeffnet Browser-OAuth mit deiner Claude-Max-Subscription): 6. **Einmalig Claude-CLI-Login** (oeffnet Browser-OAuth mit deiner Claude-Max-Subscription):
```bash ```bash
docker exec -it hermes-proxy claude docker exec -it hermes-proxy claude
``` ```
Danach liegen die Credentials persistent in `hermes-data/claude-config/` Danach liegen die Credentials persistent in `hermes-data/claude-config/`
— ueberlebt Container-Restarts. — ueberlebt Container-Restarts.
6. **Testen, dass der Proxy laeuft:** 7. **Testen, dass der Proxy laeuft:**
```bash ```bash
curl -s http://127.0.0.1:${HERMES_GATEWAY_PORT:-8447}/v1/chat/completions \ curl -s http://127.0.0.1:${HERMES_GATEWAY_PORT:-8447}/v1/chat/completions \
-H "Content-Type: application/json" \ -H "Content-Type: application/json" \
@@ -105,15 +133,15 @@ aussen — kein anderer Rechner kommt mehr direkt ran.
``` ```
Ohne oder mit falschem Bearer-Token gibt's `401 unauthorized`. Ohne oder mit falschem Bearer-Token gibt's `401 unauthorized`.
7. **Mit Hermes chatten:** 8. **Mit Hermes chatten:**
```bash ```bash
docker exec -it hermes-agent hermes chat docker exec -it hermes-agent hermes chat
``` ```
oder das Dashboard per SSH-Tunnel oeffnen: oder das Dashboard direkt im Browser oeffnen: `http://<diese-maschine>:9119`
```bash — bindet auf `0.0.0.0`, kein SSH-Tunnel mehr noetig, dafuer fragt es jetzt
ssh -L 9119:localhost:9119 <diese-maschine> den Basic-Auth-Login aus Schritt 4 ab. Traffic ist weiterhin unverschluesseltes
``` HTTP (siehe Sicherheitshinweis unten) — fuer mehr als "kurz testen" gehoert
dann im Browser `http://localhost:9119`. ein TLS-Reverse-Proxy davor.
## Mobiler Client (Android)? ## Mobiler Client (Android)?
@@ -132,13 +160,24 @@ Zwei GRUNDVERSCHIEDENE Richtungen, nicht verwechseln:
## Sicherheitshinweis ## Sicherheitshinweis
`hermes-gateway` bindet jetzt nur noch auf `127.0.0.1` — von aussen kommt `hermes-gateway` bindet nur auf `127.0.0.1` — von aussen kommt niemand mehr
niemand mehr ran, solange Du nicht selbst was aendertst (z.B. fuer den ran, solange Du nicht selbst was aendertst (z.B. fuer den mobilen API-Server
mobilen API-Server oben, oder falls Hermes doch mal auf eine zweite Maschine oben, oder falls Hermes doch mal auf eine zweite Maschine zieht).
zieht). Wenn Du `HERMES_GATEWAY_PORT` oder `API_SERVER_HOST` doch mal nach
aussen exposest: der Traffic ist unverschluesseltes HTTP, kein TLS. Nicht `hermes-agent-dashboard` bindet seit 19.07.2026 bewusst auf `0.0.0.0` (Stefans
direkt ins offene Internet haengen — SSH-Tunnel, WireGuard/Tailscale oder Entscheidung — ein SSH-Tunnel machte mit dem SSL-Setup Probleme) und ist per
einen TLS-Reverse-Proxy davorschalten. Basic-Auth gesichert (siehe Setup-Schritt 4, Hermes verweigert den 0.0.0.0-Bind
sonst ohnehin hart). Das ist Testzustand, kein Dauerbetrieb-Haerten: das
Passwort geht als HTTP Basic-Auth unverschluesselt raus (kein TLS auf Port
9119), Keys/Config/Sessions liegen dahinter offen. Fuer Dauerbetrieb gehoert
ein TLS-Reverse-Proxy (Caddy/nginx) davor, der Basic-Auth + Zertifikat
uebernimmt — Dashboard-Port dann wieder `127.0.0.1`, nur der Proxy von aussen
erreichbar.
Generell gilt: wenn Du `HERMES_GATEWAY_PORT`, `API_SERVER_HOST` oder den
Dashboard-Port doch mal direkt nach aussen exposest, ist der Traffic
unverschluesseltes HTTP, kein TLS. Nicht direkt ins offene Internet haengen —
SSH-Tunnel, WireGuard/Tailscale oder einen TLS-Reverse-Proxy davorschalten.
## Verzeichnisse (nicht committet, siehe .gitignore) ## Verzeichnisse (nicht committet, siehe .gitignore)
+7 -3
View File
@@ -39,9 +39,13 @@ model:
# but no auth providers are registered"). Ohne diesen Block bindet's nur # but no auth providers are registered"). Ohne diesen Block bindet's nur
# noch auf 127.0.0.1 (Tunnel), egal was im docker-compose `command:` steht. # noch auf 127.0.0.1 (Tunnel), egal was im docker-compose `command:` steht.
# #
# Hash EINMALIG erzeugen (im laufenden Dashboard-Container, NICHT das # Hash EINMALIG erzeugen (NICHT das Klartext-Passwort committen oder in .env
# Klartext-Passwort committen oder in .env schreiben — nur den Hash): # schreiben — nur den Hash). Gegen den "hermes-agent"-Container, NICHT
# docker exec -it hermes-agent-dashboard python -c \ # "hermes-agent-dashboard" — der braucht HERMES_DASHBOARD_PASSWORD_HASH schon
# zum Hochfahren (Henne-Ei-Problem: ohne Hash kein Start, ohne laufenden
# Container kein Hash). "hermes-agent" teilt sich dasselbe Image und laeuft
# auch ohne den Wert:
# docker exec -it hermes-agent python -c \
# "from plugins.dashboard_auth.basic import hash_password; print(hash_password('DEIN-PASSWORT'))" # "from plugins.dashboard_auth.basic import hash_password; print(hash_password('DEIN-PASSWORT'))"
# Ergebnis nach .env als HERMES_DASHBOARD_PASSWORD_HASH eintragen. # Ergebnis nach .env als HERMES_DASHBOARD_PASSWORD_HASH eintragen.
# #