بهترين روش بکاپ گرفتن از سرور مجازی از همان روز اول راه اندازی VPS بايد اجرا شود، چون يک اشتباه ساده يا يک مشکل ناگهانی می تواند همه فايل ها و اطلاعات شما را از بين ببرد. حتی اگر بهترين تنظيمات امنيتی را هم انجام داده باشيد، باز هم احتمال خطا وجود دارد؛ از پاک شدن اشتباهی فايل ها گرفته تا آپديت خراب، مشکل ديتابيس، حمله بدافزار، يا حتی قطعی و خرابی ديسک. برای همين، بکاپ گرفتن از سرور مجازی فقط يک کار جانبی نيست، بلکه مهم ترين بيمه برای سايت و داده های شماست.
در اين مقاله از وبلاگ یونیکس وب قرار است قدم به قدم بهترين روش بکاپ گرفتن از سرور مجازی را اجرايی و ساده جلو ببريم. اول مشخص می کنيم دقيقا چه چيزهايی را بايد بکاپ بگيريد، بعد چند روش کاربردی برای بکاپ گرفتن از سرور مجازی معرفی می کنيم؛ از روش های ساده و سريع تا پشتيبان گيری خودکار از سرور مجازی با زمان بندی و نگهداری چند نسخه. در طول راه هم نکات مهمی مثل امنيت بکاپ، محل نگهداری، و تست بازگردانی را می گوييم تا بکاپ شما واقعا در روز بحران به درد بخورد، نه اينکه فقط يک فايل بلااستفاده باشد؛ پس تا انتهای این مقاله با ما همراه باشید.
چرا بکاپ برای سرور مجازی حياتی است؟
اگر فقط يک بار اطلاعات از دست رفته را تجربه کرده باشيد، می فهميد که بکاپ گرفتن از سرور مجازی چقدر مهم است. روی VPS همه چيز دست شماست؛ هم قدرت بيشتر داريد، هم مسئوليت بيشتر. يک آپديت اشتباه، يک پاک کردن ناخواسته، پر شدن ديسک، خراب شدن ديتابيس، يا حتی حمله بدافزار می تواند کل سرويس را از کار بيندازد. در اين شرايط، تنها چيزی که می تواند سريع شما را به حالت عادی برگرداند، يک بکاپ سالم و قابل ريستور است.
به همين دليل، بهترين روش بکاپ گرفتن از سرور مجازی فقط اين نيست که هر چند وقت يک بار يک فايل zip بگيريد و تمام. بايد يک برنامه مشخص داشته باشيد: چه چيزهايی را بکاپ می گيريد، هر چند وقت يک بار، چند نسخه نگه می داريد، کجا ذخيره می کنيد، و مهم تر از همه چطور تست می کنيد که ريستور واقعا کار می کند. پشتيبان گيری خودکار از سرور مجازی دقيقا برای همين ساخته شده تا بکاپ منظم و قابل اعتماد باشد، نه وابسته به يادآوری شما.
در ادامه، اول مشخص می کنيم دقيقا چه بخش هايی را بايد بکاپ بگيريد تا بکاپ VPS لينوکس شما کامل باشد.
چه چيزهايی را بايد از سرور مجازی بکاپ بگيريم؟

برای اينکه بهترين روش بکاپ گرفتن از سرور مجازی واقعا به درد بخورد، بايد بدانيد چه داده هايی اگر از دست بروند، سرويس شما زمين می خورد. اکثر کاربران فقط از فايل های سايت بکاپ می گيرند و ديتابيس يا تنظيمات را فراموش می کنند. اينجا يک چک ليست کامل برای بکاپ گرفتن از سرور مجازی است:
۱) فايل های اصلی سايت يا پروژه
اگر وب سايت داريد (وردپرس، لاراول، يا هر CMS ديگر)، مهم ترين بخش همين فايل هاست:
- پوشه پروژه يا سايت (مثلا /var/www/…)
- پوشه uploads و media
- فايل های config مربوط به برنامه
۲) ديتابيس
تقريبا همه سايت ها به ديتابيس وابسته هستند. اگر ديتابيس را از دست بدهيد، حتی اگر فايل ها باشند، سايت درست بالا نمی آيد.
- MySQL / MariaDB
- PostgreSQL
۳) فايل های تنظيمات سرور
اين بخش در زمان ريستور نجاتتان می دهد، چون لازم نيست از صفر همه چيز را دوباره تنظيم کنيد:
- تنظيمات وب سرور: Nginx يا Apache
- تنظيمات PHP (اگر استفاده می کنيد)
- تنظيمات SSL و فايل های گواهی
- تنظيمات کرون ها (cron jobs)
- فايل های سرويس ها (systemd)
۴) کاربران و دسترسی ها (در حد ضروری)
معمولا نياز نيست کل سيستم را ايميج بگيريد، اما اين موارد کمک می کنند سريع برگرديد:
- ليست کاربران مهم و دسترسی sudo
- کليدهای SSH و authorized_keys (اگر مديريتی نگه می داريد)
۵) فايل های مهم سيستمی و داده های جانبی
بسته به سرويس شما:
- پوشه های داده مثل /opt/ يا /srv/
- فايل های log مهم (اگر برای گزارش يا امنيت نگه می داريد)
بکاپ را کجا نگه داريم که واقعا امن باشد؟
يکی از اشتباه های رايج اين است که بکاپ را روی همان سرور مجازی نگه می دارند. اين کار از نظر امنيتی و عملياتی خطرناک است؛ چون اگر سرور هک شود، ديسک خراب شود، يا اشتباهی پوشه ها پاک شود، بکاپ هم همراهش از بين می رود. پس برای بکاپ گرفتن از سرور مجازی يک قانون ساده را يادتان بماند: بکاپ بايد خارج از VPS و روی يک مقصد جدا نگهداری شود.
قانون طلايی ۳-۲-۱ برای بکاپ
اگر دنبال بهترين روش بکاپ گرفتن از سرور مجازی هستيد، اين قانون را اجرا کنيد:
- ۳ نسخه از داده داشته باشيد (اصل + ۲ بکاپ)
- روی ۲ نوع محل ذخيره (مثلا سرور دوم + فضای ابری يا هاست دانلود)
- ۱ نسخه خارج از سرور اصلی و ترجيحا در يک لوکيشن جدا
اين قانون ساده، بهترين راهکار برای جلوگيری از نابودی اطلاعات در زمان بحران است.
مقصدهای قابل اجرا برای کاربران ايرانی
اينجا چند گزينه واقعی و قابل انجام برای پشتيبان گيری خودکار از سرور مجازی را می گويم. شما می توانيد يک مورد را انتخاب کنيد يا برای اطمينان، دو مقصد داشته باشيد.
گزينه ۱: يک سرور دوم (VPS دوم) برای نگهداری بکاپ
اين روش ساده و خيلی مطمئن است: بکاپ ها را با SFTP يا rsync به يک سرور ديگر می فرستيد.
مزيت ها:
- کنترل کامل دست شماست
- تحريم و محدوديت کمتر
- سرعت انتقال معمولا خوب است
مناسب برای: سايت های جدی، فروشگاهی، يا هر چيزی که نمی خواهيد ريسک کنيد.
گزينه ۲: هاست دانلود يا فضای ذخيره سازی جدا
اگر بکاپ های شما حجم بالاست يا می خواهيد هزينه کمتر شود، نگهداری بکاپ روی يک فضای ذخيره سازی جدا بسيار کاربردی است.
مزيت ها:
- مناسب برای بکاپ های حجيم
- ساده برای مديريت فايل ها
- برای کاربر ايرانی معمولا دردسر کمتری نسبت به سرويس های خارجی دارد
مناسب برای: بکاپ روزانه يا هفتگی فايل های سايت، آرشيوها، و بکاپ های حجيم.
گزينه ۳: فضای ابری S3 سازگار يا Object Storage
اگر سرويسی داريد که S3 compatible است، با ابزارهايی مثل rclone می توانيد بکاپ را رمزنگاری شده و خودکار آپلود کنيد.
مزيت ها:
- بکاپ منظم و قابل اسکیل
- مناسب برای نگهداری چند نسخه
- قابل اتوماسيون و گزارش گيری
مناسب برای: زمانی که می خواهيد بکاپ حرفه ای و افزايشی داشته باشيد.
گزينه ۴: دانلود دوره ای روی کامپيوتر شخصی (فقط برای پروژه های کوچک)
اين روش برای سايت های مهم توصيه نمی شود، ولی برای پروژه های سبک يا تمرينی بد نيست.
مشکلش اين است که منظم نيست و به يادآوری شما وابسته می ماند.
نکته مهم: بکاپ را در همان مسير پروژه نگه نداريد
اگر مثلا سايت شما در /var/www/site است، بکاپ را داخل همان پوشه نريزيد. چون ممکن است با يک دستور پاک سازی يا يک مشکل دسترسی، هم سايت و هم بکاپ نابود شود. برای بکاپ VPS لينوکس بهتر است موقتا در مسيری مثل /backup بسازيد و بعد انتقال دهيد.
روش ۱: بکاپ ساده و سريع از سرور مجازی (فايل ها + ديتابيس)
اين روش برای شروع عالی است و پايه اصلی بکاپ گرفتن از سرور مجازی را به شما می دهد. ما دو خروجی می گيريم:
- بکاپ فايل های سايت
- بکاپ ديتابيس
بعد هم هر دو را در يک پوشه مشخص نگه می داريم تا آماده انتقال شود.
قدم ۱: ساخت پوشه بکاپ روی سرور
sudo mkdir -p /backup
sudo chmod 700 /backup
قدم ۲: بکاپ گرفتن از فايل های سايت با tar
فرض می کنم پروژه شما داخل /var/www/site است. مسير را با مسير واقعی خودتان عوض کنيد.
sudo tar -czf /backup/site-files-$(date +%F).tar.gz /var/www/site
نکته: اگر چند سايت داريد، می توانيد از کل /var/www بکاپ بگيريد، ولی حجم بالا می رود.
قدم ۳: بکاپ گرفتن از ديتابيس (MySQL / MariaDB)
اگر ديتابيس شما MySQL يا MariaDB است، بهترين روش سريع اين است:
sudo mysqldump --single-transaction --quick --lock-tables=false -u DB_USER -p DB_NAME > /backup/db-$(date +%F).sql
بعد برای کم شدن حجم، فشرده سازی کنيد:
sudo gzip /backup/db-$(date +%F).sql
اگر چند ديتابيس داريد:
sudo mysqldump -u DB_USER -p --all-databases > /backup/all-db-$(date +%F).sql
sudo gzip /backup/all-db-$(date +%F).sql
اگر ديتابيس شما PostgreSQL است
sudo -u postgres pg_dump DB_NAME > /backup/pg-db-$(date +%F).sql
sudo gzip /backup/pg-db-$(date +%F).sql
برای مشاهده همه گزينه های mysqldump و گرفتن بکاپ بهتر از ديتابيس های بزرگ، مستندات رسمی mysqldump مرجع اصلی است.
قدم ۴: چک کردن حجم و اطمينان از ساخته شدن بکاپ
sudo ls -lh /backup
در اين مرحله شما يک بکاپ ساده داريد. اما هنوز بهترين روش بکاپ گرفتن از سرور مجازی کامل نشده، چون:
- بکاپ هنوز خارج از VPS منتقل نشده
- زمان بندی خودکار ندارد
- نگهداری چند نسخه (retention) ندارد
- تست ريستور انجام نشده
در بخش بعدی، همين روش را خودکار می کنيم: يک اسکریپت می نويسيم که بکاپ VPS لينوکس را هر روز بگيرد، چند نسخه نگه دارد، و بکاپ های قديمی را پاک کند.
روش ۲: پشتيبان گيری خودکار از سرور مجازی با اسکریپت و cron (به همراه نگهداری چند نسخه)
اينجا يک اسکریپت می سازيم که هر روز بکاپ گرفتن از سرور مجازی را انجام دهد، فايل و ديتابيس را خروجی بگيرد، لاگ بنويسد، و فقط مثلا ۱۴ نسخه آخر را نگه دارد.
قدم ۱: ساخت پوشه ها (بکاپ و لاگ)
sudo mkdir -p /backup/files /backup/db /backup/logs
sudo chmod 700 /backup
قدم ۲: ساخت فايل اسکریپت بکاپ
sudo nano /usr/local/bin/vps-backup.sh
اين کد را کامل داخل فايل قرار بدهید (مسير سايت و اطلاعات ديتابيس را عوض کنید):
#!/bin/bash
set -e
# ====== تنظيمات قابل تغيير ======
SITE_PATH="/var/www/site"
DB_TYPE="mysql" # mysql يا postgres
DB_NAME="DB_NAME"
DB_USER="DB_USER"
DB_PASS="DB_PASS"
RETENTION_DAYS=14 # تعداد روزهای نگهداری بکاپ
HOSTNAME_TAG=$(hostname)
DATE_TAG=$(date +%F)
BACKUP_BASE="/backup"
FILES_DIR="${BACKUP_BASE}/files"
DB_DIR="${BACKUP_BASE}/db"
LOG_DIR="${BACKUP_BASE}/logs"
LOG_FILE="${LOG_DIR}/backup-${DATE_TAG}.log"
# ===============================
echo "---- Backup started: ${DATE_TAG} ----" | tee -a "${LOG_FILE}"
# بکاپ فايل ها
FILES_OUT="${FILES_DIR}/${HOSTNAME_TAG}-files-${DATE_TAG}.tar.gz"
echo "[1/2] Backing up files from ${SITE_PATH} ..." | tee -a "${LOG_FILE}"
tar -czf "${FILES_OUT}" "${SITE_PATH}" 2>>"${LOG_FILE}"
echo "Files backup created: ${FILES_OUT}" | tee -a "${LOG_FILE}"
# بکاپ ديتابيس
if [ "${DB_TYPE}" = "mysql" ]; then
DB_OUT="${DB_DIR}/${HOSTNAME_TAG}-db-${DATE_TAG}.sql.gz"
echo "[2/2] Backing up MySQL/MariaDB database ${DB_NAME} ..." | tee -a "${LOG_FILE}"
mysqldump --single-transaction --quick --lock-tables=false -u "${DB_USER}" -p"${DB_PASS}" "${DB_NAME}" 2>>"${LOG_FILE}" | gzip > "${DB_OUT}"
echo "DB backup created: ${DB_OUT}" | tee -a "${LOG_FILE}"
elif [ "${DB_TYPE}" = "postgres" ]; then
DB_OUT="${DB_DIR}/${HOSTNAME_TAG}-pg-${DATE_TAG}.sql.gz"
echo "[2/2] Backing up PostgreSQL database ${DB_NAME} ..." | tee -a "${LOG_FILE}"
sudo -u postgres pg_dump "${DB_NAME}" 2>>"${LOG_FILE}" | gzip > "${DB_OUT}"
echo "DB backup created: ${DB_OUT}" | tee -a "${LOG_FILE}"
else
echo "DB_TYPE is not valid. Use mysql or postgres." | tee -a "${LOG_FILE}"
exit 1
fi
# پاک سازی بکاپ های قديمی (retention)
echo "Cleaning backups older than ${RETENTION_DAYS} days ..." | tee -a "${LOG_FILE}"
find "${FILES_DIR}" -type f -mtime +${RETENTION_DAYS} -name "*.tar.gz" -delete
find "${DB_DIR}" -type f -mtime +${RETENTION_DAYS} -name "*.gz" -delete
find "${LOG_DIR}" -type f -mtime +${RETENTION_DAYS} -name "*.log" -delete
echo "Backup finished successfully." | tee -a "${LOG_FILE}" قدم ۳: دادن دسترسی اجرا به اسکریپت
sudo chmod +x /usr/local/bin/vps-backup.sh
قدم ۴: اجرای تست دستی
قبل از خودکار کردن، يک بار دستی اجرا کنید تا مطمئن شویید همه چيز درست است:
sudo /usr/local/bin/vps-backup.sh
sudo ls -lh /backup/files
sudo ls -lh /backup/db
sudo tail -n 50 /backup/logs/backup-$(date +%F).log
اگر اين مرحله بدون خطا انجام شد، شما الان يک سورس درست برای بهترين روش بکاپ گرفتن از سرور مجازی دارید.
قدم ۵: زمان بندی با cron (بکاپ خودکار هر روز)
کرون روت را باز کنید:
sudo crontab -e
اين خط را اضافه کنید تا هر روز ساعت ۳:۳۰ صبح بکاپ بگيرد:
۳۰ ۳ * * * /usr/local/bin/vps-backup.sh
برای اطمينان از فعال بودن cron:
sudo systemctl status cron
از اينجا به بعد، پشتيبان گيری خودکار از سرور مجازی فعال است و هر روز بکاپ گرفتن از سرور مجازی انجام می شود.
اگر می خواهيد زمان بندی را دقيق تر تنظيم کنيد (مثلا هفتگی يا فقط روزهای خاص)، راهنمای رسمی cron نمونه های کاربردی ارائه می کند.
در بخش بعدی می رويم سراغ مهم ترين قسمت برای امنيت: انتقال بکاپ به مقصد جدا (مثلا سرور دوم يا هاست دانلود) تا بکاپ روی همان VPS نماند و واقعا امن باشد.
روش ۳: انتقال خودکار بکاپ به مقصد جدا (سرویس های قابل انجام برای کاربران ايرانی)
در اين بخش ۳ روش آموزش می دهیم که واقعا برای کاربر ايرانی قابل انجام است. شما می توانيد فقط يکی را انتخاب کنيد.
گزينه A: انتقال بکاپ به يک سرور دوم با rsync (پیشنهادی و ساده)
اين روش هم سريع است هم حرفه ای و برای بکاپ VPS لينوکس عالی جواب می دهد.
قدم ۱: ساخت کاربر بکاپ روی سرور مقصد
روی سرور مقصد (سرور بکاپ):
sudo adduser backupuser
sudo mkdir -p /home/backupuser/backups
sudo chown -R backupuser:backupuser /home/backupuser/backups
قدم ۲: ساخت SSH Key مخصوص بکاپ روی سرور اصلی
روی سرور اصلی (همان VPS که بکاپ می گيرد):
sudo ssh-keygen -t ed25519 -f /root/.ssh/backup_key -N ""
کلید را روی سرور مقصد اضافه کنید:
sudo ssh-copy-id -i /root/.ssh/backup_key.pub backupuser@IP_BACKUP_SERVER
قدم ۳: دستور انتقال با rsync
sudo rsync -avz -e "ssh -i /root/.ssh/backup_key" /backup/ backupuser@IP_BACKUP_SERVER:/home/backupuser/backups/$(hostname)/
اگر اين دستور درست کار کرد، برای خودکار کردن اقدام می کنیم.
قدم ۴: اضافه کردن انتقال به اسکریپت بکاپ
فايل اسکریپت را باز کنید:
sudo nano /usr/local/bin/vps-backup.sh
آخر اسکریپت (قبل از echo آخر) اين بخش را اضافه کنید:
# انتقال بکاپ به سرور مقصد
BACKUP_TARGET_USER="backupuser"
BACKUP_TARGET_IP="IP_BACKUP_SERVER"
BACKUP_TARGET_DIR="/home/backupuser/backups/${HOSTNAME_TAG}"
echo "Transferring backups to remote server ..." | tee -a "${LOG_FILE}"
rsync -avz -e "ssh -i /root/.ssh/backup_key" "${BACKUP_BASE}/" "${BACKUP_TARGET_USER}@${BACKUP_TARGET_IP}:${BACKUP_TARGET_DIR}/" 2>>"${LOG_FILE}"
echo "Transfer completed." | tee -a "${LOG_FILE}" از اين به بعد، پشتيبان گيری خودکار از سرور مجازی هم انجام می شود و هم خارج از VPS ذخيره می شود.
گزينه B: انتقال بکاپ به هاست دانلود (روش ساده با SFTP)
اين روش برای کاربران ايرانی خيلی کاربردی است چون با SFTP ساده انجام می شود و نياز به سرويس های گذر از تحريم و VPN ندارد.
قدم ۱: ساخت يک فولدر برای بکاپ روی مقصد
فرض کنید اطلاعات SFTP دارید و يک مسير مثل /backups وجود دارد.
قدم ۲: نصب ابزار lftp برای آپلود خودکار
روی سرور اصلی:
sudo apt -y install lftp
قدم ۳: آپلود پوشه بکاپ با lftp (SFTP)
lftp -e "set sftp:auto-confirm yes; mirror -R /backup /backups/$(hostname); bye" -u "SFTP_USER,SFTP_PASS" sftp://SFTP_HOST
اگر درست بود، می توانید اين دستور را آخر اسکریپت بکاپ اضافه کنید تا هر روز بعد از ساخت بکاپ، آپلود هم انجام شود.
گزينه C: انتقال بکاپ به فضای Object Storage با rclone (حرفه ای و امن)
اگر مقصد شما S3 compatible است، rclone بهترين گزينه است چون:
- می تواند رمزنگاری کند
- انتقال را اتومات و قابل گزارش می کند
- برای نگهداری چند نسخه عالی است
جمع بندی – بهترین روش پشتیبان گیری از VPS
بهترين روش بکاپ گرفتن از سرور مجازی زمانی قابل اعتماد است که چهار اصل را هم زمان پوشش دهد: تهيه بکاپ منظم از فايل ها و ديتابيس، زمان بندی خودکار، نگهداری چند نسخه و انتقال بکاپ به مقصدی جدا از VPS. در اين مقاله ابتدا مشخص شد چه داده هايی بايد پشتيبان گيری شوند، سپس روش بکاپ دستی و در ادامه پشتيبان گيری خودکار از سرور مجازی با اسکریپت و cron آموزش داده شد. در نهايت، روش های انتقال بکاپ به يک مقصد جدا (مانند سرور دوم يا فضای ذخيره سازی مستقل) ارائه شد تا بکاپ در برابر خرابی ديسک، خطای انسانی و حملات احتمالی مقاوم باشد.
برای اجرايی کردن اين راهکارها، کافی است يک برنامه ساده اما ثابت داشته باشيد: بکاپ روزانه يا هفتگی (متناسب با حساسيت داده)، نگهداری نسخه های اخير (مثلا ۷ تا ۱۴ روز) و ذخيره سازی خارج از سرور اصلی. با انجام اين موارد، بکاپ گرفتن از سرور مجازی به يک فرآيند قابل اتکا تبديل می شود و ريسک از دست رفتن اطلاعات به شکل محسوسی کاهش پيدا می کند.
در صورتی که قصد داريد اين فرآيند را متناسب با نوع سرويس خود (سايت وردپرس، لاراول، چند سايت روی يک VPS يا سرورهای پرترافيک) بهينه سازی کنيد، بهتر است مقصد بکاپ، حجم داده و فاصله زمانی پشتيبان گيری بر اساس نياز واقعی تنظيم شود.






