Skip to main content
Docker est facultatif. Utilisez-le pour disposer d’un environnement Gateway isolé et jetable, ou sur un hôte dépourvu d’installations locales. Si vous développez déjà sur votre propre machine, utilisez plutôt le processus d’installation normal. Le backend de bac à sable par défaut utilise Docker lorsque agents.defaults.sandbox est activé, mais le bac à sable est désactivé par défaut et n’exige pas que le Gateway lui-même s’exécute dans Docker. Les backends de bac à sable SSH et OpenShell sont également disponibles ; consultez Mise en bac à sable. Vous hébergez plusieurs utilisateurs ? Consultez Hébergement mutualisé pour le modèle d’une cellule par locataire.

Prérequis

  • Docker Desktop (ou Docker Engine) + Docker Compose v2
  • Au moins 2 GB de RAM pour construire l’image (pnpm install peut être interrompu par manque de mémoire sur les hôtes disposant de 1 GB, avec le code de sortie 137)
  • Suffisamment d’espace disque pour les images et les journaux
  • Sur un VPS ou un hôte public, consultez Renforcement de la sécurité pour l’exposition réseau, en particulier la chaîne de pare-feu Docker DOCKER-USER

Gateway conteneurisé

1

Construire l’image

Depuis la racine du dépôt :
Cela construit localement l’image du Gateway sous le nom openclaw:local. Pour utiliser plutôt une image préconstruite :
Les images préconstruites sont d’abord publiées dans le registre de conteneurs GitHub. GHCR est le registre principal pour l’automatisation des versions, les déploiements épinglés et les vérifications de provenance. La même version publie une copie miroir sur Docker Hub sous openclaw/openclaw :
Utilisez ghcr.io/openclaw/openclaw ou openclaw/openclaw et évitez les miroirs non officiels, qui ne partagent ni le calendrier de publication ni la politique de conservation d’OpenClaw. Étiquettes officielles : main, latest, <version> (par exemple 2026.2.26) et les étiquettes bêta telles que 2026.2.26-beta.1 (les versions bêta ne déplacent jamais latest/main). L’image par défaut main/latest/<version> inclut les plugins codex et diagnostics-otel. Une variante -browser (par exemple latest-browser) est également fournie avec Chromium préinstallé, ce qui est utile pour l’outil de navigateur en bac à sable sans installation de Playwright lors de la première exécution.
2

Réexécuter hors connexion

Sur les hôtes hors connexion, transférez et chargez d’abord l’image :
--offline vérifie que OPENCLAW_IMAGE existe déjà localement, désactive les extractions et constructions implicites de Compose, puis exécute le processus normal : synchronisation de .env, correction des autorisations, intégration initiale, synchronisation de la configuration du Gateway et démarrage de Compose.Si OPENCLAW_SANDBOX=1, la configuration hors connexion vérifie également les images de bac à sable configurées par défaut et par agent sur le démon derrière OPENCLAW_DOCKER_SOCKET, y compris l’étiquette de contrat du navigateur sur les images de navigateur basées sur Docker. Si une image requise est absente ou obsolète, la configuration se termine sans modifier la configuration du bac à sable au lieu d’indiquer à tort une réussite.
3

Terminer l’intégration initiale

Le script de configuration exécute automatiquement l’intégration initiale :
  • demande les clés d’API du fournisseur
  • génère un jeton de Gateway et l’écrit dans .env
  • crée le répertoire de la clé secrète du profil d’authentification
  • démarre le Gateway via Docker Compose
L’intégration initiale et les écritures de configuration préalables au démarrage s’exécutent directement via openclaw-gateway (avec --no-deps --entrypoint node), car openclaw-cli partage l’espace de noms réseau du Gateway et ne fonctionne qu’une fois le conteneur du Gateway créé.
4

Ouvrir l’interface de contrôle

Ouvrez http://127.0.0.1:18789/ et collez dans Settings le jeton écrit dans .env. Si vous avez configuré le conteneur pour utiliser l’authentification par mot de passe, utilisez plutôt ce mot de passe.Vous avez de nouveau besoin de l’URL ?
5

Configurer les canaux (facultatif)

Documentation : WhatsApp, Telegram, Discord

Processus manuel

Le contexte Docker exclut .git. Transmettez l’identité de la source comme arguments de construction, comme illustré ci-dessus, afin que l’écran À propos de l’image indique le commit extrait et un horodatage de construction. scripts/docker/setup.sh détermine et transmet automatiquement ces deux valeurs.
Exécutez docker compose depuis la racine du dépôt. Si vous avez activé OPENCLAW_EXTRA_MOUNTS ou OPENCLAW_HOME_VOLUME, le script de configuration écrit docker-compose.extra.yml ; incluez-le après tout fichier docker-compose.override.yml que vous gérez vous-même, par exemple -f docker-compose.yml -f docker-compose.override.yml -f docker-compose.extra.yml.

Mise à niveau des images de conteneur

Lorsque vous remplacez l’image OpenClaw tout en conservant le même état et la même configuration montés, le nouveau Gateway exécute avant d’être prêt les migrations de mise à niveau sûres au démarrage et la convergence des plugins. Les mises à niveau ordinaires des images ne devraient pas nécessiter une exécution distincte de openclaw doctor --fix. Si le démarrage ne peut pas effectuer ces réparations en toute sécurité, le Gateway se ferme au lieu de signaler qu’il est opérationnel. Avec une politique de redémarrage, Docker, Podman ou Kubernetes peut indiquer que le conteneur du Gateway redémarre. Conservez le volume d’état monté, puis exécutez une fois la même image avec openclaw doctor --fix comme commande du conteneur, en utilisant les mêmes montages d’état et de configuration que le Gateway :
Une fois doctor terminé, redémarrez le conteneur du Gateway avec sa commande par défaut. Dans Kubernetes, exécutez la même commande dans un Job ponctuel ou un pod de débogage monté sur le même PVC, puis redémarrez le Deployment ou le StatefulSet.

Variables d’environnement

Variables facultatives acceptées par scripts/docker/setup.sh (et, pour le conteneur du Gateway, directement par docker-compose.yml) : L’image officielle ne contient pas Homebrew. Pendant l’intégration initiale, OpenClaw masque les programmes d’installation des dépendances de Skills réservés à brew dans un conteneur Linux dépourvu de brew ; fournissez ces dépendances au moyen d’une image personnalisée ou installez-les manuellement. Utilisez OPENCLAW_IMAGE_APT_PACKAGES pour les dépendances empaquetées pour Debian et OPENCLAW_IMAGE_PIP_PACKAGES pour les dépendances Python (exécute python3 -m pip install --break-system-packages lors de la construction ; épinglez donc les versions et utilisez uniquement des index auxquels vous faites confiance). Si Docker signale ResourceExhausted, cannot allocate memory, ou s’interrompt pendant tsdown, augmentez la limite de mémoire du constructeur Docker ou réessayez avec des tas explicites plus petits :

Images construites depuis les sources avec des plugins sélectionnés

OPENCLAW_EXTENSIONS sélectionne les identifiants de manifeste de Plugin dans le dépôt source ; les noms de répertoires source existants sont également acceptés lorsqu’ils diffèrent. La construction Docker résout une seule fois la sélection en répertoires source, installe les dépendances de production et, lorsqu’un Plugin sélectionné est publié séparément avec openclaw.build.bundledDist: false, compile son environnement d’exécution dans le répertoire dist groupé racine. Ce conditionnement propre à Docker ne modifie pas le contrat d’artefact npm ou ClawHub du Plugin. Les identifiants inconnus, non valides ou ambigus font échouer la construction de l’image. Les identifiants connus réservés aux dépendances ou aux sources conservent leur préparation existante des sources et des dépendances sans obtenir d’entrée dist racine compilée. Un Plugin sélectionné avec des entrées de construction unifiées doit être compilé correctement ; les sources et la sortie d’exécution des Plugins externes non sélectionnés sont supprimées. Par exemple, ces commandes construisent des images Gateway autonomes, distinctes et multi-architectures de FakeCo pour ClickClack, Slack et Microsoft Teams. ClawRouter fait déjà partie de l’environnement d’exécution OpenClaw racine ; l’image ClickClack sélectionne donc uniquement clickclack. L’argument de navigateur explicitement vide permet de conserver l’image par défaut sans Chromium :
Utilisez --platform linux/arm64 --load ou --platform linux/amd64 --load pour une seule construction locale native. Une sortie multiplateforme ainsi que les SBOM et données de provenance joints nécessitent un registre ou une autre sortie Buildx qui préserve les attestations. Après l’envoi, inspectez le manifeste et déployez le condensat immuable plutôt que l’étiquette mutable fondée sur le SHA source :
Ces images sont destinées aux Gateway autonomes fondés sur OCI et aux utilisateurs génériques de Docker. Les Gateway gérés par Crabhelm ne les utilisent pas : ce chemin de livraison construit une archive d’appliance x86_64 distincte contenant une archive tar npm OpenClaw et épingle les condensats de Node, de l’archive et du manifeste. Construisez cette appliance séparément à partir de la même source OpenClaw intégrée. Pour tester la source d’un Plugin groupé avec une image conditionnée, montez un répertoire source du Plugin sur son chemin source conditionné, par exemple OPENCLAW_EXTRA_MOUNTS=/path/to/fork/extensions/synology-chat:/app/extensions/synology-chat:ro. Cela remplace le paquet compilé /app/dist/extensions/synology-chat correspondant pour le même identifiant de Plugin.

Observabilité

L’export OpenTelemetry est sortant depuis le conteneur Gateway vers votre collecteur OTLP ; il ne nécessite aucun port Docker publié. Pour inclure l’exportateur groupé dans une image construite localement :
Les images officielles préconstruites incluent déjà diagnostics-otel ; installez vous-même clawhub:@openclaw/diagnostics-otel uniquement si vous l’avez supprimé. Pour activer l’export, autorisez et activez le Plugin diagnostics-otel dans la configuration, puis définissez diagnostics.otel.enabled=true (consultez l’exemple complet dans Export OpenTelemetry). Les en-têtes d’authentification du collecteur passent par diagnostics.otel.headers, et non par les variables d’environnement Docker. Les métriques Prometheus réutilisent le port Gateway déjà publié. Installez clawhub:@openclaw/diagnostics-prometheus, activez le Plugin diagnostics-prometheus, puis collectez :
La route est protégée par l’authentification du Gateway ; n’exposez pas de port public /metrics distinct ni de chemin de proxy inverse non authentifié. Consultez Métriques Prometheus.

Contrôles d’intégrité

Points de terminaison de sonde du conteneur (aucune authentification requise) :
Le HEALTHCHECK intégré de l’image interroge /healthz ; des échecs répétés marquent le conteneur comme unhealthy afin que les orchestrateurs puissent le redémarrer ou le remplacer. Instantané d’intégrité approfondi authentifié :

LAN ou interface de bouclage

scripts/docker/setup.sh utilise par défaut OPENCLAW_GATEWAY_BIND=lan afin que http://127.0.0.1:18789 sur l’hôte fonctionne avec la publication de ports Docker.
  • lan (par défaut) : le navigateur et la CLI de l’hôte peuvent atteindre le port Gateway publié.
  • loopback : seuls les processus situés dans l’espace de noms réseau du conteneur peuvent atteindre directement le Gateway.
Utilisez les valeurs de mode de liaison dans gateway.bind (lan / loopback / custom / tailnet / auto), et non des alias d’hôte comme 0.0.0.0 ou 127.0.0.1.

Fournisseurs locaux de l’hôte

Dans le conteneur, 127.0.0.1 désigne le conteneur lui-même, et non l’hôte. Utilisez host.docker.internal pour les fournisseurs exécutés sur l’hôte : La configuration groupée utilise ces URL comme valeurs par défaut d’intégration de LM Studio/Ollama, et docker-compose.yml associe host.docker.internal au Gateway de l’hôte sur Docker Engine pour Linux (Docker Desktop fournit le même alias sous macOS/Windows). Les services de l’hôte doivent écouter sur une adresse accessible par Docker :
Vous utilisez votre propre fichier Compose ou docker run ? Ajoutez vous-même la même association, par exemple --add-host=host.docker.internal:host-gateway.

Backend Claude CLI dans Docker

L’image officielle ne préinstalle pas Claude Code. Installez-le et connectez-vous dans le conteneur avec l’utilisateur node, puis rendez persistant le répertoire personnel de ce conteneur afin que les mises à niveau de l’image n’effacent pas le binaire ni l’état d’authentification. Pour une nouvelle installation, activez un volume persistant /home/node avant d’exécuter la configuration :
Pour une installation existante, arrêtez la pile et rechargez d’abord les valeurs actuelles de .env — le script de configuration réécrit toujours .env à partir de l’environnement actuel du shell et des valeurs par défaut ; il ne lit pas ce fichier de lui-même :
Si .env contient des valeurs que votre shell ne peut pas charger, réexportez d’abord manuellement celles dont vous dépendez (OPENCLAW_IMAGE, ports, mode de liaison, chemins personnalisés, OPENCLAW_EXTRA_MOUNTS, bac à sable, omission de l’intégration). La surcouche générée monte le volume du répertoire personnel pour openclaw-gateway et openclaw-cli ; exécutez les commandes restantes avec cette surcouche (et d’abord docker-compose.override.yml, si vous en utilisez un) :
Le programme d’installation natif écrit claude dans /home/node/.local/bin/claude. Indiquez ce chemin à OpenClaw :
Connectez-vous et vérifiez depuis le même répertoire personnel persistant :
Utilisez ensuite le backend claude-cli groupé :
OPENCLAW_HOME_VOLUME rend persistants l’installation native sous /home/node/.local/bin et /home/node/.local/share/claude, ainsi que les paramètres et l’authentification de Claude Code sous /home/node/.claude et /home/node/.claude.json. Rendre persistant uniquement /home/node/.openclaw ne suffit pas ; si vous utilisez OPENCLAW_EXTRA_MOUNTS au lieu d’un volume de répertoire personnel, montez tous ces chemins Claude dans les deux services.
Pour une automatisation de production partagée ou une facturation Anthropic prévisible, préférez l’utilisation d’une clé d’API Anthropic. La réutilisation de Claude CLI suit la version installée de Claude Code, la connexion au compte, la facturation et le comportement de mise à jour.

Bonjour / mDNS

Le réseau en pont de Docker ne transmet généralement pas de manière fiable le multicast Bonjour/mDNS (224.0.0.251:5353). Lorsque OPENCLAW_DISABLE_BONJOUR n’est pas défini, le Plugin Bonjour groupé désactive automatiquement la diffusion LAN dès qu’il détecte son exécution dans un conteneur, afin d’éviter une boucle de plantage due aux nouvelles tentatives de multicast abandonnées par le pont. Définissez OPENCLAW_DISABLE_BONJOUR=1 pour forcer sa désactivation indépendamment de la détection, ou 0 pour forcer son activation (uniquement avec le réseau de l’hôte, macvlan ou un autre réseau où le multicast mDNS est réputé fonctionner). Sinon, utilisez l’URL Gateway publiée, Tailscale ou le DNS-SD étendu pour les hôtes Docker. Consultez Découverte Bonjour pour connaître les pièges et les procédures de dépannage.

Stockage et persistance

Docker Compose monte par liaison OPENCLAW_CONFIG_DIR sur /home/node/.openclaw, OPENCLAW_WORKSPACE_DIR sur /home/node/.openclaw/workspace et OPENCLAW_AUTH_PROFILE_SECRET_DIR sur /home/node/.config/openclaw, afin que ces chemins survivent au remplacement du conteneur. Lorsqu’une variable n’est pas définie, docker-compose.yml utilise un chemin de secours sous ${HOME}, ou sous /tmp si HOME lui-même est absent, de sorte que docker compose up ne génère jamais de spécification de volume avec une source vide dans les environnements minimaux. Ce répertoire de configuration monté contient :
  • openclaw.json pour la configuration du comportement
  • agents/<agentId>/agent/auth-profiles.json pour l’authentification OAuth/par clé d’API stockée des fournisseurs
  • .env pour les secrets d’exécution fournis par l’environnement, tels que OPENCLAW_GATEWAY_TOKEN
Le répertoire de secrets des profils d’authentification stocke la clé de chiffrement locale du contenu des jetons de profils d’authentification fondés sur OAuth. Conservez-le avec l’état de votre hôte Docker, mais séparément de OPENCLAW_CONFIG_DIR. Les Plugins téléchargeables installés stockent l’état de leurs paquets sous le répertoire personnel OpenClaw monté, de sorte que les enregistrements d’installation et les racines des paquets survivent au remplacement du conteneur ; le démarrage du Gateway ne régénère pas les arborescences de dépendances des Plugins groupés. Pour obtenir tous les détails sur la persistance des machines virtuelles, consultez Environnement d’exécution de machine virtuelle Docker — Emplacements des données persistantes. Principales sources de croissance du disque : media/, les bases de données SQLite propres à chaque agent, les transcriptions JSONL de sessions héritées, la base de données d’état SQLite partagée, les racines de paquets des Plugins installés et les journaux de fichiers tournants sous /tmp/openclaw/.

Assistants shell (facultatif)

Pour raccourcir les commandes quotidiennes, installez ClawDock :
Si vous avez effectué l’installation depuis l’ancien chemin scripts/shell-helpers/clawdock-helpers.sh, réexécutez la commande ci-dessus afin que votre assistant local suive l’emplacement actuel. Utilisez ensuite clawdock-start, clawdock-stop, clawdock-dashboard, etc. (exécutez clawdock-help pour obtenir la liste complète).
Chemin de socket personnalisé (par exemple, Docker sans privilèges root) :
Le script monte docker.sock uniquement une fois les prérequis du bac à sable validés. Si la configuration du bac à sable ne peut pas aboutir, il réinitialise agents.defaults.sandbox.mode à off. Le mode code de Codex est désactivé pour les tours durant lesquels le bac à sable OpenClaw est actif (voir Mise en bac à sable § Backend Docker) ; ne montez jamais le socket Docker de l’hôte dans les conteneurs de bac à sable des agents.
Désactivez l’allocation de pseudo-TTY par Compose avec -T :
openclaw-cli utilise network_mode: "service:openclaw-gateway" afin que les commandes CLI puissent atteindre le Gateway via 127.0.0.1. Considérez cela comme une frontière de confiance partagée. La configuration Compose retire NET_RAW/NET_ADMIN et active no-new-privileges pour openclaw-gateway et openclaw-cli.
Certaines configurations de Docker Desktop échouent à effectuer des recherches DNS depuis le conteneur auxiliaire openclaw-cli utilisant le réseau partagé après le retrait de NET_RAW, ce qui se manifeste par EAI_AGAIN pendant les commandes s’appuyant sur npm, telles que openclaw plugins install. Conservez le fichier Compose renforcé par défaut pour le fonctionnement normal. La surcharge ci-dessous restaure les capacités par défaut uniquement pour le conteneur openclaw-cli : utilisez-la pour la commande ponctuelle nécessitant un accès au registre, et non comme invocation par défaut :
Si vous avez déjà créé un conteneur openclaw-cli de longue durée, recréez-le avec la même surcharge : docker compose exec/docker exec ne peut pas modifier les capacités Linux d’un conteneur déjà créé.
L’image s’exécute en tant que node (uid 1000). Si vous rencontrez des erreurs d’autorisation sur /home/node/.openclaw, assurez-vous que vos montages liés depuis l’hôte appartiennent à l’uid 1000 :
La même incohérence peut se manifester par blocked plugin candidate: suspicious ownership (... uid=1000, expected uid=0 or root), suivi de plugin present but blocked : l’uid du processus et le propriétaire du répertoire du Plugin monté ne correspondent pas. Privilégiez l’exécution avec l’uid 1000 par défaut et corrigez la propriété du montage lié. Ne changez la propriété de /path/to/openclaw-config/npm en root:root que si vous exécutez intentionnellement OpenClaw en tant que root à long terme.
Organisez votre Dockerfile de façon à mettre en cache les couches de dépendances, évitant ainsi de réexécuter pnpm install sauf si les fichiers de verrouillage changent :
L’image par défaut privilégie la sécurité et s’exécute en tant que node non-root. Pour disposer d’un conteneur plus complet :
  1. Conserver /home/node : export OPENCLAW_HOME_VOLUME="openclaw_home"
  2. Intégrer les dépendances système : export OPENCLAW_IMAGE_APT_PACKAGES="git curl jq"
  3. Intégrer les dépendances Python : export OPENCLAW_IMAGE_PIP_PACKAGES="requests==2.32.5 humanize==4.14.0"
  4. Intégrer Chromium pour Playwright : export OPENCLAW_INSTALL_BROWSER=1, ou utilisez l’étiquette d’image officielle -browser
  5. Ou installer les navigateurs Playwright dans un volume persistant :
  6. Conserver les téléchargements de navigateurs : utilisez OPENCLAW_HOME_VOLUME ou OPENCLAW_EXTRA_MOUNTS. Sous Linux, OpenClaw détecte automatiquement le Chromium de l’image géré par Playwright.
Si vous choisissez OAuth OpenAI Codex dans l’assistant, celui-ci ouvre une URL dans un navigateur. Dans Docker ou les configurations sans interface graphique, copiez l’URL de redirection complète sur laquelle vous arrivez, puis collez-la dans l’assistant pour terminer l’authentification.
L’image d’exécution utilise node:24-bookworm-slim et exécute tini en tant que PID 1 afin que les processus zombies soient récupérés et que les signaux soient correctement gérés dans les conteneurs de longue durée. Elle publie des annotations d’image de base OCI, notamment org.opencontainers.image.base.name et org.opencontainers.image.source. Dependabot actualise le condensat épinglé de l’image de base Node ; les builds de publication n’exécutent pas de couche distincte de mise à niveau de la distribution. Voir Annotations d’image OCI.

Exécution sur un VPS ?

Consultez Hetzner (VPS Docker) et Environnement d’exécution de VM Docker pour connaître les étapes de déploiement sur une VM partagée, notamment l’intégration des binaires, la persistance et les mises à jour.

Bac à sable de l’agent

Lorsque agents.defaults.sandbox est activé avec le backend Docker, le Gateway exécute les outils de l’agent (shell, lecture/écriture de fichiers, etc.) dans des conteneurs Docker isolés, tandis que le Gateway lui-même reste sur l’hôte : une séparation stricte autour des sessions d’agent non fiables ou mutualisées, sans conteneuriser l’ensemble du Gateway. La portée du bac à sable peut être définie par agent (valeur par défaut), par session ou être partagée ; chaque portée dispose de son propre espace de travail monté dans /workspace. Vous pouvez également configurer des politiques d’autorisation ou de refus des outils, l’isolation réseau, les limites de ressources et les conteneurs de navigateur. Pour obtenir la configuration complète, les images, les remarques de sécurité et les profils multi-agents :

Activation rapide

Construisez l’image de bac à sable par défaut (depuis un dépôt source extrait) :
Pour les installations npm sans dépôt source extrait, consultez Mise en bac à sable § Images et configuration pour obtenir les commandes docker build intégrées.

Dépannage

Construisez l’image de bac à sable avec scripts/sandbox-setup.sh (dépôt source extrait) ou la commande docker build intégrée provenant de Mise en bac à sable § Images et configuration (installation npm), ou définissez agents.defaults.sandbox.docker.image sur votre image personnalisée. Les conteneurs sont créés automatiquement par session à la demande.
Définissez docker.user sur un UID:GID correspondant au propriétaire de votre espace de travail monté, ou modifiez le propriétaire du dossier de l’espace de travail.
OpenClaw exécute les commandes avec sh -lc (shell de connexion), qui charge /etc/profile et peut réinitialiser PATH. Définissez docker.env.PATH afin de placer en tête les chemins de vos outils personnalisés, ou ajoutez un script sous /etc/profile.d/ dans votre Dockerfile.
La VM nécessite au moins 2 Go de RAM. Utilisez une classe de machine supérieure et réessayez.
Récupérez un nouveau lien vers le tableau de bord et approuvez l’appareil du navigateur :
Plus de détails : Tableau de bord, Appareils.
Réinitialisez le mode et l’adresse d’écoute du Gateway :

Contenu associé