Если вы не понимаете важность резервного копирования, значит еще не теряли данные. Не расстраивайтесь, всё впереди! Даже самые надежные ЦОДы выгорают до тла когда в них ударяет молния.
В этой статье я покажу как настроить автоматическое сохранение резервной копии сайта в облако Яндекс.Диска. На момент написания статьи, Яндекс за регистрацию бесплатно предоставлял 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. Желаю вам надежных серверов и никогда не терять данные, ну а если подобное случится, то всегда иметь бэкап из которого можно восстановиться!
Напишите в комментариях:
- На сколько большой ваш проект и какой тип хостинга используете?
- Делаете ли вы резервные копии и какие для этого программы используете?
- Как восстанавливаетесь после сбоев?