Sauvegarder un serveur web Debian / Ubuntu vers un NAS Synology

Principe

Le script tourne toutes les nuits sur le serveur web :

  1. Copie des répertoires /var/www/* vers un dossier local : /var/sauvegardes
  2. Export des bases de données vers /var/sauvegardes
  3. Export des fichiers de configs (virtualhost apache2, certificats letsencrypt, etc.) vers /var/sauvegardes
  4. Compression du dossier local temporaire /var/sauvegardes vers une archive tar.bz2
  5. Copie de l’archive tar.bz2 vers le NAS Synology distant (via NFS)
  6. 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

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

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.

Êtes-vous humain ? *