Web interfaces

Web

Le Gateway sert une petite interface de contrôle dans le navigateur (Vite + Lit) depuis le même port que le WebSocket du Gateway :

  • par défaut : http://<host>:18789/
  • avec gateway.tls.enabled: true : https://<host>:18789/
  • préfixe facultatif : définissez gateway.controlUi.basePath (p. ex. /openclaw)

Les fonctionnalités se trouvent dans l’interface de contrôle. Le reste de cette page se concentre sur les modes de liaison, la sécurité et les surfaces exposées au Web.

Webhooks

Lorsque hooks.enabled=true, le Gateway expose aussi un petit point de terminaison Webhook sur le même serveur HTTP. Consultez Configuration du Gatewayhooks pour l’authentification et les charges utiles.

Configuration (activée par défaut)

L’interface de contrôle est activée par défaut lorsque les ressources sont présentes (dist/control-ui). Vous pouvez la contrôler via la configuration :

{
  gateway: {
    controlUi: { enabled: true, basePath: "/openclaw" }, // basePath optional
  },
}

Accès Tailscale

Serve intégré (recommandé)

Gardez le Gateway sur loopback et laissez Tailscale Serve le proxyfier :

{
  gateway: {
    bind: "loopback",
    tailscale: { mode: "serve" },
  },
}

Puis démarrez le gateway :

openclaw gateway

Ouvrez :

  • https://<magicdns>/ (ou votre gateway.controlUi.basePath configuré)

Liaison au tailnet + jeton

{
  gateway: {
    bind: "tailnet",
    controlUi: { enabled: true },
    auth: { mode: "token", token: "your-token" },
  },
}

Puis démarrez le gateway (cet exemple non-loopback utilise une authentification par jeton secret partagé) :

openclaw gateway

Ouvrez :

  • http://<tailscale-ip>:18789/ (ou votre gateway.controlUi.basePath configuré)

Internet public (Funnel)

{
  gateway: {
    bind: "loopback",
    tailscale: { mode: "funnel" },
    auth: { mode: "password" }, // or OPENCLAW_GATEWAY_PASSWORD
  },
}

Notes de sécurité

  • L’authentification du Gateway est requise par défaut (jeton, mot de passe, trusted-proxy ou en-têtes d’identité Tailscale Serve lorsqu’ils sont activés).
  • Les liaisons non-loopback requièrent toujours l’authentification du gateway. En pratique, cela signifie une authentification par jeton/mot de passe ou un proxy inverse sensible à l’identité avec gateway.auth.mode: "trusted-proxy".
  • L’assistant crée une authentification par secret partagé par défaut et génère généralement un jeton de gateway (même sur loopback).
  • En mode secret partagé, l’interface envoie connect.params.auth.token ou connect.params.auth.password.
  • Lorsque gateway.tls.enabled: true, les assistants locaux de tableau de bord et de statut affichent des URL de tableau de bord en https:// et des URL WebSocket en wss://.
  • Dans les modes portant une identité, comme Tailscale Serve ou trusted-proxy, la vérification d’authentification WebSocket est satisfaite à partir des en-têtes de requête à la place.
  • Pour les déploiements non-loopback de l’interface de contrôle, définissez gateway.controlUi.allowedOrigins explicitement (origines complètes). Sans cela, le démarrage du gateway est refusé par défaut.
  • gateway.controlUi.dangerouslyAllowHostHeaderOriginFallback=true active le mode de repli de l’origine sur l’en-tête Host, mais constitue une dégradation de sécurité dangereuse.
  • Avec Serve, les en-têtes d’identité Tailscale peuvent satisfaire l’authentification de l’interface de contrôle/WebSocket lorsque gateway.auth.allowTailscale vaut true (aucun jeton/mot de passe requis). Les points de terminaison de l’API HTTP n’utilisent pas ces en-têtes d’identité Tailscale ; ils suivent plutôt le mode d’authentification HTTP normal du gateway. Définissez gateway.auth.allowTailscale: false pour exiger des identifiants explicites. Consultez Tailscale et Sécurité. Ce flux sans jeton suppose que l’hôte du gateway est fiable.
  • gateway.tailscale.mode: "funnel" requiert gateway.auth.mode: "password" (mot de passe partagé).

Construire l’interface

Le Gateway sert les fichiers statiques depuis dist/control-ui. Construisez-les avec :

pnpm ui:build