Sauvegarder son agent sur Google Drive
Protégez l'identité, les souvenirs et les configurations de votre agent avec un backup automatique quotidien.
1Pourquoi sauvegarder ?
Votre agent OpenClaw accumule une identité, des souvenirs, des compétences et des configurations. Si l'instance tombe, tout est perdu — sauf si vous avez un backup. Ce guide explique comment mettre en place un backup quotidien automatique sur Google Drive, avec des contraintes de sécurité strictes.
2Ce qu'on sauvegarde
Le workspace de l'agent contient tout ce qui fait « lui » :
| Fichier | Rôle |
|---|---|
SOUL.md | Personnalité, ton, style |
USER.md | Informations sur l'utilisateur |
MEMORY.md | Mémoire long terme |
IDENTITY.md | Nom, avatar, voix |
TOOLS.md | Configuration des outils |
AGENTS.md | Règles de fonctionnement |
memory/ | Notes quotidiennes, conversations |
skills/ | Compétences acquises |
scripts/ | Scripts opérationnels |
.*credentials* | Clés API des services connectés |
openclaw.json | Configuration du gateway |
💡 En excluant les fichiers lourds (images, vidéos, PDF, node_modules), l'archive pèse typiquement moins de 1 Mo.
3Prérequis
- • Un compte Google One (quota de stockage personnel)
- • Un projet Google Cloud (gratuit)
- • Node.js et le package googleapis
4Créer un projet Google Cloud
- 1Allez sur console.cloud.google.com
- 2Créez un nouveau projet (nom libre)
- 3Activez l'API Google Drive : Menu → API et services → Bibliothèque → cherchez "Google Drive API" → Activer
5Configurer OAuth (pas un compte de service !)
⚠️ Les comptes de service Google ont 0 octet de quota de stockage sur les comptes personnels (Google One). Ils peuvent lire les fichiers partagés, mais pas en créer. L'upload échoue systématiquement avec l'erreur « Service Accounts do not have storage quota ». Il faut impérativement utiliser l'OAuth utilisateur pour que les fichiers soient créés sous votre quota.
Configurer l'écran de consentement
- 1. Console Google Cloud → API et services → Écran de consentement OAuth
- 2. Type : Externe → Créer
- 3. Nom de l'app : nom de votre agent
- 4. Email d'assistance et email développeur : votre email
- 5. Enregistrer et continuer (pas besoin de scopes ni domaines)
- 6. Page Utilisateurs tests → ajoutez votre email Google One
Créer un ID client OAuth
- 1. Console → API et services → Identifiants
- 2. + Créer des identifiants → ID client OAuth
- 3. Type : Application de bureau
- 4. Notez l'ID client et le Secret client
Obtenir le token
Construisez cette URL (remplacez CLIENT_ID) :
https://accounts.google.com/o/oauth2/v2/auth?client_id=CLIENT_ID&redirect_uri=urn:ietf:wg:oauth:2.0:oob&response_type=code&scope=https://www.googleapis.com/auth/drive.file&access_type=offline&prompt=consent💡 Scope drive.file uniquement — ne donne accès qu'aux fichiers créés par l'application. Votre agent ne pourra ni lire ni modifier vos autres fichiers Drive. N'utilisez jamais le scope drive complet sans raison impérieuse.
- 1. Ouvrez l'URL dans un navigateur
- 2. Connectez-vous avec votre compte Google One
- 3. Autorisez (ignorez l'avertissement « app non vérifiée » — c'est la vôtre)
- 4. Copiez le code d'autorisation affiché
Échangez le code contre un token :
curl -s -X POST https://oauth2.googleapis.com/token \
-d "code=VOTRE_CODE" \
-d "client_id=VOTRE_CLIENT_ID" \
-d "client_secret=VOTRE_SECRET" \
-d "redirect_uri=urn:ietf:wg:oauth:2.0:oob" \
-d "grant_type=authorization_code"Sauvegardez le refresh_token dans un fichier sécurisé :
{
"client_id": "...",
"client_secret": "...",
"refresh_token": "...",
"scope": "drive.file"
}chmod 600 .google-oauth-token.json6Créer le dossier de destination
- 1. Dans Google Drive, créez un dossier pour les backups
- 2. Notez son Folder ID (le code dans l'URL : drive.google.com/drive/folders/FOLDER_ID)
7Le script de backup
Créez le fichier scripts/backup-to-drive.js avec le contenu suivant :
#!/usr/bin/env node
const { google } = require('googleapis');
const fs = require('fs');
const { execSync } = require('child_process');
// === CONFIGURATION ===
const PARENT_FOLDER = 'VOTRE_FOLDER_ID';
const BACKUP_FOLDER_NAME = 'Agent-Backups';
const MAX_BACKUPS = 7; // rotation sur 7 jours
const TOKEN_FILE = '/chemin/vers/.google-oauth-token.json';
const WORKSPACE = '/chemin/vers/workspace';
const CONFIG_FILE = '/chemin/vers/openclaw.json';
async function main() {
// Auth OAuth
const creds = JSON.parse(fs.readFileSync(TOKEN_FILE));
const auth = new google.auth.OAuth2(creds.client_id, creds.client_secret);
auth.setCredentials({ refresh_token: creds.refresh_token });
const drive = google.drive({ version: 'v3', auth });
// Trouver ou créer le sous-dossier de backups
let backupFolderId;
const search = await drive.files.list({
q: `'${PARENT_FOLDER}' in parents and name='${BACKUP_FOLDER_NAME}' and mimeType='application/vnd.google-apps.folder' and trashed=false`,
fields: 'files(id)'
});
if (search.data.files.length > 0) {
backupFolderId = search.data.files[0].id;
} else {
const f = await drive.files.create({
requestBody: {
name: BACKUP_FOLDER_NAME,
mimeType: 'application/vnd.google-apps.folder',
parents: [PARENT_FOLDER]
},
fields: 'id'
});
backupFolderId = f.data.id;
}
// Construire l'archive (fichiers texte essentiels uniquement)
const BACKUP_DIR = '/tmp/agent-backup';
const date = new Date().toISOString().slice(0, 10);
const archiveName = `agent-backup-${date}.tar.gz`;
const archivePath = `${BACKUP_DIR}/${archiveName}`;
execSync(`rm -rf ${BACKUP_DIR} && mkdir -p ${BACKUP_DIR}`);
execSync(`cp ${CONFIG_FILE} ${BACKUP_DIR}/openclaw.json`);
// Lister uniquement les fichiers texte essentiels (< 5 Mo)
execSync(`cd $(dirname ${WORKSPACE}) && find $(basename ${WORKSPACE}) \\
\\( -name "*.md" -o -name "*.js" -o -name "*.json" -o -name "*.sh" \\
-o -name "*.txt" -o -name "*.yaml" -o -name "*.yml" \\
-o -name "*credentials*" \\) \\
-not -path "*/node_modules/*" \\
-not -path "*/.git/*" \\
-size -5M \\
> ${BACKUP_DIR}/filelist.txt`);
execSync(`tar czf ${archivePath} \\
-C $(dirname ${WORKSPACE}) -T ${BACKUP_DIR}/filelist.txt \\
-C ${BACKUP_DIR} openclaw.json 2>/dev/null || true`,
{ maxBuffer: 50 * 1024 * 1024 });
// Upload sur Drive
const upload = await drive.files.create({
requestBody: {
name: archiveName,
parents: [backupFolderId]
},
media: {
mimeType: 'application/gzip',
body: fs.createReadStream(archivePath)
},
fields: 'id, name, size'
});
const sizeMo = (fs.statSync(archivePath).size / 1024 / 1024).toFixed(1);
console.log(`✅ ${upload.data.name} (${sizeMo} Mo) → Drive`);
// Nettoyage local
execSync(`rm -rf ${BACKUP_DIR}`);
// Rotation : garder les N derniers backups
const backups = await drive.files.list({
q: `'${backupFolderId}' in parents and trashed=false`,
fields: 'files(id, name, createdTime)',
orderBy: 'createdTime desc',
pageSize: 100
});
for (const f of backups.data.files.slice(MAX_BACKUPS)) {
await drive.files.delete({ fileId: f.id });
console.log(`🗑️ Supprimé : ${f.name}`);
}
}
main().catch(e => { console.error('❌', e.message); process.exit(1); });8Automatiser avec un cron OpenClaw
Dans votre session agent, créez un cron job :
Schedule : 0 22 * * * (UTC) — adaptez à votre fuseau
Payload : agentTurn → "Exécute le backup : node scripts/backup-to-drive.js"
Session : isolatedLe backup s'exécute chaque nuit, uploade l'archive sur Drive, et supprime les backups de plus de 7 jours.
9Restaurer
En cas de perte de l'instance :
- 1. Installez une nouvelle instance OpenClaw
- 2. Téléchargez le dernier backup depuis Google Drive
- 3. Décompressez dans ~/.openclaw/ :
tar xzf agent-backup-YYYY-MM-DD.tar.gz -C ~/.openclaw/
cp openclaw.json /data/openclaw/openclaw.json4. Relancez OpenClaw — votre agent revient identique
10Bonnes pratiques de sécurité
| Règle | Pourquoi |
|---|---|
Scope drive.file uniquement | L'agent ne voit que les fichiers qu'il a créés — pas le reste de votre Drive |
Token OAuth, pas compte de service | Le compte de service a 0 quota sur les comptes personnels |
chmod 600 sur les credentials | Empêche la lecture par d'autres utilisateurs du système |
Rotation des backups | Évite l'accumulation (7 jours = bon compromis) |
Révoquer les anciens tokens | Si vous changez de scope, révoquez l'ancien token |
Ne jamais utiliser le scope drive complet | Sauf besoin explicite de lire des fichiers existants |
11Résumé de l'architecture
Votre Google Drive (20 To)
└── Dossier partagé
└── Agent-Backups/
├── agent-backup-2026-03-07.tar.gz (0.4 Mo)
├── agent-backup-2026-03-06.tar.gz
└── ... (7 derniers jours)
Scope: drive.file
✅ Créer/modifier ses propres fichiers
❌ Lire vos autres fichiers
❌ Accéder au reste du Drive