Sauvegarde de site : le faire soi-même

Les Pages Perso Chez Free

Par Philippe, le , dans Éviter les problèmes. / Dernière modification : le par Al. (merci à Lomalarch, Philippe, Alex, JBB, Rodolphe Marsolier, Alain B., Patrick H. et Pat)
Tags : MySQL, PostgreSQL, Sécurité, Tutoriaux

Il est important de savoir qu'il n'y a aucune sauvegarde de site chez Free, y compris la base de données, c'est donc à chacun de s'organiser. Même si vous n'êtes pour rien dans la perte de données, il est totalement illusoire de demander aux gestionnaires de pages perso de récupérer une éventuelle sauvegarde : elles n'existent pas. Il est cependant essentiel de n'utiliser que les méthodes autorisées par Free, car certaines extensions de CMS – comme Akeeba – peuvent conduire à la suspension de votre compte.

Suivant le type de votre site, il y a plusieurs stratégies possibles :

1. La plus simple : vous êtes le seul auteur

Gardez une copie sur votre poste de ce que vous déposez en FTP sur les pages perso, et si vous utilisez la base de données faites une sauvegarde (http://phpmyadmin.free.fr/phpMyAdmin) allez à l'onglet exporter et choisissez ce qu'il vous faut (pour les néophytes, cocher une des options « compressés » pour recevoir votre base en fichier à copier en local) ou un dump de la base via (http://phpmyadmin.free.fr/backup.php ou http://sql.free.fr/backup.php).

Il est à noter que pour les bases PostgreSQL, la sauvegarde de la base n'est possible que depuis http://sql.free.fr/phpPgAdmin, via la fonction « exporter ».

2. Le minimum : si vous êtes plusieurs auteurs ou le site est un site dynamique

Faire une copie de la partie FTP avec une version locale sur un poste à intervalles réguliers suivant l'activité du site. Pour cela, plusieurs utilitaires peuvent vous aider. Certains peuvent même faire du miroir comme wget ou curl (Linux, Mac et Windows) : ce n'est pas forcément simple pour les débutants.

Certains utilitaires de FTP permettent de synchroniser, ne ramenant que les fichiers modifiés et économisant du temps de chargement. Pour la base de données, voir paragraphe ci-dessus, mais pour un site vraiment dynamique il faut l'automatiser.

3. Le must : une vraie sauvegarde, pas simplement une copie

Il peut être insuffisant de juste copier la version actuelle. Un must est de faire une copie régulière et d'archiver les différentes versions, pour pouvoir restaurer une version avant une mise à jour par exemple. Il n'y a pas beaucoup d'utilitaires de ce genre pour Windows, je vous suggère un freeware Cobian Backup qui permet d'automatiser en particulier la copie à intervalle régulier, et le nombre de jeux de sauvegarde.

Pour Linux et Mac, il faut associer dans un script une copie miroir (lftp [site officiel et francophone] ou wget [site officiel et francophone]), un backup (tar) et lancer le tout avec cron.

Les sauvegarde de l'espace Web (FTP)

Pour réaliser une copie miroir des données de votre espace web avec lftp, vous pouvez utiliser la commande suivante (à adapter selon vos besoins) :

lftp ftp://identifiant:mot_de_passe_ftp@ftpperso.free.fr -e "mirror -e --verbose -x /sessions -x /dossier_ignoré2 / /emplacement_local_de_la_savegarde ; quit"

Pour mettre à jour cette copie miroir simplement, il vous suffit d'utiliser la commande suivante :

lftp ftp://identifiant:mot_de_passe_ftp@ftpperso.free.fr -e "mirror --verbose --only-newer / /emplacement_local_de_la_savegarde ; quit"

Vous pouvez bien entendu utiliser ces commandes pour sauvegarder une partie seulement de votre espace web (un répertoire par exemple). Il faut, dans ce cas, remplacer le / avant l'emplacement local par le chemin de votre répertoire, comme par exemple :

lftp ftp://toto:Xcv6^D]z12@ftpperso.free.fr -e "mirror -e --verbose --only-newer /images ~/www/site-perso/images ; quit"

Pour réaliser une copie miroir avec wget, il faut utiliser la commande suivante (commande minimale, sauvegardant les données dans un sous-répertoire du répertoire courant) :

wget --mirror --progress=dot:mega ftp://identifiant:mot_de_passe_ftp@ftpperso.free.fr/

Les sauvegardes des bases de données

Les sauvegardes de la base de données MySQL

Pour la base de données, la seule solution que j'ai trouvée est d'utiliser wget. Ci-dessous un exemple de paramètre à passer, en modifiant bien entendunom d'utilisateur et mot de passe, sur une seule ligne de commande :

wget -S --progress=dot:mega http://sql.free.fr/backup.php --post-data="login=identifiant&password=mot_de_passe_mysql&check=1&all=1&sql_compat=NONE&sql_type=insertcharset_of_file=utf-8&lang=fr-utf-8&server=1&convcharset=iso-8859-1&collation_connection=utf8_general_ci&export_type=server&what=sql&header_comment=&sql_structure=structure&auto_increment=1&use_backquotes=1&sql_data=data&hexforbinary=yes&asfile=sendit&compression=gzip&filename_template=base-mysql-identifiant-%25Y-%25m-%25d" -O base-mysql-identifiant-`date +%Y-%m-%d-%H%M%S`.sql.gz

Noter que la commande précédente est pour un Unix ; pour un Windows, l'équivalent est :

"C:\Program Files\GnuWin32\bin\wget" http://sql.free.fr/backup.php --progress=dot:mega --post-data="login=identifiant&password=mot_de_passe_mysql&check=1&all=1&sql_compat=NONE&sql_type=insertcharset_of_file=utf-8&lang=fr-utf-8&server=1&convcharset=iso-8859-1&collation_connection=utf8_general_ci&export_type=server&what=sql&header_comment=&sql_structure=structure&auto_increment=1&use_backquotes=1&sql_data=data&hexforbinary=yes&asfile=sendit&compression=gzip&filename_template=identifiant-%25Y-%25m-%25d" -O C:\sauvegardes_site\identifiant-baseMySQL-%date:~6,4%%date:~3,2%%date:~0,2%-%time:~0,2%%time:~3,2%%time:~0,3%.sql.gz

Il reste à renommer le fichier produit, car pour une raison de bug actuel (nov 2007) le nom de fichier ne contient pas la date, ce qui peut être réalisé par script. Personnellement, j'ai écrit un petit utilitaire qui ajoute la date du jour au nom du fichier. Le paragraphe qui précède n'est plus nécessaire du fait de l'ajout, en gras dans la commande wget ci-dessus, de la date courante après le login.

L'ensemble du script (wget +/- renommer le fichier) est à lancer en automatique (crontab sous Linux, Unix et Mac, tâches programmées sous Windows).

Enfin, en cas d'utilisation de proxy, lire le manuel de wget qui explique comment le configurer dans le fichier wgetrc. En pratique il faudra ajouter une ligne du genre : http_proxy=10.0.125.1:8080

Les sauvegardes de la base de données PostgreSQL

Utiliser wget. Ci-dessous un exemple de paramètre à passer, en modifiant bien entendu nom d'utilisateur et mot de passe et les chemins locaux de la sauvegarde (commande Unix/Linux) :

wget --save-cookies /tmp/PPA_ID --keep-session-cookies -O /dev/null "http://sql.free.fr/phpPgAdmin/redirect.php?subject=server&server=%3A5432%3Adisable&" 
wget --load-cookie /tmp/PPA_ID --keep-session-cookies --post-data="subject=server&server=:5432:disable&loginServer=:5432:disable&loginUsername=identifiant&loginPassword=mot_de_passe_pgsql&loginSubmit=Connexion" -O /dev/null "http://sql.free.fr/phpPgAdmin/redirect.php?subject=server&server=%3A5432%3Adisable&" 
wget --output-document=db_dump_identifiant.sql.gz --load-cookie /tmp/PPA_ID --keep-session-cookies --post-data="d_format=copy&what=structureanddata&sd_format=copy&sd_clean=on&sd_oids=on&output=gzipped&action=export&subject=database&server=:5432:disable&database=identifiant" "http://sql.free.fr/phpPgAdmin/dbexport.php"

L'ensemble du script (wget +/- renommer le fichier) est à lancer en automatique (crontab sous Linux, Unix et Mac, tâches programmées sous Windows).

Enfin, en cas d'utilisation de proxy, lire le manuel de wget qui explique comment le configurer dans le fichier wgetrc. En pratique il faudra ajouter une ligne du genre : http_proxy=10.0.125.1:8080.

Les sauvegardes « complètes »

Il est possible de réaliser dans une seule est même commande la sauvegarde de l'espace Web et de votre base de données MySQL. Des scripts écrit par Rodolphe Marsolier reposent sur lftp. Si vous préférez wget, vous trouverez également votre bonheur dans les scripts proposés dans le « kit » en ⬇︎ téléchargement.

Scripts utilisant lftp

Rodolphe Marsolier propose un script de sauvegarde automatisé reposant uniquement sur lftp pour Windows, Linux et Mac. Il propose également un système de sauvegarde « avancé » s'appuyant sur Subversion et lftp et permettant de réaliser des sauvegardes personnalisées (trois variantes sont disponibles en téléchargement dans notre « kit »).

Pour Linux/Mac/Unix (lftp doit avoir été installé préalablement) :

lftp -e "open http://sql.free.fr ; set http:post-content-type application/x-www-form-urlencoded ; quote post /backup.php 'login=identifiant&password=mot_de_passe_mysql&check=1&all=1' > db\%date:/=-%-db.gz ; bye"
lftp -e "set mirror:parallel-transfer-count 2 ; set mirror:set-permissions false ; open ftp://ftpperso.free.fr ; user identifiant mot_de_passe_ftp ; mirror -x .svn / site/ ; bye"

Pour Windows (lftp doit avoir été installé préalablement) :

lftp.exe -e "open http://sql.free.fr ; set http:post-content-type application/x-www-form-urlencoded ; quote post /backup.php 'login=identifiant&password=mot_de_passe_mysql&check=1&all=1' > db\%date:/=-%-db.gz ; bye"
lftp.exe -e "set mirror:parallel-transfer-count 2 ; set mirror:set-permissions false ; open ftp://ftpperso.free.fr ; user identifiant mot_de_passe_ftp ; mirror -x .svn / site/ ; bye"
Scripts utilisant wget

Voici les scripts reposant sur wget :

BACKUPDIR=/sites/sauvegardes/.backup
LOGFILE=backup.log
FTP_SERVER=ftpperso.free.fr
FTP_USERNAME=MonLogin
FTP_PASSWORD=MonPasswordFTP
if [ ! -d $BACKUPDIR ]; then
exit 1
fi
cd $BACKUPDIR
# Dump base MySQL
wget -S --progress=dot:mega http://sql.free.fr/backup.php --post-data="login=identifiant&password=mot_de_passe_mysql&check=1&all=1&sql_compat=NONE&sql_type=insertcharset_of_file=utf-8&lang=fr-utf-8&server=1&convcharset=iso-8859-1&collation_connection=utf8_general_ci&export_type=server&what=sql&header_comment=&sql_structure=structure&auto_increment=1&use_backquotes=1&sql_data=data&hexforbinary=yes&asfile=sendit&compression=gzip&filename_template=base-mysql-identifiant-%25Y-%25m-%25d" -O base-mysql-identifiant-`date +%Y-%m-%d-%H%M%S`.sql.gz > $LOGFILE  2>&1
# Sauvegarde incrementielle des fichiers par FTP
wget -r -N -x -S -l inf -a $LOGFILE --progress=dot:mega --user="$FTP_USERNAME" --password="$FTP_PASSWORD" ftp://$FTP_SERVER/
WGETCODE=$?
NOW=`date "+%Y-%m-%d_%H%M%S"`
TARFILE="${FTP_SERVER}_${FTP_USERNAME}_${NOW}.tar.bz2"
tar -cvjf "$TARFILE" $FTP_SERVER
TARSIZE=`stat --printf "%s" "$TARFILE"`
echo "Sauvegarde de $FTP_USERNAME sur $FTP_SERVER finie. Wget termine avec le code $WGETCODE. Fichier: $TARFILE ($TARSIZE Bytes)"
Script utilisant wget et lftp pour base PgSQL

Voici un script bash reposant sur wget et lftp proposé par Patrick H. :

#!/bin/bash
set -e
cd $(dirname $0)
if [ $# -ne 2 ]; then
	echo "usage: $0 Login Password"
	exit 1
fi
LOGIN=${1}
PASSWD=${2}
# Exemple de répertoires à ne pas récupérer
EXCL_LIST="-x sessions"

if [ ! -d "$LOGIN" ]; then
	mkdir -p "$LOGIN"
	# Créer une copie
	lftp ftp://$LOGIN:$PASSWD@ftpperso.free.fr -e "mirror -e --verbose $EXCL_LIST / $LOGIN ; quit" || true
else
	# Mettre à jour une copie
	lftp ftp://$LOGIN:$PASSWD@ftpperso.free.fr -e "mirror --verbose --only-newer $EXCL_LIST / $LOGIN ; quit" || true
fi

# Exemple de fichier de sauvegarde SQL
DUMP_FILE=db_dump_${LOGIN}.sql.gz

wget --save-cookies /tmp/PPA_ID --keep-session-cookies -O /dev/null "http://sql.free.fr/phpPgAdmin/redirect.php?subject=server&server=%3A5432%3Adisable&" 
wget --load-cookie /tmp/PPA_ID --keep-session-cookies --post-data="subject=server&server=:5432:disable&loginServer=:5432:disable&loginUsername=$LOGIN&loginPassword=$PASSWD&loginSubmit=Connexion" -O /dev/null "http://sql.free.fr/phpPgAdmin/redirect.php?subject=server&server=%3A5432%3Adisable&" 
wget --output-document=${DUMP_FILE} --load-cookie /tmp/PPA_ID --keep-session-cookies --post-data="d_format=copy&what=structureanddata&sd_format=copy&sd_clean=on&sd_oids=on&output=gzipped&action=export&subject=database&server=:5432:disable&database=$LOGIN" "http://sql.free.fr/phpPgAdmin/dbexport.php"

# Compression de l'ensemble
tar -cvjf site_${LOGIN}.tar.bz2 $LOGIN $DUMP_FILE
rm $DUMP_FILE

Scripts pour l'automatisation de ces tâches

Les opérations de sauvegarde peuvent être réalisées automatiquement. Pour cela, il faut enregistrer ces instructions dans un script qui sera lancé via crontab sous Linux, Unix et Mac et via les tâches programmées sous Windows.

Des scripts utilisant wget sont disponibles en téléchargement ⬇︎ ici. Il vous appartient de modifier les identifiants et mots de passe (accès SQL et FTP) et les noms et emplacements locaux des fichiers de sauvegardes (sur votre propre matériel).

Le blog Void And Any propose également un script de sauvegarde basé sur wget et lftp (associé à rsnapshot) pour les systèmes d'exploitation Linux/Unix. Vous pouvez le télécharger ⬇︎ ici. Référez-vous à la page de blog correspondante pour le mettre en œuvre.

Pour lancer automatiquement ces scripts, il faut créer une nouvelle tâche récurrente :

Restauration d'une base de données SQL

  • Rendez-vous sur http://sql.free.fr/phpPgAdmin ou http://sql.free.fr/phpMyAdmin (selon le type de base SQL utilisé). Identifiez-vous.
  • Cliquez sur l'avant-dernier onglet « Importer », situé en haut ;
  • Décompressez votre fichier de restauration (si la sauvegarde a généré un fichier au format .gz ou .bz2) car l'importation de fichiers SQL compressés n'est pas possible ;
  • Sélectionnez le fichier de restauration sur votre ordinateur (attention, les données précédentes vont être écrasées) puis « Exécuter ».

Si vous obtenez l'erreur « Impossible de créer la base/table » ou « La table XXX est déjà présente » au moment de la restauration, une erreur a eu lieu lors de la sauvegarde. Si des lignes CREATE DATABASE ou CREATE TABLE sont présentes au début ou dans le fichier, effacez-les et réessayez.

Vous pouvez également sélectionner une portion du fichier de sauvegarde pour réaliser une restauration partielle d'une table ou d'une portion de table, par un copier/coller de la sélection dans l'onglet « SQL » (second onglet, en haut).