Procédure automatisée de sauvegardes

De VK Wiki
Aller à : navigation, rechercher

Introduction

La procédure automatisée de sauvegarde de sites web est un mécanisme faisant appel à deux modules de Linux, cron[1] qui permet de planifier le lancement d'instructions, et curlftpfs[2] qui est un outil à installer, permettant de monter un serveur FTP comme s'il s'agissait d'un disque interne.

Cette procédure n'est pas installée de base sur nos serveurs, il faut donc l'installer avec chaque nouveau serveur, si cela est nécessaire.

Installation détaillée

Toutes les instructions ci-dessous sont à réaliser de préférence en mode su (super utilisateur)

Création d'un utilisateur de base de données pour les sauvegardes

Tout est dans le titre. Pour créer un utilisateur qui aura le droit de créer des sauvegardes, et qui sera utilisé par les scripts sans compromettre le mot de passe d'un utiliseur existant, on doit tout d'abord lancer le client mysql à l'aide de l'instruction suivante : mysql -uroot -p

Mysql est le client de base de données, -u force la connexion via un utilisateur particulier, ici il s'agit de root (noter qu'il n'y a pas d'espace entre l'option -u et le nom d'utilisateur), -p force la demande de mot de passe. Il est possible de saisir le mot de passe directement après l'option -p, toujours sans espace, mais cela est peu recommandé dans le cas présent.

Une fois dans l'application mysql, saisir et exécuter les deux instructions ci-dessous, l'une après l'autre :

CREATE USER 'svg_user'@'localhost' IDENTIFIED BY '*****';
GRANT SELECT, SHOW VIEW, LOCK TABLES, PROCESS, REPLICATION CLIENT ON *.* TO 'svg_user'@'localhost';
exit

Avec les deux premières instructions, on créé un utilisateur svg_user, qui ne peut se connecter qu'en local (interne au serveur) avec le mot de passe ******, et cet utilisateur n'a que les droits de lecture (SELECT, SHOW VIEW), de blocage de tables (LOCK TABLES - ce qui permet de figer la table pendant le traitement), de lancer des processus et des réplications sur toutes les bases. La dernière ligne, sans surprise, quitte l'application mysql. Ne pas oublier les points-virgules à la fin des deux premières instructions.

Installation de CURLFTPFS

Curlftpfs est un outil qui permet de monter un serveur FTP comme s'il s'agissait d'un disque interne au serveur. Concrètement, on indique à l'outil les informations de connexion à un serveur FTP, et un répertoire de destination sur le serveur. Une fois l'outil lancé, on peut accéder au serveur FTP ainsi enregistré en entrant simplement dans le répertoire de destination.

Pour installer curlftpfs, saisir l'instruction suivante en mode SU :

apt-get install curlftpfs


Ensuite, il faut créer un répertoire local par lequel on accèdera au serveur FTP. Dans notre cas, nous le nommons ftp_stockage, et il se situe dans le répertoire /mnt, mais il pourrait s'appeler autrement et se situer dans un autre répertoire, auquel cas il faudrait adapter les informations de connexion dans les instructions suivantes

mkdir /mnt/ftp_stockage

Ensuite, il faut rechercher les informations pour se connecter au serveur FTP où la sauvegarde devra être faite. Dans notre cas, il s'agit du serveur 192.168.123.55 et plus précisemment du répertoire StudioH dans ce serveur.

serveur hôte : 192.168.123.55:/StudioH
utilisateur  : devweb
mot de passe : *******
note : ce serveur n'est accessible qu'à l'interne du réseau de la compagnie


Pour faire la liaison entre le répertoire créé, /mnt/ftp_stockage et le serveur FTP indiqué ci-dessus, on lance l'instruction suivante :

curlftpfs -o allow_other user:*****@192.168.123.55:/StudioH /mnt/ftp_stockage/
  • curlftpfs est le nom de la commande
  • -o allow_other est une option qui permet aux autres utilisateurs que root d'accéder aux données, car le propriétaire du contenu de /mnt/ftp_stockage reste root
  • devweb:******@192.168.123.55:/StudioH correspond aux informations, sous forme standard, de connexion au serveur FTP ; (utilisateur):(mot de passe)@(adresse serveur):(chemin sur le serveur)
  • répertoire local qui servira de passerelle

une fois cette instruction lancée, on peut accéder au serveur StudioH simplement en entrant dans le répertoire /mnt/ftp_stockage, par exemple à l'aide de l'instruction cd /mnt/ftp_stockage


L'accès est maintenant créé, mais si le serveur devait être redémarré, cet accès serait alors perdu. Pour palier ce problème, on peut ajouter un script de montage dans le répertoire /etc/init.d/

-> /etc/init.d/ est un répertoire qui contient tous les scripts sous forme bash à lancer au démarrage du serveur

saisir l'instruction ci-dessous pour créer un script à exécuter à chaque démarrage, et qui connectera le serveur FTP au répertoire ftp_stockage

nano /etc/init.d/stockage.sh

Dans le fichier nouvellement créé, ajouter les lignes suivantes :

#! /bin/sh
# /etc/init.d/stockage.sh
curlftpfs -o allow_other user:******@192.168.123.55:/StudioH /mnt/ftp_stockage/
exit 0
  • Les deux premières lignes sont facultatives, mais fortement recommandées. La première précise le langage et l'interpréteur de ce langage, en l'occurence /bin/sh (il pourrait s'agir d'un script Python ou javascript), *la deuxième est un rappel du fichier ouvert, pour éviter les confusion.
  • la troisième ligne est l'instruction que nous avons utilisée pour connecter le serveur FTP au répertoire /mnt/ftp_stockage
  • La dernière ligne sert à sortir du script proprement (exit 0 signifie qu'aucun problème n'est à signaler, exit 1 signifie qu'il y a une erreur, etc.)

Quitter et enregistrer avec la combinaison de touches au clavier Ctrl + X puis taper y pour confirmer.

Une fois le fichier /etc/init.d/stockage.sh enregistré, il faut indiquer au système qu'il s'agit d'un script exécutable avec l'instruction suivante :

chmod +x /etc/init.d/stockage.sh

Création des scripts de sauvegarde

Cette étape décrit comment créer des scripts exécutables qui produiront des sauvegardes de sites web. Pour des raisons de confort, ces scripts se situeront dans le répertoire '/home/svg_serveur' qui contiendra lui-même un répertoire sh (nous verrons plus tard son utilité)

Pour créer ces répertoires, saisir l'instruction suivante : mkdir -p /home/svg_serveur/sh

L'option -p de l'instruction mkdir permet de créer le répertoire sh et le répertoire parent, car celui-ci n'existe pas. Sans cette option, l'instruction retournerait une erreur car il faudrait d'abord créer le répertoire /home/svg_serveur, et ensuite le répertoire sh

Point d'entrée des scripts de sauvegarde

Un serveur peut comporter un ou plusieurs sites web. Si la gérer les sauvegardes d'un seul site web est relativement simples, s'il y en a plusieurs, cela peut se révéler vite fastidueux, car dans l'étape suivante de programmation du CRON, il faudrait créer autant de lignes que de sites web à sauvegarder. Nous allons simplifier cela en créant un script qui appellera les scripts de sauvegarde.

nano /home/svg_serveur/sauvegarde.sh

Dans le fichier nouvellement créé, ajouter les lignes suivantes :

#! /bin/sh
for file in /home/svg_serveur/sh/*.sh
do
$file
done
exit 0
  • La première ligne est toujours là pour indiquer le type de script
  • La deuxième ligne balaie tous les fichiers qui se terminent par .sh et enregistre à chaque fois le nom du fichier en cours dans la variable file
  • Les trois lignes suivantes sont les instructions à réaliser à chaque boucle du balayage. L'instruction do est le début de la boucle, et l'instruction done la fin de la boucle. À l'intérieur de la boucle, on souhaite exécuter le fichier balayé.
  • La dernière ligne est une sortie « propre » du script.

Pour résumer, le script sauvegarde.sh va rechercher tous les fichiers scripts .sh contenus dans le répertoire sh, et les exécuter l'un après l'autre.

Pour rendre le script sauvegarde.sh exécutable, saisir l'instruction suivante :

chmod +x /home/svg_serveur/sauvegarde.sh

Scripts de sauvegarde

Le répertoire /home/svg_serveur/sh peut comporter autant de scripts que de sites web à sauvegarder ; ils devront simplement se terminer avec l'extension .sh et être exécutables. Pour neutraliser temporairement un script particulier sans le supprimer, il suffit de remplacer l'extension .sh par une autre extension (par exemple .block ou .bak ou .inactif ou n'importe quoi d'autre que .sh)

Exemple avec le site arrowleasing.com. Créer le fichier script à l'aide de l'instruction suivante :

nano /home/svg_serveur/sh/arrowleasing.sh

Et y inscrire les lignes suivantes :

#! /bin/sh
cd /home/svg_serveur
NOW=$(date +"%Y-%m-%d")
SRVNAME="arrowleasing.ca"
DBNAME="enterprise-arrowleasing"
mkdir -p /mnt/ftp_stockage/svg_serveurs/aeronautique/$SRVNAME/$NOW
tar cjvf site.tar.bz2 /home/www/$SRVNAME
mv ./site.tar.bz2 /mnt/ftp_stockage/svg_serveur/aeronautique/$SRVNAME/$NOW
mysqldump -usvg_user -p****** $DBNAME | bzip2 > $DBNAME.sql.bz2
mv $DBNAME.sql.bz2 /mnt/ftp_stockage/svg_serveur/aeronautique/$SRVNAME/$NOW
chmod -R 777 /mnt/ftp_stockage/svg_serveurs/aeronautique/$SRVNAME/$NOW
exit 0
  • La première ligne indique le type de script
  • La seconde ligne change le répertoire courant, pour que les fichiers temporaires y soient enregistrés, et faciles à retrouver au cas où une erreur se produirait
  • La ligne suivante enregistre la date courante au format Année-mois-jour dans la variable NOW
  • La ligne suivante enregistre le répertoire du site à sauvegarer qui se trouve dans le répertoire /home/www ; il servira aussi pour le nom du répertoire de sauvegarde
  • La ligne commençant par DBNAME= enregistre le nom de la base de données à sauvegarder dans la variable DBNAME
  • Ensuite on créé le répertoire du jour pour la sauvegarde sur le serveur FTP (connecté via le répertoire /mnt/ftp_stockage) ; $SRVNAME contient le nom du site, $NOW la date
  • On compacte le contenu du site à sauvegarder (/home/www/$SRVNAME) dans le fichier site.tar.bz2
  • On déplace le fichier site.tar.bz2 dans le répertoire d'archivage
  • Ensuite on récupère le contenu de la base de donnée enregistrée dans la variable $DBNAME, et on la compacte directement. MySQLDump est l'outil qui permet de ressortir les données d'une base, l'option -u indique l'utilisateur qui se connecte (attention, pas d'espace entre l'option -u et le nom d'utilisateur), l'option -p le mot de passe de l'utilisateur, et on indique le nom de la base à sauvegarder.
la barre verticale | est l'opérateur « pipe » (ou tube)[3]. Il signifie que l'instruction située à sa gauche envoie son résultat à l'instruction à la droite de la barre verticale ou tube. Ainsi, dans cette instruction, le résultat de mysqldump, qui est un flux de données, est directement envoyé à l'application bzip2 en paramètre, qui compacte ces données et les inscrit dans un fichier $DBNAME.sql.bz2
  • Dans l'avant dernière ligne, on ouvre tous les droits (lecture, écriture...) à tout le monde au répertoire de sauvegarde nouvellement créé, ainsi qu'à son contenu
  • Dernière ligne, on ferme le script proprement

Si le site à sauvegarder ne comporte pas de base de données, on peut neutraliser les lignes associées à la base de données avec le caractère dièse #

#DBNAME="enterprise-arrowleasing"
#mysqldump -usvg_user -p******* $DBNAME | bzip2 > $DBNAME.sql.bz2
#mv $DBNAME.sql.bz2 /mnt/ftp_stockage/svg_serveur/aeronautique/$SRVNAME/$NOW


Tous les scripts enregistrés, il faut les rendre exécutables, ce qui peut se faire avec l'instruction

chmod +x /home/svg_serveur/sh/*.sh


Ceci fait, il est enfin possible de tester les scripts. Les scripts peuvent être lancés un par un, en tapant directement le chemin complet de chaque script, ou bien tous à la fois en lançant le script /home/svg_serveur/sauvegarde.sh

Planification des sauvegardes avec CRON

À cette étape de la documentation, tous les scripts de sauvegardes sont faits et testez. Reste à demander au système de les exécuter sur une base régulière. Cela se fait à l'aide de l'utilitaire CRON[4]

Derrière ce nom un peu intimidant (diminutif de crontab, contraction du grec Chronos (temps) et du latin tabula -> table), se cache un outil relativement simple d'utilisation. En effet, pour planifier des traitements dans le système, il faut les ajouter dans la table chronologique du système. Celle-ci est en fait un fichier texte accessible à l'aide de l'instruction crontab -e

S'il s'agit de la première fois que la table chronologique est éditée, l'application demande avec quel éditeur de texte ouvrir le fichier table chronologique. En général, il propose l'éditeur nano par défaut (choix 1), donc si le numéro correspondant à nano est sélectionné, appuyer sur Enter.


Descendre jusqu'à la fin du fichier, ou se trouve la ligne

# m h dom mon dow command

Ajouter à la suite de cette ligne, ajouter la ligne suivante :

20 0 * * * /home/svg_serveur/sauvegarde.sh

En effet, cette ligne signifie que le script /home/svg_serveur/sauvegarde.sh sera exécuté tous le jours à 00h20.

  • La première colonne correspond aux minutes du moment où lancer le script ; ici 20 pour 00h20
  • La deuxième colonne correspond à l'heure du moment à laquelle lancer le script ; ici 0 pour 00h20
  • La troisième colonne est le jour du mois auquel il faut lancer le script ; ici une étoile pour n'importe quel jour du mois
  • La quatrième colonne est le jour de la semaine auquel il faut lancer le script ; ici une étoile pour n'importe quel mois
  • Enfin la dernière colonne est l'instruction à lancer au moment indiqué ; ici une étoile pour n'importe quel jour de la semaine.

le caractère étoile * signifie « n'importe quel »

Ainsi, pour lancer un traitement /home/repertoire/montraitement.sh tous les lundis à 13h30, il faudrait saisir la ligne 30 13 * * 1 /home/repertoire/montraitement.sh
Si on veut qu'il soit lancé tous les 15 du mois, alors ce sera 30 13 15 * * /home/repertoire/montraitement.sh, et si l'on veut tous les jours du mois de février, alors ce sera 30 13 * 4 * /home/repertoire/montraitement.sh, tous les lundis du mois d'avril 30 13 * 4 1 /home/repertoire/montraitement.sh, etc.


Résumé des instructions à lancer

su
mysql -uroot -p
CREATE USER 'svg_user'@'localhost' IDENTIFIED BY '*******';
GRANT SELECT, SHOW VIEW, LOCK TABLES, PROCESS, REPLICATION CLIENT ON *.* TO 'svg_user'@'localhost';
exit
apt-get install curlftpfs
mkdir /mnt/ftp_stockage
curlftpfs -o allow_other devweb:*******@192.168.123.55:/StudioH /mnt/ftp_stockage/
nano /etc/init.d/stockage.sh
#! /bin/sh
# /etc/init.d/stockage.sh
curlftpfs -o allow_other devweb:*******@192.168.123.55:/StudioH /mnt/ftp_stockage/
exit 0
chmod +x /etc/init.d/stockage.sh
mkdir -p /home/svg_serveur/sh
nano /home/svg_serveur/sauvegarde.sh
#! /bin/sh
for file in /home/svg_serveur/sh/*.sh
do
$file
done
exit 0
chmod +x /home/svg_serveur/sauvegarde.sh
nano /home/svg_serveur/sh/{site web}.sh
#! /bin/sh
cd /home/svg_serveur
NOW=$(date +"%Y-%m-%d")
SRVNAME="{site web}"
DBNAME="{nom base de données}"
mkdir -p /mnt/ftp_stockage/svg_serveurs/aeronautique/$SRVNAME/$NOW
tar cjvf site.tar.bz2 /home/www/$SRVNAME
mv ./site.tar.bz2 /mnt/ftp_stockage/svg_serveur/aeronautique/$SRVNAME/$NOW
mysqldump -usvg_user -p***** $DBNAME | bzip2 > $DBNAME.sql.bz2
mv $DBNAME.sql.bz2 /mnt/ftp_stockage/svg_serveur/aeronautique/$SRVNAME/$NOW
chmod -R 777 /mnt/ftp_stockage/svg_serveurs/aeronautique/$SRVNAME/$NOW
exit 0
chmod +x /home/svg_serveur/sh/*.sh
crontab -e
# m h dom mon dow command
20 0 * * * /home/svg_serveur/sauvegarde.sh




  1. https://fr.wikipedia.org/wiki/Cron
  2. http://curlftpfs.sourceforge.net
  3. https://fr.wikipedia.org/wiki/Tube_(shell)
  4. https://fr.wikipedia.org/wiki/Cron