Ежедневные шифрованные бекапы вашей БД в облаке

Сегодня я расскажу о том, как можно настроить бекапы вашей базы данных в облако, что позволит избежать головной боли даже после полной потери контроля над сервером.

Так получилось, что первоначальный пост был потерям вследствие случайного нажатия на кнопку “Назад” в браузере. Поэтому этот будет еще короче, чем планировался :) Итак, бекапы я начал делать еще до того, как жизнь меня успела этому научить. Однако я все больше и больше убеждаюсь, что к этому вопросу нужно подходить максимально серьезно, если ваши данные вам важны. Сегодня мы рассматрим, как делать бекапы базы PostgreSQL и ротировать их, шифровать и отправлять в облако. В качестве облака я буду использовать Яндекс.Диск, так как он работает по WebDav и даем возможность отправлять файлы через CURL.

Сразу к делу. Создаем скрипт для бекапов.

sudo vi /usr/bin/backup
#!/bin/sh

DATE=`date +%Y%m%d%H%M%S`
SERVER_NAME=`uname -n`
BACKUP_DIR=$1
DB_NAME=$2
DB_USER=$3
YANDEX_LOGIN=$4
YANDEX_PASSWORD=$5
BACKUP_MASK="${BACKUP_DIR}/${SERVER_NAME}__${DB_NAME}"
BACKUP_PATH="${BACKUP_MASK}__${DATE}.sql.gpg"
SYMLINK_PATH="${BACKUP_MASK}.sql.gpg"

pg_dump -h localhost -U $DB_USER -d $DB_NAME | gpg -c -z 5 --batch --passphrase "$SERVER_NAME" > $BACKUP_PATH

ln -sf $BACKUP_PATH $SYMLINK_PATH

curl --user "$YANDEX_LOGIN:$YANDEX_PASSWORD" -T $SYMLINK_PATH https://webdav.yandex.ru/backup/

ls -trQ1 ${BACKUP_MASK}__* | head -n -3 | xargs rm -f

И делаем его исполняемым.

sudo chmod +x /usr/bin/backup

Далее создаем папку для хранения наших бекапов.

mkdir -p /home/deploy/.backup

Также создаем файл доступов для PostgreSQL.

vi /home/deploy/.pgpass
localhost:5432:db_name:db_user:db_password

Добавляем вызов нашего скрипта до расписанию.

crontab -e
0 */8 * * * /usr/bin/backup /home/deploy/.backup db_name db_user yandex_login yandex_password

Собственно, все! Таким образом, каждые 8 часов будет запускаться наш скрипт, который сначала делает новый бекап и шифрует его, затем отправляет последний бекап к облако и удаляет старые бекапы, оставляя только последние.

Самые неприятные вещи случаются, когда вы их совершенно не ждете, поэтому, если вы еще не делаете бекапы, настоятельно рекомендую начать хотя бы с бекапов вашей базы данных. Причем, важно хранить их на отдельном сервере. Приведу простой пример, почему. Как-то один из моих дроплетов был заблокирован. Чтобы сделать бекап базы мне пришлось сначала восстановить пароль пользователя root, так как я всегда использовал ssh-ключи. После этого мне нужно было сделать бекапы базы и запросить у саппорта монтирование recovery-образа, который позволил снова открыть 22 порт и получить доступ к серверу извне, чтобы слить эти самые бекапы. За счет того, что каждый раз мне приходилось ждать ответа от саппорта (тут еще разность в часовых поясах сыграла свою роль) на все у меня ушло больше 24 часов. Поэтому, товарищи, делайте бекапы, храните их в надежном месте и спите спокойно.