[MÉMO] Sauvegarde locale et distante de Nextcloud

Héberger son propre cloud c’est bien (cela permet d’avoir un meilleur contrôle de ses données), mais pour pouvoir le faire sereinement il faut penser aux sauvegardes. Afin d’éviter le pire et de tout perdre…

J’ai installé mon instance NextCloud sur un KS-2 en suivant ce tuto et celui de Nicolas sur AbyssProject (Debian 9 avec NGINX, PHP 7 et MariaDB 👌).

Pourquoi NextCloud ?
Pourquoi NextCloud ? A safe home for all your data – community-driven, free & open source

Afin de m’en servir comme un vrai cloud (et donc de me dégoogliser un peu encore), j’avais besoin de le faire sereinement sans crainte d’un crash et d’une perte de données. Il faut donc mettre en place un système de sauvegarde pour limiter le risque !

La doc officielle donne quelques informations, et j’ai trouvé un petit tuto en Français sympa pour me mettre sur les bonnes pistes ! Et je l’ai adapté à mon fonctionnement.

 

Principe

Pour minimiser le temps d’indisponibilité (puisqu’il faut mettre l’instance en mode maintenance pour éviter toute modification et accès à la BDD pendant la copie), on va d’abord copier le répertoire entier dans un autre répertoire en utilisant effectivement RSYNC en local comme dans le tuto cité juste avant. Une fois cette copie terminée on sort l’instance du mode maintenance.

Le but est maintenant de dupliquer ce répertoire sur une autre machine distante pour le conserver en lieu sûr. Dans mon cas cela sera sur mon NAS QNAP via une synchro RSYNC.

Habituellement je compresse les fichiers avant de les envoyer sur un autre lieu de sauvegarde. Le problème ici c’est que cela demande plus d’une heure à mon Kimsufi pour compresser cette sauvegarde (~5 Go pour l’instant). Dans un premier temps on va se contenter de la transférer sans la compresser. Je verrai plus tard si je veux procéder autrement, mais ça risque d’être compliqué dès que je vais vraiment commencer à m’en servir comme cloud personnel et donc le remplir…

 

Le script

Le script que j’ai adapté à mon fonctionnement est assez basique et reprend les bases de ce que j’ai déjà construit pour d’autres sauvegardes.

Attention ce script devra être lancé par un utilisateur ayant les droits suffisants sur le répertoire d’installation de Nextcloud. Notamment, pour la commande mise en maintenance de l’instance fonctionne.

J’ai simplement ajouté l’étape de synchronisation sur le NAS QNAP. Pour le reste tout est déjà très bien expliqué sur le tutoriel qui m’a largement inspiré. 😉

/home/scripts/backup/backup_nextcloud.sh
#!/bin/bash

#
## Script original de https://soozx.fr/sauvegarde-locale-manuelle-planifiee-nextcloud/
## Modification et adaptation pour https://blog.raphaelchochon.io
#

## SAUVEGARDE DE NEXTCLOUD

SHELL=/bin/bash

## VARIABLES & FONCTION MAIL
# Répertoire de stockage des logs
LOGDIR="/home/backup_nextcloud/log/"
# Email pour les erreurs (0 pour désactiver)
EMAIL=votre_email
# Log de sortie & erreurs
exec &> ${LOGDIR}/out.log
# Répertoire nextcloud
NCDIR="/var/www/nextcloud"
# Répertoire de la sauvegarde
NCDIR_BCKP="/home/backup_nextcloud/backup_dir"
# Nom de l'archive
ARCHIVE_NAME="nextcloud_$(date +%d.%m.%y@%Hh%M)"
# Rétention / rotation des sauvegardes SQL
RETENTION=7
# Nom base de données nextcloud
NCBDD="nextcloud"
#Propriétaire base de données nextcloud
NCUSER="nextcloud"
# Mot de passe de la base de données nextcloud
NCPWD="mon_mot_de_passe"
# L'IP du NAS ou le domaine No-IP
QNAP_HOST="IP_ou_HOST_du_NAS"
# Le port natter sur votre box vers votre NAS
QNAP_PORT="5000"
# L'user rsync configuré dans votre NAS
QNAP_USER="qnap-xxx"
# L'emplacement du fichier contenant le mot de passe du QNAP
QNAP_PWD="/home/nextcloud/pwd-qnap.txt"
# Emplacement sur le NAS sans le slash devant !
QNAP_DIR="rsync/nextcloud/backup_dir"

# Fonction mail
function cleanup {
if [ "$EMAIL" != "0" ] ; then
cat ${LOGDIR}/out.log | mail -s "BCKP NextCloud Rapport" ${EMAIL}
else
echo "Rapport mail désactivé"
fi
}
trap cleanup EXIT

### SCRIPT

## ETAPE DE COPIE

echo "###### DEBUT DE LA COPIE LOCALE ######"
# Créer si besoin les répertoires manquants dans le dossier de sauvegarde
[ ! -d ${NCDIR_BCKP}/www/config ] && mkdir -p ${NCDIR_BCKP}/www/config
[ ! -d ${NCDIR_BCKP}/www/data ] && mkdir -p ${NCDIR_BCKP}/www/data
[ ! -d ${NCDIR_BCKP}/www/themes ] && mkdir -p ${NCDIR_BCKP}/www/themes
[ ! -d ${NCDIR_BCKP}/bdd ] && mkdir -p ${NCDIR_BCKP}/bdd

# Activation du mode maintenance nextcloud
php ${NCDIR}/occ maintenance:mode --on

# Réaliser la copie
rsync -Aax --delete-after ${NCDIR}/config/ ${NCDIR_BCKP}/www/config/
rsync -Aax --delete-after ${NCDIR}/data/ ${NCDIR_BCKP}/www/data/
rsync -Aax --delete-after ${NCDIR}/themes/ ${NCDIR_BCKP}/www/themes/
mysqldump -u ${NCUSER} -p${NCPWD} $NCBDD > ${NCDIR_BCKP}/bdd/${ARCHIVE_NAME}.sql

# Désactivation du mode maintenance nextcloud
php ${NCDIR}/occ maintenance:mode --off

echo "###### FIN DE LA COPIE LOCALE ######"


## ETAPE DE NETTOYAGE

echo "###### SUPPRESSION DES VIEUX DUMP SQL ######"
find ${NCDIR_BCKP}/bdd -name "*.sql" -mtime +${RETENTION} -print -exec rm -f {} \;


## ETAPE DE COPIE SUR LE NAS QNAP

echo "###### DEBUT DE LA COPIE SUR LE NAS QNAP ######"
# RSYNC du répertoire qui vient d'être backupé vers le NAS QNAP
rsync -cazov --password-file=${QNAP_PWD} --port=${QNAP_PORT} --delete ${NCDIR_BCKP} ${QNAP_USER}@${QNAP_HOST}::${QNAP_DIR}
echo "###### FIN DE LA COPIE SUR LE NAS QNAP ######"

## FIN
echo "###################### FIN DE LA SAUVEGARDE ######################"

 

Pour lancer l’exécution du script avec mon utilisateur nextcloud par exemple (mais en étant connecté avec un autre utilisateur) :

su -l nextcloud -c "/bin/bash /home/scripts/backup/backup_nextcloud.sh"

 

Automatisation

Comme d’habitude, on passe par une tâche cron pour automatiser tout ça. Pour ma part ce sera en journée, pas envie de réveiller mon NAS la nuit.

Il faut que ce soit l’utilisateur nextcloud (ou www-data selon votre installation) qui exécute ce script donc on créer un fichier dans le répertoire /etc/cron.d/ :

/etc/cron.d/backup_nextcloud
#
# BACKUP NEXTCLOUD RSYNC
#
# m h dom mon dow user command
00 12 * * * nextcloud /bin/bash /home/scripts/backup/backup_nextcloud.sh