Digital Dynamics
L'informatique innovante et abordable

Dernière mise à jour : lun. 09 mai 2016, 17:57

Sauvegarder et restaurer mon site internet : comment faire ? (2/3)

Dans la première partie de cet article, nous avons vu comment sauvegarder les fichiers d'un ou de plusieurs sites sous leur forme binaire dans une base de données tout en préservant leurs droits. Maintenant, nous allons aborder la partie de la sauvegarde des bases de données localement et éventuellement sur un serveur distant par le biais d'une connexion FTP.

Sauvegarde de la base de données

Pour sauvegarder une base de données MySQL efficacement, il existe une fonction propre à MySQL: mysqldump. Dans ce script, nous allons appeler cette fonction au moyen de PHP pour générer une archive compressée de l'ensemble de votre base de données.

D'abord une fonction supplémentaire

Certaines de ces fonctions ont déjà été utilisées dans la première partie. Voici un dossier à télécharger gratuitement et librement contenant les fichiers utilisés dans ce tutoriel.

<?php
/******************************************************************
Supprime un répertoire et son contenu (y compris sous-répertoires)
*******************************************************************/
function supprimer_repertoire($dir){ 
	$current_dir = opendir($dir); 
	while($entryname = readdir($current_dir)){ 
		if(is_dir($dir.'/'.$entryname) and ($entryname != "." and $entryname!=".."))	supprimer_repertoire($dir.'/'.$entryname); 
		elseif($entryname != "." and $entryname!="..")  unlink($dir.'/'.$entryname);  
		} 
	closedir($current_dir); 
	rmdir($dir); 
	}
?>

Un peu de configuration / personnalisation

La solution DigiBackup est entièrement personnalisable. Un fichier de configuration unique servira pour les 3 procédures: sauvegarde des fichiers, sauvegarde de la base de données, restauration des fichiers.

<?php
/***********************************************************************
Variables d'exécution
************************************************************************/
date_default_timezone_set('Europe/Paris'); // Changer la timezone si nécessaire
$debut = microtime(true); $content = '';
$jour = date('j',time()); // date du jour de 1 à 28,30 ou 31 suivant le mois
error_reporting(0); // supprime les éventuels avertissements ou erreurs
set_time_limit(0); // cela peut durer un certain temps (suivant le nombre et la taille des sites)
$configuration = array(
	/************************************************************************
	pour chaque site à sauver, 3 variables: la racine du site, les éventuels répertoires à ignorer,les identifiants de la base de donnée concernée
	************************************************************************/
	'nom_site_1'	=> array(
				'siteRoot' =>	'/var/www/site_1', 
				'ignore' => 	array(),
				'dbConnect' => 	array(
							'host' 		=> 'localhost',
							'user' 		=> 'user_site1',
							'password' 	=> 'pwd_site1',
							'db'		=> 'db_name1'
							)
				),
	'nom_site_2'	=> array(
				'siteRoot' =>	'/var/www/site_2', 
				'ignore' => 	array('repertoire/a/eviter','celui/ci/aussi'),
				'dbConnect' => 	array(
							'host' 		=> 'localhost',
							'user' 		=> 'user_site2',
							'password' 	=> 'pwd_site2',
							'db'		=> 'db_name2'
							)
				),
	'nom_site_3'	=> array(
				'siteRoot' =>	'/var/www/site_3', 
				'ignore' => 	array('archives'),
				'dbConnect' => 	array(
							'host' 		=> 'localhost',
							'user' 		=> 'user_site3',
							'password' 	=> 'pwd_site3',
							'db'		=> 'db_name3'
							)
				)
);
$route = '/root/digibackup/backups/'; // Dossier racine où vont se trouver vos sauvegardes localement (de préférence inaccessible depuis l'extérieur)
/*******************************************************************************
Variables de mail (reporting)
********************************************************************************/
$mailVars = array(
	'to'=>'votre@mail.com',
	'fromName'=>'Nom Expediteur',
	'fromAddr'=>'mail@expediteur.com',
	'abuseAddr'=>'abuse@expediteur.com',
	);
	
/*******************************************************************************
Détermination des backups à conserver sur le serveur (7 jours)
********************************************************************************/
$except = array();
if($jour > 7) $except = array(0 => ($jour-7),1=>($jour-6),2=>($jour-5),3=>($jour-4),4=>($jour-3),5=>($jour-2),6=>($jour-1),7=>($jour));
else { 
	for($i=1;$i<=$jour;$i++) $except[] = $i;
	$difference = 7-$jour;
	for($i=1;$i<=$difference;$i++) $except[] = 32-$i;
}
/*******************************************************************************
Config FTP serveur distant (facultatif)
********************************************************************************/
$ftp_user_name='utilisateur_FTP';
$ftp_user_pass='mot_de_passe_FTP';
$ftp_server='ftp.mon-serveur-ftp.com';
$ftp_port = 21;
$remotePath='sauvegarde-sites'; //répertoire de sauvegarde sur votre serveur distant
?>

Mise en oeuvre du script

Bien sûr, ne pas oublier de remplacer les variables par les vôtres. La partie FTP étant facultative, je vous laisse le soin de commenter ces lignes le cas échéant.

<?php
include( __DIR__ .'/functions.php');
include( __DIR__ .'/config.php');
/********************************************************************************
DEMARRAGE DU SCRIPT POUR CHAQUE SITE
	Création et sauvegarde des fichiers sqldump sur le serveur 
*********************************************************************************/
foreach($configuration as $site=>$vars) {
	$debInter = microtime(true);
	$content .= 'Démarrage de la sauvegarde de la base '.$site."n";
	$new_rep = $route.$site;
	if(!file_exists($new_rep)) { mkdir($new_rep,0644);} // Crée le répertoire du site s'il n'existe pas
	$new_day = $route.$site.'/'.$jour;
	if(!file_exists($new_day)) { mkdir($new_day,0644);} // Crée le répertoire du jour s'il n'existe pas
	$backupFile = $route.$site.'/'.$jour.'/'.$vars['dbConnect']['db'] . date("Y-m-d-H-i-s") . '.sql.gz';
	$command = "mysqldump --host=".$vars['dbConnect']['host']." --user=".$vars['dbConnect']['user']." --password=".$vars['dbConnect']['password']." ".$vars['dbConnect']['db']." | gzip > $backupFile";
	system($command);
	chmod($backupFile,0744);
	$content .= "La création de l'archive a été effectuées avec succès"."n";
	$file = str_replace($route.$site.'/'.$jour.'/','',$backupFile);
/********************************************************************************
Envoi en FTP sur le serveur distant (optionnel)
*********************************************************************************/
/*
	$fp = fopen($backupFile, 'r');	
	$conn_id = ftp_connect($ftp_server,$ftp_port);
	$login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass);
	ftp_chdir ( $conn_id , $remotePath );
	ftp_fput($conn_id, $file, $fp, FTP_BINARY);
	ftp_close($conn_id);
	fclose($fp);
	$content .= "Upload de l'archive ".$file." sur serveur distant effectué avec succès"."n";
*/
/************************************************************************************
Nettoyage des archives sur le serveur local > 7 JOURS
*************************************************************************************/
	for($i=1; $i<=31; $i++) if(!in_array($i,$except)){
		$del_rep = $route.$site.'/'.$i; if(file_exists($del_rep)) supprimer_repertoire($del_rep); 
		}
	$finInter = microtime(true);
	$content .= 'Durée de traitemement de '.$file.' : '.duree($debInter,$finInter)."n"."n";
	}
/************************************************************************************* 
Fin du script - génération et envoi du rapport
**************************************************************************************/
$fin = microtime(true);
$content .= "Script terminé - Temps d'exécution : ".duree($debut,$fin)."n";
$subject = "Sauvegarde des bases de données";
envoyer($subject,$content);
?>

Automatisation de votre sauvegarde

Maintenant que nous avons créé les deux fichiers chargés d'effectuer votre sauvegarde, il faut les exécuter. Afin d'automatiser cette fonction, nous allons utiliser des tâches CRON.

Il faudra laisser un délai suffisamment long entre les 2 scripts pour que la sauvegarde des fichiers ait le temps de se terminer avant que le dump de la table se fasse. Ce délai dépendra de la taille et du nombre de vos sites.

Pour cela, ouvrir la console d'administration linux et taper l'instruction suivante:

crontab -e

Placez-vous en dessous des éventuelles tâches existantes et taper ceci pour une exécution du fichier tous les jours à midi

* 12 * * * php -q /chemin/de/mon/fichier/files_backup.php

Pour une exécution à midi et quart (12:15) et minuit et quart (00:15) chaque jour, taper ceci:

15 0/12 * * * php -q /chemin/de/mon/fichier/files_backup.php

Rajouter une ligne pour le fichier de sauvegarde de la base de données (rajout d'une heure par rapport à l'exemple précédent)

* 13 * * * php -q /chemin/de/mon/fichier/db_backup.php
                            ou
15 1/13 * * * php -q /chemin/de/mon/fichier/db_backup.php

Sauvegardez vos modification CRON ( Ctrl+X puis validez) et votre sauvegarde est en place.

Restauration de votre site

Nous allons maintenant aborder la partie concernant la restauration de vos données (base de données et fichiers). Cette étape étant relativement longue à détailler, je vous donne rendez-vous dans la troisième et dernière partie.

 

Page 1 2 3

L'informatique facile et expliquée