rclone: ซิงก์ไฟล์เซิร์ฟเวอร์ขึ้น S3 Object Storage อัตโนมัติ
คำตอบสั้น ๆ: ใช้ rclone ส่งโฟลเดอร์บน Linux Server ขึ้น Object Storage ที่รองรับ S3 ทดลองด้วย --dry-run จำกัดแบนด์วิดท์ เข้ารหัสด้วย crypt และตั้งเวลาด้วย systemd timer
คู่มือนี้อธิบาย rclone ทีละขั้นตอน พร้อมคำสั่งที่ใช้ได้จริงและปัญหาที่พบบ่อย
rclone คือโปรแกรมบรรทัดคำสั่งสำหรับคัดลอกและซิงก์ไฟล์ระหว่างเซิร์ฟเวอร์กับที่เก็บข้อมูลบนคลาวด์หลายสิบระบบ รวมถึง Object Storage ทุกเจ้าที่รองรับ S3 API เหมาะกับผู้ดูแลที่ต้องการเก็บสำเนาไฟล์เว็บ ไฟล์อัปโหลด หรือไฟล์ Dump ฐานข้อมูลไว้นอกเครื่อง เผื่อดิสก์เสีย ลบไฟล์ผิด หรือโดนแรนซัมแวร์
เมื่อทำตามคู่มือนี้ครบ คุณจะมี Remote ที่ชี้ไป Bucket ของคุณ งานซิงก์ที่ทดลองก่อนด้วย --dry-run เก็บไฟล์ที่ถูกลบหรือแก้ไขไว้ในโฟลเดอร์ archive จำกัดแบนด์วิดท์ช่วงเวลาทำงาน เข้ารหัสไฟล์สำคัญ และรันเองทุกคืน ต่างจาก restic ตรงที่ rclone เก็บไฟล์ตามโครงสร้างเดิม เปิดดูด้วยเครื่องมือ S3 ตัวไหนก็ได้
สิ่งที่ต้องเตรียม
- Linux Server ที่ใช้ Ubuntu 22.04/24.04, Debian 12 หรือ AlmaLinux/Rocky Linux 9 และผู้ใช้ที่มีสิทธิ์
sudo เช่น Cloud Linux Server
- Bucket บน Object Storage ที่รองรับ S3 พร้อม Endpoint (ตัวอย่างใช้
https://s3.example.com), Access Key และ Secret Key ที่ให้สิทธิ์เฉพาะ Bucket นี้ หรือใช้ MinIO ที่ติดตั้งเอง
- รายการโฟลเดอร์ที่จะสำรอง เช่น
/var/www และ /var/backups/mysql สำหรับฐานข้อมูลให้ Dump เป็นไฟล์ก่อนเสมอ ห้ามคัดลอกไฟล์ข้อมูลของ MySQL ขณะทำงาน
- เซิร์ฟเวอร์ออกอินเทอร์เน็ตทาง HTTPS (พอร์ต 443) ได้
ไฟล์เว็บซิงก์ไป current/ ไฟล์ที่ถูกลบย้ายไป archive/ ส่วน Dump ฐานข้อมูลผ่าน crypt ก่อน
ขั้นตอนที่ 1: ติดตั้ง rclone
แพ็กเกจใน Ubuntu และ Debian เป็นรุ่นเก่า แนะนำสคริปต์ทางการซึ่งติดตั้งรุ่นล่าสุดไว้ที่ /usr/bin/rclone ส่วน AlmaLinux และ Rocky Linux มีรุ่นใหม่ใน EPEL
# Ubuntu / Debian
sudo apt update && sudo apt install -y unzip curl
sudo -v ; curl https://rclone.org/install.sh | sudo bash
# AlmaLinux / Rocky Linux 9
sudo dnf install -y epel-release
sudo dnf install -y rclone
rclone version
ขั้นตอนที่ 2: สร้าง Remote ที่ชี้ไป Object Storage
งานสำรองจะรันด้วย root จึงสร้างค่าด้วย sudo ไฟล์ตั้งค่าจะอยู่ที่ /root/.config/rclone/rclone.conf พิมพ์ sudo rclone config แล้วตอบดังนี้
n (New remote) ตั้งชื่อ objstore
- Storage เลือก Amazon S3 Compliant Storage Providers (ชนิด
s3) แล้ว provider เลือก Other
env_auth ตอบ false แล้ววาง Access Key และ Secret Key
region เว้นว่างหรือใส่ตามที่ผู้ให้บริการกำหนด, endpoint ใส่ https://s3.example.com, acl เลือก private
- ไม่ต้องแก้ Advanced config แล้วตอบ
y เพื่อบันทึก
ความหมายของแต่ละค่าและตัวเลือกเพิ่มเติมดูได้จาก เอกสาร S3 ของ rclone
ทดสอบว่าคีย์ใช้ได้ด้วยการแสดงไฟล์ใน Bucket (ถ้ายังไม่มี Bucket สร้างด้วย sudo rclone mkdir objstore:web01-backup)
sudo rclone lsf objstore:web01-backup
sudo rclone config file
ขั้นตอนที่ 3: เข้าใจ sync กับ copy แล้วทดลองด้วย --dry-run
rclone copy คัดลอกไฟล์ใหม่และไฟล์ที่เปลี่ยนไปปลายทาง แต่ไม่ลบอะไรเลย ส่วน rclone sync ทำให้ปลายทางเหมือนต้นทางทุกประการ ไฟล์ที่ถูกลบบนเซิร์ฟเวอร์จะถูกลบใน Bucket ด้วย ข้อนี้คือความเสี่ยงหลัก ถ้าพิมพ์ Path ต้นทางผิดหรือดิสก์ยังไม่ Mount รอบถัดไปอาจลบสำเนาทั้งหมด
sync ทำให้ปลายทางเหมือนต้นทางรวมถึงการลบ จึงควรใช้คู่กับ --backup-dir
ทุกครั้งที่สร้างคำสั่งใหม่ ให้รันพร้อม --dry-run ก่อน rclone จะแสดงว่าจะคัดลอกหรือลบไฟล์ใดโดยไม่แตะข้อมูลจริง
sudo rclone sync /var/www objstore:web01-backup/current/www --dry-run
บรรทัด Skipped delete คือไฟล์ที่ sync จะลบใน Bucket ตรวจให้แน่ใจก่อนรันจริง
ขั้นตอนที่ 4: รัน sync จริงพร้อมเก็บไฟล์ที่ถูกลบไว้
ใช้ --backup-dir ย้ายไฟล์ที่จะถูกลบหรือถูกเขียนทับไปไว้ในโฟลเดอร์ตามวันที่ แทนการลบทิ้ง Path ของ backup-dir ต้องอยู่ใน Remote เดียวกันแต่ห้ามซ้อนกับปลายทาง
sudo rclone sync /var/www objstore:web01-backup/current/www \
--backup-dir objstore:web01-backup/archive/2026-10-21 \
--exclude "cache/**" --exclude "*.log" \
--max-delete 200 --fast-list --transfers 8 --progress
--exclude ข้ามโฟลเดอร์ cache และไฟล์ Log ที่ไม่ต้องสำรอง
--max-delete 200 หยุดงานทันทีถ้าต้องลบเกิน 200 ไฟล์ เป็นเบรกกันพลาด
--fast-list ลดจำนวน API Request ซึ่งหลายผู้ให้บริการคิดค่าบริการตามจำนวน Request แลกกับใช้ RAM มากขึ้นเล็กน้อย
ขั้นตอนที่ 5: จำกัดแบนด์วิดท์ไม่ให้เว็บช้า
หน่วยของ --bwlimit คือไบต์ต่อวินาที 20M หมายถึง 20 MiB/s หรือประมาณ 168 Mbit/s ตั้งเป็นตารางเวลาได้ เช่น ช่วงทำงานจำกัด 5M หลังหนึ่งทุ่มไม่จำกัด หรือจำกัดเฉพาะขาอัปโหลดด้วยรูปแบบ 10M:off
--bwlimit "08:00,5M 19:00,off"
ขั้นตอนที่ 6: เข้ารหัสไฟล์ด้วย crypt Remote
สำหรับไฟล์ที่มีข้อมูลส่วนบุคคล เช่น Dump ฐานข้อมูล ให้สร้าง Remote ชนิด crypt ซ้อนบน objstore rclone จะเข้ารหัสทั้งเนื้อหาและชื่อไฟล์ก่อนอัปโหลด ผู้ที่เปิด Bucket จะเห็นแต่ชื่อไฟล์แบบสุ่ม (รายละเอียดการเข้ารหัสอยู่ใน เอกสาร crypt ของ rclone)
sudo rclone config แล้ว n ตั้งชื่อ objcrypt เลือกชนิด crypt
remote ใส่ objstore:web01-backup-enc, filename_encryption เลือก standard, directory_name_encryption ตอบ true
- ตั้ง password และ password2 (salt) เป็นรหัสยาวที่สร้างใหม่ ห้ามซ้ำกับรหัสอื่น
sudo rclone sync /var/backups/mysql objcrypt:mysql --dry-run
sudo rclone ls objcrypt:mysql
คำเตือน: ถ้าลืมรหัสทั้งสองค่า จะไม่มีใครถอดรหัสไฟล์ได้อีก และรหัสใน rclone.conf ถูกเก็บแบบ obscured ซึ่งไม่ใช่การเข้ารหัส ให้เก็บสำเนาไฟล์นี้หรือรหัสทั้งสองไว้ใน Password Manager นอกเซิร์ฟเวอร์
ขั้นตอนที่ 7: ตั้งเวลารันอัตโนมัติด้วย systemd timer
รวมคำสั่งไว้ในสคริปต์ /usr/local/bin/offsite-backup.sh พร้อมลบโฟลเดอร์ archive ที่เก่ากว่า 30 วันตามชื่อโฟลเดอร์ (ไม่ใช้ --min-age เพราะไฟล์ใน archive ยังคงวันที่แก้ไขเดิม อาจถูกลบเร็วเกินไป)
#!/bin/bash
set -euo pipefail
DAY=$(date +%F)
CUTOFF=$(date -d '30 days ago' +%F)
/usr/bin/rclone sync /var/www objstore:web01-backup/current/www \
--backup-dir "objstore:web01-backup/archive/$DAY" \
--exclude "cache/**" --exclude "*.log" --max-delete 200 \
--fast-list --bwlimit "08:00,5M 19:00,off" \
--log-file /var/log/offsite-backup.log --log-level INFO
for d in $(/usr/bin/rclone lsf --dirs-only objstore:web01-backup/archive/); do
if [[ "${d%/}" < "$CUTOFF" ]]; then
/usr/bin/rclone purge "objstore:web01-backup/archive/$d"
fi
done
สร้าง Service และ Timer แล้วเปิดใช้งาน (ดูพื้นฐานที่ systemd Timer แทน Cron)
sudo chmod 700 /usr/local/bin/offsite-backup.sh
# /etc/systemd/system/offsite-backup.service
[Unit]
Description=Offsite backup to Object Storage
Wants=network-online.target
After=network-online.target
[Service]
Type=oneshot
ExecStart=/usr/local/bin/offsite-backup.sh
Nice=10
IOSchedulingClass=idle
# /etc/systemd/system/offsite-backup.timer
[Timer]
OnCalendar=*-*-* 02:30:00
RandomizedDelaySec=15m
Persistent=true
[Install]
WantedBy=timers.target
sudo systemctl daemon-reload
sudo systemctl enable --now offsite-backup.timer
sudo systemctl start offsite-backup.service
journalctl -u offsite-backup.service -n 20 --no-pager
ตรวจสอบว่า rclone สำรองครบและกู้คืนได้
เปรียบเทียบต้นทางกับปลายทางด้วยตัวกรองชุดเดียวกัน ผลที่ต้องการคือ 0 differences found แล้วลองกู้ไฟล์หนึ่งไฟล์กลับมาที่ /tmp การสำรองที่ไม่เคยทดลองกู้ยังไม่นับว่าเป็นการสำรอง
sudo rclone check /var/www objstore:web01-backup/current/www --one-way \
--exclude "cache/**" --exclude "*.log"
sudo rclone copy objstore:web01-backup/current/www/example.com/index.php /tmp/restore-test/
ทำครบทุกข้อสีเขียว และหลีกเลี่ยงข้อสีแดงก่อนเปิด Timer
ปัญหาที่พบบ่อยเกี่ยวกับ rclone
rclone แจ้ง AccessDenied ทั้งที่ Access Key ถูกต้อง เกิดจากอะไร?
คีย์ที่จำกัดสิทธิ์เฉพาะหนึ่ง Bucket มักไม่มีสิทธิ์ดูรายชื่อ Bucket หรือสร้าง Bucket ให้ระบุชื่อ Bucket ในคำสั่งเสมอ เช่น objstore:web01-backup และเพิ่ม no_check_bucket = true ใต้ Remote ใน rclone.conf เพื่อไม่ให้ rclone พยายามสร้าง Bucket เอง
เจอ SignatureDoesNotMatch หรือ RequestTimeTooSkewed ต้องแก้อย่างไร?
ตรวจ Secret Key, Endpoint และ region ให้ตรงกับที่ผู้ให้บริการกำหนด ถ้าข้อความพูดถึงเวลา แปลว่านาฬิกาเครื่องคลาดเคลื่อน ให้เปิดซิงก์เวลาตาม คู่มือตั้ง Timezone และซิงก์เวลา
ทำไมทุกรอบอัปโหลดไฟล์ซ้ำทั้งหมด?
มักเกิดเมื่อไฟล์ใน Bucket ถูกอัปโหลดด้วยเครื่องมืออื่นจึงไม่มีข้อมูลวันที่แก้ไขที่ rclone เก็บไว้ ให้รันหนึ่งรอบด้วย --checksum เพื่อเทียบด้วยค่า Hash แทน รอบถัดไปจะส่งเฉพาะไฟล์ที่เปลี่ยน
ถ้า sync ลบไฟล์ใน Bucket ไปแล้ว กู้คืนได้หรือไม่?
ถ้าใช้ --backup-dir ไฟล์จะอยู่ใน archive/วันที่ คัดลอกกลับด้วย rclone copy ได้ทันที ถ้าไม่ได้ใช้ ให้ตรวจว่า Bucket เปิด Versioning ไว้หรือไม่ ทางที่ดีที่สุดคือใช้ --dry-run และ --max-delete ตั้งแต่แรก
ถ้าต้องการวางแผนสำรองข้อมูลหลายเซิร์ฟเวอร์ไปยัง Object Storage หรือกำหนดระยะเวลาเก็บสำเนาให้เหมาะกับธุรกิจ ติดต่อทีมงาน THAI DATA CLOUD หรือดูบริการ Cloud Server ที่ใช้เป็นต้นทางสำรองข้อมูลได้
อ่านเพิ่มเติมเกี่ยวกับ rclone