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
- Sur Backblaze, B2 Cloud Storage → Buckets → Create a Bucket
- Nom :
verycloud-srv-web-01-backups(unique sur B2) - Files in Bucket are : Private
- 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 :
- Provisionnez un VPS test
- Installez Restic + credentials
- Restaurez le dernier snapshot
- 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 :
- Compte gratuit sur https://healthchecks.io
- Créez un check "Daily backup"
- 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
- Site officiel : https://restic.net
- Documentation : https://restic.readthedocs.io
- Backblaze B2 : https://www.backblaze.com/b2/cloud-storage.html
- healthchecks.io : https://healthchecks.io
- Tuto VeryCloud — Docker Compose prod :
/docs/article/docker-compose-prod



















