Nextcloud backup and restore


Backup Nextcloud

Ensure to have regulary backups from _0 (Sunday) to _6 (Saturday)  of your Nextcloud, including at least:
– the webfolder: /var/www/nextcloud
– the datafolder: /var/nc_data
– and the database: nextcloud.

Please substitute ubuntuusername and the database password nextcloud with yours. Switch into sudo mode:

sudo -s

1. Turn maintenance mode on:

sudo -u www-data php /var/www/nextcloud/occ maintenance:mode --on

2. Backup the webfolder:

tar -cpzf /home/ubuntuusername/ncserver_`date +"%w"`.tar.gz -C /var/www/nextcloud .

3. Backup the datafolder:

tar -cpzf /home/ubuntuusername/ncdata_`date +"%w"`.tar.gz -C /var/nc_data .

4. Backup the database:

mysqldump --single-transaction -h localhost -unextcloud -pnextcloud nextcloud > /home/ubuntuusername/ncdb_`date +"%w"`.sql

5. Turn maintenance mode off:

sudo -u www-data php /var/www/nextcloud/occ maintenance:mode --off

Done.

6. A simple backup example (backup.sh) based on an Ubuntu OS:

#!/bin/bash
sudo -u www-data php /var/www/nextcloud/occ maintenance:mode --on
BACKUP_STORE=/backup_work
ARCHIVE_STORE=/backups
CURRENT_TIME_FORMAT="%w"
echo "START: $(date)"
FOLDERS_TO_BACKUP=(
"/root/"
"/etc/fail2ban/"
"/etc/letsencrypt/"
"/etc/mysql/"
"/etc/nginx/"
"/etc/php/"
"/etc/ssh/"
"/etc/pam.d/"
"/etc/ssl/"
"/var/www/"
)
ARCHIVE_FILE="$ARCHIVE_STORE/ncserver_$(date +$CURRENT_TIME_FORMAT).tar.gz"
cd $BACKUP_STORE
for FOLDER in ${FOLDERS_TO_BACKUP[@]}
do
if [ -d "$FOLDER" ];
then
echo "Copying $FOLDER..."
rsync -AaRx --delete $FOLDER $BACKUP_STORE
else
echo "Skipping $FOLDER (since it does not exist)"
fi
done
cp /etc/fstab $BACKUP_STORE/etc/
mysqldump --single-transaction -h localhost -unextcloud -pnextcloud nextcloud > $BACKUP_STORE/ncdb_`date +"%w"`.sql
mysql -e "SELECT table_schema 'DB',round(sum(data_length+index_length)/1024/1024,4) 'Size (MB)' from information_schema.tables group by table_schema;"
mkdir -p $(dirname $ARCHIVE_FILE)
tar -cpzf $ARCHIVE_FILE .
echo "Serverbackup size: $(stat --printf='%s' $ARCHIVE_FILE | numfmt --to=iec)"
rm $BACKUP_STORE/*.sql
tar -cpzf $ARCHIVE_STORE/ncdata_`date +"%w"`.tar.gz -C /var/nc_data .
echo "Databackup size: $(stat --printf='%s' $ARCHIVE_STORE/ncdata_`date +"%w"`.tar.gz | numfmt --to=iec)"
sudo -u www-data php /var/www/nextcloud/occ maintenance:mode --off
echo "END: $(date)"
exit 0


Restore Nextcloud

A restore of your Nextcloud even consists of
– the webfolder: /var/www/nextcloud
– the datafolder: /var/nc_data
– the database: nextcloud.

We demonstrate a restore exemplarily from a Monday backup (_1) what have to be ammended properly. Switch into sudo mode:

sudo -s

1. Turn maintenance mode on:

sudo -u www-data php /var/www/nextcloud/occ maintenance:mode --on

2. Stop services:

/usr/sbin/service nginx stop
/usr/sbin/service php7.2-fpm stop

3. Delete the old directories:

rm -r /var/www/nextcloud/
rm -r /var/nc_data/

4. Create the directories new again:

mkdir -p /var/www/nextcloud/
mkdir -p /var/nc_data/
tar -xpzf /home/ubuntuusername/ncserver_1.tar.gz -C /var/www/nextcloud/
tar -xpzf /home/ubuntuusername/ncdata_1.tar.gz -C /var/nc_data/

5. Apply the permissions:

chown -R www-data:www-data /var/nc_data /var/www

6. Restore the database:

– Delete the old database

mysql -h localhost -uroot -pnextcloud -e "DROP DATABASE nextcloud"

– Create an empty one

mysql -h localhost -uroot -pnextcloud -e "CREATE DATABASE nextcloud CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci"

– Grant access

mysql -h localhost -uroot -pnextcloud -e "GRANT ALL PRIVILEGES on nextcloud.* to nextcloud@localhost"

– Restore the database

mysql -h localhost -unextcloud -pnextcloud nextcloud < /home/ubuntuusername/ncdb_1.sql

7. Restart services:

/usr/sbin/service php7.2-fpm start
/usr/sbin/service nginx start

8. Fingerprint:

After restoring a backup of your data directory or the database, you should always call maintenance:data-fingerprint once. This changes the ETag for all files in the communication with sync clients, allowing them to realize a file was modified.

sudo -u www-data php /var/www/nextcloud/occ maintenance:data-fingerprint

9. Turn maintenance mode off:

sudo -u www-data php /var/www/nextcloud/occ maintenance:mode --off

Done.



Carsten Rieger

Carsten Rieger

Carsten Rieger is a senior system engineer in full-time and also working as an IT freelancer. He is working with linux environments for more than 13 years, an Open Source enthusiast and highly motivated on linux installation and troubleshooting. Mostly working with Debian/Ubuntu Linux, Nginx and Apache web server, MariaDB/MySQL/PostgreSQL, PHP, Cloud infrastructure (e.g. Nextcloud) and other open source projects (e.g. Roundcube) and in voluntary work for the Dr. Michael & Angela Jacobi Stiftung for more than 6 years.

9 Responses

  1. Marcus says:

    Hi Carsten,
    first I want to thank you for all of your tutorials/blog posts. Those tutorials help me a lot.

    Regarding the backup-Script I have an “issue” with it. I have to backup a Nextcloud instance with about 70 GB and a lot of Image-Files.
    I Tried to do the backup via a similar solution like your solution, but it took hours creating a zip/tar.

    The plan is with rsync transfer the nextcloud-data and database to a NAS (reachable in the network). This might take too long too.

    Do you know a solution which might be faster? I thought of running the nextcloud server as a vm/docker image and “just” backup the vm image.

    Thanks a lot for your support and help.

    • Quentin says:

      Hello !
      I have the same situation. Backup works like a charm when you have 2Gb of datas, but now that I have 50Gb, it tooks me literally 5hours..
      5 hours without my server up is already too much and I plan to have much more datas..

      What did you do to solve this issue ?

  2. tito says:

    Hi, nice tutorial
    But when I tried to make a DATABASE backup.. shows this error:

    mysqldump: Got error: 1045: “Access denied for user ‘nextcloud’@’localhost’ (using password: YES)” when trying to connect

    Do you know what is the problem? Or how can I solve it?

    • How did you try to perform the db-backup? Please call mysql -unextcloud -p -hlocalhost. Are you able to connect to your databse server?

    • tito says:

      no matter, I resolved. Thank anyway.
      There some way the backup and crontab works together?. what would be the script? for example: every week. Nice tutorial and very profesional. thanks.

  3. Sebastien says:

    Hello,
    can you tell me what is the difference between backup_store and archive_store please?
    Thanks

    • Hi Sebastien,
      “BACKUP_STORE” is the working directory for rsync to sync all folders configured “FOLDERS_TO_BACKUP”
      “ARCHIVE_STORE” is the directory where the backups will be stored to: “/home/ubuntuusername/backup_dir”
      It is just an example, feel free to consolidate or simplify the backup script to your need. Cheers, Carsten

  4. Alfred says:

    Hi! Is it possible to use this manual to migrate an ARM based instance of Nextcloud /Odroid C2/ to a new x86 server? Thanks!

Leave a Reply

Your email address will not be published. Required fields are marked *