Wenn zwei Mac-Gateways denselben OpenClaw-Sidecar per mDNS anpreisen oder launchd zweimal dasselbe Label lädt, sehen Canary-Ratios weiterhin „grün“ aus — bis der falsche Knoten den Webhook annimmt. Die kleinste reproduzierbare Heilung ist kein weiteres Dashboard, sondern ein gemeinsamer Abgleich mit doctor --deep, gefolgt von einem chirurgischen launchd-Cleanup, bevor Ports und Digests überhaupt Schritt für Schritt wandern dürfen.

Dieser Text ist bewusst komplementär zu den rein verkehrsgetriebenen Canary-Playbooks in Canary, Skill-Pack-Slices & gemergte Probes und Konfig-Fragmente mergen & Canary-Shunt: Dort steuern Sie LB-Anteile und Merge-Reihenfolge. Hier räumen Sie die physische und schedulbare Realität auf — doppelte launchd-Labels, kollidierende Listener und fehlinterpretierte Service-Discovery — damit Doctor, Readiness und Webhook-Summaries wieder dasselbe Cluster meinen. Für Mandanten-Digests und Token-Überlappung siehe Mandanten-Fragmente, Doctor-Merge & Webhook-Fehler-Digests; für Gateway-Broadcast-Pfade Multi-AZ-Gateways & Webhooks; für Rolling-Peer-Konsistenz Rolling 2026.4.x & Canary-Rollback.

Schritt 1–2: Mehrknoten-Baseline mit doctor --deep

Starten Sie auf jedem clustervps-Gateway mit derselben OpenClaw-Version und leeren Sie vorher temporäre JSON-Ausgaben, damit Diff-Tools nicht alte Artefakte mischen. doctor --deep (Flag-Namen je Release prüfen) soll Sidecar-Sockets, Bonjour-/DNS-Slices und konkurrierende HTTP-Bindings im selben JSON-Schema ausgeben wie der flache Doctor — aber mit erweiterten Blöcken für registrierte Helferprozesse. Sammeln Sie die Dateien zentral: scp gw-a:/tmp/deep.json ./deep-a.json usw., dann jq-Vergleich auf identische listener_ports, mdns_fqdn und sidecar_sha. Abweichungen markieren Sie als Blocker, bevor Sie Canary-Ports oder LB-Gewichte anfassen — sonst promoten Sie Zufall.

#!/usr/bin/env bash
set -euo pipefail
HOST="$(/usr/sbin/scutil --get ComputerName)"
/usr/local/bin/openclaw doctor --deep --json | /usr/bin/tee "/tmp/openclaw-deep-${HOST}.json"
/usr/bin/diff -u /tmp/openclaw-deep-stable.json "/tmp/openclaw-deep-${HOST}.json" || true

Erst wenn der Diff nur erwartbare Canary-Zeilen zeigt (zum Beispiel absichtlich anderer HIGH_PORT_BASE), gehen Sie zu launchd und Ports über.

Schritt 3–4: Doppelte launchd-Labels minimal bereinigen

Typisches Symptom: zwei Plists unter /Library/LaunchDaemons und /usr/local/etc/LaunchDaemons referenzieren dasselbe Labelkickstart startet scheinbar erfolgreich, aber Health flattert. Vor jedem bootout ein Tar-Archiv der betroffenen Plists nach /var/db/openclaw/backup/launchd-$(date +%s).tgz legen. Listen Sie mit launchctl print system | rg -i openclaw doppelt geladene Jobs. Behalten Sie genau eine autoritative Plist (üblicherweise unter /Library/LaunchDaemons); die andere Datei umbenennen (.disabled), nicht löschen, bis Doctor wieder grün ist.

Niemals zwei bootstrap-Wellen parallel auf mehreren Hosts ohne Writer-Lock — sonst gewinnt der zuletzt geschriebene Plist-Pfad und der Abgleich in Schritt 1–2 lügt wieder.
sudo /bin/tar czf /var/db/openclaw/backup/launchd-pre-clean.tgz /Library/LaunchDaemons/com.openclaw*.plist 2>/dev/null || true
sudo /bin/mv /usr/local/etc/LaunchDaemons/com.openclaw.gateway.plist \
  /usr/local/etc/LaunchDaemons/com.openclaw.gateway.plist.disabled
sudo launchctl bootout system/com.openclaw.gateway 2>/dev/null || true
sudo launchctl bootstrap system /Library/LaunchDaemons/com.openclaw.gateway.plist

Schritt 5–6: Canary-Port-Slice statt Produktions-Port zu teilen

Nach bereinigten Labels bindet das Canary-Gateway Sidecars auf einen Offset-Block (Beispiel: HIGH_PORT_BASE=47100 statt 47000). Der Load Balancer health-checkt nur den Canary-Pool auf diesen Ports, während stabile Gateways unverändert bleiben. Dokumentieren Sie Basis plus Offset in Ihrer Mandanten-Fragmentdatei, damit Fragment-Merge und Doctor dieselbe Zahl lesen. Wenn doctor --deep weiterhin zwei Listener auf demselben Produktionsport meldet, ist der Port-Slice noch nicht wirksam — zurück zu Schritt 3–4.

# LaunchDaemon Environment (Beispiel)
export OPENCLAW_HIGH_PORT_BASE="${OPENCLAW_HIGH_PORT_BASE:-47100}"
sudo launchctl setenv OPENCLAW_HIGH_PORT_BASE "${OPENCLAW_HIGH_PORT_BASE}"
sudo launchctl kickstart -k system/com.openclaw.gateway

Schritt 7–8: Webhook-Fehler-Summary broadcasten (ohne Promotion)

Koppeln Sie die letzten fünf Minuten fehlgeschlagener Webhook-Zustellungen (HTTP-Status, Partner-Endpoint, Retry-Count) an einen schreibgeschützten Endpunkt, den Ihre Readiness-Route nur einliest — analog zur Digest-Zeile in Tenant-Split & Digests. Broadcast heißt: alle Gateways lesen dieselbe Summary-Datei oder denselben Objektstore-Key, damit ChatOps und On-Call nicht pro Host raten. Die Summary erweitert Verkehr nicht; sie macht nur sichtbar, ob Canary-Ports oder Partnerausfälle korreliert sind.

#!/usr/bin/env bash
set -euo pipefail
/usr/local/bin/openclaw notifier webhook-summary --window 5m --json \
  | /usr/bin/tee /var/db/openclaw/summary/webhook_failures.json
/usr/bin/install -d /var/db/openclaw/summary
/usr/bin/install -m0644 /var/db/openclaw/summary/webhook_failures.json \
  /usr/local/share/openclaw-infra/public/summary.json

Kurz-Checkliste (Reihenfolge strikt einhalten)

  • 0 Writer-Lock setzen (Ticket-ID im Dateisystem oder Nomad-Constraint), alle Gateways auf identische OpenClaw-Revision.
  • 1 doctor --deep --json pro Host, zentral diffen; Blockerliste führen.
  • 2 launchd-Duplikate per bootout/bootstrap bereinigen; ein Label, eine Plist.
  • 3 Canary-HIGH_PORT_BASE setzen, Sidecars neu binden, erneut doctor --deep.
  • 4 Webhook-Summary erzeugen und öffentlich lesbar spiegeln (ohne Secrets im JSON).
  • 5 Readiness-Route mergen: Doctor + Summary + optional bestehende Digests; erst danach LB-Canary nach den anderen HowTos erhöhen.

Rollback-Matrix (Marken R0–R3)

Jede Marke ist ein commit-fähiger Zustand — nicht „wir haben irgendwas zurückgedreht“. Kombinieren Sie mit Artefakt-Disziplin aus Artefakt-Matrix (rsync), falls Sie Konfiguration zwischen Hosts kopieren.

Marke Auslöser Aktion
R0 Doctor zeigt noch doppelte Listener vor Canary Kein Traffic-Shunt: nur Plists aus Backup zurückspielen, bootstrap, erneut deep-Diff.
R1 Canary-Ports ok, Webhook-Summary explodiert (Partner down) Canary-LB-Gewicht auf 0; Produktionsports unangetastet lassen; Summary-Window auf 1m verkürzen zur Diagnose.
R2 Sidecar bindet wieder auf Produktionsbasis OPENCLAW_HIGH_PORT_BASE auf archivierten Wert, kickstart, Doctor grün auf allen drei Hosts.
R3 Teilweise zurückgerollt, gemergte Probe inkonsistent Voller R1+R2: Gewichte + Ports + einheitliche Plist; Audit-Zeile mit probe_sha256 aus gutem Snapshot.

FAQ

Reicht flacher doctor nach einem Major-Upgrade? Für Mehrknoten-Betrieb nein — Deep deckt Sidecars auf, die erst nach dem zweiten Neustart registriert werden.

Darf die Webhook-Summary Traffic steuern? Nein. Sie informiert nur; Promotion bleibt bei LB- und Semver-Hebeln wie in den verlinkten Canary-Artikeln.

Wie viele Hosts minimum? Wie in den Canary-HowTos: drei ehrliche Knoten (zwei stabil, einer Canary), sonst sehen Sie keine echten Port-Kollisionen.

Nur operative Orientierung. OpenClaw-CLI-Flags können sich zwischen 2026.4.x-Patches ändern; immer gegen openclaw version --json auf dem jeweiligen Mac prüfen. Shell-Snippets sind Schablonen — Pfade und Label-Namen an Ihre Installation anpassen.
Ohne Konto loslegen

Dedizierte Mac-Knoten für saubere Doctor-Baselines

Wenn jeder Gateway-Mac feste Ports, eigene launchd-Historie und reproduzierbare Pfade hat, wird doctor --deep zum verlässlichen Abgleich statt zur Ratespielshow. Tarife und Kaufen sind öffentlich erreichbar — keine Anmeldung nötig, um Angebote und Standorte zu prüfen. Für SSH-Pfade und SLA-Hinweise Hilfe-Center im Runbook verlinken.

Mac-Gateway-Kapazität prüfen Tarife ansehen