آموزش بکاپ اتوماتیک دیتابیس و فایل‌ها در لینوکس cPanel

 

 

🚀 آموزش جامع ساخت سیستم بکاپ‌گیری خودکار سایت روی گوگل درایو (سطح سرور – بدون افزونه)

اگر صاحب یک وب‌سایت هستید — چه یک فروشگاه اینترنتی، چه یک وبلاگ شخصی، چه یک پلتفرم خدماتی — احتمالاً یک بار هم که شده این سوال به ذهنتان رسیده: «اگر سرور خراب شود چه؟ اگر هک شوم چه؟ اگر یک فایل مهم به اشتباه حذف شود چه؟»

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

در این مقاله آموزشی، به‌صورت کامل و گام‌به‌گام یاد می‌گیریم که چطور یک سیستم بکاپ‌گیری حرفه‌ای، خودکار، و کاملاً رایگان روی هاست اشتراکی cPanel راه‌اندازی کنیم. این سیستم هر شب دیتابیس و فایل‌های سایت شما را آرشیو کرده و مستقیماً به Google Drive ارسال می‌کند — همه این‌ها بدون نصب هیچ افزونه‌ای روی وردپرس.

📋 فهرست مطالب

  1. چرا باید بکاپ داشته باشیم؟ (و چرا بکاپ‌های کنونی کافی نیستند)
  2. مقایسه روش‌های مختلف بکاپ‌گیری
  3. پیش‌نیازها و آماده‌سازی
  4. مرحله ۱: فعال‌سازی SSH و ورود به سرور
  5. مرحله ۲: نصب Rclone بدون دسترسی Root
  6. مرحله ۳: اتصال سرور به گوگل درایو
  7. مرحله ۴: نوشتن اسکریپت کامل بکاپ
  8. مرحله ۵: تست اسکریپت قبل از خودکارسازی
  9. مرحله ۶: اتوماسیون با Cron Job
  10. مرحله ۷: مدیریت فضا و بکاپ‌های قدیمی
  11. نکات امنیتی پیشرفته
  12. عیب‌یابی مشکلات رایج
  13. ارتقاء سیستم: بکاپ چندسایته

۱. چرا باید بکاپ داشته باشیم؟

قبل از هر چیز، بیایید با واقعیت‌هایی تلخ اما ضروری روبرو شویم. وب‌سایت‌ها در معرض تهدیدات واقعی هستند:

تهدیدات رایج برای وب‌سایت‌ها

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

آیا بکاپ‌های خود هاستینگ کافی نیستند؟

بسیاری از هاستینگ‌ها ادعا می‌کنند که روزانه بکاپ می‌گیرند. اما چند نکته مهم وجود دارد که باید بدانید:

  • بکاپ‌های هاستینگ معمولاً فقط ۷ تا ۳۰ روز نگهداری می‌شوند.
  • اگر سرور هاستینگ کلاً خراب شود، بکاپ‌های روی همان سرور هم از بین می‌روند.
  • بازگردانی بکاپ از هاستینگ معمولاً هزینه جداگانه دارد.
  • شما کنترلی روی زمان‌بندی، محتوا، یا قابلیت دسترسی به بکاپ‌ها ندارید.
⚠️ قانون ۳-۲-۱ بکاپ‌گیری: هر داده مهمی باید حداقل ۳ نسخه داشته باشد، روی ۲ نوع رسانه مختلف، که ۱ نسخه از آن‌ها خارج از محل اصلی (offsite) باشد. روشی که در این مقاله آموزش می‌دهیم دقیقاً این اصل را رعایت می‌کند.

۲. مقایسه روش‌های مختلف بکاپ‌گیری

قبل از اینکه وارد مراحل فنی شویم، بیایید ببینیم چرا روش «Rclone از طریق SSH» نسبت به روش‌های دیگر برتری دارد:

روش بکاپهزینهمصرف منابع سرورخودکارذخیره‌سازی خارجیپیچیدگی راه‌اندازی
افزونه وردپرسی (مثل UpdraftPlus)رایگان / پولی⚠️ زیاد (روی PHP)✅ (محدود در نسخه رایگان)⭐ آسان
بکاپ داخلی cPanelرایگان⚠️ متوسط✅ (محدود)❌ (همان سرور)⭐ آسان
بکاپ دستی FTPرایگان✅ کم⭐⭐ متوسط
سرویس‌های ابری پولی (مثل BlogVault)💰 ماهانه ۹ تا ۲۵ دلار✅ کم⭐ آسان
Rclone + SSH + Google Drive ✅رایگان✅ خیلی کم (Bash)✅ (Drive شخصی)⭐⭐⭐ یک‌بار، پس آسان

همانطور که می‌بینید، روش Rclone تنها روشی است که همه معیارها را برآورده می‌کند: رایگان، کم‌مصرف، خودکار، و با ذخیره‌سازی کاملاً خارج از سرور.


۳. پیش‌نیازها و آماده‌سازی

قبل از شروع، مطمئن شوید که همه این موارد را در اختیار دارید:

  • هاست cPanel — این آموزش بر اساس cPanel نوشته شده، اما منطق اصلی برای Plesk و DirectAdmin هم مشابه است.
  • دسترسی SSH — باید از هاستینگ خود این قابلیت را فعال کنید (در مرحله ۱ توضیح می‌دهیم).
  • اکانت Google — با Google Drive که حداقل ۵ گیگ فضای خالی داشته باشد (بسته به حجم سایت شما).
  • اطلاعات دیتابیس سایت — نام کاربری، رمز عبور، و نام دیتابیس MySQL (از cPanel قابل دسترسی است).
  • یک کلاینت SSH — در ویندوز: PowerShell یا PuTTY. در مک/لینوکس: ترمینال پیش‌فرض.

پیدا کردن اطلاعات دیتابیس در cPanel

اگر اطلاعات دیتابیس سایت وردپرسی خود را نمی‌دانید، روش ساده این است:

  1. وارد هاست cPanel شوید و به File Manager بروید.
  2. به پوشه public_html بروید.
  3. فایل wp-config.php را باز کنید.
  4. مقادیر DB_NAME، DB_USER، و DB_PASSWORD را پیدا کنید.
💡 نکته: Google Drive به هر اکانت Google رایگان ۱۵ گیگابایت فضا می‌دهد. اگر سایت شما بزرگ است، می‌توانید از یک اکانت Google جداگانه فقط برای بکاپ‌ها استفاده کنید، یا اشتراک Google One را با هزینه کم بخرید.

۴. مرحله ۱: فعال‌سازی SSH و ورود به سرور

SSH (Secure Shell) یک پروتکل ارتباطی رمزنگاری‌شده است که به شما اجازه می‌دهد مستقیماً با سرور خود صحبت کنید — دقیقاً مثل اینکه پشت کامپیوتر سرور نشسته‌اید و دستور تایپ می‌کنید، اما از هر جایی در دنیا.

فعال‌سازی SSH در Namecheap

  1. وارد cPanel خود شوید (معمولاً از طریق yourdomain.com/cpanel).
  2. در نوار جستجوی cPanel عبارت Shell را تایپ کنید.
  3. روی Manage Shell کلیک کنید.
  4. گزینه Enable را انتخاب کنید و تغییرات را ذخیره کنید.
🔧 اگر هاست شما Namecheap نیست: اکثر هاست‌های معتبر SSH را دارند، اما ممکن است باید از طریق تیکت پشتیبانی آن را فعال کنید. عبارت «Enable SSH access» را در پنل مدیریت هاست خود جستجو کنید.

اتصال به سرور از ویندوز

PowerShell را باز کنید و دستور زیر را اجرا کنید:

ssh username@Server_IP -p 21098

اگر از کلید SSH استفاده می‌کنید:

ssh -i "C:\Users\YourName\.ssh\id_rsa" username@Server_IP -p 21098

اگر از ویندوز ۱۰ یا ۱۱ استفاده می‌کنید، SSH به‌طور پیش‌فرض نصب است. اگر نبود، از طریق «Optional Features» در تنظیمات ویندوز، گزینه OpenSSH Client را نصب کنید.

اتصال به سرور از مک یا لینوکس

ترمینال را باز کنید:

ssh username@Server_IP -p 21098

بار اول یک سوال امنیتی می‌پرسد: Are you sure you want to continue connecting? (yes/no) — عبارت yes را تایپ کنید.

نکته: پورت پیش‌فرض SSH عدد ۲۲ است. اما هاست‌هایی مثل Namecheap از پورت 21098 استفاده می‌کنند تا امنیت بیشتری داشته باشند. اطلاعات دقیق پورت را از ایمیل خوش‌آمدگویی هاستینگ یا صفحه اطلاعات حساب cPanel پیدا کنید.

اولین قدم پس از ورود

وقتی وارد شدید، خط فرمان سرور را می‌بینید. چند دستور اولیه برای آشنایی:

# بررسی که کجا هستیم
pwd

# مشاهده فضای دیسک
df -h

# نسخه سیستم‌عامل
cat /etc/os-release

۵. مرحله ۲: نصب Rclone بدون دسترسی Root

Rclone یک ابزار خط فرمانی فوق‌العاده است که می‌تواند با بیش از ۴۰ سرویس ذخیره‌سازی ابری از جمله Google Drive، Dropbox، OneDrive، Amazon S3 و ده‌ها سرویس دیگر ارتباط برقرار کند. این ابزار در Go نوشته شده و به‌صورت یک فایل اجرایی مستقل ارائه می‌شود — یعنی نیازی به نصب پکیج‌های جانبی ندارد.

چون در هاست اشتراکی دسترسی sudo نداریم، Rclone را در پوشه شخصی خودمان نصب می‌کنیم:

# ساخت پوشه شخصی bin
mkdir -p ~/bin

# رفتن به پوشه bin
cd ~/bin

# دانلود آخرین نسخه Rclone
wget https://downloads.rclone.org/rclone-current-linux-amd64.zip

# استخراج فایل زیپ
unzip rclone-current-linux-amd64.zip

# کپی فایل اصلی به پوشه bin
cp rclone-*-linux-amd64/rclone ~/bin/

# دادن مجوز اجرا
chmod +x ~/bin/rclone

# پاک کردن فایل‌های اضافی
rm -rf rclone-*

# اضافه کردن به PATH (برای اجرا از هر جایی)
echo 'export PATH=$PATH:~/bin' >> ~/.bashrc

# فعال کردن فوری تغییرات
source ~/.bashrc

تایید موفقیت نصب

برای اطمینان از نصب صحیح، دستور زیر را اجرا کنید:

rclone --version

باید خروجی مشابه این ببینید:

rclone v1.67.0
- os/version: linux/amd64
- go version  : go1.22.3
- ...more info...
✅ اگر نسخه رکلون نمایش داده شد، نصب موفق بوده است. اگر خطای command not found دیدید، دوباره دستور source ~/.bashrc را اجرا کنید و دوباره امتحان کنید.

۶. مرحله ۳: اتصال سرور به گوگل درایو

این مرحله کمی طولانی‌تر است اما فقط یک بار انجام می‌شود. Rclone باید اجازه دسترسی به اکانت Google Drive شما را بگیرد.

شروع فرآیند پیکربندی

rclone config

منوی تعاملی Rclone باز می‌شود. مراحل را دقیقاً دنبال کنید:

  1. انتخاب عملیات: حرف n (برای New remote) را تایپ کنید و Enter بزنید.
  2. نام‌گذاری: اسمی بدهید — مثلاً gdrive — و Enter بزنید. این اسم در اسکریپت بکاپ استفاده می‌شود.
  3. انتخاب سرویس: Rclone یک لیست طولانی نشان می‌دهد. عدد مربوط به Google Drive را پیدا و وارد کنید (معمولاً ۱۸ یا ۱۹، اما نسخه‌ها فرق دارند).
  4. Client ID و Secret: هر دو را خالی بگذارید (فقط Enter بزنید). استفاده از مقادیر پیش‌فرض Rclone برای اکثر کاربران کافی است.
  5. سطح دسترسی (Scope): عدد 1 را وارد کنید (دسترسی کامل به Drive).
  6. Root Folder ID: خالی بگذارید و Enter بزنید.
  7. Service Account File: خالی بگذارید و Enter بزنید.
  8. Edit advanced config? حرف n را بزنید.
  9. Use auto config? اینجا حتماً n بزنید — چون سرور ما مرورگر ندارد و نمی‌تواند صفحه OAuth را باز کند.

احراز هویت از طریق کامپیوتر شخصی

Rclone یک دستور به شما می‌دهد که باید روی کامپیوتر شخصی خودتان (نه سرور) اجرا کنید. چیزی شبیه به این:

rclone authorize "drive" "eyJzY29wZSI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL2..."
⚠️ مهم: برای اجرای این دستور، باید Rclone را روی کامپیوتر شخصی خود هم نصب کرده باشید. از سایت rclone.org/downloads نسخه ویندوز را دانلود کنید — یک فایل exe است که نیازی به نصب ندارد.

پس از اجرای دستور روی کامپیوتر شخصی:

  1. مرورگر به‌طور خودکار باز می‌شود و صفحه ورود Google نمایش داده می‌شود.
  2. با اکانت Google مورد نظر وارد شوید.
  3. به Rclone اجازه دسترسی به Drive بدهید.
  4. در ترمینال کامپیوتر شخصی، یک توکن طولانی نمایش داده می‌شود.
  5. کل توکن (یک متن طولانی JSON که با { شروع می‌شود) را کپی کنید.
  6. در ترمینال سرور که منتظر ورودی است، آن را paste کنید و Enter بزنید.

پایان پیکربندی

Rclone می‌پرسد آیا می‌خواهید این remote را shared drive تنظیم کنید — n بزنید. سپس تایید می‌کند که remote ساخته شد. حرف q را برای خروج بزنید.

تست اتصال به Google Drive

rclone lsd gdrive:

اگر لیست پوشه‌های Drive شما نمایش داده شد، اتصال برقرار است.

rclone mkdir gdrive:MySite_Backups

این دستور یک پوشه با نام MySite_Backups در Drive شما می‌سازد.


۷. مرحله ۴: نوشتن اسکریپت کامل بکاپ

حالا به مرکزی‌ترین بخش این آموزش رسیدیم. یک اسکریپت Bash می‌نویسیم که وظایف زیر را به ترتیب انجام می‌دهد:

  1. دیتابیس MySQL را dump می‌گیرد.
  2. فایل‌های سایت را فشرده‌سازی می‌کند.
  3. هر دو فایل را به Google Drive آپلود می‌کند.
  4. فایل‌های موقت را از سرور پاک می‌کند.
  5. گزارش وضعیت را ثبت می‌کند.

فایل اسکریپت را می‌سازیم:

nano ~/backup.sh

محتوای زیر را کامل کپی و paste کنید (فقط بخش «تنظیمات» را با اطلاعات خودتان جایگزین کنید):

#!/bin/bash

# ============================================================
#   اسکریپت بکاپ‌گیری خودکار سایت - نسخه حرفه‌ای
#   نوشته‌شده برای هاست‌های اشتراکی cPanel
# ============================================================

# ======================== تنظیمات ===========================
BACKUP_DIR="/home/USERNAME/backups"       # جای ذخیره موقت بکاپ
SITE_DIR="/home/USERNAME/public_html"     # پوشه اصلی سایت
DB_USER="یوزر_دیتابیس"
DB_PASS="پسورد_دیتابیس"
DB_NAME="نام_دیتابیس"
GDRIVE_REMOTE="gdrive"                    # نام remote که در rclone config گذاشتیم
GDRIVE_PATH="MySite_Backups"              # نام پوشه در Google Drive
LOG_FILE="/home/USERNAME/backup_log.txt"  # فایل ثبت گزارش
MAX_BACKUPS=30                            # حداکثر تعداد روزهای نگهداری بکاپ
# ============================================================

# تاریخ و ساعت برای نام‌گذاری فایل‌ها
DATE=$(date +%Y-%m-%d_%H-%M)
SITE_NAME="mysite"

# نام فایل‌های بکاپ
DB_FILE="${SITE_NAME}_db_${DATE}.sql.gz"
FILES_FILE="${SITE_NAME}_files_${DATE}.tar.gz"

# شروع لاگ‌نویسی
echo "======================================" >> "$LOG_FILE"
echo "📅 شروع بکاپ: $(date)" >> "$LOG_FILE"
echo "======================================" >> "$LOG_FILE"

# ساخت پوشه موقت (اگر وجود نداشت)
mkdir -p "$BACKUP_DIR"

# ============================
# مرحله ۱: بکاپ دیتابیس
# ============================
echo "⏳ در حال بکاپ دیتابیس..." >> "$LOG_FILE"

mysqldump -u "$DB_USER" -p"$DB_PASS" "$DB_NAME" | gzip > "$BACKUP_DIR/$DB_FILE"

if [ $? -eq 0 ]; then
    DB_SIZE=$(du -sh "$BACKUP_DIR/$DB_FILE" | cut -f1)
    echo "✅ دیتابیس با موفقیت بکاپ گرفته شد. حجم: $DB_SIZE" >> "$LOG_FILE"
else
    echo "❌ خطا در بکاپ دیتابیس!" >> "$LOG_FILE"
    exit 1
fi

# ============================
# مرحله ۲: بکاپ فایل‌ها
# ============================
echo "⏳ در حال فشرده‌سازی فایل‌های سایت..." >> "$LOG_FILE"

tar -czf "$BACKUP_DIR/$FILES_FILE" \
    --exclude="$SITE_DIR/wp-content/cache" \
    --exclude="$SITE_DIR/wp-content/upgrade" \
    --exclude="$SITE_DIR/.git" \
    -C "$SITE_DIR" .

if [ $? -eq 0 ]; then
    FILES_SIZE=$(du -sh "$BACKUP_DIR/$FILES_FILE" | cut -f1)
    echo "✅ فایل‌ها با موفقیت فشرده شدند. حجم: $FILES_SIZE" >> "$LOG_FILE"
else
    echo "❌ خطا در فشرده‌سازی فایل‌ها!" >> "$LOG_FILE"
    exit 1
fi

# ============================
# مرحله ۳: آپلود به Google Drive
# ============================
echo "⏳ در حال آپلود به Google Drive..." >> "$LOG_FILE"

~/bin/rclone copy "$BACKUP_DIR/$DB_FILE" "${GDRIVE_REMOTE}:${GDRIVE_PATH}/" \
    --log-file="$LOG_FILE" --log-level INFO

~/bin/rclone copy "$BACKUP_DIR/$FILES_FILE" "${GDRIVE_REMOTE}:${GDRIVE_PATH}/" \
    --log-file="$LOG_FILE" --log-level INFO

if [ $? -eq 0 ]; then
    echo "✅ آپلود به Google Drive با موفقیت انجام شد." >> "$LOG_FILE"
else
    echo "❌ خطا در آپلود به Google Drive!" >> "$LOG_FILE"
fi

# ============================
# مرحله ۴: پاکسازی فایل‌های موقت
# ============================
echo "⏳ در حال پاکسازی فایل‌های موقت از سرور..." >> "$LOG_FILE"

rm -f "$BACKUP_DIR/$DB_FILE"
rm -f "$BACKUP_DIR/$FILES_FILE"

echo "✅ فایل‌های موقت پاک شدند." >> "$LOG_FILE"

# ============================
# پایان
# ============================
echo "🎉 بکاپ‌گیری با موفقیت تکمیل شد: $(date)" >> "$LOG_FILE"
echo "" >> "$LOG_FILE"

فایل را با Ctrl+O ذخیره کرده، سپس Ctrl+X برای خروج از nano. حالا مجوز اجرا بدهید:

chmod +x ~/backup.sh

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

چرا از gzip همراه mysqldump استفاده کردیم؟

به جای اینکه ابتدا فایل SQL بسازیم و بعد zip کنیم، مستقیماً خروجی mysqldump را از طریق pipe به gzip می‌فرستیم. این روش فضای کمتری روی سرور اشغال می‌کند و سریع‌تر است.

چرا بعضی پوشه‌ها را exclude کردیم؟

پوشه‌های cache، upgrade، و git معمولاً نیازی به بکاپ ندارند. cache کاملاً بازسازی‌پذیر است و فقط حجم بکاپ را بیهوده زیاد می‌کند.

بررسی موفقیت هر مرحله ($?):

متغیر $? در Bash مقدار خروجی آخرین دستور را نگه می‌دارد. اگر صفر باشد یعنی موفق، اگر غیر صفر باشد یعنی خطا. با این روش، اگر بکاپ دیتابیس ناموفق باشد، اسکریپت متوقف می‌شود و سعی نمی‌کند فایل ناقص را آپلود کند.


۸. مرحله ۵: تست اسکریپت قبل از خودکارسازی

قبل از اینکه اسکریپت را به Cron بسپاریم، باید مطمئن شویم که درست کار می‌کند:

bash ~/backup.sh

بعد از چند دقیقه (بسته به حجم سایت)، لاگ را بخوانید:

cat ~/backup_log.txt

و بررسی کنید که فایل‌ها در Drive آپلود شده‌اند:

~/bin/rclone ls gdrive:MySite_Backups/
✅ اگر فایل‌ها در لیست Drive دیده می‌شوند، همه چیز درست است! حالا می‌توانیم سراغ خودکارسازی برویم.

۹. مرحله ۶: اتوماسیون با Cron Job

Cron یک زمان‌بند کارهای خودکار در سیستم‌عامل‌های لینوکسی است. با Cron می‌توانید مشخص کنید یک دستور دقیقاً چه زمانی و با چه فاصله‌ای اجرا شود.

ساختار دستور Cron

هر خط Cron از ۵ بخش زمانی و یک دستور تشکیل می‌شود:

دقیقه   ساعت   روز_ماه   ماه   روز_هفته   دستور
 0       20      *         *       *       /bin/bash /home/USERNAME/backup.sh
مثال Cronمعنی
0 20 * * *هر روز ساعت ۲۰:۰۰ (۸ شب)
0 3 * * *هر روز ساعت ۳ بامداد
0 3 * * 0هر یکشنبه ساعت ۳ بامداد
0 3 1 * *اول هر ماه ساعت ۳ بامداد
0 */6 * * *هر ۶ ساعت یک‌بار

اضافه کردن Cron Job

برای بکاپ روزانه ساعت ۲۰:۰۰ به وقت سرور، این دستور را اجرا کنید (USERNAME را عوض کنید):

(crontab -l 2>/dev/null; echo "0 20 * * * /bin/bash /home/USERNAME/backup.sh > /home/USERNAME/backup_log.txt 2>&1") | crontab -

برای تایید اینکه Cron اضافه شده:

crontab -l
💡 ساعت سرور در چه زمان‌منطقه‌ای است؟ برای چک کردن: date. معمولاً سرورهای آمریکایی روی UTC یا EST هستند. اگر می‌خواهید بکاپ ساعت ۳ بامداد به وقت ایران (UTC+3.5) باشد، باید ساعت 23:30 UTC تنظیم کنید: 30 23 * * *

۱۰. مرحله ۷: مدیریت فضا و بکاپ‌های قدیمی

اگر هر روز بکاپ بگیرید و هیچ‌وقت بکاپ‌های قدیمی را پاک نکنید، بعد از چند ماه Drive شما پر می‌شود. باید سیستمی داشته باشیم که بکاپ‌های قدیمی‌تر از X روز را به‌طور خودکار حذف کند.

روش اول: استفاده از rclone delete

این دستور را به انتهای اسکریپت backup.sh اضافه کنید:

# پاک کردن بکاپ‌های قدیمی‌تر از 30 روز از Google Drive
~/bin/rclone delete "${GDRIVE_REMOTE}:${GDRIVE_PATH}/" \
    --min-age 30d \
    --log-file="$LOG_FILE"
echo "🧹 بکاپ‌های قدیمی‌تر از ۳۰ روز از Drive پاک شدند." >> "$LOG_FILE"

روش دوم: نگهداری ساختارمند

اگر می‌خواهید بکاپ‌های هفتگی را بیشتر نگه دارید اما بکاپ‌های روزانه را سریع‌تر حذف کنید، می‌توانید ساختار پوشه‌بندی بهتری داشته باشید:

# ساختار پیشنهادی در Google Drive:
MySite_Backups/
├── daily/     ← بکاپ‌های روزانه، نگهداری 7 روز
├── weekly/    ← بکاپ یکشنبه‌ها، نگهداری 4 هفته
└── monthly/   ← بکاپ اول هر ماه، نگهداری 12 ماه

برای پیاده‌سازی این ساختار، اسکریپت را به شکل زیر ارتقاء دهید:

# تعیین نوع بکاپ بر اساس روز هفته
DAY_OF_WEEK=$(date +%u)  # 1=دوشنبه ... 7=یکشنبه
DAY_OF_MONTH=$(date +%d)

if [ "$DAY_OF_MONTH" == "01" ]; then
    GDRIVE_PATH="MySite_Backups/monthly"
    RETENTION="365d"
elif [ "$DAY_OF_WEEK" == "7" ]; then
    GDRIVE_PATH="MySite_Backups/weekly"
    RETENTION="28d"
else
    GDRIVE_PATH="MySite_Backups/daily"
    RETENTION="7d"
fi

۱۱. نکات امنیتی پیشرفته

محافظت از اسکریپت با رمزنگاری

اسکریپت backup.sh شامل رمز عبور دیتابیس است. اگر کسی به هاست شما دسترسی داشته باشد، می‌تواند این فایل را بخواند. برای امنیت بیشتر، دسترسی به فایل را محدود کنید:

# فقط خودتان می‌توانید این فایل را بخوانید
chmod 700 ~/backup.sh

استفاده از فایل .my.cnf برای رمز دیتابیس

یک روش بهتر، استفاده از فایل کانفیگ MySQL است تا رمز عبور در اسکریپت ظاهر نشود:

# ساخت فایل کانفیگ MySQL
nano ~/.my.cnf

محتوا:

[mysqldump]
user=یوزر_دیتابیس
password=پسورد_دیتابیس
# دادن حداقل مجوز لازم
chmod 600 ~/.my.cnf

حالا در اسکریپت می‌توانید بدون ذکر رمز، mysqldump را صدا بزنید:

mysqldump $DB_NAME | gzip > "$BACKUP_DIR/$DB_FILE"

غیرفعال کردن SSH پس از اتمام کار

همانطور که در ابتدا گفتیم، وقتی همه چیز راه‌اندازی شد، به SSH نیازی ندارید. Cron مستقیماً روی سرور اجرا می‌شود و نیازی به اتصال خارجی ندارد.

  1. وارد cPanel شوید.
  2. به Manage Shell بروید.
  3. گزینه Disable را انتخاب کنید.
✅ این کار امنیت سرور شما را به‌شدت افزایش می‌دهد. حتی اگر کسی رمز SSH شما را داشته باشد، نمی‌تواند وارد شود.

نوتیفیکیشن ایمیل در صورت شکست بکاپ

اگر هاست شما sendmail دارد، می‌توانید در صورت شکست بکاپ، ایمیل دریافت کنید:

# اضافه کردن به انتهای اسکریپت، قبل از "پایان"
if grep -q "❌" "$LOG_FILE"; then
    echo "بکاپ سایت با خطا مواجه شد. لطفاً لاگ زیر را بررسی کنید:
$(cat $LOG_FILE)" | mail -s "⚠️ خطا در بکاپ‌گیری سایت" youremail@gmail.com
fi

۱۲. عیب‌یابی مشکلات رایج

خطادلیل احتمالیراه‌حل
rclone: command not foundPATH درست تنظیم نشدهدستور source ~/.bashrc را اجرا کنید. در اسکریپت از مسیر کامل ~/bin/rclone استفاده کنید.
mysqldump: Access deniedاطلاعات دیتابیس اشتباه استاطلاعات DB_USER، DB_PASS، DB_NAME را از فایل wp-config.php چک کنید.
Error: Token has been expiredتوکن Google Drive منقضی شدهدوباره rclone config reconnect gdrive: را اجرا کنید.
Cron اجرا نمی‌شودمسیر فایل اشتباه یا مشکل مجوزمطمئن شوید chmod +x ~/backup.sh اجرا شده. مسیرهای داخل اسکریپت را با pwd تایید کنید.
Drive پر می‌شود سریعحجم فایل‌های سایت زیاد استپوشه‌های cache، log، و media uploads قدیمی را از بکاپ فایل‌ها exclude کنید.
No space left on deviceسرور فضای کافی نداردپوشه BACKUP_DIR را روی یک مسیر با فضای کافی تنظیم کنید، یا فایل‌ها را مستقیم pipe کنید.

۱۳. ارتقاء سیستم: بکاپ چندسایته

اگر چندین سایت روی یک هاست دارید، می‌توانید با یک اسکریپت از همه آن‌ها بکاپ بگیرید:

#!/bin/bash

# ============================================================
# اسکریپت بکاپ چندسایته
# ============================================================

BACKUP_BASE="/home/USERNAME/backups"
GDRIVE_REMOTE="gdrive"
LOG_FILE="/home/USERNAME/multi_backup_log.txt"
DATE=$(date +%Y-%m-%d_%H-%M)

# تعریف سایت‌ها به صورت آرایه
# فرمت: "نام|پوشه_سایت|یوزر_دیتابیس|پسورد_دیتابیس|نام_دیتابیس"
SITES=(
    "site1|/home/USERNAME/public_html|user1|pass1|db1"
    "site2|/home/USERNAME/site2.com|user2|pass2|db2"
    "site3|/home/USERNAME/site3.com|user3|pass3|db3"
)

echo "=== شروع بکاپ چندسایته: $(date) ===" >> "$LOG_FILE"

for SITE_INFO in "${SITES[@]}"; do
    IFS='|' read -r NAME DIR DB_USER DB_PASS DB_NAME <<< "$SITE_INFO" echo "📦 بکاپ از سایت: $NAME" >> "$LOG_FILE"

    mkdir -p "$BACKUP_BASE/$NAME"

    # بکاپ دیتابیس
    mysqldump -u "$DB_USER" -p"$DB_PASS" "$DB_NAME" | \
        gzip > "$BACKUP_BASE/$NAME/${NAME}_db_${DATE}.sql.gz"

    # بکاپ فایل‌ها
    tar -czf "$BACKUP_BASE/$NAME/${NAME}_files_${DATE}.tar.gz" \
        --exclude="$DIR/wp-content/cache" \
        -C "$DIR" .

    # آپلود به Drive
    ~/bin/rclone copy "$BACKUP_BASE/$NAME/" \
        "${GDRIVE_REMOTE}:MultiSite_Backups/${NAME}/"

    # پاکسازی
    rm -rf "$BACKUP_BASE/$NAME/"

    echo "✅ $NAME: بکاپ کامل شد." >> "$LOG_FILE"
done

echo "=== پایان بکاپ چندسایته: $(date) ===" >> "$LOG_FILE"

جمع‌بندی

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

  • کاملاً رایگان است — هیچ هزینه‌ای برای ابزار یا افزونه ندارد.
  • خودکار است — هر شب بدون دخالت شما اجرا می‌شود.
  • ایمن است — بکاپ‌ها خارج از سرور، در Google Drive ذخیره می‌شوند.
  • کم‌مصرف است — اسکریپت Bash خیلی کمتر از افزونه‌های وردپرسی منابع می‌خواهد.
  • قابل توسعه است — می‌توان به‌راحتی برای چندین سایت، چندین Drive، یا ارسال ایمیل گزارش ارتقاء داد.

🛡️ نکته طلایی امنیت (قدم آخر)

تبریک می‌گوییم! سیستم بکاپ‌گیری مستقل شما فعال شد. از آنجایی که اسکریپت و زمان‌بندی (Cron) در محیط داخلی سرور کار می‌کنند، دیگر هیچ نیازی به باز بودن پورت SSH نیست. به cPanel خود برگردید و Manage Shell را مجدداً Disable (خاموش) کنید.

با این کار، دروازه‌های ورودی سرور به روی هکرها بسته می‌شود، اما سایت شما هر شب در کمال آرامش بکاپ‌های خود را به گوگل درایو ارسال می‌کند. یادتان باشد یک بار در ماه بکاپ‌ها را تست کنید — بکاپی که هرگز تست نشده، وجود ندارد!

 

پاسخی بگذارید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

7 + 7 =

واتس‌اپ مدیریت تلگرام مدیریت