Резервное копирование сайта по расписанию (WordPress)

Настраиваем резервное копирование любимого сайтика. Сайтик расположен на дружественном shared-хостинге (Debian Linux). Но есть нюансы: администратор хостинга ничего не гарантирует. Один раз он просто сменил номер телефона и пропал на месяц. Практически целый месяц сервер был недоступен. Это не коммерческий проект, но, все равно, очень неприятно.
Есть доступ по ssh (sftp, scp) и права запускать программы.
Резервное копирование разделим на 2 этапа: создание копии на удаленном сервере и перенос в безопасное место.

Резервное копирование на удаленном сервере

Данные WordPress разделены на 2 компонента: база (в моем случае MySQL) и файлы, как картинки, так и специальные.

Создание архива, в общем виде команда такая:
$ /usr/bin/zip -v -r /home/user/site.tld.`date +%Y-%m-%dT%H:%M:%S`.zip /home/user/site.tld/htdocs

Дамп базы. Несмотря на то, что пароль и так хранится в явном виде в файле wp-config.php, светить его лишний раз не стоит.
Для запуска mysqldump без пароля создадим файл конфигурации:
$ vim ~/.my.cnf

[mysqldump]
user = mysqluser
password = mysqlpassword

Ставим корректные права на файл
$ chmod 600 ~/.my.cnf

Проверим, что все работает
$ /usr/bin/mysqldump -u mysqluser dbname > /home/user/site.tld.`date +%Y-%m-%dT%H:%M:%S`.sql

Создаем расписание срабатывания команд через crontab (особое внимание на форматирование параметров команды date!)
$ crontab -e

# m h dom mon dow command
0 3 * * 6 /usr/bin/mysqldump -u mysqluser dbname > /home/user/site.tld.`date +\%Y-\%m-\%dT\%H:\%M:\%S`.sql
5 3 * * 6 /usr/bin/zip -r /home/user/sitename.tld.`date +\%Y-\%m-\%dT\%H:\%M:\%S`.zip /home/user/site.tld/htdocs

Еженедельное копирование в субботу в 3:00 и 3:05 соответственно.

Перенос данных с удаленного сервера

Перво-наперво избавимся от необходимости вводить пароль при удаленном подключении по ssh/scp. Когда-то в древности я уже писал как настроить подключение по сертификату.

Забирать файлы будем через rsync + ssh. Порт ssh на удаленной системе нестандартный – 2222. Файлы будем перемещать, а не копировать.

$ rsync -avz --remove-source-files -e "ssh -p 2222" user@remote:site.tld.\* /home/user/backup

1. Wildcard!
2. На удаленной системе так же должен быть установлен rsync. Иначе любые попытки скачать файлы будут заканчиваться вот такой проблемой:
bash: rsync: command not found
rsync: connection unexpectedly closed (0 bytes received so far) [Receiver]
rsync error: remote command not found (code 127) at io.c(226) [Receiver=3.1.1]

Запись в crontab выглядит так:
$ crontab -e

# m h dom mon dow command
30 3 * * 6 /usr/bin/rsync -avz --remove-source-files -e "/usr/bin/ssh -p 2222" user@remote:site.tld.\* /home/user/backup >/dev/null 2>&1

Leave a comment

Your comment