Резервное копирование Nextcloud

Если вы устанавливали себе своё домашнее облако на базе Nextcloud, то должны понимать, что иногда надо делать резервное копирование своих данных (а если это данные предприятия, то делать их резервные копии надо регулярно). Вот про регулярность и поговорим.

Наилучшая схема резервного копирования производится по методу 3-2-1: три резервные копии в двух разных местах, одна из них на ином носителе. Суровая правда жизни говорит нам, что денег нет, но вы храните бэкапы в надёжном месте, например рядом с основными данными :). Надеюсь до такого доходит мало у кого, и в вашем распоряжении есть хотя бы два жёстких диска.

В моём случае пусть будут две машины: одна — это собственно сам Nextcloud, а вторая — это сервер резервного копирования. Если у вас есть только два HDD, то скрипты нужно будет немножко изменить, потому что здесь используются команды удалённого восстановления по ssh.

Итак, приступим.

Информация бралась с сайта https://www.c-rieger.de и немного изменялась под мои хотелки. Также спасибо автору сайта https://decatec.de и его скрипту на гитхабе за идеи. Vielen Dank für Ihre Eingabe.

Для полного резервного копирования Nextcloud нужны три его составляющие:

  • папка самого сервера (та, которую можно скачать с nextcloud.com
  • база данных
  • и сами данные

Основной алгоритм бэкапа такой:

  • Переходим в режим технического обслуживания
  • Копируем собственно сами данные (копируются так, чтобы занимать меньше места)
  • Копируем данные сервера
  • Копируем базу данных
  • Выходим из режима технического обслуживания

Вот скрипт для резервного копирования и забора данных с сервера бэкапа. Актуальная версия лежит на гитхабе.

Основные примечания:

  • база данных — mysql или mariadb
  • не забывайте менять переменные под себя
  • укажите IP-адрес сервера Nextcloud
  • для доступа к серверу Nextcloud нужны root права и подключение без ввода пароля (если не хотите вводить пароль каждый раз и сделать бэкап не автоматизируемым). Как это сделать — смотрите здесь.
#!/bin/bash

#variables

# Source directory for store tar and sql
ncServerTempDir="$HOME/"
# Main directory
BackupMainDir="$HOME/nextcloud_backup"
# Current date
DATE=`date +"%Y%m%d-%H%M%S"`
# Your web server user
webServerUser="www-data"
# The directory of your Nextcloud installation
ncServerDir="/usr/share/nginx/nextcloud/"
# The directory of your Nextcloud data
ncServerData="/usr/share/nginx/nextcloud-data/"
# Your Nextcloud database name
dbName="nextcloud"
# Your Nextcloud database user
dbUser="nextclouduser"
# The password of the Nextcloud database user
dbPass="your-password"
# Location of your Nextcloud data folder backup
ncDataFolderBackup="${BackupMainDir}/nc_data"
# Location of your Nextcloud database backup
ncDbFolderBackup="${BackupMainDir}/nc_db"
# Location of your Nextcloud installation folder backup
ncServerBackupDir="${BackupMainDir}/nc_server"
# Your Nextcloud server address
ncServer="root@2.2.2.2"

# Functions

EnableMaintenanceMode () {
    echo "Set maintenance mode for Nextcloud..."
    ssh ${ncServer} "sudo -u ${webServerUser} php ${ncServerDir}/occ maintenance:mode --on"
    echo "Done"
    echo
}
DisableMaintenanceMode () {
    echo "Switching off maintenance mode..."
    ssh ${ncServer} "sudo -u ${webServerUser} php ${ncServerDir}/occ maintenance:mode --off"
    echo "Done"
    echo
}
backup_server ()
{
    echo "Backing up webfolder"
    sleep 1
    if [[ ! -e ${ncServerBackupDir} ]]; then mkdir -p ${ncServerBackupDir}; fi
    ssh ${ncServer} "tar -cpzf ${ncServerTempDir}/nc_server_${DATE}.tar.gz -C ${ncServerDir} ."
    scp -p ${ncServer}:${ncServerTempDir}/nc_server_${DATE}.tar.gz ${ncServerBackupDir}/
    sleep 1
    ssh ${ncServer} "rm -f ${ncServerTempDir}/nc_server_${DATE}.tar.gz"
    echo "Backup webfolder is done"
    sleep 3
}

backup_data ()
{
    echo "Backing up data folder"
    sleep 3
    if [[ ! -e "${ncDataFolderBackup}/Latest" ]]; then
        mkdir -p ${ncDataFolderBackup}/Latest
    fi
    rsync -axv --delete --link-dest=${ncDataFolderBackup}/Latest ${ncServer}:${ncServerData} ${ncDataFolderBackup}/Processing-${DATE}
    sleep 1
    mv ${ncDataFolderBackup}/Processing-${DATE} ${ncDataFolderBackup}/${DATE} && \
    rm -rf ${ncDataFolderBackup}/Latest && ln -sr ${ncDataFolderBackup}/${DATE} ${ncDataFolderBackup}/Latest
    echo "Backup data folder is done"
    sleep 1
}

backup_db ()
{
    echo "Backing up database"
    sleep 1
    ssh ${ncServer} "if [[ ! -e ${ncServerTempDir} ]]; then mkdir -p ${ncServerTempDir}; fi"
    ssh ${ncServer} "mysqldump --single-transaction -h localhost -u${dbUser} -p${dbPass} ${dbName} > ${ncServerTempDir}/nc_db_${DATE}.sql"
    if [[ ! -e ${ncDbFolderBackup} ]]; 
        then mkdir -p ${ncDbFolderBackup};
    fi
    scp ${ncServer}:${ncServerTempDir}/nc_db_${DATE}.sql ${ncDbFolderBackup}/nc_db_${DATE}.sql
    echo "Backup database is done"
    sleep 1
    ssh ${ncServer} "rm -r ${ncServerTempDir}/nc_db_${DATE}.sql"
}

# Main
# Check for root
if [ "$(id -u)" != "0" ]
    then
    echo "ERROR: This script has to be run as root!" 1>&2
    exit 1
fi

EnableMaintenanceMode
backup_data
backup_server
backup_db
DisableMaintenanceMode
echo "All done"

Следующая статья будет про восстановление из бэкапа. Проверять бэкапы нужно, и лучше только в тестовых условиях.

Добавить комментарий

Ваш e-mail не будет опубликован.