Prérequis et partitionnement de l'environnement
Commencez par un compte utilisateur de service (pas une session interactive partagée) : les permissions, les LaunchAgents et les chemins restent identiques entre les sessions SSH et les jobs CI. Même avec un seul disque physique, séparez conceptuellement un palier chaud (dossier ou volume APFS sur NVMe interne, latence faible pour petits shards et métadonnées) et un palier tiède (USB4/Thunderbolt, second volume ou partage en lecture pour archives peu sollicitées).
Documentez toutes les variables que votre build OpenClaw et les runtimes modèles lisent : répertoire de configuration, HF_HOME, OLLAMA_MODELS, caches llama.cpp, etc. Alignez les noms sur le guide d'installation et dépannage OpenClaw pour que chaque membre de l'équipe recrée la même arborescence. Vérifiez que les points de montage survivent au redémarrage : évitez de dépendre d'un /Volumes/Sans titre renommé aléatoirement ; préférez des noms de volume figés ou des chemins sous /Users/service/... avec lien symbolique vers le média externe une fois monté.
- Figer Node (ex. 22 LTS) et la semver OpenClaw ; les noter dans un runbook interne versionné.
- Créer
~/Library/Logs/OpenClawCache/en755pour l'utilisateur de service. - Déclarer les variables dans
EnvironmentVariablesdu plist launchd — jamais de secrets dans le dépôt Git. - Contrôler
diskutil apfs listet un reboot de validation : tous les volumes attendus montés avant le premier job.
| Critère | Choix recommandé | À éviter |
|---|---|---|
| Isolation OS / cache | Volume ou quota logique séparé pour les poids | Remplir le même APFS que le système sans marge |
| Multi-locataire | Un utilisateur service par tenant ou symlink par runner | Un seul HOME partagé sans convention de chemin |
| Documentation | Table « variable → chemin → volume physique » | Chemins copiés depuis un poste portable local |
Chemins de cache et schéma par paliers
Choisissez un seul chemin canonique que tous les scripts CI invoquent (par ex. ~/.openclaw/cache/models). Sur disque, stockez les blobs sous des racines par palier : /Volumes/FastSSD/oc-models pour le chaud, /Volumes/BulkDisk/oc-archive pour l'archive. Remplacez le répertoire canonique par un lien symbolique vers le palier chaud : les jobs n'embarquent plus de lettre de volume en dur.
# Exemple : arrêter les jobs OpenClaw, puis pointer le canonique vers le palier rapide mkdir -p "/Volumes/FastSSD/oc-models" rm -rf "$HOME/.openclaw/cache/models" ln -s "/Volumes/FastSSD/oc-models" "$HOME/.openclaw/cache/models" readlink -f "$HOME/.openclaw/cache/models"
Promouvez un modèle du tiède vers le chaud avec rsync -a --partial --inplace ou un mv atomique sur le même volume APFS. Dégradez les poids froids dans l'autre sens après avoir noté empreintes ou manifest semver. Placez les répertoires temporaires de téléchargement sur le même volume que la destination finale pour éviter les erreurs « cross-device link » au rename.
| Décision | Palier chaud (interne) | Palier tiède (bulk) |
|---|---|---|
| Objectif latence | Lecture p95 faible pour shards actifs | Acceptable pour modèles rarement servis |
| Symlink au chemin canonique | Défaut pour la piste active | Second lien seulement si le chaud est plein |
| Risque runner partagé | Symlink par utilisateur ou par file d'attente | Miroir lecture seule organisationnel |
Liste de contrôle — arborescence cache
- Le symlink canonique existe après reboot (
readlinkdans le préflight CI). - Tmp et blobs finaux partagent le volume pour rename sans copie.
- Les noms de manifest / lockfile portent la version du modèle — le script de purge les respecte.
- Les arbres « petits fichiers » (nombreux inodes) sont suivis à part des quelques fichiers multi-Go.
Nettoyage planifié et rotation des journaux
Ne supprimez pas aveuglément pendant que des processus gardent des mmap ouverts. Définissez une fenêtre de nettoyage hors charge CI — souvent 02h00–04h00 heure locale sur les pools Mac distants. Sur macOS, un LaunchAgent avec StartCalendarInterval (heure et minute) est en général plus prévisible qu'un crontab pour les runners par utilisateur : PATH, session et plist sont cohérents avec le reste d'OpenClaw.
| Planificateur | Cas d'usage | Piège fréquent |
|---|---|---|
| LaunchAgent + StartCalendarInterval | Runner Mac par utilisateur, audit plist | Plists dupliquées si plusieurs admins éditent |
| crontab | Parité avec docs Linux | PATH minimal, pas de session GUI, dérive permissions |
| Script déclenché par CI (SSH) | Politique centralisée dans Git | Chevauchement fuseaux — ajouter mutex ou file |
Pour la rotation des journaux, écrivez la sortie du script vers ~/Library/Logs/OpenClawCache/cleanup-$(date +%F).log et ajoutez une entrée /etc/newsyslog.d/ ou une passe gzip hebdomadaire dans le même intervalle. Conservez au moins sept jours de sortie standard : elles expliquent les « cache miss » soudains après une purge.
#!/bin/bash set -euo pipefail # Exemple : gardes optionnelles — ne pas purger si la passerelle tourne # pgrep -f openclaw-gateway >/dev/null && exit 0 find "$HOME/.openclaw/cache/tmp" -type f -mtime +3 -delete find "$HOME/.openclaw/cache/tmp" -type d -empty -delete
Erreur fréquente : « Text file busy » ou échec silencieux — le job suivant retélécharge tout. Ajoutez un verrou fichier (flock) ou testez lsof sur le répertoire cible avant toute suppression récursive.
Quotas et seuils de remplissage disque
Combinez l'idée de quota (soft limit sur volume ou politique interne Go/TiB) avec un script de patrouille qui parse df -P. Matrice simple pour des runners Apple Silicon partagés en 2026 :
| Utilisation | Action | Canal d'alerte |
|---|---|---|
| ≥ 80 % | Notification + planifier nettoyage prochaine fenêtre | Webhook / Slack INFO |
| ≥ 85 % | Bloquer nouveaux pulls « expérimentaux » | Pager WARNING |
| ≥ 90 % | Éviction LRU sur tmp + relégation vers palier tiède | Pager CRITICAL |
Si l'hôte expose des quotas par volume, placez le soft limit un peu sous la capacité marketing : les instantanés APFS et la marge pour les mises à jour système consomment vite les derniers pourcents. Exécutez toujours df -h et df -i : une saturation d'inodes ressemble à un disque plein mais ne disparaît pas en effaçant un seul gros fichier.
Automatisation d'alerte : un script cron toutes les 5–15 minutes qui compare le pourcentage au palier et envoie une charge utile JSON (hôte, volume, inode %, chemin canonique résolu) évite les tickets « pourquoi le pull a échoué hier soir ».
Nouvelles tentatives en échec et dépannage
Enrobez les téléchargements d'un backoff exponentiel plafonné (ex. 5 s, 15 s, 45 s) avec jitter : une flotte de Mac distants ne doit pas marteler le même miroir en phase. En cas d'échec, parcourez la liste suivante avant de rouvrir le débit :
- ENOSPC / disque plein — contrôlez le volume cible du symlink, pas seulement
dfsur$HOME. - Descripteur de fichier obsolète — remontez le disque externe ; vérifiez l'ordre de déverrouillage FileVault au boot.
- HTTP 429 / 5xx — politique amont ; baissez la concurrence et respectez
Retry-After. - Permission denied — comparez umask et propriétaire du service ; après une mise à jour macOS, relancez
openclaw doctor.
Croisez avec les schémas de reprise après échec et retry OpenClaw pour ne pas enfermer l'automatisation dans une boucle contre une passerelle instable. Côté sécurité et exposition, gardez la durcissement passerelle alignée avec vos fenêtres de maintenance cache.
Liste de contrôle d'acceptation en production
- Après boot à froid, le symlink canonique est résolu avant le premier job (test automatisé).
- Le script de patrouille affiche l'utilisation lisible et sort en non-zéro si le palier rapide dépasse 90 %.
- Deux exécutions « dry-run » du nettoyage sont archivées avec identifiant de ticket ; le mode destructif n'est activé qu'après.
- La CI ne référence que le chemin canonique — aucune URL de montage en dur dans les pipelines.
- Le document de rollback décrit comment repointer le symlink vers le palier tiède en moins de cinq minutes.
Synthèse et suite
Synthèse : des tirages OpenClaw fiables sur Mac distant reposent sur un chemin canonique unique, un palier chaud derrière symlink, une archive tiède documentée, des fenêtres de nettoyage pilotées par LaunchAgent (ou politique CI), des journaux rotatifs et des seuils disque explicites (80 / 85 / 90 %). Versionnez les plist et scripts, exigez des dry-runs, et séparez les retry réseau des urgences ENOSPC.
Poursuivre sans compte : centre d'aide MacPull, tarifs, page d'achat pour louer un nœud Apple Silicon avec NVMe prévisible, blog technique (guides OpenClaw, CI, cache). Toutes ces pages sont consultables sans connexion.
Un Mac distant dédié avec marge SSD et fenêtres de maintenance claires est le cadre le plus simple pour garder ce runbook reproductible semaine après semaine.
Besoin de marge disque pour OpenClaw ?
Mac mini cloud, SSH stable, NVMe rapide — appliquez symlink, paliers et nettoyage sans bruit multitenant. Tarifs, achat et guides accessibles sans login.