Создание бэкапов данных сервера в dropbox

Недавно столкнулся с задачей созданием бэкапов данных сервера на моей vps. На ней хостятся разные сайты. Мои личные работают под управлением более-менее вменяемых технологий/движков, так что весь код есть в системе контроля версий. Для таких сайтов нужно только резервное копирование базы данных и загружаемых данных. Некоторые сторонние сайты  работают на wordpress, так что нужно также сохранять исходники. 

Итак, постановка задачи: с некой периодичностью нужно бэкапить базы данных и все содержимое некоторых директорий. Нужно сохранять бэкапы за определенное последнее время для экономии места.

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

Решил использовать для этого dropbox. (Для справки - на сервере Debian)

Но для начала некие приготовления.

Базовая идея: Создадим пользователя (я назвал его backupper), для которого установим dropbox, и создадим директорию для синхронизации.

1. Установка dropbox на сервере.

Надеюсь, на вашей машине уже установлен и настроен dropbox, этот процесс рассматривать не будем, перейдем сразу к установке на сервер.

Для начала создадим отдельного пользователя:

useradd backupper

Логинимся за нового пользователя.

Дальше следуем инструкциям с https://www.dropbox.com/install?os=lnx:

cd ~ && wget -O - "https://www.dropbox.com/download?plat=lnx.x86" | tar xzf -
~/.dropbox-dist/dropboxd

Но сразу скажу, что поступить можно проще: скачать cli-скрипт, как в рекомендациях (его придется скачать в любом случае, для управления демоном dropbox):

wget https://www.dropbox.com/download?dl=packages/dropbox.py -O dropbox.py

Дальше, перемещаем скрипт в /usr/local/bin/dropbox.py, хотя можно положить в home dropbox,  по желании добавив в path необходимую директорию, например так:

mv  dropbox.py ~/local/bin/
chmod u+x ~/bin/dropbox.py

Добавляем в PATH:

nano ~/.bashrc
PATH=$PATH:$HOME/bin

Теперь

dropbox start -i

установит dropbox.

Дальше просто

dropbox start

Можно добавить в автозапуск:

dropbox.py autostart y

2: Бэкап баз данных (mysql).

Для этого был использован mysqldump.

#!/bin/bash

# Config
db_user=root
db_pass=pass
target_dir="/home/backupper/backup/"
dbs=("folkprog" "site1" "site2" "site3")
date_string=`date +%Y-%m-%d-%H-%M`

# DBs backup
for db in "${dbs[@]}"; do
    mysqldump -u"$db_user" -p"$db_pass" "$db" | gzip -c > "${target_dir}${db}_${date_string}.sql.gz"
done

3. Бэкап данных сайта(ов) и конфигов

Для этого будем использовать tar.

#!/bin/bash

# Config
target_dir="/home/backupper/backup/"
folkprog_assets_base_dir="/home/deploy/projects/folkprog.net/web/assets/"
deploy_others_project_dir="/home/deploy-others/projects/"
nginx_config_dir="/etc/nginx/"

# Folkprog files backup
tar -czf "${target_dir}folkprog-files.tar.gz" "${folkprog_assets_base_dir}"

# 3rd-party sites files backup
tar -czf "${target_dir}deploy-others.tar.gz" "$deploy_others_project_dir"

# Nginx config backup
tar -czf "${target_dir}nginx.gz" "$nginx_config_dir"

4. Чистим старые файлы

#!/bin/bash

# Config
target_dir="/home/backupper/backup/"
keep_files_days=60

# Clean old backup files
find "$target_dir" -type f -mtime +"$keep_files_days" -exec rm -f {} \;

5. Пакуем и отправляем файлы в директорию для синхронизации:

#!/bin/bash

# Packing files to Dropbox sync dir
tar -czf "${target_sync_dir}backup_${date_string}.tar.gz" "$target_dir"

Финальная версия скрипта /usr/local/bin/backup, который будем выполнять с-под root-пользователя:

#!/bin/bash

# Config
db_user=root
db_pass=pass
target_dir="/home/backupper/backup/"
target_sync_dir="/home/backupper/Dropbox/"
folkprog_assets_base_dir="/home/deploy/projects/folkprog.net/web/assets/"
deploy_others_project_dir="/home/deploy-others/projects/"
nginx_config_dir="/etc/nginx/"
dbs=("folkprog" "site1" "site2" "site3")
keep_files_days=60
# End Config

date_string=`date +%Y-%m-%d-%H-%M`

# DBs backup
for db in "${dbs[@]}"; do
    mysqldump -u"$db_user" -p"$db_pass" "$db" | gzip -c > "${target_dir}${db}_${date_string}.sql.gz"
done

# Folkprog files backup
tar -czf "${target_dir}folkprog-files.tar.gz" "${folkprog_assets_base_dir}"

# 3rd-party sites files backup
tar -czf "${target_dir}deploy-others.tar.gz" "$deploy_others_project_dir"

# Nginx config backup
tar -czf "${target_dir}nginx.gz" "$nginx_config_dir"

# Clean old backup files
find "$target_dir" -type f -mtime +"$keep_files_days" -exec rm -f {} \;

# Packing files to Dropbox sync dir
tar -czf "${target_sync_dir}backup_${date_string}.tar.gz" "$target_dir"

6. Добавляем cron-задачу.

crontab -u root -e
0 4 * * 4     /usr/local/bin/backup

Каждый четверг в 4 часа ночи будет вызываться скрипт /usr/local/bin/backup.

В принципе, на этом все. Бэкапы будут сами лезть вам в руки.

Для дальнейшего гугления: задачу также можно решить с помощью duplicity