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।