Runbook usługi Gateway¶
Ostatnia aktualizacja: 2025-12-09
Czym to jest¶
- Zawsze uruchomiony proces, który posiada pojedyncze połączenie Baileys/Telegram oraz płaszczyznę sterowania/zdarzeń.
- Zastępuje starsze polecenie
gateway. Punkt wejścia CLI:openclaw gateway. - Uruchomienie do zatrzymania; wyjdzie poza zero przy błędach śmiertelnych, więc przełożony ponownie je uruchomi.
Jak uruchomić (lokalnie)¶
openclaw gateway --port 18789
# for full debug/trace logs in stdio:
openclaw gateway --port 18789 --verbose
# if the port is busy, terminate listeners then start:
openclaw gateway --force
# dev loop (auto-reload on TS changes):
pnpm gateway:watch
- Hot reload konfiguracji obserwuje
~/.openclaw/openclaw.json(lubOPENCLAW_CONFIG_PATH). - Tryb domyślny:
gateway.reload.mode="hybrid"(bezpieczne zmiany stosowane „na gorąco”, restart przy krytycznych). - Hot reload używa restartu w procesie przez SIGUSR1, gdy jest to potrzebne.
- Wyłącz za pomocą
gateway.reload.mode="off". - Wiąże płaszczyznę sterowania WebSocket z
127.0.0.1:<port>(domyślnie 18789). - Ten sam port obsługuje także HTTP (UI sterowania, hooki, A2UI). Multipleks jednego portu.
- OpenAI Chat Completions (HTTP):
/v1/chat/completions. - OpenResponses (HTTP):
/v1/responses. - Tools Invoke (HTTP):
/tools/invoke. - Domyślnie uruchamia serwer plików Canvas na
canvasHost.port(domyślnie18793), serwująchttp://<gateway-host>:18793/__openclaw__/canvas/z~/.openclaw/workspace/canvas. Wyłącz za pomocącanvasHost.enabled=falselubOPENCLAW_SKIP_CANVAS_HOST=1. - Loguje do stdout; użyj launchd/systemd, aby utrzymać działanie i rotować logi.
- Przekaż
--verbose, aby dublować logowanie debug (handshake’i, req/res, zdarzenia) z pliku logu do stdio podczas rozwiązywania problemów. --forceużywalsofdo znalezienia nasłuchów na wybranym porcie, wysyła SIGTERM, loguje, co zostało ubite, a następnie uruchamia gateway (szybko kończy się niepowodzeniem, jeśli brakujelsof).- Jeśli działa pod nadzorcą (launchd/systemd/tryb procesu potomnego aplikacji macOS), zatrzymanie/restart zwykle wysyła SIGTERM; starsze buildy mogą raportować to jako
pnpmELIFECYCLEz kodem wyjścia 143 (SIGTERM), co jest normalnym zamknięciem, a nie awarią. - SIGUSR1 wyzwala restart w procesie, gdy jest autoryzowany (narzędzie Gateway/zastosowanie konfiguracji/aktualizacja lub włącz
commands.restartdla ręcznych restartów). - Uwierzytelnianie Gateway jest domyślnie wymagane: ustaw
gateway.auth.token(lubOPENCLAW_GATEWAY_TOKEN) albogateway.auth.password. Klienci muszą wysyłaćconnect.params.auth.token/password, chyba że używają tożsamości Tailscale Serve. - Kreator domyślnie generuje token, nawet na pętli zwrotnej.
- Priorytet portów:
--port>OPENCLAW_GATEWAY_PORT>gateway.port> domyślny18789.
Zdalny dostęp¶
- Preferowane Tailscale/VPN; w przeciwnym razie tunel SSH:
bash
ssh -N -L 18789:127.0.0.1:18789 user@host
-
Następnie klienci łączą się z
ws://127.0.0.1:18789przez tunel. -
Jeśli skonfigurowano token, klienci muszą dołączyć go w
connect.params.auth.token, nawet przez tunel.
Wiele gatewayów (ten sam host)¶
Zwykle niepotrzebne: jeden Gateway może obsługiwać wiele kanałów komunikacyjnych i agentów. Używaj wielu Gatewayów tylko dla redundancji lub ścisłej izolacji (np. bot ratunkowy).
Obsługiwane, jeśli odizolujesz stan + konfigurację i użyjesz unikatowych portów. Pełny przewodnik: Multiple gateways.
Nazwy usług są świadome profilu:
- macOS:
bot.molt.<profile>(starszycom.openclaw.*może nadal istnieć) - Linux:
openclaw-gateway-<profile>.service - Windows:
OpenClaw Gateway (<profile>)
Metadane instalacji są osadzone w konfiguracji usługi:
OPENCLAW_SERVICE_MARKER=openclawOPENCLAW_SERVICE_KIND=gatewayOPENCLAW_SERVICE_VERSION=<version>
Wzorzec Rescue-Bot: utrzymuj drugi Gateway w izolacji z własnym profilem, katalogiem stanu, obszarem roboczym i rozstawem bazowych portów. Pełny przewodnik: Rescue-bot guide.
Profil deweloperski (--dev)¶
Szybka ścieżka: uruchom w pełni odizolowaną instancję deweloperską (konfiguracja/stan/obszar roboczy) bez naruszania głównej konfiguracji.
openclaw --dev setup
openclaw --dev gateway --allow-unconfigured
# then target the dev instance:
openclaw --dev status
openclaw --dev health
Domyślne wartości (można nadpisać przez env/flagi/konfigurację):
OPENCLAW_STATE_DIR=~/.openclaw-devOPENCLAW_CONFIG_PATH=~/.openclaw-dev/openclaw.jsonOPENCLAW_GATEWAY_PORT=19001(Gateway WS + HTTP)- port usługi sterowania przeglądarką =
19003(pochodny:gateway.port+2, tylko pętla zwrotna) canvasHost.port=19005(pochodny:gateway.port+4)agents.defaults.workspacedomyślnie staje się~/.openclaw/workspace-dev, gdy uruchamiaszsetup/onboardpod--dev.
Porty pochodne (reguły kciuka):
- Port bazowy =
gateway.port(lubOPENCLAW_GATEWAY_PORT/--port) - port usługi sterowania przeglądarką = baza + 2 (tylko pętla zwrotna)
canvasHost.port = base + 4(lubOPENCLAW_CANVAS_HOST_PORT/ nadpisanie w konfiguracji)- Porty CDP profilu przeglądarki są przydzielane automatycznie od
browser.controlPort + 9 .. + 108(utrwalane per profil).
Lista kontrolna per instancję:
- unikatowy
gateway.port - unikatowy
OPENCLAW_CONFIG_PATH - unikatowy
OPENCLAW_STATE_DIR - unikatowy
agents.defaults.workspace - osobne numery WhatsApp (jeśli używasz WA)
Instalacja usługi per profil:
openclaw --profile main gateway install
openclaw --profile rescue gateway install
Przykład:
OPENCLAW_CONFIG_PATH=~/.openclaw/a.json OPENCLAW_STATE_DIR=~/.openclaw-a openclaw gateway --port 19001
OPENCLAW_CONFIG_PATH=~/.openclaw/b.json OPENCLAW_STATE_DIR=~/.openclaw-b openclaw gateway --port 19002
Protokół (widok operatora)¶
- Pełna dokumentacja: Gateway protocol oraz Bridge protocol (legacy).
- Obowiązkowa pierwsza ramka od klienta:
req {type:"req", id, method:"connect", params:{minProtocol,maxProtocol,client:{id,displayName?,version,platform,deviceFamily?,modelIdentifier?,mode,instanceId?}, caps, auth?, locale?, userAgent? } }. - Gateway odpowiada
res {type:"res", id, ok:true, payload:hello-ok }(lubok:falsez błędem, a następnie zamyka). - Po handshake’u:
- Żądania:
{type:"req", id, method, params}→{type:"res", id, ok, payload|error} - Zdarzenia:
{type:"event", event, payload, seq?, stateVersion?} - Strukturalne wpisy obecności:
{host, ip, version, platform?, deviceFamily?, modelIdentifier?, mode, lastInputSeconds?, ts, reason?, tags?[], instanceId? }(dla klientów WS,instanceIdpochodzi zconnect.client.instanceId). - Odpowiedzi
agentsą dwuetapowe: najpierw potwierdzenieres{runId,status:"accepted"}, a następnie końcoweres{runId,status:"ok"|"error",summary}po zakończeniu wykonania; strumieniowane wyjście dociera jakoevent:"agent".
Metody (zestaw początkowy)¶
health— pełna migawka zdrowia (ten sam kształt coopenclaw health --json).status— krótkie podsumowanie.system-presence— bieżąca lista obecności.system-event— opublikuj notatkę obecności/systemową (strukturalną).send— wyślij wiadomość przez aktywne kanały.agent— uruchom turę agenta (strumieniuje zdarzenia z powrotem na tym samym połączeniu).node.list— lista sparowanych + aktualnie podłączonych węzłów (zawieracaps,deviceFamily,modelIdentifier,paired,connectedoraz reklamowanecommands).node.describe— opis węzła (możliwości + obsługiwane polecenianode.invoke; działa dla węzłów sparowanych oraz aktualnie podłączonych niesparowanych).node.invoke— wywołaj polecenie na węźle (np.canvas.*,camera.*).node.pair.*— cykl życia parowania (request,list,approve,reject,verify).
Zobacz także: Presence, aby dowiedzieć się, jak obecność jest wytwarzana/deduplikowana i dlaczego stabilny client.instanceId ma znaczenie.
Zdarzenia¶
agent— strumieniowane zdarzenia narzędzia/wyjścia z uruchomienia agenta (oznaczone sekwencją).presence— aktualizacje obecności (delty z stateVersion) wysyłane do wszystkich podłączonych klientów.tick— okresowy keepalive/no-op potwierdzający żywotność.shutdown— Gateway kończy działanie; ładunek zawierareasonoraz opcjonalnerestartExpectedMs. Klienci powinni ponownie się połączyć.
Integracja WebChat¶
- WebChat to natywny interfejs SwiftUI, który komunikuje się bezpośrednio z Gateway WebSocket w zakresie historii, wysyłania, przerywania i zdarzeń.
- Zdalne użycie przechodzi przez ten sam tunel SSH/Tailscale; jeśli skonfigurowano token gateway, klient dołącza go podczas
connect. - Aplikacja macOS łączy się przez pojedynczy WS (połączenie współdzielone); hydratuje obecność z początkowej migawki i nasłuchuje zdarzeń
presence, aby aktualizować UI.
Typowanie i walidacja¶
- Serwer waliduje każdą przychodzącą ramkę za pomocą AJV względem JSON Schema emitowanego z definicji protokołu.
- Klienci (TS/Swift) konsumują generowane typy (TS bezpośrednio; Swift przez generator repozytorium).
- Definicje protokołu są jedynym źródłem prawdy; regeneruj schematy/modele za pomocą:
pnpm protocol:genpnpm protocol:gen:swift
Migawka połączenia¶
hello-okzawierasnapshotzpresence,health,stateVersionorazuptimeMspluspolicy {maxPayload,maxBufferedBytes,tickIntervalMs}, aby klienci mogli renderować natychmiast bez dodatkowych żądań.health/system-presencepozostają dostępne do ręcznego odświeżenia, ale nie są wymagane w momencie połączenia.
Kody błędów (kształt res.error)¶
- Błędy używają
{ code, message, details?, retryable?, retryAfterMs? }. - Standardowe kody:
NOT_LINKED— WhatsApp nie jest uwierzytelniony.AGENT_TIMEOUT— agent nie odpowiedział w skonfigurowanym czasie.INVALID_REQUEST— nieudana walidacja schematu/parametrów.UNAVAILABLE— Gateway jest w trakcie zamykania lub zależność jest niedostępna.
Zachowanie keepalive¶
- Zdarzenia
tick(lub ping/pong WS) są emitowane okresowo, aby klienci wiedzieli, że Gateway żyje nawet przy braku ruchu. - Potwierdzenia wysyłek/agentów pozostają oddzielnymi odpowiedziami; nie przeciążaj ticków dla wysyłek.
Odtwarzanie / luki¶
- Zdarzenia nie są odtwarzane. Klienci wykrywają luki sekwencji i powinni odświeżyć (
health+system-presence) przed kontynuacją. WebChat i klienci macOS automatycznie odświeżają przy wykryciu luki.
Nadzór (przykład macOS)¶
- Użyj launchd, aby utrzymać usługę przy życiu:
- Program: ścieżka do
openclaw - Argumenty:
gateway - KeepAlive: true
- StandardOut/Err: ścieżki plików lub
syslog - Przy awarii launchd restartuje; fatalna błędna konfiguracja powinna powodować dalsze kończenie się procesu, aby operator to zauważył.
- LaunchAgents są per-użytkownik i wymagają zalogowanej sesji; dla konfiguracji headless użyj niestandardowego LaunchDaemon (nie jest dostarczany).
openclaw gateway installzapisuje~/Library/LaunchAgents/bot.molt.gateway.plist(lubbot.molt.<profile>.plist; starszycom.openclaw.*jest czyszczony).openclaw doctoraudytuje konfigurację LaunchAgent i może ją zaktualizować do bieżących domyślnych wartości.
Zarządzanie usługą Gateway (CLI)¶
Użyj CLI Gateway do instalacji/uruchamiania/zatrzymywania/restartu/statusu:
openclaw gateway status
openclaw gateway install
openclaw gateway stop
openclaw gateway restart
openclaw logs --follow
Uwagi:
gateway statusdomyślnie sonduje RPC Gateway, używając rozwiązanego portu/konfiguracji usługi (nadpisz za pomocą--url).gateway status --deepdodaje skany na poziomie systemu (LaunchDaemons/jednostki systemowe).gateway status --no-probepomija sondę RPC (przydatne, gdy sieć nie działa).gateway status --jsonjest stabilne do skryptów.gateway statusraportuje czas działania nadzorcy (działanie launchd/systemd) oddzielnie od osiągalności RPC (połączenie WS + RPC status).gateway statuswypisuje ścieżkę konfiguracji + cel sondy, aby uniknąć zamieszania „localhost vs bind LAN” i niedopasowań profilu.gateway statusdołącza ostatnią linię błędu gateway, gdy usługa wygląda na uruchomioną, ale port jest zamknięty.logsśledzi plik logu Gateway przez RPC (bez ręcznegotail/grep).- Jeśli wykryte zostaną inne usługi podobne do gateway, CLI ostrzega, chyba że są to usługi profilu OpenClaw. Nadal zalecamy jeden gateway na maszynę dla większości konfiguracji; użyj odizolowanych profili/portów dla redundancji lub bota ratunkowego. Zobacz Multiple gateways.
- Sprzątanie:
openclaw gateway uninstall(bieżąca usługa) orazopenclaw doctor(migracje starszych wersji). gateway installjest no-op, gdy już zainstalowane; użyjopenclaw gateway install --force, aby przeinstalować (zmiany profilu/env/ścieżki).
Dołączona aplikacja macOS:
- OpenClaw.app może dołączać oparty na Node relay gateway i instalować per-użytkownik LaunchAgent oznaczony
bot.molt.gateway(lubbot.molt.<profile>; starsze etykietycom.openclaw.*nadal odinstalowują się poprawnie). - Aby zatrzymać czysto, użyj
openclaw gateway stop(lublaunchctl bootout gui/$UID/bot.molt.gateway). - Aby zrestartować, użyj
openclaw gateway restart(lublaunchctl kickstart -k gui/$UID/bot.molt.gateway). launchctldziała tylko wtedy, gdy LaunchAgent jest zainstalowany; w przeciwnym razie najpierw użyjopenclaw gateway install.- Zastąp etykietę
bot.molt.<profile>, gdy uruchamiasz nazwany profil.
Nadzór (jednostka użytkownika systemd)¶
OpenClaw domyślnie instaluje usługę użytkownika systemd na Linux/WSL2. Zalecamy usługi użytkownika dla maszyn jednoosobowych (prostsze środowisko, konfiguracja per użytkownik). Użyj usługi systemowej dla serwerów wieloużytkownikowych lub zawsze włączonych (bez wymaganego lingering, wspólny nadzór).
openclaw gateway install zapisuje jednostkę użytkownika. openclaw doctor audytuje
jednostkę i może ją zaktualizować, aby odpowiadała aktualnie zalecanym domyślnym ustawieniom.
Utwórz ~/.config/systemd/user/openclaw-gateway[-<profile>].service:
[Unit]
Description=OpenClaw Gateway (profile: <profile>, v<version>)
After=network-online.target
Wants=network-online.target
[Service]
ExecStart=/usr/local/bin/openclaw gateway --port 18789
Restart=always
RestartSec=5
Environment=OPENCLAW_GATEWAY_TOKEN=
WorkingDirectory=/home/youruser
[Install]
WantedBy=default.target
Włącz lingering (wymagane, aby usługa użytkownika przetrwała wylogowanie/bezczynność):
sudo loginctl enable-linger youruser
Onboarding uruchamia to na Linux/WSL2 (może poprosić o sudo; zapisuje /var/lib/systemd/linger).
Następnie włącz usługę:
systemctl --user enable --now openclaw-gateway[-<profile>].service
Alternatywa (usługa systemowa) — dla serwerów zawsze włączonych lub wieloużytkownikowych możesz
zainstalować jednostkę systemową systemd zamiast jednostki użytkownika (brak potrzeby lingering).
Utwórz /etc/systemd/system/openclaw-gateway[-<profile>].service (skopiuj jednostkę powyżej,
przełącz WantedBy=multi-user.target, ustaw User= + WorkingDirectory=), a następnie:
sudo systemctl daemon-reload
sudo systemctl enable --now openclaw-gateway[-<profile>].service
Windows (WSL2)¶
Instalacje na Windows powinny używać WSL2 i postępować zgodnie z powyższą sekcją Linux systemd.
Kontrole operacyjne¶
- Żywotność: otwórz WS i wyślij
req:connect→ oczekujreszpayload.type="hello-ok"(z migawką). - Gotowość: wywołaj
health→ oczekujok: trueoraz połączonego kanału wlinkChannel(jeśli dotyczy). - Debug: subskrybuj zdarzenia
tickipresence; upewnij się, żestatuspokazuje wiek połączenia/uwierzytelnienia; wpisy obecności pokazują host Gateway i podłączonych klientów.
Gwarancje bezpieczeństwa¶
- Domyślnie zakładaj jeden Gateway na host; jeśli uruchamiasz wiele profili, izoluj porty/stan i celuj w właściwą instancję.
- Brak fallbacku do bezpośrednich połączeń Baileys; jeśli Gateway jest niedostępny, wysyłki kończą się natychmiast niepowodzeniem.
- Ramki inne niż pierwsza ramka połączenia lub niepoprawny JSON są odrzucane, a gniazdo jest zamykane.
- Łagodne zamknięcie: emituj zdarzenie
shutdownprzed zamknięciem; klienci muszą obsłużyć zamknięcie + ponowne połączenie.
Pomocnicy CLI¶
openclaw gateway health|status— żądanie health/status przez WS Gateway.openclaw message send --target <num> --message "hi" [--media ...]— wysyłka przez Gateway (idempotentna dla WhatsApp).openclaw agent --message "hi" --to <num>— uruchom turę agenta (domyślnie czeka na wynik końcowy).openclaw gateway call <method> --params '{"k":"v"}'— surowy wywoływacz metod do debugowania.openclaw gateway stop|restart— zatrzymaj/zrestartuj nadzorowaną usługę gateway (launchd/systemd).- Podkomendy pomocnicze Gateway zakładają działający gateway na
--url; nie uruchamiają już automatycznie nowego.
Wskazówki migracyjne¶
- Wycofaj użycia
openclaw gatewayoraz starszego portu sterowania TCP. - Zaktualizuj klientów, aby mówili protokołem WS z obowiązkowym connect i strukturalną obecnością.