Tutoriel

Sécurité & Monitoring

Automatiser les sauvegardes de votre VPS avec Restic

Une sauvegarde qui n'est ni testée ni chiffrée ne vaut rien le jour d'un incident. Restic combine snapshots incrémentaux, déduplication et chiffrement de bout en bout dans un binaire unique. Sur votre VPS, il devient le filet de sécurité automatisé de vos données, poussées vers un stockage objet distant à moindre coût.

11 min de lecture8 étapes
Sommaire· Pourquoi automatiser vos sauvegardes avec Restic1/10
  1. 01Pourquoi automatiser vos sauvegardes avec Restic
  2. 02Ce que Restic vous apporte
  3. 03La règle 3-2-1 : pourquoi un snapshot hébergeur ne suffit pas
  4. 04Les trois copies d'une stratégie 3-2-1 sur VPS
  5. 05Prérequis pour ce déploiement
  6. 06Backblaze B2 ou Cloudflare R2 : choisir le backend S3
  7. 07Mettre en place des sauvegardes Restic automatisées
  8. 08Secrets Restic : un fichier isolé, jamais en dur dans l'unité
  9. 09Dépannage : les erreurs courantes
  10. 10Plan de reprise : combien de temps pour tout restaurer ?

Pourquoi automatiser vos sauvegardes avec Restic

Un VPS héberge souvent des données irremplaçables : bases de données, volumes Docker, fichiers de configuration. Restic répond à trois exigences clés d'une bonne stratégie : le chiffrement (AES-256, le dépôt est inutilisable sans le mot de passe), la déduplication (les blocs identiques ne sont stockés qu'une fois, ce qui réduit drastiquement le volume et le coût), et le support de backends variés (S3, Backblaze B2, SFTP, stockage local). Self-héberger Restic sur le VPS plutôt que de dépendre d'un service de backup managé vous donne le contrôle total du chiffrement : la clé reste chez vous, le fournisseur de stockage ne voit que des blobs opaques. C'est la base d'une stratégie 3-2-1 sérieuse.

Ce que Restic vous apporte

  • Chiffrement AES-256 côté client : le backend de stockage ne voit que des données illisibles.
  • Déduplication par blocs qui réduit fortement la taille et le coût des sauvegardes successives.
  • Snapshots incrémentaux rapides : seuls les nouveaux blocs sont transférés à chaque run.
  • Backends multiples (S3, Backblaze B2, SFTP, rest-server, local) sans changer de workflow.
  • Restauration granulaire : un fichier, un dossier ou tout un snapshot via restic restore.
  • Politique de rétention automatisée avec forget --prune (garder N quotidiens, M hebdos...).

La règle 3-2-1 : pourquoi un snapshot hébergeur ne suffit pas

Activer les snapshots de votre fournisseur VPS est utile, mais ce n'est pas une stratégie de sauvegarde : c'est une seule copie supplémentaire, chez le même fournisseur, qui partage le sort de votre VM. Trois scénarios le montrent. Si la VM est supprimée (erreur de manipulation, impayé, résiliation), ses snapshots disparaissent souvent avec elle. Si un attaquant prend la main sur votre compte chez l'hébergeur, il efface VM et snapshots en quelques clics ou par l'API. Et un snapshot n'est jamais restauré à titre d'essai : une base de données figée en pleine écriture peut s'avérer inutilisable le jour où vous en avez besoin.

La règle 3-2-1 répond à ces trois risques : trois copies des données, sur deux supports distincts, dont une hors du fournisseur, chiffrée avant de quitter le serveur. Restic construit précisément ce dernier maillon, le seul qui survit à la perte complète du compte hébergeur.

Les trois copies d'une stratégie 3-2-1 sur VPS

  • Copie 1, les données vivantes sur le disque du VPS : c'est l'original, et la source des restaurations les plus rapides.
  • Copie 2, les snapshots du fournisseur : ils couvrent une mise à jour ratée ou une erreur de configuration, avec un retour en arrière de toute la machine.
  • Copie 3, le dépôt Restic chez un autre fournisseur de stockage objet : chiffré côté client, il reste hors d'atteinte du tableau de bord de votre hébergeur.
  • Deux supports réellement séparés : le disque du VPS d'un côté, le stockage objet d'un tiers de l'autre, avec des identifiants distincts.

Prérequis pour ce déploiement

Restic est frugal : il fonctionne sur n'importe quel VPS, y compris 1 vCPU et 1 Go de RAM, la déduplication consommant un peu de mémoire proportionnellement à la taille du dépôt. Vous avez besoin du binaire restic, d'un backend de destination distant (un bucket S3-compatible chez un fournisseur, ou un autre serveur en SFTP) et de ses identifiants. Pas de Docker obligatoire ici : Restic est un outil en ligne de commande.

Vérifiez la version que fournit votre distribution : Debian 13 et Ubuntu 26.04 livrent une 0.18, mais Ubuntu 24.04 en est à la 0.16.4 et Debian 12 à la 0.14.0, trop ancienne pour l'option --stdin-from-command utilisée plus bas (apparue en 0.17.0). Dans ce cas, installez le binaire officiel depuis la page des releases (0.19.1, publiée le 5 juillet 2026) : seuls ces binaires officiels embarquent la commande restic self-update, un paquet de distribution se met à jour par apt. Prévoyez enfin un timer systemd (ou cron) pour l'automatisation, et un emplacement sûr hors du VPS pour conserver le mot de passe du dépôt.

Backblaze B2 ou Cloudflare R2 : choisir le backend S3

Faites défiler le tableau

CritèreBackblaze B2Cloudflare R2
Stockage offertLes 10 premiers Go10 Go-mois par mois (classe Standard)
Sortie de données (egress)Gratuite jusqu'à 3 fois le volume stocké en moyenne sur le mois, et sans limite vers les CDN partenaires (Cloudflare, Fastly)Gratuite, sans plafond
Endpoint S3Propre à la région du compte, par exemple `s3.us-west-004.backblazeb2.com``<account-id>.r2.cloudflarestorage.com`, région `auto`
Clés d'accèsApplication Key dédiée : la clé maîtresse est refusée par l'API S3Jeton d'API R2 avec droits de lecture et d'écriture sur les objets
Point d'attentionUne restauration complète et fréquente peut dépasser le quota de sortie gratuitLes tests de restauration réguliers n'ajoutent aucun coût de sortie

Mettre en place des sauvegardes Restic automatisées

  1. Installer Restic et préparer le fichier d'environnement

    Installez restic (paquet récent ou binaire officiel, voir les prérequis), puis créez /root/.restic-env. Écrivez-le en simples lignes CLÉ=valeur, sans export : c'est le format que lit la directive EnvironmentFile= de systemd, et il se charge aussi dans un shell. Pour Restic, B2 s'utilise de préférence par son API compatible S3 :

    # /root/.restic-env  (Backblaze B2, S3 API)
    RESTIC_REPOSITORY=s3:https://s3.us-west-004.backblazeb2.com/my-bucket
    RESTIC_PASSWORD=change-me
    AWS_ACCESS_KEY_ID=b2-key-id
    AWS_SECRET_ACCESS_KEY=b2-application-key
    
    # Cloudflare R2
    # RESTIC_REPOSITORY=s3:https://<account-id>.r2.cloudflarestorage.com/my-bucket

    Restreignez les droits du fichier, puis chargez-le dans votre session :

    chmod 600 /root/.restic-env
    set -a; . /root/.restic-env; set +a
  2. Initialiser le dépôt chiffré

    restic init

    Cette commande crée la structure du dépôt et scelle le chiffrement avec votre mot de passe ; les dépôts récents (format 2, depuis Restic 0.14.0) compressent aussi les données. Conservez ce mot de passe hors du VPS, dans un gestionnaire de mots de passe ou un coffre sur une autre machine : sans lui, aucune restauration n'est possible, même avec le bucket complet.

  3. Lancer une première sauvegarde

    Sauvegardez vos répertoires critiques, puis vos bases de données. Pour un dump, préférez --stdin-from-command à un tube pg_dump | restic backup --stdin : Restic ne peut pas savoir si un flux lu sur l'entrée standard est complet, et un dump qui échoue en route produirait un snapshot tronqué sans erreur. Avec --stdin-from-command, un code de sortie non nul de la commande annule la sauvegarde et aucun snapshot n'est créé.

    restic backup /etc /var/www /opt/docker-data
    restic backup --stdin-filename mydb.sql --stdin-from-command -- pg_dump -U postgres mydb
    restic snapshots
  4. Définir une politique de rétention

    restic forget --keep-daily 7 --keep-weekly 4 --keep-monthly 6 --prune

    Sept quotidiennes couvrent une semaine entière, de quoi repérer une corruption qui ne se manifeste qu'au bout de quelques jours. Quatre hebdomadaires ouvrent une fenêtre d'un mois pour un problème applicatif lent, des données qui disparaissent peu à peu. Six mensuelles permettent de revenir à un état d'avant une migration ratée. La passe --prune est indispensable : forget seul retire les snapshots de la liste sans libérer l'espace, et la facture de stockage continue de croître.

  5. Vérifier l'intégrité : check, puis read-data

    Ces commandes ne contrôlent pas la même chose :

    restic check
    restic check --read-data-subset=10%
    restic check --read-data

    restic check valide la structure du dépôt (snapshots, arbres, index, packs) sans lire le contenu des fichiers de données : rapide, il se lance après chaque forget --prune. --read-data télécharge et vérifie tous les packs, ce qui prend du temps et consomme de la bande passante sortante. Entre les deux, --read-data-subset contrôle une part aléatoire (10%, ou une taille comme 5G) ou une tranche fixe (1/5 à 5/5, pour tout couvrir en cinq passages). Une vérification partielle chaque semaine et complète une fois par mois est un bon compromis.

  6. Écrire le script de sauvegarde et son service systemd

    Regroupez les gestes dans un script. Il écrit d'abord un fichier sentinelle horodaté, qui servira au test de restauration, et s'arrête à la première erreur grâce à set -eu :

    #!/bin/sh
    # /usr/local/bin/restic-backup.sh
    set -eu
    date +%s > /opt/restic-sentinel.txt
    restic backup /etc /var/www /opt/docker-data /opt/restic-sentinel.txt
    restic forget --keep-daily 7 --keep-weekly 4 --keep-monthly 6 --prune
    restic check

    Le service le lance avec les variables du fichier d'environnement, sans qu'aucun secret n'apparaisse dans la définition de l'unité :

    # /etc/systemd/system/restic-backup.service
    [Unit]
    Description=Restic backup
    After=network-online.target
    Wants=network-online.target
    
    [Service]
    Type=oneshot
    EnvironmentFile=/root/.restic-env
    ExecStart=/usr/local/bin/restic-backup.sh
  7. Planifier avec un timer systemd

    Le timer déclenche le service chaque nuit. Persistent=true rattrape un passage manqué si le VPS était éteint à l'heure prévue, et RandomizedDelaySec=900 étale le départ sur quinze minutes, utile quand plusieurs serveurs visent le même bucket :

    # /etc/systemd/system/restic-backup.timer
    [Unit]
    Description=Daily restic backup
    
    [Timer]
    OnCalendar=*-*-* 03:00:00
    Persistent=true
    RandomizedDelaySec=900
    
    [Install]
    WantedBy=timers.target

    Activez-le puis vérifiez la prochaine échéance et les journaux du dernier passage :

    chmod 700 /usr/local/bin/restic-backup.sh
    systemctl daemon-reload
    systemctl enable --now restic-backup.timer
    systemctl list-timers restic-backup.timer
    journalctl -u restic-backup.service --since today

    Si vous préférez cron, une ligne 0 3 * * * qui charge le fichier d'environnement puis appelle le même script fait l'affaire, sans le rattrapage de Persistent=.

  8. Automatiser le test de restauration

    Une sauvegarde jamais restaurée reste une hypothèse. Ce second script restaure le seul fichier sentinelle du dernier snapshot et le compare à l'original : si la sauvegarde de la nuit a échoué ou si le dépôt ne rend plus rien, cmp échoue et le service passe en état failed. Le test vise le snapshot le plus récent : si vous ajoutez des dumps --stdin-from-command au script de sauvegarde, placez-les avant la sauvegarde des fichiers, qui doit rester la dernière.

    #!/bin/sh
    # /usr/local/bin/restic-restore-test.sh
    set -eu
    rm -rf /tmp/restic-test-restore
    restic restore latest --target /tmp/restic-test-restore --include /opt/restic-sentinel.txt
    cmp /tmp/restic-test-restore/opt/restic-sentinel.txt /opt/restic-sentinel.txt

    Planifiez-le chaque semaine, après la sauvegarde de la nuit :

    # /etc/systemd/system/restic-restore-test.service
    [Service]
    Type=oneshot
    EnvironmentFile=/root/.restic-env
    ExecStart=/usr/local/bin/restic-restore-test.sh
    
    # /etc/systemd/system/restic-restore-test.timer
    [Timer]
    OnCalendar=Sun 05:00:00
    Persistent=true
    
    [Install]
    WantedBy=timers.target

    Activez le timer avec systemctl enable --now restic-restore-test.timer, et branchez l'état failed de ces deux services sur votre supervision. Une fois par trimestre, restaurez aussi un vrai répertoire, une base de données comprise, sur une machine de test.

Secrets Restic : un fichier isolé, jamais en dur dans l'unité

Ne placez jamais RESTIC_PASSWORD ni les clés S3 dans une ligne Environment= d'une unité systemd, dans un script versionné ou dans un Dockerfile : les variables déclarées dans l'unité sont lisibles par systemctl show. Le fichier /root/.restic-env en chmod 600, chargé par EnvironmentFile=, garde les secrets hors de la définition de l'unité. Pour aller plus loin, la directive LoadCredential= de systemd expose un secret dans un répertoire réservé au service ($CREDENTIALS_DIRECTORY) : Restic lit alors son mot de passe avec RESTIC_PASSWORD_FILE.

Dépannage : les erreurs courantes

restic init ou le premier backup échoue sur le bucket. Vérifiez d'abord que les variables sont chargées (echo $RESTIC_REPOSITORY), puis l'endpoint : sur B2, il doit correspondre à la région de votre compte, et l'endpoint d'AWS (s3.amazonaws.com) est une erreur fréquente. Une Application Key B2 restreinte à un seul bucket doit aussi porter la permission listAllBucketNames pour fonctionner avec les outils S3, et la clé maîtresse du compte ne marche pas avec l'API S3. Sur R2, le jeton doit avoir les droits de lecture et d'écriture sur les objets du bucket.

Le timer ne se déclenche pas. Trois commandes suffisent : systemctl status restic-backup.timer (actif ou non), systemctl list-timers --all | grep restic (prochaine échéance), journalctl -u restic-backup.service --since today (journal du dernier passage). Pour valider une expression OnCalendar, systemd-analyze calendar '*-*-* 03:00:00' doit afficher la prochaine date de déclenchement.

Le dépôt reste verrouillé. Une sauvegarde interrompue (redémarrage, coupure réseau) peut laisser un verrou : restic list locks le montre, restic unlock retire les verrous périmés. Assurez-vous avant qu'aucune autre opération Restic ne tourne.

restic check --read-data trop long. Sur un dépôt de plusieurs dizaines de Go, la lecture complète prend des heures et pèse sur le quota de sortie. Passez à --read-data-subset=10% ou à une tranche 1/4 chaque semaine, et réservez la lecture complète à une maintenance mensuelle.

Plan de reprise : combien de temps pour tout restaurer ?

La durée d'une restauration complète dépend du volume du dépôt, de la bande passante entre le VPS et le bucket, et de la politique de sortie du fournisseur. Sur R2, la sortie est gratuite : rien n'oblige à étaler une restauration. Sur B2, elle est gratuite jusqu'à trois fois le volume stocké en moyenne sur le mois ; au-delà, une restauration complète d'un gros dépôt est facturée.

Ne devinez pas ce temps, mesurez-le. restic stats donne la taille du dépôt ; restaurez ensuite un répertoire significatif (restic restore latest --target /tmp/test --include /etc) et chronométrez l'opération pour extrapoler. Deux pratiques raccourcissent la reprise : sauvegarder uniquement ce qui compte (ni caches, ni journaux, ni /tmp, ni volumes Docker abandonnés), et noter dans votre procédure l'ordre de remise en service, les bases de données d'abord, puis les applications qui en dépendent.

Protégez vos sauvegardes contre le ransomware en activant le mode "append-only" côté backend : déployez rest-server distant avec l'option --append-only, ou utilisez un bucket S3 avec une politique IAM interdisant les suppressions. Ainsi, même si votre VPS est compromis et que l'attaquant obtient les identifiants, il ne pourra ni effacer ni chiffrer vos snapshots existants. Combinez cela avec une exécution de restic forget --prune depuis une machine distincte disposant, elle, des droits de suppression.

Sécurisez vos données dès le premier jour

Sur un VPS Cloud ServOrbit avec template préconfiguré, vous installez Restic en quelques commandes et planifiez des sauvegardes chiffrées vers le stockage objet de votre choix.