Formation PUB010 : PHP, 2018 Copie de sécurité (sauvegarde, backup)

Script pour faciliter la copie de sécurité dans le nuage


Lorsque vous développez un site Web, il importe de copier régulièrement votre code sur un autre support afin d'éviter de tout perdre en cas de bris de disque, de fichier corrompu ou même pour pouvoir reculer dans le temps en cas de besoin (oui, il y a Git mais aucune soumission ne doit être faite tant que le code n'est pas complété).

Vous pouvez effectuer la copie sur un disque dur externe (encore faut-il l'acheter), sur un autre ordinateur (si vous avez une vieille tour qui traîne) ou encore dans le cloud.

C'est cette dernière option qui a été retenue ici.

Voici un petit fichier batch qui s'occupe de :

  • Créer un dossier dans Google Drive (ou dans DropBox ou tout autre espace de stockage synchronisé sur le cloud) dont le nom se termine par la date du jour.
  • Y copier tous les fichier et les sous-dossiers d'un dossier donné.
  • Dans le cas d'une BD MySQL, générer un script SQL qui sera également copié dans le dossier.

Note : une version pour Mac ou Linux est présentée au bas de cette page.

Ce que vous avez à faire pour l'utiliser :

  • Installez le client Google Drive sur votre poste de travail (ou le client DropBox).
  • Téléchargez le fichier CopierDossierDansNuage-Windows.txt. Attention : ne cliquez pas sur le lien. Plutôt, faites un clic droit / Enregistrer le lien sous.
  • Renommez le fichier pour que son extension soit .bat
  • Entrez les informations désirées dans la section configuration.
  • Créez un raccourci sur le bureau.
  • Cliquez sur le raccourci à la fin d'une journée de travail ou créez une tâche automatisée dans le gestionnaire de tâches Windows.

Pour plus de commodité, le code du fichier .bat est transcrit ici.

Note : pour que les accents présents dans les echo soient correctement affichés sous Windows, le fichier doit être encodé au format IBM850 (dans Geany : Fichier / Recharger en tant que / Européen de l'ouest / Occidental (IBM850)).

Certains éditeurs offrent plutôt le format OEM 720 (dans Notepad++ : Encodage / Codage de caractères / Arabe / OEM 720).

Fichier batch

@ECHO OFF
REM Copie un dossier et ses sous-dossiers dans le nuage (Google Drive, DropBox ou autre dossier synchronisé sur un serveur)
REM en ajoutant la date du jour au dossier principal.
REM Crée également un script SQL de la base de données MySQL et le copie dans le même dossier.
REM Note : Pour que les accents présents dans les echo s'affichent correctement, utiliser l'encodage IBM850 ou OEM 720.
REM Note : Si des noms de dossiers contiennent des caractères accentués, utilisez l'encodage Windows 1252 ou ANSI
REM        et ajoutez l'instruction CHCP 1252.
REM Programmé par Christiane Lagacé : https://christianelagace.com
REM Le 26 mars 2013
REM Dernier ajustement par Christiane Lagacé
REM Le 28 janvier 2020
REM Modifications : Chemins suggérés ajustés pour AMPPS.
 
REM *************************
REM ***** Configuration *****
REM *************************
 
REM ***** VOUS DEVEZ REMPLIR CETTE SECTION *****
 
REM Chemin pour accéder au dossier du projet. Placer entre guillemets s'il contient des espaces.
REM (ex : "C:\Program Files\Ampps\www")
set cheminSource="C:\Program Files\Ampps\www"
 
REM Nom du dossier contenant le projet à sauvegarder (ex : monprojet)
set dossierSource=monprojet
 
REM Chemin du dossier infonuagique (ex : C:\Users\MonNom\Google Drive)
set cheminCible="C:\Users\MonNom\Google Drive"
 
REM Nom du dossier dans lequel le projet doit être copié (ex : monprojet)
REM Le dossier sera créé sur Google Drive ou DropBox avec la date du jour à la fin de son nom.
set dossierCible=monprojet
 
REM Chemin du dossier contenant le fichier mysqldump.exe 
REM (ex : "C:\Program Files\Ampps\mysql\bin")
set cheminMySQLBin="C:\Program Files\Ampps\mysql\bin"
 
REM Nom de l'usager MySQL qui détient les droit requis pour sauvegarder la base de données
set usagerMySQL=root
 
REM Nom de la base de données à sauvegarder
set nomBD=mabd
 
REM *****************************
REM ***** Fin configuration *****
REM *****************************
 
REM ***** Création des variables pour la date *****
REM La commande "WMIC OS GET localdatetime" retrouve la date au format ISO. 
REM Le caractère ^ (caret) est un caractère d'échappement.
REM Le caractère | (pipe) permet de rediriger la sortie de WMIC vers la commande find. 
REM Puisqu'on veut conserver toute la chaîne, on recherche n'importe quel caractère : find "."
REM Autrement dit, cette ligne place toute la date dans la variable dateISO.
 
for /f %%a in ('WMIC OS Get localdatetime  ^| find "."') do set dateISO=%%a
set annee=%dateISO:~0,4%
set mois=%dateISO:~4,2%
set jour=%dateISO:~6,2%
 
echo *************************
echo ***** Copie du site *****
echo *************************
 
@echo on
XCOPY %cheminSource%\%dossierSource%\* %cheminCible%\%dossierCible%-%annee%-%mois%-%jour% /S /I
@echo off
 
echo ***********************************************
echo ***** Création du script pour la BD MySQL *****
echo ***********************************************
 
@echo on
CD %cheminMySQLBin%
mysqldump -u %usagerMySQL% -p --default-character-set=utf8 --routines --comments --triggers %nomBD% > %cheminCible%\%dossierCible%-%annee%-%mois%-%jour%\%nomBD%-%annee%-%mois%-%jour%.sql
@echo off
 
echo *******************
echo ***** Terminé *****
echo *******************
echo.
echo Les fichiers ont été copiés dans le dossier
echo %cheminCible%\%dossierCible%-%annee%-%mois%-%jour%
echo.
PAUSE

Notez que dans la commande XCOPY, l'option /S signifie qu'il faut copier les sous-dossiers non vides et l'option /I indique que si la destination n'existe pas et que plus d'un fichier est copié, la destination sera considérée comme un dossier.

▼Publicité Le texte se poursuit plus bas

Chemin contenant des caractères accentués

Je crois que tout le monde s'entend là-dessus : on devrait éviter à tout prix d'utiliser des caractères accentués dans les noms de fichiers et dans les noms de dossiers. Malheureusement, certains développeurs ne se sont pas conformés à cette bonne pratique alors il arrive des cas où nous devons tout de même composer avec des caractères accentués.

Si c'est votre cas, les précautions suivantes vous permettront d'adapter votre script pour qu'il puisse copier le contenu d'un dossier dont le chemin contient des caractères accentués.

  • Pour que les caractères accentués dans les noms de dossiers puissent être correctement interprétés, changez l'encodage du fichier pour Windows 1252 ou ANSI. Les caractères accentués déjà présents dans le fichier apparaîtront sous forme de caractères bizarre. Vous pouvez les laisser tels quels. Cependant, les accents dans les noms de dossiers devront être écrits correctement sous cet encodage.
  • Au début de votre script, vous devez indiquer que les instructions contenues dans le script utilisent la page de code « Windows Latin 1 (ANSI) ». Ceci se fait à l'aide de la commande CHCP suivie du numéro correspondant à la page de code désirée, soit le 1252.
Fichier batch

CHCP 1252

...

set cheminCible=C:\Users\Étienne\Dropbox

...

XCOPY ...

...

Exclusion de fichiers ou de dossiers

Notez qu'il est possible d'exclure certains fichiers ou sous-dossiers. Si tel est votre désir :

  • Créez un fichier texte utilisant l'encodage Windows 1252 ou ANSI dans lequel vous listerez les fichiers et dossiers à exclure.

    Vous devez placer un seul fichier ou dossier à exclure par ligne.

    Les dossiers débuteront par \ et se termineront par \.

    Assurez-vous que le nom de votre fichier texte soit significatif car il sera utilisé dans votre commande XCOPY.

    Ex :

    Fichier fichiers-exclus.txt contenant la liste des fichiers et dossiers à exclure

    \nomdossier\

    unfichieralaracine.php

    \autredossier\unfichierdanssousdossier.jpg

  • Dans votre fichier batch, modifiez la ligne XCOPY pour y ajouter, à la toute fin, l'option exclude. 

    Ex :

    Fichier batch

    XCOPY ... /exclude:fichiers-exclus.txt

Version bash pour Mac ou Linux

Voici le même script mais au format bash pour Mac ou Linux.

Notez que sous Mac, si le fichier porte l'extension .bash ou .sh, il sera possible de l'exécuter seulement à partir d'une fenêtre Terminal (ne pas oublier de mettre « ./ » avant d'écrire son nom lors de l'appel). S'il porte l'extension .command, il sera possible de l'exécuter également en double-cliquant sur son nom dans le Finder.

  • Téléchargez le fichier CopierDossierDansNuage-Mac.txt. Attention : ne cliquez pas sur le lien. Plutôt, faites un clic droit / Enregistrer le lien sous.
  • Renommez le fichier pour que son extension soit .command (ou .sh sous Linux).
  • Ajoutez les droits d'exécution sur ce fichier (voir Exécuter un fichier bash).
Fichier bash

#!/bin/bash

# Copie un dossier et ses sous-dossiers dans le nuage (Google Drive, DropBox ou autre dossier synchronisé sur un serveur)
# en ajoutant la date du jour au dossier principal.
# Crée également un script SQL de la base de données MySQL et le copie dans le même dossier.
# Programmé par Christiane Lagacé : https://christianelagace.com
# Le 9 octobre 2018

# *************************
# ***** Configuration *****
# *************************

# ***** VOUS DEVEZ REMPLIR CETTE SECTION *****

# Chemin pour accéder au dossier du projet (ex : "/Applications/AMPPS/www")
cheminSource="/Applications/AMPPS/www"

# Nom du dossier contenant le projet à sauvegarder (ex : monprojet)
dossierSource=monprojet


# Chemin du dossier infonuagique (ex : "/Volumes/GoogleDrive/Mon disque")
cheminCible="/Volumes/GoogleDrive/Mon disque"

# Nom du dossier dans lequel le projet doit être copié (ex : monprojet)
# Le dossier sera créé sur Google Drive ou DropBox avec la date du jour à la fin de son nom.
dossierCible=monprojet


# Chemin du dossier contenant le fichier mysqldump.exe
# (ex : "/Applications/AMPPS/mysql/bin")
cheminMySQLBin="/Applications/AMPPS/mysql/bin"

# Nom de l'usager MySQL qui détient les droit requis pour sauvegarder la base de données
usagerMySQL=root

# Nom de la base de données à sauvegarder
nomBD=mabd

 

# *****************************
# ***** Fin configuration *****
# *****************************

echo "*************************"
echo "***** Copie du site *****"
echo "*************************"

aujourdhui=$(date +%Y-%m-%d)
cp -rf "$cheminSource/$dossierSource/" "$cheminCible/$dossierCible-$aujourdhui" && echo OK || echo "Oups, un problème a été rencontré lors de la copie des fichiers."

#echo "***********************************************"
#echo "***** Création du script pour la BD MySQL *****"
#echo "***********************************************"

mkdir -p "$cheminCible/$dossierCible-$aujourdhui/dev"
cd $cheminMySQLBin
./mysqldump -u $usagerMySQL -p --default-character-set=utf8 --routines --comments --triggers $nomBD > "$cheminCible/$dossierCible-$aujourdhui/dev/$nomBD-$aujourdhui.sql" && echo OK || echo "Oups, un problème a été rencontré lors de l'exportation de la base de données."

echo "*******************"
echo "***** Terminé *****"
echo "*******************"

echo "Les fichiers ont été copiés dans le dossier"
echo "$cheminCible/$dossierCible-$aujourdhui"
echo "La base de données est exportée dans le fichier"
echo "$cheminCible/$dossierCible-$aujourdhui/dev/$nomBD-$aujourdhui.sql"

Pour plus d'information

« Code Pages ». MSDN. http://msdn.microsoft.com/en-us/library/windows/desktop/dd317752%28v=vs.85%29.aspx

« Code Page Identifiers ». MSDN. http://msdn.microsoft.com/en-us/library/windows/desktop/dd317756(v=vs.85).aspx

Veuillez noter que le contenu de cette fiche vous est partagé à titre gracieux, au meilleur de mes connaissances et sans aucune garantie.
Dernière révision le 31 mars 2021
Merci de partager !

Site fièrement hébergé chez A2 Hosting.

Soumettre