🚀 آموزش جامع ساخت سیستم بکاپگیری خودکار سایت روی گوگل درایو (سطح سرور – بدون افزونه)
اگر صاحب یک وبسایت هستید — چه یک فروشگاه اینترنتی، چه یک وبلاگ شخصی، چه یک پلتفرم خدماتی — احتمالاً یک بار هم که شده این سوال به ذهنتان رسیده: «اگر سرور خراب شود چه؟ اگر هک شوم چه؟ اگر یک فایل مهم به اشتباه حذف شود چه؟»
پاسخ درست به این سوالها در یک کلمه خلاصه میشود: بکاپ. اما نه بکاپهای دستی که هفتهها فراموش میشوند. بکاپهایی که هر شب، بهطور خودکار، بدون نیاز به هیچ دخالت انسانی، اجرا میشوند و در یک مکان امن خارج از سرور ذخیره میشوند.
در این مقاله آموزشی، بهصورت کامل و گامبهگام یاد میگیریم که چطور یک سیستم بکاپگیری حرفهای، خودکار، و کاملاً رایگان روی هاست اشتراکی cPanel راهاندازی کنیم. این سیستم هر شب دیتابیس و فایلهای سایت شما را آرشیو کرده و مستقیماً به Google Drive ارسال میکند — همه اینها بدون نصب هیچ افزونهای روی وردپرس.
📋 فهرست مطالب
- چرا باید بکاپ داشته باشیم؟ (و چرا بکاپهای کنونی کافی نیستند)
- مقایسه روشهای مختلف بکاپگیری
- پیشنیازها و آمادهسازی
- مرحله ۱: فعالسازی SSH و ورود به سرور
- مرحله ۲: نصب Rclone بدون دسترسی Root
- مرحله ۳: اتصال سرور به گوگل درایو
- مرحله ۴: نوشتن اسکریپت کامل بکاپ
- مرحله ۵: تست اسکریپت قبل از خودکارسازی
- مرحله ۶: اتوماسیون با Cron Job
- مرحله ۷: مدیریت فضا و بکاپهای قدیمی
- نکات امنیتی پیشرفته
- عیبیابی مشکلات رایج
- ارتقاء سیستم: بکاپ چندسایته
۱. چرا باید بکاپ داشته باشیم؟
قبل از هر چیز، بیایید با واقعیتهایی تلخ اما ضروری روبرو شویم. وبسایتها در معرض تهدیدات واقعی هستند:
تهدیدات رایج برای وبسایتها
- حملات بدافزار و باجافزار: هکرها روزانه هزاران سایت وردپرسی را اسکن میکنند تا آسیبپذیریهای قدیمی را پیدا کنند. یک پلاگین قدیمینشده کافیست.
- خطاهای انسانی: یک اشتباه ساده در پنل مدیریت، مثل حذف تصادفی یک پوشه یا ویرایش اشتباه دیتابیس، میتواند ساعتها یا روزها محتوا را از بین ببرد.
- خرابی سرور هاستینگ: شرکتهای هاستینگ هم گاهی دچار مشکل میشوند. خرابی هارددیسک، اشتباهات سیستمی، یا حتی ورشکستگی شرکت هاستینگ — همه اینها احتمال دارند.
- بهروزرسانیهای ناموفق: بهروزرسانی وردپرس، قالب، یا افزونه گاهی سایت را کاملاً خراب میکند.
- انقضای هاست: اگر یادتان برود اشتراک هاست را تمدید کنید، هاستینگها معمولاً پس از چند هفته اطلاعات را پاک میکنند.
آیا بکاپهای خود هاستینگ کافی نیستند؟
بسیاری از هاستینگها ادعا میکنند که روزانه بکاپ میگیرند. اما چند نکته مهم وجود دارد که باید بدانید:
- بکاپهای هاستینگ معمولاً فقط ۷ تا ۳۰ روز نگهداری میشوند.
- اگر سرور هاستینگ کلاً خراب شود، بکاپهای روی همان سرور هم از بین میروند.
- بازگردانی بکاپ از هاستینگ معمولاً هزینه جداگانه دارد.
- شما کنترلی روی زمانبندی، محتوا، یا قابلیت دسترسی به بکاپها ندارید.
۲. مقایسه روشهای مختلف بکاپگیری
قبل از اینکه وارد مراحل فنی شویم، بیایید ببینیم چرا روش «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
اگر اطلاعات دیتابیس سایت وردپرسی خود را نمیدانید، روش ساده این است:
- وارد هاست cPanel شوید و به File Manager بروید.
- به پوشه public_html بروید.
- فایل wp-config.php را باز کنید.
- مقادیر
DB_NAME،DB_USER، وDB_PASSWORDرا پیدا کنید.
۴. مرحله ۱: فعالسازی SSH و ورود به سرور
SSH (Secure Shell) یک پروتکل ارتباطی رمزنگاریشده است که به شما اجازه میدهد مستقیماً با سرور خود صحبت کنید — دقیقاً مثل اینکه پشت کامپیوتر سرور نشستهاید و دستور تایپ میکنید، اما از هر جایی در دنیا.
فعالسازی SSH در Namecheap
- وارد cPanel خود شوید (معمولاً از طریق
yourdomain.com/cpanel). - در نوار جستجوی cPanel عبارت Shell را تایپ کنید.
- روی Manage Shell کلیک کنید.
- گزینه Enable را انتخاب کنید و تغییرات را ذخیره کنید.
اتصال به سرور از ویندوز
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 را تایپ کنید.
اولین قدم پس از ورود
وقتی وارد شدید، خط فرمان سرور را میبینید. چند دستور اولیه برای آشنایی:
# بررسی که کجا هستیم
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 باز میشود. مراحل را دقیقاً دنبال کنید:
- انتخاب عملیات: حرف n (برای New remote) را تایپ کنید و Enter بزنید.
- نامگذاری: اسمی بدهید — مثلاً
gdrive— و Enter بزنید. این اسم در اسکریپت بکاپ استفاده میشود. - انتخاب سرویس: Rclone یک لیست طولانی نشان میدهد. عدد مربوط به Google Drive را پیدا و وارد کنید (معمولاً ۱۸ یا ۱۹، اما نسخهها فرق دارند).
- Client ID و Secret: هر دو را خالی بگذارید (فقط Enter بزنید). استفاده از مقادیر پیشفرض Rclone برای اکثر کاربران کافی است.
- سطح دسترسی (Scope): عدد 1 را وارد کنید (دسترسی کامل به Drive).
- Root Folder ID: خالی بگذارید و Enter بزنید.
- Service Account File: خالی بگذارید و Enter بزنید.
- Edit advanced config? حرف n را بزنید.
- Use auto config? اینجا حتماً n بزنید — چون سرور ما مرورگر ندارد و نمیتواند صفحه OAuth را باز کند.
احراز هویت از طریق کامپیوتر شخصی
Rclone یک دستور به شما میدهد که باید روی کامپیوتر شخصی خودتان (نه سرور) اجرا کنید. چیزی شبیه به این:
rclone authorize "drive" "eyJzY29wZSI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL2..."rclone.org/downloads نسخه ویندوز را دانلود کنید — یک فایل exe است که نیازی به نصب ندارد.پس از اجرای دستور روی کامپیوتر شخصی:
- مرورگر بهطور خودکار باز میشود و صفحه ورود Google نمایش داده میشود.
- با اکانت Google مورد نظر وارد شوید.
- به Rclone اجازه دسترسی به Drive بدهید.
- در ترمینال کامپیوتر شخصی، یک توکن طولانی نمایش داده میشود.
- کل توکن (یک متن طولانی JSON که با
{شروع میشود) را کپی کنید. - در ترمینال سرور که منتظر ورودی است، آن را paste کنید و Enter بزنید.
پایان پیکربندی
Rclone میپرسد آیا میخواهید این remote را shared drive تنظیم کنید — n بزنید. سپس تایید میکند که remote ساخته شد. حرف q را برای خروج بزنید.
تست اتصال به Google Drive
rclone lsd gdrive:اگر لیست پوشههای Drive شما نمایش داده شد، اتصال برقرار است.
rclone mkdir gdrive:MySite_Backupsاین دستور یک پوشه با نام MySite_Backups در Drive شما میسازد.
۷. مرحله ۴: نوشتن اسکریپت کامل بکاپ
حالا به مرکزیترین بخش این آموزش رسیدیم. یک اسکریپت Bash مینویسیم که وظایف زیر را به ترتیب انجام میدهد:
- دیتابیس MySQL را dump میگیرد.
- فایلهای سایت را فشردهسازی میکند.
- هر دو فایل را به Google Drive آپلود میکند.
- فایلهای موقت را از سرور پاک میکند.
- گزارش وضعیت را ثبت میکند.
فایل اسکریپت را میسازیم:
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/۹. مرحله ۶: اتوماسیون با 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 -ldate. معمولاً سرورهای آمریکایی روی 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 مستقیماً روی سرور اجرا میشود و نیازی به اتصال خارجی ندارد.
- وارد cPanel شوید.
- به Manage Shell بروید.
- گزینه Disable را انتخاب کنید.
نوتیفیکیشن ایمیل در صورت شکست بکاپ
اگر هاست شما sendmail دارد، میتوانید در صورت شکست بکاپ، ایمیل دریافت کنید:
# اضافه کردن به انتهای اسکریپت، قبل از "پایان"
if grep -q "❌" "$LOG_FILE"; then
echo "بکاپ سایت با خطا مواجه شد. لطفاً لاگ زیر را بررسی کنید:
$(cat $LOG_FILE)" | mail -s "⚠️ خطا در بکاپگیری سایت" youremail@gmail.com
fi۱۲. عیبیابی مشکلات رایج
| خطا | دلیل احتمالی | راهحل |
|---|---|---|
rclone: command not found | PATH درست تنظیم نشده | دستور 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 (خاموش) کنید.
با این کار، دروازههای ورودی سرور به روی هکرها بسته میشود، اما سایت شما هر شب در کمال آرامش بکاپهای خود را به گوگل درایو ارسال میکند. یادتان باشد یک بار در ماه بکاپها را تست کنید — بکاپی که هرگز تست نشده، وجود ندارد!
