Rclone: автоматический бэкап сайта в облако на примере Яндекс.Диска

Если вы не понимаете важность резервного копирования, значит еще не теряли данные. Не расстраивайтесь, всё впереди! Даже самые надежные ЦОДы выгорают до тла когда в них ударяет молния.

В этой статье я покажу как настроить автоматическое сохранение резервной копии сайта в облако Яндекс.Диска. На момент написания статьи, Яндекс за регистрацию бесплатно предоставлял 10ГБ доступного места, если этого мало, то в любой момент можно докупить еще.

Предполагается что сайт расположен на виртуальном сервере (VPS) под управлением операционной системы Linux. У Яндекс.Диска есть официальный консольный клиент для Linux, но он, как мне показалось, работает нестабильно. Поэтому мы будем использовать более универсальное решение под названием rclone.

Rclone — это программа для синхронизации файлов и каталогов, которая работает с большим количеством облачных хранилищ, в том числе и с Яндекс.Диском.

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

Установка

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

Чтобы получить access_token Яндекс.Диска нужен компьютер с установленным браузером. Для этого мы установим rclone на своем локальном компьютере. Перейдите на страницу загрузки, скачайте rclone под свою операционную систему и распакуйте скачанный архив с исполняемым файлом, позже мы к нему вернемся.

Соединяемся с удаленным сервером по SSH, который будем бэкапить. В моем случае это операционная система Ubuntu 18.04 с установленными PHP + MySQL + Nginx. Далее все команды выполняем на нем.

Установка и настройка консольного клиента rclone на удаленном сервере

Устанавливаем rclone на удаленном сервере:

curl https://rclone.org/install.sh | sudo bash

Запускаем мастер настройки конфигурации rclone config:

rclone config

No remotes found - make a new one
n) New remote
s) Set configuration password
q) Quit config
n/s/q> n

name> yadisk # Придумываем имя

Type of storage to configure.
Choose a number from below, or type in your own value
 1 / Alias for a existing remote
   \ "alias"
 2 / Amazon Drive
   \ "amazon cloud drive"

 ...

23 / Yandex Disk
   \ "yandex"
24 / http Connection
   \ "http"
Storage> 23 # Выбираем Yandex Disk

Yandex Client Id - leave blank normally.
client_id> # Оставляем пустым

Yandex Client Secret - leave blank normally.
client_secret> # Оставляем пустым

Remote config
Use auto config?
 * Say Y if not sure
 * Say N if you are working on a remote or headless machine
y) Yes
n) No
y/n> n

For this to work, you will need rclone available on a machine that has a web browser available.
Execute the following on your machine:
	rclone authorize "yandex"
Then paste the result below:
result> # Здесь необходимо вставить данные с компьютера

Не разрывайте SSH-соединение с сервером. Откройте новое окно оболочки командной строки на локальном компьютере. Перейдите в папку с распакованным файлом rclon и выполните команду:

rclone authorize "yandex"

If your browser doesn't open automatically go to the following link: http://127.0.0.1:53682/auth
Log in and authorize rclone for access
Waiting for code...

Откройте в браузере http://127.0.0.1:53682/auth если этого не произошло автоматически.

На специальной странице Яндекса разрешите доступ к Яндекс.Диску приложению rclone, нажав на кнопку Allow.

После этого снова возвращаемся в оболочку командной строки и копируем Ctrl+Shift+C появившийся json объект:

...
Got code
Paste the following into your remote machine --->
{"access_token":"AQAAAA...hlXXPE","token_type":"bearer","refresh_token":"1:jIvyMr...cn589PQyfw","expiry":"2019-08-07T12:37:22.149859353+06:00"}

Вставляем Ctrl+Shift+V скопированный json объект в консоли удаленного сервера:

...
Then paste the result below:
result> 
{"access_token":"AQAAAA...hlXXPE","token_type":"bearer","refresh_token":"1:jIvyMr...cn589PQyfw","expiry":"2019-08-07T12:37:22.149859353+06:00"}

--------------------
[yadisk]
type = yandex
client_id = 
client_secret = 
token = {"access_token":"AQAAAA...hlXXPE","token_type":"bearer","refresh_token":"1:jIvyMr...cn589PQyfw","expiry":"2019-08-07T12:37:22.149859353+06:00"}
--------------------
y) Yes this is OK
e) Edit this remote
d) Delete this remote
y/e/d> y

Current remotes:

Name                 Type
====                 ====
yadisk               yandex

e) Edit existing remote
n) New remote
d) Delete remote
r) Rename remote
c) Copy remote
s) Set configuration password
q) Quit config
e/n/d/r/c/s/q> q

На этом настройка завершена. Для проверки посмотрим содержимое Яндекс.Диска. Данная команда выведет список всех файлов и папок:

rclone ls yadisk:

Настройка синхронизации данных с Яндекс.Диском

Создайте файл /home/manager/backup.sh в домашнем каталоге пользователя (в моем случае это manager) со следующим содержимым:

#!/usr/bin/env bash

ROOT_PATH=$(cd $(dirname $0) && pwd)

LOG_FILE=$ROOT_PATH/backup.log

DB_DATABASE=appdb
DB_USERNAME=dbuser
DB_PASSWORD=secret

SRC=/var/www/app
DEST=yadisk:/backup

if pidof -o %PPID -x `basename "$0"` > /dev/null; then
    echo "$(date "+%d.%m.%Y %T") EXIT: The script is already running." | tee -a "$LOG_FILE"
    exit 1
fi

echo "$(date "+%d.%m.%Y %T") INFO: Start" | tee -a "$LOG_FILE"

mysqldump -u$DB_USERNAME -p$DB_PASSWORD $DB_DATABASE > $SRC/dump.sql

rclone sync $SRC $DEST \
    --delete-excluded \
    --exclude "vendor/**" \
    --exclude "logs/**" \
    --log-file "$LOG_FILE"

echo "$(date "+%d.%m.%Y %T") INFO: End" | tee -a "$LOG_FILE"

echo "" | tee -a "$LOG_FILE"

Измените значения переменных:

  • DB_DATABASE — название базы данных
  • DB_USERNAME — пользователь базы данных
  • DB_PASSWORD — пароль пользователя базы данных
  • SRC — корневой каталог с сайтом
  • DEST — каталог в облачном хранилище. Корневой путь yadisk:/

Во время запуска скрипта команда mysqldump создаст дамп базы данных dump.sql в корневом каталоге сайта SRC. После этого команда rclone sync изменит каталог в облачном хранилище DEST таким образом, чтобы он был идентичным с корневым каталогом сайта SRC. Потом скрипт обо всем этом напишет в лог backup.log, который положит рядом с собой. Если данный скрипт вас чем-то не устраивает, измените его под себя.

Разрешаем запускать скрипт на выполнение:

chmod +x /home/manager/backup.sh

Добавляем задание в планировщик cron:

crontab -e

Вставляем следующую запись, которая будет каждый день в 00:00 выполнять скрипт backup.sh:

0 0 * * * /home/manager/backup.sh >/dev/null 2>&1

Что дальше?

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

  • Периодически просматривайте лог резервного копирования. Во время синхронизации может произойти сбой.
  • Скидывайте бэкап с Яндекс.Диска на другой носитель, например: HDD или облако Google Drive
  • Обязательно проверяйте бэкап, нет никакого толка если он поврежден. Для этого можно использовать Vagrant.

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

Напишите в комментариях:

  • На сколько большой ваш проект и какой тип хостинга используете?
  • Делаете ли вы резервные копии и какие для этого программы используете?
  • Как восстанавливаетесь после сбоев?
Евгений Прокопьев
Евгений Прокопьев
Привет! Меня зовут Евгений Прокопьев. Я разрабатываю сложные web-приложения для бизнеса. В своей работе использую: PHP, Python, JavaScript, SQL, HTML, CSS и много сопутствующих технологий.

Рассылка от программиста

Подпишись и получай полезные материалы