Sauvegarde serveur Linux sur NAS Synology avec VM

Dans cet article, je vais vous décrire comment j’ai mis en place une solution de sauvegarde pour mon serveur Linux, en sauvegardant toutes les données (à l’exception du système, sauvegardé avec Timeshift mais le dossier timeshift lui même est sauvegardé) vers un NAS Synology. J’ai utilisé la commande rsync, qui est rapide, flexible et permet de synchroniser uniquement les modifications, réduisant ainsi la durée et la charge de la sauvegarde.

Objectif

L’objectif est de sauvegarder régulièrement l’ensemble des fichiers et dossiers de mon serveur Linux (hébergé chez OVH) sur mon NAS Synology, afin d’assurer la protection de mes données tout en minimisant l’espace utilisé et le temps de transfert grâce à la synchronisation incrémentielle de rsync.

Problème rencontré : Échec de la connexion SSH automatique avec clé

L’automatisation de la commande rsync repose sur une connexion SSH sans mot de passe, généralement mise en place par une paire de clés SSH. Dans mon cas, malgré un échange de clé apparemment réussi, la connexion SSH continue de demander le mot de passe lors de chaque tentative de connexion, comme si la clé n’était pas reconnue. J’ai parcouru plusieurs forum, et il semble que cela soit un soucis récurent sur DSM. Ce problème rend impossible l’automatisation complète de la sauvegarde, puisque chaque connexion nécessite une intervention manuelle pour saisir le mot de passe.

Solution mise en place : Utilisation d’une VM Linux sur le NAS

Pour contourner ce problème, j’ai créé une machine virtuelle (VM) Linux sur le NAS Synology. En exécutant la sauvegarde sur cette VM au lieu du NAS directement, j’ai pu contourner le problème d’authentification et permettre à rsync de fonctionner de manière entièrement automatisée. De plus, j’ai automatisé l’allumage et l’arrêt de cette VM avec l’API Synology, de manière à économiser les ressources du NAS et n’allumer la VM qu’au moment des sauvegardes.

Déroulement de la sauvegarde

  1. Démarrage de la VM : Avant chaque sauvegarde, un script démarre la VM Linux sur le NAS en utilisant une requête API.
  2. Exécution de rsync : Une fois la VM opérationnelle, le script rsync est exécuté pour synchroniser les données du serveur Linux sur la VM du NAS.
  3. Arrêt de la VM : Une fois la sauvegarde terminée, la VM est arrêtée pour libérer les ressources.

Cette solution garantit une sauvegarde automatisée et sécurisée, tout en maintenant l’intégrité et la disponibilité des données.

Scripts utilisés:

Pour le démarrage de la VM, start_VM.sh:

#!/bin/bash

# Chargement config
source /chemin_vers_config/sauvegarde.cfg

# Obtenir le token de session
SESSION_TOKEN=$(curl -s "https://$ADRESS:5001/webapi/auth.cgi?api=SYNO.API.Auth&method=login&version=3&account=$UTILISATEUR&passwd=$MOT_DE_PASSE&session=Virtualization&format=sid" | jq -r .data.sid)

# Activer la VM
curl -X GET "https://$ADRESS:5001/webapi/entry.cgi?api=SYNO.Virtualization.API.Guest.Action&method=poweron&version=1&guest_name=$NOM_VM&_sid=$SESSION_TOKEN"
echo

# Attendre la disponibilité de rsync
sleep $RETRY_DELAY # attente initiale
attempt=1
while ! rsync -avzi -e "ssh -p$PORT -i /root/.ssh/id_rsa" $TEST_FILE root@$ADRESS:$DESTINATION 2>/dev/null; do
    if [ $attempt -ge $MAX_RETRY ]; then
        echo "La VM n'a pas pu être contactée après $MAX_RETRY tentatives. Arrêt du script."
        curl -X GET "https://$ADRESS:5001/webapi/entry.cgi?api=SYNO.Virtualization.API.Guest.Action&method=poweroff&version=1&guest_name=$NOM_VM&_sid=$SESSION_>
        echo
        echo 'La VM ne repond pas, la sauvegarde ne peut pas se faire.' | mail -s 'Sauvegarde=abandon' $MAIL_TO -aFrom:$MAIL_FROM
        exit 1
    fi
    echo "Tentative $attempt : la VM n'est pas encore prête. Nouvelle vérification dans $RETRY_DELAY secondes."
    attempt=$((attempt + 1))
    sleep $RETRY_DELAY
done


echo "La VM est prête."

Pour l’arrêt de la VM, stop_VM.sh (ou avec l’API):

#!/bin/bash

# Chargement config
source /home/debian/sauvegarde.cfg


# check disque VM avant arrêt
ssh -p $PORT root@$ADRESS 'bash /root/stop.sh'

# arrêt VM via ssh
ssh -p $PORT root@$ADRESS 'shutdown'


# arrêt VM via API
# Obtenir le token de session
#SESSION_TOKEN=$(curl -s "https://$ADRESS:5001/webapi/auth.cgi?api=SYNO.API.Auth&method=login&version=3&account=$UTILISATEUR&passwd=$MOT_DE_PASSE&session=Virtualization&format=sid" | jq -r .data.sid)

#curl -X GET "https://$ADRESS:5001/webapi/entry.cgi?api=SYNO.Virtualization.API.Guest.Action&method=poweroff&version=1&guest_name=$NOM_VM&_sid=$SESSION_TOKEN"

Script de la sauvegarde, sauve_serveur_day.sh:

#!/bin/bash
#
# Sauvegarde sur serveur NAS
#
# Smokyr <smokyr@extra-ordinaire.com>
#

# Chargement config
source /chemin_vers_config/sauvegarde.cfg

# mise à jour fichier test
date >> $TEST_FILE

# mail debut
echo 'Une sauvegarde journaliere vient de commencer.' | mail -s 'Début sauvegarde' $MAIL_TO -aFrom:$MAIL_FROM

# mise en route de la VM
$CHEMIN_SCRIPTS/start_VM.sh

#Sauvegarde
rsync -avzi -e "ssh -p$PORT -i /root/.ssh/id_rsa" --delete-after --exclude-from=$CHEMIN_SCRIPTS/exclus.txt --include="/**" --include="/.*" / root@$ADRESS:$DESTINATION/day

# mail fin
echo 'La sauvegarde journaliere vient de terminer.' | mail -s 'Fin sauvegarde' $MAIL_TO -aFrom:$MAIL_FROM

# on arrête la VM
# si aucune autre sauvegarde en fonction
if pgrep -f "sauve_serveur_week.sh" > /dev/null
then
    exit
else
        if pgrep -f "sauve_serveur_month.sh" > /dev/null
        then
            exit
        else
            $CHEMIN_SCRIPTS/stop_VM.sh
        fi
fi

Il y a deux autres scripts quasiment identiques (répertoire de destination qui change) se terminant par _week et _month

Enfin, le fichier de configuration pour ces trois scripts, sauvegarde.cfg :

# Adresse IP et identifiants
ADRESS="nom_domaine_NAS.synology.me"
UTILISATEUR="login"
MOT_DE_PASSE="mdp"
PORT=nnnnn #port SSH
#pour test si VM opérarationnelle
NOM_VM="Nom de la VM"
TEST_FILE="/stamp.bck"  # Fichier de test
DESTINATION="/Dossier/De/Destination" #sans le / à la fin
MAX_RETRY=25         # Nombre maximal de tentatives
RETRY_DELAY=5        # Délai entre chaque tentative (en secondes)
#pour les scripts
CHEMIN_SCRIPTS="/chemin/vers/scripts" #sans le / à la fin
#email de message
MAIL_TO="moi@gmail.com"
MAIL_FROM="root@domain_du_serveur"

Et le fichier exclus.txt à adapter à vos besoins:

aquota.group
aquota.user
bin
boot
dev
etc
lib
lib64
lost+found
media
mnt
opt/containerd
proc
run
sbin
srv
sys
tmp
usr
var/archives
var/backups
var/cache
var/lib
var/local
var/lock
var/log
var/mail
var/run
var/spool
var/tmp
var/www
*/cache/
*/tmp*/

Si il y a autant de var/… dans ce fichier, c’est que j’ai besoin de sauver /var/opt.

Sont donc sauvagardés tous les fichiers (même cachés) de :

  • /
  • /root
  • /timeshift
  • /home
  • /var/opt

One thought on “Sauvegarde serveur Linux sur NAS Synology avec VM”

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.