Bup backup для сайтов

На сервере со множеством сайтов очень часто возникает вопрос, как это все хозяйство адекватно бэкапить. Особенно остро вопрос встает при наличии множества картинок или какого-то достаточно объемного контента. На просторах интернета было найдено вполне элегантное решение на основе git, и называется это чудо bup backup. О том как его настроить и как им пользоваться я и расскажу в этой статье.

Установка:

git clone git://github.com/bup/bup
apt-get build-dep bup
cd bup
make
make test
sudo make install

Создаем юзера, от которого будет выполняться бэкап.

groupadd backup_user
useradd -d /home/backup_user -g backup_user backup_user
passwd backup_user
chown -R backup_user:backup_user  /home/backup_user

Если каждый сайт запущен от отдельного юзера, то для копирования необходимо чтобы пользователь, из-под которого идет бэкап (в данном случае backup_user) входил в группу пользователя сайта и у него были права на чтение.

usermod -aG site_user backup_user

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

mkdir /www/backups
chown -R backup_user:backup_user  /www/backups

Теперь логинимся под нашим пользователем, и настраиваем ему каталог для бэкапов. По умолчанию, они лежат в «~/.bup», но нас это не устраивает. Пишем в консоли:

export BUP_DIR=/www/backups

Но, это сохранится ровно до тех пор пока вы не выйдете с сессии или не перезапустите сервак. Поэтому стоит добавить эту строчку в /etc/environment

Далее делаем:

bup init
bup index /path/to/file

Если индексы создаются без ошибок — все норм. Если появляются ошибки типа: Permission Denied — то у пользователя нет прав на чтение этого файла. Решение принимать в каждом случае индивидуальное, либо дать права на чтение, либо игнорировать и не заносить файлы в бэкап.

После этого:

bup save -n nameofbackup /path/to/file

На создание бэкапа потребуется какое-то время.

Еще несколько полезных команд:

bup ls выводит список всех бэкапов
bup ls nameofbackup выводит список бэкапов для данного сайта
bup ls nameofbackup/2014-09-24-064416/var/www/html список файлов, в данном бэкапе

Можно делать бэкапы на удаленном сервере: необходимо, чтобы на удаленном сервере были установлены ваши ключи SSH и BUP.

bup index path/to/dir
bup save -r SERVERNAME:path/to/remote-bup-dir -n backupname path/to/dir

Восстановление последней резервной копии:

bup restore -C /dest backupname/latest

Восстановление на определенную точку:

bup restore -C /dest /backupname/2013-09-29-195827

Восстановление определенного файла из бэкапа:

bup restore -C /dest /backupname/2013-09-29-201328/root/testbup/binfile1.bin

Если восстанавливать от пользователя backup_user, то меняется владелец. Лучше восстанавливать от рута, см. ниже.

Скрипт для бэкапов:

#!/bin/bash
bup index /path/to/site
bup save -n backupname /path/to/site

Для того, чтобы иметь возможность восстановить от рута любой бэкап нужно следующее:

Включить рута в группу бэкапа:

usermod -aG backup_user root

Зайти по рутом, sudo su. Указать каталог с бэкапами, если не добавляли в /etc/environment

export BUP_DIR=/www/backups

Если bup ls Показывает все доступные бэкапы — отлично. Иначе поменять права на группу у backup_user на чтение-запись.

Восстановление из бэкапа:

bup restore -C testbackup/ backup/latest

Можете убедиться что в этом случае будет восстановление с полным сохранением прав, владельцев и групп.