بکاپگیری دستی از سرور، هم زمانبر است و هم دیر یا زود با یک فراموشی ساده منجر به از دست رفتن دادههای حیاتی میشود. اجرای اسکریپت بکاپ خودکار راهکار قطعی و فنی برای حل این مشکل است. در این فرایند، یک قطعه کد Bash بهطورکامل جایگزین نیروی انسانی میشود تا وظیفه آرشیوکردن منظم فایلها و پایگاه داده را بدون وقفه و با تمرکز بر حفظ امنیت اطلاعات برعهده بگیرد.
در این مقاله، صفر تا صد نوشتن یک اسکریپت بکاپگیری کاربردی برای سرور لینوکس را یاد میگیرید. از نحوه گرفتن خروجی (Dump) امن از دیتابیس MySQL و فشردهسازی فایلهای مهم تا زمانبندی اجرای خودکار با Cron job و ارسال اصولی بکاپها به یک فضای ابری مجزا را با هم بررسی خواهیم کرد.
فهرست مطالب
پیشنیازهای ساخت اسکریپت بکاپ خودکار

برای اینکه فرایند بکاپگیری اتوماتیک لینوکس شما به یک روتینِ بیدردسر تبدیل شود، نیاز نیست مهندس ارشد سیستم باشید، اما باید قوانین کار را رعایت کنید. قبلاز نوشتن حتی یک خط کد، این فهرست را چک کنید:
- دسترسی SSH: باید دسترسی root یا کاربری با دسترسی sudo داشته باشید تا بتوانید دستورات سیستمی را اجرا کنید.
- دانش پایه Bash: لازم نیست اسکریپتنویس حرفهای باشید، اما درکِ نحوه تعریف متغیرها و حلقهها در Bash کارتان را جلو میاندازد.
- ابزارهای ضروری: مطمئن شوید ابزارهای زیر روی سرور شما نصب هستند (که معمولاً بهصورت پیشفرض در اکثر توزیعهای لینوکس وجود دارند):
- ۱- tar: برای فشردهسازی و آرشیو فایلها
- ۲- mysqldump: ابزار استاندارد برای خروجی گرفتن از پایگاهداده MySQL/MariaDB
- ۳- cron: ابزار اصلی زمانبندی بکاپ
- ۴- rsync یا scp: برای انتقال امن بکاپها به سرور مقصد یا فضای ذخیرهسازی ابری
جدول خلاصه ابزارهای مورد نیاز
| ابزار | کاربرد در اسکریپت |
|---|---|
| tar | آرشیو کردن و فشردهسازی فایلهای سایت و تنظیمات |
| mysqldump | بکاپگیری منطقی از دیتابیسهای MySQL |
| cron | مدیریت زمانبندی اجرای خودکار اسکریپت |
| rsync | انتقال بکاپ به فضای ابری یا سرور ریموت |
چگونه پسورد را مخفی کنیم؟
بزرگترین اشتباهی که در ساخت اسکریپت خودکار سرور لینوکس میبینم، نوشتن پسورد دیتابیس بهصورت متن ساده (Plain text) داخل فایل اسکریپت است. اگر کسی به اسکریپت دسترسی پیدا کند، کلیدِ تمامِ دیتابیسهای خود را تقدیمش کردهاید. برای رعایت امنیت، از فایل .my.cnf استفاده میکنیم. یک فایل مخفی در مسیر /root/ بسازید:
nano /root/.my.cnf
سپس مشخصات را داخل آن قرار دهید:
[client]
user=root
password=YOUR_PASSWORD_HERE
حالا دسترسی فایل را محدود کنید تا فقط خودتان بتوانید آن را بخوانید:
chmod 600 /root/.my.cnf
با این روش، در زمان اجرای mysqldump دیگر نیازی به وارد کردن سوئیچِ -p و پسورد نیست؛ چون ابزار بهصورت خودکار پسورد را از این فایل امن میخواند.
در طراحی بکاپ، چه چیزهایی را ذخیره کنیم؟
اگر بخواهید از کل سرور چشمبسته کپی بگیرید، خیلی زود با هشدار پر شدن دیسک مواجه میشوید و کل فرایند متوقف میشود. بکاپگیری اصولی بهمعنای کپیکردن همهچیز نیست، بلکه هنرِ جدا کردن دادههای حیاتی از فایلهای موقت و دور ریختنی است؛ پس قبلاز اینکه وارد فاز کدنویسی اسکریپت بکاپ خودکار شویم، باید منطق کار را بچینیم و دقیقاً مشخص کنیم چه مسیری در سرور ارزش حفظ کردن دارد. بکاپ اتوماتیک فایل و دیتابیس استاندارد، باید بهینهترین حجم ممکن را داشته باشد.
مسیرهای طلایی سرور که نباید فراموش شوند
در اسکریپت بکاپ سایت جامع، باید این سه بخش اصلی را هدف قرار دهید:
- کدهای اصلی و فایلهای سایت: معمولاً در مسیرهایی مثل /var/www/html/ یا /home/user/public_html/ قرار دارند.
- فایلهای پیکربندی (Config): تنظیمات وبسرور (Nginx یا Apache) در پوشه /etc/ که برای برگرداندن سریع محیط سرور حیاتی هستند.
- پایگاه داده (Database): مهمترین بخش اطلاعات که باید کاملاً مجزا از فایلها مدیریت و اکسپورت شود.
رویکرد اختصاصی برای سایتهای وردپرسی
اگر سرور شما میزبان یک سایت وردپرسی است، نیازی به کپی کردن هسته خود وردپرس (که بهراحتی قابل دانلود است) ندارید. در بکاپ خودکار وردپرس با اسکریپت، تمرکز را روی این موارد بگذارید:
- پوشه wp-content (شامل قالب اختصاصی، افزونهها و بهخصوص پوشه uploads)
- فایل wp-config.php (حاوی اطلاعات اتصال به دیتابیس)
- خروجی کامل از دیتابیس سایت
سیاست نگهداری نسخهها (Retention Policy)
انباشت فایلهای بکاپ روی هم، یکی از دلایل اصلی ازکارافتادن سرورها است. در استانداردهای بکاپ سازمانی، ما نسخهها را تا ابد نگه نمیداریم. شما باید در اسکریپت خود قانونی تعریف کنید که مثلاً:
- نسخههای روزانه –> تا ۷ روز
- نسخههای هفتگی –> تا ۴ هفته.
- نسخههای ماهانه –> تا ۳ ماه
نگه دارد و قدیمیترها را بهصورت خودکار حذف کند.

ساخت اسکریپت بکاپ فایلها
آرشیو کردن فایلها در لینوکس با دستور قدرتمند tar انجام میشود، اما اجرای خام این دستور روی پوشه اصلی سایت، یک فایل خروجی سنگین و پر از دادههای بیمصرف به شما میدهد. در این مرحله از ساخت اسکریپت بکاپ، یاد میگیریم چطور با استفاده از ابزارهای بومی لینوکس، یک خروجی تمیز، فشرده و برچسبدار بسازیم که فقط حاوی اطلاعات ارزشمند باشد.
قدرت tar و فشردهسازی هوشمند
ما از دستور tar بههمراه سوئیچهای czvf استفاده میکنیم. حرف c برای ساخت آرشیو جدید، و حرف z برای پاس دادن فایلها به gzip جهت فشردهسازی است. استفاده از gzip (یا bzip2) حجم فایل نهایی را بهشدت کاهش میدهد که برای اسکریپت بکاپ خودکار در لینوکس یک مزیت بزرگ محسوب میشود.
فیلتر کردن زبالهها (Exclude کردن)
برای اینکه منابع سرور را هدر ندهیم، باید مسیرهای غیرضروری را از فرایند بکاپ حذف کنیم. با استفاده از پارامتر –exclude در اسکریپت bash برای بکاپ سرور، به سیستم میفهمانیم که از چه فایلهایی چشمپوشی کند.
tar -czvf /backup/archives/site-backup.tar.gz \
--exclude=/var/www/html/wp-content/cache \
--exclude=/var/www/html/tmp \
/var/www/html/
در این دستور خطبهخط مشخص کردهایم که پوشه کش و تمپ نادیده گرفتهشده و فقط محتوای اصلی سایت فشرده شود.
مهر زمان (Timestamp) برای مدیریت نسخهها
اگر نام فایل بکاپ همیشه site-backup.tar.gz باشد، هر روز فایل جدید روی فایل دیروزی بازنویسی (Overwrite) میشود و عملاً نسخههای قبلی را از دست میدهید. برای جلوگیری از این فاجعه، باید از متغیر زمان در نامگذاری فایل استفاده کنیم:
# تعریف متغیر تاریخ با فرمت سال-ماه-روز
DATE=$(date +"%Y-%m-%d_%H-%M")
# ساخت فایل بکاپ با نام اختصاصی همان لحظه
tar -czvf /backup/archives/site-backup-$DATE.tar.gz /var/www/html/
با این تکنیک ساده، خروجی شما نامی شبیه به site-backup-2026-05-20_02-30.tar.gz خواهد داشت که مدیریت و بازیابی آن را فوقالعاده راحت میکند.
ساخت اسکریپت بکاپ دیتابیس
یکی از اشتباهات رایج تازهکارها این است که فکر میکنند با کپیکردن مستقیم پوشه /var/lib/mysql/ میتوانند از دیتابیس هم مثل عکسها و کدهای سایت فایل فشرده بسازند. اما کپیکردن فایلهای دیتابیسی که در همان لحظه درحال خواندن و نوشتن اطلاعات است، در ۹۰ درصد مواقع نتیجهای جز یک دیتابیسِ خراب (Corrupted) در زمان بازیابی نخواهد داشت. به همین دلیل است که بکاپ دیتابیس باید کاملاً مجزا از فایلهای سایت مدیریت شود.
ما برای پایگاه داده به یک کپی منطقی نیاز داریم؛ یعنی ابزاری که تمام جداول و ردیفها را بهصورت زنده بخواند و آنها را به دستورات استاندارد SQL تبدیل کند تا هر زمان که لازم بود، دوباره روی سرور اجرا شوند.
معرفی mysqldump برای خروجی ایمن

ابزار mysqldump دقیقاً همین کار را میکند و مطمئنترین راهکار برای بکاپ گیری خودکار MySQL با Shell Script محسوب میشود. در بخش پیشنیازها گفتیم که برای جلوگیری از لو رفتن رمز عبور، آن را در فایل مخفی .my.cnf ذخیره کنید. با فرض رعایت آن نکته امنیتی، دستور پایه برای گرفتن خروجی به شکل زیر است:
mysqldump db_name > /backup/archives/db-backup-$DATE.sql
اما ازآنجاکه فایلهای خام SQL معمولاً حجم بسیار بالایی دارند، بهتر است در همان لحظه خروجی را با استفاده از gzip فشرده کنیم تا فضای هارد بیدلیل اشغال نشود:
mysqldump db_name | gzip > /backup/archives/db-backup-$DATE.sql.gz
تکنیکهای حرفهای در خروجیگرفتن از MySQL
در اسکریپت بکاپ خودکار سرور، نیازهای پروژهها همیشه یکسان نیست. بسته به معماری بکاپ سرور لینوکس خود، میتوانید رفتار mysqldump را با سوئیچهای کاربردی زیر شخصیسازی کنید:
- بکاپ از تمام دیتابیسها —> اگر روی سرور چندین سایت دارید، سوئیچ –all-databases کل پایگاههای داده را بهصورت یکجا برایتان خروجی میگیرد.
- بکاپ از چند دیتابیس مشخص —> با استفاده از سوئیچ –databases db1 db2 میتوانید فقط دیتابیسهای حیاتی را جدا و از بقیه چشمپوشی کنید.
- بکاپ از ساختار (بدون دادهها) —> گاهی برای انتقال محیط سایت به سرور تست، فقط به جداول و ستونها نیاز دارید و اطلاعات کاربران یا مقالات را نمیخواهید. سوئیچ –no-data حجم خروجی را به چند کیلوبایت کاهش میدهد و فقط ساختار را کپی میکند.
- بکاپ از دادهها (بدون ساختار) —> در نقطه مقابل، سوئیچ –no-create-info جداول را نادیده میگیرد و فقط رکوردهای ثبتشده (Insertها) را در فایل نهایی ذخیره میکند.
نمونه اسکریپت کامل Bash برای تجمیع فرایندها
تا اینجای کار منطق بکاپگیری از فایلها و دیتابیس را بهصورت جداگانه بررسی کردیم. حالا وقت آن است که تمام این تکهها را مثل پازل کنار هم بگذاریم و یک اسکریپت bash کامل برای بکاپ سرور خلق کنیم که به معنای واقعی کلمه، تمام کارها را با یک کلیک یا یک دستور خودکار انجام دهد. این قطعه کد، یک نمونه استاندارد و همهفنحریف است. مسیرهای مشخصشده را میسازد، فایلها و دیتابیس را فشرده و تفکیک میکند، روی آنها برچسب تاریخ میزند و وضعیت اجرای هر مرحله را در یک فایل لاگ ثبت میکند تا بعداً بتوانید عملکردش را ارزیابی کنید.
کد یکپارچه اسکریپت بکاپ خودکار
کد زیر را کپی کنید و در یک فایل با نام backup.sh (مثلاً در مسیر /backup/scripts/backup.sh) ذخیره کنید:
#!/bin/bash
# ۱. تعریف متغیرها و تنظیم مسیرها
BACKUP_DIR="/backup/archives"
SOURCE_DIR="/var/www/html"
DB_NAME="my_database_name"
DATE=$(date +"%Y-%m-%d_%H-%M")
LOG_FILE="/var/log/backup.log"
# شروع فرایند و ثبت در لاگ
echo "--- شروع عملیات بکاپگیری در تاریخ $DATE ---" >> $LOG_FILE
# ۲. ساخت پوشه ذخیرهسازی در صورت عدم وجود
if [ ! -dir "$BACKUP_DIR" ]; then
mkdir -p "$BACKUP_DIR"
echo "پوشه بکاپ ساخته شد: $BACKUP_DIR" >> $LOG_FILE
fi
# ۳. بکاپگیری و فشردهسازی فایلهای سایت
echo "در حال فشردهسازی فایلهای سایت..." >> $LOG_FILE
tar -czvf $BACKUP_DIR/site-$DATE.tar.gz --exclude=$SOURCE_DIR/wp-content/cache $SOURCE_DIR >> $LOG_FILE 2>&1
if [ $? -eq 0 ]; then
echo "بکاپ فایلها با موفقیت انجام شد." >> $LOG_FILE
else
echo "خطا در بکاپ فایلها!" >> $LOG_FILE
fi
# ۴. بکاپگیری منطقی از دیتابیس MySQL
echo "در حال خروجیگرفتن از دیتابیس..." >> $LOG_FILE
mysqldump $DB_NAME | gzip > $BACKUP_DIR/db-$DATE.sql.gz 2>> $LOG_FILE
if [ $? -eq 0 ]; then
echo "بکاپ دیتابیس با موفقیت انجام شد." >> $LOG_FILE
else
echo "خطا در بکاپ دیتابیس!" >> $LOG_FILE
fi
# پایان عملیات
echo "--- پایان عملیات بکاپگیری در $DATE ---" >> $LOG_FILE
echo "===========================================" >> $LOG_FILE
کالبدشکافی و توضیح خطبهخط اسکریپت
برای اینکه بدانید زیر پوست این اسکریپت چه میگذرد، بخشهای کلیدی آن را خیلی کوتاه مرور میکنیم:
- خط اول (#!/bin/bash): به لینوکس میگوید که این فایل باید توسط مفسرِ Bash اجرا شود.
- بخش تعریف متغیرها: تمام مسیرها و نام دیتابیس را بالا آوردیم تا اگر روزی خواستید مسیرها را عوض کنید، نیازی به شخم زدن کل کد نباشد و فقط همین چند خط اول را تغییر دهید.
- شرط if [ ! -dir … ]: بررسی میکند که آیا پوشه مقصد وجود دارد یا نه. اگر نباشد، خودش دستبهکار میشود و آن را میسازد تا اسکریپت بهخاطر نبودن پوشه متوقف نشود.
- ساختار >> $LOG_FILE 2>&1: تمام خروجیهای متنی و حتی خطاهای احتمالی دستورات را بهجای نمایش در ترمینال، درون فایل لاگ میریزد تا ردپای عملیات حفظ شود.
- متغیر $?: یک متغیر سیستمی لینوکس است که وضعیت آخرین دستور اجراشده را نشان میدهد. عدد 0 یعنی عملیات موفق بوده و هر عددی غیر از آن، نشانه بروز خطا است که ما از آن برای هوشمندسازی لاگها استفاده کردهایم.
chmod +x /backup/scripts/backup.sh
حالا میتوانید با دستور /backup/scripts/backup.sh/. آن را بهصورت دستی تست کنید.
بکاپ اتوماتیک و زمانبندی با Cron
تا اینجای کار، ما یک اسکریپت همهفنحریف نوشتهایم؛ اما اگر قرار باشد هر شب ساعت ۳ بامداد کامپیوتر را روشن کنیم و به سرور SSH بزنیم تا این اسکریپت را دستی اجرا کنیم، عملاً هیچ کار خاصی نکردهایم! روحِ اصلی بکاپ گیری اتوماتیک لینوکس در ابزاری به نام Cron است.
ابزار Cron یک دیمون (Daemon) یا پردازش پسزمینه در لینوکس است که وظیفه دارد دستورات یا اسکریپتهای شما را در زمانها، روزها و ساعتهای کاملاً مشخص و بدون یک ثانیه تأخیر اجرا کند. هر خط دستوری که در این ابزار تنظیم میشود را یک cron job مینامند.
نحوه ساخت cron job برای بکاپ روزانه
برای اینکه اسکریپت بکاپ را زمانبندی کنیم، باید فایل تنظیمات کرونتاب (Crontab) مربوط به کاربر روت را ویرایش کنیم. دستور زیر را در ترمینال وارد کنید:
crontab -e
حالا کافی است ساختار استاندارد زمانبندی کرون را در انتهای فایل بازشده اضافه کنیم. ساختار پنجستاره کرون به این صورت است: [دقیقه] [ساعت] [روزِ ماه] [ماه] [روزِ هفته] [مسیر اسکریپت].
برای اینکه سیستم شما هر شب راس ساعت ۰۲:۳۰ بامداد (که معمولاً ترافیک سایت و بار پردازشی سرور در کمترین حالت است) بهصورت خودکار بکاپ بگیرد، این خط را اضافه و ذخیره کنید:
30 2 * * * /backup/scripts/backup.sh
نمونههای رایج زمانبندی برای سناریوهای مختلف
بسته به میزان تغییرات دادههایتان، میتوانید فرکانس اجرای ساخت cron job برای بکاپ روزانه را تغییر دهید:
- هر شب ساعت ۱ بامداد —-> 0 1 * * * /backup/scripts/backup.sh
- هر هفته (بامداد یکشنبه ساعت ۳) —-> 0 3 * * 0 /backup/scripts/backup.sh
- هر ۱۲ ساعت یکبار (پیکربندی دیتابیسهای مهم) —-> 0 */12 * * * /backup/scripts/backup.sh
ارسال بکاپ به فضای دیگر؛ قانون طلایی ۳-۲-۱
یک حقیقت تلخ در دنیای میزبانی وب وجود دارد و آن هم این است که: «بکاپی که روی خود سرور اصلی نگهداری میشود، بکاپ نیست؛ فقط یک کپی موقت است!» اگر هارد سرور بسوزد، سیستمعامل کرش کند یا دسترسی به شبکه سرور بههردلیلی قطع شود، فایلهای بکاپ شما هم همراه با سایت اصلی نابود خواهند شد.
در مهندسی زیرساخت و بکاپ سازمانی، قانونی به نام ۳-۲-۱ وجود دارد که ریسک از دست رفتن داده را تقریباً به صفر میرساند:
- ۳ نسخه از دادهها داشته باشید (نسخه اصلی + ۲ نسخه پشتیبان)
- بکاپها را روی ۲ نوع رسانه یا دیسک مختلف نگهداری کنید.
- ۱ نسخه از بکاپها را کاملاً خارج از دیتاسنتر اصلی (بهصورت ریموت یا در فضای ابری) ذخیره کنید.
روشهای انتقال؛ rsync در برابر scp
برای خارج کردن فایل بکاپ از سرور و ارسال بکاپ به فضای ابری یا یک سرور دیگر، دو ابزار استاندارد لینوکسی وجود دارد:
- ابزار scp: برای کپیکردنهای ساده و خطی مناسب است، اما هوشمند نیست و هربار کل فایل را از ابتدا ارسال میکند.
- ابزار rsync: بهترین برای همگامسازی فایل در لینوکس است. این ابزار فقط تغییرات (Delta) را تشخیص میدهد و منتقل میکند، قابلیت فشردهسازی درحین انتقال دارد و اگر ارتباط قطع شود، قابلیت ادامهدهی دارد.
یک نمونه دستور برای انتقال امن با rsync به سرور ریموت:
rsync -avz /backup/archives/ user@remote_server_ip:/remote/backup/dir/
چالش زیرساخت و راهکار حرفهای بکاپ ابری
پیادهسازی سناریوهای بالا (نوشتن اسکریپت، مدیریت فایل .my.cnf، راهاندازی سرور مجزا برای مقصد بکاپ، کانفیگ کلیدهای SSH برای انتقال بدون پسورد rsync و…) نهتنها زمانبر است، بلکه نگهداری و مانیتورینگ صِرف همین سرور دوم، هزینههای زیرساخت شما را دو برابر میکند. برای همین این روزها مفهوم بکاپ ابری خودکار مطرح شده است.
اگر به دنبال بهترین سرور ابری میگردید که تمام این چالشهای فنی را از دوش شما بردارد، زیرساخت ابری ابر فردوسی ابزارهای اتوماسیون قدرتمندی را در اختیارتان میگذارد. در سرورهای ابری نسل جدید ابر فردوسی (که مجهز به پردازندههای پرچمدار Intel Xeon و AMD EPYC و درایوهای فوقسریع NVMe هستند)، شما به دو ویژگی حیاتی دسترسی دارید که فرایند بکاپگیری را کاملاً دگرگون میکنند:
۱. کلید API و اتوماسیون هوشمند:
شما میتوانید بدون درگیرشدن با کدهای پیچیده لینوکس، چرخه پشتیبانگیری اطلاعات، کنترل ورودی/خروجیها و حتی تغییر خودکار متناسب با نیاز لحظهای منابع را ازطریق API مدیریت کنید.
۲. پرداخت براساس مصرف:
برای داشتن سرور بکاپ دائمی نیازی به پرداخت هزینههای سنگین ماهانه ندارید؛ میتوانید سرور را فقط برای ساعتهای خاصی روشن کنید، بکاپ را به فضایی کاملاً ایزوله با منابع اختصاصی منتقل کنید و پساز خاموشی، هزینهای بابت CPU و RAM نپردازید. علاوهبر این، ۱۰۰ هزارتومان اعتبار رایگان ثبتنام و تضمین بازگشت وجه، خیالتان را بابت کیفیت کاملاً راحت میکند.
امنیت بکاپها و پیشگیری از تهدید
یک جمله معروف بین متخصصان امنیت وجود دارد که میگوید: بکاپِ ناامن، هدیه ویژهای است که خودتان برای هکرها بستهبندی کردهاید! وقتی شما یک اسکریپت bash برای بکاپ سرور مینویسید و تمام فایلها، کدهای منبع، اطلاعات مشتریان و دیتابیس را یکجا جمع و فشرده میکنید، عملاً کار مهاجم را راحت کردهاید. اگر این فایل لو برود، او دیگر نیازی به نفوذ به بخشهای مختلف سرور ندارد؛ همهچیز در یک فایل زیپ به او تقدیمشده است!
پس اگر دادههای شما مهم هستند، پشتیبانگیری بدون امنیت کافی، خودش یک ریسک بزرگ امنیتی است. در این بخش یاد میگیریم چطور دیوارهای امنیتی را دور فایلهای پشتیبانمان محکم کنیم.
لایههای امنیتی در نگهداری بکاپها

برای بهحداقل رساندن ریسک نشت اطلاعات، این ۴ لایه امنیتی را مستقیماً در استراتژی بکاپ سازمانی خود اعمال کنید:
۱- محدودسازی سطح دسترسی فایلها:
فایلهای بکاپ نباید برای سایر کاربران سرور قابل خواندن باشند. بلافاصله پساز ایجاد فایل بکاپ در اسکریپت، با دستور chmod 600 دسترسی آن را طوری تنظیم کنید که فقط مالک فایل (کاربر روت) بتواند آن را بخواند یا تغییر دهد.
۲- رمزنگاری بکاپها (Encryption):
اگر دادههای شما حاوی اطلاعات حساس (مانند تراکنشهای مالی یا رمز عبور کاربران) است به فشردهسازی ساده با tar اکتفا نکنید. با ابزارهایی مثل gpg یا openssl فایل خروجی را رمزنگاری کنید تا حتی درصورت سرقت فایل، بدون کلید رمزنگاری غیرقابل استفاده باشد.
۳- نگهداری امن اطلاعات اتصال دیتابیس:
همانطورکه در بخش پیشنیازها پیادهسازی کردیم، بههیچوجه اطلاعات کاربری دیتابیس را بهصورت مستقیم درون اسکریپت ننویسید و همیشه از سازوکار فایلهای مجزای امن مثل .my.cnf استفاده کنید.
۴- توزیع جغرافیایی و ذخیره در مکانهای متعدد:
نگهداری همزمان نسخهها روی دیتاسنترهای مختلف (مثلاً توزیع بین دیتاسنترهای داخل و خارج از کشور)، ریسک نابودی اطلاعات بر اثر حوادث فیزیکی یا مشکلات شبکه یک دیتاسنتر خاص را به صفر میرساند.
تست بازیابی بکاپ؛ چرا Restore مهمتر از Backup است؟
بگذارید یک تضاد بزرگ را با هم مرور کنیم: ارزش واقعی یک سیستم بکاپ، به فرایند پشتیبانگیری آن نیست؛ بلکه به فرایند بازیابی (Restore) آن است. یعنی شما زمانی میتوانید ادعا کنید سیستم بکاپ سالمی دارید که بتوانید بدون از دست رفتن حتی یک رکورد، سایتِ نابودشده را دوباره زنده کنید.
بسیاری از مدیران سایتها ماهها با خیال راحت لاگهای موفقیتآمیز اسکریپت بکاپ سایت خود را تماشا میکنند، اما روزی که سرور کرش میکند و تمایل به بازگردانی اطلاعات دارند، تازه متوجه میشوند که فایل خروجی بهدلیل یک خطای کوچک پکیجبندی، ناقص (Corrupted) بوده است.
چکلیست و مراحل تست بازگردانی اطلاعات

برای اینکه در زمان بحران غافلگیر نشوید، فرایند تست بازیابی را به یک عادت ماهانه یا هفتگی تبدیل کنید و این سه فاکتور را بسنجید:
- تست در محیط کاملاً ایزوله (Staging): هیچوقت فایلهای بکاپ را روی سرور اصلی و زنده (یا Production) تست نکنید. یک سرور ابری کوچک و موقت بسازید، فایلها و دیتابیس را آنجا بازگردانی کنید و مطمئن شوید سایت بدون خطا بالا میآید.
- کنترل اندازه و حجم فایل (File Size): اسکریپت مانیتورینگ شما باید حجم فایلهای بکاپ را بررسی کند. اگر حجم بکاپ دیتابیس شما همیشه حدود ۵۰۰ مگابایت بوده و امروز ناگهان به ۵ مگابایت رسیده، این یک سیگنال خطر جدی است که نشان میدهد دیتابیس خالی یا ناقص Dump شده است.
- بررسی سلامت آرشیو (Integrity Check): قبلاز اطمینان به فایل فشرده، با سوئیچ t در ابزار tar (مانند tar -tvf backup.tar.gz) بدون بازکردن کامل فایل، سلامت ساختار داخلی آن را بررسی کنید تا مطمئن شوید فایل در طول فرایند فشردهسازی آسیب ندیده است.
خطاهای رایج اسکریپت بکاپ خودکار در لینوکس و راهکار رفع آنها
حتی اگر تمام مراحل قبلی را موبهمو و بادقت انجام داده باشید، بازهم ممکن است به مرور زمان با توقف فرایند بکاپگیری اتوماتیک لینوکس مواجه شوید. در مدیریت سیستمعاملها، تغییرات ناگهانی دسترسیها، پر شدن منابع یا اشتباهات کوچک در سینتکس کدهای بش، سناریوهای رایجی هستند که میتوانند کل فرایند را مختل کنند.
برای اینکه در زمان وقوع مشکل وقت خود را در فرومهای اینترنتی هدر ندهید، بیایید ۵ خطای رایج و کلیدی که عیبیابی اسکریپت بکاپ خودکار در لینوکس را پوشش میدهند، باهم بررسی کنیم.
پر شدن فضای دیسک سرور
همانطورکه در مقاله اشاره داشتیم، بزرگترین خطایی که گریبانگیر مدیران سرور میشود، ذخیره مداوم فایلها بدون داشتن یک سیستم پاکسازی است. اگر اسکریپت شما حجم هارد را مدیریت نکند، سرور پساز چند ماه بهدلیل اتمام فضا کرش خواهد کرد.
راهکار رفع خطا: برای حل این چالش، باید از ابزار قدرتمند find کمک بگیریم. دستور زیر را به انتهای اسکریپت اصلی خود اضافه کنید تا فایلهای بکاپ قدیمیتر از ۳۰ روز را بهصورت خودکار شناسایی و حذف کند:
find /backup/archives/ -type f -name "*.tar.gz" -mtime +30 -exec rm {} \;
چالش عدم تطابق مسیرها و متغیرهای محیطی
گاهی اوقات اسکریپت بهصورت دستی عالی کار میکند، اما وقتی توسط Cron اجرا میشود، خروجی تولید نمیکند. دلیل آن این است که Cron از محیط متغیرهای مسیر (PATH) کاربری شما استفاده نمیکند و ابزارهایی مثل tar یا mysqldump را نمیشناسد.
راهکار رفع خطا: همیشه در اسکریپتهای خود از مسیر کامل (Absolute Path) دستورات لینوکس استفاده کنید؛ مثلاً بهجای mysqldump بنویسید /usr/bin/mysqldump و بهجای tar از /bin/tar استفاده کنید.
دسترسی نداشتن کرونجاب به فایلها (Permission Denied)
اگر فایل اسکریپت شما دسترسی اجرای سیستمی نداشته باشد، لایه Cron نمیتواند آن را فراخوانی کند و لاگهای شما خالی میمانند.
راهکار رفع خطا: حتماً با اجرای دستور chmod +x /backup/scripts/backup.sh مجوز اجرای فایل را صادر کنید و مطمئن شوید که کرونجاب را تحت کاربری ایجاد کردهاید که به مسیر کدهای سایت دسترسی خواندن دارد.
جدول خلاصه خطاهای رایج اسکریپت بکاپ و رفع آنها
| نوع خطا | علت اصلی بروز مشکل | راهکار و ابزار رفع خطا |
|---|---|---|
| پر شدن فضای هارد | عدم تعریف سیاست نگهداری (Retention) | تزریق دستور find با پارامتر -mtime برای حذف خودکار |
| خطای Command not found | عدم شناسایی مسیر ابزارها توسط Cron | استفاده از مسیر مطلق ابزارها مثل /usr/bin/mysqldump |
| خطای Permission Denied | نداشتن مجوز اجرای فایل اسکریپت | اعطای دسترسی به فایل با فرمان chmod +x |
| امنیت پایین و نشت اطلاعات | هاردکد کردن رمز در بدنه اصلی اسکریپت | انتقال مشخصات روت به فایل مخفی و امن /root/.my.cnf |
| بکاپ ناقص یا خراب | فشردهسازی در حین تغییر زنده فایلها | پیادهسازی چکلیست و تست دوره ای فرایند Restore |
جمعبندی
راهاندازی اسکریپت بکاپ خودکار مطمئن، کاری فراتر از کپی کردن چند خط کد ساده از اینترنت است. همانطورکه در این مقاله قدمبهقدم با هم جلو آمدیم، یک فرایند پشتیبانگیری استاندارد، زنجیرهای متصل از طراحی درست، اتوماسیون با Cron، فشردهسازی بهینه فایلها و تفکیک دیتابیس است. اگر بخواهیم چکیده رویکردهای بکاپ را در چند اصل خلاصه کنیم، باید به یاد داشته باشید که:
- یک اسکریپت خوب باید همزمان لایه فایلها و پایگاه داده را بهصورت تفکیکشده پوشش دهد.
- زمانبندی باید در ساعات مرده و کمترافیک شبانهروز تنظیم شود.
- براساس قانون ۳-۲-۱، نگهداری نسخهها روی همان سرور اصلی کافی نیست و انتقال داده به یک فضای بیرونی یا بکاپ ابری خودکار، ضامن بقای کسبوکار شما در روزهای بحران است.
- و در نهایت، سیستمی که تست بازیابی (Restore) روی آن انجام نشده باشد، قابلاعتماد نخواهد بود.
آیا شما هم تابهحال تجربه تلخ از دست رفتن اطلاعات سرور به خاطر نداشتن بکاپ را داشتهاید؟ درحال حاضر برای سیستمهای خود از چه استراتژی یا ابزاری جهت اتوماسیون استفاده میکنید؟ نظرات و چالشهای فنی خود را در بخش دیدگاهها با ما به اشتراک بگذارید تا باهم آنها را عیبیابی کنیم.
منابع:
man7 | crontab.5 | devart | stackoverflow | backup-mysql-database | stackscale | huntress | digitalocean | uschamber | oneuptime
سؤالات متداول
مهمترین نکات آموزش ساخت اسکریپت برای بکاپ خودکار چه چیزهایی هستند؟
کلیدیترین نکات شامل تفکیک فرایند بکاپ فایل از دیتابیس، استفاده از متغیر زمان ($DATE) در نامگذاری فایلها برای جلوگیری از بازنویسی، ذخیره نکردن رمز عبور بهصورت خام در اسکریپت و حتماً اتوماتیککردن حذف نسخههای قدیمی به کمک دستور find است تا هارد سرور پر نشود.
تفاوت بکاپ فایلها و بکاپ دیتابیس چیست و چرا باید جدا مدیریت شوند؟
فایلهای سایت (مثل عکسها و کدهای PHP) ایستا یا نیمهایستا هستند و کپی مستقیم آنها با tar مشکلی ایجاد نمیکند؛ اما دیتابیس دائم درحال خواندن و نوشتن (I/O زنده) است. کپی کدهای دیتابیس بدون ابزار اختصاصی مثل mysqldump باعث خراب شدن جداول میشود. به همین دلیل پایگاه داده باید کاملاً مجزا و در قالب دستورات ساختاریافته SQL خروجی گرفته شود.
چطور فایلها یا مسیرهای غیرضروری (مثل کش) را از بکاپ لینوکس حذف کنم؟
هنگام استفاده از دستور tar کافی است از سوئیچ –exclude استفاده کنید. برای مثال با دستور tar -czvf backup.tar.gz –exclude=/path/to/cache /path/to/site به سیستم فرمان میدهید که پوشه کش را نادیده بگیرد تا حجم اسکریپت بکاپ سایت شما بهینه باقی بماند.
چطور رمز دیتابیس را داخل اسکریپت لینوکس امن نگه دارم؟
بزرگترین اشتباه، نوشتن پسورد روتِ MySQL در بدنه اصلی اسکریپت است. راهکار استاندارد این است که اطلاعات اتصال را درون یک فایل متنی مخفی به نام .my.cnf در دایرکتوری /root/ قرار دهید و دسترسی آن را با دستور chmod 600 قفل کنید تا ابزار mysqldump رمز را بهصورت خودکار و امن از آنجا بخواند.
بهترین زمان برای زمانبندی و اجرای cron job چه ساعاتی است؟
ساعاتی که سرور در کمترین میزان ترافیک ورودی و بار پردازشی (Load) قرار دارد؛ معمولاً بین ساعت ۲ تا ۴ بامداد بهترین زمان برای اجرای ساخت cron job برای بکاپ روزانه است تا فرایند فشردهسازی بر سرعت لود سایت کاربران تأثیر منفی نگذارد.
آیا نگهداری فایل پشتیبان روی همان سرور اصلی کافی است؟
بههیچوجه. اگر هارد سرور بسوزد، سیستمعامل کرش کند یا دیتاسنتر دچار مشکل شبکه شود، نسخههای پشتیبان نیز همراه با سایت اصلی از دست خواهند رفت. طبق قانون استاندارد ۳-۲-۱، حداقل باید یک نسخه خارج از سرور اصلی و در یک بکاپ ابری خودکار یا سرور ریموت نگهداری شود.
چطور بکاپهای قدیمی را بهصورت خودکار حذف کنیم تا هارد سرور پر نشود؟
با استفاده از ابزار find در لینوکس. کافی است دستور زیر را به اسکریپت خود اضافه کنید تا فایلهای با پسوند مشخص که بیشتر از ۳۰ روز از عمرشان گذشته، خودکار حذف شوند:
find /path/ -type f -name “*.tar.gz” -mtime +30 -exec rm {} \;
چطور مطمئن شویم که فایل بکاپ واقعاً سالم و قابل بازیابی است؟
تنها راه واقعی، تست دورهای فرایند بازیابی اطلاعات در یک محیط ایزوله و جداگانه (Staging) است. بااینحال، میتوانید قبلاز بازیابی، با ابزار کرون حجم فایلها را مانیتور کنید تا کاهش ناگهانی و مشکوک در حجم آرشیوها (نشانه بکاپ ناقص) را سریعاً متوجه شوید.

