<?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);
}
?>
<?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
?>
<?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);
?>
crontab -e
* 12 * * * php -q /chemin/de/mon/fichier/files_backup.php
15 0/12 * * * php -q /chemin/de/mon/fichier/files_backup.php
* 13 * * * php -q /chemin/de/mon/fichier/db_backup.php
# ou
15 1/13 * * * php -q /chemin/de/mon/fichier/db_backup.php