DSC_0462.jpg DSC_0298.jpg DSC_0001.jpg

 i need more coffee

Atteint depuis mon plus jeune âge d'hippopotomonstrosesquippedaliophobie (cultivez vous ça ne fera pas de mal) j'ai décidé de faire un blog sur ma maladie (be feeeaar..).
Blague à part c'est un blog totalement axé génie logiciel que vous trouverez ici. Du PHP, du J2EE, et évidement toutes les technologies qui leur sont liées.

Have fun !

Faire un backup de ses serveurs sur son NAS Synology (Partie 2)

21 avril 2013Posté par : Kevin Danezis dans Synology

Suite de mon article sur la façon dont j'ai programmé mon NAS Synology D212J pour qu'il récupère les sauvegardes quotidiennes de 3 de mes serveurs Debian.

Nous nous étions arrétés sur un NAS Synology qui nous tendait grand les bras avec un accès Root via Putty. Si ce n'est pas déjà fait, je vous invite à relire la première partie de mon article ici. Je vais donc donner un bref aperçu de la suite avant de rentrer dans le code.

J'ai réalisé sur mon NAS un petit espace dédié à la sauvegarde de plein de choses DONT les sauvegardes de mes serveurs. J'ai donc créé ces arborescences :

  • Sauvegardes
  • Sauvegardes > FTP
  • Sauvegardes > FTP > logs
  • Sauvegardes > FTP > Serveur1
  • Sauvegardes > FTP > Serveur2
  • Sauvegardes > FTP > Serveur3

2013-04-15_104503.png

J'ai également créé 3 fichiers nommés sobrement : _serveur1.sh, _serveur2.sh et _serveur3.sh qui contiendront les scripts shell destinés à être exécutés par le système.

Les logs

Attardons nous quelques secondes sur le système de Log que j'ai souhaité très simple. Chaque traitement nocturne sur une machine génère son propre fichier de log. Si vous exécutez N fois le traitement pour une même machine, il n'y aura toujours qu'un seul fichier de log. Celui ci est nommé de la sorte : "log_NomDeLaMachine_AAAA_MM_DD.txt" et bien évidement ce pattern de nommage pourra facilement être modifié selon vos besoins. J'ai par exemple commencé mes tests en y incluant l'heure/minute/seconde avant de revenir sur l'actuel modèle que je juge plus lisible.

Le contenu du log ressemble à ceci : 2013-04-15_104257.png

Très peu d'informations inutile, on y retrouve l'horaire de start/stop du script, les informations sur la machine sur laquelle on part se connecter. le nombre de fichiers récupérés et enfin le code retour (zéro = succès, un = erreur -de mémoire-)

Les scripts

Entrons enfin dans le vif du sujet : les scripts shell utilisés. Je me suis grandement inspiré de cet article pour composer mes propres scripts, merci donc à monsieur Maël pour le travail en amont !

#!/bin/sh
######################################################################################
##### Sauvegarde fichier d'un site web distant par FTP avec lftp
######################################################################################
## Remarque sur lftp
## + Le -e de mirror efface les fichiers qui n'existent plus.
######################################################################################
## Paramètre en entrée
##     1 : -e ou rien
##         pour effacer tous les fichiers du local qui n'existent plus sur le FTP
######################################################################################

# nom du serveur et repertoire local + ftp
name=SERVER97
dir=/volume1/Sauvegarde/FTP/
repFTP=/

# configuration : ftp / user / pass
servFTP=192.168.9.9
userFTP=login
passFTP=password


horodatage=$(date +%Y_%m_%d_%H_%M)
ficLog=${dir}logs/log_${name}_${horodatage}.txt
repLocal=${dir}/${name}/${horodatage}/

#Repertoire a ignorer sur le FTP
# ex : repIgnore="-x wp-content/cache -x /wp-content/supercache"
repIgnore=""

# Options de la commande lftp mirroir http://lftp.yar.ru/lftp-man.html
#options=""
options=--Remove-source-files
 
######################################################################################
# debut shell
echo "+-- Deb Sauvegarde $(date) ---" >> ${ficLog}
 
# Creation du repertoire
mkdir ${repLocal}

# On se place au repertoire de sauvegarde
cd ${repLocal}

# log
echo "Connexion sur ftp://${userFTP}:xxxxx@${servFTP}" >> ${ficLog}

# commande de copie miroir ftp vers local
/opt/bin/lftp ftp://${userFTP}:${passFTP}@${servFTP} -e "mirror ${1} ${options} ${repIgnore} ${repFTP} ${repLocal} ; quit"  >> ${ficLog}

# résultat de la commande - 0 : ok
res=$?
echo "Resultat : "${res} >> ${ficLog}

# A decommenter si on souhaite utiliser l'envoi d'email de Synology
#if [ ${res} -eq 0 ]
#then /usr/syno/bin/synomail SVGFini
#else /usr/syno/bin/synomail SVGError
#fi
 
# fin shell
echo "--- Fin Sauvegarde $(date) ---" >> ${ficLog}
######################################################################################
exit $res

 Voir le code source sur Gist

Explication des variables :

  • name=SERVER97 : c'est le nom symbolique que vous choisissez. Il n'a aucun impact sur le fonctionnement correct du script. Ce nom sera par contre ET dans la création des répertoires locaux qui accueillent les fichiers téléchargés ET dans le nommage des fichiers de logs.
  • dir=/volume1/Sauvegarde/FTP/ : C'est le path absolue de votre répertoire de sauvegarde. Je reviendrais un peu plus loin sur le sujet.
  • repFTP=/ C'est le path sur le serveur distant pour trouver les fichiers à télécharger. Dans mon cas le compte FTP m’amène directement dans le bon répertoire.
  • horodatage=$(date +%Y_%m_%d_%H_%M) : me permet de définir le format horaire donné à mes fichiers de log. + d'informations sur le sujet ici

Première exécution du script, à la main

Nous allons tester notre script, et puisqu'il pointe vers SERVER97, j'ai choisit pour l'occasion de le nommer /Sauvegarde/FTP/_SERVER97.sh

Je me connecte sous Putty et me déplace dans le bon répertoire :

> cd /Volume1/Sauvegarde/FTP

Notez ici Volume1 qui est lié à ma configuration de mes disques. Je penses sans me tromper de beaucoup que la majorité des utilisateurs de Syno basiques (= 2 baies) devront être dans mon cas. Sinon pensez bien à vous placer dans le bon répertoire et surtout à reporter la modification dans les paramètres du script !

Une solution plutôt pratique pour trouver votre propre valeur est d'aller voir dans les options de votre Synology > Gestionnaire de Stockage, l'information Volume1 Apparait directement sous vos yeux.

2013-04-15_141732.png

 

Une fois dans le bon répertoire, je me donne les droits d’exécution sur le script :

> chmod +x _SERVER97.sh

et je l’exécute :

> ./_SERVER97.sh

Selon le poids à récupérer de vos serveurs et la connectique entre les deux (youpi, moi je suis fibré) vous allez attendre près d'une minute pour laisser toutes les données se faire rapatrier. Vous pouvez voir l'avancement des travaux dans le répertoire /Sauvegarde/FTP où vous devriez voir apparaitre ET des fichiers de logs dans le sous répertoire correspondant ET un répertoire /SERVER97 se remplir de vos données dans un sous répertoire à la date du jour.

A la fin des opérations votre serveur FTP sera vidé des fichiers. C'est une option liée au protocole FTP qui peut être facilement annulée en mettant en commentaire la ligne dans le script

options=--Remove-source-files

Si tout fonctionne à ce niveau  on peut avancer d'un cran en automatisant la tâche un peu plus. Nous allons programmer son lancement à 7h00 et nous allons utiliser le programme SCREEN afin de ne pas bloquer notre Syno le temps de traitement tout comme vous avez été bloqué lors de la précédente exécution.

Seconde Exécution du script, via screen

Nous allons remédier au soucis précédent en faisant appel à screen qui sera capable, lui, de nous rendre la main immédiatement.

/volume1/@optware/bin/screen -dmS "SERVER97" /volume1/Sauvegarde/FTP/_SERVER97.sh

Normalement le retour est immédiat et aucun message ne vous dira si cela s'est bien passé, mais on peut retourner voir les logs dans /volume1/Sauvegarde/FTP/logs et constater que normalement un démarrage et un arrêt de script a bien eu lieu. Il nous reste maintenant à programmer l’exécution de notre script à sept heure du matin.

Troisième Exécution du script via crontab

Rappel du premier article : la commande unix crontab -e ne va pas fonctionner sur notre Synology, nous allons donc faire cette édition à la main.

> nano /etc/crontab

Cela va vous ouvrir l'éditeur des tâches cron. Vous ajoutez cette ligne en prenant bien soin de remplacer tous les espaces par des tabulations.

0 7 * * * root /volume1/@optware/bin/screen -dmS "SERVER97" /volume1/Sauvegarde/FTP/_SERVER97.sh

Vous enregistrez vos modifications (Ctrl + o, Entrée, Ctrl + x sous nano) et vous redémarrez le service Cron afin que ce dernier prenne en compte les nouveautés.

Avec DSM 4.x

> /usr/syno/etc.defaults/rc.d/S04crond.sh stop

Le serveur vous répond "Stop Crond"

> /usr/syno/etc.defaults/rc.d/S04crond.sh start

Le serveur vous répond "Starting crond...", vous avez terminé.

Avec DSM 5.x

> /usr/syno/sbin/synoservicectl --restart crond

Le serveur vous répond "crond restarted.", vous avez terminé.

Bon à savoir :

Il peut être intéressant de savoir 2-3 choses sur mes deux articles :

  • FTP est bien pour notre besoin, mais installer un transfert sécurisé serait plus intéressant (SFTP par exemple)
  • La méthode pour ajouter d'autres scripts tournant en simultané pour sauvegarder d'autres serveurs est tout a fait envisageable, il suffit de multiplier les fichiers .sh, et leur entrée dans crontab.
  • Utiliser cette méthode pour se connecter via SSH sur son serveur peut être envisageable si le port de votre serveur distant n'a pas été changé (port par défaut = 22) car apparemment Synology ne permettrait pas de le faire.

N'hésitez pas à me retourner votre avis sur ce script, à donner vos idées pour l'améliorer et évidement me dire si tout fonctionne chez vous !

comments powered by Disqus