← Blog
kiagentself-hostedhermes-agentdockerwartungupdatetutorial

Eigener KI-Agent im Selbstbau: dein Docker-Setup aktuell halten

Hartmut Wernisch, Human in the loop·
Eigener KI-Agent im Selbstbau: dein Docker-Setup aktuell halten

Ein kurzes Wartungs-Stück zur Serie Dein eigener KI-Agent im Selbstbau. Bevor wir dem Agenten im nächsten Teil proaktive Fähigkeiten geben, bringen wir dein Setup auf den neuesten Stand. Bei Hermes kommen neue Funktionen und Sicherheitskorrekturen fast täglich, und ein Update ist schnell gemacht, wenn du weißt, wie.

Wie ein Hermes-Update funktioniert

Deine Daten sind dabei nicht in Gefahr. Der ganze Zustand, also Konfiguration, Schlüssel, Sitzungen, Gedächtnis und Profile, liegt im Ordner ~/.hermes auf deinem Rechner, das Image selbst ist zustandslos. Du ziehst also ein neues Image und erstellst den Container neu, deine Daten bleiben. Beim Start prüft Hermes die Konfiguration, migriert sie bei Bedarf automatisch auf das neue Format und legt vorher ein datiertes Backup von config.yaml und .env an.

Ein Befehl fällt dabei weg. hermes update zieht Änderungen über Git in eine lokale Installation, und Hermes erkennt selbst, dass das im Container nicht geht. hermes update --plan zeigt dir das gefahrlos an, es ändert nichts:

docker compose exec hermes hermes update --plan
Update plan:
  Install: docker (v0.21.3 @ 2ed6387d)
  ⚠ This install is NOT updatable in place.
    Update via: docker pull nousresearch/hermes-agent:latest

Im Container läuft das Update also ausschließlich über ein neues Image.

Schritt 1: Stand festhalten und sichern

Halt zuerst fest, was gerade läuft, dann hast du nachher einen Vergleich:

cd ~/ki-heimserver
docker compose exec hermes hermes --version

Terminal:  meldet die alte Version v0.15.1 und den Hinweis, dass ein Update bereitsteht.

Auf dem Screenshot steht noch der alte Unterbefehl hermes version, und genau der ist inzwischen weggefallen. Neuere Versionen kennen nur noch das Flag --version (kurz -V) und antworten auf hermes version mit einem „Did you mean: sessions, verify?". Ein gutes Beispiel dafür, dass sich in einem so schnell wachsenden Projekt auch Befehle ändern.

Interessant ist die letzte Zeile: Hermes sagt dir von selbst, dass es einem Commit hinterherhinkt. Notier dir die Versionsnummer, hier v0.15.1 (2026.5.29), dann hast du nachher den Vergleich.

Dann sicherst du deinen Zustand. Am einfachsten ist eine Kaltkopie des ganzen Datenordners, dazu hältst du den Container kurz an:

docker compose stop hermes
cp -a ~/.hermes ~/.hermes.bak-$(date +%F)

Damit hast du im Zweifel einen vollständigen Stand zum Zurückspielen, direkt als Ordner neben deinem Setup. Hermes bringt zusätzlich einen eigenen Backup-Befehl mit (hermes backup --quick --label "vor-update"), für unseren Zweck reicht die Kaltkopie.

Schritt 2: Eine feste Version pinnen

Jetzt legst du fest, welche Version du fährst. Hermes hat keinen stable-Tag. Es gibt latest und main, die beide mehrmals täglich neu gebaut werden, und feste Datums-Versionen wie v2026.9.14. Für ein Setup, das stabil laufen und das andere nachbauen sollen, pinnst du eine feste Version, statt latest blind mitzuziehen. So spielst du dir keine Änderung unbemerkt ein und liest vorher, was sich geändert hat.

Die aktuelle Version findest du bei den GitHub-Releases. In deiner docker-compose.yml ersetzt du den Tag:

# vorher
image: nousresearch/hermes-agent:latest
# nachher
image: nousresearch/hermes-agent:v2026.9.14

Schritt 3: Neues Image ziehen und Container neu erstellen

Jetzt ziehst du das neue Image und erstellst nur den Hermes-Container neu. Open WebUI bleibt, wie es ist:

docker compose pull hermes
docker compose up -d hermes

Beim Start macht Hermes die Konfigurations-Migration selbst und legt vorher das datierte Backup an. Du musst nichts von Hand migrieren.

Schritt 4: Prüfen

Kontrollier, dass der neue Stand läuft und der Agent wieder oben ist:

docker compose exec hermes hermes --version
docker compose ps
docker compose logs -f hermes

Terminal:  zeigt nach dem Update die Version v0.21.3,  den frisch erstellten Hermes-Container.

Aus v0.15.1 (2026.5.29) ist v0.21.3 (2026.9.14) geworden, und die Ausgabe ist gleich um Install method: docker gewachsen. In docker compose ps siehst du den Hermes-Container als vor Minuten erstellt, während Open WebUI unverändert seit Monaten durchläuft. Genau so soll es aussehen: Nur der eine Container wurde angefasst.

Ein Sonderfall noch. Bleibst du auf latest, statt zu pinnen, kann nach dem Pull dieselbe Versionsnummer dastehen. Die Nummer stammt nämlich vom letzten Release, latest wird aber auch zwischen Releases neu gebaut. Ob sich wirklich etwas getan hat, verrät dir dann die Image-ID:

docker compose images

Sind Image-ID und Version gleich geblieben, warst du schon aktuell. Auch das ist ein Ergebnis.

In den Logs siehst du die Migrations-Zeile und am Ende, dass das Gateway online ist. Mit Strg+C steigst du aus dem Log-Stream wieder aus. Wenn du wie in Teil 3 eigene Profile angelegt hast, prüf kurz, dass sie zurückgekommen sind:

docker compose exec hermes hermes -p martina gateway status

Terminal:  für das Profil martina meldet „Gateway is running" und listet darunter das Default-Profil als ebenfalls laufend.

Steht dort statt des Häkchens ein ✗ Gateway is not running, ist genau der Fall eingetreten, für den Teil 3 den post_start-Hook vorsieht: Beim Neuerstellen des Containers kommt nur das Default-Profil aus dem command-Eintrag zurück, die Profil-Gateways sind dynamisch registriert und mit dem alten Container weg. Für den Moment hilft ein Start von Hand:

docker compose exec hermes hermes -p martina gateway start

Damit es beim nächsten Update nicht wieder passiert, gehört jedes Profil in die docker-compose.yml:

    command: ["gateway", "run"]
    post_start:
      - command: hermes -p martina gateway start

Schritt 5: Aufräumen

Das alte Image bleibt namenlos zurück. Ein Aufräum-Befehl entfernt genau diese ungenutzten Reste:

docker image prune

Terminal:  löscht die verwaisten Images und meldet „Total reclaimed space: 4.488GB".

Ohne -a bleibt das sicher, es verschwinden nur die alten, namenlosen Images. Der freigewordene Platz ist beachtlich: In meinem Fall waren es 4,5 GB, die als verwaiste Schichten herumlagen. Wenn du ein paar Updates hintereinander gemacht hast, lohnt sich der Schritt also wirklich.

Wenn etwas klemmt

Sollte nach dem Update etwas nicht laufen, spielst du deinen gesicherten Stand zurück und pinnst wieder die alte Version:

docker compose down
rm -rf ~/.hermes && cp -a ~/.hermes.bak-JJJJ-MM-TT ~/.hermes
# in docker-compose.yml den vorherigen Tag eintragen, z.B. :v2026.9.11
docker compose up -d

Weil dein ganzer Zustand in der Kaltkopie liegt, bist du damit wieder genau auf dem Stand von vorher.

Häufige Fallstricke

Problem Ursache Lösung
hermes version wird nicht erkannt die Version ist ein Flag, kein Unterbefehl hermes --version oder hermes -V
hermes update meldet „NOT updatable in place" im Container nicht nutzbar Update nur über ein neues Image (docker compose pull + up -d)
Version nach dem Update unverändert latest läuft den Release-Tags voraus, die Nummer stammt vom letzten Release Image-ID in docker compose images vergleichen
Nach dem Update fehlt ein Profil beim Neuerstellen kommt nur das Default-Profil aus command zurück Profil als post_start-Hook in die Compose eintragen, für sofort hermes -p <name> gateway start
latest zieht ungewollt eine neue Version :latest rollt mehrmals täglich eine feste Version pinnen (:vYYYY.M.D)

Im nächsten Teil geben wir dem Agenten proaktive Fähigkeiten, ein morgendliches Briefing aus Kalender und E-Mail, das er dir von selbst nach Telegram schickt.

Die Serie im Überblick

Was noch kommt (ungefähre Reihenfolge, kann sich noch ändern):

  • Der Agent wird proaktiv: eigene Fähigkeiten, E-Mail und automatische Aufgaben wie ein Morgenbriefing.
  • Websuche, die du selbst hostest.
  • Sprache: einfach reinsprechen statt tippen, der Agent versteht dich (und antwortet vielleicht auch gesprochen).
  • Bilder vom Agenten generieren lassen.
  • Eigene lokale Modelle, ganz ohne Cloud.
  • Ein echtes Wissensgedächtnis: deine Dokumente dauerhaft und durchsuchbar, in jedem Kanal.
  • Produktionsbetrieb: sicherer Fernzugriff per HTTPS, Datenbank und Backups.

Wenn du so ein Setup für deine Firma aufsetzen oder sauber betreiben willst, kannst du mich bei Fragen jederzeit kontaktieren.

Kein Teil der Serie verpassen?

Newsletter abonnieren

Kontakt

Am einfachsten erreichst du mich auf LinkedIn. Wer lieber schreibt, nutzt das Formular, ich antworte persönlich.

Auf LinkedIn vernetzen →
Newsletter

Praxisnahe Impulse, Tipps und Beiträge, alle paar Wochen direkt ins Postfach.

Abmeldung jederzeit möglich. Mehr dazu in der Datenschutzerklärung.


Nachricht

Ich antworte persönlich, meistens innerhalb weniger Tage.