Ceci est une ancienne révision du document !
Sauvegarder un ou des sites internet via FTP et leurs bases de données MySQL
Principe
Ce script va vous permettre de sauvegarder un ou plusieurs sites internet sur votre disque dur local, ainsi que la(les) base(s) de données MySQL associées.
Il utilise lftp pour récupérer les fichiers, et mysqldump ou http://sql.free.fr/backup.php pour les sites perso de free pour récupérer les bases de données
Les sauvegardes ftp vont écraser les fichiers modifier, ajouter les nouveaux fichiers et supprimer les fichiers qui ne sont pas sur le serveur.
Les sauvegardes MySQL créent un fichier date_heure.tar.bz2 ou date_heure.sql.gz pour les sites perso de free
Prérequis
Vérifiez que lftp, links et mysql-server sont bien installés.
Installation
Créez un fichier nom_que_l_on_veut.sh et mettez-y ce code :
#!/bin/bash # Version 0.2 # ATTENTION : lftp, links et mysql-server doivent être installés # FONCTIONNALITÉS : # - Sauvegarde des fichiers distants via FTP # - Sauvegarde des bases de données MySQL distantes via mysqldump ou http://sql.free.fr/backup.php pour les sites perso de free # - Sauvegarde de plusieurs sites #Variables à renseigner sav_complete_tous_les="2 month" # refaire une sauvegarde complete et archiver les anciennes tous les ... (ex1 : 2 month) (ex2 : 30 day) (ex3: 12 hour) rep_log=$HOME/Sauvegardes/internet # répertoire où les fichiers .log seront stockés #copiez collez le bloc en modifiant le numéro entre crochets, dans l'ordre [0] puis [1], ... en fonction du nombre de sites à sauver # Début du bloc à paramétrer nom_du_site[0]=login0.free.fr # Nom du site internet (juste pour info) script_http[0]= # adresse http d'un fichier (php par exemple) à appeler rep_sav_ftp[0]=$HOME/Sauvegardes/ftp/login0 # Répertoire où seront sauvés les fichiers récupérés du site par ftp. Laissez vide si vous ne voulez pas de sauvegarde ftp rep_sav_sql[0]=$HOME/Sauvegardes/sql/login0 # Répertoire où seront sauvés les bases de données du site. Laissez vide si vous ne voulez pas de sauvegarde sql serveur_ftp[0]=ftpperso.free.fr # adresse du serveur ftp utilisateur_ftp[0]=login0 # utilisateur ftp mdp_ftp[0]=mdp0 # mot de passe ftp rep_ftp[0]=/rep # répertoire sur le serveur ftp à sauvegarder. Mettre simplement / pour sauver le site en entier serveur_sql[0]=sql.free.fr # adresse du serveur mysql utilisateur_sql[0]=login0 # utilisateur mysql mdp_sql[0]=mdp0 # mot de passe mysql liste_bases_de_donnees[0]= # liste des bases de données à sauver, séparées par des espaces (inutile pour les sites perso de free). Ex : mon_forum mon_blog # Fin du bloc à paramétrer # Début du bloc à paramétrer nom_du_site[1]=mon_site.org # Nom du site internet (juste pour info) script_http[1]= # adresse http d'un fichier (php par exemple) à appeler rep_sav_ftp[1]=$HOME/Sauvegardes/ftp/mon_site_org # Répertoire où seront sauvés les fichiers récupérés du site par ftp. Laissez vide si vous ne voulez pas de sauvegarde ftp rep_sav_sql[1]= # Répertoire où seront sauvés les bases de données du site. Laissez vide si vous ne voulez pas de sauvegarde sql serveur_ftp[1]=ftp.mon_site.org # adresse du serveur ftp utilisateur_ftp[1]=login1 # utilisateur ftp mdp_ftp[1]=mdp1 # mot de passe ftp rep_ftp[1]=/ # répertoire sur le serveur ftp à sauvegarder. Mettre simplement / pour sauver le site en entier serveur_sql[1]= # adresse du serveur mysql utilisateur_sql[1]= # utilisateur mysql mdp_sql[1]= # mot de passe mysql liste_bases_de_donnees[1]= # liste des bases de données à sauver, séparées par des espaces (inutile pour les sites perso de free). Ex : mon_forum mon_blog # Fin du bloc à paramétrer sauver(){ #Exécute un script via http (ex : un fichier php sur le site internet distant qui va fabriquer un fichier .sql contenant la sauvegarde des BDD) if [ "${script_http[$i]}" != "" ]; then { links -dump ${script_http[$i]} } fi #Sauvegarde des fichiers via FTP if [ "${rep_sav_ftp[$i]}" != "" ]; then { # Pas de sauvegarde si le répertoire de sauvegarde n'est pas indiqué echo echo Sauvegarde FTP de ${nom_du_site[$i]} echo if [ ! -e "${rep_sav_ftp[$i]}" ]; then { # Si c'est une première sauvegarde mkdir -p "${rep_sav_ftp[$i]}" } else { if [ "$nom_archive_sav" != "" ]; then { # Si on doit archiver pour faire une nouvelle sauvegarde mv "${rep_sav_ftp[$i]}" "${rep_sav_ftp[$i]}_-_$nom_archive_sav" mkdir -p "${rep_sav_ftp[$i]}" } fi } fi lftp ftp://${utilisateur_ftp[$i]}:${mdp_ftp[$i]}@${serveur_ftp[$i]} -e "mirror -e ${rep_ftp[$i]} ${rep_sav_ftp[$i]} ; quit" } fi #Sauvegarde de la base MySQL via mysqldump if [ "${rep_sav_sql[$i]}" != "" ]; then { # Pas de sauvegarde si le répertoire de sauvegarde n'est pas indiqué echo echo Sauvegarde SQL de ${nom_du_site[$i]} echo if [ ! -e "${rep_sav_sql[$i]}" ]; then { # Si c'est une première sauvegarde mkdir -p "${rep_sav_sql[$i]}" } else { if [ "$nom_archive_sav" != "" ]; then { # Si on doit archiver pour faire une nouvelle sauvegarde mv "${rep_sav_sql[$i]}" "${rep_sav_sql[$i]}_-_$nom_archive_sav" mkdir -p "${rep_sav_sql[$i]}" } fi } fi cd ${rep_sav_sql[$i]} # on se place dans le repertoire ou l'on veut sauvegarder les bases if [ "${serveur_sql[$i]}" = "sql.free.fr" ]; then { wget http://sql.free.fr/backup.php --post-data="login=${utilisateur_sql[$i]}&password=${mdp_sql[$i]}&check=1&all=1" -O $(date +%F_%H-%M-%S).sql.gz } else { j=0 for j in ${liste_bases_de_donnees[$i]}; do mysqldump -h${serveur_sql[$i]} -u${utilisateur_sql[$i]} -p${mdp_sql[$i]} $j > ${j}_`date +%D | sed 's;/;-;g'`.sql # Sauvegarde des bases de donnees en fichiers .sql tar jcf ${j}_`date +%D | sed 's;/;-;g'`.sql.tar.bz2 ${j}_`date +%D | sed 's;/;-;g'`.sql # Compression des exports en tar.bz2 (le meilleur taux de compression) rm ${j}_`date +%D | sed 's;/;-;g'`.sql # Suppression des exports non compresses done } fi } fi } if [ ! -e "$rep_log/date_derniere_version_sauvegarde.log" ]; then { # Si c'est une première sauvegarde mkdir -p $rep_log echo $(date +%F_%H-%M-%S) >$rep_log/date_derniere_version_sauvegarde.log } fi if [ "$(cat $rep_log/date_derniere_version_sauvegarde.log)" \< "$(date --date="$sav_complete_tous_les ago" +%F_%H-%M-%S)" ]; then { nom_archive_sav=archive_du_$(cat $rep_log/date_derniere_version_sauvegarde.log)_au_$(date +%F_%H-%M-%S) echo $(date +%F_%H-%M-%S) >$rep_log/date_derniere_version_sauvegarde.log } fi len=${#nom_du_site[*]} i=0 while [ "$i" -lt "$len" ] do sauver let "i = $i + 1" done echo La sauvegarde des sites internet s\'est terminée le $(date +%F) à $(date +%H:%M:%S) >>$rep_log/liste_sauvegardes.log exit 0
Puis rendez ce fichier exécutable
chmod +x nom_que_l_on_veut.sh
Il ne vous reste plus qu'à l'exécuter !
Script PHP de création d'un fichier .sql.gz
Si le serveur mysql de votre site internet n'est pas accessible de l'extérieur (par ex avec OVH) :
Vous pouvez créer un script php (ex : sauvegarder_mysql.php) qui aura pour fonction de sauver la BDD MySQL dans un fichier date_heure.sql.gz sur le serveur du site.
Ce script php sera exécuté lors de la sauvegarde en spécifiant son adresse dans la variable script_http[numéro] du script de sauvegarde (ci-dessus).
Puis, le fichier date_heure.sql.gz sera rappatrié en local dans votre répertoire de sauvegarde avec la sauvegarde des fichiers via lftp.
Par ex, sauvegarder_mysql.php pourrai ressembler à ça :
<?php $date_actu = date('Y-m-d_H-i-s'); echo "Sauvegarde Mysql en cours...<BR>"; require ($_SERVER["DOCUMENT_ROOT"]."/config/config.inc.php"); system("mysqldump --host=".$mysql_server." --user=".$mysql_login." --password=".$mysql_passwd." ".$mysql_bdd." > ./mysql/".$date_actu.".sql"); system("gzip ./mysql/".$date_actu.".sql"); system("rm ./mysql/".$date_actu.".sql"); echo "Sauvegarde Mysql terminee"; ?>