Skip to content
VDS · ব্যাকআপ ও ডিস্ক

rsync দিয়ে ব্যাকআপ

কীভাবে SSH-এর মাধ্যমে অন্য সার্ভারে ফাইল কপি সেট আপ করবেন, হার্ড লিংক দিয়ে ভার্সন হিস্ট্রি তৈরি করবেন, এবং বিপজ্জনক --delete অপশনে বেশি কিছু মুছে ফেলা এড়াবেন।

আপডেট: ২৩ আগস্ট, ২০২৬

কপি তৈরির সবচেয়ে সহজ কার্যকর উপায় হলো 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 — পারমিশন, মালিকানা, সময় ও লিংক সংরক্ষণ করে;
  • -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 ফ্ল্যাগটি হলো ড্রাই রান।

পাসওয়ার্ডবিহীন অ্যাক্সেস কী

নির্ধারিত সময়ে কপি করার জন্য পাসওয়ার্ড না দিয়ে লগইন করা প্রয়োজন:

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। খালি সোর্স ডিরেক্টরি রিসিভার মুছে ফেলে। ড্রাই রান বাধ্যতামূলক।
  • একই ডিস্কে কপি। এটি ব্যাকআপ নয়, একই বিপর্যয়ের জন্য দ্বিতীয় লক্ষ্য। দেখুন অফসাইট কপি।
  • আগেই কম্প্রেস করা ডেটার জন্য কম্প্রেশন। -z শুধু আর্কাইভ ও ছবি ধীর করে দেয়।
  • রাতের রান ডিস্ক বটলনেকে আটকে যায়। রাইট থ্রুপুটের সীমা টিয়ারের উপর নির্ভর করে: দেখুন ডিস্কের গতি। --bwlimit=20000 এবং অফ-পিক আওয়ারে চালানো সাহায্য করে।
  • কেউ ফলাফল যাচাই করে না। রিটার্ন কোড লগ করুন এবং মনিটর করুন: rsync ... || echo "backup failed" | mail -s alert you@example.com।