Нічого не знайдено

Спробуйте інший пошуковий запит

Популярні запити:

Додати в кошик

Кошик

У вас поки немає покупок

Переглянути маркетплейс

Автоматизація бекапів з Bash скриптами

Створюємо надійну систему автоматичного резервного копіювання для OpenCart з використанням Bash та Cron.

9 хв читання
4,641
5
1
6
Автоматизація бекапів з Bash скриптами

Втрата даних може знищити бізнес за лічені хвилини. У цій статті ми створимо професійну систему бекапів, яка захистить ваш 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
Важливо: Зберігайте паролі в окремому конфіг-файлі з правами 600, а не в самих скриптах!

Моніторинг бекапів

#!/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"

Висновок

Тепер у вас є повноцінна система бекапів. Не забувайте періодично тестувати відновлення — бекап без перевірки не дає гарантій.

Додатково: Розгляньте використання S3-сумісного сховища (AWS S3, DigitalOcean Spaces) для географічно розподіленого зберігання.
DEV Тестовий

DEV Тестовий

Привіт! Я досвідчений розробник з OpenCart екосистеми з понад 10 роками практики. Технічний стек включає PHP (core мова для OpenCart), MySQL/MariaDB для баз даних, JavaScript/jQuery для фронтенду, HTML5/CSS3/Bootstrap для верстки. Маю глибокий досвід роботи з архітектурою OpenCart (MVC, Event System, OCMOD), інтеграцією платіжних систем та API, оптимізацією продуктивності магазинів. Окрім розробки, займаюся серверним адмініструванням — Linux (Ubuntu/Debian), Apache/Nginx, налаштування VPS/Dedicated серверів, DNS менеджмент, SSL сертифікати, email. Обслуговую понад 5000 інтернет-магазинів по всьому світу, надаючи комплексні рішення від розробки до технічної підтримки.

статей
12
переглядів
53,899
вподобань
63
підписники
3

Схожі статті

Коментарі (6)

Відповідь для

Увійдіть, щоб залишити коментар

Увійти
m
How do you handle backup rotation?
a
А як налаштувати відправку бекапів на S3?
a
Should I compress backups before uploading?
m
Як перевірити цілісність бекапу?
m
Використовую цей скрипт вже місяць - працює бездоганно.

Ми використовуємо cookies

Ми використовуємо cookies та схожі технології для покращення вашого досвіду, аналізу трафіку та показу персоналізованої реклами. Детальніше — у нашій Політиці cookies.