Hướng Dẫn Thiết Lập Hệ Thống Tự Động Chuyển File Backup Giữa Server A và Server B Qua SSH & Rsync

6 Tháng 4, 2025

Trong bài viết này, mình sẽ hướng dẫn bạn cách thiết lập hệ thống backup định kỳ giữa 2 máy chủ sử dụng rsync và SSH key, đồng thời gửi thông báo Telegram mỗi khi backup bắt đầu và kết thúc.

Ví dụ:

  • Server A: sv.sv1.com (nơi chứa backup gốc)
  • Server B: sv.sv2.com (nơi lưu trữ backup)

🔧 Bước 1: Tạo SSH Key và cấp quyền kết nối không mật khẩu từ Server A sang Server B

Trên Server A:

ssh-keygen -t ed25519 -f ~/.ssh/giza_rsync_key -N ""
ssh-copy-id -i ~/.ssh/giza_rsync_key.pub [email protected] # thay sv.sv2.com bằng nơi nhận file

✅ Sau khi thực hiện xong, bạn có thể SSH qua Server B mà không cần nhập mật khẩu.


🛠 Bước 2: Cài đặt rsync trên cả hai máy chủ

Với CentOS / RHEL / AlmaLinux:

yum install rsync -y

Với Ubuntu / Debian:

apt install rsync -y

📝 Bước 3: Tạo script /root/chuyenbackupsv.sh để tự động backup

#!/bin/bash

# === Cấu hình cơ bản ===
SVCHUYENFILEQUA="sv.sv1.com" # tên server chuyển file đi
SOURCE="/backup-hang-tuan/" # thư mục chứa file cần chuyển đi
DATEFOLDER=$(date '+%d-%m-%Y')
DEST="[email protected]:/var/luubackup-sv/$SVCHUYENFILEQUA/$DATEFOLDER/" # thay sv.sv2.com bằng tên server nhận file, thay /var/luubackup-sv bằng nơi lưu thư mục nhận file ở server nhận file
KEY="/root/.ssh/giza_rsync_key"
LOGFILE="/var/log/backup-transfer.log"
RSYNC_TEMP_LOG="/tmp/rsync-transfer.log"
RSYNC_DRYRUN_LOG="/tmp/rsync-dryrun.log"

# === Cấu hình Telegram ===
TELEGRAM_BOT_TOKEN="7824393003:AAEIU9zHT-FJNRyNs4Gb5rMyPAxN9hlrYG0"
TELEGRAM_CHAT_ID="-4605258820"
send_telegram() {
  SAFE_TEXT=$(echo "$1" | sed -e 's/\\/\\\\/g' \
                              -e 's/\*/\\*/g' \
                              -e 's/_/\\_/g' \
                              -e 's/`/\\`/g' \
                              -e 's/\[/\\[/g' \
                              -e 's/\]/\\]/g' \
                              -e 's/(/\\(/g' \
                              -e 's/)/\\)/g' \
                              -e 's/-/\\-/g' \
                              -e 's/!/\\!/g' \
                              -e 's/\./\\./g' \
                              -e 's/#/\\#/g' \
                              -e 's/+/\\+/g' \
                              -e 's/=/\\=/g' \
                              -e 's/{/\\{/g' \
                              -e 's/}/\\}/g' \
                              -e 's/|/\\|/g' \
                              -e 's/~_/\\~_/g' \
                              -e 's/>/\\>/g')
  curl -s -X POST "https://api.telegram.org/bot$TELEGRAM_BOT_TOKEN/sendMessage" \
    -d chat_id="$TELEGRAM_CHAT_ID" \
    -d parse_mode="MarkdownV2" \
    --data-urlencode "text=$SAFE_TEXT"
}

# === Random delay từ 0–60 giây ===
DELAY_SECONDS=$((RANDOM % 60))
echo "⏱️ Script sẽ bắt đầu sau $DELAY_SECONDS giây (delay ngẫu nhiên)" >> "$LOGFILE"
sleep $DELAY_SECONDS

# === Chuẩn bị danh sách file sẽ được chuyển (dry-run) ===
rsync -avzn --delete -e "ssh -i $KEY -o StrictHostKeyChecking=no" \
  "$SOURCE" "$DEST" > "$RSYNC_DRYRUN_LOG" 2>&1

FILE_COUNT=$(grep -v '/$' "$RSYNC_DRYRUN_LOG" | grep -c -v '^sending')
PREVIEW_FILES=$(grep -v '/$' "$RSYNC_DRYRUN_LOG" | grep -v '^sending' | head -n 5 | sed 's/^/✅ /')
[ -z "$PREVIEW_FILES" ] && PREVIEW_FILES="(Không có file nào cần chuyển)"

# === Gửi thông báo bắt đầu ===
START_MSG=$(printf "🚀 *Bắt đầu backup!*
📡 *Server:* \`%s\`
📂 *Sẽ chuyển %s file:*
%s
🕒 *Lúc:* \`%s\`" \
  "$SVCHUYENFILEQUA" "$FILE_COUNT" "$PREVIEW_FILES" "$(date '+%H:%M %d-%m-%Y')")
send_telegram "$START_MSG"

# === Ghi log bắt đầu ===
echo "==== Backup Transfer - $(date '+%Y-%m-%d %H:%M:%S') ====" >> "$LOGFILE"
echo "Sending backup to: $DEST" >> "$LOGFILE"

# === Thực hiện rsync và ghi log
rsync -avzP -e "ssh -i $KEY -o StrictHostKeyChecking=no" \
  --rsync-path="mkdir -p /var/luubackup-sv/$SVCHUYENFILEQUA/$DATEFOLDER && rsync" \
  "$SOURCE" "$DEST" > "$RSYNC_TEMP_LOG" 2>&1

# === Lấy danh sách file và tổng kết ===
FINAL_FILES=$(grep -oP "^.*(?=\s+\d+%\s+.*xfr)" "$RSYNC_TEMP_LOG" | sed 's/^/✅ /')
[ -z "$FINAL_FILES" ] && FINAL_FILES="(Không có file nào được chuyển)"

SUMMARY_LINE=$(grep -E 'total size is|sent [0-9]' "$RSYNC_TEMP_LOG" | paste -sd ' | ' -)

# === Gửi thông báo sau khi hoàn tất ===
if [ $? -eq 0 ]; then
    MSG=$(printf "🎉 *Backup thành công!*
📡 *Server:* \`%s\`
📁 *Từ:* \`%s\`
📤 *Đến:* \`%s\`
🕒 *Xong:* \`%s\`

📆 *Đã chuyển:*
%s

📊 %s" \
      "$SVCHUYENFILEQUA" "$SOURCE" "$DEST" "$(date '+%H:%M')" "$FINAL_FILES" "$SUMMARY_LINE")
else
    MSG=$(printf "❌ *Backup thất bại!*
📡 *Server:* \`%s\`
📁 *Từ:* \`%s\`
📤 *Đến:* \`%s\`
📄 Log: \`%s\`" \
      "$SVCHUYENFILEQUA" "$SOURCE" "$DEST" "$LOGFILE")
fi

send_telegram "$MSG"

# === Dọn file tạm
rm -f "$RSYNC_TEMP_LOG" "$RSYNC_DRYRUN_LOG"

⏰ Bước 4: Tự động hóa với crontab mỗi tuần

Bạn hãy mở cron:

crontab -e

Thêm dòng sau để backup tự động vào 12h trưa Chủ Nhật hàng tuần:

0 12 * * 0 /root/chuyenbackupsv.sh

✅ Bước 5: Kiểm tra thử & debug

Chạy thử script bằng tay:

bash /root/chuyenbackupsv.sh

Xem log chi tiết:

tail -f /var/log/backup-transfer.log

🧠 Tại sao nên dùng giải pháp này?

  • Không cần mật khẩu, hoàn toàn tự động
  • rsync cực kỳ nhanh & chỉ gửi file thay đổi
  • ✅ Gửi thông báo chi tiết qua Telegram
  • ✅ Dễ dàng mở rộng ra nhiều server
  • ✅ Log rõ ràng, dễ quản lý

🔚 Tổng kết

Trên đây là hướng dẫn chi tiết giúp bạn thiết lập hệ thống backup định kỳ chuyên nghiệp giữa 2 server Linux, cực kỳ tiện lợi cho quản trị hệ thống.

Nếu bạn cần mở rộng:

  • Xoá backup cũ tự động
  • Backup nhiều VPS cùng lúc
  • Gửi thống kê tổng hợp

Hãy để lại bình luận hoặc liên hệ để mình hỗ trợ thêm nhé!

Blog ..

Hướng dẫn dịch vụ ..

Sản phẩm nổi bật

dịch vụ chất lượng khách hàng tin tưởng

NVMe VPS

Tốc độ cao và bảo mật

Xem thêm

SSD VPS

Hiệu năng và tối ưu chi phí

Xem thêm

Proxy

Ẩn danh và mượt mà

Xem thêm

NVMe Hosting

Ổn định và tiện dụng

Xem thêm