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 » :

FichierRôle
SOUL.mdPersonnalité, ton, style
USER.mdInformations sur l'utilisateur
MEMORY.mdMémoire long terme
IDENTITY.mdNom, avatar, voix
TOOLS.mdConfiguration des outils
AGENTS.mdRègles de fonctionnement
memory/Notes quotidiennes, conversations
skills/Compétences acquises
scripts/Scripts opérationnels
.*credentials*Clés API des services connectés
openclaw.jsonConfiguration 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

  1. 1Allez sur console.cloud.google.com
  2. 2Créez un nouveau projet (nom libre)
  3. 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. 1. Console Google Cloud → API et services → Écran de consentement OAuth
  2. 2. Type : Externe → Créer
  3. 3. Nom de l'app : nom de votre agent
  4. 4. Email d'assistance et email développeur : votre email
  5. 5. Enregistrer et continuer (pas besoin de scopes ni domaines)
  6. 6. Page Utilisateurs tests → ajoutez votre email Google One

Créer un ID client OAuth

  1. 1. Console → API et services → Identifiants
  2. 2. + Créer des identifiants → ID client OAuth
  3. 3. Type : Application de bureau
  4. 4. Notez l'ID client et le Secret client

Obtenir le token

Construisez cette URL (remplacez CLIENT_ID) :

url
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. 1. Ouvrez l'URL dans un navigateur
  2. 2. Connectez-vous avec votre compte Google One
  3. 3. Autorisez (ignorez l'avertissement « app non vérifiée » — c'est la vôtre)
  4. 4. Copiez le code d'autorisation affiché

Échangez le code contre un token :

bash
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é :

json
{
  "client_id": "...",
  "client_secret": "...",
  "refresh_token": "...",
  "scope": "drive.file"
}
bash
chmod 600 .google-oauth-token.json

6Créer le dossier de destination

  1. 1. Dans Google Drive, créez un dossier pour les backups
  2. 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 :

javascript
#!/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 : isolated

Le 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. 1. Installez une nouvelle instance OpenClaw
  2. 2. Téléchargez le dernier backup depuis Google Drive
  3. 3. Décompressez dans ~/.openclaw/ :
bash
tar xzf agent-backup-YYYY-MM-DD.tar.gz -C ~/.openclaw/
cp openclaw.json /data/openclaw/openclaw.json

4. Relancez OpenClaw — votre agent revient identique

10Bonnes pratiques de sécurité

RèglePourquoi
Scope drive.file uniquementL'agent ne voit que les fichiers qu'il a créés — pas le reste de votre Drive
Token OAuth, pas compte de serviceLe compte de service a 0 quota sur les comptes personnels
chmod 600 sur les credentialsEmpêche la lecture par d'autres utilisateurs du système
Rotation des backupsÉvite l'accumulation (7 jours = bon compromis)
Révoquer les anciens tokensSi vous changez de scope, révoquez l'ancien token
Ne jamais utiliser le scope drive completSauf 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
Guide rédigé à partir d'une mise en place réelle sur OpenClaw, mars 2026.