Резервное копирование сервера: простое, недорогое, надёжное

Важная ремарка:
а) способ, описанный ниже для меня наиболее прост и удобен. Возможно, есть другие возможности по резервному копированию. Я пробовал разные варианты. Если с каким-то вариантом backup возникали какие-то проблемы – я просто скипал и шёл дальше. Мне лень было тратить время и разбираться в тонкостях.
б) Скрипты, которые я использую – их придумал не я – только дополнил или переделал немного.

Резервное копирование выделенного или виртуального сервера: Входные данные:

  • У нас есть выделенный сервер или виртуальный сервер
  • Установлена панель управления Vesta

Если вы только присматриваетесь к выделенному серверу или VPS, рекомендую обратить внимание на следующие компании:

  1. digitalocean.com – много локаций, виртуальные сервера от 5дол/месяц. Регистрируйтесь по ссылке и получайте 50 долларов бонусом (бонус начислят в течение 30 дней после регистрации).
  2. atlantic.net (регистрируйтесь по ссылке и получайте сразу $15 в виде бонуса). Из преимуществ – можно поставить Windows. Цены на виртуальные сервера начинаются от 5 долларов США:
    цены atlantic на виртуальные сервера

Резервное копирование в backblaze

Простое, недорогое и надёжное – именно так можно описать в общем backblaze. Это сервис, предоставляющий услуги хранения файлов.

Сравните цены backblaze и конкурентов: https://www.backblaze.com/best-online-backup-service.html

Просто взгляните сколько я плачу за хранение 300Гб:

всего 5 центов в сутки за хранение 300Гб на backblaze

Да, всё верно – всего 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:

Создаём новый bucket в сервисе backblaze

Теперь нужно добавить New Application Key. Не забудьте указать для этого ключа конкретный бакет “Allow access to Bucket(s)”.

Добавляем новый New Application Key в backblaze

После создания ключа, сохраните два параметра: 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 вы увидите все свои базы данных, красиво сложенные в папку с текущей датой.

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 и радуемся.

Если у кого-то есть хорошие наработки – пишите в комментариях.