Sauvegarde locale manuelle ou planifiée de Nextcloud

disquette sauvegarde

Avoir son nuage personnel a beaucoup d'avantages. Par contre, contrairement à des solutions commerciales, il n'y a pas de sauvegarde des données.

Si l'installation de Nextcloud ou notre base de données sont corrompus, on perd l'ensemble de notre cloud personnel.

Ce guide a pour intention de montrer :

  • comment faire une sauvegarde locale des fichiers importants de Nextcloud (voire de l'ensemble de Nextcloud) et de la base de données,
  • comment restaurer à partir de cette sauvegarde,
  • comment planifier et automatiser la sauvegarde (scripts à télécharger)

Les recommandations concernant la sauvegarde et la restauration de Nextcloud.

 

Dans son guide de l'administrateur, Nextcloud recommande de sauvegarder les répertoires qui sont propres à chaque utilisateur :

  • le répertoire de configuration (config)
  • le répertoire des données (data)
  • le répertoire des thèmes : themes,

Il faut bien entendu sauvegarder également la base de données. Point important à savoir, outre les fichiers, les contacts et les agendas sont inclus dans la base de données.

 

Concernant la restauration, le guide de l'administrateur de Nextcloud avertit qu'il faut toujours restaurer ensemble le répertoire de données (data) et la base de données qui ont été sauvegardées en même temps.

 

Par ailleurs, certains fichiers contiennent des informations sensibles (dont config.php où est indiqué le mot de passe de la base de données en clair par exemple).

Il est donc préférable de sauvegarder ces éléments en dehors du répertoire de l'utilisateur courant.

J'ai choisi ici de faire la sauvegarde dans un sous-répertoire de /var créé pour l'occasion (nc_backup).

Sauvegarde et restauration manuelles

 

Nous allons voir dans un premier temps comment faire une sauvegarde manuelle de ces éléments pour ensuite les restaurer.

 

Dans cet exemple, le serveur fonctionne avec Raspbian, dérivé de Debian Jessie, Nextcloud est installé dans le répertoire /var/www/nextcloud mais son répertoire de données est situé sur /var/www/data.

L'administrateur de la base de données MariaDB (Mysql) est "adminmyweb", son mot de passe est "password" et le nom de la base de données est "nextcloud".

Les commandes données ici seront à adapter à votre situation. Par convention, ce qui est propre à mon installation de test est en rouge.

 

La sauvegarde manuelle

On se connecte en SSH sur le serveur, ici un Raspberry Pi (on peut bien entendu lancer un terminal depuis le serveur graphique du serveur si on en a installé un) :

$ ssh lambda_user@192.168.0.15

 

On commence par créer le répertoire de sauvegarde :

lambda_user@myweb:~ $ sudo mkdir -p /var/nc_backup

 

On met ensuite nextcloud en mode maintenance car il est important que la base de données ne soit pas modifiée pendant la sauvegarde :

lambda_user@myweb:~ $ cd /var/www/nextcloud

lambda_user@myweb:/var/www/nextcloud $ sudo -u www-data php occ maintenance:mode --on
 Maintenance mode enabled

 

On réalise la sauvegarde des trois répertoires importants :

$ sudo rsync -Avax --delete-after /var/www/nextcloud/themes/ /var/nc_backup/themes/

$ sudo rsync -Avax --delete-after /var/www/nextcloud/config/ /var/nc_backup/config/

$ sudo rsync -Avax --delete-after /var/www/data/ /var/nc_backup/data/

La commande rsync -Avax va copier uniquement les fichiers qui ont changé depuis la sauvegarde précédente si on en a déjà fait une tout en préservant les attributs de fichier et en indiquant sur l'écran les fichiers copiés. L'option --delete-after permet d'effacer sur le répertoire de sauvegarde les anciens fichiers qui n'existent plus sur le serveur.

 

Option : sauvegarder l'ensemble de l'installation nextcloud

$ sudo rsync -Avax --delete-after /var/www/nextcloud/ /var/nc_backup/nextcloud/

$ sudo rsync -Avax --delete-after /var/www/data/ /var/nc_backup/data/

 

On fait ensuite la sauvegarde de la base de données MariaDB (Mysql) :

$ sudo sh -c 'mysqldump -u adminmyweb -ppassword nextcloud > /var/nc_backup/nextcloud-sqlbkp'

 

On peut maintenant sortir nextcloud du mode maintenance :

lambda_user@myweb:/var/www/nextcloud $ sudo -u www-data php occ maintenance:mode --off
 Nextcloud is in maintenance mode - no apps have been loaded
 Maintenance mode disabled

 

Vérifier que la sauvegarde a bien été effectuée :

lambda_user@myweb:/var/www/nextcloud $ ls /var/nc_backup
 config data nextcloud-sqlbkp themes

 

Notre sauvegarde est réalisée. Nous pouvons si nous le souhaitons copier ces fichiers sur une clef USB, par SSH sur un autre ordinateur du réseau, etc.

 

La restauration manuelle

En cas de plantage de la base de données, ou après avoir effacé par mégarde un fichier important de notre cloud, on peut souhaiter faire une restauration.

Dans le cas où c'est l'application Nextcloud qui est entièrement cassée, ces fichiers ne suffisent pas à la réinstaller entièrement. Il faudra refaire l'installation de Nextcloud comme initialement en prenant soin de recréer une base de données avec le même nom, le même utilisateur et le même mot de passe. On termine en restaurant la sauvegarde pour retrouver les données précédentes.

 

Comme pour la procédure de sauvegarde, on commence par mettre Nextcloud en mode maintenance :

lambda_user@myweb:~ $ cd /var/www/nextcloud

lambda_user@myweb:/var/www/nextcloud $ sudo -u www-data php occ maintenance:mode --on
 Maintenance mode enabled

 

Pour restaurer les répertoires, on utilise à nouveau la commande rsync mais en sens inverse (rappel, dans cet exemple le répertoire data est dans /var/www/data et non pas /var/www/nextcloud/data) :

$ sudo rsync -Avax /var/nc_backup/themes/ /var/www/nextcloud/themes/

$ sudo rsync -Avax /var/nc_backup/config/ /var/www/nextcloud/config/

$ sudo rsync -Avax /var/nc_backup/data/ /var/www/data/

 

Option : si on avait choisi de sauvegarder l'ensemble de l'installation Nextcloud :

$ sudo rsync -Avax /var/nc_backup/nextcloud/ /var/www/nextcloud/

$ sudo rsync -Avax /var/nc_backup/data/ /var/www/data/

 

Pour la restauration de la base de données, il faut déjà effacer et recréer l'ancienne :

$ mysql -u adminmyweb -ppassword -e "DROP DATABASE nextcloud"

$ mysql -u adminmyweb -ppassword -e "CREATE DATABASE nextcloud"

 

On récupère maintenant les données contenues dans la sauvegarde de la base :

$ mysql -u adminmyweb -ppassword nextcloud < /var/nc_backup/nextcloud-sqlbkp

 

On termine en retirant le mode maintenance :

lambda_user@myweb:/var/www/nextcloud $ sudo -u www-data php occ maintenance:mode --off
 Nextcloud is in maintenance mode - no apps have been loaded
 Maintenance mode disabled

 

Restauration terminée, nous avons retrouvé toutes les données et la configuration de Nextcloud datant de notre sauvegarde.

Planifier et automatiser la sauvegarde

 

Faire une sauvegarde manuelle, c'est bien, mais il faut y penser et se souvenir des commandes à réaliser.

Je vous propose donc un script de sauvegarde qui peut être recopié et associé à un tâche planifiée (cron) qui sera lancée une fois par jour.

Nous allons également introduire une amélioration supplémentaire en gardant les dernières sauvegardes de la base de données et du répertoire data sur 7 jours. Le script créera un sous-répertoire par jour de sauvegarde.

Le script crée le répertoire de sauvegarde s'il n'existe pas encore.

Il faudra prendre garde à avoir assez d'espace disque pour conserver ces 7 sauvegardes.

 

Le script de sauvegarde

 

#!/bin/bash

# SAUVEGARDE DE NEXTCLOUD

SHELL=/bin/bash

#ENSEMBLE DES VARIABLES PERSONNALISEES AVANT DE LANCER LE SCRIPT

# MODIFIER LES INSTRUCTIONS EN ROUGE SELON VOTRE INSTALLATION !!!
 #répertoire nextcloud
 DIRNC="/var/www/nextcloud"
 #répertoire data
 DIRDT="/var/www/data"
 #répertoire de sauvegarde
 DIRBC="/var/nc_backup"
 #nom base de données nextcloud
 BDDNC="nextcloud"
 #propriétaire base de données nextcloud
 USERNC="adminmyweb"
 #mot de passe de la base de données nextcloud
 PWDNC="password"

# NE PLUS RIEN MODIFIER SOUS CETTE LIGNE !!!


# Créer si besoin les répertoires manquants dans le dossier de sauvegarde
 AUJ=$(date +"%F")
 [ ! -d $DIRBC/databdd/${AUJ} ] && mkdir -p ${DIRBC}/databdd/${AUJ}
 [ ! -d $DIRBC/nextcloud.bak/themes ] && mkdir -p ${DIRBC}/nextcloud.bak/themes
 [ ! -d $DIRBC/nextcloud.bak/config ] && mkdir -p ${DIRBC}/nextcloud.bak/config
 #
 # mode maintenance nextcloud on
 cd ${DIRNC}
 sudo -u www-data php occ maintenance:mode --on

# réaliser la sauvegarde
 rsync -Aax --delete-after ${DIRNC}/themes/ ${DIRBC}/nextcloud.bak/themes/
 rsync -Aax --delete-after ${DIRNC}/config/ ${DIRBC}/nextcloud.bak/config/
 rsync -Aax --delete-after ${DIRDT}/ ${DIRBC}/databdd/${AUJ}/data.bak/
 mysqldump -u ${USERNC} -p${PWDNC} $BDDNC > ${DIRBC}/databdd/${AUJ}/nextcloud-sqlbkp

# effacer les sauvegardes de plus de 7 jours (modifier +7 pour garde plus ou moins de 7 jours)
 find ${DIRBC}/databdd/* -maxdepth 0 -type d -mtime +7 -exec -rm -rf {} \;
 # maintenance mode off
 cd ${DIRNC}
 sudo -u www-data php occ maintenance:mode --off

 

Pour l'utiliser, sélectionner et copier le script (ou le télécharger et le dézipper), puis ouvrir un éditeur de texte dans le répertoire /etc/cron.daily (ensemble des commandes qui sont effectuées automatiquement une fois par jour) :

lambda_user@myweb:~ $ sudo nano /etc/cron.daily/sauvenc

 

Coller le texte sélectionné , modifier les données en haut du fichier (en rouge ici) pour que cela corresponde à votre installation et enregistrer (ctrl-o) puis quitter (ctrl-x).

 

Rendre le script uniquement accessible en lecture  à root :

lambda_user@myweb:~ $ sudo chmod 600 /etc/cron.daily/sauvenc

 

Rendre le script exécutable :

lambda_user@myweb:~ $ sudo chmod +x /etc/cron.daily/sauvenc

 

La sauvegarde s'effectuera maintenant tous les jours.

 

Pour lancer immédiatement le script et vérifier qu'il fonctionne :

lambda_user@myweb:~ $ sudo run-parts /etc/cron.daily

 

Pour vérifier que la sauvegarde a été réalisée :

lambda_user@myweb:~ $ ls /var/nc_backup/nextcloud.bak /var/nc_backup/databdd/
/var/nc_backup/databdd/:
2017-02-21

/var/nc_backup/nextcloud.bak:
config themes

 

Nous obtenons un répertoire (2017-02-21) qui contient /data et la base de données et un autre répertoire qui contient /config et /themes. La sauvegarde a dont bien été effectuée.

Le script de restauration

 

Si nécessaire, on peut restaurer "à la main" avec la commande rsync -Aax et mysql -u comme indiqué dans le chapitre Restauration manuelle (en allant chercher chaque répertoire à l'intérieur de la sauvegarde).

 

Pour faciliter, je vous mets un script de restauration ci-dessous qui vous permettra de le faire automatiquement si besoin, tout en vous laissant choisir la date de sauvegarde que vous préférez parmi les 7 conservées.

 

#!/bin/bash

# RESTAURATION DE NEXTCLOUD

# Pour lancer le script =  $ sudo bash restornc

SHELL=/bin/bash

#ENSEMBLE DES VARIABLES PERSONNALISEES AVANT DE LANCER LE SCRIPT
 #
 # MODIFIER LES INSTRUCTIONS EN ROUGE SELON VOTRE INSTALLATION !!!
 #
 #répertoire nextcloud
 DIRNC="/var/www/nextcloud"
 #répertoire data
 DIRDT="/var/www/data"
 #répertoire de sauvegarde
 DIRBC="/var/nc_backup"
 #nom base de données nextcloud
 BDDNC="nextcloud"
 #propriétaire base de données nextcloud
 USERNC="adminmyweb"
 #mot de passe de la base de données nextcloud
 PWDNC="password"
 #
 # NE PLUS RIEN MODIFIER SOUS CETTE LIGNE !!!

# date de sauvegarde à restaurer
 PS3="Choisir la date de sauvegarde de la base de données à restaurer: "

# Montrer la liste des dates possibles
 cd ${DIRBC}/databdd
 DirList=$(find . -maxdepth 1 -type d)

# Montrer un menu et demander l'option choisie
 # si erreur, ne rien sélectionner et quitter
 select DirName in $DirList; do
 if [ -n "$DirName" ]; then
 DAR="${DirName}"


# mode maintenance nextcloud on
 cd ${DIRNC}
 sudo -u www-data php occ maintenance:mode --on

rsync -Aax ${DIRBC}/nextcloud.bak/config/ ${DIRNC}/config/
 rsync -Aax ${DIRBC}/nextcloud.bak/themes/ ${DIRNC}/themes/
 rsync -Aax ${DIRBC}/databdd/${DAR}/data.bak/ ${DIRDT}/

# suppression de l'ancienne et recréation d'une base de données vierge
 mysql -u ${USERNC} -p${PWDNC} -e "DROP DATABASE ${BDDNC}"
 mysql -u ${USERNC} -p${PWDNC} -e "CREATE DATABASE ${BDDNC}"
 # restauration de la dernière sauvegarde de la base de données
 mysql -u ${USERNC} -p${PWDNC} ${BDDNC} < ${DIRBC}/databdd/${DAR}/nextcloud-sqlbkp

# maintenance mode off
 cd ${DIRNC}
 sudo -u www-data php occ maintenance:mode --off
fi
break
done

 

Comme pour le script précédent, sélectionner et copier (ou le télécharger et le dézipper), ouvrir un éditeur de texte :

lambda_user@myweb:~ $ sudo nano restornc

 

Copier, modifier les données en haut du fichier pour qu'elles correspondent à votre installation, enregistrer (ctr-o) et quitter (ctrl-x).

 

Le rendre uniquement consultable par root :

lambda_user@myweb:~ $ sudo chmod 600 restornc

 

Puis le rendre exécutable :

lambda_user@myweb:~ $ sudo chmod +x restornc

 

Pour le lancer si vous avez besoin d'effectuer une restauration :

lambda_user@myweb:~ $ sudo bash restornc

 

Vous êtes maintenant parés à toute éventualité.

 

Un prochain guide expliquera comment faire des sauvegardes planifiées envoyées automatiquement sur un autre ordinateur en SSH.

 

8 Comments

  1. visvic

    Salut,

    Cela faisait un moment que je voulais faire une sauvegarde comme tu l’a fais 😀

    Je dispose d’un serveur chez online.net avec un dedibackup de 100 Go et uniquement accessible par ftp avec un maximum de 1000 fichiers. J’espère que dans ton prochain tuto tu pourrais voir cette partie 🙂

    En tout cas bravo ! celui-ci est très clair. Et je vais découvrir le reste, je t’ai épinglé 😉

    1. SoozX

      Merci visvic.

      J’ai prévu de faire un guide pour les sauvegardes distantes mais là je suis en train de préparer un tuto pour nextcloud sur pi avec archlinux-arm au lieu de raspbian. Et ça me prend un peu plus de temps que prévu…

      Pour ta configuration dedibackup, il y a ce tuto sur Fièvres qui pourrait t’intéresser :
      http://fievres.2038.net/2014/03/14/tutoriel-sauvegardes-regulieres-machines-distantes-machine-backup-ssh-mysqldump-tar/

      1. visvic

        Hello, merci pour ta réponse, mais, …ouch… il est peu hard quand même le tuto. Mais je vais regarder cela de plus prêt et puis si ‘arrive a un truc potable je te transmet mon idée tu pourra l’améliorer a tes besoins de tutos 🙂

        A plus tard, bonne soirée.

  2. BaltoOo

    Salut Soozx,
    après vérification du script et des sauvegardes automatiques, je m’aperçois que j’ai 14 back up disponibles.
    Apparemment, il ne supprime pas les Backup de plus de 7 jours.

    1. SoozX

      Bonjour BaltoOo,

      Je n’ai pas trop d’idées d’où peut venir le problème.

      Dans le script de sauvegarde, c’est la ligne :
      find ${DIRBC}/databdd/* -maxdepth 0 -type d -mtime +7 -exec -rm -rf {} \;
      qui effectue la suppression en fonction de la dernière date de modification (-mtime +7).

      Pour vérifier, va dans le répertoire de sauvegarde (/var/nc_backup/databdd) et fais la commande :
      $ sudo find . -maxdepth 1 -mtime +7
      pour voir s’il repère les répertoires plus vieux de 7 jours.
      Pour connaître la date de modification des répertoires (voir si l’erreur vient de là),
      $ ls -l

      Sinon, tu peux essayer de remplacer la ligne dans le script par :
      ls -tr1dQ ${DIRBC}/databdd/* | head -n -7 | xargs rm -rf
      qui va trier les fichiers par date et garder les 7 plus récents.
      (Je vais vraisemblablement modifier le script en ce sens, cela évite de se retrouver sans sauvegarde si le Pi n’a pas fonctionné pendant une semaine).

    1. SoozX

      Bonjour,

      Dans ce cas, le plus simple est de mettre le script de sauvegarde dans root (plutôt que dans /etc/cron.daily) :
      $ sudo nano /sauvenc.sh
      (recopier dans la fenêtre le script de sauvegarde et enregistrer)

      Et d’éditer la table des tâches cron en tant que root :
      $ sudo crontab -e
      et de rajouter une ligne :
      0 3 * * * /sauvenc.sh

      Pour vérifier que la tâche planifiée a bien été enregistrée :
      $ sudo crontab -l

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *