چرا بکاپ خودکار سرور دیگر یک انتخاب نیست؟
هر مدیر سروری حداقل یک بار تجربه از دست دادن داده را داشته است؛ حذف اشتباهی فایل، خرابی دیسک، یا حمله باجافزاری. در چنین لحظهای، تنها چیزی که نجاتتان میدهد یک بکاپِ تازه و قابل بازیابی است. اما بکاپ دستی، یک اشتباه انسانی ساده میتواند آن را برای همیشه به تأخیر بیندازد. راهحل استاندارد، پیادهسازی بکاپ خودکار سرور با ترکیب اسکریپتنویسی و 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 به درستی کار میکند.
بازیابی بکاپ؛ بخش فراموششده
یک بکاپ که هرگز بازیابی نشده، عملاً بیارزش است. حداقل ماهی یک بار، فرآیند بازیابی را در یک محیط تست انجام دهید. برای بازیابی فایلها:
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 را تنظیم کنید؛ فردا که اتفاقی افتاد، از خودتان تشکر خواهید کرد.