اسکریپت بکاپ کامل سایت: فایل و دیتابیس

بکاپ کامل یک سایت یعنی هم فایل‌ها (کد و آپلودها) و هم دیتابیس. اگر فقط یکی را داشته باشید بازیابی کامل ممکن نیست. این اسکریپت هر دو را در یک فایل تاریخ‌دار می‌گذارد.

دیتابیس و بکاپمتوسط10 دقیقه

۱پیش‌نیاز: اتصال دیتابیس بدون رمز

فایل ~/.my.cnf را برای کاربر اجراکننده بسازید (راهنمای «بکاپ MySQL با mysqldump» را ببینید).

bash
cat ~/.my.cnf
mysql -e 'SELECT 1'

۲نوشتن اسکریپت

این اسکریپت از پوشهٔ سایت و دیتابیس بکاپ می‌گیرد، همه را در یک آرشیو می‌گذارد، بکاپ‌های قدیمی را پاک می‌کند و به‌صورت اختیاری آن را به سرور دیگر می‌فرستد.

bash
sudo tee /usr/local/bin/site-backup.sh > /dev/null <<'EOF'
#!/usr/bin/env bash
set -euo pipefail

SITE_NAME="mysite"
SITE_DIR="/var/www/mysite"
DB_NAME="mysite_db"
BACKUP_DIR="/var/backups/sites"
KEEP_DAYS=14
REMOTE="backup@203.0.113.20:/srv/backups/sites/"    # خالی بگذارید تا ارسال نشود

STAMP=$(date +%F_%H-%M)
WORK=$(mktemp -d)
trap 'rm -rf "$WORK"' EXIT
mkdir -p "$BACKUP_DIR"

# ۱) دیتابیس
mysqldump --single-transaction --routines --triggers --events --no-tablespaces \
  "$DB_NAME" | gzip > "$WORK/db.sql.gz"

# ۲) فایل‌ها (بدون کش و node_modules)
tar czf "$WORK/files.tar.gz" \
  --exclude='node_modules' --exclude='.git' --exclude='storage/logs' --exclude='wp-content/cache' \
  -C "$(dirname "$SITE_DIR")" "$(basename "$SITE_DIR")"

# ۳) یک آرشیو نهایی
OUT="$BACKUP_DIR/$SITE_NAME-$STAMP.tar"
tar cf "$OUT.tmp" -C "$WORK" db.sql.gz files.tar.gz
mv "$OUT.tmp" "$OUT"

# ۴) پاک کردن قدیمی‌ها
find "$BACKUP_DIR" -name "$SITE_NAME-*.tar" -mtime +"$KEEP_DAYS" -delete

# ۵) ارسال به سرور دیگر
if [ -n "$REMOTE" ]; then
  rsync -az "$OUT" "$REMOTE"
fi

echo "$(date '+%F %T') OK $OUT ($(du -h "$OUT" | cut -f1))"
EOF
sudo chmod 700 /usr/local/bin/site-backup.sh

۳اجرای دستی و بررسی

یک بار اجرا کنید و محتوای آرشیو را ببینید.

bash
sudo /usr/local/bin/site-backup.sh
ls -lh /var/backups/sites/
tar tf /var/backups/sites/mysite_*.tar | head

۴زمان‌بندی با cron

هر شب در ساعت کم‌ترافیک.

bash
sudo crontab -e

15 3 * * * /usr/local/bin/site-backup.sh >> /var/log/site-backup.log 2>&1

۵ریستور کامل

آرشیو را باز کنید، فایل‌ها را جایگزین و دیتابیس را ریستور کنید.

bash
mkdir /tmp/restore && tar xf mysite_2026-09-29_03-15.tar -C /tmp/restore
tar xzf /tmp/restore/files.tar.gz -C /var/www/
zcat /tmp/restore/db.sql.gz | mysql mysite_db
sudo chown -R www-data:www-data /var/www/mysite

ریستور فایل‌ها و دیتابیس داده‌های فعلی را بازنویسی می‌کند. اول یک بکاپ از وضعیت فعلی بگیرید.

۶اعلان در صورت شکست (اختیاری)

برای اینکه نفهمیدن شکست بکاپ رخ ندهد، در صورت خطا پیام بفرستید. ساده‌ترین راه استفاده از MAILTO در cron یا یک curl به سرویس اعلان است.

bash
# ایمیل خودکار در صورت خروجی خطا از cron
MAILTO=admin@example.com
15 3 * * * /usr/local/bin/site-backup.sh > /dev/null

پرسش‌های پرتکرار دربارهٔ اسکریپت بکاپ کامل سایت: فایل و دیتابیس

چند نسخه از بکاپ را نگه دارم؟

حداقل ۷ نسخهٔ روزانه، ۴ نسخهٔ هفتگی و چند نسخهٔ ماهانه. مهم‌تر از تعداد این است که حداقل یک نسخه خارج از سرور اصلی باشد.