Backup-Manager est un outil très puissant permettant de réaliser des sauvegardes de votre serveur. Dans cette exemple d'installation nous avons voir comment sauvegarder différents dossiers de votre machine en les archivant sur 7 jours tout en les répliquant sur un serveur FTP externe.Changelog
23/10/2015 - V2.0 Version initiale
Librement inspiré du tutoriel d'ex_rat.
En cas de problème sur votre machine, il vous sera ainsi possible de restaurer vos fichiers comme bon vous semble.
1 - Pré-requis
On va commencer par créer un utilisateur et un espace de stockage dédié à backup-manager :
useradd backup-manager
passwd backup-manager
On créer maintenant un dossier qui nous permettra de déposer les sauvegardes distantes (de votre autres serveurs par exemple) :
mkdir /home/backup-manager
chown -R backup-manager:backup-manager /home/backup-manager
chmod -R 770 /home/backup-manager
On va faire en sorte de garder un accès FTP pour pouvoir déposer des fichiers depuis d'autres serveurs :
nano /etc/vsftpd.chroot_list
On ajoute backup-manager puis on reload :/etc/init.d/vsftpd reload
On va maintenant lui autoriser l'accès en console si on souhaite utiliser le SFTP :
nano /etc/ssh/sshd_config
On cherche la ligne AllowUsers et on ajoute backup-manager.Ensuite on reload :
/etc/init.d/ssh restart
2 - Installation et Configuration
apt-get install backup-manager
Laissez les paramètres d'installation par défaut. On est des warriors, on va tout faire à la main !nano /etc/backup-manager.conf
On attaque maintenant la configuration du bazar !Les paramètres que nous allons modifier ici sont les plus importants et ceux que nous utilisons. Libre à vous de les modifier comme vous le souhaitez. Je rappelle simplement que le but ici est de sauvegarder des dossiers précis ainsi qu'une base de données et de regrouper les archives dans un dossier /home/archives.
Ces archives seront également dupliquées sur un serveur FTP.
-------------------------------
1) Paramètres globaux
-------------------------------
Il s'agit du dossier dans lequel seront stockées vos archives. Vous pouvez choisir celui que vous voulez. Assurez-vous simplement d'avoir assez d'espace disque pour accueillir vos sauvegardes.
export BM_REPOSITORY_ROOT="/home/archives"
Ce paramètre définit le nombre de jour de sauvegardes qui seront conservés. En mettant 7 jours, nous pourrons donc conserver les sauvegardes sur une semaine.
export BM_ARCHIVE_TTL="7"
Il est impératif de mettre ce paramètre sur "true" pour que les sauvegardes de plus de 7 jours soit supprimées. Vous risqueriez de saturer votre disque si vous ne changez pas ce paramètre.
export BM_REPOSITORY_RECURSIVEPURGE="true"
Ex_rat a dit qu'il fallait le passer en "false" alors one le fait.
export BM_ARCHIVE_PURGEDUPS="false"
On choisit ici la méthode de sauvegarde que l'on souhaite utiliser. Je vous laisse consulter le fichier de configuration pour les connaitre mais le paramètre utilisé ici devrait convenir à la plupart des configurations. Si vous n'avez pas de base de données à sauvegarder vous pouvez enlever "mysql".
export BM_ARCHIVE_METHOD="tarball mysql"
Ici nous définissons le format des archives que nous souhaitons utiliser. Encore une fois, libre à vous de choisir le format qui vous convient le mieux. Dans notre cas nous utiliserons le .tar.
export BM_TARBALL_FILETYPE="tar"
L'un des paramètres le plus important car il s'agit des dossiers que vous souhaitez sauvegarder (séparer par un espace). Ici, cela dépend entièrement de vous. Pour ma part je sauvegarde ces dossiers :
export BM_TARBALL_DIRECTORIES="/home/backup /pc/42/omfg /caca/prout/pipi"
/var/www
/etc
Tips :
/home/backup-manager/serveurX
/home/backup-manager/serveurY
Ces dossiers sont ceux où je dépose en FTP les fichiers à sauvegarder depuis mes autres serveurs. Utile si vous souhaitez avoir une sauvegarde redondante. Pour cela vous pouvez très bien installer backup-manager sur ces autres serveurs.
-------------------------------
2) Sauvegarde MySQL
-------------------------------
Ce paramètre définit les bases de données que vous souhaitez sauvegarder. Par défaut elles sont toutes sauvegardées. Vous pouvez simplement entrer le nom de la bdd qui vous intéresse voire même plusieurs en les séparant par des espaces.
export BM_MYSQL_DATABASES="__ALL__"
Login et mot de passe root de votre base de données. Rien de sorcier.
export BM_MYSQL_SAFEDUMPS="true" export BM_MYSQL_ADMINLOGIN="root" export BM_MYSQL_ADMINPASS="monpass"
Ici on choisit gzip pour la compression des archives des bases de données.
export BM_MYSQL_FILETYPE="gzip"
-------------------------
3) Réplication FTP
-------------------------
On choisit donc de répliquer nos sauvegardes par FTP.
export BM_UPLOAD_METHOD="ftp"
On définit l'host qui recevra nos sauvegardes. Il est à noter que chez Online par exemple vous avez à accès un espace de sauvegarde FTP. Il serait bête de pas en profiter. Bien entendu il est possible de choisir tout autre serveur acceptant les connexions FTP.
export BM_UPLOAD_HOSTS="dedibackup-dc2.online.net"
On reste en cohérence avec les choix fait plus haut.
export BM_UPLOAD_DESTINATION="/home/archives/uploads"
Ici c'est pas sorcier ! Identifiant et mot de passe du serveur FTP ainsi que l'adresse de celui-ici.
export BM_UPLOAD_FTP_USER="mon-identifiant" export BM_UPLOAD_FTP_PASSWORD="mon-pass" export BM_UPLOAD_FTP_HOSTS="dedibackup-dc2.online.net"
On autorise backup-manager à nettoyer les sauvegardes obsolètes.
export BM_UPLOAD_FTP_PURGE="true"
On choisit une nouvelle fois le nombre de jour de rétention des sauvegardes.
export BM_UPLOAD_FTP_TTL="7"
Répertoire de destination des sauvegardes sur le serveur distant. À vous de choisir, si vous utilisez le serveur de stockage d'Online, "/" est la solution la plus simple.
export BM_UPLOAD_FTP_DESTINATION="/"
-------------
4) Autres
-------------
Désactiver la sauvegarde sur CD-ROM qui peut poser problème. Demandez à ex_rat.
export BM_BURNING_METHOD="none"
![]()
La configuration globale de backup-manager est maintenant terminée. Nous allons maintenant pouvoir peaufiner notre configuration notre configuration.On va utiliser un petit script pour vérifier nos sauvegardes. Celui-ci d'exécutera après chaque sauvegarde et contrôlera leur intégrité et leur envoi sur le serveur FTP.
export BM_POST_BACKUP_COMMAND="/usr/share/scripts-perso/backup-manager-post.php"
3 - Programmation des sauvegardes
mkdir /usr/share/scripts-perso
nano /usr/share/scripts-perso/backup-manager.sh
On colle ceci :
#!/bin/sh
test -x /usr/sbin/backup-manager || exit 0
/usr/sbin/backup-manager
Puis on le rend exécutable :
chmod +x /usr/share/scripts-perso/backup-manager.sh
Ensuite on ajoute une tâche cron :
crontab -e
Et collez :
35 1 * * * sh /usr/share/scripts-perso/backup-manager.sh > /dev/null 2>&1
Ici le script se lancera tous les jours à 1h35 du matin. Précisément. Oui oui.4 - Récapitulatif mail et Vérifications
On a spécifié un script à lancer à la fin de la sauvegarde dans la configuration de backup-manager. Ce script à donc pour but de vérifier si la sauvegarde s'est bien passée et en plus de ça il vous enverra un petit récapitulatif par mail.Commençons par vérifier que votre serveur est bien à l'heure :
nano /etc/php5/cli/php.ini
On cherche la ligne ";date.timezone ="que l'on remplace par (sans oublier de retirer le " ; " :
date.timezone = Europe/Paris
On va maintenant créer le script :
nano /usr/share/scripts-perso/backup-manager-post.php
Et coller sans oublier de modifier les paramètres au début de celui-ci :
#!/usr/bin/php
<?php
/**
* backup-manager post script :
* - permet de vérifier l'intégrité des fichiers uploadés sur le serveur de sauvegarde
* (comparaison des chaines md5)
* - envoie d'un mail récapitulatif contenant la liste des fichiers et la taille totale utilisée
*
* @references script inspiré de Alsacréation : http://www.alsacreations.com/tuto/lire/618-Sauvegarde-backup-manager.html et @Franek <franek at chicour dot net>
* @author alexandre.laidin
*/
/**
* Configuration
*/
# email de l'expediteur
$email_from = 'root@votre-domaine-ou-nom-serveur';
# email des destinataires
$email_dest = array('votre@email.com');
# répertoire local de stockage des fichiers de sauvegarde
$archives_dir = '/var/archives';
# adresse du serveur FTP
$ftp_server = 'dedibackup-dc2.online.net';
# identifiant du serveur FTP
$ftp_user_name = 'votre-identifiant';
# mot de passe du serveur FTP
$ftp_user_pass = 'votre-mot-de-passe';
$ftp_directory = '/';
/**
* Ne pas modifier - ci-dessous
*/
/**
*
* Envoi d'un mail
*
* @param array $email_dest
* @param string $subject
* @param string $content
*/
function sendMail($email_dest, $subject, $content, $headers)
{
foreach($email_dest as $dest)
{
mail($dest, $subject, $content, $headers);
}
}
/**
* Récupère la liste des fichiers présents en local pour une date donnée
* @param $archives_dir string répertoire de stockage des fichiers
* @param $filtre_date string date à filtrer (format YYYYMMDD)
* @return array
*/
function getLocalFiles($archives_dir, $filtre_date)
{
clearstatcache();
$files = array();
foreach (new DirectoryIterator($archives_dir) as $file_info)
{
if($file_info->isDot() || !preg_match('/'.date('Ymd').'/',$file_info->getFileName()))
{
continue;
}
$file['name'] = $file_info->getFilename();
// on utilise cette commande car filesize ne gère pas les fichiers de plus de 2Go.
$file['size'] = exec("stat -c %s '".$file_info->getPathname()."'");
$files[] = $file;
}
sort($files);
return $files;
}
/**
*
* Compare le hachage md5 des fichiers locaux avec les fichiers envoyés
* sur le serveur FTP
* Si le hachage est identique, renvoie true.
* Sinon, renvoie false
*
* @param string $md5_file
* @param string $ftp_server
* @param string $ftp_user_name
* @param string $ftp_user_pass
* @param string $filtre_date
* @return bool
*/
function verifMd5Ftp($md5_file, $ftp_server, $ftp_user_name, $ftp_user_pass, $ftp_directory)
{
$handle = fopen($md5_file, "r");
if ($handle !== false)
{
while (!feof($handle))
{
$buffer = fgets($handle, 4096);
if (!empty($buffer)){
list($md5, $filename) = explode(" ", $buffer);
// pour supprimer /n
$filename = trim($filename);
if (!empty($filename))
{
if ($md5 !== getMd5OverFtp($filename, $ftp_server, $ftp_user_name, $ftp_user_pass, $ftp_directory))
{
fclose($handle);
return false;
}
}
}
}
fclose($handle);
}
else
{
return false;
}
return true;
}
/**
* * Renvoie le hachage md5 d'un fichier présent sur le serveur FTP de sauvegarde
*
* @param string $file fichier dont le md5 doit être calculé
* @param string $ftp_server adresse du serveur FTP de sauvegarde
* @param string $ftp_user_name identifiant de connexion du serveur FTP
* @param string $ftp_user_pass mot de passe de connexion du serveur FTP
* @return string
*/
function getMd5OverFtp($file, $ftp_server, $ftp_user_name, $ftp_user_pass, $ftp_directory)
{
$connect_string = 'ftp://';
$connect_string .= $ftp_user_name;
if (!empty($ftp_user_pass))
{
$connect_string .= ':'.$ftp_user_pass;
}
$connect_string .= '@'.$ftp_server;
$connect_string .= $ftp_directory;
$connect_string .= '/'.$file;
return md5_file($connect_string);
}
/**
* Renvoie la taille du fichier en un format compréhensif
*
* source : http://fr.php.net/manual/en/function.filesize.php (nak5ive at DONT-SPAM-ME dot gmail dot com)
*
* @param int $bytes
* @param int $precision
* @return string
*/
function formatBytes($bytes, $precision = 2)
{
$units = array('B', 'KB', 'MB', 'GB', 'TB');
$bytes = max($bytes, 0);
$pow = floor(($bytes ? log($bytes) : 0) / log(1024));
$pow = min($pow, count($units) - 1);
$bytes /= pow(1024, $pow);
return round($bytes, $precision) . ' ' . $units[$pow];
}
/**
* début du script
*/
$date = date('Ymd');
$host = trim(file_get_contents('/etc/hostname'));
# fichier contenant les chaines md5 de tous les fichiers sauvegardés
$md5_file = $archives_dir.'/'.$host.'-'.$date.'.md5';
$check_md5_ftp = false;
$output = "";
$message_html = "<html><head></head>";
$message_html .= "<style type='text/css'> table{border:solid 1px #777777; border-collapse:collapse; font-family:arial;";
$message_html .= "body{font-family:Arial, Helvetica, sans-serif; font-size:13px;}";
$message_html .= ".info, .success, .warning, .error, .validation {border: 1px solid;margin: 10px 0px;padding:15px 10px 15px 50px;";
$message_html .= ".info {color: #00529B;background-color: #BDE5F8;}";
$message_html .= ".success {color: #4F8A10;background-color: #DFF2BF;}";
$message_html .= ".warning {color: #9F6000;background-color: #FEEFB3;}";
$message_html .= ".error {color: #D8000C;background-color: #FFBABA;}";
$message_html .= "</style>";
$message_html.= "<body>";
clearstatcache();
$local_files = getLocalFiles($archives_dir, $date);
$subject = '['.$host.']';
if(empty($local_files))
{
$message_html .= "<div class='error'>Fichiers non présents en local</div>";
$subject .= ' - Backup - LOCAL KO';
}
else
{
$subject .= ' - Backup - LOCAL OK';
$message_html .= "<div class='info'>Sauvegarde Local effective</div>";
$message_html .= "<table cellspacing='0' cellpadding='3px' rules='rows'>";
$message_html .= "<caption>Détail de la sauvegarde</caption>";
$message_html .= "<thead><tr class='ligne'><th class='colti'>Fichier</th><th>Taille</th></tr></thead>";
$total_size = 0;
// affichage de la liste des fichiers avec leur taille et un total global
foreach($local_files as $file)
{
$message_html .= "<tr><td class='colti'>".$file['name']."</td><td>".formatBytes($file['size'])."</td></tr>";
$total_size += $file['size'];
}
$message_html .= "<tfoot><tr><td>Total :</td><td>".formatBytes($total_size)."</td></tr></tfoot></table>";
$message_html .= "</br></br>";
// lance la vérification md5 des fichiers uploadés sur le serveur FTP
$check_md5_ftp = verifMd5Ftp($md5_file, $ftp_server, $ftp_user_name, $ftp_user_pass, $ftp_directory);
if ($check_md5_ftp === false)
{
$message_html .= "<div class='warning'>Problème d'intégrité des fichiers sur serveur FTP</div>";
$subject .= ' - FTP KO';
}
else
{
$message_html .= "<div class='info'>Intégrité contrôlée des fichiers sur serveur FTP</div>";
$subject .= ' - FTP OK';
}
}
$message_html.= "</body></html>";
//$headers = "From: root <>\r\n";
//$headers = "From: root@nagasaki.ratbox.nl\n";
$headers = "From: $email_from\n";
$headers .= "MIME-Version: 1.0\r\n";
$headers .= "Content-Type: text/html; charset=utf8\r\n";
sendMail($email_dest, $subject, $message_html, $headers);
?>
On le rend exécutable :
chmod +x /usr/share/scripts-perso/backup-manager-post.php
5 - Conclusion
Pour tester, ou pour lancer une sauvegarde manuellement, il suffit de taper en console:
backup-manager
A ce niveau du tuto, on peut se connecter de l’extérieur en ftp (avec l'user backup-manager créé au début) pour mettre des choses à sauvegarder dans /home/backup et notre bdd mysql local sera sauvegardé.Toutes les nuits, on aura une sauvegarde dans /var/archives et une réplication sur le serveur FTP.