بکاپ فایل‌های سرور با rsync و cron

rsync فقط تفاوت فایل‌ها را کپی می‌کند و برای بکاپ افزایشی سریع‌ترین ابزار است. با گزینهٔ --link-dest می‌توانید هر روز یک نسخهٔ کامل ببینید در حالی که فضای بسیار کمی مصرف می‌شود.

SSH و انتقال فایلمتوسط10 دقیقه

۱بکاپ ساده به پوشهٔ دیگر

-a همهٔ ویژگی‌ها را حفظ می‌کند. اسلش انتهای مبدأ مهم است: با اسلش محتوای پوشه و بدون آن خود پوشه کپی می‌شود.

bash
rsync -avh --progress /var/www/ /backup/www/
rsync -avh --dry-run /var/www/ /backup/www/   # فقط نمایش، بدون کپی

۲بکاپ روی سرور راه دور با SSH

با کلید SSH بدون رمز. --delete فایل‌هایی که در مبدأ حذف شده‌اند را در مقصد هم حذف می‌کند تا نسخهٔ دقیق داشته باشید.

bash
rsync -az --delete -e "ssh -i ~/.ssh/backup_key" /var/www/ backup@203.0.113.20:/srv/backups/www/

--delete خطرناک است اگر مسیر مقصد را اشتباه بنویسید. همیشه ابتدا با --dry-run تست کنید.

۳بکاپ با تاریخ و صرفه‌جویی در فضا (--link-dest)

هر روز پوشهٔ جدیدی می‌سازد که فایل‌های تغییرنکرده را hard-link می‌کند؛ پس هر نسخه کامل است ولی فضای ناچیزی مصرف می‌کند.

bash
#!/usr/bin/env bash
set -euo pipefail
SRC="/var/www/"
DEST="/backup/www"
TODAY=$(date +%F)
LATEST="$DEST/latest"

mkdir -p "$DEST"
rsync -a --delete --link-dest="$LATEST" "$SRC" "$DEST/$TODAY/"
ln -sfn "$DEST/$TODAY" "$LATEST"

# حذف نسخه‌های قدیمی‌تر از ۳۰ روز
find "$DEST" -maxdepth 1 -type d -name '20*' -mtime +30 -exec rm -rf {} +

۴کلید SSH مخصوص بکاپ با دسترسی محدود

برای امنیت، روی سرور بکاپ کلید را طوری محدود کنید که فقط rsync اجازه داشته باشد. خط زیر را در authorized_keys سرور مقصد بنویسید.

bash
# در ~/.ssh/authorized_keys سرور بکاپ (یک خط)
command="rsync --server --sender -vlogDtprze.iLsfxC . /var/www/",no-pty,no-agent-forwarding,no-port-forwarding ssh-ed25519 AAAA... backup-key

این گزینه پیشرفته است؛ در آغاز می‌توانید فقط از یک کلید مخصوص بکاپ بدون این محدودیت استفاده کنید.

۵زمان‌بندی با cron

هر شب ساعت ۲:۳۰ اجرا شود و لاگ بنویسد.

bash
sudo crontab -e

30 2 * * * /usr/local/bin/backup-www.sh >> /var/log/backup-www.log 2>&1

۶ریستور فایل‌ها

برای بازگرداندن، جهت rsync را برعکس کنید. برای یک فایل مشخص:

bash
rsync -avh /backup/www/2026-09-28/site/uploads/ /var/www/site/uploads/

# از سرور راه دور
rsync -avz backup@203.0.113.20:/srv/backups/www/latest/ /var/www/

۷بررسی سلامت بکاپ

مقایسهٔ مبدأ و مقصد بدون کپی (فایل‌های متفاوت را فهرست می‌کند):

bash
rsync -rcn --out-format="%n" /var/www/ /backup/www/latest/ | head

پرسش‌های پرتکرار دربارهٔ بکاپ فایل‌های سرور با rsync و cron

rsync بهتر است یا tar؟

برای بکاپ افزایشی و مقایسه rsync بهتر است. tar برای ساخت یک آرشیو واحد قابل انتقال و نگه‌داری بلندمدت مناسب‌تر است. ترکیب رایج: rsync به‌صورت روزانه و یک tar ماهانه.