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ụ:
sv.sv1.com
(nơi chứa backup gốc)sv.sv2.com
(nơi lưu trữ backup)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.
rsync
trên cả hai máy chủyum install rsync -y
apt install rsync -y
/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"
crontab
mỗi tuầnBạ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
bash /root/chuyenbackupsv.sh
tail -f /var/log/backup-transfer.log
rsync
cực kỳ nhanh & chỉ gửi file thay đổiTrê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:
Hãy để lại bình luận hoặc liên hệ để mình hỗ trợ thêm nhé!
dịch vụ chất lượng khách hàng tin tưởng