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/appdata_<id>
– 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:

It won’t backup your personal (user) data, but you will be able to restore the entire Nextcloud instance.
Please don’t forget to backup your perosonal (user) data either!

#!/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 -unextcloud -pnextcloud -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)"
tar -cpzf $ARCHIVE_STORE/ncdata_`date +"%w"`.tar.gz -C /var/nc_data/appdata_* .
rm -f $BACKUP_STORE/*.sql
rm -f $BACKUP_STORE/etc/fstab
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/appdata_<id>
– the database: nextcloud.

We demonstrate a restore exemplarily from a Monday backup (_1) what have to be substituted 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.

18 Responses

  1. Stefan says:

    Hi Carsten,

    Ich trage mich mit dem Gedanken, eine NC Neuinstallation mit PostgreSQL zumachen. Kann man den msqldump in PostgreSQL einspielen und wenn ja, wie ist dann die Befehlszeille für ” Restore the database”?

    Stefan

  2. Jens says:

    Hi Carsten,
    thanks for your nice blog and tutorials. Regarding the backup script, to avoid having the username and password hard coded in the script, you can use a .my.cnf file in the home directory of the root user with the following content structure:

    /root/.my.cnf
    [mysql]
    user=nextcloud
    password=nextcloud

    [mysqldump]
    user=nextcloud
    password=nextcloud

    After this is done, we should do a “chmod 600 .my.cnf” and the mysql commands need to be changed to:

    mysqldump –defaults-extra-file=/root/.my.cnf –single-transaction -h localhost 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;”

    the mysql command automatically looks for a “.my.cnf”, so there is no extra parameter needed.
    Of course the username and password is still hard coded, but separated now to a file, which is accessible from the root user only. So the script can also be located outside (like /usr/local/bin) and is not leaking any secrets.

    If someone is using Mysql instead of MariaDB (doesn’t have this command / so incompatible) another possibility would be to create the file with “mysql-config-editor”, which also creates the .my.cnf file, but in an obfuscated way. See https://dev.mysql.com/doc/refman/8.0/en/mysql-config-editor.html

  3. isaac says:

    hello Carsten,

    I seem to be getting this error… when I ran the backup.sh script

    ERROR 1045 (28000): Access denied for user ‘root’@’localhost’ (using password: NO)

    but the .gz files are in their respective directories

    thanks again

  4. 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.

  5. 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.

  6. 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

  7. 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 *