Втрата даних може знищити бізнес за лічені хвилини. У цій статті ми створимо професійну систему бекапів, яка захистить ваш OpenCart магазин.
Стратегія бекапів
Ефективна стратегія включає:
- Щоденні бекапи — база даних
- Щотижневі бекапи — повний архів (файли + БД)
- Ротація — видалення старих бекапів
- Віддалене зберігання — копія на іншому сервері
Бекап, який ви не перевірили — це не бекап. Регулярно тестуйте відновлення!
— Золоте правило сисадмінів
Скрипт бекапу бази даних
#!/bin/bash
# /home/deployer/scripts/backup-db.sh
# Конфігурація
DB_NAME="opencart"
DB_USER="opencart"
DB_PASS="your_password"
BACKUP_DIR="/home/deployer/backups/database"
DATE=$(date +%Y%m%d_%H%M%S)
RETENTION_DAYS=14
# Створення директорії
mkdir -p $BACKUP_DIR
# Бекап
echo "[$(date)] Starting database backup..."
mysqldump -u$DB_USER -p$DB_PASS \
--single-transaction \
--routines \
--triggers \
$DB_NAME | gzip > $BACKUP_DIR/db_$DATE.sql.gz
# Перевірка успішності
if [ $? -eq 0 ]; then
echo "[$(date)] Database backup completed: db_$DATE.sql.gz"
# Розмір файлу
SIZE=$(du -h $BACKUP_DIR/db_$DATE.sql.gz | cut -f1)
echo "[$(date)] Backup size: $SIZE"
else
echo "[$(date)] ERROR: Database backup failed!"
exit 1
fi
# Ротація старих бекапів
echo "[$(date)] Removing backups older than $RETENTION_DAYS days..."
find $BACKUP_DIR -name "db_*.sql.gz" -mtime +$RETENTION_DAYS -delete
echo "[$(date)] Backup process completed."
Скрипт повного бекапу
#!/bin/bash
# /home/deployer/scripts/backup-full.sh
# Конфігурація
SITE_DIR="/var/www/opencart"
BACKUP_DIR="/home/deployer/backups/full"
DATE=$(date +%Y%m%d)
RETENTION_DAYS=30
# Виключення з архіву
EXCLUDES="--exclude='*.log' --exclude='system/storage/cache/*' --exclude='system/storage/logs/*'"
mkdir -p $BACKUP_DIR
echo "[$(date)] Starting full backup..."
# Бекап бази
/home/deployer/scripts/backup-db.sh
# Бекап файлів
tar $EXCLUDES -czf $BACKUP_DIR/files_$DATE.tar.gz -C $(dirname $SITE_DIR) $(basename $SITE_DIR)
if [ $? -eq 0 ]; then
SIZE=$(du -h $BACKUP_DIR/files_$DATE.tar.gz | cut -f1)
echo "[$(date)] Files backup completed: $SIZE"
else
echo "[$(date)] ERROR: Files backup failed!"
exit 1
fi
# Ротація
find $BACKUP_DIR -name "files_*.tar.gz" -mtime +$RETENTION_DAYS -delete
echo "[$(date)] Full backup completed."
--single-transaction для mysqldump, щоб не блокувати таблиці під час бекапу.
Синхронізація з віддаленим сервером
#!/bin/bash
# /home/deployer/scripts/sync-backups.sh
BACKUP_DIR="/home/deployer/backups"
REMOTE_USER="backup"
REMOTE_HOST="backup-server.com"
REMOTE_DIR="/backups/opencart"
# Синхронізація через rsync
rsync -avz --delete \
-e "ssh -i /home/deployer/.ssh/backup_key" \
$BACKUP_DIR/ \
$REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR/
echo "[$(date)] Sync completed."
Налаштування Cron
# Редагування crontab
crontab -e
# Щоденний бекап БД о 3:00
0 3 * * * /home/deployer/scripts/backup-db.sh >> /var/log/backup.log 2>&1
# Повний бекап щонеділі о 4:00
0 4 * * 0 /home/deployer/scripts/backup-full.sh >> /var/log/backup.log 2>&1
# Синхронізація щодня о 5:00
0 5 * * * /home/deployer/scripts/sync-backups.sh >> /var/log/backup.log 2>&1
Скрипт відновлення
#!/bin/bash
# /home/deployer/scripts/restore.sh
BACKUP_FILE=$1
DB_NAME="opencart"
DB_USER="opencart"
DB_PASS="your_password"
if [ -z "$BACKUP_FILE" ]; then
echo "Usage: ./restore.sh backup_file.sql.gz"
exit 1
fi
echo "WARNING: This will overwrite the current database!"
read -p "Continue? (yes/no): " confirm
if [ "$confirm" = "yes" ]; then
gunzip -c $BACKUP_FILE | mysql -u$DB_USER -p$DB_PASS $DB_NAME
echo "Database restored successfully."
else
echo "Restore cancelled."
fi
Моніторинг бекапів
#!/bin/bash
# Перевірка наявності свіжого бекапу
BACKUP_DIR="/home/deployer/backups/database"
MAX_AGE=86400 # 24 години в секундах
LATEST=$(find $BACKUP_DIR -name "db_*.sql.gz" -mtime -1 | head -1)
if [ -z "$LATEST" ]; then
echo "ALERT: No backup found in last 24 hours!"
# Відправити email або Slack повідомлення
exit 1
fi
echo "OK: Latest backup found: $LATEST"
Висновок
Тепер у вас є повноцінна система бекапів. Не забувайте періодично тестувати відновлення — бекап без перевірки не дає гарантій.