- Operadores (você ou o aplicativo para macOS): o WebSocket direto pela LAN/Tailnet é a opção mais simples quando o Gateway está acessível; o túnel SSH é a alternativa universal.
- Nodes (iOS/Android e outros dispositivos): conectam-se ao WebSocket do Gateway (LAN/tailnet ou túnel SSH).
A ideia central
Por padrão, o WebSocket do Gateway é vinculado ao local loopback, na porta18789 (gateway.port). Para uso remoto, exponha-o por meio do Tailscale Serve/de uma vinculação LAN-Tailnet confiável ou encaminhe a porta de local loopback por SSH.
Opções de topologia
Para as configurações sempre ativa e de notebook, prefira manter
gateway.bind: "loopback" e usar o Tailscale Serve para a interface de controle, ou uma vinculação LAN/Tailnet confiável com gateway.remote.transport: "direct". O túnel SSH é a alternativa que funciona em qualquer máquina.
Fluxo de comandos (o que é executado onde)
Um Gateway controla o estado e os canais; os Nodes são periféricos. Exemplo (mensagem do Telegram encaminhada para uma ferramenta de Node):- A mensagem do Telegram chega ao Gateway.
- O Gateway executa o agente, que decide se deve chamar uma ferramenta de Node.
- O Gateway chama o Node pelo WebSocket do Gateway (RPC
node.invoke). - O Node retorna o resultado; o Gateway responde ao Telegram.
Túnel SSH (CLI + ferramentas)
openclaw health e openclaw status --deep acessam o Gateway remoto por meio de ws://127.0.0.1:18789. openclaw gateway status, openclaw gateway health, openclaw gateway probe e openclaw gateway call também podem apontar para uma URL encaminhada por meio de --url.
Substitua
18789 pelo valor configurado em gateway.port (ou --port/OPENCLAW_GATEWAY_PORT).Padrões remotos da CLI
Persista um destino remoto para que os comandos da CLI o utilizem por padrão:ws://127.0.0.1:18789 e abra primeiro o túnel SSH. No transporte por túnel SSH do aplicativo para macOS, o nome de host do Gateway descoberto é definido em gateway.remote.sshTarget (user@host ou user@host:port); gateway.remote.url permanece como a URL do túnel local. Se a porta remota for diferente da local, defina gateway.remote.remotePort.
Por padrão, a verificação da chave do host é rigorosa (gateway.remote.sshHostKeyPolicy: "strict"). Defina-a como "openssh" para delegar essa verificação à sua configuração efetiva do OpenSSH; revise as configurações SSH do usuário e do sistema antes de habilitar essa opção.
Para um Gateway que já esteja acessível em uma LAN ou Tailnet confiável, use o modo direto:
Precedência de credenciais
A resolução de credenciais do Gateway segue um contrato compartilhado entre os fluxos de chamada/sondagem/status e o monitoramento de aprovação de execução do Discord. O host do Node usa o mesmo contrato, com uma exceção para o modo local (ele ignoragateway.remote.*).
- Credenciais explícitas (
--token,--passwordou ogatewayTokende uma ferramenta) sempre têm precedência nos fluxos de chamada que aceitam autenticação explícita. - Segurança da substituição de URL:
- O
--urlda CLI nunca reutiliza credenciais implícitas da configuração ou do ambiente. OPENCLAW_GATEWAY_URLno ambiente pode usar somente credenciais do ambiente (OPENCLAW_GATEWAY_TOKEN/OPENCLAW_GATEWAY_PASSWORD).
- O
- Padrões do modo local:
- token:
OPENCLAW_GATEWAY_TOKEN->gateway.auth.token->gateway.remote.token(alternativa remota somente quando o token local não está definido) - senha:
OPENCLAW_GATEWAY_PASSWORD->gateway.auth.password->gateway.remote.password(alternativa remota somente quando a senha local não está definida)
- token:
- Padrões do modo remoto:
- token:
gateway.remote.token->OPENCLAW_GATEWAY_TOKEN->gateway.auth.token - senha:
OPENCLAW_GATEWAY_PASSWORD->gateway.remote.password->gateway.auth.password
- token:
- Exceção do modo local do host do Node:
gateway.remote.token/gateway.remote.passwordsão ignorados. - Por padrão, as verificações de token de sondagem/status remotos são rigorosas: elas usam somente
gateway.remote.token(sem recorrer ao token local) quando o destino está no modo remoto. - As substituições do ambiente do Gateway usam somente
OPENCLAW_GATEWAY_*.
Acesso remoto à interface de chat
O WebChat não tem uma porta HTTP separada; a interface de chat SwiftUI se conecta diretamente ao WebSocket do Gateway.- Encaminhe
18789por SSH (consulte acima) e conecte os clientes aws://127.0.0.1:18789. - Para o modo direto por LAN/Tailnet, conecte os clientes à URL privada
ws://ou segurawss://configurada. - No macOS, o modo remoto do aplicativo gerencia automaticamente o transporte selecionado.
Modo remoto do aplicativo para macOS
O aplicativo da barra de menus do macOS gerencia a mesma configuração de ponta a ponta: verificações de status remoto, WebChat e encaminhamento do Voice Wake. Guia operacional: acesso remoto no macOS.Regras de segurança (remoto/VPN)
Mantenha o Gateway restrito ao local loopback, a menos que tenha certeza de que precisa de uma vinculação.- Local loopback + SSH/Tailscale Serve é o padrão mais seguro (sem exposição pública).
ws://sem criptografia é aceito para hosts de local loopback, privados/LAN (RFC 1918), link-local, CGNAT,.locale.ts.net. Hosts remotos públicos devem usarwss://.- Vinculações que não sejam de local loopback (
lan/tailnet/custom, ouautoquando o local loopback não estiver disponível) devem usar autenticação do Gateway: token, senha ou um proxy reverso com reconhecimento de identidade egateway.auth.mode: "trusted-proxy". gateway.remote.token/.passwordsão fontes de credenciais do cliente; por si só, não configuram a autenticação do servidor.- Os fluxos de chamada locais podem usar
gateway.remote.*como alternativa somente quandogateway.auth.*não está definido. - Se
gateway.auth.token/gateway.auth.passwordestiver explicitamente configurado por meio de SecretRef e não puder ser resolvido, a resolução falhará de forma fechada (sem alternativa remota para mascarar a falha). gateway.remote.tlsFingerprintfixa o certificado TLS remoto parawss://, inclusive no modo direto do macOS. Sem uma impressão digital armazenada, o macOS só a fixa no primeiro uso após a validação normal de confiança do sistema; Gateways autoassinados ou com CA privada precisam de uma impressão digital explícita ou do modo Remote over SSH.- O Tailscale Serve pode autenticar o tráfego da interface de controle/do WebSocket por meio de cabeçalhos de identidade quando
gateway.auth.allowTailscale: true. Os endpoints da API HTTP não usam essa autenticação por cabeçalho e seguem o modo normal de autenticação HTTP do Gateway. Esse fluxo sem token pressupõe que o host do Gateway seja confiável; defina-o comofalsepara usar autenticação por segredo compartilhado em todos os lugares. - A autenticação por proxy confiável espera, por padrão, um proxy com reconhecimento de identidade que não seja de local loopback. Proxies reversos de local loopback no mesmo host exigem
gateway.auth.trustedProxy.allowLoopback = trueexplicitamente. - Trate o controle pelo navegador como acesso de operador: somente pela tailnet e com pareamento deliberado de Nodes.
macOS: túnel SSH persistente por meio de LaunchAgent
Para clientes macOS, a configuração persistente mais simples usa uma entrada SSHLocalForward e um LaunchAgent que mantém o túnel ativo após reinicializações e falhas.
Etapa 1: adicionar a configuração SSH
Edite~/.ssh/config:
<REMOTE_IP> e <REMOTE_USER> pelos seus valores.
Etapa 2: copiar a chave SSH (uma vez)
Etapa 3: configurar o token do Gateway
gateway.remote.password se o Gateway remoto utilizar autenticação por senha. OPENCLAW_GATEWAY_TOKEN continua válido como uma substituição no nível do shell, mas a configuração persistente recomendada para o cliente remoto é gateway.remote.token/gateway.remote.password.
Etapa 4: criar o LaunchAgent
Salve como~/Library/LaunchAgents/ai.openclaw.ssh-tunnel.plist:
Etapa 5: carregar o LaunchAgent
Se você tiver um LaunchAgent
com.openclaw.ssh-tunnel remanescente de uma configuração anterior, descarregue-o e exclua-o.