Sauvegarde automatique avec Restic + Backblaze B2

Sauvegarde automatique avec Restic + Backblaze B2

Mettez en place des sauvegardes chiffrées, déduplicatées et incrémentales vers Backblaze B2. Restic est l'outil de référence : chiffrement AES-256, snapshots versionnés, restauration granulaire, 6$/TB/mois sur B2.

Introduction

Backuper un VPS sans stratégie revient à ne pas backuper du tout. Les vrais besoins :

  • Chiffrement côté client (le provider ne peut pas lire vos données)
  • Déduplication (1 To de données → 50 Go transférés)
  • Versioning (récupérer un fichier d'il y a 3 jours)
  • Off-site (catastrophe data center = données sauves)
  • Pas cher (Backblaze B2 : 6$/TB/mois, transferts gratuits dans certaines limites)

Restic coche toutes les cases. Combiné à Backblaze B2 (S3-compatible mais 4x moins cher qu'AWS S3), c'est le combo gagnant.

Prérequis

  • VPS Linux à backuper
  • Compte Backblaze B2 (https://www.backblaze.com/b2) avec un bucket créé
  • Une Application Key B2 avec accès au bucket

Étape 1 : Créer le bucket B2

  1. Sur Backblaze, B2 Cloud Storage → Buckets → Create a Bucket
  2. Nom : verycloud-srv-web-01-backups (unique sur B2)
  3. Files in Bucket are : Private
  4. Object Lock : Disable (ou activez pour de la conformité)

Puis App Keys → Add a New Application Key :

  • Name : restic-srv-web-01
  • Allow access to : votre bucket spécifique
  • Type of Access : Read and Write

Vous obtenez keyID et applicationKey. Sauvegardez-les : la clé n'est affichée qu'une fois.

Étape 2 : Installer Restic

sudo apt update
sudo apt install -y restic
restic version

Restic des dépôts est souvent en retard. Pour la dernière version :

sudo restic self-update

Étape 3 : Configurer les variables d'env

Créez un fichier de credentials :

sudo nano /root/.restic-env
# Repository B2
export RESTIC_REPOSITORY="b2:verycloud-srv-web-01-backups:/"

# Credentials B2
export B2_ACCOUNT_ID="VOTRE_KEY_ID"
export B2_ACCOUNT_KEY="VOTRE_APPLICATION_KEY"

# Mot de passe du repo (chiffrement)
# ⚠️ Générez-le et SAUVEGARDEZ-LE HORS DU VPS. Sans ce mot de passe, vos backups sont irrécupérables.
export RESTIC_PASSWORD="UnMotDePasseUltraLong_Aleatoire_AvecChars$peciaux!_2024"
sudo chmod 600 /root/.restic-env

Étape 4 : Initialiser le repository

source /root/.restic-env
sudo restic init

Réponse type :

created restic repository abc123def at b2:verycloud-srv-web-01-backups:/

Please note that knowledge of your password is required to access
the repository. Losing your password means that your data is irrecoverably lost.

⚠️ Sauvegardez le mot de passe dans Bitwarden, KeePass ou un coffre-fort externe. Aucune récupération possible sans.

Étape 5 : Premier backup

source /root/.restic-env
sudo restic backup /etc /home /var/www /opt --tag manual

Sortie type :

repository abc123 opened
created new cache in /root/.cache/restic
no parent snapshot found, will read all files

Files:       12450 new,     0 changed,     0 unmodified
Dirs:         1245 new,     0 changed,     0 unmodified
Added to the repo: 1.234 GiB

processed 12450 files, 1.456 GiB in 0:42
snapshot abc12345 saved

Le premier backup transfère tout. Les suivants seront incrémentaux et déduplicatés : seuls les nouveaux blocs sont uploadés.

Étape 6 : Lister les snapshots

source /root/.restic-env
sudo restic snapshots
ID        Time                 Host         Tags     Paths
----------------------------------------------------------------------
abc12345  2026-05-16 03:00:00  srv-web-01   manual   /etc /home /var/www /opt
def67890  2026-05-17 03:00:00  srv-web-01   daily    /etc /home /var/www /opt

Étape 7 : Script de backup automatisé

sudo nano /usr/local/bin/restic-backup.sh
#!/bin/bash
set -e

# Charger les credentials
source /root/.restic-env

# Logging
LOG_FILE=/var/log/restic-backup.log
exec >> $LOG_FILE 2>&1

echo "========================================"
echo "Backup démarré : $(date)"
echo "========================================"

# Dump MySQL si présent
if systemctl is-active --quiet mariadb || systemctl is-active --quiet mysql; then
    echo "Dump MySQL..."
    mkdir -p /var/backups/mysql
    mysqldump -u root --all-databases --single-transaction \
        | gzip > /var/backups/mysql/all-$(date +%F).sql.gz
    
    # Garder seulement le dernier dump local
    find /var/backups/mysql -name "*.sql.gz" -mtime +1 -delete
fi

# Dump PostgreSQL si présent
if systemctl is-active --quiet postgresql; then
    echo "Dump PostgreSQL..."
    mkdir -p /var/backups/postgres
    sudo -u postgres pg_dumpall \
        | gzip > /var/backups/postgres/all-$(date +%F).sql.gz
    find /var/backups/postgres -name "*.sql.gz" -mtime +1 -delete
fi

# Backup Restic
echo "Backup Restic en cours..."
restic backup \
    /etc \
    /home \
    /root \
    /var/www \
    /var/backups \
    /opt \
    --tag daily \
    --exclude '/home/*/.cache' \
    --exclude '/var/www/*/cache' \
    --exclude '*.log' \
    --exclude 'node_modules' \
    --exclude '__pycache__'

# Rotation (forget)
echo "Rotation des anciens snapshots..."
restic forget \
    --keep-daily 7 \
    --keep-weekly 4 \
    --keep-monthly 6 \
    --keep-yearly 2 \
    --prune

# Vérifier l'intégrité (rapide)
echo "Vérification rapide..."
restic check --read-data-subset 5%

echo "Backup terminé : $(date)"
echo ""
sudo chmod +x /usr/local/bin/restic-backup.sh

Étape 8 : Planifier en cron

sudo crontab -e
# Backup quotidien à 3h du matin
0 3 * * * /usr/local/bin/restic-backup.sh

# Vérification complète une fois par semaine
0 5 * * 0 source /root/.restic-env && restic check --read-data

Pour recevoir le rapport par email :

0 3 * * * /usr/local/bin/restic-backup.sh && mail -s "Backup OK $(hostname)" [email protected] < /var/log/restic-backup.log

Étape 9 : Restaurer un fichier précis

source /root/.restic-env

# Lister les snapshots
sudo restic snapshots

# Voir le contenu d'un snapshot
sudo restic ls abc12345

# Trouver un fichier dans tous les snapshots
sudo restic find "wp-config.php"

# Restaurer un fichier vers /tmp/restore
sudo restic restore abc12345 --target /tmp/restore --include /var/www/site.fr/wp-config.php

# Restaurer entièrement un snapshot
sudo restic restore latest --target /tmp/restore-full

Étape 10 : Monter un snapshot comme système de fichiers

Très pratique pour fouiller dans une sauvegarde sans tout restaurer :

mkdir /mnt/restic-mount
sudo restic mount /mnt/restic-mount &

Vous pouvez maintenant naviguer dans /mnt/restic-mount/snapshots/ avec ls, cp, etc.

Pour démonter :

sudo umount /mnt/restic-mount

Étape 11 : Politiques de rétention typiques

Pour un VPS web standard

restic forget \
    --keep-daily 7 \
    --keep-weekly 4 \
    --keep-monthly 6 \
    --keep-yearly 2 \
    --prune

→ 7 derniers jours, 4 dernières semaines, 6 derniers mois, 2 dernières années.

Pour une base de données critique

restic forget \
    --keep-hourly 24 \
    --keep-daily 14 \
    --keep-weekly 8 \
    --keep-monthly 12 \
    --keep-yearly 5 \
    --prune

→ Sauvegardes plus fréquentes (toutes les heures) avec une rétention plus longue.

Étape 12 : Restic sur plusieurs serveurs (un repo par serveur)

Bonne pratique : un bucket B2 par serveur. Avantages :

  • Si un serveur est compromis, les autres backups sont safe
  • Restauration plus rapide (moins de snapshots à parser)
  • Quotas/coûts trackables par serveur

Pour gérer plusieurs serveurs, utilisez resticprofile qui simplifie les configs YAML.

Étape 13 : Tester une restauration (drill semestriel)

⚠️ Un backup non testé n'existe pas. Tous les 6 mois :

  1. Provisionnez un VPS test
  2. Installez Restic + credentials
  3. Restaurez le dernier snapshot
  4. Vérifiez que le site/app démarre

Si la restauration échoue, le problème est identifié avant un vrai sinistre.

Étape 14 : Monitoring avec healthchecks.io

Pour être alerté si le cron de backup ne s'exécute pas :

  1. Compte gratuit sur https://healthchecks.io
  2. Créez un check "Daily backup"
  3. Modifiez le cron :
0 3 * * * /usr/local/bin/restic-backup.sh && curl -fsS -m 10 --retry 5 https://hc-ping.com/VOTRE-UUID

Si le backup ne ping pas dans la fenêtre attendue, vous recevez une alerte email/SMS.

Dépannage

"repository password is wrong"

Le mot de passe dans /root/.restic-env ne correspond pas. Si vous avez perdu le mot de passe → données irrécupérables.

"context deadline exceeded"

Problème réseau ou B2. Ajoutez des retries :

restic backup ... --option b2.connections=10

Backup très lent

Réduisez la concurrency :

restic backup ... --option b2.connections=4

Ou checkez la bande passante :

iftop -i eth0

"lock already held"

Un autre backup tourne, ou un précédent s'est arrêté brutalement :

sudo restic unlock

Espace B2 explose

Vérifiez la rétention. Sans forget --prune, les vieux snapshots s'accumulent. Forcez :

sudo restic forget --keep-daily 7 --keep-weekly 4 --prune

Commandes utiles

# Stats du repo
sudo restic stats

# Stats détaillées (taille déduplicatée)
sudo restic stats --mode raw-data

# Différence entre 2 snapshots
sudo restic diff abc12345 def67890

# Supprimer un snapshot précis
sudo restic forget abc12345 --prune

# Voir ce qui sera supprimé sans le faire
sudo restic forget --keep-daily 7 --dry-run

# Migrer un repo (changer le mdp)
sudo restic key passwd

# Backup en exclusion sélective
sudo restic backup /home --exclude-file /etc/restic-excludes.txt

Conclusion

Avec Restic + B2 :

  • Coût : ~1-5€/mois pour 100-500 Go (vs AWS S3 5-25€)
  • Sécurité : chiffrement AES-256 côté client, B2 n'a aucun accès
  • Restauration : granulaire (1 fichier) ou complète (un snapshot entier)
  • Fiabilité : déduplication intelligente, vérification d'intégrité

Pour aller plus loin :

  • Combinez avec rclone pour sauvegarder vers plusieurs destinations (3-2-1 backup rule)
  • Utilisez rest-server pour héberger votre propre repo Restic
  • Migrez vers Borg ou Kopia si vous avez des besoins spécifiques (ils valent aussi le coup)

Ressources

Join our Discord community server

For any questions, suggestions, or just to chat with the community, join us on Discord!

900+Members