Skip to content
VDS · बैकअप और डिस्क

rsync से बैकअप

SSH के ज़रिए दूसरे सर्वर पर फ़ाइल कॉपी कैसे सेट करें, हार्ड लिंक से वर्ज़न हिस्ट्री बनाएँ, और खतरनाक --delete विकल्प से ज़्यादा न मिटाएँ।

23 अगस्त 2026 को अपडेट किया गया

rsync कॉपी बनाने का सबसे आसान और काम करने वाला तरीका है: यह हर जगह उपलब्ध है, फ़ाइलों के सिर्फ़ बदले हुए हिस्से ट्रांसफ़र करता है, और SSH पर काम करता है। छोटे डेटासेट के लिए यह काफ़ी है।

बेसिक कमांड

rsync -avz --delete \
  -e "ssh -i /root/.ssh/backup_key -p 22" \
  /var/www/ backup@backup.example.com:/srv/backup/vds/www/

फ़्लैग्स की जानकारी:

  • -a — permissions, owners, times और links सुरक्षित रखता है;
  • -v — दिखाता है कि क्या हो रहा है;
  • -z — ट्रांसफ़र के दौरान कंप्रेस करता है (500 Mbps तक की बैंडविड्थ पर फ़ायदेमंद है, अगर डेटा बहुत ज़्यादा हो);
  • --delete — रिसीवर पर वह हटा देता है जो सोर्स पर अब नहीं है।

सोर्स पाथ के अंत में स्लैश का मतलब है "डायरेक्टरी की सामग्री"; इसके बिना डायरेक्टरी खुद कॉपी होती है। /var/www/ और /var/www अलग-अलग नतीजे देते हैं, और --delete के साथ यही फ़र्क़ गलत चीज़ मिटा देता है। हमेशा पहले --dry-run के साथ चलाएँ।

rsync -avzn --delete /var/www/ backup@backup.example.com:/srv/backup/vds/www/

-n फ़्लैग dry run है।

बिना पासवर्ड वाली एक्सेस की

शेड्यूल पर कॉपी करने के लिए बिना पासवर्ड डाले लॉगिन करना पड़ता है:

ssh-keygen -t ed25519 -f /root/.ssh/backup_key -N ""
ssh-copy-id -i /root/.ssh/backup_key.pub backup@backup.example.com

रिसीवर पर इस की को सिर्फ़ एक कमांड तक सीमित कर दें — तब चोरी हुई की से शेल नहीं मिलेगा। रिसीवर की ~/.ssh/authorized_keys में:

command="rrsync -wo /srv/backup",restrict ssh-ed25519 AAAA... backup

हार्ड लिंक के साथ वर्ज़न हिस्ट्री

सादा rsync सिर्फ़ मौजूदा स्थिति रखता है: अगर आपने कल कोई फ़ाइल हटाई और आज ध्यान आया, तो उसे वापस लाने की कोई जगह नहीं है। --link-dest आपको हिस्ट्री देता है: बदली न हुई फ़ाइलें दोबारा कॉपी नहीं होतीं बल्कि लिंक हो जाती हैं, इसलिए तीस कॉपियाँ एक से थोड़ी ही ज़्यादा जगह लेती हैं।

#!/bin/bash
set -euo pipefail
DEST=/srv/backup/vds
TODAY=$(date +%F)
rsync -a --delete \
  --link-dest="$DEST/latest" \
  /var/www/ "$DEST/$TODAY/"
ln -sfn "$DEST/$TODAY" "$DEST/latest"
find "$DEST" -maxdepth 1 -type d -mtime +30 -name "20*" -exec rm -rf {} +

स्क्रिप्ट को रात में शेड्यूल पर चलाएँ, और हमेशा लॉगिंग के साथ।

एक्सक्लूज़न

rsync -avz --exclude-from=/root/backup-exclude.txt / backup@host:/srv/backup/vds/root/
/proc/
/sys/
/dev/
/run/
/tmp/
/var/lib/docker/
/var/cache/
*.log

पूरी रूट कॉपी करने की ज़रूरत कम ही पड़ती है: क्या-क्या बैकअप लें वाले लेख से एक सटीक लिस्ट बनाना ज़्यादा काम का है।

जब rsync ठीक नहीं बैठता

  • अगर आपको स्टोरेज एन्क्रिप्शन और डीडुप्लिकेशन चाहिए, तो Restic इस्तेमाल करें।
  • अगर डेटा लगातार बदलता रहता है और इंटीग्रिटी मायने रखती है, तो पहले डेटाबेस का डंप लें, फिर बनी हुई फ़ाइल को rsync करें।
  • रिसीवर किसी और का स्टोरेज है जिस पर आपको भरोसा नहीं: rsync फ़ाइलें जैसी हैं वैसी ही लिखता है, क्लाइंट-साइड एन्क्रिप्शन के बिना।

आम गलतियाँ

  • गलत सोर्स पाथ के साथ --delete। खाली सोर्स डायरेक्टरी रिसीवर को मिटा देती है। dry run करना ज़रूरी है।
  • उसी डिस्क पर कॉपी। यह बैकअप नहीं है, यह उसी खराबी के लिए दूसरा निशाना है। ऑफ़साइट कॉपी देखें।
  • पहले से कंप्रेस डेटा पर कंप्रेशन। -z सिर्फ़ आर्काइव और इमेज को धीमा करता है।
  • रात का रन डिस्क बॉटलनेक से टकराता है। राइट थ्रूपुट की सीमा टियर पर निर्भर करती है: डिस्क स्पीड देखें। --bwlimit=20000 और कम भीड़ वाले घंटों में चलाना मदद करता है।
  • कोई नतीजा नहीं जाँचता। रिटर्न कोड लॉग करें और उस पर नज़र रखें: rsync ... || echo "backup failed" | mail -s alert you@example.com।