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/sauvegardes
vers une archivetar.bz2
- Copie de l’archive
tar.bz2
vers 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-cli
suffit. - 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 -a
et 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