Backup VPS อัตโนมัติด้วย rclone ไป S3 / Google Drive

Backup ที่เก็บบนเครื่องเดียวกับ Production ไม่ใช่ Backup จริง — ถ้า server พังหรือถูกแฮก backup ก็พังตามไปด้วย ทางที่ปลอดภัยที่สุดคือส่ง backup ออกไป Cloud Storage

rclone คือ "rsync สำหรับ cloud" รองรับ 70+ ผู้ให้บริการ: S3, Google Drive, OneDrive, Backblaze B2, Dropbox, Wasabi, ฯลฯ คู่มือนี้พาตั้งค่า rclone บน VPS Ubuntu + เขียน script + cron ส่ง backup ขึ้น S3 และ Google Drive อัตโนมัติทุกวัน

ต้องเตรียม: VPS Ubuntu, sudo access, บัญชี Cloud Storage (S3 / B2 / Google Drive / OneDrive) ที่ต้องการส่ง backup ขึ้น

ทำไมต้องใช้ rclone — ไม่ใช้ aws-cli หรือ gsutil

ขั้นที่ 1 — ติดตั้ง rclone

วิธีที่ดีที่สุดคือ official installer เพราะ Ubuntu repo มักจะมีเวอร์ชันเก่า:

sudo -v ; curl https://rclone.org/install.sh | sudo bash
rclone version

ควรเห็นเวอร์ชันใหม่กว่า 1.65

ขั้นที่ 2 — Configure Remote (กรณี S3)

เริ่ม wizard:

rclone config

ทำตาม prompt:

  1. เลือก n สร้างใหม่
  2. ชื่อ: s3backup
  3. เลือก Storage: 4 (Amazon S3 Compliant)
  4. provider: AWS (หรือ Wasabi, Backblaze)
  5. access_key_id: ใส่ AWS Access Key
  6. secret_access_key: ใส่ Secret Key
  7. region: ap-southeast-1 (Singapore)
  8. endpoint: ปล่อยว่างถ้า AWS
  9. acl: private

เสร็จแล้วทดสอบ:

rclone lsd s3backup:

ขั้นที่ 3 — Configure Google Drive

Google Drive ต้องใช้ OAuth — แต่ถ้า VPS ไม่มี browser ให้รัน wizard บนเครื่อง local แล้วคัดลอก token มา

บนเครื่อง local (มี browser):

rclone config

เลือก Storage: Google Drive ปล่อย client_id/secret ว่าง (ใช้ default) แล้วเลือก y เปิด browser → ล็อกอินอนุญาต

จะได้ token JSON ที่ ~/.config/rclone/rclone.conf คัดลอกไปที่ VPS:

scp ~/.config/rclone/rclone.conf user@your-vps:/home/user/.config/rclone/rclone.conf

ขั้นที่ 4 — เปิด Encryption ก่อนส่งขึ้น Cloud (ทางเลือกที่แนะนำ)

rclone crypt เข้ารหัสชื่อไฟล์และเนื้อหาก่อนส่งขึ้น cloud — ผู้ให้บริการมองไม่เห็นข้อมูล

rclone config

เลือก n ตั้งชื่อ backup_enc เลือก crypt, remote: s3backup:bucket-name/encrypted, ตั้ง password (จดไว้! ลืมแล้วกู้ไม่ได้!)

⚠️ ห้ามลืม password ของ crypt remote — rclone ไม่มี recovery ถ้าลืมก็คือลืมตลอดไป เก็บใน password manager และมี backup ของ password เอง

ขั้นที่ 5 — Script Backup รายวัน

สร้างไฟล์ /usr/local/bin/backup-daily.sh:

sudo nano /usr/local/bin/backup-daily.sh

เนื้อหา (ตัวอย่าง backup MySQL + เว็บ + Cloud):

#!/bin/bash
set -e
DATE=$(date +%F-%H%M)
BACKUP_DIR=/tmp/backup_$DATE
mkdir -p $BACKUP_DIR

# 1. Dump MySQL
mysqldump --all-databases --single-transaction \
  -u backup -p'BackupPassword!' > $BACKUP_DIR/mysql_all.sql

# 2. Archive web folder
tar -czf $BACKUP_DIR/www.tar.gz /var/www

# 3. ส่งขึ้น S3 (encrypted)
rclone copy $BACKUP_DIR backup_enc:daily/$DATE \
  --transfers=4 --checkers=8 \
  --bwlimit "08:00,2M 22:00,off" \
  --log-file=/var/log/rclone-backup.log

# 4. ลบ backup เก่ากว่า 30 วันบน cloud
rclone delete backup_enc:daily --min-age 30d --log-file=/var/log/rclone-backup.log

# 5. ลบไฟล์ชั่วคราว
rm -rf $BACKUP_DIR

echo "Backup completed: $DATE" >> /var/log/rclone-backup.log

ให้สิทธิ์ execute:

sudo chmod +x /usr/local/bin/backup-daily.sh

ขั้นที่ 6 — ตั้ง Cron Job รันตี 3 ทุกวัน

sudo crontab -e

เพิ่ม:

0 3 * * * /usr/local/bin/backup-daily.sh >> /var/log/cron-backup.log 2>&1

ขั้นที่ 7 — ทดสอบ Restore

Backup ที่ไม่เคย restore = ไม่มี backup ลองดึงไฟล์ลงมา:

rclone copy backup_enc:daily/2026-05-15-0300/www.tar.gz /tmp/test_restore/
ls -la /tmp/test_restore/

เคล็ดลับ: ทดสอบ restore เดือนละครั้ง — กัน script เสียโดยไม่รู้ตัว

คำสั่ง rclone ที่ใช้บ่อย

คำสั่งคำอธิบาย
rclone copy SRC REMOTE:คัดลอก (ไม่ลบที่ปลายทาง)
rclone sync SRC REMOTE:sync แบบ mirror (ลบไฟล์ที่ไม่มี SRC)
rclone ls REMOTE:ดูไฟล์ทั้งหมด
rclone lsd REMOTE:ดูเฉพาะ directory
rclone size REMOTE:ดูขนาดรวม
rclone check SRC REMOTE:เช็คว่า file ตรงกัน
rclone mount REMOTE: /mntmount cloud เป็น folder

Checklist Backup Strategy 3-2-1

กลยุทธ์ 3-2-1 เป็นมาตรฐานสากลที่ผู้ดูแลระบบทั่วโลกใช้มาหลายสิบปี แนวคิดคือกระจาย Backup ออกหลายที่หลายรูปแบบเพื่อให้โอกาสสูญข้อมูลพร้อมกันทุกสำเนาในคราวเดียวนั้นน้อยที่สุดเท่าที่เป็นไปได้:

  1. 3 copies — ต้นฉบับ + backup ในเครื่อง + backup บน cloud
  2. 2 media — Disk + Cloud (ต่างประเภท)
  3. 1 off-site — อย่างน้อย 1 copy ออกนอกตึก (rclone ช่วยตรงนี้)
  4. เข้ารหัสด้วย crypt remote — ผู้ให้บริการมองไม่เห็นข้อมูล
  5. ตั้ง retention — ลบ backup เก่ากว่า X วันโดยอัตโนมัติ
  6. ทดสอบ restore เดือนละครั้ง — backup ที่ restore ไม่ได้ = ไม่มี backup

สำหรับ VPS ที่ใช้งาน WordPress หรือ E-Commerce แนะนำให้เพิ่ม Weekly Snapshot ของ Disk ไว้อีกชั้นหนึ่งนอกเหนือจาก Daily Backup ด้วย rclone เพราะ Snapshot สามารถ Restore ได้เร็วกว่าในกรณีที่ระบบปฏิบัติการเสียหายทั้งหมด ขณะที่ rclone Backup เหมาะกับการกู้ไฟล์หรือฐานข้อมูลเฉพาะส่วนได้อย่างยืดหยุ่น

เปรียบเทียบ Cloud Storage สำหรับ VPS Backup

rclone รองรับผู้ให้บริการหลายรายที่มีราคาและนโยบายต่างกัน การเลือกให้เหมาะสมช่วยประหยัดค่าใช้จ่ายและเพิ่มประสิทธิภาพ Backup ได้อย่างมาก

ผู้ให้บริการ ราคา Storage Egress (ดึงข้อมูล) เหมาะกับ
Amazon S3 Standard ~$0.023/GB/เดือน $0.09/GB ทั่วไป, ต้องการ SLA สูง
Backblaze B2 $0.006/GB/เดือน $0.01/GB งบน้อย, backup ขนาดใหญ่
Wasabi $0.0069/GB/เดือน ฟรี ต้องดึงข้อมูลบ่อย, S3-compatible
Google Drive (15 GB Free) ฟรี 15 GB / $2.99/เดือน 100 GB ฟรี โปรเจกต์ขนาดเล็ก, งบน้อย
S3 Glacier Instant $0.004/GB/เดือน $0.03/GB Archive ระยะยาว, restore ไม่บ่อย

การตั้ง Notification เมื่อ Backup ล้มเหลว

Cron Job ที่เงียบเกินไปคือกับดักที่อันตราย — ถ้า backup script ล้มเหลวโดยไม่มีการแจ้งเตือน คุณจะรู้ตัวก็ต่อเมื่อต้องการ restore จริงๆ ซึ่งอาจสายเกินไป วิธีเพิ่ม Notification ด้วย curl ส่ง Email หรือ Webhook:

#!/bin/bash
# เพิ่มที่ท้าย backup-daily.sh

WEBHOOK_URL="https://hooks.yourservice.com/abc123"
LOG="/var/log/rclone-backup.log"

# ตรวจสอบ exit code ของ rclone
if [ $? -eq 0 ]; then
  STATUS="✓ Backup สำเร็จ: $(date +%F)"
else
  STATUS="✗ Backup ล้มเหลว: $(date +%F) — ดู $LOG"
fi

# ส่ง Webhook (Slack / Line Notify / Discord)
curl -s -X POST -H 'Content-type: application/json' \
  --data "{\"text\":\"$STATUS\"}" "$WEBHOOK_URL"

อีกวิธีที่ง่ายกว่าคือใช้ healthchecks.io (มีบริการฟรี) — script ส่ง ping ไปทุกครั้งที่ backup สำเร็จ ถ้าไม่ได้รับ ping ตามเวลา ระบบจะส่ง Email แจ้งอัตโนมัติ:

# เพิ่มบรรทัดนี้ที่ท้าย script (แทน echo สุดท้าย)
curl -fsS --retry 3 https://hc-ping.com/YOUR-UUID-HERE > /dev/null

ตรวจสอบขนาด Backup และติดตาม Trend ค่าใช้จ่าย

การรู้ว่า Backup ใช้พื้นที่เท่าไรในแต่ละวันช่วยให้วางแผนค่าใช้จ่าย Cloud Storage ได้แม่นยำขึ้น และยังช่วยตรวจจับความผิดปกติได้เร็ว เช่น ถ้าขนาด Backup เพิ่มขึ้นกะทันหันหลายเท่าอาจหมายถึง Log file วิ่งออกนอกควบคุมหรือฐานข้อมูลโตผิดปกติ ใช้คำสั่งเหล่านี้ติดตาม:

# ขนาดรวมทั้งหมดของ Backup บน Cloud
rclone size backup_enc:daily

# ขนาดของ Backup วันใดวันหนึ่ง
rclone size backup_enc:daily/2026-06-01-0300

# รายการ 10 ไฟล์ใหญ่สุด
rclone ls backup_enc:daily | sort -rn | head -10

# สรุปพื้นที่ที่ใช้ไปทั้งหมดบน remote
rclone about backup_enc:

ตั้ง Cron เพิ่มเติมรายสัปดาห์ให้บันทึกผล rclone size ลง Log หรือส่ง Webhook ใช้เวลาตรวจสอบน้อยกว่า 2 นาทีต่อสัปดาห์แต่ช่วยจับปัญหาได้ก่อนที่ค่า Cloud Storage จะบวมเกินงบ

การเลือก Cloud Storage ให้เหมาะกับงบประมาณและขนาด Backup

rclone รองรับผู้ให้บริการหลายรายที่มีราคาและนโยบาย Egress ต่างกัน การเลือกให้เหมาะสมช่วยประหยัดค่าใช้จ่ายได้มาก โดยเฉพาะเมื่อขนาด Backup ใหญ่ขึ้นทุกเดือน ตารางต่อไปนี้เปรียบเทียบผู้ให้บริการหลักที่นิยมใช้กับ rclone:

ผู้ให้บริการ ค่า Storage ค่า Egress เหมาะกับ
Amazon S3 Standard ~$0.023/GB/เดือน $0.09/GB ทั่วไป, ต้องการ SLA สูง
Backblaze B2 $0.006/GB/เดือน $0.01/GB งบน้อย, backup ขนาดใหญ่
Wasabi $0.0069/GB/เดือน ฟรี ต้องดึงข้อมูลบ่อย
Google Drive (15 GB ฟรี) ฟรี 15 GB / $2.99/เดือน 100 GB ฟรี โปรเจกต์เล็ก, งบจำกัด
S3 Glacier Instant $0.004/GB/เดือน $0.03/GB Archive ระยะยาว, restore ไม่บ่อย

หากต้องการประหยัดสุดและข้อมูลไม่ถึงระดับ Sensitive มาก Backblaze B2 มักคุ้มที่สุดสำหรับ VPS ทั่วไป ส่วนถ้าต้องการความสะดวกและ Egress ฟรี Wasabi เป็นตัวเลือกที่ดีสำหรับทีมที่ต้อง restore บ่อยระหว่าง Development และ Testing

การตั้ง Notification เมื่อ Backup ล้มเหลว

Cron Job ที่ทำงานเงียบๆ โดยไม่มีระบบแจ้งเตือนคืออันตรายที่แฝงตัวอยู่ในระบบ ถ้า Backup ล้มเหลวซ้ำๆ โดยที่คุณไม่รู้ตัว เมื่อถึงเวลา Restore จริงอาจพบว่าไม่มี Backup ที่ดีเลย วิธีเพิ่ม Notification ง่ายๆ ด้วย curl ส่ง Webhook:

#!/bin/bash
WEBHOOK_URL="https://hooks.yourservice.com/abc123"
LOG="/var/log/rclone-backup.log"

if [ $? -eq 0 ]; then
  STATUS="Backup สำเร็จ: $(date +%F)"
else
  STATUS="Backup ล้มเหลว: $(date +%F) — ดู $LOG"
fi

curl -s -X POST -H 'Content-type: application/json' \
  --data "{\"text\":\"$STATUS\"}" "$WEBHOOK_URL"

อีกวิธีที่ง่ายและแนะนำคือ healthchecks.io (มี Free tier) — เพิ่มบรรทัดนี้ท้าย Script:

curl -fsS --retry 3 https://hc-ping.com/YOUR-UUID-HERE > /dev/null

ระบบจะส่ง Email แจ้งอัตโนมัติถ้าไม่ได้รับ Ping ตามเวลาที่ตั้งไว้ ไม่ต้องดูแล Script แจ้งเตือนเองให้ยุ่งยาก

rclone Filter — ส่งเฉพาะไฟล์ที่จำเป็น ลด Cloud Cost

การส่งไฟล์ทั้งหมดขึ้น Cloud อาจทำให้เสียค่าใช้จ่ายสูงโดยไม่จำเป็น rclone มี Filter ที่ยืดหยุ่นช่วยให้เลือกได้ว่าจะส่งไฟล์อะไรและละเว้นอะไร

ตัวอย่างไฟล์ /etc/rclone-backup.filter:

# รวม
+ /var/www/**
+ /etc/nginx/**
+ /home/*/public_html/**
+ *.sql
+ *.sql.gz

# ละเว้น
- *.log
- *.tmp
- /tmp/**
- /var/cache/**
- node_modules/**
- .git/**
- __pycache__/**

ใช้กับคำสั่ง rclone:

rclone copy /var/ backup_enc:daily/$DATE \
  --filter-from /etc/rclone-backup.filter \
  --transfers=4 \
  --log-file=/var/log/rclone-backup.log

เคล็ดลับ: รัน rclone copy --dry-run --filter-from /etc/rclone-backup.filter /var/ backup_enc:daily/test ก่อน เพื่อดูว่าไฟล์ไหนจะถูกส่งโดยไม่ได้ส่งจริง

ต้องการ VPS สำหรับ backup ที่เสถียร?

AsiaGB VPS เริ่มต้น 500 บาท/เดือน SSD เร็ว Network Bandwidth สูง เหมาะกับการส่ง backup ขนาดใหญ่ขึ้น Cloud Storage อัตโนมัติ

ดูแพ็กเกจ VPS