Скрипты бэкапа файлов из Linux в облачные хранилища

Не так давно, мы размещали статью о подключении популярных бесплатных облачных хранилищ на сервере с CentOS 7 . В этой статье мы покажем, как можно использовать данные хранилища для резервного копирования данных с вашего сервера. Я использую эти скрипты для дополнительного резервного копирования файлов сайта и базы данных со своего Linux VPS сервера.

Backup данных на OneDrive изLinux CentOS

Мы будем выполнять резервное копирование сайта и базы данных, а также выполнять проверку на «возраст» бэкапа (удалять бэкапы недельной давности) и отправлять на почту отчет с полной информацией выполнения скрипта. Собственно, сам bash скрипт:

#!/bin/bash
#Копируем файлы сайта во временную директорию
rsync -avzr --progress /var/www/html/ /var/www/tmp/backup/ >> result.txt
#Выполняем дамп базы, помещаем файл дампа во временную директорию
mysqldump joomla > /var/www/tmp/backup/backup.sql
#Создаем архив временной директории
tar -cvzf backup-$(date +%y%m%d).tar.gz --absolute-names /var/www/tmp/backup/ >> result.txt
#Проверяем директорию облака на наличие старых бэкапов, если таковые есть, удаляем
find /root/OneDrive/backup/ -name "backup*.tar.gz" -mtime +7 -exec rm -f {} ; >> result.txt
#Копируем созданный ранее архив в облако
rsync -avzr --progress /root/bin/backup*.tar.gz /root/OneDrive/backup/ >> result.txt
#Удаляем архив с директории скрипта
rm -rf /root/bin/backup*.tar.gz >> result.txt
#Выполняем синхронизацию с облаком с флагом —local-first, что позволит удалить старые бэкапы с облака, если мы их удаляли локально и закачать новые бэкапы
onedrive --local-first --synchronize >> result.txt
#Отправляем письмо с вложенным файлом, где отображен весь процесс резервного копирования (замените на свой ящик)
echo "Посмотрите файл на наличие ошибок и исправьте их" | mail -a "/root/bin/result.txt" -s "Резервная копия создана" -- ******@gmail.com
#Чистим директории от ненужных файлов
rm -rf /root/bin/result.txt && rm -rf /var/www/tmp/backup/*

Предварительно перед написанием статьи, я создал уже несколько бэкапов, чтобы можно было продемонстрировать, что скрипт работает корректно (удаляет старые бэкапы и закачивает новые).

Я запустил 3 раза вручную. Были созданы несколько резервных копий, после чего они все успешно были отправлены в облако:

ls -la /root/OneDrive/backup/

total 28260_x000D_drwxr-xr-x 2 root root 102 Sep 3 17:02 ._x000D_drwxr-xr-x 5 root root 94 Sep 3 11:15 .._x000D_-rw-r--r-- 1 root root 9643081 Sep 3 17:00 backup-1909031700.tar.gz_x000D_-rw-r--r-- 1 root root 9643082 Sep 3 17:01 backup-1909031701.tar.gz_x000D_-rw-r--r-- 1 root root 9643083 Sep 3 17:02 backup-1909031702.tar.gz_x000D_Initializing the Synchronization Engine ..._x000D_Syncing changes from local path first before downloading changes from OneDrive ..._x000D_ Deleting item from OneDrive: backup/backup-1909031700.tar.gz_x000D_Deleting item from OneDrive: backup/backup-1909031701.tar.gz_x000D_Deleting item from OneDrive: backup/backup-1909031702.tar.gz_x000D_Uploading new file ./backup/backup-1909031704.tar.gz ..._x000D_Uploading 100% |oooooooooooooooooooooooooooooooooooooooo| DONE IN 00:00:04_x000D_done._x000D_Processing 6 changes

Проверяем облако, все три архива с резервными копиями здесь:

one drive backup

Следующим шагом, я удалил созданные резервные копии с директории на сервере и снова запустил скрипт. Вывод содержимого директории на сервере:

ls -la /root/OneDrive/backup/

total 9420_x000D_drwxr-xr-x 2 root root 38 Sep 3 17:04 ._x000D_drwxr-xr-x 5 root root 94 Sep 3 11:15 .._x000D_-rw-r--r-- 1 root root 9643082 Sep 3 17:04 backup-1909031704.tar.gz_x000D_

Пройдя в веб-интерфейс OneDrive я увидел, что резервные копии удалили и оттуда, автоматически.

скрипт бэкапа сайта из linux на OneDrive

Так же после выполнения скрипта, мне пришло письмо на почту:

отчет о бэкапе на email Вот и все, на этом резервное копирование на OneDrive окончено.

Резервное копирования на Google Диск.

С резервным копированием в Google Диск в се вышло не так просто как с OneDrive, хотя сама настройка довольно простая. Основная проблема возникла с удалением старых бэкапов с Google Drive, так как на сервер не монтируется директория хранилища. Но после долгого изучения справки drive help, удалось модернизировать наш уже ранее используемый скрипт.

#!/bin/bash
#удаляем файлы которые старше 7дней с g.drive
/usr/sbin/drive list -q "modifiedDate < '$(date -d '-7 day' '+%Y-%m-%d')'" | cut -d" " -f1 - | xargs -L 1 drive delete -i
rsync -avzr --progress /var/www/html/ /var/www/tmp/backup/ >> result.txt
mysqldump joomla > /var/www/tmp/backup/backup.sql
tar -cvzf backup-$(date +%Y%m%d).tar.gz --absolute-names /var/www/tmp/backup/ >> result.txt
#закачиваем файл на g.drive
/usr/sbin/drive upload -f /root/bin/backup*.tar.gz >> result.txt
rm -rf /root/bin/backup*.tar.gz >> result.txt
echo "Посмотрите файл на наличие ошибок и исправьте их" | mail -a "/root/bin/result.txt" -s "Резервная копия создана" -- ******@gmail.com
rm -rf /root/bin/result.txt
rm -rf /var/www/tmp/backup/*

Остальные шаги в скрипте я не расписывал, так как они повторяются с предыдущими.

Запустив скрипт, он выполнился:

sh backup_gdrive.sh

Removed file 'DSC_2151.NEF'_x000D_Removed file 'DSC_2153.NEF'_x000D_Removed file 'DSC_2159.NEF'_x000D_Removed file 'DSC_2226.NEF'_x000D_Removed file 'DSC_2225.NEF'
Проверим наличие файла в Google Drive:_x000D__x000D_drive list
Id Title Size Created_x000D_1oay3-FAWBZRjHtma1cRTLrOvf3t8hRpD backup-20190904.tar.gz 9.6 MB 2019-09-04 14:43:25

С веб-интерфейса его так же видно, как и с консоли:

linux - Резервное копирование на Google Диск

Таким образом мы получаем скрипт, который выполняет проверку на наличие старых бэкапов в облаке Google Диск, удаляет их если они попадают под требования, после чего создает резервную копию сайта и отправляет ее в это же облако.

Скрипт бекапа на Яндекс.Диск из Linux

Данное облачное хранилище я оставил на закуску, так как резервное копирование в Яндекс.Диск является самым простым, т.к. мы смонтировали облачное хранилище Яндекс через WebDav как отдельное дисковое утсройство . Способ все тот же, мы запускаем скрипт, только лишь с небольшой разницей, не нужно делать синхронизацию или заливку файлов специальными командами, работаем как с обычным серверным каталогом. Синхронизация каталога выполняется с помощью rsync . Скрипт будет иметь вид:

#!/bin/bash
rsync -avzr --progress /var/www/html/ /var/www/tmp/backup/ >> result.txt
mysqldump joomla > /var/www/tmp/backup/backup.sql
tar -cvzf backup-$(date +%Y%m%d).tar.gz --absolute-names /var/www/tmp/backup/ >> result.txt
find /mnt/yad/ -name "backup*.tar.gz" -mtime +7 -exec rm -f {} ; >> result.txt
rsync -avzr --progress /root/bin/backup*.tar.gz /mnt/yad/ >> result.txt
rm -rf /root/bin/backup*.tar.gz >> result.txt
echo "Посмотрите файл на наличие ошибок и исправьте их" | mail -a "/root/bin/result.txt" -s "Резервная копия создана" -- ****@gmail.com
rm -rf /root/bin/result.txt
rm -rf /var/www/tmp/backup/*

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

В конце статьи хотелось бы добавить. Я разместил указанные скрипты в отдельную директорию и запускают их по крону. Если дисковое пространство на ваших облачных дисках позволяет часто создавать бэкапы, создавайте их как можно чаще, я рекомендую не реже одного раза в 3 дня. Используйте ресурсы облачных хранилищ на все 100%.

Примеры заданий в кроне:

0 0 * * 6 /root/bin/backup.sh — запускаем скрипт бэкапа каждую субботу в 00-00
0 0 */3 * * /root/bin/backup.sh — запускаем скрипт бэкапа каждые 3 дня в 00-00

И так далее, настройте бэкапы как вам удобно, когда нагрузка на сервере минимальна.

EnglishRussianUkrainian