FreeBSD. Бэкап файлов в облачное хранилище (Google Drive)
Раньше, в одной из заметок, я описывал настройку локального бэкапа файлов на сервере с помощью rsync. Но локальный бэкап хорошо, но хотелось и удаленный. Можно, конечно, при наличии нескольких доступных серверов организовать через тот же rsync, но хотелось сделать это в облако, более того в облако надежное (я таковым считаю Google Drive). Плюсы Google Drive:
- 15Гб места на аккаунт бесплатно.
- Аккаунтов можно завести любое необходимое множество.
- При необходимости место расширяется до 100Гб всего за $1.99 в месяц или же 1Тб за $9.99 в месяц и т.д..
- Исключительная надежность.
- Быстрый и простой доступ из любого места (как с помощью специального ПО, так и через браузер).
Немного забегая вперед, скажу, что закачивание в облако большого количества мелких файлов не оправдало себя, потому было принято решение закачивать архивом. Для архивирования была выбрана утилита из портов fsbackup (/usr/ports/sysutils/fsbackup). Преимущества:
- Есть в портах.
- Создает "архив из частей" - т.е. создает один большой архив, а затем нужное количество раз (устанавливается в настройках) создает маленькие архивы только из измененных файлов.
Создание архива локально.
Итак, устанавливаем fsbackup из портов:
# cd /usr/ports/sysutils/fsbackup
# make install clean
В установке нет ничего интересного. Собственно бэкап запускается скриптом /usr/local/fsbackup/create_backup.sh, в котором можно задать альтернативные конфигурационные файлы и еще некоторые настройки (об этом позже). Пример моего конфигурационного файла:
# vim /usr/local/fsbackup/my_cfg
# Имя бэкапа (используется как часть имени файла)
$cfg_backup_name = "dl_sm_ua";
# Директория, где программа хранит свой кэш
$cfg_cache_dir = "/usr/local/fsbackup/cache";
$prog_md5sum = "md5sum -b";
$prog_tar = "/usr/bin/tar";
$prog_ssh = "/usr/bin/ssh";
$prog_rm = "/bin/rm";
$prog_gzip = "/usr/bin/gzip";
$prog_pgp = "";
$cfg_checksum = "timesize";
$cfg_backup_style = "backup";
# Количество "итераций добавления", на 7-й (при таком конфиге) раз программа снова сделает полный бэкап в большой архив.
$cfg_increment_level = 6;
$cfg_save_old_backup = 0;
$cfg_type = "local";
# Путь к директории, где будут хранится архивы
$cfg_local_path = "/var/backups/daily";
$cfg_time_limit = 0;
$cfg_size_limit = 0;
$cfg_maximum_archive_size = 0;
$cfg_root_path = "/";
$cfg_verbose = 2;
$cfg_stopdir_prune=0;
1;
__DATA__
# Далее перечисляем директории, которые хотим архивировать, с их собственными настройками
# Директория, где хранятся файлы сайтов
/usr/home/www
# Не архивировать директории с логами
=!/usr/home/www/.*/logs/
# Не архивировать core файлы
f!\.core$
f!^core$
# Не архивировать cache директории
d!cache
# Дальше по такому же принципу другие, необходимые директории
/etc
f!\.core$
f!^core$
f!\.o$
f!\.log$
/usr/local/etc
f!\.core$
f!^core$
f!\.o$
f!\.log$
Я захотел добавлять в архив еще и базы данных mysql (предварительно за архивированные с помощью mysql_backup и хранящиеся у меня в директориях по дате см. rsync и локальный бэкап сайтов на сервере), поэтому скопировал скрипт запуска /usr/local/fsbackup/create_backup.sh в /usr/local/fsbackup/create_backup_my.sh и немного подредактировал. После описания конфигураций добавил такой блок:
#############################################################################
cd $backup_path
# Сегодняшняя дата в нужном формате
is_now=`date +"%Y%m%d"`
# Копируем "базовый" файл конфигурации (выше) в новый
/bin/cp my_cfg my_cfg_now
# Добавляем в новый файл нужные строки для архивирования mysql
echo "/var/backups/mysql/${is_now}" >> my_cfg_now
echo "f!\.core$" >> my_cfg_now
echo "f!^core$" >> my_cfg_now
echo "f!\.o$" >> my_cfg_now
echo "f!\.log$" >> my_cfg_now
#Задаем скрипту наш новый конфигурационный файл для работы
config_files="my_cfg_now"
Таким образом после запуска скрипта /usr/local/fsbackup/create_backup_my.sh мы получаем архив нужных директорий в нужном месте. Примерно так:
# cd /var/backups/daily
# ls -lA
total 6884940
-rw-r--r-- 1 root wheel 7023364147 5 січ 03:19 dl_sm_ua-2015.01.05.03.10.11-0.tar.gz
-rw-r--r-- 1 root wheel 0 5 січ 03:10 dl_sm_ua-2015.01.05.03.10.11.del
-rw-r--r-- 1 root wheel 1978993 5 січ 03:10 dl_sm_ua-2015.01.05.03.10.11.dir
-rw-r--r-- 1 root wheel 10551296 5 січ 03:10 dl_sm_ua-2015.01.05.03.10.11.hash
-rw-r--r-- 1 root wheel 5969597 5 січ 03:10 dl_sm_ua-2015.01.05.03.10.11.list
-rw-r--r-- 1 root wheel 6323106 5 січ 03:10 dl_sm_ua-2015.01.05.03.10.11.lsize
Теперь, имея локальную директорию с нужными архивами, нам нужно синхронизировать ее с облаком.
Синхронизация архива с облачным хранилищем (Google Drive).
Будем считать, что аккаунт Google уже заведен, для использования хранилища. Для FreeBSD есть замечательная утилитка grive в портах для синхронизации заданной директории с Google Drive хранилищем. Устанавливаем ее из портов (/usr/ports/net/grive2). Переходим в нужную директорию и запускаем первый раз с ключом "-a":
# cd /var/backups/daily
# grive -a
Видим приблизительно такой ответ:
-----------------------
Please go to this URL and get an authentication code:
https://accounts.google.com/o/oauth3/auth?scope=XXXXXXXXXXXXXXXXXXXXXXXX...
-----------------------
Please input the authentication code here:
Нужно скопировать длинную ссылку, открыть ее в браузере, авторизоваться под нужным Google аккаунтом и получить код, который и ввести в консоли сервера. После чего в директории появится файл .grive и утилита готова к синхронизации.
Настройка ежедневной синхронизации с облачным хранилищем.
Я создал скрипт:
# vim /usr/local/etc/periodic/daily/500.sync_arch.sh
# Fsbackup
echo "do FSBACKUP archive"
# Запускаем fsbackup с нашими настройками
/usr/local/fsbackup/create_backup_my.sh -local
echo "FSBACKUP ended."
# Sync to Gogle Drive
echo "SYNC TO GOOGLE DRIVE"
# Переходим в директорию с архивами и запускаем grive
cd /var/backups/daily/
/usr/local/bin/grive
echo "============== Sync ended ================================"
Теперь (не забываем дать права на запуск для пользователя root на этот файл) наш архив будет ежедневно синхронизироваться с хранилищем.
Очистка корзины Google диска.
Возникает одна проблемка. Google Drive никогда не удаляет файлы окончательно, а складывает их в "корзину". При этом "корзина" тоже занимает место, таким образом место в хранилище достаточно быстро заканчивается. Но тут тоже есть решение. Нужно пройти по ссылке https://sites.google.com/site/indoscru/emptytrash-2-0, авторизоваться под своим аккаунтом и настроить периодичность очистки корзины Google диска.