การ สำรองข้อมูล VPS เป็นสิ่งที่ผู้ดูแลระบบทุกคนต้องทำ แต่หลายคนทำแบบ manual ซึ่งเสี่ยงลืมหรือทำไม่สม่ำเสมอ บทความนี้จะสอนการใช้ rsync ร่วมกับ cron เพื่อสำรองข้อมูล VPS แบบ อัตโนมัติทุกวัน โดยไม่ต้องทำเอง
rsync (Remote Sync) เป็นเครื่องมือ command-line ที่มาพร้อมกับ Linux ใช้สำหรับ sync ไฟล์และโฟลเดอร์ทั้งภายในเครื่องและระหว่างเครื่อง จุดเด่นที่ทำให้ rsync เป็นตัวเลือกยอดนิยมสำหรับ backup คือ:
rsync มักติดตั้งมาพร้อมกับ Linux แล้ว แต่ถ้ายังไม่มีให้รันคำสั่ง:
# ตรวจสอบว่ามี rsync หรือยัง
rsync --version
# ติดตั้งบน Ubuntu/Debian
sudo apt update && sudo apt install rsync -y
# ติดตั้งบน CentOS/AlmaLinux/Rocky Linux
sudo yum install rsync -y
เริ่มจากการ backup ภายในเครื่องก่อน เพื่อทำความเข้าใจ syntax ของ rsync:
rsync [options] source/ destination/
| Option | ความหมาย |
|---|---|
-a | Archive mode — เก็บ permission, owner, symlink, timestamp |
-v | Verbose — แสดง progress |
-z | Compress — บีบอัดระหว่างส่ง |
--delete | ลบไฟล์ที่หายไปจาก source ด้านปลายทางด้วย |
--exclude | ยกเว้นไฟล์/โฟลเดอร์บางส่วน |
--dry-run | ทดสอบโดยไม่ copy จริง |
-P | แสดง progress bar |
# Backup โฟลเดอร์ /var/www ไปที่ /backup/www
rsync -avz /var/www/ /backup/www/
# Backup พร้อม exclude ไฟล์ชั่วคราว
rsync -avz --exclude='*.tmp' --exclude='cache/' /var/www/ /backup/www/
# ทดสอบก่อนรัน
rsync -avz --dry-run /var/www/ /backup/www/
/var/www/ (มี slash ท้าย) = copy เนื้อหาในโฟลเดอร์/var/www (ไม่มี slash) = copy โฟลเดอร์ทั้งก้อน ผลลัพธ์ต่างกัน
การ backup ไปยังเซิร์ฟเวอร์อื่นเป็นแนวทางที่ดีที่สุด เพราะถ้าเซิร์ฟเวอร์หลักพัง ข้อมูลยังอยู่ที่อื่น
# rsync ผ่าน SSH ไปยัง remote server
rsync -avz -e ssh /var/www/ user@remote-server:/backup/www/
# ระบุ SSH port ที่ไม่ใช่ 22
rsync -avz -e "ssh -p 2222" /var/www/ user@remote-server:/backup/www/
# ใช้ SSH key file ที่ระบุ
rsync -avz -e "ssh -i /root/.ssh/backup_key" /var/www/ user@remote-server:/backup/www/
# Sync แบบ mirror — destination จะเหมือน source ทุกอย่าง
rsync -avz --delete /var/www/ user@remote-server:/backup/www/
Cron ไม่สามารถพิมพ์ password ได้ ต้องใช้ SSH key authentication แทน
# 1. สร้าง SSH key pair (ไม่ตั้ง passphrase เพื่อให้ cron ใช้ได้)
ssh-keygen -t ed25519 -f /root/.ssh/backup_key -N ""
# 2. Copy public key ไปยัง remote server
ssh-copy-id -i /root/.ssh/backup_key.pub user@remote-server
# หรือ manual copy
cat /root/.ssh/backup_key.pub | ssh user@remote-server "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
# 3. ทดสอบ connection ว่าไม่ต้องพิมพ์ password
ssh -i /root/.ssh/backup_key user@remote-server "echo 'SSH key OK'"
# แก้ไข authorized_keys บน remote server
# จำกัดให้ key นี้ทำได้แค่ rsync เท่านั้น
command="rsync --server --daemon .",no-port-forwarding,no-X11-forwarding,no-agent-forwarding ssh-ed25519 AAAA...
สร้าง script ที่ครบวงจรพร้อม log และ error handling:
#!/bin/bash
# /root/scripts/backup.sh
# ===== Configuration =====
BACKUP_SOURCE="/var/www /etc /home"
BACKUP_DEST="backup-user@backup-server:/backups/$(hostname)"
SSH_KEY="/root/.ssh/backup_key"
LOG_FILE="/var/log/backup.log"
MAX_LOG_SIZE=10485760 # 10MB
# ===== Functions =====
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
}
# ===== Rotate log if too large =====
if [ -f "$LOG_FILE" ] && [ $(stat -c%s "$LOG_FILE") -gt $MAX_LOG_SIZE ]; then
mv "$LOG_FILE" "${LOG_FILE}.old"
fi
# ===== Run backup =====
log "=== Backup started ==="
ERRORS=0
for SRC in $BACKUP_SOURCE; do
if [ ! -d "$SRC" ]; then
log "WARNING: $SRC not found, skipping"
continue
fi
log "Backing up $SRC..."
rsync -az \
--delete \
--exclude='*.tmp' \
--exclude='*.log' \
--exclude='cache/' \
--exclude='__pycache__/' \
-e "ssh -i $SSH_KEY -o StrictHostKeyChecking=no" \
"$SRC/" \
"$BACKUP_DEST${SRC}/"
if [ $? -eq 0 ]; then
log "OK: $SRC backed up successfully"
else
log "ERROR: Failed to backup $SRC"
ERRORS=$((ERRORS + 1))
fi
done
log "=== Backup finished (errors: $ERRORS) ==="
exit $ERRORS
# ตั้ง permission ให้ script
chmod +x /root/scripts/backup.sh
mkdir -p /root/scripts
เพิ่ม cron job ให้รัน backup script ทุกวันตอนตี 2:
# เปิด crontab
crontab -e
# เพิ่มบรรทัดนี้ — รัน backup ทุกวันเวลา 02:00 น.
0 2 * * * /root/scripts/backup.sh >> /var/log/backup.log 2>&1
# หรือรัน 2 ครั้งต่อวัน (ตี 2 และ บ่าย 2)
0 2,14 * * * /root/scripts/backup.sh >> /var/log/backup.log 2>&1
| ตำแหน่ง | ค่า | ความหมาย |
|---|---|---|
| นาที | 0 | นาทีที่ 0 |
| ชั่วโมง | 2 | ตี 2 |
| วันที่ | * | ทุกวัน |
| เดือน | * | ทุกเดือน |
| วันในสัปดาห์ | * | ทุกวัน |
# ตรวจสอบว่า cron รันอยู่
systemctl status cron
# เปิด cron service (ถ้ายังไม่ได้เปิด)
sudo systemctl enable cron
sudo systemctl start cron
ถ้าต้องการเก็บ backup หลายวันและลบไฟล์เก่าออกอัตโนมัติ ให้ใช้ date-stamped directory:
#!/bin/bash
# Backup พร้อม date stamp
DATE=$(date +%Y-%m-%d)
BACKUP_BASE="/backup"
BACKUP_DIR="$BACKUP_BASE/$DATE"
mkdir -p "$BACKUP_DIR"
# Backup ลงในโฟลเดอร์ตามวันที่
rsync -az /var/www/ "$BACKUP_DIR/www/"
rsync -az /etc/ "$BACKUP_DIR/etc/"
# ลบ backup ที่เก่ากว่า 30 วัน
find "$BACKUP_BASE" -maxdepth 1 -type d -mtime +30 -exec rm -rf {} \;
echo "Backup $DATE completed"
# rsync --link-dest สร้าง incremental backup ที่ดูเหมือน full backup
# แต่ใช้ hard link สำหรับไฟล์ที่ไม่เปลี่ยนแปลง ประหยัด disk space มาก
DATE=$(date +%Y-%m-%d)
LATEST="/backup/latest"
BACKUP="/backup/$DATE"
rsync -az --link-dest="$LATEST" /var/www/ "$BACKUP/www/"
rm -f "$LATEST"
ln -s "$BACKUP" "$LATEST"
การ backup ที่ไม่ได้ทดสอบ = ไม่มี backup ต้องตรวจสอบสม่ำเสมอ:
# ดู log วันนี้
tail -50 /var/log/backup.log
# ดู log real-time
tail -f /var/log/backup.log
# หาบรรทัด ERROR
grep "ERROR" /var/log/backup.log | tail -20
# ทดสอบ restore ไฟล์จาก backup
rsync -avz backup-user@backup-server:/backups/hostname/var/www/index.html /tmp/test-restore/
# ตรวจสอบไฟล์ที่ restore มา
diff /var/www/index.html /tmp/test-restore/index.html
# ติดตั้ง mailutils
sudo apt install mailutils -y
# เพิ่มใน backup script
if [ $ERRORS -eq 0 ]; then
echo "Backup successful on $(date)" | mail -s "Backup OK: $(hostname)" [email protected]
else
echo "Backup FAILED: $ERRORS errors on $(date)" | mail -s "BACKUP FAILED: $(hostname)" [email protected]
fi
การ backup ด้วย rsync + cron เป็นแนวทางที่เรียบง่าย ประหยัด และเชื่อถือได้ ขั้นตอนสรุปคือ:
หากคุณกำลังมองหา VPS คุณภาพดี สำหรับรัน backup server หรือ production workload AsiaGB VPS มีให้เลือกทั้ง VPS ไทย, สิงคโปร์ ด้วย SSD Storage, Uptime 99% และทีม support พร้อมช่วยเหลือตลอดเวลา