{"queue_id": 101, "relative_path": "Systemstruktur/Agenten-Wissen/Anthropic-Sonnet/ARC-036-Hermes-Commander-nginx-WebSocket-und-Portal-Kachel-Architektur.md", "title": "ARC-036: Hermes-Commander-nginx-WebSocket und Portal-Kachel-Architektur", "import_key": "b86e8ae865c62a67e0b0954b4db04b5c78debc9c00bd0a12a133ed605c8069ac", "chunk_count": 19, "created_nodes": 20, "created_relationships": 37, "body": null, "chunks": [{"chunk_key": "bdaca8ad366ba3bccd8b78e929aeab2e01c63f59da3b0ea2126425aaa609da65", "chunk_index": 0, "heading": "ARC-036: Hermes-Commander-nginx-WebSocket und Portal-Kachel-Architektur", "text": "# ARC-036: Hermes-Commander-nginx-WebSocket und Portal-Kachel-Architektur", "text_hash": "44a42f3a50e831a8ec3227e22bb963b974f60a692cde352a7d174cbf6afb9121"}, {"chunk_key": "ff751e29565a922b89e2d3c2bd47667e3989b8e956aea361d1ada086e331e34c", "chunk_index": 1, "heading": "Kernaussage", "text": "# ARC-036: Hermes-Commander-nginx-WebSocket und Portal-Kachel-Architektur\n## Kernaussage\n\nIm Juni 2026 wurden zwei technische Huerden beim Hermes-Commander (hermes-root)\ngeloest: (1) WebSocket-Verbindungsfehler durch fehlenden Origin-Header in nginx.\n(2) Approval-Dialog-Blockade durch Aktivierung von HERMES_YOLO_MODE. Zusaetzlich\nwurde die vollstaendige Kachel-Architektur des Agent-Solutions-Portals dokumentiert\nund ueberarbeitet.", "text_hash": "226613faee96c9101d7e8296cc7cb8c8c5d018aa2b66c5c8e70abbbe7fec2d38"}, {"chunk_key": "06ca48aefd40e119575e941a7a5bd3b7c1b5e7a901baee2d54f857e14d5c5afb", "chunk_index": 2, "heading": "Aus Sessions rekonstruiert, nicht live verifiziert", "text": "h Aktivierung von HERMES_YOLO_MODE. Zusaetzlich\nwurde die vollstaendige Kachel-Architektur des Agent-Solutions-Portals dokumentiert\nund ueberarbeitet.\n## Aus Sessions rekonstruiert, nicht live verifiziert\n\nAlle Angaben stammen aus Session 1c971ff0 (2026-06-28, Projekt K--Master).\nAktueller Konfigurationsstand von Nginx, systemd-Services und Portal-App\nmuss live verifiziert werden. Zugangsschluessle-Werte sind nicht dokumentiert.", "text_hash": "ad4a6fb21d4ba32b19f3480c5b9c4ae502714b3513f73030d9e4e8cca47ec431"}, {"chunk_key": "9e6a0330c1dc1ea505f922b46dee3901eea7336d685fe44a34fa75dbfe9c01da", "chunk_index": 3, "heading": "Getroffene Entscheidungen", "text": "ktueller Konfigurationsstand von Nginx, systemd-Services und Portal-App\nmuss live verifiziert werden. Zugangsschluessle-Werte sind nicht dokumentiert.\n## Getroffene Entscheidungen\n\n- HERMES_YOLO_MODE=1 in /root/.hermes/.env eingetragen — Approval-Dialoge\n fuer freigegebene Befehle werden nicht mehr angezeigt; direkte Ausfuehrung.\n Diese Einstellung war aktiv auf dem VPS (historisch — aktuellen Stand pruefen).\n- proxy_set_header Origin http://127.0.0.1; im nginx-WebSocket-Block eingefuegt\n (nicht im API-Block) — Dashboard erwartet Origin 127.0.0.1 fuer WebSocket-Handshake.\n- --insecure / --host 0.0.0.0 fuer Hermes-Dashboard wurde NICHT gewaehlt —\n Port 9119 waere damit oeffentlich ohne Firewall-Schutz (ufw auf VPS inaktiv).\n- Kachel Commander — Agent (stumme Info-Kachel ohne Link) aus Portal entfernt.\n- Hermes-Commander-Kacheln im Portal: umbenannt und URL auf /chat-Route gesetzt.", "text_hash": "40946284dc7abcaa1d7c9aab39cf32cfb1bb6bd8b350369e4adcdfab13f823d5"}, {"chunk_key": "53927552347a5d7c85052beccbf9bd2f124673f8c3ebd6400b668bbc9f7dab9c", "chunk_index": 4, "heading": "Funktionierende Loesungen", "text": "Commander — Agent (stumme Info-Kachel ohne Link) aus Portal entfernt.\n- Hermes-Commander-Kacheln im Portal: umbenannt und URL auf /chat-Route gesetzt.\n## Funktionierende Loesungen", "text_hash": "88e02a40e99d4a9ff4c65e81e1e90436adb5a61b294194b1bfdefa7ea6a2457b"}, {"chunk_key": "4a65737e0f0aada9ff2a5057724f24840f4943a17c56d5d7c7ca5f1ce7cbaa48", "chunk_index": 5, "heading": "Hermes-Root Architektur (historisch)", "text": "## Funktionierende Loesungen\n### Hermes-Root Architektur (historisch)\n\n| Eigenschaft | Wert (historisch) |\n|-------------|-------------------|\n| Service | hermes-root.service (systemd) |\n| Binary | /opt/hermes-root/venv/bin/hermes gateway run |\n| Linux-User | root |\n| WorkingDirectory | /opt/struktur/hermes-root-cockpit |\n| EnvironmentFile | /root/.hermes/.env |\n| Config | /root/.hermes/config.yaml |\n| Dashboard | Port 9119 (intern, ueber nginx) |\n\nAktuellen Stand immer live via systemctl status hermes-root.service pruefen.", "text_hash": "f3054b2f4619aed07de14faecd9c4e3cf95e764f18f745eaa67a9c4f58433696"}, {"chunk_key": "ffa3d9323e5bf0155d54595403344cd794f90826cfa4e834ac049397d2960d7a", "chunk_index": 6, "heading": "WebSocket-Problem Hermes-Dashboard — Root Cause", "text": "ot/.hermes/config.yaml |\n| Dashboard | Port 9119 (intern, ueber nginx) |\n\nAktuellen Stand immer live via systemctl status hermes-root.service pruefen.\n### WebSocket-Problem Hermes-Dashboard — Root Cause\n\nDas Hermes-Dashboard (Python) prueft bei WebSocket-Verbindungen via\n_ws_host_origin_reason() den Origin-Header gegen bound_host.\nDashboard ist an 127.0.0.1:9119 gebunden — _LOOPBACK_HOST_VALUES = {localhost, 127.0.0.1, ::1}.\nBrowser-Origin https://hermes-root.agentsolutions-mallorca.com passt nicht →\norigin_mismatch → WebSocket-Verbindung abgelehnt.\n\nFix: Im nginx-WebSocket-Location-Block (location /):\n proxy_set_header Origin http://127.0.0.1;\nDashboard sieht Origin 127.0.0.1 → akzeptiert. Nur dieser Block — nicht in\n/api/config- oder /api/config/raw-Bloecken.", "text_hash": "989091456b085be86f2d650a952db8fa96fa093092593a57c3adebcb20ba04bf"}, {"chunk_key": "7c7d87353788dc1afe43161a336436986623ea4266c9c2344f8466f9e62edebd", "chunk_index": 7, "heading": "nginx-Host-Header korrekt halten", "text": "header Origin http://127.0.0.1;\nDashboard sieht Origin 127.0.0.1 → akzeptiert. Nur dieser Block — nicht in\n/api/config- oder /api/config/raw-Bloecken.\n### nginx-Host-Header korrekt halten\n\nproxy_set_header Host 127.0.0.1; muss beibehalten werden (alle drei nginx-Bloecke).\nAenderung auf $host bricht Dashboard-Authentication — Dashboard prueft Host-Header\nund erwartet 127.0.0.1 (gebundener Hostname), nicht den externen Hostname.", "text_hash": "caec245192cd42277e1bd6c5b84eb9ede3e2255c00bd76eeb7c268029659b26f"}, {"chunk_key": "79b0f365bff516ad046b1c952a9e893d43072e1b34c48d1b50fb390c11e97556", "chunk_index": 8, "heading": "HERMES_YOLO_MODE", "text": "ng auf $host bricht Dashboard-Authentication — Dashboard prueft Host-Header\nund erwartet 127.0.0.1 (gebundener Hostname), nicht den externen Hostname.\n### HERMES_YOLO_MODE\n\nHERMES_EXEC_ASK=1 (hardcoded in gateway/run.py) — der Commander fragt fuer jeden\nBefehl nach Approval.\nHERMES_YOLO_MODE=1 in EnvironmentFile ueberschreibt dieses Verhalten:\nBefehle werden direkt ausgefuehrt ohne Dialog.\nService muss nach .env-Aenderung neu gestartet werden.", "text_hash": "240a81f397d35cd0da02f8237b994e378c970e45bfec8f30e4f420dd64ac10bc"}, {"chunk_key": "39e768e0fbb67f111f5c3f3a960bfaf6a5c15975cc08887eca9965ccb1753b02", "chunk_index": 9, "heading": "Portal-Kachel-Architektur (historisch, Stand 2026-06-28)", "text": " EnvironmentFile ueberschreibt dieses Verhalten:\nBefehle werden direkt ausgefuehrt ohne Dialog.\nService muss nach .env-Aenderung neu gestartet werden.\n### Portal-Kachel-Architektur (historisch, Stand 2026-06-28)\n\nDateien: /opt/struktur/portal/app.py, app-carlo.py, app-mari.py\n\n| Kachel | Ziel | Charakter |\n|--------|------|-----------|\n| Cockpit Carlo | cockpit-carlo.[domain] Port 5053 | Browser-Dashboard |\n| Cockpit Mari | cockpit-mari.[domain] Port 5054 | Browser-Dashboard |\n| Projects | projects.[domain] Port 5051 | Browser-Dashboard |\n| VPS Host | vpshost.[domain] Port 5059 | Browser-Dashboard |\n| Hermes Local / Scout | localhost:5099/start | Windows-Launcher (kein Browser-Tab) |\n| Hermes VPS Root / Commander | localhost:5099/start-root | Windows-Launcher → VPS |\n| Commander | hermes-root.[domain]/chat Port 9119 | Browser-Chat |\n| Commander — Web-UI | hermes-root.[domain] Port 9119 | Browser-Dashboard |\n| Hermes Workspace | hermes-carlo.[domain] Port 3010 | Browser-Chat |\n| Hermes Agent | carlo.agent.[domain] Port 3014 | Browser-Dashboard |\n| Hermes Werkstandard | werkstandard.[domain] Port 3013 | Referenzinstanz |\n| MiroFish | mirofish.[domain] | Browser-App |\n\nPortal gestartet als systemd portal.service, Flask auf Port 5052 intern.", "text_hash": "ae69f11ad39164d8c1b13b1834cfffa339b1a766e0208d107cc312d56e7bc427"}, {"chunk_key": "ea37e03d5b5cac268b2a0b8b203f47517928d7b75ceaf48ff002558eb92ed7fa", "chunk_index": 10, "heading": "Bekannte Probleme / Sackgassen", "text": "Port 3013 | Referenzinstanz |\n| MiroFish | mirofish.[domain] | Browser-App |\n\nPortal gestartet als systemd portal.service, Flask auf Port 5052 intern.\n## Bekannte Probleme / Sackgassen\n\n- --insecure fuer Hermes-Dashboard nicht verwendbar: Port 9119 waere ohne\n Firewall (ufw inaktiv) oeffentlich erreichbar.\n- proxy_set_header Host $host fuer Hermes-Dashboard falsch — bricht Authentication.\n- Hermes Werkstandard: war zum Zeitpunkt der Session offline (Container fehlte).\n Aktuellen Status pruefen.\n- Zugangsschluesse in app-carlo.py im Klartext gefunden — Werte nicht hier dokumentiert.", "text_hash": "687248550626a440e016ae9544776b6b35572a2ce8492803d3b4af4451da91cd"}, {"chunk_key": "cc6c1e039f4ec80aed5fd8c73c6f5e8ca13fc86f9234d9d0a156a97775261304", "chunk_index": 11, "heading": "Ueberholte Inhalte", "text": "ssion offline (Container fehlte).\n Aktuellen Status pruefen.\n- Zugangsschluesse in app-carlo.py im Klartext gefunden — Werte nicht hier dokumentiert.\n## Ueberholte Inhalte\n\n- Commander — Agent (stumme Info-Kachel): aus Portal entfernt (keine Funktion).\n- Kachel-Beschriftungen aus frueherer Session: wurden in dieser Session umbenannt\n und dann auf Wunsch wieder zurueckgesetzt auf Original-Namen.", "text_hash": "9c0f157af5ac601ad81430bb04e02b74ba894b2ef466ec0f33447f4c61766b73"}, {"chunk_key": "d6220c6e690fb33482d1f0f4f129652b876f20200079896da14e7e1c79d64dd7", "chunk_index": 12, "heading": "Offene Pruefaufgaben", "text": "on).\n- Kachel-Beschriftungen aus frueherer Session: wurden in dieser Session umbenannt\n und dann auf Wunsch wieder zurueckgesetzt auf Original-Namen.\n## Offene Pruefaufgaben\n\n- [ ] HERMES_YOLO_MODE=1 in /root/.hermes/.env: aktuellen Stand live pruefen.\n- [ ] nginx-Config hermes-root: Origin-Header in WebSocket-Block pruefen.\n- [ ] Portal app-carlo.py: Zugangsdaten im Klartext pruefen und ggf. in .env auslagern.\n- [ ] Hermes Werkstandard Container-Status verifizieren.\n- [ ] ufw-Status auf VPS: Firewall ist inaktiv — sicherheitskritischer offener Punkt.", "text_hash": "0921289719431d18949dadd55f60303ede8a7fe0b06b9e9829288f4e88583852"}, {"chunk_key": "021e9c55df6c9b63f497a6ef691c299ebceaf236610512e17271da3c0ecd4251", "chunk_index": 13, "heading": "Relevante Referenzen ohne operative Zugangsdaten", "text": "lagern.\n- [ ] Hermes Werkstandard Container-Status verifizieren.\n- [ ] ufw-Status auf VPS: Firewall ist inaktiv — sicherheitskritischer offener Punkt.\n## Relevante Referenzen ohne operative Zugangsdaten\n\n- Hermes Dashboard WebSocket-Auth: _is_accepted_host() + _LOOPBACK_HOST_VALUES\n- Hermes YOLO-Mode: HERMES_EXEC_ASK (hardcoded), HERMES_YOLO_MODE (Override via .env)\n- Portal-Service: systemd portal.service → Flask app.py auf Port 5052", "text_hash": "e8af8ac1f757032806b5eb02e9f38b1cca513a8ba0cc3bd74c29bff4a38c1cdf"}, {"chunk_key": "dfdfa2818ebdf39d2a86eb6bb5b98ebcc270cdb7c9a350ec5ed3337c02454276", "chunk_index": 14, "heading": "Regeln fuer kuenftige Agenten", "text": "mes YOLO-Mode: HERMES_EXEC_ASK (hardcoded), HERMES_YOLO_MODE (Override via .env)\n- Portal-Service: systemd portal.service → Flask app.py auf Port 5052\n## Regeln fuer kuenftige Agenten\n\n- Fuer Hermes-Dashboard immer proxy_set_header Host 127.0.0.1; behalten.\n- WebSocket-Fix: proxy_set_header Origin http://127.0.0.1; nur im WebSocket-Block.\n- HERMES_YOLO_MODE=1 bedeutet: Hermes fuehrt Befehle ohne Bestaetigung aus.\n Nur setzen wenn explizit gewuenscht. Nach .env-Aenderung: systemctl restart.\n- Portal-Service muss nach app.py-Aenderung neu gestartet werden (Flask laedt nicht hot-reload).", "text_hash": "0aea121c4e83c24371de96b62ccdbcc633bcfb3dc69577ae2620d04c1135e39a"}, {"chunk_key": "90e909529d11274eba4aa987302e1331968bc8211b62321189dc83c356cc8f34", "chunk_index": 15, "heading": "Quelle / Herkunft", "text": "t gewuenscht. Nach .env-Aenderung: systemctl restart.\n- Portal-Service muss nach app.py-Aenderung neu gestartet werden (Flask laedt nicht hot-reload).\n## Quelle / Herkunft\n\nSession: 1c971ff0 (2026-06-28)\nProjekt: K--Master\nTyp: direkte Session", "text_hash": "46b1c295b1fe2a1693d80f908f4a5a5881c44a9a59c52f97d36f92aa6402aed6"}, {"chunk_key": "cc0ce82278a1449854b48f9a2d1bb13fa26b4bf8d67d738495980cda5556b4fa", "chunk_index": 16, "heading": "Sicherheitsbereinigung", "text": "## Quelle / Herkunft\n\nSession: 1c971ff0 (2026-06-28)\nProjekt: K--Master\nTyp: direkte Session\n## Sicherheitsbereinigung\n\n- OpenAI-Key-Wert (aus app-carlo.py gelesen): ENTFERNT\n- OpenRouter-Key-Wert: ENTFERNT\n- VPS-IP: ENTFERNT\n- Interne Ports: als historische Referenzen beibehalten (keine Credentials)", "text_hash": "0fe2288c9ac51fa8c98686f005fc31ec839095e0ec2204bbc22be16e9b8da3d3"}, {"chunk_key": "2c9a33889ef2d44f7c62459422371ff9547185afdb95aa56c93f34c96af30a6a", "chunk_index": 17, "heading": "Verifikationsstatus", "text": "o.py gelesen): ENTFERNT\n- OpenRouter-Key-Wert: ENTFERNT\n- VPS-IP: ENTFERNT\n- Interne Ports: als historische Referenzen beibehalten (keine Credentials)\n## Verifikationsstatus\n\nNicht live verifiziert. Alle Angaben historisch aus Session 2026-06-28.\nHERMES_YOLO_MODE, nginx-Config und Portal-Kacheln vor Nutzung live pruefen.", "text_hash": "f81aac6e22ff5524d285b26161ae2593651ab5d5565180480b217ac9eb2fb58b"}, {"chunk_key": "5c27d54fda1fc60471302cf48d129dde1fd2516e7293e8ff8a3159212946aec5", "chunk_index": 18, "heading": "Aktueller Root-/Commander-Live-Stand 2026-07-16", "text": "s\n\nNicht live verifiziert. Alle Angaben historisch aus Session 2026-06-28.\nHERMES_YOLO_MODE, nginx-Config und Portal-Kacheln vor Nutzung live pruefen.\n## Aktueller Root-/Commander-Live-Stand 2026-07-16\n\nDer VPS-Abgleich bestätigt Hermes Root Version 0.17.0, aktive `hermes-root.service` und `hermes-root-dashboard.service`, WorkingDirectory `/opt/struktur/hermes-root-cockpit`, Dashboard lokal auf Port 9119 und Betrieb als root.\n\nDie Unit-/CLI-Syntaxabweichung besteht weiter: die Unit verwendet `hermes gateway run`, während die aktuelle CLI kein gültiges `run` als Unterbefehl ausweist. `TimeoutStopSec` beträgt 90 Sekunden, bei `restart_drain_timeout: 180`; dadurch besteht weiterhin das Risiko eines SIGKILL während des Drains. Der stabile Neustart-/Drainpfad ist offen.\n\nEmpfohlener zukünftiger Weg ist eine parallele Commander-Instanz mit Backupmanifest, Funktionsgates und Rollbackplan. Im Rahmen dieses Abgleichs wurde keine neue Instanz aufgebaut und keine Umschaltung vorgenommen.\n\n**Quelle:** `/opt/struktur/hermes-workspace/reports/Incident-und-Konfigurationsregister-Juli-2026-Live-Abgleich.md` \n**Status:** bestätigter Ist-Zustand ergänzt; Reparatur und Migration offen.", "text_hash": "8e7e7a0201cfb5c56a7999c827d95407a0c56f4b3199262e8790bded7e9a2013"}], "elapsed_s": 0.071}