Регулярне резервне копіювання вебсайту
Резервна копія — страховка, яка коштує дешево, поки вона не потрібна. Вартість зберігання 10 ГБ на S3 — близько $0.23/місяць. Вартість втрати даних без резервної копії непередбачувана.
Правило 3-2-1
- 3 копії даних
- 2 різні носії/сховища
- 1 копія offsite (інша локація або хмара)
Що потрібно резервно копіювати
- База даних (оновлюється найчастіше — критично важливо)
- Файли, завантажені користувачами (uploads/, storage/)
- Конфігураційні файли (.env, nginx.conf)
- Код вебсайту (зазвичай вже в Git — додаткова резервна копія не потрібна)
Автоматична резервна копія БД на 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"
# Завантаження на S3
aws s3 cp "$BACKUP_DIR/${DB_NAME}_${DATE}.dump.gz" \
"${S3_BUCKET}/${DB_NAME}_${DATE}.dump.gz" \
--storage-class STANDARD_IA
# Видалення локального файлу
rm "$BACKUP_DIR/${DB_NAME}_${DATE}.dump.gz"
# Видалення резервних копій старше 30 днів
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)
# Резервна копія uploads/ на S3
aws s3 sync /var/www/mysite/storage/app/public/ \
s3://my-backups/files/ \
--storage-class STANDARD_IA \
--delete # видалити на S3 те, що було видалено локально
# Без --delete (безпечніше, але обсяг зростає)
aws s3 sync /var/www/mysite/uploads/ s3://my-backups/uploads/
Перевірка резервних копій (обов'язково!)
Резервна копія без перевірки відновлення — хибна впевненість:
# Щомісячна перевірка відновлення
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;" # повинно збігатися з production
dropdb mysite_restore_test
Рішення для WordPress
# WP-CLI + S3
wp package install wp-cli/db-command --allow-root
wp db export - | gzip | aws s3 cp - s3://my-backups/wp_$(date +%Y%m%d).sql.gz
Налаштування автоматичної резервної копії з сховищем S3 — 2–4 години.







