Бэкапим данные своего pet-project

У меня есть несколько пет проектов на одной VDS. Все они настроены почти так же как этот блог(через докер). И сегодня я хотел бы с вами поговорить об обязательном инструменте, о бэкапе.

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

Что нужно бэкапить и как часто?

Бэкапить нужно все 🙂 Как часто, зависит от проекта, давайте разбираться.

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

Бэкапим базу

У меня MYSQL, так что примеры будут на ней, но в целом подход вообще не отличается, могут быть отличия в командах, и это отличие легко гуглится.

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

Создаем пользователя для бэкапа

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

CREATE USER 'backup_user'@'%' IDENTIFIED BY ')@JB]XT;9zV^u*wHfE[4';

И наделяем его правами чтения нужной нам базки

GRANT SELECT, LOCK TABLES ON my_db.* TO 'backup_user'@'localhost';

Обратите внимание какой сложный пароль я подобрал. Естественно это фейковый(не мой реальный) пароль.

В линуксе есть команда для генерации паролей, для удобства можно воспользоваться ей

pwgen -s -y -n 20

Что бы нам в дальнейшем было проще, давайте сохраним логин и пароль пользователя в env переменные. Для этого создадим файл

mkdir -p ~/backups/
vim ~/backups/env.sh
export DATABASE_USER='backup_user'
export DATABASE_PSSWORD=')@JB]XT;9zV^u*wHfE[4'

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

Когда пользователь готов, пробуем подключиться и сделать бэкап

Для начала посмотрим на названия контейнеров

docker ps

В моем случае это tabotaru-db-1

Теперь можно выполнить команду

# переходим в папку с бэкапами
cd ~/backups
# Устанавливаем env переменные
source env.sh 
# выгружаем бэкап
docker exec tabotaru-db-1 mysqldump -u $DATABASE_USER -p$DATABASE_PSSWORD my_db > my_db_dump.sql

Теперь стоит проверить что в файл что то записалось. Я обычно проверяю так

# смотрю на размер файла
ls -la ~/backups/my_db_dump.sql

# или можно посмотреть контент
tail ~/backups/my_db_dump.sql

Здесь очень важно убедиться что то то пишется. В идеале попробовать загрузить дамп в к какую тосозданную именно для теста базу и проверить что все хорошо отработает. Я обычно использую дам что бы поднять себе локальную версию для разработки.

И так, мы теперь умеем бэкапить базку, давайте оформим все в виде скрипт

#!/bin/sh
### устанавливаем переменные ###
BACKUP=/root/backups/mysql
GZIP="$(which gzip)"

# загружаем env переменнвые
source /root/backups/env.sh

## Формируем название папки по дню ###
NOW=$(date +%Y%m%d)

### Создаем папку куда будет загржужаться бэкап ###
mkdir -p $BACKUP/$NOW

### создаю папку для проекта ###
mkdir -p $BACKUP/$NOW/tabota
## у меня там несколько проектов, можно делать это в цикле, но что бы не усложнять, пусть будет так

FILE=$BACKUP/$NOW/
### Собственно создаем бэкап ###
echo $i; docker exec tabotaru-db-1 mysqldump -u $DATABASE_USER -p$DATABASE_PSSWORD my_db $i | $GZIP -9 > $FILE/my_db/my_db.gz

### Удаляем 6 последних ###
ls -t $BACKUP/ | sed -e '1,6d' | xargs rm -rf

Что бы проверить а правильно ли собрался бэкап, можно разорхивировать его и протестировать

#Разахфивируем
gzip -d file.gz

Ну и последнее что нужно сделать, это настроить автоматический запуск скрипта раз в какой то период.

Редактируем конфигурацию крона

crontab -e

0 0 */1 * * bash /root/backups/backup.sh

Я поставил в 12 часов ночи каждый день

Теперь нужно не забыть про один очень хитрый момент, если бэкапы хранятся на той же тачке что и сайты, то надежность таких бэкапов минимальна. И нужно настроить автоматический забор данных бэкапов на другую машину. Об этом я напишу в следующей статье, всем удачи. Если есть вопросы пишите!