Sauvegarder et restaurer un site en Drupal sur Simple Hosting de Gandi.net

  • | Développement
Sauvegarder-et-restaurer-drupal-en-production

Sauvegarder et restaurer Drupal sur Simple Hosting Gandi.net ça peut être très fastidieux! L'environnement est très fermé et on ne peut pas faire grand chose : 

  • pas d'execution de commande en ssh
  • pas d'accès direct à la console en ssh, il faut d'abord se connecter sur gandi.net pour ouvrir la console pour 2h
  • pas de sauvegarde globale du site via backup & migrate par exemple : la mémoire est trop faible, le temps d'execution du script est trop long...

Bref pour sauvegarder son site, il faut aller à plusieurs endroits, c'est très laborieux.

Je vous propose alors 3 scripts pour sauvegarder et restaurer son instance de Drupal 8 installée sous Simple Hosting de Gandi. Et tout ça en quelques secondes!  

  1. Premier script se chargera de sauvegarder la base de données et le répertoire files. On part du principe qu'on a aussi un repository du projet quelque part.
  2. Second script va récupérer les données générées par le premier script
  3. Troisième script nous permettra de repartir en local sur la même instance que la production.

1. Sauvegarde de Drupal sur Simple Hosting de Gandi

On va installer ce premier script qui va nous permettre de sauvegarder la base de données et le répertoire files directement sur le serveur Gandi.

On va faire cela en plusieurs étapes.


A. Installation de Drush

J'installe Drush dans le répertoire du VHOST sur lequel Drupal est installé, juste au dessus de htdocs.

wget -O drush.phar https://github.com/drush-ops/drush-launcher/releases/download/0.6.0/drush.phar

puis je modifie les droits sur ce fichier pour pouvoir l'executer

chmod +x drush.phar

 

B. Installation du script

Toujours dans le répertoire du VHOST (au dessus de htdocs), je crée un répertoire backup dans lequel je mets le script ci dessous (que je nomme backup_database_and_files.sh) :

#!/bin/bash
#

# if files exists > delete backup files
file="files.gz"
if [ -f "$file" ] ; then
	rm "$file"
fi

file="dump.sql.gz"
if [ -f "$file" ] ; then
	rm "$file"
fi

# change directory
cd ../htdocs

# cache clear
../drush.phar cr

# dump database 
../drush.phar sql-dump --result-file=../backup/dump.sql --gzip

# backup files directory
cp -R sites/default/files/ ../backup/files
cd ../backup
tar -zcvf files.gz files
rm -Rf files

Que fait ce script :

  • il supprimer les anciens fichiers de backup si ils existent. On pourrait faire quelque chose de plus sophistiqué avec une historisation des backups mais là n'est pas le propos.
  • il change de répertoire et execute Drush dans le répertoire du Drupal pour supprimer le cache de Drupal et dumper la base de données en la zippant. Ici on pourrait appeler directement la commande mysql pour dumper la base.
  • il copie le répertoire des files de Drupal et zip l'archive 

A la sortie de ce script on a donc 2 fichiers dump.sql.gz avec la base de données et files.gz avec les fichiers contenu dans le répertoire files de Drupal.

 

3. Configuration du Cron sur Simple Hosting de Gandi

On va ajouter un Cron pour que le script soit exécuté 1 fois par jour par exemple.

Pour ça on fait :

vi /srv/data/etc/cron/anacrontab

Et on édite le fichier :

1@daily 0 save-drupal /srv/data/web/vhosts/www.monvhost.com/backup/backup_database_and_files.sh

On a 4 paramètres : 

  • la fréquence : hourly, daily, monthly, yearly. Le 1@ signifie tous les 1 donc ici tous les jours (=24@hourly). Si on met 2@hourly on exécutera le script toutes les 2 heures.
  • le timeout : paramètre non utilisé dans la version sur Simple Hosting. Mettre 0.
  • le nom de la commande Cron : save-drupal
  • le script à exécuter : notre fichier backup_database_and_files.sh

Pour plus d'informations sur la config du Cron sur Gandi.

 

Point important :

Si le script de backup fonctionne bien quand on le lance à la main quand on va l'exécuter par le cron on va avoir un problème de positionnement dans les répertoires. Il faut donc modifier le fichier backup_database_and_files.sh et rajouter en haut du fichier le positionnement dans le répertoire backup.

# change directory
cd /srv/data/web/vhosts/www.monvhost.com/backup

 

Après l'installation du cron, on devrait avoir nos 2 fichiers de backup (database et files) renouvelés tous les jours.

 

2. Récupération des données de production de Drupal

En local on va créer un script qui va récupérer les données en sftp. Pour cela je vais installer Cyberduck (petit client FTP simple et efficace) en ligne de commande.

A. Installation de la ligne de commande Cyberduck

J'utilise Brew pour installer cet outils : 

brew install duck

Une fois installé on accède dans son terminal à toutes les commandes Cyberduck 

 

B. Installation du script de récupération des datas de Drupal

On crée le script suivant qu'on peut nommer get_backup_from_prod.sh :

#!/bin/bash
#

# get data from server
echo "Get Data from server"

# if files exists > delete
file="files.gz"
if [ -f "$file" ] ; then
    rm "$file"
fi

file="dump.sql.gz"
if [ -f "$file" ] ; then
    rm "$file"
fi

duck -d sftp://USER_ID_GANDI@sftp.sd3.gpaas.net/lamp0/web/vhosts/MY_VHOST/backup/files.gz files.gz
duck -d sftp://USER_ID_GANDI@sftp.sd3.gpaas.net/lamp0/web/vhosts/MY_VHOST/backup/dump.sql.gz dump.sql.gz

echo "End"

Il faut remplacer USER_ID_GANDI avec son numéro à 6 chiffres et MY_VHOST avec son site.

Que fait ce script : 

  • supprime les anciens de fichiers de backup si ils existent
  • lance les 2 commandes duck permettant de récupérer la base de données et le répertoire files.

 

On peut également programmer un Cron en local pour aller récupérer la sauvegarde tous les jours ou toutes les semaines. Au passage on pourrait renommer les fichiers rapatriés avec la date du jour et garder un historique.

 

3. Restauration du Drupal de production en local 

Avec nos fichiers de backup et notre repository, on a tous les éléments pour se créer une instance de production en local.

Voici un exemple de script pour générer un Drupal en local en repartant d'une copie propre à partir de la prod : 

#!/bin/bash
#

# Initialisation
s_green="\033[0;32m"
e_green="\033[0m"
s_red="\033[0;31m"
e_red="\033[0m"
ok="[${s_green}ok${e_green}]"
error="[${s_red}error${e_red}]"

repo="MON_REPO"
install_path_directory="PATH_DU_REPERTOIRE_D_INSTALL"
install_directory="NOM_DU_REPERTOIRE_D_INSTALL"
config_files_directory="config_files"

echo "##################################################################################################"
echo "#"
echo "#     Restore Drupal Site"
echo "#"
echo "##################################################################################################"
echo ""

# trash all directories
if rm -Rf ${install_path_directory}${install_directory};
then
    echo -en "\r$ok Trash directories"
    echo ""
else
    echo -en "\r$error Trash directories"
    echo ""
fi


# Clone project from repository
if git clone $repo ${install_directory};
then
    echo -en "\r$ok Clone project from repository ${s_green}$repo${e_green}"
    echo ""
else
    echo -en "\r$error Clone project from repository ${s_green}$repo${e_green}"
    echo ""
fi


# Move project into install path directory
if mv ${install_directory} ${install_path_directory}${install_directory} ;
then
    echo -en "\r$ok Move project into install path directory"
    echo ""
else
    echo -en "\r$error Move project into install path directory"
    echo ""
fi


# copy config files
if   cp ${config_files_directory}/development.services.yml ${install_path_directory}${install_directory}/sites/development.services.yml &&
     cp ${config_files_directory}/settings.php ${install_path_directory}${install_directory}/sites/default/settings.php &&
     cp ${config_files_directory}/settings.local.php ${install_path_directory}${install_directory}/sites/default/settings.local.php ;
then
    echo -en "\r$ok Copy config files"
    echo ""
else
    echo -en "\r$error Copy config files"
    echo ""
fi


# install files directory
if   tar -xf files.gz &&
     rm -Rf ${install_path_directory}${install_directory}/sites/default/files &&
     mv files ${install_path_directory}${install_directory}/sites/default/ ;
then
    echo -en "\r$ok Install files directory"
    echo ""
else
    echo -en "\r$error Install files directory"
    echo ""
fi


# restore database
if   gunzip < dump.sql.gz | mysql -u root -proot julienkrier ;
then
    echo -en "\r$ok Restore Database"
    echo ""
else
    echo -en "\r$error Restore Database"
    echo ""
fi


echo "Installation terminated"

Voici les valeurs à modifier:

  • MON_REPO : l'adresse de repository du projet pour pouvoir cloner
  • PATH_DU_REPERTOIRE_D_INSTALL : comme son nom l'indique l'arborescence dans laquelle on va installer le projet
  • NOM_DU_REPERTOIRE_D_INSTALL : nom du répertoire du projet

 

Ce que fait le script : 

  • Supprime le projet en cours (attention si vous avez du travail non sauvegardé!) 
  • Clone le repository
  • Déplace le clone du projet dans l'arborescence d'installation
  • Copie 3 fichiers de configuration : settings.php, settings.local.php et development.services.yml pour Drupal 8.
  • Untar et déplace le répertoire files de Drupal
  • Restaure le dump de base de donnée 

 

Sur ce dernier script, n'oubliez pas de lancer la commande et d'aller vous faire un café, c'est à peu près le temps nécessaire pour revenir et avoir un Drupal tout beau tout chaud! ;)
 

Todo :

  • aller chercher les info de connexion de la BDD dans le fichier settings.local.php / utiliser Drush pour restaurer
  • proposer un clone ou un pull : le clone ça peut être long
  • ajouter un composer install
  • etc... la liste est longue
L'auteur de cet article
Julien Krier
Responsable Digital, ayant occupé différents postes en informatique depuis 2001, Julien Krier a travaillé sur de multiples plateformes, sites de contenu ou e-commerce à fort trafic. Il est spécialisé dans les technologies web sur les CMS comme Drupal et les Framework Php comme Symfony.
Cet article vous a aidé?
Average: 4 (2 votes)
Partagez cet article
Articles sur le même sujet
Ajouter un champ custom à l'entité User dans un module custom en Drupal 8Comment ajouter un champ custom à l'entité User de Drupal 8? Voici un petit tuto pour étendre les utilisateurs dans un module custom.
Configurer son environnement de DEV pour Drupal 8Avant de commencer à modifier une instance de Drupal 8 et notamment pour faire le thème du site, il faut configurer son environnement de développement.
Comment ajouter des logs dans Drupal 8Une chose important quand on code un module sur Drupal, c'est de loguer les erreurs, les informations, pour débugger facilement. Voici la commande pour loguer des informations dans le dblog de Drupal 8.