Dieses HowTo richtet sich an Teams, die OpenClaw auf mehreren vpshalo-PoPs fahren möchten, ohne routbaren HTTP-Listener im öffentlichen Internet. Mit frp STCP verketten wir regionale Mac-Builder über eine Bastion, binden Gateway und Doctor strikt an 127.0.0.1, erzwingen Token- und secretKey-Prüfungen vor jedem Byte und fassen Gateway- und Doctor-Sonden zu einem regionalen Alarm zusammen—ein niedrig exponierter Mehrregion-Modus statt breiter Öffnung.

Alternativen: Tailscale MagicDNS, SSH-Reverse-Tunnel oder hier STCP, wenn Mesh verboten ist. Kontext: GeoDNS-Matrix, Cloudflare Tunnel, JumpHost-HowTo, SCP/SFTP-RTT, Split-Horizon. Öffentliche CTAs: Titelseite, Preise, Hilfe, Kaufen, Blog.

Drei Betriebsschmerzen, die das Layout löst

  • 1 Demonstriert auf 0.0.0.0: jede Marketing-Demo wird zur dauerhaften Angriffsfläche; STCP hält den ergonomischen Pfad auf Loopback.
  • 2 Geheimnis-Sprawl: systemd-Kopien pro Region explodieren; hier genügen ein auth.token für frps plus je STCP-Proxy ein secretKey, kalendergetrieben rotierbar.
  • 3 Sonden-Rauschen: Gateway grün während Doctor hängt erzeugt zwei Tickets; Merge pro Region kollabiert das auf „JP rot“ statt Doppelpaging.
Designziel Mechanismus Abnahmesignal
Gateway-Port nicht im Internet STCP-Visitor + frps-Token ss -ltn zeigt OpenClaw nur auf 127.0.0.1 auf Builder und Visitor
Auth vor OpenClaw-TCP auth.token (frps) + secretKey (STCP) Zähler für abgewiesene Verbindungen steigen bei Drift; OpenClaw-Logs bleiben ruhig
Regionale Isolation eigenes proxy_name pro PoP (z. B. openclaw-sin-gw) Tokyo-Visitor wählt Singapur nicht per Tippfehler—Namens-Mismatch scheitert
Health-Rollup Gateway + Doctor Merge-Worker je Region ein Alarm pro regionaler Störung, nicht pro Endpunkt

Rollen, Ports und Verkettung von Gateway und Doctor

frps auf Linux-Bastion: bindPort = 7000, auth.method = "token", langes auth.token; optional Dashboard 7500 hinter TLS. 7000/tcp nur für Operator- und Builder-Subnetze. frpc auf jedem vpshalo-Mac registriert zwei STCP-Proxys: openclaw-{region}-gw127.0.0.1:18080 (Gateway) und openclaw-{region}-doctor127.0.0.1:18081 (Doctor-JSON). Je Proxy ein secretKey.

Visitor auf Operator- oder Merge-Host: ausgehend zur Bastion, lokal 127.0.0.1:28080 und 28081. curl http://127.0.0.1:28080/healthz testet Visitor → Token → Secret → Loopback → OpenClaw. Doctor auf 28081 deckt hängende Reloads auf, selbst wenn healthz grün bleibt.

Minimal reproduzierbare Schritte (pro Region einmal)

Platzhalter {region} durch Inventar-Tags ersetzen (sin, tyo, hkg, icn, lax).

  • Schritt 1 — OpenClaw pinnen: OPENCLAW_HOME=/var/lib/openclaw/{region} (macOS-Pfad analog), Start mit --gateway-bind 127.0.0.1:18080 --doctor-bind 127.0.0.1:18081; curl nur von localhost gegen /healthz und /doctor.
  • Schritt 2 — frps: frps -c frps.toml mit obigen Auth-Feldern; 7000/tcp in SG/UFW/nft restriktiv.
  • Schritt 3 — Builder-frpc: zwei type = "stcp"-Proxys ohne remotePort; je secretKey; Unit mit Restart und Backoff, damit Flaps keine Firewall-Lockerung erzwingen.
  • Schritt 4 — Visitor: zwei [[visitors]] mit passendem serverName und secretKey, bindAddr = "127.0.0.1"; vor Team-Rollout curl lokal verifizieren.
  • Schritt 5 — Sonden mergen: Worker ruft nacheinander 127.0.0.1:28080/healthz und 127.0.0.1:28081/doctor auf, schreibt {region,gw_ms,doctor_ms,status,error_class} in die TSDB; Page nur wenn beide Lanes im selben Fünf-Minuten-Fenster rot sind; Multi-Region-Eskalation erst bei zwei Regionen gleichzeitig.
# frpc.toml — Builder, zwei STCP-Proxys auf Loopback
serverAddr = "bastion.example"
serverPort = 7000
auth.method = "token"
auth.token  = "<langes-frps-token>"

[[proxies]]
name = "openclaw-sin-gw"
type = "stcp"
secretKey = "<sk-sin-gw>"
localIP   = "127.0.0.1"
localPort = 18080

[[proxies]]
name = "openclaw-sin-doctor"
type = "stcp"
secretKey = "<sk-sin-doctor>"
localIP   = "127.0.0.1"
localPort = 18081

# frpc.toml — Visitor, beide Lanes nur auf 127.0.0.1
[[visitors]]
name       = "v-openclaw-sin-gw"
type       = "stcp"
serverName = "openclaw-sin-gw"
secretKey  = "<sk-sin-gw>"
bindAddr   = "127.0.0.1"
bindPort   = 28080

[[visitors]]
name       = "v-openclaw-sin-doctor"
type       = "stcp"
serverName = "openclaw-sin-doctor"
secretKey  = "<sk-sin-doctor>"
bindAddr   = "127.0.0.1"
bindPort   = 28081
Braucht jemand Browser-Zugriff ohne VPN, terminiert TLS vor dem Visitor-Port an einem separaten Reverse-Proxy—nicht den STCP-Visitor auf 0.0.0.0 heben. Loopback bleibt Loopback; sonst verliert das Muster seinen Audit-Wert.
Parameter Startwert Stabilitätsnotiz
frps bindPort 7000/tcp Nur vertrauenswürdige Quell-IP-Räume; keine Portweiterleitung ins Guest-WLAN
OpenClaw Gateway / Doctor 18080 / 18081 Beispielkonvention; dokumentiert mit ss gegen versehentliches 0.0.0.0
Visitor-Bindings 28080 / 28081 Nur Merge-Host/Operator; nie auf LAN-Interfaces spiegeln
Merge-Fenster 300 s Kürzer für Demos, länger für Batch-Builds mit seltener Telemetrie
curl-Timeout Sonden 2 s Getrennt vom OpenClaw-Upstream-Timeout im Runbook festhalten
Geheimnisrotation ≤ 15 Min. Rollout-Fenster Proxy und Visitor gemeinsam; danach curl-Grün vor Alarm-Silence

Drei Runbook-Sätze zum Zitieren

  • Rotation: ein auth.token für frps, je STCP-Proxy ein secretKey—weniger Fläche als viele SSH-Hosteinträge.
  • Scans: ohne Secret kein TCP zu OpenClaw; Ablehnungen in frps-Metriken statt in App-Logs.
  • Loopback beidseitig deckt Audit-Forderung „localhost only“; Ausnahmen dokumentieren.

Fehlersuche (kurz)

Visitor tot: 7000/tcp vom Subnetz; Logs trennen Token- vs. Secret-Fehler, jeweils nur eine Variable ändern. Gateway ok, Doctor hängt: Modell-Thread—OpenClaw neu starten. Latenz hoch: Relais über frps; Builder näher zur Bastion, siehe RTT-Matrix. Rotation: Visitor- und Proxy-secretKey gemeinsam; curl 127.0.0.1:28080/healthz. Beide Sonden rot: Tunnel oder frps, nicht OpenClaw—Supervision prüfen.

Hinweis: frp-Optionen und OpenClaw-CLI-Flags ändern sich zwischen Major-Versionen; vor Deploy eure konkrete Binary-Dokumentation gegenprüfen. Das Muster ergänzt SSH- und Tailscale-Leitfäden, ersetzt sie nicht.

Fazit: Loopback je Region, STCP mit Auth, kein öffentlicher Mac-Listener, Rotation im Kalender, ein Alarm pro Region. Kapazität folgt dem gemessenen PoP—niedrige RTT zwischen frps und frpc stabilisiert Sonden.

Öffentliche nächste Schritte

Builder an Bastion und Mess-PoP koppeln

Titelseite (inkl. Knotenübersicht #node-list), Preise, Hilfe-Center, Kaufen und den Technologie-Blog nutzen—alles ohne Login-Zwang. Region wählen, die zu eurer Bastion und euren Sonden passt.

Regionale Kaufseiten: Japan (Tokio) · Korea (Seoul) · Hongkong · Singapur · USA Westen

Jetzt Remote Mac mieten Tarife ansehen Hilfe-Center Weitere Blog-Artikel