FreeBSD. Бэкап файлов в облачное хранилище (Google Drive)

Раньше, в одной из заметок, я описывал настройку локального бэкапа файлов на сервере с помощью rsync. Но локальный бэкап хорошо, но хотелось и удаленный. Можно, конечно, при наличии нескольких доступных серверов организовать через тот же rsync, но хотелось сделать это в облако, более того в облако надежное (я таковым считаю Google Drive). Плюсы Google Drive:

  1. 15Гб места на аккаунт бесплатно.
  2. Аккаунтов можно завести любое необходимое множество.
  3. При необходимости место расширяется до 100Гб всего за $1.99 в месяц или же 1Тб за $9.99 в месяц и т.д..
  4. Исключительная надежность.
  5. Быстрый и простой доступ из любого места (как с помощью специального ПО, так и через браузер).

Немного забегая вперед, скажу, что закачивание в облако большого количества мелких файлов не оправдало себя, потому было принято решение закачивать архивом. Для архивирования была выбрана утилита из портов fsbackup (/usr/ports/sysutils/fsbackup). Преимущества:

  1. Есть в портах.
  2. Создает "архив из частей" - т.е. создает один  большой архив, а затем нужное количество раз (устанавливается в настройках) создает маленькие архивы только из измененных файлов.  

Создание архива локально.

Итак, устанавливаем 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 диска.