Exemple pratique : backup d'une instance Gandi Simple Hosting vers un serveur FTP d'un autre hébergeur
Possédant une instance Simple Hosting chez Gandi, je souhaitais assurer des sauvegardes régulières de la base de données de manière automatisée et fiable en cas de fausse manipulation ou de problème technique. La solution décrite ici est universelle et peut fonctionner avec n'importe quel autre hébergeur. Il suffit de posséder un compte FTP externe, soit chez un autre hébergeur soit sur un serveur différent du même hébergeur ... et vous pourrez dormir sur vos deux oreilles !
Gandi offre un système de sauvegardes locales instantanées appelées snapshots, mais ces snapshots résident sur le serveur lui-même, donc sont totalement inutiles en cas de gros crash. C'est pourquoi j'ai mis en place le système suivant :
- Dump quotidien des bases de données via anacron (ou cron)
- Envoi par FTP des dumps sur un serveur externe
- Effacement des données après 7 jours sur le serveur externe pour ne pas le surcharger
Dump quotidien des bases de données via anacron (ou cron)
Gandi Simple Hosting fonctionnant avec anacron, il suffit d'ajouter cette ligne au fichier /etc/cron/anacrontab :
@daily 0 mysql_backup mkdir -p /srv/data/tmp/mysql_backup ; mysqldump -u USER -pPASSWORD NOM_BDD | /bin/gzip -9 > /srv/data/tmp/mysql_backup/`date '+%F'`.NOM_BDD.sql.gz ; rm -f /srv/data/tmp/mysql_backup/`date '+%F' --date '1 week ago'`.NOM_BDD.sql.gz
Évidemment, il faut remplacer :
- USER par l'utilisateur de la base de données
- PASSWORD par le mot de passe de USER (en conservant le -p initial)
- NOM_BDD par le nom de votre BDD à sauvegarder - remplacer aux trois endroits
Dans le détail, cette ligne créé le répertoire mysql_backup, y dépose un dump compressé de la base NOM_BDD avec la date du jour, et efface les dumps vieux d'une semaine ou plus.
Remarque : si vous le pouvez, créez un utilisateur ayant uniquement des droits de lecture sur la base en question. Cela renforcera la sécurité et évitera les coups de stress en cas de fausse manip' !
La version cron sur un autre hébergeur pour la commande de dump serait du type (mais je ne sais pas comment insérer la date du jour) :
0 0 * * * mysqldump --opt -Q -u USER --password=PASSWORD NOM_BDD | gzip > /chemin/NOM_BDD.sql.gz
Envoi par FTP des dumps sur un serveur externe
Ici, il s'agit d'envoyer chaque jour la sauvegarde qui vient d'être créée vers un serveur externe. En principe, vous n'utiliserez jamais ces sauvegardes ... sauf le jour où votre site aura été détruit / hacké / effacé / etc ...
Dans le fichier anacrontab, ajoutez maintenant cette ligne après celle du dump des bases de données :
@daily 0 FTP_backup php -f /srv/data/web/vhosts/www.exemple.com/backup.php
Pas de grande magie ici : on appelle simplement le fichier backup.php qui se trouve n'importe où (adaptez le chemin en conséquence), mais de préférence dans un endroit inaccessible par le public ! Pour gandi simple hosting, les fichiers "publics" sont dans /vhosts/www.exemple.com/htdocs/ : ainsi, le fichier backup.php ne peut pas être accédé directement !
Créez ce fameux fichier backup.php, avec le contenu suivant :
<?php $use_gzip = 'yes'; // Change to 'no' if you don't want files gzipped $remove_file = 'no'; // Change to 'yes' if you want to delete the backup file from your account after sending. Pick yes to save server space $use_ftp = 'yes'; // Change to 'yes' if you want the backup file uploaded to a remote FTP server? If you pick yes, you must fill out the next 4 lines $ftp_server = 'ftp.EXEMPLE.COM'; // FTP address $ftp_user_name = 'FTP_USERNAME'; // FTP username $ftp_user_pass = 'FTP_PASSWORD'; // FTP password $ftp_path = "/PATH"; // Path to upload on FTP server $mode = FTP_BINARY; $file_name = date("Y-m-d") . ".NOM_BDD.sql.gz"; $file_path = "/tmp/mysql_backup/" . $file_name; $ftp_id = ftp_connect($ftp_server); $login_result = ftp_login($ftp_id, $ftp_user_name, $ftp_user_pass); ftp_pasv($ftp_id, true); $upload = ftp_put($ftp_id, $file_name, $file_path, $mode); ftp_close($ftp_id); if ($remove_file == "yes") { unlink($file_name); } print $file_name . " : backup done!"; //You can send a email alert mail('EMAIL@EMAIL.com', 'backup successful', 'OK, backup successful');
Ce script est largement inspiré d'un script beaucoup plus complet, qui fonctionne très bien mais qui est inadapté en cas de grosse base de données car il peut provoquer des erreurs de mémoire.
Ici aussi, adaptez en conséquence :
- ftp.exemple.com : votre serveur FTP
- FTP_USERNAME : utilisateur FTP
- FTP_PASSWORD : mot de passe FTP
- PATH : un répertoire qui contiendra vos sauvegardes sur le serveur distant, ou le chemin absolu vers ce répertoire
- NOM_BDD : doit être identique à celui de la tâche anacron
- EMAIL@EMAIL.com : si vous souhaitez recevoir un e-mail, entrez ici votre adresse et le contenu de l'email si vous voulez le personnaliser
Comme pour l'utilisateur de la base de données, créez si possible un utilisateur FTP avec des droits minimaux (accès uniquement au sous-répertoire PATH et non pas à la racine de votre compte FTP) !
Ici aussi, la version cron pour appeler le script serait un peu différente :
0 0 * * * php -q /home/CPANELUSER/public_html/backup.php >/dev/null 2>&1
Effacement des données après 7 jours sur le serveur externe pour ne pas le surcharger
Dans mon cas, le serveur FTP tourne sous CPanel, et la syntaxe de la tâche CRON est pour le coup légèrement différente de celle définie avec anacron chez Gandi :
0 14 * * * find /home/CPANELUSER/PATH -mtime +7 -exec rm {} \;
CPANELUSER est votre nom d'utilisateur chez l'hébergeur externe, et PATH est le répertoire des sauvegardes utilisé plus haut.
Voilà ! Vous disposez maintenant d'une solution fiable et vous pouvez dormir sur vos deux oreilles ! N'hésitez pas à me faire part de vos commentaires si vous rencontrez des soucis lors de l'implémentation de ces étapes !
Derniers articles par Cyril Castella (voir tous)
- Le Rubik’s Cube, c’est facile sur Francocube ! - 10 novembre 2017
- PlanetHoster et Gandi, deux hébergeurs au top ! - 21 janvier 2016
- Backup externe de bases de données via CRON/ANACRON et FTP - 29 décembre 2015
Merci pour ton article qui m’a beaucoup aidé 😉 Par contre je ne trouve pas comment zipper et récupérer les fichiers du dossier « snapshot » et l’envoyer par ftp … Tu peux m’aider ? merci
Salut Dan, Pour les dossiers, j’ai ajouté la ligne suivant dans le fichier anacron: @daily 0 Files_backup tar -zcf /srv/data/tmp/mysql_backup/MONSITE_FILES.tar.gz /srv/data/web/vhosts Ainsi, tout le contenu du dossier /vhosts est compressé au format tar.gz et placé dans le répertoire /tmp/mysql_backup, avec le nom MONSITE_FILES. Je créé en quelque sorte mon propre snapshot, mais avec un nom que je maîtrise… J’utilise ensuite le même script que pour les bases (en adaptant $file_name bien sûr) pour envoyer le tout par FTP 🙂 Dans ce script, tu peux bien sûr avoir $file_name1, file_name2 et plusieurs $upload pour envoyer séparément plusieurs fichiers compressés vers ta… Read more »