openclaw onboard, openclaw doctor, Gateway auf 127.0.0.1 hinter TLS.
Links: Gateway-Härtung, Healthcheck & LaunchAgent, GHCR-Matrix.
- Filter: falsche
definition.id→ stille Nicht-Lieferung trotz grüner Builds. - TLS ≠ Auth: HTTP-Basic plus Roh-Body vor
JSON.parse; CIDR-Listen allein reichen nicht. - Stabilität: Remote-Mac statt schlafendem Laptop für Listener und
launchd-Logs.
2026 Gateway-Baseline: Node-Version, OpenClaw-Port, PAT least privilege
Node 22 LTS oder Node 24 wenn openclaw doctor sauber ist; openclaw onboard, optional --install-daemon laut Doku.
~/.openclaw/openclaw.json → echter Gateway-Port (oft nahe 18789, verifizieren). Health-curl und NODE_BINARY in derselben launchd-Umgebung wie OpenClaw.
| Signal / Kontrollpunkt | Azure DevOps Perspektive | Minimal-Muster auf dem Mac |
|---|---|---|
| Webhook-Geheimnis | Service Hooks unterstützen HTTP-Basic (Benutzername frei wählbar, Passwort = gemeinsames Secret) | Authorization dekodieren, Passwort zeitkonstant vergleichen, erst danach JSON parsen |
| PAT least privilege | Prefetch meist Code (Read) + Build (Read); optional separates schmales Token für Timeline-Kommentare | ADO_PREFETCH_PAT nur in Dateien/Env mit Modus 600, Rotation bei Azure-Ablauf-Mail |
| Netzwerk | Ausgang ggf. über Shared Infrastructure | Edge-Allowlist nur als Ergänzung zu Basic |
Review: PAT-Scopes, Secret-Rotation, Hook-URL mit Pfad-Token dokumentieren; definition.id-Whitelist plus Basic = kleinstes stabiles Muster.
Enterprise-Umgebungen verankern PAT-Laufzeiten und Scopes häufig in Azure Policy — planen Sie zwei Tokens, eines strikt read-only für Prefetch-Klon und Build-Metadaten, ein optionales zweites nur für Timeline- oder Kommentar-APIs. Versionieren Sie eine anonymisierte Hook-JSON aus der Historie als Parser-Fixture im Repository, damit Reviews ohne Produktionsgeheimnisse laufen. Für parallele Definitionen je Umgebung eigene Pfad-Tokens und Secrets verwenden, damit Staging nie Produktions-Prefetch auslöst.
Trigger-Felder im Service Hook, Filter und Verifikations-Checkliste
Projekteinstellungen → Service hooks → Web Hooks → Build completed: eine Definition filtern, HTTPS-URL mit Pfad-Token, HTTP-Basic aktivieren.
Parser-Felder: resource.id, buildNumber, status, sourceBranch, requestedFor, url / _links.web.href, definition.id, project.id, repository.id. Schlankes Event → Commit per REST nachziehen.
ado-hook, Passwort = ADO_HOOK_SECRET.definition.id / project.id whitelisten.200/202, Prefetch async.curl --user ado-hook:$SECRET --data-binary @fixture.json vom gehosteten Agent.# Nach TLS: Basic prüfen, erst dann JSON.parse (Skizze) # const [u,p]=decodeBasic(req.headers.authorization); # if (u!=='ado-hook' || !timingSafeEqual(p, process.env.ADO_HOOK_SECRET)) return 401;
Ausführbare Prefetch-Befehle und Wegwerf-Workdirs
Ein Event = ein mktemp-Workdir unter /var/tmp, PAT nur für git clone, danach rm -rf.
export GIT_TERMINAL_PROMPT=0 WORKDIR=$(mktemp -d /var/tmp/ado-openclaw.XXXXXX) git -C "$WORKDIR" clone --depth 1 "https://anything:$(printf %s "$ADO_PREFETCH_PAT")@dev.azure.com/org/project/_git/repo" src cd "$WORKDIR/src" || exit 1 npm ci --dry-run 2>/dev/null || npm install --dry-run --ignore-scripts pnpm fetch --frozen-lockfile 2>/dev/null || true composer install --dry-run --no-interaction --no-ansi 2>/dev/null || true rm -rf "$WORKDIR" curl -fsS --max-time 8 "http://127.0.0.1:18789/health" || echo "health failed"
Exit-Codes + Log-Tail in die Summary; große Logs extern mit logSha256.
Build-Summary-JSON, Log-Snippet-Vorlage und Retry-Backoff
Kleines application/json an Observability oder Azure-REST mit schmalem zweiten PAT; Felder openclawJobId, prefetchMs, optional logSha256.
read -r -d '' PAYLOAD <<'JSON'
{
"schema": "macpull.openclaw.prefetch.v1",
"buildId": 12345,
"definitionId": 67,
"status": "prefetch_ok",
"prefetchMs": 4200,
"packages": {"npmExit":0,"composerExit":0},
"logExcerpt": "… letzte 80 Zeilen …",
"openclawJobId": "ocw_01jq…"
}
JSON
for s in 2 4 8; do
curl -fsS --max-time 25 -H "Content-Type: application/json" \
-H "Authorization: Bearer $SUMMARY_TOKEN" \
--data-binary "$PAYLOAD" "$SUMMARY_URL" && break
sleep "$s"
done
Drei Versuche, Pausen 2 / 4 / 8 s, curl --max-time 25.
FAQ: Azure DevOps Service Hooks mit OpenClaw auf dem Mac
Statischer Edge-200: Basic in der App erzwingen, Access-Log prüfen, Upstream bis OpenClaw verfolgen.
resource.sourceVersion oder resource.url per Read-PAT nachlesen.
Zweites PAT mit passendem Scope; Prefetch-PAT strikt read-only halten.
npm fehlt unter launchd
Absolute node-Pfade, NODE_BINARY, openclaw doctor — siehe Healthcheck-Artikel.
Abnahme-Checkliste (vor Produktions-Freigabe)
openclaw doctor sauber; Health-curl aus launchd; Hook-Historie mit Basic-200; Wegwerf-Clone ok; Summary zweimal grün in Staging; keine Secrets in Azure-Logs.
Remote-Mac bei MacPull für dauerhaften Listener: Startseite, Kaufen, Hilfe, Technik-Blog.
MacPull: Apple-Silicon-Macs für stabile OpenClaw-Gateways, Azure-Service-Hooks und begrenzte Summary-Retries.
OpenClaw- plus Azure-DevOps-Gateway dauerhaft online halten
Mieten Sie einen Remote-Mac-Mini für einen stabilen OpenClaw-Listener, TLS für Microsoft-Service-Hooks und überwachte launchd-Jobs — Einstieg über Startseite, Kaufen, Hilfe oder den Technik-Blog ohne Anmeldung.