Если вы устанавливали себе своё домашнее облако на базе 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"
Следующая статья будет про восстановление из бэкапа. Проверять бэкапы нужно, и лучше только в тестовых условиях.