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