OpenClaw Docker sur VPS en 2026
Exit 137 et erreurs Control UI : tableau de correspondance

mem_limit · première passe WASM · allowedOrigins · appairage compose exec · modèle compose

OpenClaw Docker sur VPS – diagnostic

Après avoir suivi le tutoriel docker compose, sur un petit VPS on voit souvent trois symptômes : sortie immédiate 137, 18789 sans réponse longtemps, Control UI en non-loopback ou erreurs liées à l’en-tête Host. Cet article commence par une liste actionnable sur free -h, mem_limit et une fenêtre de 3 à 7 minutes pour la première compilation WASM, puis un tableau symptôme → preuve dans docker logs → action pour Exit 137, droits de volumes et montages incohérents ; ensuite une grille 127.0.0.1, allowedOrigins et reverse proxy pour les erreurs d’UI ; enfin un runbook en six étapes pour l’appairage dans le conteneur et dix vérifications avant mise en ligne. À lire avec OpenClaw v2026.4 – installation et durcissement Docker, installation Gateway et checklist doctor et dépannage d’exécution en trois blocs pour passer de « le conteneur démarre » à « stable sans surveillance permanente ».

01

Ressources d’abord : free -h, mem_limit et la première compilation WASM « bloquée »

Au premier démarrage du Gateway OpenClaw dans le conteneur, CPU élevé mais port tardif correspond souvent à la phase WASM, pas à un interblocage. Comme dans l’article v2026.4 : si la mémoire disponible sur l’hôte et mem_limit sont trop justes, l’OOM Linux donne Exit 137, parfois sans message applicatif clair dans les journaux.

  1. 01

    Hôte : exécuter free -h ; un tampon durable nettement inférieur à environ 1,5 à 2 Gio augmente le risque 137 ; sans swap, encore plus.

  2. 02

    Compose : définir mem_limit: 2g ou plus et éviter la concurrence mémoire avec d’autres services lourds sur la même machine.

  3. 03

    Première fenêtre : après un démarrage à froid, attendre 3 à 7 minutes avant de conclure à l’échec ; docker logs -f pour voir si la chaîne de compilation continue.

  4. 04

    Sonde de santé : healthcheck.start_period au moins 360 s pour que compose ne tue pas avant la fin du WASM.

  5. 05

    Éviter les faux positifs : ne pas enchaîner les docker compose restart dans cette fenêtre ; chaque redémarrage relance le pic à froid.

Ces cinq points en page un du runbook « OpenClaw sur VPS » réduisent les tickets du type « j’ai suivi le tutoriel, ça ne monte pas ». Dépannage Gateway plus détaillé : article d’exécution.

02

Exit 137, droits de volumes, montages : symptômes, preuves docker logs et actions

Le tableau suit d’abord la preuve, puis l’action, pour ramener les tickets de « la passerelle semble cassée » vers des champs reproductibles. Avec la checklist doctor, on peut référencer les lignes dans le modèle de ticket.

Symptômedocker logs / hôteAction prioritaire
Sortie 137 immédiatedmesg avec OOM ; ou journal qui s’arrêteAugmenter mem_limit ou la taille d’instance ; réduire la concurrence
Permission denied sur workspaceRépertoire monté en root, utilisateur node dans le conteneur sans écriturechown vers l’UID du conteneur ou aligner user: sur le volume
Config ignoréeDeux chemins vers .openclaw entre hôte et composeUn seul bind ; avant redémarrage docker compose config
DNS intermittentcurl dans le conteneur vers l’endpoint modèle en timeoutVérifier dns Docker et la résolution sur l’hôte selon l’article long
Redémarrages sans nouveau journalSonde de santé trop courteAssouplir start_period et retries

Un diagnostic Docker efficace suppose que le 137 soit d’abord établi comme OOM, et non deviné comme un bug applicatif.

Si vous combinez le Gateway avec un nœud Mac distant toujours joignable, séparez la ligne d’acceptation « ressources conteneur » (compose, journaux) de celle « SLA du nœud » (région, fenêtres de maintenance).

03

Control UI, liaison 127.0.0.1 et reverse proxy : allowedOrigins et options d’en-tête Host

Exposer 18789 sur Internet depuis le VPS est une erreur fréquente. L’article d’installation recommande le conteneur en loopback uniquement, TLS terminé par Caddy ou Nginx sur 443. Une erreur non-loopback dans la Control UI signifie que l’origine du navigateur et les origines autorisées par la passerelle divergent, pas que « Docker est cassé ».

ScénarioÉcoute / proxyOrientation config
Debug par tunnel SSH local127.0.0.1:18789allowedOrigins inclut http://127.0.0.1:18789
Accès HTTPS en productionProxy vers amont loopbackallowedOrigins liste https://votre-domaine ; éviter le repli Host si possible
Laboratoire temporaireHTTP sur IP interneLister explicitement les origines IP ; CIDR restreint ; retirer après maintenance
« Voir l’UI vite » en dépannageConserver TLS en périphérieRepli Host documenté seulement en connaissance du risque ; revenir en arrière ensuite
json
{
  "gateway": {
    "mode": "local",
    "controlUi": {
      "allowedOrigins": ["https://openclaw.example.com"]
    }
  }
}

Remarque : après modification de openclaw.json, vérifier si docker compose restart tombe dans la fenêtre WASM initiale et n’ajoute pas de confusion avec la section 2.

04

Runbook en six étapes : docker compose exec, devices list, approve, chemins

Pour openclaw dans le conteneur, HOME et le volume de configuration doivent correspondre au processus en cours, sinon « approuvé sur l’hôte, en attente dans le conteneur ». Le nom de service utilisé ici est openclaw ; remplacez par le vôtre dans compose.

  1. 01

    Nom du service : docker compose ps pour identifier le conteneur Gateway.

  2. 02

    Même environnement : docker compose exec openclaw sh -lc 'pwd; echo $HOME; ls -la ~/.openclaw | head'

  3. 03

    Demandes en attente : docker compose exec openclaw openclaw devices list

  4. 04

    Copier l’ID de demande : depuis l’UI ou les logs, puis openclaw devices approve <id>.

  5. 05

    Visibilité de la clé API : si No API key found for provider, vérifier que .env est injecté par compose dans le conteneur, pas seulement dans le profil shell de l’hôte.

  6. 06

    Champs ticket : chemin compose, tag d’image, extrait openclaw.json, commande approve pour réutilisation.

Attention : exécuter openclaw devices approve sur l’hôte alors que la configuration n’est montée que dans le conteneur produit un faux négatif.

05

Squelette compose reproductible, dix contrôles avant mise en ligne et portable à la place du serveur

Trois intervalles de vérification typiques : remplissez-les avec les métriques réelles de votre hôte et ajoutez-les au README pour éviter les pièges répétés.

  • Budget premier démarrage : après démarrage à froid, attendre au moins 3 à 7 minutes avant d’ouvrir un ticket ; redémarrer avant trois minutes amplifie le 137.
  • Niveau mémoire : viser durablement plus de 2 Gio de marge disponible sur l’hôte par instance ; en dessous, monter en capacité plutôt qu’empiler les fonctions.
  • Rotation des journaux : limiter json-file Docker par exemple à ≤ 10 Mio par fichier, ≤ 3 fichiers pour éviter un disque plein comme second incident.
Avant mise en ligneCritère de réussite
01ports uniquement sur 127.0.0.118789 non joignable depuis Internet
02env_file et chemins de secrets alignésClé fournisseur lisible dans le conteneur
03mem_limit et stratégie swap documentéesTest de charge sans 137
04healthcheck.start_period ≥ 360sPas de tempête de redémarrages dans la première fenêtre
05openclaw.json gateway.mode à localClés invalides supprimées
06TLS et HSTS au proxyPas d’avertissement de contenu mixte
07allowedOrigins couvre les origines réellesPas d’erreur non-loopback dans la Control UI
08Appairage validé dans le conteneurdevices list vide ou tout approuvé
09Sauvegarde du chemin .openclaw et du numéro de versionRécupération sur une page de runbook
10Aligné avec la doc canauxCallbacks IM ou webhook joignables
yaml
services:
  openclaw:
    image: ghcr.io/openclaw/openclaw:latest
    restart: unless-stopped
    mem_limit: 2g
    ports:
      - "127.0.0.1:18789:18789"
    volumes:
      - ${HOME}/.openclaw:/home/node/.openclaw
    env_file:
      - .env
    healthcheck:
      test: ["CMD", "curl", "-f", "http://127.0.0.1:18789/health"]
      interval: 60s
      timeout: 15s
      retries: 5
      start_period: 360s

Faire tourner le Gateway en continu sur un portable subit veille, capot fermé et montée instable ; le seul accès résidentiel offre rarement un SLA mesurable. Un Mac mini cloud facturé à l’usage convient mieux aux flux hybrides OpenClaw sur VPS avec besoins graphiques ou Xcode.

Piège courant : utiliser 0.0.0.0:18789 pour « déboguer vite » ; sur un VPS public, c’est exposer la surface de contrôle aux scanners.

Pour un gateway Docker stable et les étapes lourdes sur un macOS contractuel, l’achat et la synchronisation multi-sites coûtent souvent plus que la location. Pour des nœuds vérifiables 7×24 et des tailles flexibles, la location Mac mini cloud VpsMesh est souvent préférable : dessinez la séparation VPS OpenClaw et Mac distant dédié, puis validez la capacité avec les tarifs de location et la page de commande, plus simple à contractualiser que des engagements oraux.

FAQ

Questions fréquentes

Commencer par dmesg sur l’hôte et mem_limit pour l’OOM ; prévoir la fenêtre de première compilation WASM. Croiser avec l’article OpenClaw v2026.4.

Lister l’origine HTTPS réelle dans gateway.controlUi.allowedOrigins de openclaw.json et vérifier que le proxy ne transmet pas un mauvais Host vers l’amont. Parcours complet : checklist d’installation Gateway.

Utiliser docker compose exec avec le même utilisateur et les mêmes montages que le Gateway, puis openclaw devices list. Sinon dépannage d’exécution en trois blocs. Capacité : tarifs de location, commander ; connectivité : centre d’aide.