สำรองข้อมูล VPS ด้วย Restic (Encrypted Backup)
Restic คือเครื่องมือ backup ที่ออกแบบมาสำหรับยุค cloud — เข้ารหัสทุกอย่างฝั่ง client ก่อนส่งขึ้นปลายทาง, ทำ deduplication เก็บเฉพาะบล็อกที่เปลี่ยน (incremental จริง) และส่งขึ้นได้ทั้ง S3, MinIO, Backblaze B2, SFTP หรือ local disk ด้วย binary ตัวเดียว เหมาะมากสำหรับ backup VPS อัตโนมัติที่ต้องการความปลอดภัยและประหยัดพื้นที่ บทความนี้สอนตั้งแต่ติดตั้งจนถึง cron + retention policy ที่ใช้ได้จริง
ติดตั้ง Restic
# Ubuntu / Debian
sudo apt update && sudo apt install -y restic
sudo restic self-update # อัปเป็นเวอร์ชันล่าสุด
# ตรวจเวอร์ชัน
restic version
สร้าง Repository (ปลายทาง backup)
ตัวอย่างใช้ S3-compatible (MinIO/Backblaze) — Restic จะถามตั้งรหัสผ่านสำหรับเข้ารหัส repo:
# ตั้ง env สำหรับ S3-compatible
export AWS_ACCESS_KEY_ID="your-access-key"
export AWS_SECRET_ACCESS_KEY="your-secret-key"
export RESTIC_REPOSITORY="s3:https://s3.yourdomain.com/backups"
export RESTIC_PASSWORD="a-long-strong-passphrase"
# สร้าง repo ครั้งแรก
restic init
RESTIC_PASSWORD ไว้ในที่ปลอดภัยนอก VPS — ถ้าทำหาย จะถอดรหัส backup ไม่ได้เลย ไม่มีทางกู้ ไม่มี backdoor นี่คือราคาของการเข้ารหัสจริงBackup ครั้งแรกและครั้งถัดไป
# backup โฟลเดอร์สำคัญ
restic backup /var/www /etc /home --tag manual
# ครั้งถัดไป Restic จะส่งเฉพาะส่วนที่เปลี่ยน (incremental อัตโนมัติ)
restic backup /var/www /etc /home --tag daily
# ดู snapshot ทั้งหมด
restic snapshots
ตั้ง Cron + Retention Policy
สร้างสคริปต์ที่ backup แล้วลบ snapshot เก่าตามนโยบาย เพื่อไม่ให้ปลายทางโตไม่หยุด:
# /usr/local/bin/restic-backup.sh
#!/bin/bash
export AWS_ACCESS_KEY_ID="your-access-key"
export AWS_SECRET_ACCESS_KEY="your-secret-key"
export RESTIC_REPOSITORY="s3:https://s3.yourdomain.com/backups"
export RESTIC_PASSWORD_FILE="/root/.restic-pass"
restic backup /var/www /etc /home --tag daily
# เก็บ 7 วันล่าสุด, 4 สัปดาห์, 6 เดือน แล้วลบที่เหลือ + เคลียร์ข้อมูลขยะ
restic forget --keep-daily 7 --keep-weekly 4 --keep-monthly 6 --prune
# chmod 700 และตั้ง crontab (ตี 2 ทุกคืน)
# 0 2 * * * /usr/local/bin/restic-backup.sh >> /var/log/restic.log 2>&1
การวาง backup ปลายทาง คนละที่กับ VPS สำคัญที่สุด — ถ้าใช้ Object Storage หรือ VPS สำรองอีกเครื่อง ควรเลือกผู้ให้บริการที่มี datacenter ในไทย/สิงคโปร์เพื่อความเร็วในการกู้คืน
ตรวจสอบว่า Backup ทำงานถูกต้อง
backup ที่ "รันสำเร็จ" แต่ "กู้คืนไม่ได้" คือ backup ที่ไร้ค่า — ต้องทดสอบ restore จริงเป็นประจำ:
# 1. ดูว่ามี snapshot ใหม่จริง
restic snapshots --tag daily
# 2. ตรวจความสมบูรณ์ของ repo (integrity check)
restic check
restic check --read-data-subset=5% # สุ่มอ่าน 5% ของข้อมูลจริง
# 3. ทดสอบกู้ไฟล์ไปยังโฟลเดอร์ทดสอบ
restic restore latest --target /tmp/restore-test --include /etc/nginx
# 4. ดูสถิติพื้นที่ที่ใช้จริง (หลัง dedup)
restic stats latest
restic check สัปดาห์ละครั้ง และทดลอง restore เดือนละครั้ง — ทีมที่เจอ "backup เสีย" มักเจอตอนต้องกู้จริง ซึ่งสายเกินไปแล้วแก้ปัญหาที่พบบ่อย
Error: "repository is already locked"
กระบวนการ backup ก่อนหน้าค้างหรือถูกฆ่ากลางคัน ทำให้ lock ค้าง ปลดล็อกเมื่อแน่ใจว่าไม่มี backup อื่นรันอยู่:
restic unlock
Error: "wrong password or no key found"
RESTIC_PASSWORD ไม่ตรงกับตอน init repo ตรวจว่าใช้ไฟล์/ตัวแปรถูก และไม่มีช่องว่าง/newline เกินใน password file:
cat -A /root/.restic-pass # ต้องไม่มี $ ซ้อนหรือช่องว่างท้าย
Backup ช้ามากครั้งแรก
ครั้งแรกต้องอัปโหลดข้อมูลทั้งหมดจึงช้าเป็นปกติ ครั้งถัดไปจะเร็วเพราะ incremental จำกัด bandwidth ได้ด้วย --limit-upload (KiB/s) เพื่อไม่ให้กิน traffic จนเว็บช้า
ปลายทางโตไม่หยุดทั้งที่ตั้ง forget แล้ว
restic forget แค่ลบ snapshot reference ต้องมี --prune ด้วยจึงจะลบข้อมูลจริงออกจาก repo ตรวจว่าสคริปต์ใส่ --prune และรันสำเร็จ
คำถามที่พบบ่อย
Restic ต่างจาก rsync อย่างไร?
rsync sync ไฟล์เป็นสำเนาตรงๆ ไม่มีเข้ารหัสและไม่มีประวัติย้อนหลังในตัว ส่วน Restic เก็บเป็น snapshot มีประวัติหลายเวอร์ชัน เข้ารหัสทั้งหมด และ dedup จึงเหมาะกับ backup ระยะยาวมากกว่า แต่ rsync ยังเร็วและง่ายกว่าสำหรับ mirror ไฟล์ทันที
เก็บ backup ไว้ที่ไหนดี?
ยึดหลัก 3-2-1: มีอย่างน้อย 3 ชุด, 2 สื่อ/ที่ต่างกัน, 1 ชุดอยู่นอก VPS ตัวจริง เช่น Object Storage (MinIO/B2/S3) หรือ VPS สำรองอีกเครื่องในคนละ datacenter
Restic backup ฐานข้อมูลได้ไหม?
ได้แต่ต้อง dump ออกมาเป็นไฟล์ก่อน (เช่น mysqldump / pg_dump) แล้วให้ Restic backup ไฟล์นั้น — อย่า backup ไฟล์ data ของ DB ที่กำลังเขียนอยู่ตรงๆ เพราะอาจได้ snapshot ที่ inconsistent