ลดความยุ่งยากในการใช้คลาวด์ พูดคุยกับเจ้าหน้าที่

สำรองข้อมูลแบบเข้ารหัสด้วย restic พร้อมตั้งเวลาอัตโนมัติ
Home สำรองข้อมูลแบบเข้ารหัสด้วย restic พร้อมตั้งเวลาอัตโนมัติ

สำรองข้อมูลแบบเข้ารหัสด้วย 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/

ขั้นตอนที่ 7: ซ้อมกู้คืนตามรอบ

ข้อมูลสำรองที่ไม่เคยกู้คืนคือข้อมูลสำรองที่ยังพิสูจน์ไม่ได้ว่าใช้ได้ ตั้งรอบซ้อมทุกไตรมาส

sudo -E restic check --read-data
sudo -E restic restore latest --target /tmp/drill --include /var/www
diff -r /var/www/example.com /tmp/drill/var/www/example.com | head

บันทึกผลการซ้อมไว้เป็นหลักฐาน ทั้งเวลาที่ใช้และปัญหาที่พบ เวลาที่ใช้กู้คืนจริงคือตัวเลขที่ต้องรู้ก่อนเกิดเหตุ

ปัญหาที่พบบ่อย

Fatal: unable to open config file

ที่เก็บข้อมูลยังไม่ถูกสร้าง หรือค่า RESTIC_REPOSITORY ผิด ตรวจว่า source /root/.restic/env แล้วหรือยัง เพราะ sudo ไม่ส่งตัวแปรสภาพแวดล้อมให้โดยค่าเริ่มต้น ต้องใช้ sudo -E

สำรองข้อมูลช้ามาก

ครั้งแรกช้าเป็นปกติ หากครั้งถัดไปยังช้า ให้ดูว่ามีไฟล์ขนาดใหญ่ที่เปลี่ยนทั้งไฟล์ทุกวันหรือไม่ เช่น ไฟล์ดัมป์ฐานข้อมูลที่บีบอัดแล้ว ลองไม่บีบอัดก่อนให้ restic เก็บ เพราะ restic แยกส่วนต่างได้ดีกว่ากับไฟล์ที่ไม่ถูกบีบอัด

พื้นที่ปลายทางไม่ลดลงหลัง forget

ต้องมี --prune ด้วย คำสั่ง forget เฉย ๆ แค่ลบป้ายชื่อของชุดสำรอง ไม่ได้ลบข้อมูลจริง

ที่เก็บข้อมูลถูกล็อกค้าง

เกิดเมื่อกระบวนการก่อนหน้าถูกฆ่ากลางคัน ตรวจว่าไม่มีงานค้างอยู่จริงแล้วปลดล็อกด้วย sudo -E restic unlock

ต้องการวางแผนสำรองข้อมูลและ DR Site ที่มีทีมวิศวกรดูแล ติดต่อ THAI DATA CLOUD ได้ที่ https://thaidata.cloud/contact/

ผู้ให้บริการคลาวด์ไทย
เพื่อธุรกิจของคนไทย

"มุ่งมั่น" และ "มั่นคง"
พร้อมรับมือทุกการเติบโต
Trust Cloud
คลาว์ที่ปลอดภัย
คือรากฐานที่มั่นคง
cloud security