2026 OpenClaw Docker Compose multi-conteneurs : liaison Gateway, jeton et liste de correctifs réseau « pairing sous-agent 1008 » (trustedProxies)

Environ 14 min de lecture · MACCOME

Public concerné : vous faites tourner Gateway et des conteneurs CLI ou agents via Docker Compose ; les journaux montrent Gateway actif, mais les sous-sessions renvoient gateway closed (1008): pairing required, ou le RPC est sain mais le pairing reste bloqué. Message clé : ce n’est généralement pas réglé en « réinstallant l’image » — il s’agit le plus souvent d’un mélange de surface d’écoute, jeton, plages de proxys de confiance (trustedProxies) et d’URL inter-conteneurs ; cet article propose une matrice de symptômes, un fragment Compose, un runbook en six étapes et trois KPI. Rôles : à lire avec docker-setup.sh officiel + GHCR, pairing et jeton, et triage réseau Docker.

Pourquoi Gateway semble démarré dans Compose alors que les sous-agents voient 1008 ?

Le Gateway OpenClaw gère les connexions longues et le routage ; quand la CLI ou les outils « sous-session / sous-agent » parlent au Gateway en WebSocket/HTTP, le processus seul ne suffit — le client doit être une identité réseau jugée fiable côté Gateway et le pairing doit être valide. Docker place chaque service dans son propre espace de noms réseau : si vous mettez http://127.0.0.1:18789 dans le conteneur CLI, le trafic ne touche que ce conteneur, pas l’hôte ni un autre service.

  1. localhost non remplacé par un nom de service : utilisez un nom DNS Compose type http://openclaw-gateway:18789 (exemple).
  2. Divergence bind vs chemin d’accès : si Gateway n’écoute que sur loopback, les autres conteneurs via IP bridge peuvent être traités comme « non locaux » — branches auth ou pairing.
  3. trustedProxies manquant : derrière un reverse proxy ou un bridge, déclarez les plages Docker (souvent 172.16.0.0/12, 10.0.0.0/8, le CIDR de votre réseau custom) pour évaluer correctement l’identité client.
  4. Dérive d’OPENCLAW_GATEWAY_TOKEN : Gateway et CLI lisent des chemins de montage ou des variables différents — oscillation entre parfois OK et 401/1008.
  5. Perte de pairing après upgrade : montages incomplets ; les sessions sous-agent doivent se ré-appairer mais on croit à un pur problème réseau.
  6. Patterns récurrents dans la communauté : loopback + conteneurs séparés impose d’ajuster explicitement bind ou politique de proxy de confiance — c’est un contrat de périmètre réseau, pas un défaut isolé.

Contrairement au guide d’installation trois OS, avec Compose l’enjeu n’est pas « quel OS » mais quel réseau est considéré comme fiable par quel conteneur.

Lors d’une reproduction, conservez côte à côte trois empreintes de journaux : lignes de démarrage Gateway, pile du sous-agent, sous-réseau du réseau attachable depuis docker inspect — bien des 1008, comparés ainsi, tombent sur « plage de confiance non déclarée », pas sur le modèle ni le canal.

Tableau 1 : instantané de symptôme → quoi vérifier (matrice)

InstantanéVérifier en priorité (ordre)Cause fréquente
Le conteneur A n’atteint pas 127.0.0.1:18789Passer à une URL par nom de service, puis ports publiés et adresse d’écouteMauvaise sémantique de localhost
RPC healthy mais sessions_spawn renvoie 1008Liste de pairing → trustedProxies → triade bindVoie sous-agent vue comme externe / non appairée
Journaux avec trusted proxy / pairingAligner CIDR Compose et config gateway.authSous-réseau absent de l’ensemble de confiance
Uniquement après changement de versionComparer anciens / nouveaux bind/auth par défaut et volume .openclaw migréDefaults plus stricts ou pairing obsolète
info

Rappel : même avec le flux docker-setup.sh officiel, revalidez noms de service et volumes selon ce contrat réseau — voir le runbook GHCR et Control UI.

Tableau 2 : mode bind vs accès inter-conteneurs

gateway.bind (concept)Adapté àFrottement Compose
loopbackMonoconteneur tout-en-un ou accès hôte seulLes autres services ne peuvent pas l’utiliser comme loopback local
lan / écoute personnaliséePlusieurs services, RPC inter-conteneursJeton / auth et surface exposée à réduire
trusted reverse proxyNginx/Caddy devantDoit coïncider avec la checklist reverse proxy pour les sources aval

Tableau 3 : remplir trustedProxies (CIDR d’exemple)

Le tableau ci-dessous est pédagogique : lisez votre sous-réseau réel via docker network inspect, ne copiez pas aveuglément.

Type de réseauExemple de CIDRVotre action
Bridge Docker par défaut172.17.0.0/16 (selon env.)Vérifier si l’IP source perçue par Gateway est dans cette plage
Réseau custom Composepar ex. 172.18.0.0/16172.30.x.xAjouter le sous-réseau entier à trustedProxies (pas des IP de conteneurs isolées)
overlay / swarmalloué par l’orchestrateurMême logique : cible « sous-réseau », pas liste d’IP de pods instables

Runbook en six étapes : de « les conteneurs se ping » à « les sous-agents s’appairent »

  1. Unifier OPENCLAW_CONFIG_DIR : Gateway et CLI/agents montent le même chemin ou un contenu synchronisé.
  2. URL Gateway avec nom de service : dans l’env du conteneur CLI, ex. OPENCLAW_GATEWAY_URL=http://openclaw-gateway:18789 (nom = service Compose).
  3. Aligner le jeton : OPENCLAW_GATEWAY_TOKEN identique des deux côtés ; avec jeton fichier, vérifier la lisibilité du montage.
  4. Définir bind Gateway et trustedProxies : après mise à jour selon tableaux 2/3, redémarrer Gateway (changements bind souvent = redémarrage dur).
  5. Chaîne de diag : openclaw gateway statusopenclaw doctor → reproduire l’action sous-agent et filtrer les logs sur 1008 / pairing.
  6. Noter trois KPI : délai jusqu’au pairing réussi, nombre de redémarrages, timeouts RPC inter-conteneurs persistants — dans le ticket de changement.
yaml
# Extrait d’exemple (noms de service et env en placeholder — remplacer avant prod)
services:
  openclaw-gateway:
    environment:
      - OPENCLAW_CONFIG_DIR=/config
      - OPENCLAW_GATEWAY_TOKEN=${OPENCLAW_GATEWAY_TOKEN}
    volumes:
      - ./config:/config
    networks: [oc-net]

  openclaw-cli:
    environment:
      - OPENCLAW_CONFIG_DIR=/config
      - OPENCLAW_GATEWAY_URL=http://openclaw-gateway:18789
      - OPENCLAW_GATEWAY_TOKEN=${OPENCLAW_GATEWAY_TOKEN}
    volumes:
      - ./config:/config
    networks: [oc-net]

networks:
  oc-net: { driver: bridge }

Trois KPI à afficher sur un tableau de bord (vérifiables en ops)

  1. Taux de succès sous-agent : sessions_spawn réussies / appels totaux sur une fenêtre ; sous seuil, ouvrir une page de triage « pairing + plage ».
  2. Alerte dérive de config : comparer empreinte gateway.auth.token ou hash d’env entre conteneurs ; bloquer la release si divergence.
  3. Coût de redémarrage Gateway : compter les redémarrages après changements bind/trustedProxies ; favoriser « config as code » et modèles de revue.

Ces KPI sont des suggestions d’observabilité ; ce n’est pas un SLA du projet amont.

Pourquoi des environnements conteneurs bricolés peinent à porter la chaîne OpenClaw en production

« L’image démarre » ne suffit pas : sous-agents et outils de session exigent un Gateway stable, une identité réseau prévisible et des volumes de config cohérents. Itérer en docker run monoconteneur sur un portable diffère fortement d’une pile Compose fixe avec volumes persistants sur Mac distant dédié — ce dernier cas se rapproche des tâches sans surveillance et planifiées.

Les VPS éphémères ou bureaux partagés peuvent suffire à une démo mais manquent souvent de ligne de base disque et réseau ; quand Gateway, reverse proxy et automatisation doivent vivre dans une même zone de confiance et scaler vite, des nœuds Apple Silicon multi-régions avec formules mensuelles ou trimestrielles surpassent souvent l’empilement manuel d’hôtes Docker jetables. MACCOME propose isolation physique et six emplacements pour séparer « Gateway toujours actif » et « machine build/signature » ; ouvrez les tarifs et le centre d’aide, puis câblez les variables d’environnement selon ce runbook.

En déploiement : d’abord boucler les six étapes dans un seul projet Compose, puis évaluer si Gateway et autres charges méritent des nœuds distants séparés.

Questions fréquentes

Quand le code 1008 apparaît, dois-je tout de suite passer bind en LAN ?

Commencez par le tableau 1 : souvent URL par nom de service ou trustedProxies, pas une écoute élargie sans analyse. Si vous exposez davantage, alignez jeton et pare-feu. Pairing : liste pairing et jeton.

Puis-je utiliser curl vers 127.0.0.1:18789 sur l’hôte à la place d’une sonde dans le conteneur ?

C’est un bon test côté hôte, mais pas un substitut à la connectivité conteneur → Gateway par nom de service — les espaces de noms diffèrent. Aide : centre d’aide location Mac mini.

Cela double-t-il l’article « triage réseau Docker » ?

Le triage réseau couvre namespaces Compose et CLI ; l’article Docker officiel les chemins d’images. Ce guide relie explicitement pairing sous-agent et trustedProxies. Suite possible : vérification MCP et Skills.