2026 OpenClaw Docker Compose : connectivité & appairage — 1006 vs 1008, source unique du jeton, sockets Unix & espaces de noms partagés

≈ 20 min · MACCOME

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.

Cinq causes « réseau apparent » quand Compose est découpé

  1. 127.0.0.1 figé : la boucle locale n’est que le conteneur courant — utiliser le DNS Compose, ex. http://openclaw-gateway:18789.
  2. Deux sources de jeton : OPENCLAW_GATEWAY_TOKEN peut écraser le fichier — ressemble à des bascules 401/1008.
  3. Socket Unix non co‑montée : si gateway.sock existe, mêmes chemins hôte et UID/GID alignés.
  4. 1006 pris pour simple instabilité : souvent fermeture anormale (redémarrage, timeout, proxy) — vérifier les redémarrages Gateway avant de retoucher l’appairage.
  5. Parité loopback sans choix d’archi : documenter 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ômeSuite d’investigationSouvent
1006 + PID récent / OOMlogs hôte noyau même fenêtre → budgets redémarrage → timeoutstransport fermé mauvaise politique d’appairage seule
1008 + pairingvérité du jeton → URL Gateway → état disquedouble montage / répertoires illisibles
Connection refused seulement dans le conteneur CLIdéplacer les sondes dans ce conteneurerreur loopback / port non publié
Socket ENOENT / permissionls -la des montages ; répertoire parent partagésocket absente dans l’espace enfant
warning

Les codes de fermeture ne suffisent pas seuls : croiser journaux Gateway, machine d’état d’appairage et budgets de retry du reverse proxy.

Six étapes — joindre avant de célébrer l’appairage

  1. Une sortie jeton officielle (fichier xor env), vérifiée par docker compose config.
  2. Geler la sémantique d’URL : DNS TCP bout à bout ou socket Unix avec un seul bind partagé.
  3. Même montage .openclaw : arbres inscriptibles identiques (checklist volumes).
  4. openclaw gateway status puis doctor : aligner les horodatages hôte vs conteneur.
  5. Parité loopback réelle : documenter network_mode: service:<gateway>, cohérent avec trustedProxies.
  6. Dossier de preuve : captures dans le namespace CLI + empreinte URL/jeton — pas de ticket clos sur un simple curl portable.

Avec Nginx/Caddy devant le Gateway, harmoniser Upgrade/timeouts avec l’URL Compose (reverse proxy).

yaml
# 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:

Faits d’ingénierie pour la fiche de changement

  • Sondes dans l’espace défaillant — sinon Gateway « Schrödinger ».
  • Empreintes courtes sur fichier + env avant tag.
  • Probes liveness bruyantes gonflent 1006 avant que l’auth n’aide.
  • Aucune commande hors image cassée = pas de RCA.

Pourquoi les conteneurs jetables sur portable peinent en prod

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.

Conclusion : le contrat d’abord

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.