Aller au contenu

Restic: sauvegardes chiffrées avec déduplication pour ton serveur Linux

Rogelio Guerra Riverón
Auteur
Rogelio Guerra Riverón
Construction de ma propre infrastructure web depuis zéro. Je documente chaque étape : serveurs, réseaux, conteneurs et tout ce qui se présente.
Sommaire

J’avais déjà des backups avec rsync et cron, mais rsync copie des fichiers, pas des snapshots. Si tu supprimes accidentellement un fichier et que la sauvegarde se synchronise avant que tu ne t’en aperçoives, tu le perds. Restic résout ce problème et ajoute quelque chose que rsync ne donnera jamais : chiffrement AES-256, déduplication et snapshots avec historique navigable.

Ce qui rend Restic différent
#

CaractéristiquersyncRestic
Chiffrement AES-256NonOui
DéduplicationNonOui (au niveau des blocs)
Snapshots navigablesNonOui
Plusieurs backendsNonSFTP, S3, Backblaze, rclone…
Vérification d’intégritéNonrestic check
Politique de rétentionManuelrestic forget --prune

La déduplication est particulièrement utile pour les sauvegardes de bases de données et les répertoires de configuration qui changent peu : un référentiel Restic qui a 6 mois de sauvegardes quotidiennes occupe généralement beaucoup moins qu'180 copies complètes.

Installation
#

Sur Ubuntu/Debian, la version du référentiel officiel a généralement du retard. Il est préférable de télécharger le binaire directement depuis les releases officielles GitHub :

# Descarga la última versión (ajusta la versión si hay una más reciente)
wget https://github.com/restic/restic/releases/download/v0.17.3/restic_0.17.3_linux_amd64.bz2
bunzip2 restic_0.17.3_linux_amd64.bz2
chmod +x restic_0.17.3_linux_amd64
sudo mv restic_0.17.3_linux_amd64 /usr/local/bin/restic

# Verificar
restic version

Ou avec les référentiels système si la version ne te préoccupe pas :

sudo apt install restic      # Debian/Ubuntu
sudo dnf install restic      # Fedora/RHEL

Concepts clés avant de commencer
#

  • Référentiel : la destination où Restic stocke les sauvegardes. Il peut s’agir d’un dossier local, d’un serveur SFTP, d’un bucket S3, etc.
  • Snapshot : chaque fois que tu exécutes restic backup, Restic enregistre un snapshot ponctuel. Les snapshots partagent des blocs dédupliqués, ils ne multiplient donc pas l’espace utilisé.
  • Mot de passe : le référentiel est chiffré avec un mot de passe. Sans lui, les données sont illisibles. Stocke-le dans un gestionnaire de mots de passe ou dans un fichier séparé de la sauvegarde.

Initialiser un référentiel
#

Option A : référentiel local
#

restic init --repo /opt/backups/mi-servidor

Option B : référentiel sur serveur distant via SFTP
#

restic init --repo sftp:usuario@servidor-backup:/opt/restic/mi-servidor

Option C : référentiel sur S3 (ou compatible : Backblaze B2, MinIO…)
#

export AWS_ACCESS_KEY_ID="TU_ACCESS_KEY_AQUI"
export AWS_SECRET_ACCESS_KEY="TU_SECRET_KEY_AQUI"

restic init --repo s3:s3.eu-west-1.amazonaws.com/mi-bucket-backups/mi-servidor

Dans les trois cas, Restic te demandera un mot de passe pour chiffrer le référentiel. Garde-le bien — sans lui, tu ne peux rien restaurer.

Fichier de variables d’environnement
#

Pour ne pas taper le mot de passe à chaque commande, crée un fichier de variables :

# /etc/restic/env.sh  (solo root puede leerlo)
sudo mkdir -p /etc/restic
sudo chmod 700 /etc/restic
sudo tee /etc/restic/env.sh > /dev/null <<'EOF'
export RESTIC_REPOSITORY="/opt/backups/mi-servidor"
export RESTIC_PASSWORD="TU_CONTRASENA_AQUI"
EOF
sudo chmod 600 /etc/restic/env.sh

À partir de maintenant, avant toute commande Restic :

source /etc/restic/env.sh

Ou avec les variables d’environnement en ligne pour les scripts :

env $(cat /etc/restic/env.sh | grep export | sed 's/export //') restic snapshots

Première sauvegarde
#

source /etc/restic/env.sh

# Backup de los datos de Docker y configuraciones
restic backup \
  /opt/app/ \
  /etc/nginx/ \
  /home/usuario/ \
  --exclude='/opt/app/logs' \
  --exclude='*.tmp' \
  --tag servidor-web

La sortie affiche combien de fichiers ont été traités, combien sont nouveaux et l’espace économisé par déduplication :

Files:        1234 new,   567 changed, 8901 unmodified
Dirs:          45 new,    12 changed,  89 unmodified
Added to the repo: 234.567 MiB

processed 10702 files, 1.234 GiB in 0:23
snapshot a1b2c3d4 saved

Voir et naviguer les snapshots
#

# Listar todos los snapshots
restic snapshots

# Listar ficheros dentro de un snapshot específico
restic ls a1b2c3d4

# Buscar un fichero en todos los snapshots
restic find --tag servidor-web nombre-fichero.conf

Sortie de restic snapshots :

ID        Time                 Host          Tags           Paths
────────────────────────────────────────────────────────────────────
a1b2c3d4  2026-05-11 03:00:02  mi-servidor   servidor-web   /opt/app, /etc/nginx, /home/usuario
e5f6a7b8  2026-05-10 03:00:01  mi-servidor   servidor-web   /opt/app, /etc/nginx, /home/usuario

Restaurer des données
#

Restauration complète d’un snapshot
#

# Restaura todo en /tmp/restauracion para revisar antes de mover
restic restore a1b2c3d4 --target /tmp/restauracion

Restaurer un seul fichier ou répertoire
#

# Restaura solo nginx.conf del snapshot más reciente
restic restore latest --target /tmp/restauracion \
  --include /etc/nginx/nginx.conf

Monter le référentiel comme système de fichiers (utile pour explorer)
#

# Requiere FUSE instalado: sudo apt install fuse
mkdir -p /mnt/restic-backups
restic mount /mnt/restic-backups &

# Ahora puedes navegar por todos los snapshots
ls /mnt/restic-backups/snapshots/
# → a1b2c3d4/  e5f6a7b8/  latest/

# Cuando acabes
fusermount -u /mnt/restic-backups

Politique de rétention automatique
#

Sans politique de rétention, le référentiel grandit indéfiniment. C’est la configuration que j’utilise pour les sauvegardes quotidiennes :

# 7 días diarios, 4 semanas, 6 meses, 1 año
restic forget \
  --keep-daily   7 \
  --keep-weekly  4 \
  --keep-monthly 6 \
  --keep-yearly  1 \
  --tag servidor-web \
  --prune

--prune supprime physiquement les données non référencées. Sans lui, forget supprime uniquement les métadonnées du snapshot mais ne libère pas d’espace.

Vérifier l’intégrité du référentiel
#

# Verificación rápida de metadatos
restic check

# Verificación completa leyendo todos los datos (lento, hazlo mensualmente)
restic check --read-data

Si restic check échoue, le référentiel est corrompu. C’est pourquoi il est toujours recommandé d’avoir au moins deux référentiels dans des destinations différentes (la célèbre règle 3-2-1).

Automatiser avec systemd timer
#

Restic s’intègre parfaitement avec systemd timers, qui permettent de capturer la sortie dans journald et d’exécuter la tâche même si le serveur était éteint à l’heure programmée.

/etc/systemd/system/restic-backup.service :

[Unit]
Description=Backup diario con Restic
After=network.target

[Service]
Type=oneshot
User=root
EnvironmentFile=/etc/restic/env.sh
ExecStart=/usr/local/bin/restic backup \
    /opt/app/ \
    /etc/nginx/ \
    /home/usuario/ \
    --exclude='/opt/app/logs' \
    --tag servidor-web
ExecStartPost=/usr/local/bin/restic forget \
    --keep-daily 7 \
    --keep-weekly 4 \
    --keep-monthly 6 \
    --tag servidor-web \
    --prune
StandardOutput=journal
StandardError=journal

/etc/systemd/system/restic-backup.timer :

[Unit]
Description=Ejecuta backup Restic diariamente

[Timer]
OnCalendar=*-*-* 03:00:00
Persistent=true
RandomizedDelaySec=10min

[Install]
WantedBy=timers.target

Activer :

sudo systemctl daemon-reload
sudo systemctl enable --now restic-backup.timer

# Verificar que está activo
sudo systemctl list-timers restic-backup.timer

RandomizedDelaySec=10min distribue les sauvegardes dans des fenêtres aléatoires pour éviter que tous les serveurs ne frappent la destination SFTP ou S3 en même temps.

Notifications par email à la fin
#

En combinant avec le système de notifications par email avec msmtp, nous pouvons recevoir un résumé de la sauvegarde. Modifiez ExecStart par un script wrapper :

/usr/local/bin/restic-backup.sh :

#!/bin/bash
set -euo pipefail

source /etc/restic/env.sh

LOG=$(mktemp)
STATUS=0

restic backup \
    /opt/app/ \
    /etc/nginx/ \
    /home/usuario/ \
    --exclude='/opt/app/logs' \
    --tag servidor-web > "$LOG" 2>&1 || STATUS=$?

restic forget \
    --keep-daily 7 \
    --keep-weekly 4 \
    --keep-monthly 6 \
    --tag servidor-web \
    --prune >> "$LOG" 2>&1 || STATUS=$?

SUBJECT="[Backup] $(hostname) - $(date '+%Y-%m-%d')"
[ $STATUS -ne 0 ] && SUBJECT="[ERROR Backup] $(hostname) - $(date '+%Y-%m-%d')"

cat "$LOG" | mail -s "$SUBJECT" usuario@ejemplo.com
rm -f "$LOG"

exit $STATUS
chmod +x /usr/local/bin/restic-backup.sh

Et dans le .service, remplacez ExecStart et ExecStartPost par une seule ligne :

ExecStart=/usr/local/bin/restic-backup.sh

Vérification hebdomadaire de l’intégrité
#

Ajoutez un deuxième timer pour la vérification hebdomadaire, qui est plus coûteuse :

/etc/systemd/system/restic-check.service :

[Unit]
Description=Verificación semanal de integridad Restic
After=network.target

[Service]
Type=oneshot
User=root
EnvironmentFile=/etc/restic/env.sh
ExecStart=/usr/local/bin/restic check
StandardOutput=journal
StandardError=journal

/etc/systemd/system/restic-check.timer :

[Unit]
Description=Verifica integridad del repositorio Restic cada semana

[Timer]
OnCalendar=Sun *-*-* 04:00:00
Persistent=true

[Install]
WantedBy=timers.target
sudo systemctl enable --now restic-check.timer

Voir l’état dans le journal du système
#

# Último backup
journalctl -u restic-backup.service -n 50

# Seguir en tiempo real durante la ejecución manual
journalctl -u restic-backup.service -f

# Historial de ejecuciones del timer
systemctl status restic-backup.timer

Conclusion
#

Restic ne remplace pas complètement rsync pour les cas de synchronisation de répertoires en direct, mais pour les sauvegardes avec historique, il est clairement supérieur : chiffrement par défaut, déduplication transparente et snapshots navigables sans scripts supplémentaires. L’intégration avec systemd timers et l’envoi de notifications par email ferme la boucle : vous savez que la sauvegarde s’est exécutée, quand elle a échoué, et vous pouvez restaurer n’importe quel point dans le temps en minutes.

La véritable clé de toute stratégie de sauvegarde n’est pas le logiciel que vous choisissez, mais vérifier que vous pouvez restaurer. Testez restic restore dans un répertoire temporaire avant d’en avoir vraiment besoin.