Важная ремарка:
а) способ, описанный ниже для меня наиболее прост и удобен. Возможно, есть другие возможности по резервному копированию. Я пробовал разные варианты. Если с каким-то вариантом backup возникали какие-то проблемы – я просто скипал и шёл дальше. Мне лень было тратить время и разбираться в тонкостях.
б) Скрипты, которые я использую – их придумал не я – только дополнил или переделал немного.
Резервное копирование выделенного или виртуального сервера: Входные данные:
- У нас есть выделенный сервер или виртуальный сервер
- Установлена панель управления Vesta
Если вы только присматриваетесь к выделенному серверу или VPS, рекомендую обратить внимание на следующие компании:
- digitalocean.com – много локаций, виртуальные сервера от 5дол/месяц. Регистрируйтесь по ссылке и получайте 50 долларов бонусом (бонус начислят в течение 30 дней после регистрации).
- atlantic.net (регистрируйтесь по ссылке и получайте сразу $15 в виде бонуса). Из преимуществ – можно поставить Windows. Цены на виртуальные сервера начинаются от 5 долларов США:
Резервное копирование в backblaze
Простое, недорогое и надёжное – именно так можно описать в общем backblaze. Это сервис, предоставляющий услуги хранения файлов.
Сравните цены backblaze и конкурентов: https://www.backblaze.com/best-online-backup-service.html
Просто взгляните сколько я плачу за хранение 300Гб:
Да, всё верно – всего 5 центов в сутки за хранение 300Гб. При этом ежедневно туда заливается резервная копия папок рабочего ПК и несколько виртуальных серверов.
Создайте аккаунт backblaze сейчас ->
Именно в backblaze мы и будем копировать файлы и базы данных. Бекблейз предоставляет доступ к api – если нужно будет сделать что-то совсем нестандартное.
Идеальных сервисов не существует и я сразу оговорюсь, что у backblaze на ноябрь 2019 при использовании их CLI всё не супер гладко. Например, нет (или я не нашёл) банальной опции у команд “пропустить ошибки”.
Настройка резервного копирования сервера
Я буду писать под centos.
1 Устанавливаем pip
yum -y update yum -y install python-pip
2 Настраиваем backblaze
Если у вас нет аккаунта, переходите по ссылке и регистрируйтесь.
Переходим в раздел B2 Cloud Storage и создаём новый bucket:
Теперь нужно добавить New Application Key. Не забудьте указать для этого ключа конкретный бакет “Allow access to Bucket(s)”.
После создания ключа, сохраните два параметра: applicationKeyId и applicationKey. Они нам сейчас понадобятся.
Устанавливаем CLI backblaze на сервер. Заходим в терминал и вводим команды:
sudo easy_install pip sudo pip install "setuptools>=20.2" --ignore-installed sudo pip install --upgrade b2
После этого в терминале вводим:
b2 authorize-account
В ответ на эту команду, будут запрошены ключи. Сперва вводим applicationKeyId, затем applicationKey.
С настройками – это всё. Сейчас всё должно чётко работать, без ошибок.
Резервное копирование баз данных сервера
Я копирую все базы данных на сервере. Если нужно копировать конкретные базы данных или базы данных конкретного пользователя – нужно будет немного поменять скрипт.
Напомню, что у нас установлена vesta в качестве панели управления. Сейчас нам нужно получить пароль root от mysql. Этот пароль можно найти тут:
/usr/local/vesta/conf/mysql.conf
Скрипт для создания резервных копий всех баз данных сервера в отдельных файлах с дальнейшей загрузкой на backblaze:
#!/bin/bash
TIMESTAMP=$(date +"%F")
BACKUP_DIR="/home/dbbackup/$TIMESTAMP"
MYSQL_USER="СЮДА_ВСТАВИТЬ_ИМЯ_ПОЛЬЗОВАТЕЛЯ"
MYSQL_PASSWORD="СЮДА_ВСТАВИТЬ_ПАРОЛЬ"
MYSQL="$(which mysql)"
MYSQLDUMP="$(which mysqldump)"
B2_BUCKET_NAME="СЮДА_ВСТАВИТЬ_НАЗВАНИЕ_ВАШЕГО_BUCKET"
mkdir -p $BACKUP_DIR
find "$BACKUP_DIR" -mtime +3 -type d -exec rm -rf {} \;
databases=$MYSQL -u$MYSQL_USER -p$MYSQL_PASSWORD -e "show databases"| grep -Ev "(database|Database|information_schema|performance_schema|phpmyadmin|mysql)"
for db in $databases; do
$MYSQLDUMP -u $MYSQL_USER -p$MYSQL_PASSWORD -e --opt -c --databases $db | gzip -c > $BACKUP_DIR/$db.gz
b2 upload_file $B2_BUCKET_NAME $BACKUP_DIR/$db.gz $TIMESTAMP/$db.gz
echo "finished uploading $db to b2"
done
Сохраняем файл как, например, backup.sh. Не забываем про атрибуты файла скрипта резервного копирования баз данных:
chmod +x backup.sh
Логика работы скрипта backup баз данных простая:
- сделать дамп базы данных;
- сжать дамп;
- положить в папку на локальном сервере;
- загрузить файл на backblaze.
Скрипт не удаляет ничего. Правильно будет добавить удаление старых файлов. У меня эта “чистка” реализована чуть по-другому, поэтому в скрипте ничего не удаляется.
Создайте аккаунт backblaze сейчас ->
Можете запустить файл и спустя какое-то время на backblaze вы увидите все свои базы данных, красиво сложенные в папку с текущей датой.
Резервное копирование файлов сервера
С резервным копированием файлов всё проще.
Скрипт для копирования всех файлов каталога /home
!/usr/bin/env bash # Example daily cron running script.sh in home directory: # @daily /usr/local/bin/bash ~/script.sh # Threads threads=10 Directories to backup, and the name of their subdirectory in the bucket declare -A dir dir=(["/home/"]="test") #Bucket name bucket=НУЖНО_ВСТАВИТЬ_НАЗВАНИЕ_ВАШЕГО_BUCKET for i in "${!dir[@]}"; do b2 sync --threads "$threads" --excludeRegex '.\/cache.\/' --excludeRegex '.\/logs.\/' --excludeRegex '.\x.\/' --excludeRegex '.\/tmp.\/' "$i" b2://$bucket/"${dir["$i"]}" done
Скрипт использует команду “b2 sync” для синхронизации локальной папки и папки в backblaze. Дополнительно я исключил временные файлы и файлы кеша.
Почему я не делаю полные копии с разбивкой по дням, неделям или месяцам? Я решил не заморачиваться и довериться backblaze. У них есть версии файлов. Поэтому, в любой момент я могу восстановить нужную версию нужного файла.
Создайте аккаунт backblaze сейчас ->
На этом всё. Оба скрипта добавляем в cron и радуемся.
Если у кого-то есть хорошие наработки – пишите в комментариях.