بکاپ خودکار سرور؛ راهنمای عملی اسکریپت و کرون

آموزش گام‌به‌گام بکاپ خودکار سرور با اسکریپت Bash و کرون؛ شامل بکاپ فایل و MySQL، چرخش نسخه‌ها و انتقال امن به فضای بیرونی.

۶ دقیقه به‌روزرسانی ۱ شهریور ۱۴۰۵

چرا بکاپ خودکار سرور دیگر یک انتخاب نیست؟

هر مدیر سروری حداقل یک بار تجربه از دست دادن داده را داشته است؛ حذف اشتباهی فایل، خرابی دیسک، یا حمله باج‌افزاری. در چنین لحظه‌ای، تنها چیزی که نجات‌تان می‌دهد یک بکاپِ تازه و قابل بازیابی است. اما بکاپ دستی، یک اشتباه انسانی ساده می‌تواند آن را برای همیشه به تأخیر بیندازد. راه‌حل استاندارد، پیاده‌سازی بکاپ خودکار سرور با ترکیب اسکریپت‌نویسی و cron job است؛ سیستمی که بدون دخالت شما، طبق برنامه مشخص اجرا می‌شود و خیال‌تان را از بابت داده‌ها راحت می‌کند.

در این مقاله، یک راهکار عملی و کامل برای بکاپ خودکار سرور ارائه می‌دهیم: از نوشتن اسکریپت بکاپ فایل‌ها و دیتابیس MySQL گرفته تا چرخش نسخه‌های قدیمی و انتقال امن بکاپ به یک فضای خارجی. همه مثال‌ها روی Ubuntu/Debian تست شده‌اند، اما با تغییرات جزئی روی سایر توزیع‌های لینوکسی هم کار می‌کنند.

پیش‌نیازها و ساختار پوشه‌ها

قبل از نوشتن اسکریپت، باید محیط را آماده کنیم. فرض می‌کنیم روی سرور شما یک وب‌اپلیکیشن با فایل‌های استاتیک و یک دیتابیس MySQL/MariaDB اجرا می‌شود. ابتدا پوشه‌های مورد نیاز را می‌سازیم:

sudo mkdir -p /opt/backup-scripts
sudo mkdir -p /var/backups/local
sudo mkdir -p /var/backups/logs
  • /opt/backup-scripts محل نگهداری اسکریپت‌های بکاپ است.
  • /var/backups/local بکاپ‌های تولید شده به صورت موقت در اینجا ذخیره می‌شوند.
  • /var/backups/logs برای ثبت گزارش اجرای اسکریپت استفاده می‌شود.

همچنین مطمئن شوید که ابزارهای زیر نصب هستند:

sudo apt update
sudo apt install mysql-client rsync gzip

نوشتن اسکریپت بکاپ خودکار سرور

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

sudo nano /opt/backup-scripts/backup.sh

محتوای زیر را در آن قرار دهید:

#!/bin/bash
# ============================================
# بکاپ خودکار سرور - فایل و دیتابیس
# ============================================

# تنظیمات
BACKUP_DIR="/var/backups/local"
LOG_DIR="/var/backups/logs"
DATE=$(date +%Y-%m-%d_%H-%M-%S)
RETENTION_DAYS=7

# مسیر فایل‌های سایت (مثال)
SITE_DIR="/var/www/mysite"
DB_NAME="mydb"
DB_USER="backup_user"
DB_PASS="S3cure_P@ssw0rd"

# فایل لاگ
LOG_FILE="$LOG_DIR/backup_$DATE.log"

# شروع
echo "Backup started at $(date)" > "$LOG_FILE"

# 1) بکاپ فایل‌ها با tar
echo "Backing up files..." >> "$LOG_FILE"
tar -czf "$BACKUP_DIR/files_$DATE.tar.gz" -C "$SITE_DIR" . 2>> "$LOG_FILE"

# 2) بکاپ دیتابیس با mysqldump
echo "Backing up database..." >> "$LOG_FILE"
mysqldump -u "$DB_USER" -p"$DB_PASS" "$DB_NAME" | gzip > "$BACKUP_DIR/db_$DATE.sql.gz" 2>> "$LOG_FILE"

# 3) حذف بکاپ‌های قدیمی (چرخش نسخه)
echo "Cleaning old backups..." >> "$LOG_FILE"
find "$BACKUP_DIR" -name "files_*.tar.gz" -mtime +$RETENTION_DAYS -delete >> "$LOG_FILE" 2>&1
find "$BACKUP_DIR" -name "db_*.sql.gz" -mtime +$RETENTION_DAYS -delete >> "$LOG_FILE" 2>&1

# پایان
echo "Backup completed at $(date)" >> "$LOG_FILE"

سپس اسکریپت را اجرایی کنید:

sudo chmod +x /opt/backup-scripts/backup.sh

توضیح بخش‌های کلیدی اسکریپت

  • متغیر DATE: نام فایل‌های بکاپ را با تاریخ و ساعت دقیق می‌سازد تا نسخه‌ها با هم تداخل نداشته باشند.
  • بکاپ فایل‌ها: با دستور tar کل محتوای پوشه سایت را فشرده می‌کند. استفاده از -C باعث می‌شود مسیرهای مطلق در بکاپ ذخیره نشوند و بازیابی ساده‌تر باشد.
  • بکاپ دیتابیس: با mysqldump یک dump منطقی از دیتابیس می‌گیرد و بلافاصله با gzip فشرده می‌کند. این کار حجم فایل نهایی را به شدت کاهش می‌دهد.
  • چرخش نسخه‌ها: دستور find فایل‌های قدیمی‌تر از ۷ روز را پیدا و حذف می‌کند تا دیسک پر نشود.
اشتباه رایج: قرار دادن پسورد دیتابیس به صورت明文 در اسکریپت، یک خطر امنیتی جدی است. اگر اسکریپت توسط کاربر غیرمجاز خوانده شود، اطلاعات دیتابیس لو می‌رود. راه‌حل بهتر، استفاده از فایل ~/.my.cnf با دسترسی محدود است:
chmod 600 ~/.my.cnf
و سپس در اسکریپت فقط از mysqldump "$DB_NAME" بدون ذکر کاربر و پسورد استفاده کنید.

انتقال بکاپ به فضای بیرونی

ذخیره بکاپ روی همان سرور، در برابر خرابی دیسک یا حملات باج‌افزاری بی‌فایده است. بهترین کار، انتقال خودکار بکاپ‌ها به یک فضای ذخیره‌سازی خارجی است. دو روش رایج را بررسی می‌کنیم.

انتقال با rsync به سرور دیگر

اگر یک سرور بکاپ جداگانه دارید، rsync بهترین گزینه است. ابتدا کلید SSH را تنظیم کنید تا اسکریپت بدون نیاز به پسورد کار کند:

ssh-keygen -t rsa -b 4096
ssh-copy-id backup_user@backup-server.example.com

سپس این خط را به انتهای اسکریپت اضافه کنید:

rsync -avz --remove-source-files "$BACKUP_DIR/" backup_user@backup-server.example.com:/backups/ >> "$LOG_FILE" 2>&1

گزینه --remove-source-files فایل‌های محلی را بعد از انتقال موفق حذف می‌کند و فضای دیسک سرور اصلی را آزاد نگه می‌دارد.

انتقال با rclone به فضای ابری

برای انتقال به سرویس‌های ابری مثل Google Drive یا S3، ابزار rclone بسیار محبوب است. نصب و تنظیم:

sudo apt install rclone
rclone config

بعد از تنظیم remote، خط زیر را به اسکریپت اضافه کنید:

rclone copy "$BACKUP_DIR" remote:backups/ --log-file="$LOG_FILE"

تنظیم cron job برای اجرای خودکار

حالا نوبت به زمان‌بندی رسیده است. با دستور crontab -e فایل cron را باز کنید و خط زیر را اضافه کنید تا اسکریپت هر شب ساعت ۲ بامداد اجرا شود:

0 2 * * * /opt/backup-scripts/backup.sh

برای اجرای روزانه در ساعت مشخص، از این الگو استفاده کنید. اگر نیاز به بکاپ هر ۶ ساعت دارید:

0 */6 * * * /opt/backup-scripts/backup.sh

تست cron job

بعد از تنظیم cron، حتماً تست کنید که اسکریپت به درستی اجرا می‌شود. ابتدا به صورت دستی اجرا کنید:

sudo /opt/backup-scripts/backup.sh

سپس خروجی لاگ را بررسی کنید:

cat /var/backups/logs/backup_*.log

اگر خطایی وجود داشت، آن را برطرف کنید. برای اطمینان از اجرای cron، می‌توانید یک خط موقت به crontab اضافه کنید که هر دقیقه اجرا شود و یک فایل تست بسازد:

* * * * * touch /tmp/cron-test

بعد از یک دقیقه، اگر فایل /tmp/cron-test ساخته شد، cron به درستی کار می‌کند.

نکته عیب‌یابی: اگر cron اجرا نمی‌شود، احتمالاً مسیر مطلق اسکریپت را اشتباه نوشته‌اید یا اسکریپت اجرایی نیست. همچنین به یاد داشته باشید که cron محیط محدودی دارد؛ اگر اسکریپت شما به متغیرهای محیطی خاصی نیاز دارد، آن‌ها را داخل خود اسکریپت تعریف کنید.

بازیابی بکاپ؛ بخش فراموش‌شده

یک بکاپ که هرگز بازیابی نشده، عملاً بی‌ارزش است. حداقل ماهی یک بار، فرآیند بازیابی را در یک محیط تست انجام دهید. برای بازیابی فایل‌ها:

tar -xzf files_2025-01-15_02-00-01.tar.gz -C /tmp/restore-test/

و برای دیتابیس:

gunzip < db_2025-01-15_02-00-01.sql.gz | mysql -u root -p mydb

این تست ساده می‌تواند تفاوت بین یک بحران واقعی و یک اتفاق کوچک را مشخص کند.

بهبود امنیت اسکریپت بکاپ

چند اقدام ساده امنیت بکاپ خودکار سرور شما را به شکل قابل توجهی افزایش می‌دهد:

  • رمزنگاری بکاپ‌ها: با ابزار gpg می‌توانید فایل‌های بکاپ را قبل از انتقال رمزنگاری کنید:
    gpg --symmetric --cipher-algo AES256 backup.tar.gz
  • محدود کردن دسترسی به پوشه بکاپ: فقط کاربر root باید به /var/backups دسترسی داشته باشد:
    sudo chmod 700 /var/backups
  • مانیتورینگ اجرای بکاپ: یک اسکریپت ساده بنویسید که اگر فایل بکاپ امروز ساخته نشد، به شما ایمیل بزند. می‌توانید از mailutils استفاده کنید.

جمع‌بندی

پیاده‌سازی بکاپ خودکار سرور با اسکریپت و cron، یکی از مهم‌ترین اقداماتی است که می‌توانید برای پایداری سرویس خود انجام دهید. در این مقاله، یک اسکریپت کامل برای بکاپ فایل‌ها و دیتابیس، چرخش نسخه‌های قدیمی و انتقال به فضای بیرونی نوشتیم. این راهکار را می‌توانید به سادگی با نیازهای خود شخصی‌سازی کنید؛ مثلاً افزودن بکاپ از پوشه‌های خاص، استفاده از فشرده‌سازی قوی‌تر، یا ارسال گزارش به تلگرام.

اگر به دنبال زیرساختی هستید که این فرآیندها را ساده‌تر کند، سرویس‌های میزبانی وب و سرور ابری سرورنت می‌توانند گزینه مناسبی باشند؛ اما مهم‌ترین اصل، شروع کردن است. همین امروز اسکریپت بکاپ خود را بنویسید و cron را تنظیم کنید؛ فردا که اتفاقی افتاد، از خودتان تشکر خواهید کرد.

آیا این مطلب برایتان مفید بود؟