Создание бэкапов данных сервера в 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