CRÉER SCRIPT BAT POUR SAUVEGARDE RÉGULIÈRE DE SITES WEB


Pourquoi un backup ?

Qui n’a jamais cherché à créer un système de sauvegarde de son site sur son disque local ? Si vous n’y aviez jamais pensé, il serait temps de le faire ! imaginez-vous ? Perdre votre liste de membres inscrits sur le site et ne pas avoir de moyen de restauration… Ou encore, perdre l’ensemble du site… Un beau paquet d’ennuis qu’il est préférable d’éviter !

Attention: Supposant que nous sommes sur notre pc personnel, pour simplifier l’exemple nous utiliserons des identifiants dans un fichier.txt classique. Les perfectionnistes de la sécurité devront trouver un moyen de compiler et chiffrer les données de connexion.

Processus de sauvegarde

Voici ce que produira le script final. Un clic ou un lancement planifié de Windows activera le script. Celui-ci téléchargera le site complet (ou le répertoire que vous désirez), il téléchargera ensuite la ou les bases SQL. Tout sera empaqueté dans une archive compressée et renommée au nom de votre sauvegarde et à la date du jour. Les sauvegardes, vieilles de plus de X jours, seront automatiquement supprimées afin de ne pas gonfler le dossier de backup avec le temps. Une fois la sauvegarde terminée, un log d’erreur sera créé dans un fichier log.txt et envoyé en pièce jointe sur le compte email que vous choisirez.

Un script en .BAT

Les fichiers.bat sont des petits scripts permettant d’inscrire et d’automatiser plusieurs commandes MS-DOS: le langage de script par défaut de Windows. Longtemps critiqué pour sa structure de développement hasardeuse en comparaison aux scripts shell de Linux, il est toujours utilisé par les administrateurs système Microsoft. Même si le « .bat » est considéré comme obsolète et que le Python ou encore le powerShell gagne du terrain, ce langage de la préhistoire a encore quelques années devant lui.

Les Étapes de création pour notre sauvegarde

Détaillons comment cet automatisme va fonctionner. Nous utiliserons quelques outils externes, n’allons pas réinventer la roue quand des fonctions sont déjà développées pour nous faciliter la vie.

Téléchargement du site web par le protocole FTP

Comme nous ciblons avant tout le web, il est normal d’utiliser un protocole adéquat, en l’occurrence : FTP. Afin d’éviter toute complication, nous nous servirons de l’interface commande du célèbre WinSCP en mode portable. Pourquoi pas la commande native en dos ? Parce qu’il nous faudrait créer une boucle récursive pour reconstruire chaque arborescence de dossier, je suis sûr que cela ne vous enchanterez pas et moi non plus.

Pour télécharger WinScp : rendez-vous sur le winscp.net , cliquez « Download WinSCP », puis sur « Portable executable ».

Téléchargement de la base de données

Évitons un traitement coté serveur, les consommations de ressource, la sécurité, ça n’en vaut pas le coup. L’idéal serait de pouvoir obtenir directement la base de données par un outil SQL local. Nous aurons besoin, pour cela, de deux conditions essentielles:

Compression de la sauvegarde

Nous utiliserons le fameux logiciel gratuit et disponible en interface de commande 7Z. Celui-ci nous permettra de créer une archive compressée de nos fichiers et un renommage avec la date du jour. Pour télécharger 7Z, rendons-nous sur le site www.7-zip.org . Dans la section Download, télécharger la version en ligne de commande.

Logs d’erreur et envoi par mail

Pour finir, nous créerons un log d’erreurs, pour voir si tout se passe bien, et on enverra ce rapport par mail à une adresse favorite. Ce procédé nous permettra d’être au point avec ce qu’il s’est passé en cas de coupure serveur ou autres incidents. Pour parvenir à nos fins, on utilisera le fichier de commande SendMail. Celui-ci est disponible sur le site : www.sendmail.com . (cliquez en bas sur le lien en bleu (avec support TLS)

Création du script

Êtes-vous prêt pour cette ubuesque aventure vers le chemin du « moi profond » de notre fainéantise qui nous pousse à devenir plus intelligent chaque jour ? Oui ? Alors c’est parti.

Créons notre dossier Backup

Tout d’abord, pour éviter toute ambigüité, veillez à rassembler tous les outils que nous avons téléchargés dans un même dossier. Ensuite, créons un dossier nommé, par exemple, « backup ». Dans ce dossier, nous allons organiser notre architecture :

Créons un nouveau dossier nommé « lib » qui représentera toutes les ressources utilisées pour notre script. Dans ce dossier « lib » on va de nouveau créer un dossier outils pour nos applications, un dossier login pour les identifiants de connexion, et un dossier logs pour le rapport d’erreurs.

Dans le dossier outils, créez un dossier pour chaque outil, et insérez-les dans chaque répertoire concerné, on devrait avoir une architecture ressemblant à cela :

Voilà, enfin on y est ! Tout est prêt.

Notre script de sauvegarde

Créons notre fichier bat à la racine du site, nous le nommerons « Backup.bat » (voir l’article pour activer la modification des extensions Windows).

Initialisation

Pour ne pas afficher chaque exécution de commande, ajoutons la première ligne à notre fichier:

@echo off

Ensuite, inscrivons directement dans notre log que nous démarrons la sauvegarde, cette ligne permettra d’écrire dans le fichier log.txt que la sauvegarde aura démarré avec la date du jour en information.  :

ECHO ----- Sauvegarde du %DATE% Pour le site ____ ----- >lib/logs/log.txt

Définissons notre variable de temps pour les sauvegardes « périmées » après 21jours.

rem Stoquage des fichiers (en jours) avant supressionset age=21

Téléchargement FTP

Pour le téléchargement FTP, copiez à la suite du script :

rem ____ Connexion au serveur FTP
lib\outils\winscp\winscp.com /script=lib/login/login.txt
if ERRORLEVEL 1 (
	CALL :ERREUR_APP %%fonction de connexion FTP
	) ELSE (
	CALL :OK_APP %%connexion FTP
)

Ce script appelle l’outil WinScp dans le chemin indiqué, et le fichier de connexion que nous allons créer juste après. Le reste du script est une simple condition qui appellera la fonction d’écriture des logs d’erreur (rassurez vous, la fonction sera définie à la fin du code) .

Pour créer le fichier de connexion, aller dans le dossier « lib » puis « login » et ajouter un nouveau fichier nommé : login.txt . Recopiez le code et remplacez les exemples par vos propres identifiants :

option batch on
option confirm off

open ftp://login:motdepasse@ftp.monadresse.net
option transfer binary 
get /monRepertoireWeb
close 
exit

La sauvegarde s’effectuera dans un nouveau dossier au même nom que le répertoire FTP ciblé.

Sauvegarde SQL

Pour la sauvegarde SQL, recopiez le script ci-dessous à la suite de vos commandes et remplacez les données exemples :

rem ____ Sauvegarde Sql
call lib\outils\sql\mysqldump.exe -u login -pmotDePasse -h sql.votreHost.net NomDeLaBase > monRepertoire\MomSite-%DATE:~0,2%-%DATE:~3,2%-%DATE:~8,2%.sql
 if ERRORLEVEL 1 (
 	CALL :ERREUR_APP %%Sauvegarde SQL  MomSite
 	) ELSE (
 	CALL :OK_APP %%Sauvegarde SQL  MomSite
 )

Un petit bout de script bien fourni. Attention ici, le mot de passe doit être collé au paramètre « -p » et le nom monRepertoire doit être le même que celui de votre sauvegarde FTP, sinon le script plante.

Compression de l’ensemble

Et encore un bout de script à copier à la suite. Ici nous reprenons le dossier temporaire (même nom que le répertoire FTP) qui contient notre site et aussi la sauvegarde SQL. On va tout simplement compresser ce répertoire dans un autre dossier.

rem ____ Compression du dossier chargé
lib\outils\7z\7za.exe u -tzip monRepertoireFinal\monSite-%DATE:~0,2%-%DATE:~3,2%-%DATE:~6,4%.zip monRepertoireAcompresser
if ERRORLEVEL 1 (
	CALL :ERREUR_APP %%Compression MonSite
	) ELSE (
	CALL :OK_APP %%Compression monSite
)

MonRepertoireFinal représentera le dossier de sauvegarde générale. Vous pouvez par exemple le renommer : liste-sauvegarde-site . Il faut prendre conscience que ce dossier contiendra plusieurs sauvegardes du site avec le temps. À l’intérieur de ce dossier, nous retrouverons nos sauvegardes avec la date de la sauvegarde dans le nom.

MonrepertoirAcompresser représente le répertoire temporaire où l’on a sauvegardé nos fichiers. Juste avant, renommez-le comme il se doit.

Suppression des fichiers temporaires

Rien de plus simple, après la compression, il nous suffit de supprimer le répertoire qu’on à utilisé pour les téléchargements :

rem sup fichier temp
rmdir monSite /s /q
if ERRORLEVEL 1 (
	CALL :ERREUR_APP %%Suppression repertoire temp monSite
	) ELSE (
	CALL :OK_APP %%Suppression repertoire temp monSite
)

Suppression des sauvegardes supérieures à x jours

Pour cela, recopions ce code à la suite :

rem ____ Suppression des fichiers de plus de %age% 
forfiles /P "sauvegarde-monSite" /M "*.*"  /S  /D -%age% /C "cmd /c del @Path"

Ce code nous permettra à chaque exécution, de traiter les fichiers supérieurs à la date définie à l’intérieur du dossier liste de sauvegarde. Dans le cas où la condition s’applique, le fichier compressé est supprimé.

Envoie du mail de « logs » d’erreurs

Cette étape n’est pas franchement obligatoire, mais elle peut s’avérer utile dans certains cas. Voilà à quoi ressemble le code pour envoyer nos logs par e-mail :

rem ____ Envoie du mail avec logs
call lib\outils\sendEmail\sendEmail.exe -f monMail@mail.com -t monMail@mail.com -s adresseSereveurMal:Port -xu mailExpediteur@votre-site.com -xp motDePass-u "Backup sites: NomDeMonSite" -m "Operation terminee" -a "log.txt"

Fermeture du programme

Fermons le programme en tapant les lignes suivantes :

rem Fin du programme principal
endlocal
goto :EOFrem ____ Suppression des fichiers de plus de %age% 
forfiles /P "sauvegarde-monSite" /M "*.*"  /S  /D -%age% /C "cmd /c del @Path"

Définition des fonctions logs

Pour appeler l’écriture de logs, il faut bien sûr définir leurs fonctions. Écrivons tout à la fin :

:ERREUR_APP
ECHO Erreur!! : %* >> lib/logs/log.txt
goto :EOF

:OK_APP
ECHO OK : %* >> lib/logs/log.txt
goto :EOF

Programme terminé

Vous pouvez tester votre script. Il se peut que vous ayez fait quelques erreurs de renommage pour vos répertoires cibles, ou votre base de données, ce n’est pas bien grave, je vous laisse chercher.

via GIPHY

Certains se demanderont peut-être pourquoi j’ai décortiqué autant le code au lieu de balancer tout le script en vrac. Parce que les infos sur le « .bat » se font rares ! Et qu’il est intéressant de connaître quelques fonctions pour vos travaux web. N’oublions pas que dans le métier de développeur web, il arrive que la technologie nous soit imposée, et qu’il nous est interdit, par exemple, d’installer un interpréteur python sur les serveurs de l’entreprise. Il faut parfois jouer le fair-play pour éviter de nombreuses heures de discussion perdues. Et puis c’est toujours utile de pouvoir s’adapter à n’importe quelle situation !