VPS

สำรองข้อมูล VPS ด้วย rsync และ cron อัตโนมัติทุกวัน

สำรองข้อมูล VPS ด้วย rsync และ cron อัตโนมัติ

สารบัญ

  1. rsync คืออะไร และทำไมต้องใช้
  2. ติดตั้ง rsync บน Ubuntu/Debian
  3. Backup ไฟล์ภายในเครื่อง (Local Backup)
  4. Backup ไปยัง Remote Server ผ่าน SSH
  5. ตั้งค่า SSH Key สำหรับ Cron Job
  6. สร้าง Backup Script ครบวงจร
  7. ตั้งค่า Cron Job รัน Backup อัตโนมัติ
  8. Rotate Backup ลบไฟล์เก่าอัตโนมัติ
  9. ตรวจสอบและทดสอบ Backup
  10. คำถามที่พบบ่อย

การ สำรองข้อมูล VPS เป็นสิ่งที่ผู้ดูแลระบบทุกคนต้องทำ แต่หลายคนทำแบบ manual ซึ่งเสี่ยงลืมหรือทำไม่สม่ำเสมอ บทความนี้จะสอนการใช้ rsync ร่วมกับ cron เพื่อสำรองข้อมูล VPS แบบ อัตโนมัติทุกวัน โดยไม่ต้องทำเอง

1. rsync คืออะไร และทำไมต้องใช้

rsync (Remote Sync) เป็นเครื่องมือ command-line ที่มาพร้อมกับ Linux ใช้สำหรับ sync ไฟล์และโฟลเดอร์ทั้งภายในเครื่องและระหว่างเครื่อง จุดเด่นที่ทำให้ rsync เป็นตัวเลือกยอดนิยมสำหรับ backup คือ:

เปรียบเทียบกับ tar + scp: tar + scp copy ทั้งหมดทุกครั้ง ถ้ามีไฟล์ 10GB จะใช้เวลานานมาก ส่วน rsync จะส่งเฉพาะไฟล์ที่เปลี่ยนแปลงตั้งแต่ครั้งล่าสุด ทำให้ daily backup เสร็จในไม่กี่วินาทีถึงนาที

2. ติดตั้ง rsync บน Ubuntu/Debian

rsync มักติดตั้งมาพร้อมกับ Linux แล้ว แต่ถ้ายังไม่มีให้รันคำสั่ง:

# ตรวจสอบว่ามี rsync หรือยัง
rsync --version

# ติดตั้งบน Ubuntu/Debian
sudo apt update && sudo apt install rsync -y

# ติดตั้งบน CentOS/AlmaLinux/Rocky Linux
sudo yum install rsync -y

3. Backup ไฟล์ภายในเครื่อง (Local Backup)

เริ่มจากการ backup ภายในเครื่องก่อน เพื่อทำความเข้าใจ syntax ของ rsync:

Syntax พื้นฐาน

rsync [options] source/ destination/

Options ที่ใช้บ่อย

Optionความหมาย
-aArchive mode — เก็บ permission, owner, symlink, timestamp
-vVerbose — แสดง progress
-zCompress — บีบอัดระหว่างส่ง
--deleteลบไฟล์ที่หายไปจาก source ด้านปลายทางด้วย
--excludeยกเว้นไฟล์/โฟลเดอร์บางส่วน
--dry-runทดสอบโดยไม่ copy จริง
-Pแสดง progress bar

ตัวอย่าง Backup Local

# 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/
สังเกต Trailing Slash: /var/www/ (มี slash ท้าย) = copy เนื้อหาในโฟลเดอร์
/var/www (ไม่มี slash) = copy โฟลเดอร์ทั้งก้อน ผลลัพธ์ต่างกัน

4. Backup ไปยัง Remote Server ผ่าน SSH

การ backup ไปยังเซิร์ฟเวอร์อื่นเป็นแนวทางที่ดีที่สุด เพราะถ้าเซิร์ฟเวอร์หลักพัง ข้อมูลยังอยู่ที่อื่น

Syntax สำหรับ Remote 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/

Backup พร้อม --delete (Mirror Sync)

# Sync แบบ mirror — destination จะเหมือน source ทุกอย่าง
rsync -avz --delete /var/www/ user@remote-server:/backup/www/
ระวัง --delete: ไฟล์ที่ลบออกจาก source จะถูกลบจาก destination ด้วย ถ้าต้องการ backup ที่เก็บประวัติการเปลี่ยนแปลง ควรใช้ date-stamped directory แทน

5. ตั้งค่า SSH Key สำหรับ Cron Job

Cron ไม่สามารถพิมพ์ password ได้ ต้องใช้ SSH key authentication แทน

ขั้นตอนสร้าง SSH Key

# 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'"

จำกัดสิทธิ์ SSH Key (เสริมความปลอดภัย)

# แก้ไข authorized_keys บน remote server
# จำกัดให้ key นี้ทำได้แค่ rsync เท่านั้น
command="rsync --server --daemon .",no-port-forwarding,no-X11-forwarding,no-agent-forwarding ssh-ed25519 AAAA...

6. สร้าง Backup Script ครบวงจร

สร้าง 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

7. ตั้งค่า Cron Job รัน Backup อัตโนมัติ

เพิ่ม 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

Cron Syntax อธิบาย

ตำแหน่งค่าความหมาย
นาที0นาทีที่ 0
ชั่วโมง2ตี 2
วันที่*ทุกวัน
เดือน*ทุกเดือน
วันในสัปดาห์*ทุกวัน
Tip: ใช้ crontab.guru เพื่อตรวจสอบ cron expression ให้ถูกต้องก่อน save

ตรวจสอบ Cron Service

# ตรวจสอบว่า cron รันอยู่
systemctl status cron

# เปิด cron service (ถ้ายังไม่ได้เปิด)
sudo systemctl enable cron
sudo systemctl start cron

8. Rotate Backup ลบไฟล์เก่าอัตโนมัติ

ถ้าต้องการเก็บ 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"

ใช้ Hard Link สำหรับ Space-Efficient Backup

# 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"

9. ตรวจสอบและทดสอบ Backup

การ backup ที่ไม่ได้ทดสอบ = ไม่มี backup ต้องตรวจสอบสม่ำเสมอ:

ดู Log ประจำวัน

# ดู 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

# ทดสอบ 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

ส่ง Email แจ้งผล Backup

# ติดตั้ง 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
3-2-1 Backup Rule: เก็บ 3 copies บน 2 media ต่างกัน และ 1 copy อยู่นอก site เช่น local disk + remote VPS + cloud storage เพื่อป้องกันทุกสถานการณ์

คำถามที่พบบ่อย (FAQ)

rsync คืออะไรและทำไมต้องใช้สำรองข้อมูล VPS?
rsync เป็นเครื่องมือ Linux ที่ใช้ซิงค์ไฟล์แบบ incremental คือส่งเฉพาะส่วนที่เปลี่ยนแปลง ทำให้ประหยัดแบนด์วิดท์และเวลามากกว่าการ copy ทั้งหมดทุกครั้ง เหมาะสำหรับ backup VPS ที่ต้องทำซ้ำทุกวัน
ต้องการ VPS สเปกขนาดไหนสำหรับรัน rsync backup?
rsync ใช้ CPU และ RAM น้อยมาก VPS ขนาดเล็กสุด 1 vCPU / 512MB RAM ก็รันได้สบาย แต่ถ้าไฟล์มีขนาดใหญ่หรือมีจำนวนมาก ควรเพิ่ม storage ให้เพียงพอ
ควร backup ไปที่ไหนดีที่สุด?
ตามหลัก 3-2-1 backup rule ควรมีอย่างน้อย 3 copy เก็บใน 2 media ต่างกัน และ 1 copy อยู่นอก site เช่น rsync ไปยัง VPS ต่างเซิร์ฟเวอร์ หรือ cloud storage
cron จะรัน backup แม้ VPS ไม่มีคนใช้งานอยู่ไหม?
ใช่ cron daemon รันอยู่ตลอดเวลาในพื้นหลัง ไม่ว่าจะมีคนล็อกอินอยู่หรือไม่ก็ตาม เพียงแต่ต้องตรวจสอบว่า cron service เปิดอยู่ด้วยคำสั่ง systemctl status cron
จะรู้ได้อย่างไรว่า backup สำเร็จทุกครั้ง?
แนะนำให้ redirect output ของ rsync ไปเก็บใน log file และส่ง email แจ้งผลทุกครั้ง สามารถใช้ mailutils หรือ msmtp ส่ง email จาก cron job ได้ง่ายๆ
rsync กับ tar + scp ต่างกันอย่างไร?
tar + scp copy ทั้งหมดทุกครั้ง (full backup) ใช้เวลาและแบนด์วิดท์มาก ส่วน rsync ทำ incremental backup คือส่งเฉพาะไฟล์ที่เปลี่ยนแปลงตั้งแต่ครั้งล่าสุด ทำให้เร็วกว่ามากสำหรับ daily backup
ต้องตั้ง SSH key ก่อน rsync ไป remote server ไหม?
ใช่ เพราะ cron ไม่สามารถพิมพ์ password ได้ ต้องสร้าง SSH key pair และ copy public key ไปยัง remote server ก่อน จากนั้น rsync จะ authenticate ผ่าน key โดยไม่ต้องป้อน password

สรุป: เริ่มต้น Backup VPS วันนี้เลย

การ backup ด้วย rsync + cron เป็นแนวทางที่เรียบง่าย ประหยัด และเชื่อถือได้ ขั้นตอนสรุปคือ:

  1. ติดตั้ง rsync และตั้งค่า SSH key
  2. เขียน backup script พร้อม log และ error handling
  3. ตั้ง cron job รัน backup ทุกวันตอนกลางคืน
  4. ตรวจสอบ log ประจำสัปดาห์และทดสอบ restore

หากคุณกำลังมองหา VPS คุณภาพดี สำหรับรัน backup server หรือ production workload AsiaGB VPS มีให้เลือกทั้ง VPS ไทย, สิงคโปร์ ด้วย SSD Storage, Uptime 99% และทีม support พร้อมช่วยเหลือตลอดเวลา