Резервная копия на том же сервере, где работает сайт, защищает только от ошибок в файлах. Если пропадёт сам сервер, пропадут и копии. Поэтому архивы лучше отправлять во внешнее хранилище. Покажу, как это сделать с помощью консольного клиента Яндекс Диска. Для примера использую VPS на Hetzner с Ubuntu.
Установка клиента
Яндекс выпускает официальный клиент для Linux. Подключаем репозиторий и ставим пакет:
curl -fsSL http://repo.yandex.ru/yandex-disk/YANDEX-DISK-KEY.GPG | sudo gpg --dearmor -o /usr/share/keyrings/yandex-disk.gpg echo "deb [signed-by=/usr/share/keyrings/yandex-disk.gpg] http://repo.yandex.ru/yandex-disk/deb/ stable main" | sudo tee /etc/apt/sources.list.d/yandex-disk.list sudo apt update sudo apt install yandex-disk
Команда apt-key, которая встречается в старых инструкциях, в новых версиях Ubuntu устарела, поэтому ключ кладём в отдельный файл.
Авторизация
Запускаем мастер настройки:
yandex-disk setup
Клиент покажет код и ссылку. Открываем её в браузере на своём компьютере, входим в аккаунт Яндекса и подтверждаем доступ.
Дальше мастер спросит, в какую папку синхронизировать диск, запускать ли клиент автоматически и нужен ли прокси.
Скрипт резервного копирования
Создаём скрипт, который делает дамп базы, архивирует файлы сайта и кладёт всё в папку Яндекс Диска:
#!/bin/bash set -e DATE=$(date +%F) DST=/root/Yandex.Disk/backup mkdir -p "$DST" mysqldump --single-transaction wordpress | gzip > "$DST/db-$DATE.sql.gz" tar -czf "$DST/site-$DATE.tar.gz" -C /var/www example.ru find "$DST" -type f -mtime +14 -delete yandex-disk start >/dev/null 2>&1 || true yandex-disk sync
Последние строки на всякий случай запускают демон, если он не стартовал, и принудительно синхронизируют папку. Архивы старше 14 дней удаляются, чтобы не переполнить диск.
Делаем скрипт исполняемым:
chmod +x /root/backup.sh
Расписание в cron
crontab -e
30 3 * * * /root/backup.sh >> /var/log/backup.log 2>&1
Копия будет создаваться каждую ночь в 3:30. Составить другое расписание поможет генератор crontab.
Что проверить
- Объём свободного места на Яндекс Диске: бесплатные 5 ГБ быстро заканчиваются.
- Что архив действительно восстанавливается. Хотя бы раз разверните его на тестовом сервере.
- Что локальная папка синхронизации не съедает место на VPS. Если диск маленький, используйте выборочную синхронизацию (
yandex-disk --exclude-dirs).
Подробнее о стратегии бэкапов я писал в заметке о бэкапе в стиле DevOps.