Public : équipes qui séparent Gateway et CLI openclaw dans deux services Compose, voient un Gateway « vert » dans les journaux alors que la CLI tape gateway closed (WebSocket 1006/1008), pairing required ou des deux pistes de jeton (env vs fichier). Approche : stabiliser la sémantique d’URL (TCP via nom de service ou socket Unix partagé), fusionner OPENCLAW_GATEWAY_TOKEN et gateway.auth.* en une seule source de vérité, puis — si nécessaire — réduire la surface via espaces de noms réseau partagés. Par rapport à l’article d’avril sous‑agent 1008 + trustedProxies (gros CIDR), ici on couvre comment chaque conteneur adresse le Gateway et lit le jeton — lire aussi réseau Docker, appairage & jetons, volumes.
127.0.0.1 figé : la boucle locale n’est que le conteneur courant — utiliser le DNS Compose, ex. http://openclaw-gateway:18789.OPENCLAW_GATEWAY_TOKEN peut écraser le fichier — ressemble à des bascules 401/1008.gateway.sock existe, mêmes chemins hôte et UID/GID alignés.network_mode: service:<gateway> ou DNS TCP partout — pas de mélange env dans un même ticket.Traitez les cinq points comme bloquants release tant qu’ils ne sont pas verts ; changer d’image rarement répare un contrat namespace/jeton.
Alignez horodatage stderr Gateway, stdout CLI et docker events — beaucoup de « aléatoire » suit des restarts ou des healthchecks trop agressifs.
| Symptôme | Suite d’investigation | Souvent |
|---|---|---|
1006 + PID récent / OOM | logs hôte noyau même fenêtre → budgets redémarrage → timeouts | transport fermé ≠ mauvaise politique d’appairage seule |
1008 + pairing | vérité du jeton → URL Gateway → état disque | double montage / répertoires illisibles |
Connection refused seulement dans le conteneur CLI | déplacer les sondes dans ce conteneur | erreur loopback / port non publié |
| Socket ENOENT / permission | ls -la des montages ; répertoire parent partagé | socket absente dans l’espace enfant |
Les codes de fermeture ne suffisent pas seuls : croiser journaux Gateway, machine d’état d’appairage et budgets de retry du reverse proxy.
docker compose config..openclaw : arbres inscriptibles identiques (checklist volumes).openclaw gateway status puis doctor : aligner les horodatages hôte vs conteneur.network_mode: service:<gateway>, cohérent avec trustedProxies.Avec Nginx/Caddy devant le Gateway, harmoniser Upgrade/timeouts avec l’URL Compose (reverse proxy).
# Adapter noms/volumes puis docker compose config
services:
openclaw-gateway:
environment:
- OPENCLAW_CONFIG_DIR=/data/.openclaw
- OPENCLAW_GATEWAY_TOKEN=${OPENCLAW_GATEWAY_TOKEN}
volumes:
- oc-data:/data/.openclaw
networks: [oc-net]
openclaw-cli:
environment:
- OPENCLAW_CONFIG_DIR=/data/.openclaw
- OPENCLAW_GATEWAY_URL=http://openclaw-gateway:18789
- OPENCLAW_GATEWAY_TOKEN=${OPENCLAW_GATEWAY_TOKEN}
volumes:
- oc-data:/data/.openclaw
networks: [oc-net]
depends_on:
- openclaw-gateway
networks:
oc-net:
driver: bridge
volumes:
oc-data:
La prod veut redémarrages prévisibles, lignes de base disque et historique d’appairage auditable. Un Mac distant dédié (six régions, location mensuelle/trimestrielle) s’aligne souvent mieux sur la rotation des secrets CI. Consultez les tarifs Mac mini, puis mappez les variables de ce runbook.
La plupart des échecs Compose = namespace + jeton + répertoire d’état décrits dans trois documents différents. Sans capture reproductible de handshake dans le conteneur, pas d’« on désactive TLS ». Ensuite chaînez GHCR + Control UI et proxies durcis (liste).
FAQ
Chevauchement avec l’article trustedProxies d’avril ?
Là‑bas CIDR & sous‑trafic ; ici URL, sockets, namespaces, jeton unique — lisez les deux.
curl sur l’hôte ⇒ CI OK ?
Non. Rejouez la même image conteneur en échec.