Aller au contenu

Sauvegardes automatiques avec rsync et cron pour Docker domestique

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.

Le problème
#

J’ai récemment perdu un disque dur sans avertissement. Ce n’était pas catastrophique car j’avais des sauvegardes, mais cela m’a rendu conscient que beaucoup de passionnés avec des serveurs domestiques n’ont aucune stratégie de protection des données. Si ton serveur Docker s’arrête demain, combien de temps te faudrait-il pour le récupérer ?

Dans cet article, je partage comment j’ai automatisé les sauvegardes de mon infrastructure Docker en utilisant rsync et cron. C’est simple, efficace et ça fonctionne.

La stratégie
#

Mon approche est straightforward :

  1. rsync pour synchroniser de manière incrémentale uniquement ce qui a changé
  2. cron pour automatiser l’exécution quotidienne
  3. Un disque USB externe comme destination de sauvegarde
  4. La rétention de plusieurs snapshots pour une récupération granulaire

Ce n’est pas une sauvegarde en cloud. C’est une sauvegarde locale, rapide et sous mon contrôle.

Configuration étape par étape
#

1. Préparer le stockage
#

J’ai connecté un disque USB et l’ai monté sur /mnt/backup. Vérifiez qu’il soit disponible :

lsblk
mount | grep backup

2. Script de sauvegarde
#

J’ai créé /usr/local/bin/docker-backup.sh :

#!/bin/bash

BACKUP_DEST="/mnt/backup"
DOCKER_DATA="/var/lib/docker"
COMPOSE_DIR="/home/user/docker-compose"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
BACKUP_PATH="$BACKUP_DEST/backups/$TIMESTAMP"

# Crear directorio de backup
mkdir -p "$BACKUP_PATH"

# Backup de volúmenes Docker
echo "[$(date)] Iniciando backup de Docker volumes..."
rsync -av --delete "$DOCKER_DATA/volumes/" "$BACKUP_PATH/volumes/" >> /var/log/docker-backup.log 2>&1

# Backup de configuraciones docker-compose
echo "[$(date)] Iniciando backup de docker-compose..."
rsync -av "$COMPOSE_DIR/" "$BACKUP_PATH/compose/" >> /var/log/docker-backup.log 2>&1

# Backup incremental de datos de aplicaciones
echo "[$(date)] Iniciando backup de datos..."
rsync -av --delete "/home/user/app-data/" "$BACKUP_PATH/app-data/" >> /var/log/docker-backup.log 2>&1

# Limpiar backups más antiguos (mantener 7 últimos)
echo "[$(date)] Limpiando backups antiguos..."
ls -t "$BACKUP_DEST/backups" | tail -n +8 | xargs -I {} rm -rf "$BACKUP_DEST/backups/{}"

echo "[$(date)] Backup completado" >> /var/log/docker-backup.log

Le rendre exécutable :

chmod +x /usr/local/bin/docker-backup.sh

3. Configurer cron
#

J’ai édité la table cron de l’utilisateur root :

sudo crontab -e

J’ai ajouté cette ligne pour l’exécuter à 2 AM tous les jours :

0 2 * * * /usr/local/bin/docker-backup.sh

Pour vérifier qu’il est enregistré :

sudo crontab -l

4. Surveillance
#

J’ai créé un deuxième script pour me alerter si quelque chose échoue. Dans /usr/local/bin/check-backup.sh :

#!/bin/bash

LAST_BACKUP=$(ls -t /mnt/backup/backups | head -1)
BACKUP_TIME=$(date -d "$(stat -c %y /mnt/backup/backups/$LAST_BACKUP | cut -d' ' -f1)" +%s)
CURRENT_TIME=$(date +%s)
DIFF=$((($CURRENT_TIME - $BACKUP_TIME) / 3600))

if [ $DIFF -gt 25 ]; then
    echo "ALERTA: No hay backup desde hace $DIFF horas"
else
    echo "Último backup: $DIFF horas atrás - OK"
fi

Je l’exécute manuellement chaque semaine ou via cron si je le souhaite :

chmod +x /usr/local/bin/check-backup.sh
/usr/local/bin/check-backup.sh

Considérations importantes
#

Espace disque : rsync avec --delete synchronise exactement la source. Je vérifiez que la destination dispose d’au moins 1,5 fois la taille des données Docker.

Permissions : Le script s’exécute en tant que root, donc il peut accéder à /var/lib/docker. Si tu utilises un utilisateur régulier, tu auras besoin de permissions spéciales.

Tests : Une fois par mois, je simule une récupération en restaurant un fichier aléatoire sur une machine de test. Une sauvegarde qui n’a jamais été testée n’existe pas.

Chiffrement : Mon disque USB est chez moi avec moi, donc je ne le chiffre pas. Si tu le conservais ailleurs, considère --backup-dir avec synchronisation vers une destination chiffrée.

Résultat
#

Je dors mieux maintenant. Chaque nuit à 2 AM, Docker, les configurations et les données se synchronisent automatiquement. Si le serveur meurt, je récupère tout en 30 minutes.

La clé est : automatisation simple, vérification manuelle. N’attends pas que quelque chose échoue pour tester ta sauvegarde.


Équipement recommandé
#

Liens d’affiliation. Aucun coût supplémentaire pour toi.