คำตอบสั้น ๆ: สำรองข้อมูลแบบเพิ่มส่วนต่างและเข้ารหัสตั้งแต่ต้นทาง เก็บไว้บนเซิร์ฟเวอร์อื่นหรือ Object Storage พร้อมนโยบายเก็บย้อนหลังและการซ้อมกู้คืน
คู่มือนี้อธิบาย restic ทีละขั้นตอน พร้อมคำสั่งที่ใช้ได้จริงและปัญหาที่พบบ่อย
การสำรองข้อมูลที่ดีต้องตอบได้สามข้อ ข้อมูลอยู่คนละเครื่องกับต้นฉบับ ข้อมูลถูกเข้ารหัสก่อนออกจากเครื่อง และเคยซ้อมกู้คืนจริงแล้ว การใช้ tar ร่วมกับ rsync ตอบข้อแรกได้ แต่ข้อสองต้องจัดการเอง และมักกินพื้นที่มากเพราะสำรองทั้งก้อนทุกครั้ง
restic ตอบทั้งสามข้อในเครื่องมือเดียว มันเข้ารหัสทุกอย่างก่อนส่งออก เก็บเฉพาะส่วนที่เปลี่ยน และมีคำสั่งตรวจสอบความถูกต้องของข้อมูลสำรองในตัว
สิ่งที่ต้องเตรียม
- Linux Server ที่ต้องการสำรองข้อมูล
- ปลายทางเก็บข้อมูล เลือกอย่างใดอย่างหนึ่ง เซิร์ฟเวอร์อื่นที่เข้าผ่าน SFTP ได้ หรือ Object Storage ที่รองรับ S3
- ที่เก็บรหัสผ่านของที่เก็บข้อมูลอย่างปลอดภัย เพราะหากลืมจะกู้ข้อมูลไม่ได้เลย
# Ubuntu / Debian
sudo apt install -y restic
# AlmaLinux / Rocky Linux
sudo dnf install -y restic
restic version
ขั้นตอนที่ 1: เตรียมข้อมูลการเชื่อมต่อ
sudo mkdir -p /root/.restic
sudo nano /root/.restic/env
สำหรับ S3 หรือ Object Storage
export RESTIC_REPOSITORY="s3:https://s3.example.com/backup-web1"
export AWS_ACCESS_KEY_ID="your-access-key"
export AWS_SECRET_ACCESS_KEY="your-secret-key"
export RESTIC_PASSWORD_FILE="/root/.restic/password"
สำหรับ SFTP ไปเซิร์ฟเวอร์อื่น
export RESTIC_REPOSITORY="sftp:[email protected]:/srv/backups/web1"
export RESTIC_PASSWORD_FILE="/root/.restic/password"
สร้างรหัสผ่านของที่เก็บข้อมูล
openssl rand -base64 48 | sudo tee /root/.restic/password > /dev/null
sudo chmod 600 /root/.restic/password /root/.restic/env
คัดลอกรหัสผ่านนี้ไปเก็บนอกเครื่องทันที เช่นในโปรแกรมจัดการรหัสผ่านขององค์กร หากเครื่องพังและไม่มีรหัสผ่านนี้ ข้อมูลสำรองทั้งหมดจะเปิดไม่ได้อย่างถาวร
ขั้นตอนที่ 2: สร้างที่เก็บข้อมูล
source /root/.restic/env
sudo -E restic init
ตรวจว่าสร้างสำเร็จ
sudo -E restic snapshots
ขั้นตอนที่ 3: สำรองข้อมูลครั้งแรก
sudo -E restic backup \
--exclude-caches \
--exclude='/var/www/*/storage/logs' \
--exclude='*.tmp' \
/etc /var/www /home /root
ครั้งแรกจะใช้เวลานานเพราะต้องส่งข้อมูลทั้งหมด ครั้งถัดไปจะเร็วมากเพราะส่งเฉพาะส่วนที่เปลี่ยน
สร้างไฟล์รายการยกเว้นเพื่อดูแลง่าย
sudo nano /root/.restic/excludes.txt
/proc
/sys
/dev
/run
/tmp
/var/tmp
/var/cache
/var/lib/mysql
*.sock
node_modules
.git
ยกเว้น /var/lib/mysql ไว้เสมอ การคัดลอกไฟล์ฐานข้อมูลขณะที่ระบบทำงานอยู่จะได้ไฟล์ที่เสียหาย ให้สำรองฐานข้อมูลด้วย mysqldump ลงไฟล์ก่อน แล้วค่อยให้ restic เก็บไฟล์นั้นไป
ขั้นตอนที่ 4: เขียนสคริปต์สำรองข้อมูล
sudo nano /usr/local/bin/restic-backup.sh
#!/bin/bash
set -euo pipefail
source /root/.restic/env
DUMP=/var/backups/mysql
mkdir -p "$DUMP"
# 1) ดัมป์ฐานข้อมูลก่อน
mysqldump --single-transaction --routines --all-databases \
| gzip > "$DUMP/all.sql.gz"
# 2) สำรองทั้งหมดขึ้นที่เก็บข้อมูล
restic backup \
--exclude-file=/root/.restic/excludes.txt \
--exclude-caches \
--tag automated \
/etc /var/www /home /root "$DUMP"
# 3) เก็บย้อนหลังตามนโยบาย แล้วคืนพื้นที่
restic forget \
--keep-daily 14 \
--keep-weekly 8 \
--keep-monthly 12 \
--prune
# 4) ตรวจความถูกต้องของข้อมูลบางส่วน
restic check --read-data-subset=5%
sudo chmod +x /usr/local/bin/restic-backup.sh
sudo /usr/local/bin/restic-backup.sh
นโยบายในขั้นที่ 3 แปลว่าเก็บรายวัน 14 ชุด รายสัปดาห์ 8 ชุด และรายเดือน 12 ชุด ซึ่งครอบคลุมทั้งกรณีลบไฟล์ผิดเมื่อวาน และกรณีที่เพิ่งพบว่าข้อมูลเสียหายมาหลายเดือนแล้ว
ขั้นตอนที่ 5: ตั้งเวลาอัตโนมัติ
sudo nano /etc/systemd/system/restic-backup.service
[Unit]
Description=สำรองข้อมูลด้วย restic
Wants=network-online.target
After=network-online.target
[Service]
Type=oneshot
ExecStart=/usr/local/bin/restic-backup.sh
Nice=10
IOSchedulingClass=best-effort
IOSchedulingPriority=7
sudo nano /etc/systemd/system/restic-backup.timer
[Unit]
Description=สำรองข้อมูลทุกวัน
[Timer]
OnCalendar=*-*-* 01:30:00
RandomizedDelaySec=900
Persistent=true
[Install]
WantedBy=timers.target
sudo systemctl daemon-reload
sudo systemctl enable --now restic-backup.timer
systemctl list-timers | grep restic
ขั้นตอนที่ 6: กู้คืนข้อมูล
source /root/.restic/env
# ดูรายการสำรองข้อมูลทั้งหมด
sudo -E restic snapshots
# ค้นหาไฟล์ว่าอยู่ในชุดไหนบ้าง
sudo -E restic find 'wp-config.php'
# กู้ทั้งชุดไปยังโฟลเดอร์ชั่วคราว
sudo -E restic restore latest --target /tmp/restore
# กู้เฉพาะบางเส้นทาง
sudo -E restic restore latest --target /tmp/restore --include /var/www/example.com
# กู้จากชุดใดชุดหนึ่ง
sudo -E restic restore 3f8a2b1c --target /tmp/restore
กู้ลงโฟลเดอร์ชั่วคราวก่อนเสมอ แล้วค่อยคัดลอกทับของจริง การกู้ทับตรง ๆ เสี่ยงที่จะทับไฟล์ที่ยังใช้งานได้อยู่
วิธีที่สะดวกที่สุดสำหรับการหาไฟล์คือเมานต์ข้อมูลสำรองเป็นโฟลเดอร์
sudo mkdir -p /mnt/restic
sudo -E restic mount /mnt/restic
# เปิดอีก Terminal แล้วเดินดูใน /mnt/restic/snapshots/