#!/bin/bash ################################################################################### # Nextcloud Backups as incremental mode, using rdiff-backup # # 1. Backup database and send to remote backups server throught rsync using # ssh public/private key configuration. # 2. Set X days to preserve db backups # 3. Backup data folder of nextcloud using rdiff-backup (https://rdiff-backup.net/) # 4. Set X days to preserve rdiff-backups increments # 5. Get report statistics of rdiff-backup and send push message throught gotify # self-hosted server (https://gotify.net/). # # Tools needed: mysqldump, gzip. rsync, rdiff-backup, curl # TODO: save current version 'sudo -u www-data php /var/www/html/nextcloud/occ config:system:get version' ################################################################################### PATH=$PATH:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin # variables push notifications readonly GOTIFY_TOKEN="" readonly GOTIFY_HOST="" readonly GOTIFY_PRIORITY=5 # backup db variables readonly BACKUP_DB_FILE="nextcloud-sqlbkp-"`date +\%Y\%m\%d`".sql" readonly DB_HOST="" readonly DB_USER="" readonly DB_PASS="" readonly DB_NAME="" # backup data variables readonly NEXTCLOUD_DATA="" readonly NEXTCLOUD_DIR="" readonly INCLUDE_LIST="include-list" # remote settings readonly REMOTE_SERVER="" # TODO: Use $(hostname) "/path/to/example/"`hostname`"/nextcloud" readonly REMOTE_PATH="" readonly REMOTE_NC_DATA_FOLDER="files" readonly REMOTE_NC_DB_FOLDER="db" readonly REMOTE_NC_DIR_FOLDER="dir" readonly BACKUP_PRESERVE_DAYS=60 # create include list file and set exclude logs touch $INCLUDE_LIST cat > $INCLUDE_LIST < $BACKUP_DB_FILE gzip $BACKUP_DB_FILE # TODO: force create multiple paths (mkdir -p) if not exist with rsync trick # https://www.schwertly.com/2013/07/forcing-rsync-to-create-a-remote-path-using-rsync-path/ rsync -AaxzPh --remove-source-files "$BACKUP_DB_FILE.gz" "$REMOTE_SERVER:$REMOTE_PATH/$REMOTE_NC_DB_FOLDER" # clear X days old remote db backups ssh $REMOTE_SERVER 'bash -s' << EOF find "$REMOTE_PATH/$REMOTE_NC_DB_FOLDER" -maxdepth 1 -mtime +$BACKUP_PRESERVE_DAYS -print -exec "rm" -R {} \; EOF # rdiff-backup all dir of nextcloud rdiff-backup backup $NEXTCLOUD_DIR "$REMOTE_SERVER::$REMOTE_PATH/$REMOTE_NC_DIR_FOLDER" # clear X days old increments of backup dir rdiff-backup remove increments --older-than "${BACKUP_PRESERVE_DAYS}D" "$REMOTE_SERVER::$REMOTE_PATH/$REMOTE_NC_DIR_FOLDER" # rdiff-backup all data of nextcloud OUT=$(rdiff-backup backup --print-statistics --include-globbing-filelist $INCLUDE_LIST $NEXTCLOUD_DATA \ "$REMOTE_SERVER::$REMOTE_PATH/$REMOTE_NC_DATA_FOLDER") # set output lines into array and append notification message readarray -t stats <<<"$OUT" for val in "${stats[@]}"; do line=$(echo $val | tr -d '-') MESSAGE="${MESSAGE} $line \r" done # clear X days old increments of backup data rdiff-backup remove increments --older-than "${BACKUP_PRESERVE_DAYS}D" \ "$REMOTE_SERVER::$REMOTE_PATH/$REMOTE_NC_DATA_FOLDER" MESSAGE="${MESSAGE} Backup task end: **"`date +"%d/%m/%Y %H:%M:%S"`"** \r" rm $INCLUDE_LIST # send gotify notification TITLE="NC $(hostname) Backup" EXTRAS="{\"client::display\": {\"contentType\": \"text/markdown\"}}" curl -X POST "$GOTIFY_HOST/message?token=$GOTIFY_TOKEN" -H "accept: application/json" -H "Content-Type: application/json" \ -d "{ \"message\": \"${MESSAGE}\", \"priority\": ${GOTIFY_PRIORITY}, \"title\": \"${TITLE}\", \"extras\": ${EXTRAS} }"