SSD Nodes Learn Hosting plans →
Anleitungen Matt ConnorVon Matt Connor · Aktualisiert 2026-09-08

HarnessRouter selbst hosten: Eine API für Agenten

Bündeln Sie Codex, Claude Code und Hermes hinter einer selbst gehosteten API. Mit Docker-Deployment, Loopback-Bindung, Standard-Login zum Ändern und TLS-Zugriff.

Was HarnessRouter entfernt

Sie hosten HarnessRouter Community Edition selbst, um mehrere Agent-Harnesses auf einem Server, den Sie verwalten, über eine gemeinsame API bereitzustellen. Ein Agent-Harness ist ein Kommandozeilenprogramm, das ein Modell in einer Schleife steuert: Es hält eine Sitzung aufrecht, bearbeitet Dateien, führt Befehle aus und streamt den Fortschritt an denjenigen zurück, der die Aufgabe angefordert hat. Codex, Claude Code und Hermes übernehmen diese Aufgabe jeweils mit einer eigenen Installation, einem eigenen Format für Zugangsdaten und einem eigenen Sitzungsmodell. HarnessRouter führt sie in einem Container aus und stellt davor einen einzigen HTTP-Endpunkt, eine einzige Anmeldung und einen einzigen Secret-Speicher bereit.

Das ist die gesamte Idee. Die Kosten sollten Sie jedoch ausdrücklich berücksichtigen. Sie fügen Ihrem Server einen Container, eine Anmeldung, ein Volume und einen Upgrade-Pfad hinzu, damit mehrere Komponenten zu einer Einheit werden. Wenn Sie heute genau ein Harness ausführen, ist diese Einrichtung schlechter als die direkte Installation dieses Harnesses. Diese Abwägung wird im letzten Abschnitt behandelt. Lesen Sie ihn daher, bevor Sie die Bereitstellung durchführen.

Alle folgenden Angaben wurden anhand des Image-Tags 0.5.5 geprüft, das am 19. August 2026 abgerufen wurde. Das Projekt veröffentlicht an den meisten Tagen neue Tags. Prüfen Sie daher den tatsächlich verwendeten Tag, statt sich in einem Monat noch auf diese Seite zu verlassen. Die Befehle stammen aus der Projekt-README unter github.com/HarnessRouter/harnessrouter.

Was das Unified Harness Protocol tatsächlich ist

HarnessRouter implementiert das Unified Harness Protocol (UHP), das auf unifiedharnessprotocol.org veröffentlicht ist. UHP beschreibt, wie ein Produkt eine Aufgabe auf einem Harness startet, den laufenden Task verfolgt, Sitzungen und Dateien verwaltet und Fehler meldet. Die Spezifikation wird nach Datum versioniert. Die am 19. August 2026 aktuelle Version ist auf den 2026-08-11 datiert. Auf der Website wird sie als Entwurfsstandard bezeichnet, der „stabil genug für die Nutzung und versioniert ist, damit er sicher geändert werden kann“.

Lesen Sie die Formulierung „offener Standard“ hier genau. Dasselbe Unternehmen verfasst die Spezifikation und entwickelt die Referenzimplementierung sowie die 52 Prüfungen umfassende Konformitätssuite, die festlegt, wer konform ist. Für ein so junges Protokoll ist das üblich. Die Apache-2.0-Lizenz bedeutet außerdem, dass Sie jeden Teil forken können. UHP ist damit noch kein herstellerübergreifender Standard. Behandeln Sie es als aufkommendes Protokoll: nützlich, in Bewegung und so konzipiert, dass Ihr eigener Code es ohne vollständige Neuentwicklung nicht mehr verwenden können muss.

Was Sie vor dem Start benötigen

Docker und ungefähr 4 GB freien Speicherplatz. Außerdem benötigen Sie einen API-Schlüssel von einem Modellanbieter, für den Sie bereits bezahlen. Das Herunterladen des Images umfasst etwa 700 MB. Der restliche Speicherplatz wird von den Agent-CLIs und den Arbeitsbereichen belegt, in denen sie Dateien erzeugen. Das Image enthält weder ein integriertes Modell noch einen Testschlüssel. Aufgaben schlagen daher fehl, bis Sie einen Anbieter verbinden. HarnessRouter steht selbst unter der Apache-2.0-Lizenz. Die Agent-CLIs sind von dieser Lizenz nicht abgedeckt. Deshalb werden sie beim ersten Start abgerufen und nicht im Image ausgeliefert.

Self-host HarnessRouter mit einem docker run

docker pull harnessrouter/harnessrouter
docker run -d --name harnessrouter \
  -p 127.0.0.1:3000:3000 \
  -v harnessrouter:/data \
  harnessrouter/harnessrouter

Beobachten Sie anschließend, wie der Container startet. Der erste Start dauert lange. Die Logs zeigen den Grund.

docker logs -f harnessrouter

Während des Starts werden unter anderem folgende Zeilen angezeigt:

installing Claude Code (Anthropic's terms apply)…
installing Codex (Apache-2.0)…
installing Hermes (check its upstream license before use)…

Warten Sie auf ready on :3000. Diese Installation erfolgt einmal pro Volume. Jeder spätere Start dauert daher nur wenige Sekunden und gibt keine Installationszeilen mehr aus.

Aus diesem Download ergeben sich zwei wichtige Punkte, die auf einem VPS relevant sind. Erstens benötigt der erste Start ausgehenden Netzwerkzugriff. Das Image ist nicht vollständig eigenständig. Ein Server hinter einer Egress-Filterung oder ohne ausgehende Route bleibt an dieser Stelle hängen und gibt ready on :3000 nie aus. Der Fehler tritt beim ersten Start auf, nicht bei docker pull. Das ist eine verwirrende Stelle, um dieses Problem erstmals festzustellen. Zweitens installieren Sie Software von Drittanbietern unter deren jeweiligen Nutzungsbedingungen. Claude Code wird unter den Bedingungen von Anthropic bereitgestellt, für Hermes gelten die Bedingungen des jeweiligen Upstream-Projekts. Prüfen Sie daher beide Bedingungen, bevor Sie die Software kommerziell einsetzen.

-v harnessrouter:/data erstellt ein benanntes Docker-Volume. Alle dauerhaft benötigten Daten liegen in /data: die SQLite-Datenbanken, die gespeicherten Dateien, der Secret Store und die Agent-Arbeitsbereiche. Wenn Sie dieses Volume löschen, löschen Sie die gesamte Instanz einschließlich der Provider-Schlüssel und aller Transkripte. Sichern Sie das Volume bei gestopptem Container. Wenn Sie eine SQLite-Datenbank während eines Schreibvorgangs kopieren, kann die resultierende Datei möglicherweise nicht geöffnet werden. Diese Reihenfolge aus Stoppen und anschließendem Kopieren gilt für jeden zustandsbehafteten Container auf dem Server. Die Details unterscheiden sich jedoch je nach Dienst, da PhotoPrism und Immich jeweils eigene Befehle für die Sicherung benötigen.

docker stop harnessrouter
docker run --rm -v harnessrouter:/data -v "$PWD":/backup alpine \
  tar czf /backup/harnessrouter-data.tgz -C / data
docker start harnessrouter

Die Compose-Variante und die zu ändernde Zeile

Das Repository enthält eine Compose-Datei. Sie veröffentlicht "3000:3000". Dadurch ist der Dienst auf jeder Schnittstelle des Hosts erreichbar. Ändern Sie diese Zeile, bevor Sie den Dienst auf einem öffentlichen Server starten.

services:
  harnessrouter:
    image: harnessrouter/harnessrouter:0.5.5
    ports:
      - "127.0.0.1:3000:3000"
    env_file:
      - .env
    volumes:
      - harnessrouter-data:/data
    restart: unless-stopped

volumes:
  harnessrouter-data:

Im Vergleich zur Upstream-Version gibt es zwei Änderungen: die Bind-Adresse und ein festgelegter Versions-Tag anstelle von latest. Eine feste Version ist wichtig, weil zwischen dem 9. und 18. August 2026 sechzehn Version-Tags veröffentlicht wurden. Eine Agent-Laufzeitumgebung, die sich während des Betriebs ändert, ist schwer zu debuggen. Kopieren Sie anschließend die Umgebungsdatei, schränken Sie ihre Berechtigungen ein und starten Sie den Dienst.

cp .env.example .env
chmod 600 .env
docker compose up -d
docker compose logs -f

.env enthält Ihren Provider-Schlüssel im Klartext. Der Modus 600 ist daher das Minimum. Falls Ihnen das Unterkommando docker compose nicht vertraut ist, behandelt das Spickzettel für Docker-Compose-Befehle die wichtigsten Befehle für den täglichen Betrieb.

Warum der Port an 127.0.0.1 und nicht an 0.0.0.0 veröffentlicht wird

-p 3000:3000 veröffentlicht den Port auf jeder Schnittstelle des Hosts. -p 127.0.0.1:3000:3000 veröffentlicht ihn nur auf Loopback. Der einzige Zugriffsweg führt dann vom VPS selbst. Der Container lauscht intern weiterhin auf Port 3000. Sie ändern also die linke Seite. Prüfen Sie die Ausgabe:

docker port harnessrouter
sudo ss -ltnp | grep 3000

ss mit 127.0.0.1:3000 ist korrekt. 0.0.0.0:3000 bedeutet, dass die Konsole im öffentlichen Internet erreichbar ist. Das ist hier gefährlicher als bei den meisten Self-Hosting-Anwendungen. Die Konsole erstellt Harnesses, liest jedes Transkript, führt Agents aus und stellt diesen Agents eine Shell sowie ein echtes Dateisystem in ihrem Workspace bereit. Außerdem enthält sie den hinterlegten Provider-Key. Jeder, der eine ungeschützte Konsole erreicht, kann Ihre Arbeit lesen, Befehle ausführen und Ihren Key verwenden.

Eine Host-Firewall schützt Sie davor nicht. Docker veröffentlicht Ports, indem es eigene Regeln in die Kernel-Tabelle nat schreibt. Diese Regeln werden ausgewertet, bevor die von ufw verwaltete Chain greift. Daher bleibt ein veröffentlichter Port erreichbar, auch wenn sudo ufw status ihn als verweigert auflistet. Testen Sie von einem anderen Rechner aus, nicht vom VPS. Andernfalls testen Sie nichts. Das ist dieselbe Lehre wie bei dsh headless auf Port 3080 ausführen: Binden Sie den Dienst an Loopback und legen Sie anschließend bewusst fest, wie Sie darauf zugreifen.

Ändern Sie die Standardanmeldung vor allen anderen Schritten

Melden Sie sich unter http://localhost:3000 mit dem Benutzernamen harnessrouter und dem Passwort harnessrouter an. Diese Zugangsdaten stehen in der README, weil sie Platzhalter und keine Geheimnisse sind. Der Container warnt Sie bei jedem Start, bis Sie sie ändern:

using the DEFAULT password. Set HR_AUTH_PASSWORD, or change it from the profile page, before exposing this instance.

Ändern Sie die Zugangsdaten auf der Seite Profile oder setzen Sie sie beim Start für ein skriptgesteuertes Deployment. HR_AUTH_USER und HR_AUTH_PASSWORD überschreiben die Standardwerte.

docker run -d --name harnessrouter \
  -p 127.0.0.1:3000:3000 \
  -v harnessrouter:/data \
  -e HR_AUTH_USER='you' \
  -e HR_AUTH_PASSWORD='the-password-you-chose' \
  harnessrouter/harnessrouter

Es gibt keine E-Mail zum Zurücksetzen, weil kein Kontosystem und kein Mailserver vorhanden sind. Wenn Sie das Passwort verlieren, löschen Sie die Auth-Datei im Volume und starten Sie den Container neu. Melden Sie sich anschließend erneut mit den Standardwerten an.

docker stop harnessrouter
docker run --rm -v harnessrouter:/data alpine rm -f /data/selfhost-auth.json
docker start harnessrouter

HR_AUTH_DISABLED=1 entfernt die Anmeldesperre vollständig. In der README ist dies auf „einen Rechner, den niemand sonst erreichen kann“ beschränkt. Ein VPS mit einer öffentlichen IP-Adresse ist kein solcher Rechner. Lassen Sie die Anmeldesperre daher aktiviert, außer Sie führen dies auf einem Laptop aus.

Prüfen Sie Ihre Version, denn die alten Versionen haben keine Zugriffssperre

Das ist der entscheidende Punkt. Die Versionen 0.1.x und 0.2.0 wurden vollständig ohne Authentifizierungssperre veröffentlicht: Jeder, der Port 3000 erreichen konnte, hatte bereits Zugriff auf die Konsole. 0.3.0 war die erste Version mit Anmeldung. Diese älteren Tags sind weiterhin veröffentlicht und können weiterhin abgerufen werden. Ein alter festgelegter Tag oder eine von einem Kollegen kopierte Compose-Datei kann daher heute eine ungeschützte Konsole an einem öffentlichen Port bereitstellen.

Am 19 August 2026 ist 0.5.5 der neueste veröffentlichte Tag. Er ist auf den 18 August 2026 datiert, und latest verweist darauf. Prüfen Sie, welche Version Sie verwenden, und vergleichen Sie sie anschließend mit der Tag-Liste auf Docker Hub:

docker image ls harnessrouter/harnessrouter

Alles unter 0.3.0 muss jetzt ersetzt werden und darf nicht erst eingeplant werden. Alles ab dieser Version benötigt weiterhin ein neues Passwort, denn für jemanden, der Port 3000 scannt, sind ein Standardpasswort und kein Passwort dasselbe. Betrachten Sie die Versionsnummern auf dieser Seite nicht als aktuell. Sie waren am oben angegebenen Datum korrekt, und dieses Projekt veröffentlicht schnell neue Versionen.

Einen Provider verbinden

Nichts wird ausgeführt, solange kein Model-Provider verbunden ist. Fügen Sie einen Provider über die Integrationsseite in der Console hinzu oder übergeben Sie ihn in der Umgebung an docker run. Der Wert ist JSON. Setzen Sie ihn daher in der Shell in Anführungszeichen:

-e HR_SECRET_GLOBAL_HARNESS_CONN_ANTHROPIC='{"name":"anthropic","provider":"anthropic","api_key":"sk-ant-…"}'

.env.example benennt eine Verbindungsvariable pro Provider-Familie: HR_SECRET_GLOBAL_HARNESS_CONN_ANTHROPIC für das claude-code-Backend, HR_SECRET_GLOBAL_HARNESS_CONN_OPENAI für das codex-Backend und HR_SECRET_GLOBAL_HARNESS_CONN_CUSTOM für jeden OpenAI-kompatiblen Endpunkt. Dort wird ein Aggregator oder Ihr eigener Inference-Server eingetragen. Die zugehörigen Variablen HR_SECRET_GLOBAL_HARNESS_POLICY_CLAUDE, HR_SECRET_GLOBAL_HARNESS_POLICY_CODEX und HR_SECRET_GLOBAL_HARNESS_POLICY_HERMES legen fest, welche Verbindung das jeweilige Backend standardmäßig verwendet. HR_SECRET_KEY ist davon unabhängig. Diese Variable ist nur erforderlich, wenn Sie eine Datenbank mit einem Agent verbinden.

HR_BACKENDS legt fest, welche Backends geladen werden, wie in HR_BACKENDS=claude,codex,hermes. Ein bekanntes Problem sollten Sie kennen, bevor es auftritt: Jeder Wert ohne hermes beendet den Container sofort mit Status 1 und ohne Fehlermeldung. Eine Sekunde nach dem Start wird Exited (1) in docker ps -a angezeigt. docker logs liefert keine verwertbaren Informationen. Lassen Sie hermes in der Liste, bis das Upstream-Projekt das Problem behebt. Wenn Hermes das einzige Harness ist, das Sie verwenden möchten, ist der Betrieb des Hermes-Agenten auf einer eigenen VPS die kleinere Bereitstellung.

API ohne die Konsole aufrufen

Die Konsole ist optional. Beide verwenden dieselbe API, die einen Responses-ähnlichen Vertrag bereitstellt. Melden Sie sich zuerst an, um ein Session-Cookie zu erhalten:

curl -c hr.cookies http://localhost:3000/api/selfhost/login \
  -H 'content-type: application/json' \
  -d '{"username":"harnessrouter","password":"your-password"}'

Senden Sie anschließend eine Aufgabe. Geben Sie in metadata.harness_id das Harness und ein Modell an, das Ihr verbundener Provider tatsächlich bereitstellt:

curl -s -b hr.cookies http://localhost:3000/api/harness/v1/responses \
  -H 'content-type: application/json' \
  -d '{"input":"Reply with exactly this and nothing else: it works.",
       "metadata":{"harness_id":"codex"},
       "model":"gpt-5.4-mini",
       "stream":false}'

Ein JSON-Objekt mit einem Output-Block und einer Token-Anzahl bedeutet, dass das Harness ausgeführt wurde. Wenn Sie harness_id von codex in claude ändern, wird dieselbe Anfrage an ein anderes Harness gesendet. Dieser Austausch ist der eigentliche Zweck dieser Software. Mit der oben beschriebenen benutzerdefinierten Verbindung weisen Sie ein Harness auf einen OpenAI-kompatiblen Endpoint hin, den Sie bereits selbst hosten, so wie ein selbst gehostetes DeepSeek-Harness auf einem VPS eingebunden ist.

Erreichen Sie den Dienst vom Laptop aus, ohne einen Port zu veröffentlichen

Es gibt zwei Möglichkeiten. Keine davon öffnet einen direkten Port auf 0.0.0.0.

Ein SSH-Tunnel ist die einfachste Lösung und erfordert keine Installation auf dem Server. Er leitet einen lokalen Port auf Ihrem Rechner an die Loopback-Schnittstelle des VPS weiter.

ssh -N -L 3000:127.0.0.1:3000 you@your-vps

Lassen Sie den Tunnel geöffnet und rufen Sie http://localhost:3000 im Browser auf. Gibt SSH bind: Address already in use aus, verwendet bereits ein anderer Prozess auf Ihrem Laptop den Port 3000. Wählen Sie dann mit -L 3100:127.0.0.1:3000 einen anderen lokalen Port und rufen Sie Port 3100 auf.

Ein Reverse Proxy mit TLS-Terminierung ist die richtige Lösung, wenn andere Personen Zugriff benötigen. Der Proxy verwaltet das TLS-Zertifikat und leitet die Anfragen an die Loopback-Schnittstelle weiter. Die README enthält eine Caddy-Konfiguration:

console.example.com {
    encode zstd gzip
    reverse_proxy 127.0.0.1:3000 {
        flush_interval -1      # agent turns stream for minutes; never buffer them
    }
}

flush_interval -1 ist die Zeile, die häufig übersehen wird. Agent überträgt Stream-Tokens über mehrere Minuten. Ein Proxy, der die Antwort puffert, hält diese Tokens bis zum Ende des Durchlaufs zurück. Dadurch wirkt die Konsole eingefroren und gibt anschließend alles auf einmal aus. Das entsprechende Nginx-Äquivalent lautet proxy_buffering off; innerhalb des location-Blocks. Unabhängig von der gewählten Lösung muss der DNS-Name auf den Proxy und der Container auf die Loopback-Schnittstelle zeigen. Nginx, Caddy und Traefik als Reverse Proxy vergleichen erläutert, welche Lösung zu Ihrem Server passt.

Als eigener Benutzer ausführen, nicht als root

Der Docker-Daemon läuft als root. Die Mitgliedschaft in der Gruppe docker entspricht daher root-Rechten, weil ein Gruppenmitglied einen Container starten kann, der das Host-Dateisystem einbindet. Wer also „das Team zur Docker-Gruppe hinzufügt“, vergibt root-Rechte auf dem System, auf dem Ihr Provider-Schlüssel liegt.

Die einfache Variante: Erstellen Sie ein Dienstkonto, dem die Compose-Datei und .env gehören. Halten Sie diese Dateien aus gemeinsam genutzten Home-Verzeichnissen heraus.

sudo adduser --disabled-password --gecos "" harness
sudo install -d -o harness -g harness -m 750 /srv/harnessrouter

Die sicherere Variante ist Rootless Docker. Dabei läuft auch der Daemon als dieser nicht privilegierte Benutzer. Dafür benötigt er das Paket uidmap für newuidmap und newgidmap sowie mindestens 65536 untergeordnete UIDs in /etc/subuid und /etc/subgid für den Benutzer. uidmap befindet sich im Ubuntu-Archiv, docker-ce-rootless-extras jedoch nicht: Dieses Paket wird aus dem Docker-eigenen APT-Repository unter download.docker.com bereitgestellt, das durch die Installation der Docker Engine hinzugefügt wird. Wenn Sie die Engine nicht aus diesem Repository installiert haben, gibt grep -rl download.docker.com /etc/apt/sources.list.d/ nichts aus. Die folgende Installation findet das Paket dann nicht.

sudo apt install -y uidmap docker-ce-rootless-extras
sudo loginctl enable-linger harness
sudo -iu harness
dockerd-rootless-setuptool.sh install
export DOCKER_HOST=unix:///run/user/$(id -u)/docker.sock
systemctl --user enable --now docker

loginctl enable-linger ist hier nicht optional. Ohne diese Option wird die systemd-Instanz des Benutzers beendet, sobald die letzte Sitzung geschlossen wird. Dadurch wird der Container beim Abmelden beendet. Prüfen Sie das Ergebnis mit docker info. Der Befehl listet rootless unter Security Options auf. Rootless mode kann ohne zusätzliche Konfiguration keine Ports unter 1024 binden. Das ist hier unerheblich, weil Port 3000 über dieser Grenze liegt. Die Einrichtung des Kontos selbst wird unter Benutzer mit minimalen Berechtigungen auf einem VPS erstellen beschrieben.

Was fehlschlägt und was Sie sehen

Der Container wird eine Sekunde nach dem Start beendet und die Logs sind leer. docker ps -a zeigt Exited (1). Das ist das oben genannte HR_BACKENDS-Problem: In Ihrem Wert fehlt hermes. Ergänzen Sie es.

Der erste Start wird nie abgeschlossen. Das Log endet nach einer installing-Zeile, und ready on :3000 erscheint nie. Der Container kann das Netzwerk nicht erreichen, um die Agent-CLIs abzurufen, weil sie nicht im Image enthalten sind. Beheben Sie die ausgehende Route oder die Proxy-Einstellungen und starten Sie den Container anschließend neu.

Die Konsole wird geladen, und jede Aufgabe schlägt fehl. Es ist kein Provider verbunden. Das Image enthält weder ein integriertes Modell noch einen kostenlosen Tarif. Eine neue Instanz kann Sie daher zwar anmelden, aber keine Aufgaben ausführen.

Die Konsole friert hinter einem Proxy mitten in der Antwort ein. Die Ausgabe erscheint erst in einem Block, wenn der Durchlauf beendet ist. Ursache ist die Antwortpufferung. Setzen Sie flush_interval -1 in Caddy oder proxy_buffering off; in Nginx.

Sie können den Dienst von Ihrem Laptop aus nicht erreichen, obwohl der Tunnel aktiv ist. Führen Sie docker port harnessrouter auf dem Server aus. Wenn keine Ausgabe erscheint, veröffentlicht der Container keine Ports. Er wurde ohne -p gestartet.

Lohnt sich der Betrieb?

Der Betrieb lohnt sich, wenn Sie tatsächlich mehr als ein Harness verwenden und statt jeweils drei Endpunkten und drei Credential-Speichern nur einen Endpunkt und einen Credential-Speicher benötigen. Er lohnt sich ebenfalls, wenn Sie darauf ein Produkt aufbauen und das Harness als Konfigurationswert statt als Anlass für eine Überarbeitung behandeln möchten. Das bietet UHP, mit dem oben genannten Vorbehalt zum frühen Entwicklungsstand des Protokolls.

Der Betrieb lohnt sich nicht, wenn Sie nur ein Harness verwenden. Die Installation dieser CLI auf dem Server bedeutet weniger Komponenten, und zwischen Ihnen und dem Harness befindet sich kein Login. Es ist außerdem die falsche Lösung, wenn mehrere Agents gemeinsam eine Aufgabe bearbeiten sollen und nicht eine API vor mehreren Harnesses benötigt wird. Das ist ein anderes Werkzeug: Unter einem Multi-Agent-Harness wie Omnigent finden Sie dieses Muster. Unabhängig davon ändern sich die Bereitstellungsregeln nicht. Binden Sie an Loopback, ändern Sie das Passwort, verwenden Sie einen fixierten Tag ab 0.3.0 oder höher und einen eigenen Benutzer.

FAQ

Ist es sicher, HarnessRouter auf Port 3000 zu veröffentlichen?

Nein. Die Konsole erstellt Harnesses, liest jedes Transkript, führt Agents mit Shell- und Dateisystemzugriff aus und enthält den hinterlegten Provider-Key. Ein offener Port macht daher all diese Funktionen erreichbar. Veröffentlichen Sie den Dienst auf dem Loopback-Interface mit -p 127.0.0.1:3000:3000 und greifen Sie über einen SSH-Tunnel oder einen Reverse Proxy mit TLS-Terminierung darauf zu. Eine Host-Firewall reicht allein nicht aus: Docker schreibt eigene Regeln in die Kernel-Tabelle nat. Deshalb antwortet ein veröffentlichter Port aus dem Internet, selbst wenn ufw ihn als verweigert anzeigt. Prüfen Sie dies mit sudo ss -ltnp | grep 3000. Der Befehl sollte 127.0.0.1:3000 ausgeben.

Welche HarnessRouter-Version hat die Anmeldesperre eingeführt?

0.3.0. Die Versionen 0.1.x und 0.2.0 wurden vollständig ohne Authentifizierung veröffentlicht. Beide Tags sind weiterhin veröffentlicht und weiterhin abrufbar. Wer sie ausführt, verlässt sich daher darauf, dass niemand den Port findet. Am 19. August 2026 ist 0.5.5 der neueste Tag, datiert auf den 18. August 2026. Führen Sie docker image ls harnessrouter/harnessrouter aus, um Ihre Version anzuzeigen. Vergleichen Sie sie mit der Tag-Liste auf Docker Hub und nicht mit dieser Seite. Ändern Sie das Standardpasswort auch bei einer aktuellen Version.

Warum beendet sich der Container sofort, nachdem ich HR_BACKENDS gesetzt habe?

Jeder HR_BACKENDS-Wert, in dem hermes fehlt, beendet den Container sofort mit Status 1 und ohne Fehlermeldung. Dieses bekannte Problem ist in der README des Projekts dokumentiert. Das Symptom ist Exited (1) in docker ps -a innerhalb von ein oder zwei Sekunden. In docker logs erscheint dabei nichts Verwertbares. Lassen Sie hermes wie in HR_BACKENDS=claude,codex,hermes in der Liste, bis das Upstream-Projekt das Problem behebt.

Benötigt HarnessRouter beim ersten Start Internetzugriff?

Ja. Die Agent-CLIs werden beim ersten Start abgerufen und nicht mit dem Image ausgeliefert, weil jede CLI ihre eigene Lizenz besitzt. Ein System ohne ausgehende Route gibt die installing-Zeilen aus und erreicht anschließend nie ready on :3000. Der Download erfolgt einmal pro Volume. Spätere Starts dauern daher nur wenige Sekunden und benötigen keine Netzwerkverbindung außer zu dem von Ihnen verbundenen Model Provider.

Ich habe das Passwort für die Konsole verloren. Wie erhalte ich wieder Zugriff?

Es gibt keine E-Mail zum Zurücksetzen, weil es kein Kontosystem und keinen Mailserver gibt. Stoppen Sie den Container, löschen Sie /data/selfhost-auth.json aus dem Volume und starten Sie den Container erneut. Melden Sie sich anschließend mit den Standardzugangsdaten an und legen Sie auf der Seite Profile ein neues Passwort fest. Wenn Container und Volume beide harnessrouter heißen, lautet die Abfolge docker stop harnessrouter, dann docker run --rm -v harnessrouter:/data alpine rm -f /data/selfhost-auth.json und anschließend docker start harnessrouter.