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