Outils pour utilisateurs

Outils du site


admin-systeme:gestion-des-sauvegardes-ftp

Gérer simplement les sauvegardes d'un serveur par FTP

Changelog
26/06/13 : Ajout de la purge des archives après un mois.
02/05/13 : Script rafraichi et ajout de la sauvegarde des bases PostgreSQL.

Objectif

Mettre en place un processus de sauvegarde automatique simple pour l'ensemble des données d'un serveur Linux grâce à un envoi FTP.

Prérequis

  • Serveur FTP distant
  • crontab installé et lancé
  • Quelques connaissance en bash scripting

Introduction

Avant tout j'insiste sur le serveur FTP. Conserver vos sauvegarde sur votre serveur ne vous sera d'aucune utilité en cas de problème…

Dans ce tutoriel, j'ai choisi de sauvegarder un certain nombre d'élement. A vous, ensuite, d'adapter le script de sauvegarde en fonction de vos besoins. Voici la liste des sauvegardes effectuées :

  1. Toutes les bases MySQL du serveur.
  2. Les fichiers de mails générés par le serveur Postfix.
  3. Les fichiers de configuration d'Apache, de Postfix, de Dovecot.
  4. L'ensemble des fichiers contenus sur le serveur web (ainsi que ceux du SVN).

Script de sauvegarde

Le processus de sauvegarde mis en place est simple. On va créer un script qui va créer des archives contenant les données que l'on souhaite sauvegarder. Ce script se charge ensuite d'envoyer les archives fraichement créée sur le serveur FTP distant.

En cas de problème, il suffit ensuite de récupérer la dernière archive et la remettre en place sur le serveur.

Les archives générées sont de la forme : date-type_de_sauvegarde.tar.gz.

save.sh
#!/bin/bash
#########################################################################
#	Save server by FTP:                                                   #
#   - conf : config files for software on the server (e.g httpd)	      #
#   - databases :   Backup each MySQL and PostgreSQL Databases          #
#   - mail : Save mail files for user (postfix server)                  #
#   - www : Save Webserver (HTML + SVN)                                 #
#########################################################################
 
if [ ! $# -eq 4 ];then
	echo "Usage: $0 FTP_HOST FTP_USER FTP_PASS conf|databases|mail|www"
	exit 2
fi
 
FTP_HOST=$1
FTP_USER=$2
FTP_PASS=$3
 
DATE=`date '+%Y%m%d%H%M'`
NAME_DIRSAVE=$4
DIRSAVE=/save/${NAME_DIRSAVE}
LOG=${DIRSAVE}/log/${DATE}.log
 
# Create archive
FILE=${DATE}-${NAME_DIRSAVE}.tar.gz
# conf
if [ "$NAME_DIRSAVE" == "conf" ]; then  
  tar cPfz "${DIRSAVE}/${FILE}" /etc/httpd/ /etc/postfix /etc/dovecot >> $LOG
# databases
elif  [ "$NAME_DIRSAVE" == "databases" ]; then
  cd ${DIRSAVE}/sql
  rm -f *
 
  for db in `mysql -uroot -h localhost -pmotdepasse -Bse 'show databases'`; do 
    # mysqldump n'est pas autorisé à faire un backup de la table sys information_schema
    if [ "$db" != "information_schema" ]; then
      mysqldump -uroot -h localhost -pmotdepasse --events $db > mysql-${db}.sql
    fi
  done
 
  # Connexion à la base : l'utilisateur que vous choisissez doit avoir accès à toutes les bases de données
  export PGUSER=postgres
  export PGPASSWORD=motdepasse
 
    # template0 n'accepte pas les connexions
    if [ "$db" != "template0" ]; then
      pg_dump $db > pgsql-${db}.sql
    fi
 
  tar cPfz "${DIRSAVE}/${FILE}" *.sql  >> $LOG
# mail
elif [ "$NAME_DIRSAVE" == "mail" ]; then
  tar cPfz "${DIRSAVE}/${FILE}" /home/user/mail  >> $LOG
# www
elif [ "$NAME_DIRSAVE" == "www" ]; then
  tar cPfz "${DIRSAVE}/${FILE}" /var/www/html /var/www/svn  >> $LOG
# ERROR
else
  echo "Type de sauvegarde inconnu"
  exit 3
fi
 
# Upload with ftp server
cd ${DIRSAVE}
ftp -in << EOF >> $LOG
  open ${FTP_HOST}
  user ${FTP_USER} ${FTP_PASS}
  bin
  verbose
  prompt
  cd ${NAME_DIRSAVE} 
  put ${FILE}
  bye
EOF
 
find ${DIRSAVE}/ -type f -mtime +31 -exec /bin/rm -f {} \;

Pensez à configurer vos connexions aux bases de données.

Paramètres du script

  1. FTP_HOST : Adresse du serveur FTP distant
  2. FTP_USER : Nom d'utilisateur du compte FTP
  3. FTP_PASS : Mot de passe correspondant
  4. Type de sauvegarde
    • conf : sauvegarde les fichiers de configuration choisis
    • databases : fait un backup de toutes les bases MySQL contenues par le serveur
    • mail : sauvegardes les fichiers de mail choisis
    • www : sauvegarde l'intégralité des répertoires /var/www/html et /var/www/svn

Création des répertoires

Dans la configration actuelle du script un certain nombre de répertoires doivent être créés à la fois sur le serveur local et sur le serveur FTP distant.

Server local

Sur le serveur local les répertoires créés permettent de stocker les archives générées par le script ainsi que les logs correspondants.

Créez les répertoire avec les commandes suivantes :

mkdir -p /save/conf/log
mkdir -p /save/databases/log
mkdir -p /save/databases/sql
mkdir -p /save/mail/log
mkdir -p /save/www/log

Serveur FTP distant

Les répertoires sur le serveur distant permettent d'organiser les archives de sauvegarde.

Connectez vous à votre serveur FTP :

$ ftp hostname

Et exécuter les commandes de création de répertoires :

mkdir conf
mkdir databases
mkdir mail
mkdir www

Tout est prêt. On peut maintenant automatiser tout ça…

Création des crontab

Les crontabs sont des tâches planifiées qui vont vous permettre au serveur d'effectuer les sauvegardes automatiquement.

Lancez la commande avec l'utilisateur root (ou avec sudo) :

$ crontab -e

Ajoutez les lignes suivantes (et modifiez la fréquence d'exécution en fonction de vos besoins) :

# Sauvegarde des mails (tous les jours à 4h)
0 4 * * * /chemin/vers/script/savegardes.sh FTP_Hostname FTP_User FTP_Password mail
 
# Sauvegarde du serveur web (tous dimanches 5h)
0 5 * * 7 /chemin/vers/script/savegardes.sh FTP_Hostname FTP_User FTP_Password www
 
# Sauvegarde des fichiers de configuration (tous les lundis à 5h)
0 5 * * 1 /chemin/vers/script/savegardes.sh FTP_Hostname FTP_User FTP_Password conf
 
# Sauvegarde de toutes les bases de données MySQL (tous les jours à 4h30)
30 4 * * * /chemin/vers/script/savegardes.sh FTP_Hostname FTP_User FTP_Password databases

Remplacez bien sûr les variables avec les valeurs qui vont bien.

Rappel sur le fonctionnement des crontabs ici.

Ajout de nouveaux types de sauvegarde

Il est possible que vous ayez besoin d'ajouter d'autres types de sauvegarde.

Pour cela, il suffit de créer un nouveau répertoire dans le dossier /save/ qui correspond au nom du type, ainsi que son dossier de log associé.

mkdir -p /save/nouveautype/log

Créer ensuite le répertoire du même nom sur le serveur distant. Comme il a été fait dans cette partie.

Il faut également ajouter quelques lignes dans le script principal. Dans l'intruction if générale, ajoutez avant le else :

if [ "$NAME_DIRSAVE" == "nouveautype" ]; then
    # Commandes de sauvegardes à insérer ici.

Ajoutez enfin la ligne correspondant dans le crontab :

# Sauvegarde de mon nouveau type (toutes les heures)
0 * * * * /chemin/vers/script/savegardes.sh FTP_Hostname FTP_User FTP_Password nouveautype
admin-systeme/gestion-des-sauvegardes-ftp.txt · Dernière modification: 2013/06/26 19:02 par Arthur Hoaro