12/08/2012 1 avis

Réaliser un système de sauvegarde sur un serveur 1&1

Réaliser un système de sauvegarde sur un serveur 1&1

Sachez que dans le cas d'un hébergement mutualisé comme chez 1&1 (par exemple), un backup des serveurs entiers (vous et les autres clients) est réalisé quotidiennement pour palier à une défaillance ou un crash d'un disque dur. En aucun cas, ces sauvegardes pourront être utilisé lors d'un piratage de votre FTP ou d'un accident de votre part...

Pour éviter ce drame, il est donc important de réaliser ses propres sauvegardes de ses bases de données et de ses fichiers. Je vous propose, donc ma propre "solution" qui permettra de faire cela les doigs dans le nez.


Pourquoi automatiser ses sauvegardes ?

Réaliser ses sauvegardes à la main est vraiment long et fastidieux, ce qui peut causer des erreurs ! De plus, en fesant ses sauvegardes manuellement, on n'a tendance à n'être pas assez ponctuel et régulier.

Pour ces raisons, je vous recommande grandement la mise en place d'une solution totalement automatisée et programmée à des fréquences récurrentes. Il faut limiter les risques !

Mise en place du script...

Pré-requis :

Avant toute chose, il est important d'effectuer les points suivants :

  • Se connecter en SSH sur votre espace personnel 1&1 (espace client pour les logs)
  • Disposer d'un second serveur distant accessible via SSH pour exporter vos backups quotidiens. J'utilise le serveur de l'université pour le moment.
  • Dans le serveur distant, créer le répertoire pour vos sauvegardes (par exemple : ~/backups)
  • Autoriser la connexion SSH entre les deux serveurs sans demande de mot de passe grâce à la clé RSA publique (un petit tutos bien pratique)

Créer le script :

Le Shellscript que je vous ai concocté permet d'effectuer les actions suivantes :

  • Export de plusieurs bases de données MySQL en fichier texte
  • Archivage et compression d'une liste de répertoires et des fichiers SQL exportés à sauvegarder
  • Transfert de l'archive au second serveur distant
  • Notification par e-mail
  • Nettoyage de l'espace de travail (les backup de plus de 10 jours d'anciennetés sont supprimés)
#!/bin/sh
# Script par HAEHNEL Jonathan - le 12.08.2012

# Bases de données MySQL à sauvegarder (tableau)
declare -a DB_NAME='([0]="db4xxxxxx8" [1]="db33xxxxxx0")'						# Nom des bases de données
declare -a DB_HOST='([0]="db4xxxxx.db.1and1.com" [1]="db2xxx.1and1.fr")'		# Host des bases de données
declare -a DB_USER='([0]="dbo4xxxxxx" [1]="dbo33xxxxxx")'					# Utilisateurs
declare -a DB_PASSWD='([0]="motdepass1" [1]="motdepass2")'				# Mots de passe (en clair)

# Répertoires à sauvegarder (tableau)
declare -a DIRECTORY_TO_SAVE='([0]="./blog/asset/upload" [1]="./blog/asset/images/article" [2]="./blog/asset/rss")'

# Autres informations
TMP_DIRECTORY='./tmp'					# Répertoire temporaire
BACKUP_DIRECTORY='./backup'				# Répertoire de backup
YOUR_EMAIL='jonathanhaehnel[at]gmail.com' 	# Votre adresse email
TEXT_NOTIFICATION=`echo "La sauvegarde de vos services a bien été effectué le" $(date +%Y-%m-%d\ à\ %Hh%M) "! (Message envoyé automatiquement - DO-NOT-REPLY)"`		# Contenu de la notification
SCP_INFOS='jhaehnel@turing.u-strasbg.fr:/users/x/jhaehnel/backup' # Serveur distant pour l'exportation de l'archive
NOTIFY_MAIL=1	# 1= notifier par email ou 0= ne pas notifier
ARCHIVE_NAME="backup_"$(date +%Y-%m-%d)".tar"

# --------------------------------------------------------------------------------------------------
# Ne pas modifier ci dessous ! ---------------------------------------------------------------------

echo "***** BACK-UP START *****"

#Verification de l'existance des repertoires
if ! [ -d $TMP_DIRECTORY ]
then
	mkdir $TMP_DIRECTORY
fi

if ! [ -d $BACKUP_DIRECTORY ]
then
	mkdir $BACKUP_DIRECTORY
fi

echo "> START of SQL dump"
COUNTER=0
while [ $COUNTER -lt ${#DB_HOST[*]} ] # Parcours des différentes bases de données du tableau
do
	echo ">> Dumping of" ${DB_NAME[$COUNTER]} "database ! [" `expr $COUNTER + 1` "of" ${#DB_HOST[*]} "]"
	mysqldump ${DB_NAME[$COUNTER]} -h${DB_HOST[$COUNTER]} -u${DB_USER[$COUNTER]} -p${DB_PASSWD[$COUNTER]} > $TMP_DIRECTORY"/"${DB_NAME[$COUNTER]}"_"$(date +%Y-%m-%d_%Hh%M).sql		#Dumping de la base de données courante
	COUNTER=`expr $COUNTER + 1`
done
echo "> END of SQL dump"

echo -e "\n> START Copying files to" $TMP_DIRECTORY
COUNTER=0
while [ $COUNTER -lt ${#DIRECTORY_TO_SAVE[*]} ]		# Parcours des différents répertoires du tableau
do
	echo ">> Copy of" ${DIRECTORY_TO_SAVE[$COUNTER]} "directory ! [" `expr $COUNTER + 1` "of" ${#DIRECTORY_TO_SAVE[*]} "]"
	cp -R ${DIRECTORY_TO_SAVE[$COUNTER]} $TMP_DIRECTORY		# Copie recursive des fichiers du dossier courant dans le dossier temporaire
	COUNTER=`expr $COUNTER + 1`
done
echo "> END Copying files to" $TMP_DIRECTORY

echo -e "\n> START creating final archive"
(cd $TMP_DIRECTORY; tar cf $ARCHIVE_NAME *; gzip -9 $ARCHIVE_NAME)	# Archivage et compression
mv $TMP_DIRECTORY"/"$ARCHIVE_NAME".gz" $BACKUP_DIRECTORY			# On déplace l'archive dans le dossier des backups
echo ">> TAR archive and GZIP compression complete !"
echo "> END creating final archive"


echo -e "\n> START sending the archive to " $SCP_INFOS
scp $BACKUP_DIRECTORY"/"$ARCHIVE_NAME".gz" $SCP_INFOS	#On envoye l'archive crée sur notre serveur distant
echo "> END sending the archive"

if [ $NOTIFY_MAIL -eq 1 ]
then
	echo -e "\n> NOTIFY by email OK !"
	echo $TEXT_NOTIFICATION | mail -s "[BACK-UP] Confirmation" $YOUR_EMAIL	#On envoye l'email de confirmation
fi

echo -e "\n> START Cleaning workspace"
find $BACKUP_DIRECTORY -type f -ctime +10 -name 'back*' -exec rm -f {} \; 	#On supprime les backups de plus de 10 jours
rm -R $TMP_DIRECTORY"/"* 													#On nettoye le repertoire temporaire
echo "> END Cleaning workspace"
echo "***** BACK-UP DONE *****"
Remarque: Les logs pour la connexion à vos bases de données sont en clair dans le script, c'est pas très grave de toute facon, ils le sont également dans vos script PHP, etc...

Exemple d'exécution du script magique :

Après avoir rajouter le script dans votre espace personnel (htdocs), complètez-le avec vos propres paramètres et rendez-le executable avec la commande suivante : chmod 700 backup_script.sh

(uiserver):u59xxxxxxxx:~ > ./backup_script.sh
***** BACK-UP START *****
> START of SQL dump
>> Dumping of db41xxxxxxx database ! [ 1 of 2 ]
>> Dumping of db33xxxxxxx database ! [ 2 of 2 ]
> END of SQL dump

> START Copying files to ./tmp
>> Copy of ./blog/asset/upload directory ! [ 1 of 3 ]
>> Copy of ./blog/asset/images/article directory ! [ 2 of 3 ]
>> Copy of ./blog/asset/rss directory ! [ 3 of 3 ]
> END Copying files to ./tmp

> START creating final archive
>> TAR archive and GZIP compression complete !
> END creating final archive

> START sending the archive to  jhaehnel@turing.u-strasbg.fr:/users/x/jhaehnel/backups
backup_2012-08-12.tar.gz                      100%   25MB   2.8MB/s   00:09
> END sending the archive

> NOTIFY by email OK !

> START Cleaning workspace
> END Cleaning workspace
***** BACK-UP DONE *****
Amélioration: Vous pouvez, si vous le souhaité rajouter par exemple, un méchanisme de chiffrage des données avant l'envoi sur le serveur distant pour que personne d'autre puisse lire vos données personnelles. La sécurité avant tout !

Automatiser l'execution avec l'outil "cron" :

Cron est un petit utilitaire qui permet d'effectuer automatique une liste de tâches récurrentes à des dates précises. Par chance, ce dernier est directement installé sur les serveurs mutualisés de 1&1 (sous linux).

Une tâche Cron possède obligatoirement six arguments pour définir son execution :

  • Minute (0 à 59)
  • Heure (0 à 23)
  • Jour du mois (1 à 31)
  • Mois (1 à 12)
  • Jour de la semaine (0 à 7)
  • Commande/script à executer

Par exemple, j'ai choisi d'executer mon script tous les jours à 18h, voici la rêgle :

crontab -e	# Permet de définir une tâche (crontab -l pour vérifier)
0 18 * * * ./backup_script.sh

Vos réactions 1 avis

Comment #1

Mathieu a écrit : le 28/11/2014 à 12:01am

Merci beaucoup pour votre script qui vient de me faire gagner de nombreuses heures.

Par contre j'ai une question (de newbie):

Je souhaite sauvegarder/télécharger cette archive sur mon PC local sous Windows 7 64bits.

J'ai lu la notice de PSCP sans vraiment comprendre
http://marc.terrier.free.fr/docputty/Chapter5.html

Dois-je installer PSCP en plus de Putty ?

Pouvez-vous me donner un exemple concret ?

Merci par avance ;-)