اسکریپت بکاپ کامل سایت: فایل و دیتابیس
بکاپ کامل یک سایت یعنی هم فایلها (کد و آپلودها) و هم دیتابیس. اگر فقط یکی را داشته باشید بازیابی کامل ممکن نیست. این اسکریپت هر دو را در یک فایل تاریخدار میگذارد.
۱پیشنیاز: اتصال دیتابیس بدون رمز
فایل ~/.my.cnf را برای کاربر اجراکننده بسازید (راهنمای «بکاپ MySQL با mysqldump» را ببینید).
cat ~/.my.cnf
mysql -e 'SELECT 1'۲نوشتن اسکریپت
این اسکریپت از پوشهٔ سایت و دیتابیس بکاپ میگیرد، همه را در یک آرشیو میگذارد، بکاپهای قدیمی را پاک میکند و بهصورت اختیاری آن را به سرور دیگر میفرستد.
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۳اجرای دستی و بررسی
یک بار اجرا کنید و محتوای آرشیو را ببینید.
sudo /usr/local/bin/site-backup.sh
ls -lh /var/backups/sites/
tar tf /var/backups/sites/mysite_*.tar | head۴زمانبندی با cron
هر شب در ساعت کمترافیک.
sudo crontab -e
15 3 * * * /usr/local/bin/site-backup.sh >> /var/log/site-backup.log 2>&1۵ریستور کامل
آرشیو را باز کنید، فایلها را جایگزین و دیتابیس را ریستور کنید.
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 به سرویس اعلان است.
# ایمیل خودکار در صورت خروجی خطا از cron
MAILTO=admin@example.com
15 3 * * * /usr/local/bin/site-backup.sh > /dev/nullپرسشهای پرتکرار دربارهٔ اسکریپت بکاپ کامل سایت: فایل و دیتابیس
چند نسخه از بکاپ را نگه دارم؟
حداقل ۷ نسخهٔ روزانه، ۴ نسخهٔ هفتگی و چند نسخهٔ ماهانه. مهمتر از تعداد این است که حداقل یک نسخه خارج از سرور اصلی باشد.