Runbook do serviço Gateway¶
Última atualização: 2025-12-09
O que é¶
- O processo sempre ativo que possui a conexão única Baileys/Telegram e o plano de controle/eventos.
- Substitui o comando legado
gateway. Ponto de entrada da CLI:openclaw gateway. - Executa até ser interrompido; sai com código diferente de zero em erros fatais para que o supervisor o reinicie.
Como executar (local)¶
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
- O hot reload de configuração observa
~/.openclaw/openclaw.json(ouOPENCLAW_CONFIG_PATH). - Modo padrão:
gateway.reload.mode="hybrid"(aplica mudanças seguras a quente, reinicia em críticas). - O hot reload usa reinício em processo via SIGUSR1 quando necessário.
- Desative com
gateway.reload.mode="off". - Vincula o plano de controle WebSocket a
127.0.0.1:<port>(padrão 18789). - A mesma porta também serve HTTP (UI de controle, hooks, A2UI). Multiplexação em porta única.
- OpenAI Chat Completions (HTTP):
/v1/chat/completions. - OpenResponses (HTTP):
/v1/responses. - Tools Invoke (HTTP):
/tools/invoke. - Inicia um servidor de arquivos Canvas por padrão em
canvasHost.port(padrão18793), servindohttp://<gateway-host>:18793/__openclaw__/canvas/a partir de~/.openclaw/workspace/canvas. Desative comcanvasHost.enabled=falseouOPENCLAW_SKIP_CANVAS_HOST=1. - Registra logs no stdout; use launchd/systemd para mantê-lo ativo e rotacionar logs.
- Passe
--verbosepara espelhar logs de depuração (handshakes, req/res, eventos) do arquivo de log para o stdio durante a solução de problemas. --forceusalsofpara encontrar listeners na porta escolhida, envia SIGTERM, registra o que foi encerrado e então inicia o gateway (falha rapidamente selsofestiver ausente).- Se você executar sob um supervisor (launchd/systemd/modo de processo filho do app mac), um stop/restart normalmente envia SIGTERM; builds mais antigas podem expor isso como
pnpmELIFECYCLEcódigo de saída 143 (SIGTERM), que é um desligamento normal, não uma falha. - SIGUSR1 aciona um reinício em processo quando autorizado (ferramenta/config do gateway aplicar/atualizar, ou habilite
commands.restartpara reinícios manuais). - A autenticação do Gateway é exigida por padrão: defina
gateway.auth.token(ouOPENCLAW_GATEWAY_TOKEN) ougateway.auth.password. Clientes devem enviarconnect.params.auth.token/passworda menos que usem identidade Tailscale Serve. - O assistente agora gera um token por padrão, mesmo em loopback.
- Precedência de portas:
--port>OPENCLAW_GATEWAY_PORT>gateway.port> padrão18789.
Acesso remoto¶
- Tailscale/VPN é preferido; caso contrário, túnel SSH:
bash
ssh -N -L 18789:127.0.0.1:18789 user@host
-
Os clientes então se conectam a
ws://127.0.0.1:18789através do túnel. -
Se um token estiver configurado, os clientes devem incluí-lo em
connect.params.auth.tokenmesmo através do túnel.
Múltiplos gateways (mesmo host)¶
Geralmente desnecessário: um Gateway pode atender a vários canais de mensagens e agentes. Use múltiplos Gateways apenas para redundância ou isolamento rigoroso (ex: bot de resgate).
Compatível se você isolar estado + configuração e usar portas exclusivas. Guia completo: Múltiplos gateways.
Os nomes de serviço são sensíveis ao perfil:
- macOS:
bot.molt.<profile>(o legadocom.openclaw.*ainda pode existir) - Linux:
openclaw-gateway-<profile>.service - Windows:
OpenClaw Gateway (<profile>)
Os metadados de instalação são incorporados à configuração do serviço:
OPENCLAW_SERVICE_MARKER=openclawOPENCLAW_SERVICE_KIND=gatewayOPENCLAW_SERVICE_VERSION=<version>
Padrão Rescue-Bot: mantenha um segundo Gateway isolado com seu próprio perfil, diretório de estado, workspace e espaçamento de porta base. Guia completo: Guia de rescue-bot.
Perfil Dev (--dev)¶
Caminho rápido: execute uma instância dev totalmente isolada (config/estado/workspace) sem tocar na sua configuração principal.
openclaw --dev setup
openclaw --dev gateway --allow-unconfigured
# then target the dev instance:
openclaw --dev status
openclaw --dev health
Padrões (podem ser sobrescritos via env/flags/config):
OPENCLAW_STATE_DIR=~/.openclaw-devOPENCLAW_CONFIG_PATH=~/.openclaw-dev/openclaw.jsonOPENCLAW_GATEWAY_PORT=19001(Gateway WS + HTTP)- porta do serviço de controle do navegador =
19003(derivada:gateway.port+2, apenas loopback) canvasHost.port=19005(derivada:gateway.port+4)agents.defaults.workspacepassa a ser~/.openclaw/workspace-devpor padrão quando você executasetup/onboardsob--dev.
Portas derivadas (regras práticas):
- Porta base =
gateway.port(ouOPENCLAW_GATEWAY_PORT/--port) - porta do serviço de controle do navegador = base + 2 (apenas loopback)
canvasHost.port = base + 4(ouOPENCLAW_CANVAS_HOST_PORT/ sobrescrita por config)- As portas CDP do perfil do navegador são alocadas automaticamente a partir de
browser.controlPort + 9 .. + 108(persistidas por perfil).
Checklist por instância:
gateway.portexclusivoOPENCLAW_CONFIG_PATHexclusivoOPENCLAW_STATE_DIRexclusivoagents.defaults.workspaceexclusivo- números de WhatsApp separados (se usar WA)
Instalação de serviço por perfil:
openclaw --profile main gateway install
openclaw --profile rescue gateway install
Exemplo:
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
Protocolo (visão do operador)¶
- Documentação completa: Protocolo do Gateway e Protocolo Bridge (legado).
- Primeiro frame obrigatório do cliente:
req {type:"req", id, method:"connect", params:{minProtocol,maxProtocol,client:{id,displayName?,version,platform,deviceFamily?,modelIdentifier?,mode,instanceId?}, caps, auth?, locale?, userAgent? } }. - O Gateway responde
res {type:"res", id, ok:true, payload:hello-ok }(ouok:falsecom um erro e então fecha). - Após o handshake:
- Requisições:
{type:"req", id, method, params}→{type:"res", id, ok, payload|error} - Eventos:
{type:"event", event, payload, seq?, stateVersion?} - Entradas de presença estruturadas:
{host, ip, version, platform?, deviceFamily?, modelIdentifier?, mode, lastInputSeconds?, ts, reason?, tags?[], instanceId? }(para clientes WS,instanceIdvem deconnect.client.instanceId). - As respostas
agentsão em duas etapas: primeiroresack{runId,status:"accepted"}, depois umres{runId,status:"ok"|"error",summary}final após o término da execução; a saída em streaming chega comoevent:"agent".
Métodos (conjunto inicial)¶
health— snapshot completo de saúde (mesma forma queopenclaw health --json).status— resumo curto.system-presence— lista de presença atual.system-event— publicar uma nota de presença/sistema (estruturada).send— enviar uma mensagem pelos canais ativos.agent— executar um turno de agente (transmite eventos de volta na mesma conexão).node.list— listar nós pareados + atualmente conectados (incluicaps,deviceFamily,modelIdentifier,paired,connectedecommandsanunciados).node.describe— descrever um nó (capacidades + comandosnode.invokesuportados; funciona para nós pareados e para nós não pareados atualmente conectados).node.invoke— invocar um comando em um nó (ex.:canvas.*,camera.*).node.pair.*— ciclo de vida de pareamento (request,list,approve,reject,verify).
Veja também: Presence para entender como a presença é produzida/deduplicada e por que um client.instanceId estável importa.
Eventos¶
agent— eventos de ferramenta/saída transmitidos da execução do agente (com tag de sequência).presence— atualizações de presença (deltas com stateVersion) enviadas a todos os clientes conectados.tick— keepalive/no-op periódico para confirmar vivacidade.shutdown— o Gateway está saindo; o payload incluireasonerestartExpectedMsopcional. Os clientes devem reconectar.
Integração WebChat¶
- O WebChat é uma UI SwiftUI nativa que fala diretamente com o WebSocket do Gateway para histórico, envios, abortar e eventos.
- O uso remoto passa pelo mesmo túnel SSH/Tailscale; se um token do gateway estiver configurado, o cliente o inclui durante
connect. - O app macOS conecta via um único WS (conexão compartilhada); ele hidrata a presença a partir do snapshot inicial e escuta eventos
presencepara atualizar a UI.
Tipagem e validação¶
- O servidor valida cada frame de entrada com AJV contra o JSON Schema emitido a partir das definições do protocolo.
- Clientes (TS/Swift) consomem tipos gerados (TS diretamente; Swift via o gerador do repositório).
- As definições do protocolo são a fonte da verdade; regenere schema/modelos com:
pnpm protocol:genpnpm protocol:gen:swift
Snapshot de conexão¶
hello-okinclui umsnapshotcompresence,health,stateVersioneuptimeMsalém depolicy {maxPayload,maxBufferedBytes,tickIntervalMs}para que os clientes renderizem imediatamente sem requisições extras.health/system-presencepermanecem disponíveis para atualização manual, mas não são obrigatórios no momento da conexão.
Códigos de erro (formato res.error)¶
- Os erros usam
{ code, message, details?, retryable?, retryAfterMs? }. - Códigos padrão:
NOT_LINKED— WhatsApp não autenticado.AGENT_TIMEOUT— o agente não respondeu dentro do prazo configurado.INVALID_REQUEST— falha de validação de schema/parâmetros.UNAVAILABLE— o Gateway está desligando ou uma dependência está indisponível.
Comportamento de keepalive¶
- Eventos
tick(ou WS ping/pong) são emitidos periodicamente para que os clientes saibam que o Gateway está ativo mesmo quando não há tráfego. - Confirmações de envio/agente permanecem respostas separadas; não sobrecarregue ticks para envios.
Replay / lacunas¶
- Os eventos não são reproduzidos. Os clientes detectam lacunas de sequência e devem atualizar (
health+system-presence) antes de continuar. O WebChat e os clientes macOS agora fazem autoatualização ao detectar lacunas.
Supervisão (exemplo macOS)¶
- Use launchd para manter o serviço ativo:
- Program: caminho para
openclaw - Arguments:
gateway - KeepAlive: true
- StandardOut/Err: caminhos de arquivo ou
syslog - Em falha, o launchd reinicia; uma configuração fatal incorreta deve continuar saindo para que o operador perceba.
- LaunchAgents são por usuário e exigem uma sessão logada; para setups headless use um LaunchDaemon personalizado (não fornecido).
openclaw gateway installgrava~/Library/LaunchAgents/bot.molt.gateway.plist(oubot.molt.<profile>.plist; o legadocom.openclaw.*é limpo).openclaw doctoraudita a configuração do LaunchAgent e pode atualizá-la para os padrões atuais.
Gerenciamento do serviço Gateway (CLI)¶
Use a CLI do Gateway para instalar/iniciar/parar/reiniciar/status:
openclaw gateway status
openclaw gateway install
openclaw gateway stop
openclaw gateway restart
openclaw logs --follow
Notas:
gateway statussonda o RPC do Gateway por padrão usando a porta/config resolvida do serviço (sobrescreva com--url).gateway status --deepadiciona varreduras em nível de sistema (LaunchDaemons/unidades system).gateway status --no-probeignora a sonda RPC (útil quando a rede está fora).gateway status --jsoné estável para scripts.gateway statusreporta tempo de execução do supervisor (launchd/systemd em execução) separadamente de alcançabilidade RPC (conexão WS + status RPC).gateway statusimprime o caminho da config + alvo da sonda para evitar confusão de “localhost vs bind LAN” e incompatibilidades de perfil.gateway statusinclui a última linha de erro do gateway quando o serviço parece em execução mas a porta está fechada.logsfaz tail do log de arquivo do Gateway via RPC (sem necessidade detail/grepmanuais).- Se outros serviços semelhantes a gateway forem detectados, a CLI avisa a menos que sejam serviços de perfil OpenClaw. Ainda recomendamos um gateway por máquina para a maioria dos setups; use perfis/portas isolados para redundância ou um bot de resgate. Veja Múltiplos gateways.
- Limpeza:
openclaw gateway uninstall(serviço atual) eopenclaw doctor(migrações legadas). gateway installé um no-op quando já instalado; useopenclaw gateway install --forcepara reinstalar (mudanças de perfil/env/caminho).
App mac empacotado:
- OpenClaw.app pode empacotar um relay de gateway baseado em Node e instalar um LaunchAgent por usuário rotulado
bot.molt.gateway(oubot.molt.<profile>; rótulos legadoscom.openclaw.*ainda descarregam corretamente). - Para parar de forma limpa, use
openclaw gateway stop(oulaunchctl bootout gui/$UID/bot.molt.gateway). - Para reiniciar, use
openclaw gateway restart(oulaunchctl kickstart -k gui/$UID/bot.molt.gateway). launchctlsó funciona se o LaunchAgent estiver instalado; caso contrário, useopenclaw gateway installprimeiro.- Substitua o rótulo por
bot.molt.<profile>ao executar um perfil nomeado.
Supervisão (unit de usuário systemd)¶
O OpenClaw instala um serviço de usuário systemd por padrão no Linux/WSL2. Nós recomendamos serviços de usuário para máquinas de usuário único (ambiente mais simples, config por usuário). Use um serviço de sistema para servidores multiusuário ou sempre ativos (sem necessidade de lingering, supervisão compartilhada).
openclaw gateway install grava a unit de usuário. openclaw doctor audita a
unit e pode atualizá-la para corresponder aos padrões recomendados atuais.
Crie ~/.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
Habilite lingering (necessário para que o serviço de usuário sobreviva a logout/idle):
sudo loginctl enable-linger youruser
A integração inicial executa isso no Linux/WSL2 (pode solicitar sudo; grava /var/lib/systemd/linger).
Depois habilite o serviço:
systemctl --user enable --now openclaw-gateway[-<profile>].service
Alternativa (serviço de sistema) – para servidores sempre ativos ou multiusuário, você pode
instalar uma unit system do systemd em vez de uma unit de usuário (sem lingering).
Crie /etc/systemd/system/openclaw-gateway[-<profile>].service (copie a unit acima,
troque WantedBy=multi-user.target, defina User= + WorkingDirectory=), então:
sudo systemctl daemon-reload
sudo systemctl enable --now openclaw-gateway[-<profile>].service
Windows (WSL2)¶
Instalações no Windows devem usar WSL2 e seguir a seção de systemd do Linux acima.
Verificações operacionais¶
- Vivacidade: abra WS e envie
req:connect→ espererescompayload.type="hello-ok"(com snapshot). - Prontidão: chame
health→ espereok: truee um canal vinculado emlinkChannel(quando aplicável). - Depuração: assine os eventos
tickepresence; garanta questatusmostre idade de vínculo/autenticação; entradas de presença mostram o host do Gateway e clientes conectados.
Garantias de segurança¶
- Assuma um Gateway por host por padrão; se executar múltiplos perfis, isole portas/estado e aponte para a instância correta.
- Não há fallback para conexões Baileys diretas; se o Gateway estiver fora, os envios falham rapidamente.
- Frames iniciais não-connect ou JSON malformado são rejeitados e o socket é fechado.
- Desligamento gracioso: emite evento
shutdownantes de fechar; os clientes devem lidar com fechamento + reconexão.
Ajudantes de CLI¶
openclaw gateway health|status— solicita saúde/status via WS do Gateway.openclaw message send --target <num> --message "hi" [--media ...]— envia via Gateway (idempotente para WhatsApp).openclaw agent --message "hi" --to <num>— executa um turno de agente (aguarda o final por padrão).openclaw gateway call <method> --params '{"k":"v"}'— invocador de método bruto para depuração.openclaw gateway stop|restart— parar/reiniciar o serviço de gateway supervisionado (launchd/systemd).- Subcomandos auxiliares do Gateway assumem um gateway em execução em
--url; eles não iniciam mais um automaticamente.
Orientações de migração¶
- Descontinue usos de
openclaw gatewaye da porta de controle TCP legada. - Atualize os clientes para falar o protocolo WS com connect obrigatório e presença estruturada.