Web (Gateway)
O Gateway serve uma pequena UI de Controle no navegador (Vite + Lit) a partir da mesma porta do WebSocket do Gateway:- padrão:
http://<host>:18789/ - prefixo opcional: defina
gateway.controlUi.basePath(por exemplo,/openclaw)
Webhooks
Quandohooks.enabled=true, o Gateway também expõe um pequeno endpoint de webhook no mesmo servidor HTTP.
Veja Configuração do Gateway → hooks para autenticação + payloads.
Configuração (ativado por padrão)
A UI de Controle é ativada por padrão quando os assets estão presentes (dist/control-ui).
Você pode controlá-la via configuração:
Acesso via Tailscale
Serve integrado (recomendado)
Mantenha o Gateway em loopback e deixe o Tailscale Serve fazer o proxy:https://<magicdns>/(ou ogateway.controlUi.basePathconfigurado)
Bind no tailnet + token
http://<tailscale-ip>:18789/(ou ogateway.controlUi.basePathconfigurado)
Internet pública (Funnel)
Notas de segurança
- A autenticação do Gateway é exigida por padrão (token/senha ou cabeçalhos de identidade do Tailscale).
- Binds fora de loopback ainda exigem um token/senha compartilhado (
gateway.authou env). - O assistente gera um token do gateway por padrão (mesmo em loopback).
- A UI envia
connect.params.auth.tokenouconnect.params.auth.password. - A UI de Controle envia cabeçalhos anti-clickjacking e aceita apenas conexões de websocket do navegador de mesma origem, a menos que
gateway.controlUi.allowedOriginsesteja definido. - Com Serve, os cabeçalhos de identidade do Tailscale podem satisfazer a autenticação quando
gateway.auth.allowTailscaleétrue(nenhum token/senha necessário). Definagateway.auth.allowTailscale: falsepara exigir credenciais explícitas. Veja Tailscale e Segurança. gateway.tailscale.mode: "funnel"exigegateway.auth.mode: "password"(senha compartilhada).
Construindo a UI
O Gateway serve arquivos estáticos a partir dedist/control-ui. Compile-os com: