Serveur NAS/ownCloud – Script de sauvegarde

Retour à l’article principal : https://yavin4.ovh/index.php/2016/04/04/linuxhardkernel-nas-et-cloud-perso-avec-odroid-xu4-et-son-boitier-cloudshell/

Le script peut être exécuté manuellement ou par tâche planifiée cron. Les multiples retours avec echo permettent de s’assurer du bon déroulement des opérations lors d’une exécution manuelle.

Alertes en cas d’échec

Les alertes mails sont envoyées via mutt car ce dernier permet d’inclure une pièce jointe dans un mail (envoi du fichier de log par mail en cas d’erreur de sauvegarde). Si vous ne possédez pas mutt, vous pouvez l’installer via :

$ apt-get install mutt

Puis créer un nouveau fichier de config pour root :

$ nano /root/.muttrc

Et compléter ce fichier en suivant la partie « Configuration de mutt » du tutoriel suivant (rédigé pour un Raspberry Pi mais la démarche est la même) : https://yavin4.ovh/index.php/2014/11/30/raspberry-pi-camera-de-video-surveillance-recevoir-des-alertes-mails/#Configuration_de_mutt

Sécuriser l’export de la base de données owncloud

Le script prend en compte la sauvegarde de la base de données d’ownCloud par un mysqldump. Pour sécuriser un peu l’opération, il faut créer un utilisateur avec des droits restreints (juste le minimum permettant l’export). On nommera cet utilisateur « user_dump » par exemple.

Se connecter à MySQL en tant que root :

$ mysql -u root -p

Créer l’utilisateur :

mysql> GRANT SELECT, LOCK TABLES ON owncloud.* TO user_dump@localhost IDENTIFIED BY 'password'; (remplacer password par le mot de passe de votre choix, un truc bien complexe et différent de celui de root ou owncloud)

Appliquer les changements :

mysql> FLUSH PRIVILEGES;

Puis quitter MySQL :

mysql> exit;
Bye
Le script
$ nano /root/scripts/script_sauvegarde.sh

A adapter par vos soins dans le script :

  • La variable « REP »,
  • Le password de l’utilisateur « user_dump »,
  • L’adresse mail sur laquelle envoyer une alerte en cas de problème,
  • Tout autre élément qui peut vous paraître à améliorer 🙂
#!/bin/bash

# Initialisation de variables pour afficher de la couleur dans le terminal + emplacement du fichier de logs
set -u
GREEN="\x1b[32;01m"
RED="\x1b[31;01m"
RESET="\x1b[39;49;00m"
LOG="/var/log/sauvegarde.log"
PWD_USER_DUMP="password_de_user_dump"
DATE=`date +%d-%m-%Y`
REP="repertoire_de_sauvegarde"

# Les parenthèses englobent tout ce qui sera reporté dans le fichier de logs
(

# Les accolades forment un bloc de toutes les actions qui sont exécutées.
# Si une de ces actions ne se termine pas correctement, on sort du bloc d'accolades et on rentre dans le suivant en bas du script.
{

echo "Vérification de l'emplacement de sauvegarde :" &&
if [ -d $REP ];then
 # Si le répertoire de sauvegarde existe, création d'un sous-répertoire à la DATE du jour et poursuite des opérations.
 # Sinon on passe directement à la directive else en bas du script.
 mkdir $REP/$DATE &&
 echo -e "[$GREEN OK $RESET]" &&


# Déplacement dans ce répertoire
 cd $REP/$DATE &&
# Création des sous-répertoires
 mkdir fstab minidlna network nginx nginx/conf.d nginx/sites-available letsencrypt owncloud php phpmyadmin samba scripts crontab logs divers &&
 chmod -R 700 $REP/$DATE &&


# Arrêt des services
 echo "Arrêt des services Nginx et PHP-FPM :" &&
 sudo service nginx stop &&
 sudo service php7.0-fpm stop &&
 echo -e "[$GREEN OK $RESET]" &&


# Sauvegarde des fichiers de conf réseau
 echo "Sauvegarde des fichiers de conf réseau :" &&
 cd $REP/$DATE/network &&
 cp /etc/hostname ./ &&
 cp /etc/hosts ./ &&
 cp /etc/resolvconf/resolv.conf.d/base ./ &&
 cp /etc/network/interfaces ./ &&
 cp /etc/udev/rules.d/10-network.rules ./ &&
 echo -e "[$GREEN OK $RESET]" &&


# Sauvegarde ownCloud /var/www/owncloud
 echo "Sauvegarde des fichiers de conf ownCloud :" &&
 cd $REP/$DATE/owncloud/ &&
 tar zcf sauv_owncloud_${DATE}.tar.gz /var/www/owncloud &&
 echo -e "[$GREEN OK $RESET]" &&


# Sauvegarde base de données ownCloud
 echo "Sauvegarde de la base de données ownCloud :" &&
 cd $REP/$DATE/owncloud &&
 mysqldump --lock-tables -h 127.0.0.1 -u user_dump -p$PWD_USER_DUMP owncloud > backup_bdd_owncloud_${DATE}.sql &&
 echo -e "[$GREEN OK $RESET]" &&


# Sauvegarde fichiers de config nginx pour owncloud et phpmyadmin + répertoire certificats
 echo "Sauvegarde des fichiers de conf Nginx pour owncloud et phpmyadmin + répertoire certificats :" &&
 cd $REP/$DATE/nginx/ &&
 cp /etc/nginx/nginx.conf ./ &&
 cp -r /etc/nginx/sites-available/* ./sites-available/ &&
 cp -r /etc/nginx/conf.d/* ./conf.d/ &&
 cp -r /etc/letsencrypt/archive/* ../letsencrypt/ &&
 echo -e "[$GREEN OK $RESET]" &&


# Sauvegarde fichiers de conf PHP
 echo "Sauvegarde des fichiers de conf PHP :" &&
 cd $REP/$DATE/php &&
 cp /etc/php/7.0/fpm/php.ini ./ &&
 cp /etc/php/7.0/fpm/pool.d/www.conf ./ &&
 echo -e "[$GREEN OK $RESET]" &&


# Sauvegarde PhpMyAdmin
 echo "Sauvegarde du répertoire /var/www/phpmyadmin :" &&
 cd $REP/$DATE/phpmyadmin &&
 tar zcf sauv_phpmyadmin_${DATE}.tar.gz /usr/share/phpmyadmin &&
 echo -e "[$GREEN OK $RESET]" &&


# Sauvegarde fichier de conf samba
 echo "Sauvegarde du fichier de conf Samba :" &&
 cd $REP/$DATE/samba &&
 cp /etc/samba/smb.conf ./ &&
 echo -e "[$GREEN OK $RESET]" &&


# Sauvegarde de /etc/fstab
 echo "Sauvegarde de /etc/fstab :" &&
 cd $REP/$DATE/fstab &&
 cp /etc/fstab ./ &&
 echo -e "[$GREEN OK $RESET]" &&


# Sauvegarde fichiers de conf miniDLNA
 echo "Sauvegarde fichiers de conf miniDLNA :" &&
 cd $REP/$DATE/minidlna &&
 cp /etc/default/minidlna ./ &&
 cp /etc/minidlna.conf ./ &&
 echo -e "[$GREEN OK $RESET]" &&


# Sauvegarde crontab
 echo "Sauvegarde crontab :" &&
 cd $REP/$DATE/crontab &&
 touch crontab-root &&
 crontab -l > crontab-root &&
 crontab -u www-data -l > crontab-www-data &&
 echo -e "[$GREEN OK $RESET]" &&


# Sauvegarde des logs
 echo "Sauvegarde des logs :" &&
 cd $REP/$DATE/logs &&
 tar zcf sauv_logs_${DATE}.tar.gz /var/log &&
 echo -e "[$GREEN OK $RESET]" &&


# Sauvegarde des scripts
 echo "Sauvegarde des scripts :" &&
 cd $REP/$DATE/scripts &&
 cp -r /root/scripts/* ./ &&
 echo -e "[$GREEN OK $RESET]" &&


# Sauvegarde de conf divers
 echo "Sauvegarde de fichiers de conf divers :" &&
 cd $REP/$DATE/divers &&
 cp /root/.bash_aliases ./root-bash_aliases &&
 cp /root/.muttrc ./root-muttrc &&
 echo -e "[$GREEN OK $RESET]" &&


# Redémarrage des services
 echo "Démarrage des services :" &&
 sudo service php7.0-fpm start &&
 sudo service nginx start &&
 echo -e "[$GREEN OK $RESET]" &&


# Fin sauvegarde
 chmod -R 600 $REP/$DATE &&
 echo -e "Sauvegarde effectuée$GREEN avec succès!$RESET"


else
 # Si il y a un problème lors de la vérification de l emplacement de sauvegarde, le script s arrête et une alerte est envoyée par mail
 echo -e "[$RED NOK $RESET]"
 echo "La sauvegarde s'est arrêtée car l'emplacement de sauvegarde n'existe pas ou est inaccessible"
 echo "La sauvegarde s'est arrêtée car l'emplacement de sauvegarde n'existe pas ou est inaccessible" | mutt -s "Sauvegarde échouée" -a $LOG -- mon_email
 exit 1
 fi

} || {
 # Si une commande ne s est pas terminée correctement, le script s arrête et une alerte est envoyée
 echo -e "[$RED NOK $RESET]"
 sudo service nginx start
 sudo service php7.0-fpm start
 echo "La sauvegarde s'est arrêtée car une commande ne s'est pas terminée correctement"
 echo "Une commande ne s'est pas terminée correctement" | mutt -s "Sauvegarde échouée" -a $LOG -- mon_email
 exit 1
}

) 2>&1 | tee $LOG

exit 0

Mettre les bons droits sur ce script, dans mon cas il est stocké dans /root/scripts/ :

$ chown root:root /root/scripts/script_sauvegarde.sh
$ chmod 700 /root/scripts/script_sauvegarde.sh

Mettre tout ça dans une tâche cron, par exemple :

$ crontab -e
# Tous les soirs à 23:00, exécute le script de sauvegarde :
0 23 * * * /root/scripts/script_sauvegarde.sh
%d blogueurs aiment cette page :