Резервное копирование сайта: гарантия восстановления по правилу 3-2-1
Однажды клиент потерял 3 месяца данных из-за сбоя RAID-массива. Бэкап хранился на том же физическом сервере — обе копии погибли. Восстановить удалось только из полугодовой копии на ноутбуке разработчика. По статистике, 30% компаний не проверяют бэкапы, а 50% хранят их на том же хостинге, что и основной сайт. Потеря данных обходится бизнесу в среднем в $18k–26k. Это прямой путь к невосполнимым потерям, которые обходятся в десятки и около $900–1.3k простоя. Мы занимаемся резервным копированием 10 лет и обслужили более 200 проектов.
В отличие от многих компаний, мы не просто настраиваем скрипты — мы проектируем архитектуру бэкапов, которая выдерживает отказ оборудования, человеческую ошибку и даже целенаправленную атаку. Наши инженеры сертифицированы AWS и PostgreSQL, что гарантирует корректную настройку S3 Lifecycle и pg_dump.
Правило 3-2-1 — золотой стандарт резервного копирования, исключающий такие риски. Источник: Wikipedia Мы настраиваем автоматические бэкапы, соответствующие этому правилу, с использованием S3-хранилища и умной ротации. Результат — гарантированная возможность откатиться к любой точке за последние 90 дней. Данные в безопасности даже при отказе оборудования.
Почему резервное копирование — не опция, а необходимость?
Бэкап на том же сервере — ложная безопасность. Если упадёт RAID, сгорят обе копии. Мы переносим бэкапы в S3 и настраиваем Lifecycle — теперь данные дублируются в другом регионе. Стоимость хранения 10 ГБ на S3 — менее $1–1 в месяц, тогда как потеря данных может обойтись в миллионы. Это вложение, которое окупается при первой же аварии. Например, ежемесячные затраты на хранение 50 ГБ бэкапов — около $1–1. А восстановление данных после сбоя может стоить около $900–1.3k. Экономия очевидна.
Какие данные бэкапим в первую очередь
База данных — главный источник изменений. Для WordPress с 10k+ посетителей в день настраиваем бэкапы БД каждые 6 часов. Файлы загрузок (uploads/, storage/) — раз в сутки. Конфигурационные файлы (.env, nginx.conf) — после каждого изменения. Код — в Git, но резервная копия репозитория на отдельном сервере не помешает.
Настройка автоматического бэкапа за 2–4 часа
Используем bash, pg_dump, rsync и S3. Ниже — типовой сценарий.
Автоматический бэкап БД на S3
#!/bin/bash
# /opt/scripts/backup-db.sh
set -euo pipefail
DATE=$(date +%Y%m%d_%H%M%S)
DB_NAME="mysite_prod"
BACKUP_DIR="/tmp/backups"
S3_BUCKET="s3://my-backups/database"
mkdir -p "$BACKUP_DIR"
# PostgreSQL
pg_dump -U postgres -d "$DB_NAME" -F custom \
| gzip > "$BACKUP_DIR/${DB_NAME}_${DATE}.dump.gz"
# Upload to S3
aws s3 cp "$BACKUP_DIR/${DB_NAME}_${DATE}.dump.gz" \
"${S3_BUCKET}/${DB_NAME}_${DATE}.dump.gz" \
--storage-class STANDARD_IA
# Clean local
rm "$BACKUP_DIR/${DB_NAME}_${DATE}.dump.gz"
# Remove old (30 days)
aws s3 ls "${S3_BUCKET}/" \
| awk '{print $4}' \
| while read key; do
date=$(echo "$key" | grep -oP '\d{8}')
if [[ $(date -d "$date" +%s) -lt $(date -d "30 days ago" +%s) ]]; then
aws s3 rm "${S3_BUCKET}/${key}"
fi
done
echo "Backup completed: ${DB_NAME}_${DATE}.dump.gz" Crontab: каждые 6 часов
0 */6 * * * /opt/scripts/backup-db.sh >> /var/log/backup.log 2>&1 S3 Lifecycle Policies для автоматической ротации
{
"Rules": [
{
"ID": "BackupRetention",
"Filter": {
"Prefix": "database/"
},
"Status": "Enabled",
"Transitions": [
{
"Days": 7,
"StorageClass": "STANDARD_IA"
},
{
"Days": 30,
"StorageClass": "GLACIER"
}
],
"Expiration": {
"Days": 90
}
}
]
} Бэкап файлов через rsync + S3
# Syn uploads/ to S3
aws s3 sync /var/www/mysite/storage/app/public/ \
s3://my-backups/files/ \
--storage-class STANDARD_IA \
--delete
# Without --delete (safer, but grows)
aws s3 sync /var/www/mysite/uploads/ s3://my-backups/uploads/ Этапы настройки бэкапа
- Оценка объёма данных: определяем размер БД, файлов и их темп роста.
- Выбор стратегии: частота бэкапов, глубина хранения, классы S3.
- Написание скриптов: pg_dump, rsync, aws cli.
- Настройка crontab: для БД — каждые 6 часов, для файлов — раз в сутки.
- Настройка S3 Lifecycle: автоматическая ротация и удаление старых копий.
- Тестовое восстановление: имитация сбоя и проверка restore.
Как проверить, что бэкап работает?
Бэкап без проверки восстановления — иллюзия безопасности. Ежемесячно запускайте тестовое восстановление в изолированной среде:
# Monthly restore test
aws s3 cp s3://my-backups/database/latest.dump.gz /tmp/test-restore.dump.gz
createdb mysite_restore_test
gunzip < /tmp/test-restore.dump.gz | pg_restore -d mysite_restore_test
psql -d mysite_restore_test -c "SELECT COUNT(*) FROM users;"
dropdb mysite_restore_testЕсли восстановление прошло успешно — бэкап работает. При ошибке настроен alert в Telegram. Такой подход гарантирует, что в критический момент данные будут доступны.
Состав услуги по резервному копированию
- Разработка скриптов бэкапа (БД, файлы, конфиги)
- Настройка crontab и S3 Lifecycle
- Тестовое восстановление на изолированной среде
- Мониторинг с ежедневным healthcheck и алертами
- Документация с полной схемой и инструкцией
Перед сдачей проекта проверяем, что crontab настроен для БД и файлов, создана S3 Lifecycle policy, выполнено тестовое восстановление, настроен мониторинг с алертами, и передана документация клиенту.
Самописный скрипт или готовый плагин: что выбрать?
| Критерий | Самописный bash-скрипт | Готовый сервис (UpdraftPlus, BlogVault) |
|---|---|---|
| Гибкость | Полный контроль | Ограничен настройками |
| Стоимость | Только расходы S3 | Ежемесячная подписка |
| Время настройки | 2–4 часа | 30 минут |
| Восстановление | Любая часть данных | Только полный restore |
Самописный скрипт оправдан при кастомных сценариях: ротация, несколько БД, интеграция с мониторингом. Для простых сайтов готовые плагины быстрее, но мы рекомендуем гибридный подход.
Рекомендуемая политика хранения
| Тип бэкапа | Интервал | Срок хранения | Класс S3 |
|---|---|---|---|
| База данных (daily) | 6 часов | 7 дней | STANDARD |
| База данных (weekly) | 1 неделя | 30 дней | STANDARD_IA |
| База данных (monthly) | 1 месяц | 90 дней | GLACIER |
| Файлы (daily) | 1 день | 30 дней | STANDARD_IA |
| Файлы (monthly) | 1 месяц | 12 месяцев | GLACIER_DEEP_ARCHIVE |
Как настроить Lifecycle Policy через AWS CLI
Выполните команду: `aws s3api put-bucket-lifecycle-configuration --bucket my-backups --lifecycle-configuration file://lifecycle.json`Наши инженеры сертифицированы AWS и PostgreSQL. Гарантируем восстановление из бэкапа. Закажите консультацию — мы подберём оптимальную стратегию для вашего проекта. Хотите обезопасить свой проект? Свяжитесь с нами — оценим инфраструктуру за один день и предложим оптимальную стратегию.







