Nextcloud est devenu la plateforme de référence pour héberger soi-même son cloud de fichiers, d'agenda et de contacts. Mais un Nextcloud auto-hébergé n'est protégé que par les sauvegardes que vous mettez en place vous-même. Cet article explique comment sauvegarder une instance Nextcloud complète — fichiers et base de données — vers votre espace Bonjour Backup.
Deux besoins à ne pas confondre
Étendre le stockage de Nextcloud avec un bucket S3 (via l'application « External Storage ») et sauvegarder une instance Nextcloud existante sont deux choses différentes. Cet article traite de la sauvegarde : mettre une copie de secours de votre Nextcloud (tel qu'il est aujourd'hui) sur un stockage externe, indépendant du serveur qui l'héberge.
Ce qu'il faut sauvegarder
Une instance Nextcloud repose sur trois éléments, à sauvegarder ensemble pour qu'une restauration soit cohérente :
- Le dossier data : les fichiers de vos utilisateurs (souvent
/var/www/nextcloud/dataou un chemin équivalent selon votre installation). - La base de données (MySQL/MariaDB ou PostgreSQL) qui contient les métadonnées, utilisateurs et paramètres.
- Le dossier config (
config/config.php), qui contient la configuration de votre instance.
1. Passer Nextcloud en mode maintenance
Pour garantir une sauvegarde cohérente, il est recommandé de bloquer temporairement les écritures pendant la sauvegarde :
sudo -u www-data php occ maintenance:mode --on
2. Exporter la base de données
Pour MySQL/MariaDB :
mysqldump --single-transaction -u nextcloud_user -p nextcloud_db > /chemin/de/sauvegarde/nextcloud-db.sql
Pour PostgreSQL :
pg_dump -U nextcloud_user nextcloud_db > /chemin/de/sauvegarde/nextcloud-db.sql
3. Réactiver Nextcloud
sudo -u www-data php occ maintenance:mode --off
Le mode maintenance ne doit rester actif que le temps de l'export de la base de données, pas pendant tout le transfert vers S3.
4. Envoyer le tout vers votre bucket S3
Utilisez rclone (déjà configuré avec un remote bonjourbackup) pour envoyer le dump SQL, le dossier config et le dossier data :
DATE=$(date +%Y-%m-%d)
rclone copy /chemin/de/sauvegarde/nextcloud-db.sql \
bonjourbackup:mon-bucket/nextcloud/$DATE/
rclone copy /var/www/nextcloud/config \
bonjourbackup:mon-bucket/nextcloud/$DATE/config
rclone sync /var/www/nextcloud/data \
bonjourbackup:mon-bucket/nextcloud/data --update
Le dossier data étant généralement volumineux, on utilise sync --update pour ne transférer que les fichiers nouveaux ou modifiés depuis la dernière sauvegarde, tandis que la base de données et la configuration sont archivées par date pour garder plusieurs points de restauration.
5. Regrouper les étapes dans un script
#!/bin/bash
set -e
DATE=$(date +%Y-%m-%d)
BACKUP_DIR=/tmp/nextcloud-backup
mkdir -p "$BACKUP_DIR"
sudo -u www-data php /var/www/nextcloud/occ maintenance:mode --on
mysqldump --single-transaction -u nextcloud_user -p'MOT_DE_PASSE' nextcloud_db \
> "$BACKUP_DIR/nextcloud-db.sql"
sudo -u www-data php /var/www/nextcloud/occ maintenance:mode --off
rclone copy "$BACKUP_DIR/nextcloud-db.sql" bonjourbackup:mon-bucket/nextcloud/$DATE/
rclone copy /var/www/nextcloud/config bonjourbackup:mon-bucket/nextcloud/$DATE/config
rclone sync /var/www/nextcloud/data bonjourbackup:mon-bucket/nextcloud/data --update
rm -rf "$BACKUP_DIR"
Planifiez ce script via cron pour une exécution quotidienne, en dehors des heures d'utilisation de votre Nextcloud :
0 3 * * * /chemin/vers/backup-nextcloud.sh >> /var/log/backup-nextcloud.log 2>&1
Sécurisez le mot de passe de votre script
Évitez de laisser un mot de passe en clair dans un script accessible à d'autres utilisateurs du serveur. Préférez un fichier ~/.my.cnf protégé (chmod 600) pour vos identifiants MySQL, ou un gestionnaire de secrets si votre infrastructure en dispose.
N'oubliez pas de tester une restauration complète sur un environnement de test au moins une fois, comme le rappelle notre article sur la règle 3-2-1 : une sauvegarde qui n'a jamais été restaurée reste une inconnue.