Резервное копирование — одна из ключевых задач для каждого сайта на WordPress. Но если вы хотите обойтись без дополнительных плагинов и при этом иметь надежную систему автоматического создания бэкапов, то этот материал для вас. В статье разберем, как настроить регулярное резервное копирование базы данных и файлов WordPress с помощью встроенного WP-Cron и shell-скриптов на сервере.
Почему стоит отказаться от плагинов резервного копирования
Большинство плагинов для резервного копирования удобны, но часто сильно нагружают сервер, особенно на больших сайтах. Они могут создавать конфликт с другими плагинами, занимать много места и ресурсов. Кроме того, автоматизация через системные инструменты зачастую надежнее и гибче.
Используя собственные скрипты и планировщик задач, вы контролируете процесс без лишних зависимостей, а также можете настроить интеграцию с любыми внешними сервисами хранения данных, например, Amazon S3 или FTP.
Настройка автоматического резервного копирования базы данных WordPress
Первая важная часть бэкапа — это база данных. Для ее сохранения используем команду mysqldump. Предлагаю создать bash-скрипт wpreg_backup_db.sh со следующим содержимым:
#!/bin/bash
# Переменные подключения к базе
DB_NAME="ваше_имя_бд"
DB_USER="ваш_пользователь"
DB_PASS="ваш_пароль"
DB_HOST="localhost"
# Папка для сохранения бэкапов
BACKUP_DIR="/путь/к/папке/backup"
# Имя файла с датой
DATE=$(date +"%Y-%m-%d_%H-%M-%S")
# Создаем резервную копию базы
mysqldump -h $DB_HOST -u $DB_USER -p$DB_PASS $DB_NAME > $BACKUP_DIR/db_backup_$DATE.sql
# Опционально: удаляем бэкапы старше 7 дней
find $BACKUP_DIR -name "db_backup_*.sql" -type f -mtime +7 -exec rm {} \;
После создания скрипта не забудьте выдать ему права на исполнение: chmod +x wpreg_backup_db.sh.
Резервное копирование файлов WordPress
Кроме базы данных, важна и файловая часть: темы, плагины, загрузки и сам WordPress. Для этого можно использовать команду tar:
#!/bin/bash
# Путь к корню WordPress
WP_ROOT="/путь/к/wordpress"
# Папка для бэкапов
BACKUP_DIR="/путь/к/папке/backup"
# Имя архива
DATE=$(date +"%Y-%m-%d_%H-%M-%S")
# Создаем архив
tar -czf $BACKUP_DIR/wp_files_backup_$DATE.tar.gz -C $WP_ROOT .
# Удаляем архивы старше 7 дней
find $BACKUP_DIR -name "wp_files_backup_*.tar.gz" -type f -mtime +7 -exec rm {} \;
Такой архив будет содержать все файлы вашего сайта. Рекомендуется исключить из архива cache или временные папки, если они есть, чтобы не занимать лишнее место.
Интеграция с WP-Cron для запуска резервного копирования
Чтобы запускать скрипты автоматически, можно использовать WP-Cron — внутренний планировщик WordPress. Для этого добавим кастомный хук и функцию в functions.php вашей темы или в отдельном плагине:
function wpreg_schedule_backup() {
if ( ! wp_next_scheduled( 'wpreg_backup_event' ) ) {
wp_schedule_event( time(), 'daily', 'wpreg_backup_event' );
}
}
add_action( 'wp', 'wpreg_schedule_backup' );
add_action( 'wpreg_backup_event', 'wpreg_run_backup_scripts' );
function wpreg_run_backup_scripts() {
$backup_db = '/путь/к/wpreg_backup_db.sh';
$backup_files = '/путь/к/wpreg_backup_files.sh';
if ( file_exists( $backup_db ) ) {
exec( $backup_db );
}
if ( file_exists( $backup_files ) ) {
exec( $backup_files );
}
}
Этот код проверяет, запланировано ли событие резервного копирования, и если нет — добавляет его с интервалом в один день. При срабатывании запускаются скрипты бэкапа.
Настройка интервалов WP-Cron
По умолчанию WP-Cron запускается при посещении сайта, что может быть не очень надежно. Для точного расписания лучше отключить WP-Cron и настроить системный cron на сервере:
# В wp-config.php добавьте
define('DISABLE_WP_CRON', true);
# В crontab добавьте строку
*/30 * * * * wget -q -O - https://ваш-сайт.ru/wp-cron.php?doing_wp_cron >/dev/null 2>&1
Это позволит запускать WP-Cron каждые 30 минут, гарантируя регулярное выполнение задач.
Отправка резервных копий на удаленный сервер или в облако
Созданные файлы резервных копий лучше хранить вне сервера сайта. Для автоматической отправки можно использовать rsync или инструменты для работы с облачными хранилищами.
Пример отправки архива на FTP-сервер:
#!/bin/bash
FTP_HOST="ftp.example.com"
FTP_USER="ftpuser"
FTP_PASS="ftppassword"
BACKUP_DIR="/путь/к/папке/backup"
# Отправляем все новые бэкапы
for file in $BACKUP_DIR/*; do
curl -T "$file" ftp://$FTP_USER:$FTP_PASS@$FTP_HOST/remote_backup_folder/
if [ $? -eq 0 ]; then
echo "Uploaded $file successfully"
else
echo "Failed to upload $file"
fi
done
Этот код можно добавить в отдельный скрипт и запускать после создания резервной копии.
Советы по безопасности и производительности
1. Не храните пароли в скриптах в открытом виде на общедоступных серверах. Используйте защищенные файлы конфигурации или переменные окружения.
2. Ограничьте права доступа к скриптам так, чтобы их могли запускать только нужные пользователи.
3. Настройте уведомления по email при успешном или неудачном создании бэкапа — это можно сделать внутри bash-скриптов через команду mail или отправку сообщения в WordPress.
4. Если ваш хостинг поддерживает, используйте инкрементные бэкапы — они занимают меньше места и работают быстрее.
Альтернативные решения и плагины для резервного копирования
Если в будущем понадобится более простой вариант, обратите внимание на плагины с хорошей репутацией и оптимизацией, например, Clearfy Pro. Он также умеет управлять задачами WP-Cron и оптимизировать работу сайта.
Для визуального контроля процесса можно использовать WP-Cron Manager. Он поможет следить за запланированными событиями и отлаживать задачи.
Итог
Автоматизация резервного копирования WordPress без плагинов — реальная и полезная задача, которая позволит вам контролировать процесс и снизить нагрузку на сайт. Используйте приведенные скрипты, интегрируйте их с WP-Cron и не забывайте о безопасности и регулярном тестировании восстановления данных.