mem_limit · healthcheck et start_period · backoff de redémarrage · rotation json-file et contrôle disque
Les équipes qui font tourner OpenClaw sur un VPS 24/7 heurtent souvent trois murs : un healthcheck trop court tue le cold start du Gateway, un mem_limit sous les pics WASM déclenche exit 137, et les journaux json-file par défaut remplissent le disque hôte. Cet article pose le plus petit jeu de différences entre compose de dev et de prod, une baseline en six étapes et quand le jitter de redémarrage impose un arrêt humain, avec des liens vers le guide Exit 137 et allowedOrigins et le texte épinglage et rollback.
En développement on supprime souvent les plafonds mémoire, on raccourcit la fenêtre de santé et on logge sur la console. En non surveillé cela devient une tempête de redémarrages : unhealthy avant que le Gateway écoute, restart: always en boucle seconde, et les journaux consomment inodes ou quota plus vite que le backoff.
OpenClaw soulève le RSS lors du premier build et chargement modèle. Un mem_limit calé sur la moyenne stable invite l’OOM killer la nuit. Chaque paramètre doit se rattacher à docker inspect ou à une métrique hôte sur le ticket.
start_period trop court : la sonde échoue avant le port 18789, l’interface montre des redémarrages sans fin.
mem_limit et pics : premier WASM ou dépendances dépasse le cgroup avec 137 et peu de logs applicatifs.
json-file illimité : callbacks et debug remplissent la racine pendant les pics de validation PR.
Restart sans backoff : mauvaise config et faux unhealthy affament CPU et IO ensemble.
Binds de dev en prod : hot reload et permissions lâches élargissent la surface des secrets.
On part de deux overrides dans le même dépôt : docker-compose.yml pour le commun, docker-compose.prod.yml uniquement pour le prod afin d’éviter la dérive copier-coller.
| Axe | Défaut dev | Baseline prod |
|---|---|---|
| Mémoire | Pas de plafond ou hôte entier | mem_limit explicite avec marge froide ; recoupement avec l’article Exit 137 |
| Healthcheck | Intervalle court, pas de start_period | start_period couvre le froid ; retries et timeout alignés au langage SLA |
| Redémarrage | unless-stopped ou absent | on-failure ou always borné plus alertes hôte |
| Driver de logs | json-file par défaut | max-size + max-file ; pas de truncate manuel |
| Volumes et secrets | Bind du code source | Config en lecture seule ; secrets via env_file ou secret Docker, pas dans l’image |
Chaque ligne prod-only doit pointer vers un panneau Grafana ou un champ ticket, sinon ce n’est qu’une liste de souhaits.
Les étapes supposent des images suivant le guide d’épinglage ; avec :latest, mesurez un froid complet sur staging avant l’override prod.
Échantillonner les pics : sur staging docker stats --no-stream et ps dans le conteneur, RSS dix minutes autour du premier Ready.
Écrire mem_limit : multiplier le pic par le facteur de sécurité convenu ; documenter la politique swap hôte.
Définir la readiness : HTTP ou CMD sur la même loopback que le Gateway.
Configurer start_period : couvrir première installation de dépendances et compilation WASM ; viser le p95 froid, pas la moyenne.
Resserer json-file : bloc logging par service avec max-size et max-file ; alerter sur le taux de croissance du répertoire de logs.
Exercer les redémarrages : injecter une sonde en échec et vérifier intervalles, backoff et paging contre le runbook.
services:
openclaw:
mem_limit: "2g"
logging:
driver: json-file
options:
max-size: "20m"
max-file: "5"
healthcheck:
test: ["CMD", "curl", "-f", "http://127.0.0.1:18789/health"]
interval: 30s
timeout: 5s
retries: 5
start_period: 180s
restart: on-failure:5
Note : les chemins de santé doivent correspondre à l’image ; si seul TCP est dispo, CMD-SHELL avec nc mais documenter le risque de faux positifs supérieur à HTTP.
Si docker events dépasse le seuil du runbook en cinq minutes, soupçonner d’abord erreur de configuration et faux unhealthy plutôt que « simplement plus de RAM ». Redémarrer aveuglément amplifie l’écriture des logs.
Si la racine est en lecture seule, retirer le trafic ou arrêter le reverse proxy puis libérer l’espace selon l’article Exit 137 ; sans santé disque, pas de compose up -d forcé sur les volumes de données.
Attention : baisser max-file fait disparaître plus vite les journaux chauds ; pour une rétention longue, expédier vers stockage objet ou hôte de logs plutôt qu’agrandir sans limite un seul fichier.
Geler les releases : fermer l’entrée du pipeline quand la tempête dépasse le seuil.
Capturer l’état : extraits Health et OOM de inspect plus deux cents lignes de logs.
Revenir en arrière : restaurer l’override précédent et conserver un paquet de repro pour post-mortem.
Les chiffres ci-dessous sont des points de départ charter et astreinte ; remplacez-les par vos histogrammes de froid réels et la courbe de croissance disque. Ne les vendez pas comme SLA client sans mesure.
Si le même VPS héberge reverse proxy ou petite base, mem_limit et l’IO des logs rivalisent avec les voisins ; la revue doit exiger RSS conteneur, mémoire libre hôte et latence d’écriture disque sur un seul tableau.
| Forme d’hôte | Départ logging | Lien avec épinglage |
|---|---|---|
| 2 vCPU / 4 Go | max-size plus petit, rétention courte, expédition agressive | Pin digest pour éviter des froids qui s’allongent par surprise |
| 4 vCPU / 8 Go | max-file un peu plus large, rotation jamais désactivée | Staging et prod tags différents mais digest identique validé |
| Charge mixte | Disque données ou volume logs séparé de la partition base | Fenêtres d’upgrade alignées sur l’article d’épinglage |
Poser OpenClaw sur un petit VPS jetable sous-financie mémoire, disque et rotation des secrets à la fois ; le DIY bare metal échange cela contre risque ligne et alimentation.
Les équipes qui ont besoin de capacité contractuelle, régions au choix et bande passante auditable tout en gardant Gateway et canaux observables en 24/7 trouvent souvent un meilleur compromis avec des Mac mini cloud loués ; la location cloud Mac mini VpsMesh regroupe baseline Compose, proxy inverse et sauvegardes dans un même récit de capacité.
Vérifiez utilisateur et PATH de la sonde et start_period pour le froid ; comparez la loopback au article allowedOrigins et reverse proxy.
Commencer par dmesg hôte et code de sortie, rééchantillonner les pics puis ajuster la limite ; détails dans l’article Exit 137. Tarifs sur la page tarifs.
La fenêtre chaude locale raccourcit ; pour une rétention longue, basculez vers un stockage central. Politiques au centre d’aide.