Hướng dẫn viết script sync dữ liệu giữa 2 VPS linux qua SSH key

Tác giả: 30/08/2025

Chuẩn bị:

VPS A: Dữ liệu cần chuyển đi.

VPS B: Dữ liệu sẽ chuyển đến đây.

Folder cần chuyển:

VPS A: /backup

sang

VPS B: /backup1

Các bước thao tác

Bước 1: Tạo SSH key trên A và add public key vào B.

Tạo cặp key trên A

ssh-keygen -t rsa -b 4096

Sau khi tạo xong thì dùng lệnh sau để add public key vào B

root@A:~# ssh-copy-id -i /root/.ssh/id_rsa.pub -p <Port SSH của B> root@<IP của B>

Sau đó test bằng lệnh ssh trực tiếp nếu không cần nhập password thì đã add thành công.

root@A:~# ssh -p <Port SSH của B> root@<IP của B>

Bước 2: Tạo script chuyển dữ liệu từ A sang B bắn thông báo về telegram

vi /root/backupserver.sh

#!/bin/bash

# ============================
# Config
# ============================
SRC_DIR="/backup/"
DEST_DIR="/backup1/"
REMOTE_USER="root"
REMOTE_HOST="<IP của B"
REMOTE_PORT="<Port của B>" # nếu port khác thì sửa lại

# Telegram Bot config
BOT_TOKEN="<API bot telegram>"
CHAT_ID="<nhóm chat telegram>"

# ============================
# Sync dữ liệu
# ============================
rsync -avz -e "ssh -p $REMOTE_PORT" "$SRC_DIR" ${REMOTE_USER}@${REMOTE_HOST}:"$DEST_DIR"
STATUS=$?

# ============================
# Gửi thông báo Telegram
# ============================
if [ $STATUS -eq 0 ]; then
MSG="Sync thành công config $(hostname) → ${REMOTE_HOST}
📂 Thư mục: $SRC_DIR → $DEST_DIR
🕒 Thời gian: $(date '+%Y-%m-%d %H:%M:%S')"
else
MSG="❌ Sync thất bại config: $(hostname) → ${REMOTE_HOST}
📂 Thư mục: $SRC_DIR → $DEST_DIR
🕒 Thời gian: $(date '+%Y-%m-%d %H:%M:%S')"
fi

curl -s -X POST "https://api.telegram.org/bot${BOT_TOKEN}/sendMessage" \
-d chat_id="${CHAT_ID}" \
-d text="$MSG" >/dev/null

 

Phân quyền thực thi cho file backupserver.sh

chmod +x /root/backupserver.sh

Test thử script xem có hoạt động không.

./backupserver.sh

Nếu thành công thì thông báo sẽ bắn về telegram.

Bước 3: Tạo cron backup 2 a.m sáng mỗi ngày

crontab -e

0 2 * * * /root/backupserver.sh >> /var/log/backupserver.log 2>&1