Sauvegarder un serveur web Debian / Ubuntu vers un NAS Synology
Sommaire
Principe
Le script tourne toutes les nuits sur le serveur web :
- Copie des répertoires
/var/www/*vers un dossier local :/var/sauvegardes - Export des bases de données vers
/var/sauvegardes - Export des fichiers de configs (virtualhost apache2, certificats letsencrypt, etc.) vers
/var/sauvegardes - Compression du dossier local temporaire
/var/sauvegardesvers une archivetar.bz2 - Copie de l’archive
tar.bz2vers le NAS Synology distant (via NFS) - Rotation automatique des sauvegardes sur le syno
- 7 copies quotidiennes
- 5 copies hebdos
Prérequis
- Un accès root au serveur web
- Le script tourne en php-cli. Un
apt install php-clisuffit. - Un NAS Synology derrière une IP fixe ou un nom domaine (dynamique, ça fonctionne aussi). Le NAS doit être accessible depuis le serveur web.
- De la place sur le NAS Synology
Mise en place
Activer le serveur NFS sur le NAS Synology
Menu : Panneau de configuration > Services de fichier
Action : Activer NFS
Créer et partager un répertoire avec NFS
Menu : Panneau de configuration > Dossier partagé
Action : Créer le dossier partagé et affecter les droits NFS
Exemple : /volume1/Sauvegardes_monserveur
Paramétrages à respecter :
- Pas de corbeille sur le dossier
- Donner les permissions lecture/écriture à l’utilisateur admin (utilisateur par défaut Synology)
- Autorisations NFS
- IP :
IP fixe du serveur web - Privilège : Lecture/écriture
- Squash : Mappage de tous les utilisateurs sur admin
- Sécurité : sys
- Activer le mode asynchrone
- IP :
Montage du répertoire partagé
Sur le serveur Debian :
- Installer
nfs-common - Créer un répertoire
/mnt/nas_sauvegardes/ - Activer le partage automatique dans
/etc/fstab(pour le montage automatique au démarrage du système) - Forcer le montage avec
mount -aet tester
sudo apt install nfs-common
sudo mkdir /mnt/nas_sauvegardes
sudo nano /etc/fstab
Ajouter la ligne suivante dans /etc/fstab :
nom_domaine_ou_ip_du_nas:/volume1/Sauvegardes_monsite /mnt/nas_sauvegardes nfs rsize=8192,wsize=8192,timeo=14,intr
Tester le tout avec sudo mount -a et df -h (la place disque restante doit apparaître dans la liste).
sudo mount -a # normalement ici, pas d'erreur
df -h

En cas d’erreur avec le montage : pensez à vérifier le pare-feu du NAS Synology.
Désactivez-le le temps du test, puis ajoutez une règle spécifique : blocage des requêtes NFS sauf depuis l’IP de votre serveur.
Le script
Ci-dessous un exemple de script PHP qui sauvegarde les données localement avant de les envoyer sur le NAS avec une rotation à 7 jours et 5 semaines.
<?php
error_reporting(E_ALL);
// COPIE CONFIG
system('rm /var/sauvegardes/configs/ -r');
system('mkdir /var/sauvegardes/configs');
system('rsync -rLptgoD /etc/apache2/apache2.conf /var/sauvegardes/configs/'); // config apache 2
system('rsync -rLptgoD /etc/apache2/sites-enabled/* /var/sauvegardes/configs/'); // virtualhosts
system('rsync -rLptgoD /etc/php/7.3/apache2/php.ini /var/sauvegardes/configs/'); // config php
system('rsync -rLptgoD /etc/fail2ban/jail.local /var/sauvegardes/configs/'); // jail fail2ban
// COPIE LETSENCRYPT
system('rm /var/sauvegardes/letsencrypt -r');
system('rsync -rLptgoD /etc/letsencrypt /var/sauvegardes/ -r'); // certficats letsencryts
// COPIE SITES
system('rm /var/sauvegardes/sites -r');
system('mkdir /var/sauvegardes/sites');
system('rsync -rLptgoD /var/www/ /var/sauvegardes/sites'); // copie de tous les sites présents dans /var/www
// EXPORT MYSQL
system('rm /var/sauvegardes/bdd');
system('mkdir /var/sauvegardes/bdd');
system('mysqldump "mabase" --skip-extended-insert --quick > "/var/sauvegardes/bdd/mabase.sql"'); // export sql de mabase
system('mysqldump "mabase2" --skip-extended-insert --quick > "/var/sauvegardes/bdd/mabase2.sql"'); // export sql de mabase
// SAUVEGARDE DANS UNE ARCHIVE
system('rm /var/sauvegardes/sauvegarde.tar.bz2');
system('tar -jcf /var/sauvegardes/sauvegarde.tar.bz2 /var/sauvegardes/sauvegarde.php /var/sauvegardes/sites /var/sauvegardes/bdd /var/sauvegardes/configs /var/sauvegardes/letsencrypt');
// EXPORT NAS
if (file_exists("/mnt/nas_sauvegardes/temoin_connexion")) // un fichier vide temoin_connexion existe dans le répertoire du NAS, si ce dernier n'est pas connecté cette partie là n'est pas exexcutée
{
// rotation : sauvegarde quotidienne à 7 jours
if (file_exists("/mnt/nas_sauvegardes/sauvegarde_quot7.tar.bz2"))
{
unlink("/mnt/nas_sauvegardes/sauvegarde_quot7.tar.bz2");
}
for ($i=6; $i>=1; $i--)
{
if (file_exists("/mnt/nas_sauvegardes/sauvegarde_quot".$i.".tar.bz2"))
{
rename("/mnt/nas_sauvegardes/sauvegarde_quot".$i.".tar.bz2", "/mnt/nas_sauvegardes/sauvegarde_quot".($i+1).".tar.bz2");
}
}
copy("/var/sauvegardes/sauvegarde.tar.bz2", "/mnt/nas_sauvegardes/sauvegarde_quot1.tar.bz2");
// sauvegarde hebdo le vendredi à 5 semaines
if (date('w') == 5)
{
if (file_exists("/mnt/nas_sauvegardes/sauvegarde_hebdo5.tar.bz2"))
{
unlink("/mnt/nas_sauvegardes/sauvegarde_hebdo5.tar.bz2");
}
for ($i=4; $i>=1; $i--)
{
if (file_exists("/mnt/nas_sauvegardes/sauvegarde_hebdo".$i.".tar.bz2"))
{
rename("/mnt/nas_sauvegardes/sauvegarde_hebdo".$i.".tar.bz2", "/mnt/nas_sauvegardes/sauvegarde_hebdo".($i+1).".tar.bz2");
}
}
copy("/var/sauvegardes/sauvegarde.tar.bz2", "/mnt/nas_sauvegardes/sauvegarde_hebdo1.tar.bz2");
}
}
Crontab
Afin d’exécuter le script toutes les nuits, il faut l’ajouter au crontab, de préférence en root.
sudo crontab -e
Par exemple tous les soirs à 22h :
0 22 * * * php /var/sauvegardes/sauvegarde.php




