
Salut les dépanneurs de tableau de bord — si vous êtes face à une page blanche, une connexion refusée ou des erreurs "non autorisé" alors que la passerelle OpenClaw fonctionne bien, je suis passé par là.
La semaine dernière, j'ai débogué ce problème exact sur quatre configurations : développement local sur Mac, Docker sur Ubuntu, proxy inversé nginx, et une instance exposée par Tailscale. Chacune avait un mode de défaillance différent — mais elles ont toutes mené aux mêmes cinq causes principales.
Le HTML se charge. DevTools montre des échecs de poignée de main WebSocket. Les journaux de la passerelle ne disent rien d'utile. Vous n'êtes pas sûr si c'est l'authentification, le réseau ou une corruption de configuration.
Voici ce qui cause réellement le problème : en-têtes de mise à niveau WebSocket manquants dans votre proxy, NAT Docker traitant localhost comme externe, jetons d'authentification ne persistant pas dans localStorage, ou collisions de ports dues à d'anciens services Clawdbot/Moltbot toujours en cours d'exécution.
Ce guide présente le flux de diagnostic que j'ai élaboré après avoir corrigé ces problèmes à plusieurs reprises. Commencez ici, suivez les vérifications, et vous réussirez soit à faire fonctionner le tableau de bord, soit à savoir exactement quoi signaler.

Before diving into proxies and ports, verify the gateway is actually functional.
# Check gateway status
openclaw status
# If using systemd
systemctl --user status openclaw-gateway
# Docker users
docker ps | grep openclaw-gateway
What you're looking for:
running or activeIf it's not running or restarting constantly, stop here and fix the gateway install issues first.
Test the WebSocket endpoint directly:
# Install wscat if you don't have it
npm install -g wscat
# Test connection (replace with your actual token)
wscat -c "ws://127.0.0.1:18789/?token=YOUR_TOKEN_HERE"
Possible outcomes:
If wscat connects but the browser doesn't, the issue is either CORS, proxy config, or browser security policy.
Look at recent logs:
# View last 50 log lines
openclaw logs --limit 50
# Docker
docker logs openclaw-gateway --tail 50
# Look for WebSocket handshake attempts
openclaw logs | grep -E 'ws\]|websocket|handshake'
Key patterns:
[ws] accepted → Connection succeeded[ws] closed before connect ... code=1008 reason=pairing required → Auth mismatch[ws] closed before connect ... code=1008 reason=unauthorized: gateway token missing → Token not reaching gatewayOrigin http://... is not allowed → CORS issueSymptom: Gateway runs fine via CLI, but browser can't connect to 127.0.0.1:18789.
Cause: Gateway bound to a Tailscale IP, VPN interface, or external IP instead of loopback.
This is Issue #1380 — when Tailscale is active, the gateway sometimes binds to 100.x.x.x instead of 127.0.0.1. Browser WebSocket connections to Tailscale IPs fail.
Diagnose:
# Check what interface the gateway bound to
openclaw status
# Or inspect the actual listening socket
sudo lsof -i :18789
# Look at the "NAME" column - should show 127.0.0.1:18789
Fix:
Force loopback binding in config (~/.openclaw/config.json):
{
"gateway": {
"bind": "loopback",
"port": 18789
}
}
Valid bind options:
loopback → 127.0.0.1 only (default, safest)lan → 0.0.0.0 (all interfaces, requires auth)tailnet → Tailscale IPAfter changing bind, restart:
systemctl --user restart openclaw-gateway
# or
docker compose restart openclaw-gateway
Symptom: Gateway won't start, logs show EADDRINUSE.
Cause: Old Clawdbot/Moltbot gateway still running, or another service using 18789.
Diagnose:
# Find what's using the port
sudo lsof -i :18789
# Or
sudo ss -tlnp | grep 18789
Fix Option A: Stop Conflicting Service
# Stop old Clawdbot
systemctl --user stop clawdbot-gateway
# Kill the process if needed
sudo kill -9 <PID>
Fix Option B: Change OpenClaw Port
In ~/.openclaw/config.json:
{
"gateway": {
"port": 18790
}
}
Update Docker compose if using containers:
ports:
- "127.0.0.1:18790:18790"
Then access dashboard at http://127.0.0.1:18790/.
Symptom: Running gateway in Docker Desktop on Windows/Mac, browser shows "pairing required" even with correct token.
Cause: Docker's NAT networking makes the gateway see connections from 172.18.0.1 instead of 127.0.0.1. Gateway treats this as an external connection requiring node pairing.
Diagnose:
Check gateway logs for:
[ws] closed before connect conn=... remote=172.18.0.1 ... code=1008 reason=pairing required
If you see remote=172.18.0.1 but you're connecting from 127.0.0.1, this is the issue.
Fix:
Add trusted proxies to your config:
{
"gateway": {
"trustedProxies": ["172.18.0.0/16", "172.17.0.0/16"]
}
}
Or run gateway with --bind lan and enforce token auth:
{
"gateway": {
"bind": "lan",
"auth": {
"mode": "token",
"token": "your-secret-token"
}
}
}
Better fix for Windows/Mac: Run gateway natively instead of in Docker to get real localhost connections.
If you're exposing OpenClaw through nginx, Caddy, or another reverse proxy, WebSocket support needs explicit configuration.
The dashboard uses WebSockets for real-time communication. Standard HTTP proxying breaks this.
Minimal working config:
server {
listen 443 ssl;
server_name openclaw.yourdomain.com;
# SSL certs
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
location / {
proxy_pass http://127.0.0.1:18789;
# Critical for WebSockets
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
# Pass through client info
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# WebSocket timeouts
proxy_read_timeout 86400;
proxy_send_timeout 86400;
}
}
Common nginx mistakes:
proxy_http_version 1.1 → WebSocket upgrade failsUpgrade and Connection headers → Handshake rejectedDetailed nginx reverse proxy guide: nginx WebSocket proxying
Caddy handles WebSockets automatically, but you still need proper config:
openclaw.yourdomain.com {
reverse_proxy 127.0.0.1:18789
}
That's it. Caddy auto-detects the WebSocket upgrade and adjusts timeouts.
If using subpath:
yourdomain.com {
reverse_proxy /openclaw/* 127.0.0.1:18789
}
Then access via https://yourdomain.com/openclaw/.
Debugging Caddy WebSocket issues:
Enable verbose logging:
openclaw.yourdomain.com {
log {
output file /var/log/caddy/openclaw.log
level DEBUG
}
reverse_proxy 127.0.0.1:18789
}
Check for websocket upgrade in logs. If missing, Caddy isn't detecting the upgrade request.
Less common but occasionally used:
<VirtualHost *:443>
ServerName openclaw.yourdomain.com
SSLEngine On
SSLCertificateFile /path/to/cert.pem
SSLCertificateKeyFile /path/to/key.pem
# Enable proxy modules
# a2enmod proxy proxy_http proxy_wstunnel rewrite
ProxyPreserveHost On
# WebSocket tunnel
RewriteEngine On
RewriteCond %{HTTP:Upgrade} =websocket [NC]
RewriteRule /(.*) ws://127.0.0.1:18789/$1 [P,L]
# Regular HTTP proxy
ProxyPass / http://127.0.0.1:18789/
ProxyPassReverse / http://127.0.0.1:18789/
</VirtualHost>
Enable required modules:
sudo a2enmod proxy proxy_http proxy_wstunnel rewrite
sudo systemctl restart apache2
Symptom: Dashboard loads over HTTPS but WebSocket connection fails with mixed content error.
Cause: Browser blocks ws:// (non-secure WebSocket) when page is loaded over https://.
Fix:
Use wss:// (WebSocket Secure) behind your reverse proxy.
Your nginx/Caddy terminates SSL and forwards to http://127.0.0.1:18789, but the browser needs to connect via wss://.
Example flow:
wss://openclaw.yourdomain.com/ → nginx with SSLws://127.0.0.1:18789/ → gateway (local, no SSL needed)The dashboard auto-detects this if you access it via HTTPS URL.
Symptom: Browser console shows CORS policy: No 'Access-Control-Allow-Origin' header.
Cause: Accessing dashboard from a different domain than the gateway expects.
Context: As of OpenClaw's security updates, the Control UI has stricter origin validation.
Fix:
If your dashboard is at https://openclaw.example.com but gateway config doesn't know about it:
{
"gateway": {
"cors": {
"origins": ["https://openclaw.example.com"]
}
}
}
Security note: Don't use "origins": ["*"] in production. This exposes your gateway to external access vulnerabilities.
Symptom: Dashboard keeps asking for token every time you reload.
Cause: Browser's localStorage API blocked or cleared.
Diagnose:
Open DevTools → Application → Local Storage → http://127.0.0.1:18789
Look for key: openclaw-gateway-token
If missing after login, check:
Workaround:
Use the tokenized URL every time:
openclaw dashboard
This command outputs a URL with ?token=... appended. The UI strips it after first load and saves to localStorage — but if that fails, you need the URL each time.

If none of the above fixes work, you're in edge case territory. Before opening a GitHub issue, collect these logs:
# Last 100 lines with timestamps
openclaw logs --limit 100 > gateway-logs.txt
# Docker
docker logs openclaw-gateway --tail 100 > gateway-logs.txt
browser-console.txt# Export config (redact tokens)
cat ~/.openclaw/config.json | sed 's/"token": ".*"/"token": "REDACTED"/g' > config-sanitized.json
# Check firewall rules (Linux)
sudo iptables -L -n | grep 18789
# Check what's binding to the port
sudo lsof -i :18789
# Test from external host if relevant
curl -v http://your-server-ip:18789/

Après avoir débogué ces éléments dans différents environnements, voici la répartition des échecs que j'ai observée :
60% - Configuration WebSocket du proxy inversé manquante
Upgrade/Connectionproxy_http_version 1.120% - NAT Docker traitant localhost comme externe
trustedProxies10% - Conflits de ports à cause d'anciens Clawdbot/Moltbot
5% - Liaison Tailscale au lieu de loopback
100.x.x.x quand Tailscale est actifbind: "loopback" dans la configuration5% - Incohérence du jeton d'authentification
openclaw dashboard pour obtenir le lien correct avec le jetonLe plus courant — la configuration WebSocket du proxy inversé — est aussi le plus facile à manquer car la partie HTTP fonctionne bien. Vous voyez le HTML, le CSS se charge, mais le WebSocket échoue silencieusement.
Si vous êtes derrière un proxy et que le tableau de bord ne se connecte pas, c'est votre première vérification.
Chez Macaron, nous hébergeons l'interface utilisateur pour vous — pas de configurations nginx à déboguer, pas de délais d'attente WebSocket à régler, pas de surprises Docker NAT. Si vous en avez assez de résoudre les problèmes d'infrastructure avant même de pouvoir tester les flux de travail, préférez une interface utilisateur hébergée pour les flux de travail ? Créez un compte Macaron.
FAQ
Q : Le HTML du tableau de bord se charge mais rien ne fonctionne. Par où commencer ? Ouvrez les outils de développement → Réseau → onglet WS. Si la poignée de main WebSocket échoue, il vous manque presque certainement les en-têtes Upgrade et Connection dans la configuration de votre proxy inverse. C'est 60% des cas à ce stade. Si vous voulez d'abord écarter une mauvaise installation, je vérifierais avec le guide d'installation OpenClaw avant d'approfondir les configurations proxy.
Q : Pourquoi ma passerelle affiche-t-elle "appairage requis" alors que j'ai correctement configuré le jeton ? Vérifiez vos journaux pour remote=172.18.0.1. Si vous êtes sur Docker Desktop (Windows ou Mac), le NAT fait croire à la passerelle que vous êtes une connexion externe. Exécutez la passerelle nativement ou ajoutez trustedProxies à votre configuration — le guide de configuration Docker contient la configuration réseau exacte pour ce scénario.
Q : La passerelle me demande sans cesse mon jeton à chaque rechargement de page. Le localStorage de votre navigateur ne persiste pas. C'est souvent à cause du mode incognito, d'une extension de confidentialité agressive ou de l'option "effacer le stockage à la fermeture" activée. Utilisez l'URL avec jeton du tableau de bord openclaw comme solution de contournement. Si les problèmes d'authentification persistent, la checklist de sécurité OpenClaw aborde la gestion des jetons plus en détail.
Q : Le port 18789 est déjà utilisé. Qu'est-ce qui l'occupe ? Neuf fois sur dix, c'est une ancienne passerelle Moltbot ou Clawdbot encore en cours d'exécution. lsof -i :18789 vous indiquera de quoi il s'agit. Tuez le processus, ou changez simplement le port d'OpenClaw dans la configuration. Si vous avez récemment migré de Moltbot, cet article sur leur utilisation conjointe vaut le détour — les conflits de service sont fréquents dans ce cas.
Q : Mon tableau de bord HTTPS ne peut pas se connecter au WebSocket. Contenu mixte — le navigateur n'autorisera pas ws:// sur une page HTTPS, point final. Votre proxy doit gérer la terminaison wss://. Si vous êtes sur un VPS et que ce problème persiste, le guide de déploiement VPS propose une configuration nginx + SSL fonctionnelle que vous pouvez utiliser directement.
Q : Tailscale est actif et maintenant le tableau de bord ne se charge plus localement. Problème connu (#1380) — Tailscale peut basculer la passerelle sur 100.x.x.x au lieu de 127.0.0.1. Ajoutez "bind": "loopback" à votre configuration et redémarrez. Si le comportement de liaison reste confus après cela, la référence de la passerelle explique clairement toutes les options.