2026 OpenClaw auf Mac-VPS mit Docker: Gateway-Token, CLI-Containernetzwerk und Pairing-Deadlock-Runbook
Wenn derselbe Compose-Stack vom Laptop auf einen kopflosen Mac-VPS wandert, tauchen oft token mismatch, 1008 pairing required oder CLI-Fehler auf 127.0.0.1:18789 auf. Der Text richtet sich an Teams, die openclaw-gateway und openclaw-cli in getrennten Containern betreiben: fuenf Ursachencluster, eine Symptom-Triage-Tabelle, ein fuenfstufiges auditierbares Runbook (Token einfrieren, doppelte Quellen angleichen, Namespaces reparieren, Pairing-Schleifen loesen, Healthchecks mit launchd verbinden) plus Links zu Compose 7x24 und Gateway-Ladder auf dieser Site.
Auf dieser Seite
1. Schmerzpunkte: doppelte Tokens, Loopback, Pairing, Bind, UID
Offizielle Docker-Flows setzen voraus, dass ein Mensch im selben Netzwerk-Namespace wie die Skripte durch das Onboarding klickt. Auf unbeaufsichtigten Mac-VPS-Hosts buendeln sich typische Fehler in fuenf Eimer:
- Stille Umgebungsvariable: Ist
OPENCLAW_GATEWAY_TOKENim Container gesetzt, kann ergateway.auth.tokeninopenclaw.jsonuebersteuern; die UI zeigt dann ein Token, das das Gateway nie prueft. - CLI-Loopback bei getrennten Stacks: Die CLI spricht standardmaessig
ws://127.0.0.1:18789an – das ist der Loopback des CLI-Containers, nicht des Gateways;ECONNREFUSEDoder harte1006-Schliesse wirken wie Netzflaps. - Pairing-Deadlocks: Mit
gateway.bind=lanwarten Dashboard und CLI gegenseitig auf Freigabe; ohne dokumentierte Reihenfolge drehen Sie auf1008. - Bind-Semantik vs. Bridge:
loopbackkollidiert mit Container-zu-Container-Zielen; nach Wechsel auflanohne CLI-URL-Update bleibt oft nur ein erfolgreicher Listen-Log, waehrend der WebSocket nicht fertig wird. - Volume-UID-Drift: Images laufen oft als UID 1000; vom Host als root angelegte Pfade brechen Persistenz – Token-Dateien scheinen zu speichern und sind nach Restart weg.
Auf einem kopflosen Mac-VPS tarnt kein lokaler Browser Fehlkonfiguration: jeder WebSocket-Retry steht in den Logs, launchd startet Container auch mitten im Pairing neu. Lesen Sie docker compose logs -f openclaw-gateway und CLI-Logs als eine gemeinsame Zeitleiste. Bei Digest-Pinning notieren Sie Digest und Token-Fingerprint (erste acht Zeichen) im Change-Ticket, damit Rollbacks kein altes Auth-Modell heimlich zurueckbringen. Wenn das Dashboard ueber Loopback hinaus erreichbar ist, lesen Sie zusaetzlich den Hardening-Text zur Gateway-Exponierung, damit Token-Drift nicht nur als Docker-Netzbug, sondern auch als Blast-Radius-Thema behandelt wird.
2. Triage-Tabelle: Symptom, Ursache, erster Befehl
Tabelle in die Incident-Vorlage kleben; fuer die Policy-Phase den Hardening-Artikel zur Exponierung parallel lesen.
| Symptom | Likely root cause | First auditable action |
|---|---|---|
| token mismatch / unauthorized | Env-Token weicht von JSON ab | Beide Quellen im Repo und Volume per grep pruefen; Hex vor Setup-Retry einfrieren |
| 127.0.0.1:18789 refused | CLI vom Gateway-Netz isoliert | network_mode: service:openclaw-gateway oder GATEWAY_URL auf Compose-Service setzen |
| 1008 pairing loop | Gegenseitiges Warten auf Freigabe | openclaw dashboard --no-open, dann devices list / devices approve mit Log-Auszug im Ticket |
| Flaky health checks | Nur Prozess-Probes | HTTP auf /healthz und /readyz am echten Listener |
| Writes revert | Mounts oder Rechte | Bind-Pfade auf VPS-Disk pruefen; chown -R 1000:1000 auf Datenverzeichnissen |
OPENCLAW_GATEWAY_TOKEN=$(openssl rand -hex 32) exportieren, dieselbe Zeichenkette in .env und in beide Service-Bloecke schreiben, beim Onboarding nur diesen Wert einfuegen. Kein zweites Token durch Hilfsskripte mitten im Incident erzeugen lassen.
„Beide Quellen grep“ woertlich nehmen: Repo nach OPENCLAW_GATEWAY_TOKEN durchsuchen, openclaw.json im laufenden Container per docker compose exec openclaw-gateway cat /pfad/zur/openclaw.json pruefen (Pfad anpassen) und mit der env-Sektion in Compose vergleichen. Bei Secret-Managern den zur Laufzeit aufgeloesten Wert pruefen, nicht nur das Git-Template. Bei 1008 festhalten, ob Dashboard und CLI unterschiedliche Pending-Zustaende zeigen – das deutet oft auf falsches GATEWAY_URL oder geteilte Cookies statt echte Auth-Fehler.
3. Fuenf-Schritte-Runbook bis On-Call-Checks
- Secret einfrieren: Erste acht Zeichen des Tokens und geplanten Image-Digest im Change-Ticket festhalten.
- Doppelte Quellen angleichen: Vor
compose upgateway.auth.tokenundOPENCLAW_GATEWAY_TOKENje Containerdefinition read-only vergleichen. - Namespaces reparieren: Fuer die CLI
network_mode: service:openclaw-gatewaybevorzugen; falls Bridge noetig,GATEWAY_URL=ws://openclaw-gateway:18789setzen und DNS aus einem Wegwerf-docker compose run-Shell testen. - Pairing loesen: Im Gateway-Container
openclaw dashboard --no-open, URL mit Token abschliessen, dann im CLI-Containerdevices approvemit im Ticket dokumentierter Befehlsfolge. - Probes und launchd: Vom Host
/healthzund/readyzmit kurzen Timeouts per curl; dieselben Checks in einer plist-SuccessfulExit-Bedingung spiegeln, damit Neustarts nicht siegen, solange der WebSocket unten ist. Ressourcengrenzen siehe Compose-7x24-Artikel auf dieser Site.
Minimales Compose-Skizze (vor Produktion mit Upstream-Templates mergen):
Wenn network_mode: service:openclaw-gateway wegen eines Sidecars nicht geht, explizite interne URL setzen und aus einem Wegwerf-Container pruefen: docker compose run --rm busybox wget -qO- http://openclaw-gateway:18789/healthz (oder curl). Erwarteten Docker-DNS-Hostnamen dokumentieren; Tippfehler in Service-Namen erklaeren viele „ging auf dem Laptop“-Faelle. Geraetzeilen erst nach Log-Export loeschen, wenn klar ist, dass nicht der falsche Workspace betroffen ist.
4. Zitierfaehige Fakten: Port, UID, Probes
- Port: Standard-Listener
18789; Health-Skripte muessen den Listener treffen, nicht nurdocker ps. - UID: Node-User typischerweise
1000; Host-Binds angleichen, sonst leise Persistenzverluste. - Probes:
/healthzals Liveness,/readyznaeher an WebSocket-Readiness; Reihenfolge und Timeouts im Runbook festhalten. - Zeitsync: Grosse Drift zwischen Host und Container stoert Zertifikats- und Log-Korrelation; NTP auf dem VPS gesund halten.
- Upgrade-Fenster: Bei Image-Bumps zuerst die fuenf Schritte;
docker psheisst nicht automatisch authentifizierte CLI-Session.
Operationalisieren Sie die Checks in Ihrem Chat-Ops-Playbook: jede Eskalation sollte Token-Fingerprint, Compose-Dateirevision und Digest in einer Zeile tragen, damit Postmortems nicht raten muessen. Wenn Sie Blue/Green fuer das Gateway erwaegen, dokumentieren Sie explizit, welcher Stack noch alte Pairing-Eintraege traegt, sonst genehmigen Teams versehentlich Geraete gegen die falsche URL. Fuer Lasttests empfiehlt es sich, Health-Endpunkte mit denselben Timeouts zu schlagen wie in Produktion; kuenzer im Test als in Prod verschleiert Flakes. Mac-VPS-Anbieter mit fest zugewiesener Bandbreite reduzieren zusaetzlich das Risiko, dass Remote-Steuerungskanäle waehrend langer WebSocket-Sessions gedrosselt werden. Wer mehrere Umgebungen betreibt, sollte Tokens niemals per Copy-Paste zwischen Staging und Prod teilen; stattdessen getrennte .env-Dateien mit klar benannten Suffixen verwenden. Schliesslich: halten Sie ein kurzes Architekturdiagramm bereit, das Gateway-, CLI- und Sidecar-Namespaces zeigt – On-Call-Ingenieure verlieren sonst im Bridge-Layout schnell den Ueberblick.
Ergaenzen Sie zusaetzlich eine kurze Checkliste fuer Rollenwechsel: wer darf devices approve ausfuehren, wer darf Token rotieren, und wie wird das in einem verschluesselten Ticket nachvollziehbar abgelegt. Ohne diese Rollenmarkierung landen Pairing-Freigaben oft bei Personen, die keinen Zugriff auf die VPS-Konsole haben, was die MTTR verlaengert. Wenn Sie Infrastructure-as-Code fuer Compose nutzen, validieren Sie Aenderungen mit einem statischen Diff gegen die laufende docker compose config-Ausgabe, damit versteckte env-Ueberlagerungen vor dem Merge auffallen. Bei laengeren Wartungsfenstern sollten Sie Healthchecks bewusst failen lassen, um zu pruefen, ob launchd wirklich stoppt und nicht nur den Container neu startet, waehrend Clients noch alte Verbindungen halten. Speichern Sie zudem die WebSocket-Upgrade-Header aus einem erfolgreichen Handshake als Referenz, damit Regressionen schneller erkannt werden.
5. Lesereihenfolge: Compose 7x24 und native Gateway-Guides
Wenn Restarts, Speicherdeckel und Digest-Pinning noch nicht standardisiert sind, zuerst Compose 7x24 Health, Upgrade, Rollback lesen. Wenn die Diskussion wandert, ob das Gateway-Binaer oder die CLI die Wahrheit besitzt, Gateway install / bind / auth Runbook fuer Native-vs-Docker-Grenzen oeffnen. Ad-hoc-docker run auf dem Laptop verbirgt Pairing- und Token-Probleme, die auf kopflosem Mac-VPS Pager-Laerm werden. Gegenueber reinem launchd fuegt Docker eine Abstraktionsschicht hinzu; Upgrades und Drills kosten mehr Wandzeit. Wer dediziertes Apple Silicon, stabilen Egress und planbare Parallelitaet fuer langlebige Agenten braucht, bucht VPSMAC M4 Mac-Cloud-Knoten, um Binds, plist-Richtlinien und Compose in einer Betriebsgeschichte zu halten. Automation schliessen Sie mit dem 90-Sekunden-Mac-Cloud-API-Leitfaden auf dieser Site.