Hermes Agent unter Docker: Installation und Härtung getestet

Der „Hermes Agent“, der 2026 mit OpenClaw verglichen wird, ist der von Nous Research: installiert und gehärtet unter Docker in einem isolierten Labor, ohne eingegebenen Schlüssel oder Zugangsdaten, mit zwei undokumentierten Netzwerkeinstellungen, die man kennen sollte, bevor man ihn exponiert.

Hermes Agent unter Docker: Installation und Härtung getestet
Schnelle Antwort

Der „Hermes Agent“, der in französischen Suchanfragen mit OpenClaw verglichen wird, ist der von Nous Research (NousResearch/hermes-agent, MIT-Lizenz), nicht der Web-Client hermes-webui oder der Community-Index „HermesHub“. Installiert und gehärtet unter Docker in einem isolierten Labor, ohne eingegebenen Schlüssel oder Zugangsdaten, startet er in 17 bis 19 Sekunden bis zu einem tatsächlich positiven Gesundheitscheck. Zwei undokumentierte Einstellungen, die man vor dem Exponieren kennen sollte: internal: true kappt auch den veröffentlichten Port, nicht nur den Internetzugang, und das Gateway lauscht standardmäßig nur auf seiner eigenen Loopback-Schnittstelle, selbst hinter einem bereits auf 127.0.0.1 beschränkten Port auf der Host-Seite.

„Hermes agent“ und „hermes vs openclaw“ tauchen regelmäßig in französischen Suchanfragen auf, aber der Name ist mehrdeutig: Mehrere Projekte heißen Hermes. Nur eines wird in den auf 2026 datierten Quellen mit OpenClaw verglichen. Es wird hier identifiziert, installiert und unter Docker in einem isolierten Labor gehärtet, wobei bei jedem Schritt unterschieden wird, was tatsächlich gelaufen ist und was nur dokumentiert bleibt.

Welcher Hermes Agent, genau?

Das von diesen Suchanfragen gemeinte Projekt ist Hermes Agent, entwickelt von Nous Research und unter MIT-Lizenz im Repository NousResearch/hermes-agent veröffentlicht. Das Repository zeigte am 7. September 2026 242.851 Sterne und 49.953 Forks, bei einer Erstellung am 22. Juli 2025. Seine Beschreibung passt in einen Satz: „the agent that grows with you“. Ein einzelner Agent, der seine eigenen Fähigkeiten aus der Erfahrung heraus erschafft und verfeinert, im Gegensatz zu einer Plattform, die mehrere Agenten orchestriert. Dieser philosophische Gegensatz kehrt in den 2026 veröffentlichten Vergleichen mit OpenClaw wieder und bestätigt, dass hinter den Anfragen „hermes vs openclaw“ genau dieses Projekt steht.

Zwei Namensfallen sind zu vermeiden. hermes-webui ist ein Drittanbieter-Web-Client, der nicht von Nous Research gepflegt wird. „HermesHub“ bezeichnet einen Community-Index für Fähigkeiten, getrennt vom offiziellen, ins CLI integrierten Hub. Beide lassen sich in Suchergebnissen leicht mit dem Hauptprojekt verwechseln. Hermes Agent reiht sich außerdem in die Liste ein, die unser Überblick über Kommandozeilen-Code-Agenten miteinander vergleicht.

Hermes Agent mit Docker installieren

Das offizielle Image ist nousresearch/hermes-agent. Die Docker-Dokumentation beschreibt einen interaktiven Konfigurationsassistenten und anschließend einen Start als Dienst:

bash
mkdir -p ~/.hermes
docker run -it --rm -v ~/.hermes:/opt/data nousresearch/hermes-agent setup

docker run -d --name hermes --restart unless-stopped \
  -v ~/.hermes:/opt/data -p 8642:8642 \
  nousresearch/hermes-agent gateway run

Das Labor weiter unten übernimmt diesen interaktiven Assistenten nicht: Es geht direkt über ein gehärtetes Compose, das gateway run auf einem anderen Netzwerk und mit anderen Ports nachbildet. Port 8642 dient sowohl als Gesundheitscheck als auch als OpenAI-API-kompatible Passerelle, Port 9119, optional, dient dem Web-Dashboard. Das auf /opt/data eingehängte Volume enthält .env, config.yaml, SOUL.md, sowie die Ordner sessions/, memories/ und skills/. Die Dokumentation empfiehlt je nach Nutzung 1 bis 4 GB Speicher und 1 bis 2 Kerne.

Ich habe die letzte datierte Version festgenagelt statt latest. Die GitHub-Releases zeigen die v0.21.0 (Tag v2026.8.31, „The Pantheon Release“), veröffentlicht am 31. August 2026, rund 5.800 Commits und 760 Mitwirkende nach der vorherigen Version. Der Zug dauerte auf dieser Maschine 1 Min. 47 s für 908 MB komprimiert (3,93 GB nach dem Entpacken, arm64-Architektur). Das Image v2026.4.30, 8,2 GB, verortet einen echten internen Architekturwechsel zwischen April und Mai 2026. Dieser Prüfpunkt startet noch mit tini, während die August-Version s6-overlay als PID 1 verwendet, mit Abgabe der Privilegien an einen Benutzer hermes (UID 10000 standardmäßig). Nebenbei bemerkte Kuriosität: Die Docker-Hub-Registry zeigt, dass das Gewicht des Images von rund 2,5 GB im April auf weniger als 900 MB seit Juli 2026 gesunken ist.

Die Konfiguration härten: Netzwerk, Ports, Secrets

Die offizielle docker-compose.yml deklariert network_mode: host sowohl für das Gateway als auch für das Dashboard, praktisch, aber ohne jegliche Netzwerkisolation. Für das Labor habe ich eine gehärtete Version gebaut: eigenes Netzwerk, Ports nur auf der Loopback-Schnittstelle veröffentlicht, Secrets außerhalb der Compose-Datei.

yaml
services:
  hermes:
    image: nousresearch/hermes-agent:v2026.8.31
    container_name: hermes-lab
    networks:
      - hermes_lab
    ports:
      - "127.0.0.1:8642:8642"
      - "127.0.0.1:9119:9119"
    volumes:
      - ./data:/opt/data
    env_file:
      - ./secrets/hermes.env     # eventueller Anbieterschlüssel, außerhalb des Repositorys
    environment:
      - HERMES_UID=501
      - HERMES_GID=20
      - HERMES_DASHBOARD=1
      - HERMES_DASHBOARD_HOST=0.0.0.0
      - API_SERVER_HOST=0.0.0.0   # siehe weiter unten: ohne diese Zeile bleibt /health
    deploy:                       #   trotz veröffentlichtem Port unerreichbar
      resources:
        limits:
          memory: 1g
          cpus: "1.0"
    command: ["gateway", "run"]

networks:
  hermes_lab:
    driver: bridge

Zwei Einstellungen des offiziellen Compose verhalten sich anders, als die Dokumentation erwarten lässt. Der erste betrifft das Netzwerk. Es als internal: true zu markieren, um jeden Internetausgang zu kappen, kappt auch den veröffentlichten Port. Im Labor erhält eine vom Inneren des Containers gestartete Anfrage ein HTTP 200 auf /health. Dieselbe Anfrage von der Host-Maschine, über den veröffentlichten Port, erhält keine Antwort. Ein Ausgangsversuch zu example.com scheitert an einer unmöglichen DNS-Auflösung. Die Isolation hält also, doch sie reißt die legitime lokale Nutzung des Ports mit sich. internal: true eignet sich nur für ein vollständig offline betriebenes Labor. Für einen echten Einsatz mit einem entfernten Modellanbieter läuft die Isolation über ein klassisches eigenes Netzwerk und eine ausgehende Firewall, nicht über diese Einstellung.

Der zweite überrascht mehr. Selbst auf dem eigenen, nicht als internal markierten Netzwerk blieb der veröffentlichte Port unerreichbar, TCP-Verbindung akzeptiert, leere HTTP-Antwort. Eine Suche im installierten Code liefert die genaue Erklärung:

bash
docker exec hermes-lab grep -r API_SERVER_HOST /opt/hermes/hermes_cli/security_audit_startup.py

host = extra.get("host") or os.environ.get("API_SERVER_HOST", "127.0.0.1")

Standardmäßig lauscht das Gateway nur auf der Loopback-Schnittstelle innerhalb des Containers, unabhängig vom gewählten Docker-Netzwerk. Daher die Zeile API_SERVER_HOST=0.0.0.0 im obigen Compose: Sie ändert nichts an der externen Exposition, da bereits das Präfix 127.0.0.1: des veröffentlichten Ports sie einschränkt. Nach der Korrektur geprüft: curl http://127.0.0.1:8642/health antwortet vom Host aus mit 200, dieselbe Anfrage an die lokale Netzwerkadresse der Maschine (192.168.x.x) erhält keine Antwort. Was das Dashboard betrifft, weigert es sich schlicht, auf einer nicht lokalen Schnittstelle zu starten, ohne konfigurierten Authentifizierungsanbieter:

bash
Refusing to bind dashboard to 0.0.0.0 — the auth gate engages on non-loopback
binds (0.0.0.0), but no auth providers are registered.
There is no unauthenticated public-dashboard option.

Ein von Haus aus gesundes Verhalten, mit einem in den Protokollen sichtbaren Nebeneffekt. So belassen, ohne konfigurierte Authentifizierung, bleibt der Dienst nicht einfach deaktiviert, er schlägt fehl und startet dann unter der Aufsicht von s6 in einer Schleife neu. Nichts Schwerwiegendes, aber laut genug, um es wert zu sein, gewusst zu werden. Letzter geprüfter Punkt: Das Limit deploy.resources.limits des obigen Compose greift tatsächlich auch außerhalb des Swarm-Modus mit Docker Compose v5.1.0. docker inspect bestätigt Memory=1073741824 und NanoCpus=1000000000 am gestarteten Container. Ältere Compose-Versionen ignorierten deploy: außerhalb von Swarm.

Was man beim Start beobachtet

Sobald die Konfiguration korrigiert ist, ergeben docker compose up -d und anschließend eine Abfrage von /health alle 0,3 Sekunden eine Startzeit von rund 18,9 Sekunden bei kaltem Start (leerer Datenordner) und 16,6 Sekunden nach einem einfachen Neustart. Der Unterschied liegt vor allem an einer internen Aufwärmphase, die die Protokolle ausdrücklich „turn-machinery warm-up“ nennen und die den Eingang nach 20 Sekunden öffnet, auch wenn sie im Hintergrund weiterläuft. Im Inneren bestätigt ps aux, dass der Supervisor root bleibt, dass aber der Prozess hermes gateway run tatsächlich unter dem unprivilegierten Benutzer hermes läuft. Das Start-Banner zeigt Hermes Agent v0.21.0 (2026.8.31), Python 3.13.5 und das OpenAI-SDK 2.24.0.

Port oder Datei Rolle Standardzugriff
8642 Gesundheitscheck + OpenAI-API-kompatible Passerelle Loopback-Schnittstelle des Containers (API_SERVER_HOST=127.0.0.1)
9119 Web-Dashboard Verweigert jede nicht lokale Bindung ohne Authentifizierung
/opt/data/.env Schlüssel für Modell- und Werkzeuganbieter Vollständig auskommentierte Vorlage, keine aktive Schlüssel bei der Installation
/opt/data/config.yaml Standardmodell, Terminal, Kontextkomprimierung Beim ersten Start erzeugt

Sich mit einem Modell verbinden

Die beim ersten Start erzeugte Datei .env listet, vollständig auskommentiert, rund dreißig Anbieter (Fireworks, OpenRouter, NovitaAI, Gemini, z.ai, Kimi, MiniMax, OpenCode Zen…) und ebenso viele Werkzeugschlüssel (Firecrawl, Exa, Browserbase), keiner davon ist aktiv. „Ollama“ erscheint dort nur in der Form OLLAMA_API_KEY, dem kostenpflichtigen Cloud-Dienst von Ollama, und kein Eintrag zielt auf eine lokale Instanz. Die eingebaute Diagnose bestätigt den neutralen Zustand der Installation:

bash
docker exec hermes-lab hermes doctor

✓ No active security advisories
✓ No suspicious MCP stdio commands
✓ Version files consistent (0.21.0)
◆ API Connectivity
  ⚠ OpenRouter API (not configured)
◆ Memory Provider
  ✓ Built-in memory active (no external provider configured — this is fine)

Einziger Wert, der nach dem Test in .env vorhanden ist: ein API_SERVER_KEY, automatisch vom Container erzeugt, um sein eigenes lokales Gateway zu schützen. Er erscheint nie im Klartext in den Protokollen, niemand hat ihn eingegeben, und er hat keinen Bezug zu einem Konto bei einem Modellanbieter.

Die Fähigkeiten, und wie man eine vor der Installation prüft

Die Fähigkeiten („Skills“) leben in /opt/data/skills/ und folgen dem offenen Standard Agent Skills, der in unserem Leitfaden zum SKILL.md beschrieben wird. hermes skills list zählte in diesem Labor 53 aktivierte integrierte Fähigkeiten, keine vom Hub installiert. Die Installation erfolgt über eine Registry: hermes skills install official/security/1password oder hermes skills install openai/skills/k8s, zum Beispiel. Bevor man irgendetwas installiert, ersparen zwei Befehle blindes Vertrauen:

bash
hermes skills inspect openai/skills/k8s   # Metadaten, Quell-Repository, Audit bereits verfügbar
hermes skills audit                       # scannt alle vom Hub installierten Skills erneut

Der eingebaute Scanner stuft jedes Ergebnis in drei Stufen ein: dangerous blockiert die Installation, warn/caution lässt sich mit --force umgehen, advisory bleibt rein informativ. Laut der offiziellen Dokumentation fasste der Hub am 26. August 2026 90.700 Fähigkeiten auf 11 Registries zusammen, nicht zu verwechseln mit „HermesHub“, dem oben erwähnten Community-Index eines Drittanbieters.

MCP: Werkzeuge anbinden, oder Hermes als Server freigeben

hermes mcp catalog, im Labor ausgeführt, zeigt einen bereits langen Katalog einsatzbereiter Server (Airtable, Atlassian, Cloudflare, ClickUp, Buildkite…). hermes mcp list bestätigte, dass keiner konfiguriert war, wie bei einer neuen Installation zu erwarten. Das Hinzufügen erfolgt mit einer bekannten Voreinstellung oder einem manuellen Eintrag:

bash
hermes mcp add codex --preset codex
hermes mcp add filesystem --command npx --args "-y @modelcontextprotocol/server-filesystem /projet"

In die andere Richtung gibt hermes mcp serve eine Hermes-Sitzung als MCP-Server für einen externen Client frei, Claude Code zum Beispiel, indem man dessen Konfiguration auf den Befehl hermes mcp serve verweist. Sicherheitstechnisch präzisiert die Dokumentation drei Dinge. Entfernte OAuth-Token werden mit Berechtigungen 0600 zwischengespeichert. Die Erneuerung läuft über PKCE. Bei Servern in stdio werden nur die ausdrücklich deklarierten Umgebungsvariablen, plus eine minimale Basis, an den Unterprozess übergeben. Das begrenzt Secret-Lecks zu einem schlecht auditierten MCP-Server eines Drittanbieters begrenzt, ein Risiko, das bereits in unserem Artikel über Code-Agenten, Sandbox und Berechtigungen dokumentiert ist.

Hermes Agent gegen OpenClaw: ein ehrlicher Vergleich

Beide Projekte sind quelloffen, installieren sich unter Docker und unterstützen Skills und MCP, es ist ihre Philosophie, die auseinandergeht. OpenClaw strukturiert ein Gateway, das mehrere Agenten, Konnektoren und Kanäle routet und überwacht. Hermes Agent setzt auf einen einzelnen Agenten, der seine eigenen Fähigkeiten im Lauf der Nutzung anhäuft. Unser Artikel über die gehärtete Installation von OpenClaw behandelt dieselbe Übung auf der OpenClaw-Seite, beide lesen sich wie ein Spiegelbild.

Zur Sicherheit verzeichnet eine Forschungsnotiz der Cloud Security Alliance vom 4. Mai 2026 im selben Zeitraum neun CVEs für OpenClaw, darunter eine kritische mit Bewertung 9,9, gegenüber zwei für den Kern von Hermes Agent. CVE-2026-7396 betrifft einen Path Traversal im WeCom-Adapter (CVSS 4,0), CVE-2026-7397 eine Symlink-Verfolgung in den Datei-Werkzeugen (CVSS 4,8), beide auf Version 0.8.0 und bereits mit 0.9.0 behoben. Eine dritte gelistete CVE betrifft nicht den Agenten, sondern hermes-webui, den bereits oben erwähnten Drittanbieter-Client. Die GitHub-Security-Advisories-Seite des Repositorys verweist ihrerseits auf keinen zum 7. September 2026 veröffentlichten Hinweis: Diese CVEs wurden über externe Kanäle eingereicht, nicht von Nous Research selbst. Bis heute wurde keine Erhebung exponierter Hermes-Instanzen veröffentlicht, die mit der für OpenClaw verifizierten Zahl vergleichbar wäre (42.900 Instanzen, 93 % ohne Authentifizierung, SecurityScorecard 2026), was ihr Fehlen nicht beweist.

Ein datierter Vorfall veranschaulicht, warum die Netzwerkabschottung und das Fehlen eines automatischen Modus genauso zählen wie die Wahl des Projekts. The Hacker News hat am 24. Juli 2026 dokumentiert, einen Fall, bei dem ein Angreifer, der bereits über einen ersten Zugang zum Netzwerk des thailändischen Finanzministeriums verfügte, Hermes Agent auf einem gemieteten Server installierte und anschließend dessen „YOLO“-Modus aktivierte, der die Bestätigungen vor riskanten Befehlen überspringt. Der Agent erkundete daraufhin das Netzwerk ohne Aufsicht, fand Hadoop-Dienste mit Standard-Zugangsdaten und setzte ein Implantat ein. Ein von der Quelle selbst hervorgehobener Punkt: Hermes hat den Einbruch nicht verursacht, er hat dessen nächste Phase automatisiert. Das eigene Netzwerk, die Ports auf der Loopback-Schnittstelle und das Fehlen eines eingegebenen Schlüssels in diesem Labor sollen genau diese Phase verhindern.

Was du dir merken solltest

  • Der „Hermes Agent“, der 2026 mit OpenClaw verglichen wird, ist der von Nous Research (NousResearch/hermes-agent, MIT-Lizenz), nicht hermes-webui oder „HermesHub“, zwei Drittanbieter-Projekte mit ähnlichem Namen.
  • Letzte getestete datierte Version: v0.21.0 (Tag v2026.8.31, 31. August 2026), installiert über Docker in 1 Min. 47 s (908 MB komprimiert, 3,93 GB entpackt).
  • Ein als internal: true markiertes Netzwerk kappt auch den veröffentlichten Port, nicht nur den Internetzugang. Standardmäßig lauscht das Gateway nur auf seiner eigenen Loopback-Schnittstelle (API_SERVER_HOST=127.0.0.1), ausdrücklich zu korrigieren, selbst hinter einem bereits auf 127.0.0.1 beschränkten Port auf der Host-Seite.
  • Das Dashboard weigert sich, sich außerhalb der Loopback-Schnittstelle ohne konfigurierte Authentifizierung zu exponieren. Von Haus aus gesund, doch so belassen läuft es in eine Fehlerschleife, statt einfach inaktiv zu bleiben.
  • Gemessener Start bei rund 17 bis 19 Sekunden bis zu einem tatsächlich positiven /health, ohne jeglichen Schlüssel oder Zugangsdaten von Anfang bis Ende.
  • Im selben Zeitraum verzeichnet die Cloud Security Alliance zwei kleinere CVEs für den Kern von Hermes Agent gegenüber neun für OpenClaw, davon eine kritische. Der Unterschied ist mit Vorsicht zu lesen: für Hermes wurde keine vergleichbare Erhebung zur Exposition veröffentlicht.

Häufige Fehler

internal: true blockiert auch den veröffentlichten Port Das Netzwerk als intern zu markieren kappt den Ausgang des Containers, aber auch den durch ports: veröffentlichten Port, hier getestet: docker exec erhält ein 200, derselbe Aufruf vom Host bekommt keine Antwort.
Das Gateway lauscht standardmäßig nur auf 127.0.0.1 Innerhalb des Containers, nicht nur auf der Host-Seite: Ohne API_SERVER_HOST=0.0.0.0 verbindet sich der veröffentlichte Port, liefert aber eine leere HTTP-Antwort, selbst außerhalb eines internal-Netzwerks.
Das offizielle Compose verwendet network_mode: host Standardmäßig keine Netzwerkisolation, das eigene Netzwerk und die Ports auf 127.0.0.1 in diesem Artikel weichen davon absichtlich ab.
Das Dashboard läuft ohne Authentifizierung in eine Fehlerschleife HERMES_DASHBOARD=1 ohne Authentifizierungsanbieter zu belassen deaktiviert es nicht stillschweigend: Es schlägt fehl und startet unter s6 in einer Schleife neu.
hermes doctor verlangt eine Migration selbst bei einer neuen Installation Die Meldung spricht von einer Konfiguration „~2 years old“, obwohl der Container gerade erst erstellt wurde, eine in das Image eingebettete Vorlage, ohne blockierende Folgen.

DockerHermes AgentMCPSécuritéSkills

Damien Flandrin Webentwickler seit 2010, Gründer von Gekkode und Email Impact. Jeder Artikel wird vor der Veröffentlichung an einem echten Projekt getestet. Kontakt
Newsletter

Neue Tests, Tutorials und Projekte, per E-Mail.

Reproduzierbare Tests, versionierter Code, datierte Ergebnisse. Niemals Spam.