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

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

Сейф с копиями данных и три копии на сервере, диске и в облаке

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

Коротко

Что получится

  • Схема 3-2-1: копия на сервере и копия у другого провайдера
  • Ночной скрипт: база, файлы и удаление копий старше 14 дней
  • Проверенное восстановление и ваше реальное время отката

Что понадобится

  • Сайт на своём сервере и права root
  • S3-совместимое хранилище у другого провайдера
  • Около часа на настройку
  1. Шаг 1Скрипт и расписание
  2. Шаг 2Копия вне сервера
  3. Шаг 3Проверка восстановления
  4. Шаг 4Контроль копий
Содержание
  1. Правило 3-2-1
  2. Что копировать
  3. Как часто копировать
  4. Шаг 1. Скрипт и расписание
  5. Шаг 2. Копия вне сервера
  6. Шаг 3. Проверка восстановления
  7. Шаг 4. Контроль копий
  8. Частые ошибки
  9. Как это в Kesyio
  10. Вопросы и ответы
  11. Итог

Правило 3-2-1

Базовая схема, которую рекомендуют агентства по кибербезопасности, называется правилом 3-2-1:

3копии данных: рабочие данные и минимум две резервные копии
2разных типа хранения, например диск сервера и объектное хранилище
1копия вне основной площадки: в другом дата-центре или у другого провайдера

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

Правило 3-2-1 для сайта на своём сервере: сайт и локальная копия на диске сервера, третья копия в объектном хранилище у другого провайдера Ваш сервер · диск Другой провайдер Сайт файлы и база рабочие данные Локальная копия каждую ночь для быстрого отката Удалённая копия объектное хранилище S3-совместимое скрипт rclone Копии на одном сервере спасают от ошибок, но не от потери сервера и взлома с root Останется, если пропадёт весь сервер
Ночной скрипт копирует сайт на диск сервера, rclone отправляет копию в хранилище другого провайдера.
Копии на том же сервере мало

Такая копия защищает от ошибок, но не от потери сервера, взлома с правами root или ошибки провайдера. А копия, которую ни разу не проверяли, - это надежда, а не резервная копия.

Что копировать

Для сайта на WordPress:

ЧтоГде лежитКак часто меняется
База данныхMariaDB или MySQLпри каждой публикации, комментарии, заказе
Загруженные файлыwp-content/uploadsпри загрузке картинок
Темы и плагиныwp-content/themes, wp-content/pluginsпри обновлениях
Настройкиwp-config.phpредко
Конфигурация сервера/etc/nginx, /etc/phpредко
Проще копировать каталог целиком

Ядро WordPress копировать не обязательно: его можно скачать заново. Но весь каталог сайта обычно небольшой, и копировать его целиком проще.

Для статичного сайта достаточно копии каталога с файлами. Если сайт генерируется из исходников, храните исходники в репозитории: это уже резервная копия.

Как часто делать копии

Частота определяется одним вопросом: сколько данных вы готовы потерять?

Сайт-визитка

Меняется раз в месяц: еженедельной копии достаточно, плюс копия перед каждым изменением.

Блог

С регулярными публикациями: ежедневная копия базы и еженедельная копия файлов.

Магазин или сайт с заявками

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

Копия перед каждым обновлением

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

Храните не одну последнюю копию, а цепочку: например, 14 ежедневных и 8 еженедельных. Если сайт взломали неделю назад, а заметили только сейчас, последняя копия уже содержит вредоносный код.

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

1Скрипт копирования на сервере

Простой скрипт покрывает базу, файлы и удаление старых копий. Создайте файл /root/backup-site.sh:

Подсвеченные значения замените на свои: example.com - это ваш сайт.

#!/bin/bash
set -euo pipefail

SITE=/var/www/example.com
DEST=/root/backups/example.com
DATE=$(date +%F)

mkdir -p "$DEST"
# выгрузка базы
wp --path="$SITE" db export "$DEST/db-$DATE.sql" --allow-root
# архив файлов сайта
tar -czf "$DEST/files-$DATE.tar.gz" -C "$SITE" .
# удаление копий старше 14 дней
find "$DEST" -type f -mtime +14 -delete

Сделайте его исполняемым:

chmod 700 /root/backup-site.sh

И добавьте в расписание через crontab -e:

30 3 * * * /root/backup-site.sh >> /var/log/backup-site.log 2>&1

Каждую ночь в 3:30 скрипт выгрузит базу, упакует файлы и удалит копии старше 14 дней.

Права 700 важны

В выгрузке базы лежат хеши паролей и данные пользователей.

2Копия вне сервера

Для копии вне площадки удобно объектное хранилище S3-совместимого типа: оно есть у большинства облачных провайдеров и стоит недорого за гигабайт. Копировать туда удобно утилитой rclone, которая поддерживает десятки хранилищ:

apt install -y rclone
rclone config

После настройки подключения, например с именем backup, добавьте в конец скрипта одну строку:

rclone copy "$DEST" backup:site-backups/example.com --max-age 25h

Три правила для удалённой копии:

Снимки сервера у провайдера - хорошее дополнение, но не замена: они обычно хранятся в том же аккаунте и пропадут вместе с ним.

3Проверка восстановления

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

Где проверять

Удобно тестовое окружение на том же сервере, но на отдельном поддомене и с запретом индексации, чтобы копия не попала в поиск.

1. Разверните пустой сервер или каталог и создайте тестовую базу.

2. Распакуйте файлы из архива:

mkdir -p /var/www/restore-test
tar -xzf files-2026-09-14.tar.gz -C /var/www/restore-test

3. Импортируйте базу:

wp --path=/var/www/restore-test db import db-2026-09-14.sql --allow-root

4. Замените адрес на тестовый, чтобы копия не ссылалась на рабочий сайт:

wp --path=/var/www/restore-test search-replace 'https://example.com' 'https://restore.example.com' --skip-columns=guid --allow-root
Проверка

Откройте сайт и проверьте главную, несколько записей, вход в админку и картинки.

Засеките время. Это ваше реальное время восстановления, и лучше узнать его на тесте, а не во время аварии. Заодно проверка выявляет типичные проблемы: пустой архив из-за ошибки прав, выгрузку базы, оборванную на середине, или копии, которые перестали создаваться месяц назад.

4Следим, что копии создаются

Скрипт в расписании может молча перестать работать: закончилось место на диске, поменялся пароль базы, истёк ключ хранилища. Минимальный контроль:

Журнал

Смотрите /var/log/backup-site.log раз в неделю или настройте отправку ошибок на почту.

Размер копий

Не должен резко падать: архив, который вчера весил 500 МБ, а сегодня 2 КБ, - признак ошибки.

Свободное место на диске

Локальные копии съедают его быстрее, чем кажется.

Частые ошибки

Копии только на сервере

Пропадает сервер - пропадают и копии.

Копия у другого провайдера, шаг 2

Только последняя копия

Взлом, замеченный через неделю, уже попал в неё.

Храните цепочку, например 14 ежедневных и 8 еженедельных

Не копируется база

Копируются только файлы, а без базы сайт на WordPress восстановить нельзя.

Выгружайте базу: wp db export

Копии не проверялись

Узнать, что архив повреждён, во время аварии - худший сценарий.

Проверяйте восстановление на тесте, шаг 3

Выгрузки в открытом доступе

Копии с персональными данными лежат, например, в каталоге сайта.

Выгрузки базы никогда не кладите в веб-корень

Как это устроено в Kesyio

Kesyio

Сервер ваш, и резервные копии тоже

  1. Сайт на вашем сервере. Kesyio разворачивает сайты на вашем собственном сервере, поэтому данные остаются под вашим контролем, а вместе с ними и ответственность за резервные копии.
  2. Копии настраиваете вы. Kesyio не делает резервные копии сайтов за вас: настройте их по этой инструкции сразу после запуска сайта.
  3. Заполнение диска в кабинете. Проверка состояния сервера в кабинете покажет заполнение диска, чтобы локальные копии не съели всё свободное место.

Вопросы и ответы

Хватит ли плагина резервного копирования?

Для небольшого сайта плагин - рабочий вариант, если он отправляет копии во внешнее хранилище, а не хранит их в каталоге сайта. Но плагин работает внутри WordPress: если сайт взломан или не запускается, плагин тоже недоступен. Копия на уровне сервера надёжнее.

Сколько места нужно под копии?

Посмотрите размер каталога сайта и выгрузки базы, умножьте на число хранимых копий. Архивы сжимаются, но картинки и так сжаты, поэтому ориентируйтесь на размер wp-content/uploads.

Нужно ли копировать сайт, если провайдер делает снимки сервера?

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

Как восстановить сайт после взлома?

Восстановите сайт из копии, сделанной до взлома, а не из последней. Затем сразу смените все пароли, обновите ядро, темы и плагины и закройте уязвимость, через которую произошёл взлом, иначе он повторится. Базовые меры защиты разобраны в статье о безопасности WordPress.

Итог

  • Надёжная схема - это три копии, два типа хранения и одна копия у другого провайдера.
  • Ежедневный скрипт по расписанию и цепочка копий, а не одна последняя. Настройка занимает час, а сэкономить может недели.
  • Начните с проверки восстановления: если завтра сервер пропадёт, из чего и за сколько вы восстановите сайт?
  • Копии пригодятся и при переезде: как перенести сайт на новый сервер без простоя, разобрано в отдельной инструкции.