Une petite instance Linux dans le nuage peut héberger plus d’un déploiement de type OpenClaw Gateway : bot de production, passerelle de préproduction et expérimentation personnelle — chacun avec ses jetons, sa configuration et son adresse d’écoute. Le scénario d’échec n’est pas « Linux ne sait pas multitâcher » ; ce sont les ports qui se marchent dessus, les répertoires d’état partagés et les unités systemd qui se disputent le même utilisateur ou le même répertoire de travail. Ce mémo propose un schéma reproductible : une matrice de ports, des unités systemd --user par profil, une isolation explicite des répertoires OPENCLAW_*, et une FAQ courte sur les conflits que nous voyons encore en 2026.
Pourquoi plusieurs profils en parallèle sur un même hôte ?
Des VM séparées coûtent cher et consomment des IPv4 ; des conteneurs distincts partagent encore l’espace de ports du noyau si le mapping n’est pas rigoureux. Des profils parallèles sur un VPS fonctionnent lorsque chaque profil possède un port d’attache non recouvrant, un utilisateur ou un home dédié pour les permissions fichiers, et un préfixe d’environnement documenté afin qu’aucun opérateur ne colle le mauvais jeton dans la mauvaise unité. Traitez le « profil » comme un concept d’exploitation : prod / préprod / dev, ou équipe A contre équipe B — et non comme trois copies du même chemin de configuration par défaut.
Matrice de ports : adresses d’écoute avant reverse proxy
Tranchez loopback contre exposition publique avant d’activer le TLS en frontal. Beaucoup d’équipes gardent chaque Gateway sur 127.0.0.1 avec Nginx ou Caddy sur 0.0.0.0:443 ; les profils parallèles ne diffèrent alors que par le port loopback. Si vous devez exposer HTTP directement, étendez la matrice avec des règles pare-feu par groupe de sécurité. Pour les modes d’exposition et le compromis tunnel SSH contre HTTPS public, voir 2026 — OpenClaw Linux, VPS cloud : surface d’attaque minimale — pare-feu, loopback Gateway, tunnel SSH ; matrice vs HTTPS public et FAQ L0–L3.
| Profil | Liaison HTTP | Notes |
|---|---|---|
prod |
127.0.0.1:18789 |
Nom d’unité stable ; amont équilibré de charge figé |
stage |
127.0.0.1:18790 |
Ne jamais réutiliser les jetons prod ; unité systemd séparée |
dev |
127.0.0.1:18791 |
Option : restreindre au VPN ou au tunnel SSH uniquement |
Unités systemd utilisateur : linger, slices et journaux
Des services systemd --user sous des comptes Linux distincts donnent des frontières journalctl --user -u … nettes sans encombrer /etc/systemd/system. Activez loginctl enable-linger pour les comptes de service qui doivent survivre à la déconnexion. Associez chaque unité à WorkingDirectory= et EnvironmentFile= pointant vers un fragment propre au profil, afin qu’un daemon-reload ne fusionne jamais deux profils par erreur. Si vous préférez le niveau system, utilisez des unités modèle ([email protected]) — l’invariant reste le même : un nœud du graphe d’unités par profil, une ligne de port dans la matrice.
# /etc/openclaw/prod.env — mode 640, propriétaire = utilisateur du service OPENCLAW_STATE_DIR=/var/lib/openclaw/prod OPENCLAW_CONFIG_PATH=/etc/openclaw/prod.yaml # Écoute Gateway — doit coller à la matrice de ports OPENCLAW_GATEWAY_BIND=127.0.0.1:18789
Répertoires OPENCLAW_* : isoler l’état, pas seulement la config
Les fichiers de configuration sont visibles ; l’état d’exécution (sessions, caches locaux, artefacts téléchargés) est là où la contamination silencieuse apparaît. Fixez OPENCLAW_STATE_DIR (et les variables compagnes documentées par votre distribution) sur des chemins disjoints par profil — par exemple /var/lib/openclaw/prod contre /var/lib/openclaw/stage — et appliquez le propriétaire du compte de service correspondant. Sauvegardes et quotas disque suivent alors le rayon d’explosion : effacer la préprod ne touche pas aux jetons prod sur disque.
~/.config ou ~/.local/share selon l’empaquetage — fixez toujours des chemins explicites dans l’environnement pour les profils parallèles.
Check-list de déploiement reproductible
Versionnez la matrice de ports et les fichiers d’environnement dans le même dépôt qu’Ansible ou cloud-init. Appliquez les changements avec systemctl --user daemon-reload (ou rechargement du modèle system), puis systemctl restart les profils dans l’ordre des dépendances : d’abord les prérequis, en dernier les écouteurs en périphérie. Documentez un seul retour arrière : révision précédente du fichier env et fragment d’unité précédent. La persistance diffère de launchd sur macOS ; pour un modèle mental côte à côte lorsque vous opérez aussi des Mac dans le nuage, lisez Déployer OpenClaw sur un Mac cloud en 2026 : validations macOS face à un VPS Linux, persistance launchd et FAQ de dépannage reproductible.
Test de fumée après ajout d’un profil
Avant d’annoncer à l’équipe un nouvel écoute Gateway opérationnel, enchaînez trois paliers pour garder les tickets courts. D’abord, vérifiez avec ss -lntp que seuls les sockets prévus sont ouverts et que chaque PID correspond à l’unité attendue via systemctl status. Ensuite, appelez la ligne loopback de la matrice avec curl sur un chemin de santé ou de version que votre Gateway expose, pas seulement la racine. Enfin, testez le nom public derrière le reverse proxy et comparez les en-têtes de réponse à la sonde loopback directe — un décalage signifie presque toujours une dérive de port amont, pas le TLS.
ss -lntp | grep -E '18789|18790|18791' curl -svS http://127.0.0.1:18789/health curl -svS https://prod-gateway.example.com/health
Lorsque tout semble « sain » mais que la mauvaise automatisation part, comparez l’environnement effectif vu par l’unité : systemctl show pour le bloc service, puis confrontez au fichier env versionné. La dérive silencieuse après retouches manuelles sur l’hôte est la principale raison pour laquelle dépôt et machine vivante divergent au bout d’un mois d’astreinte.
FAQ : conflits que nous déboguons en parallèle
« Address already in use » après reboot — une session utilisateur résiduelle a laissé une seconde copie hors systemd ; utilisez ss -lntp et rattachez les PID aux unités. Le mauvais bot répond en préproduction — chemin de fichier de jeton réutilisé ; grepez les unités pour des EnvironmentFile dupliqués. Un profil remplit le disque du VPS — quota ou rotation des journaux par OPENCLAW_STATE_DIR, pas globalement. HTTPS ne fonctionne que pour un nom d’hôte — le bloc amont du proxy pointe vers la mauvaise ligne de port loopback ; corrigez la matrice, pas ACME.
Linux pour les passerelles, Mac cloud pour la boucle complète
Des profils OpenClaw parallèles sur un VPS Linux s’alignent naturellement sur une faible conso à vide, des IP statiques et un cycle de vie systemd prévisible — les mêmes raisons qui poussent les équipes à colocaliser bots toujours actifs et charges en rafale. Quand l’autre moitié du flux exige Xcode, la signature ou des CLI Apple-only, un Mac mini cloud VPSSpark offre macOS natif avec l’ergonomie Unix : Homebrew, SSH et conteneurs sans les frictions fréquentes sur Windows, tandis que la mémoire unifiée Apple Silicon évite que les builds interactifs ne saturent.
La stabilité de macOS, Gatekeeper et SIP limitent les surprises par rapport aux postes ad hoc, et l’idle d’environ 4W du Mac mini M4 rend raisonnable une machine d’appoint toujours allumée à côté de votre VPS.
Si vous séparez passerelles Linux permanentes et travail réservé à Apple, le Mac mini M4 cloud VPSSpark fait office de pont pratique — découvrez les offres et gardez les deux moitiés de la pile sur des bases solides.