ติดตั้ง BorgBackup บน VPS สำหรับ backup แบบ deduplication

ติดตั้ง BorgBackup บน VPS: Backup Deduplication เข้ารหัส

สิงหาคม 2026 · อ่าน 9 นาที

BorgBackup (หรือ Borg) คือเครื่องมือ backup บน Linux ที่เน้น deduplication — ข้อมูลชิ้นเดิมจะถูกเก็บเพียงครั้งเดียว ไม่ว่าจะ backup กี่ครั้ง ทำให้ประหยัด disk space อย่างมาก โดยเฉพาะเมื่อมี backup หลาย version ข้อดีสำคัญคือ encryption ในตัว, compression ได้หลายแบบ (lz4/zstd/zlib/lzma), และ backup ไปยัง remote server ผ่าน SSH ได้โดยตรง จุดที่ต่างจาก rsync คือ Borg เก็บ snapshot เป็น archive แต่ละชุดและสามารถ mount ดูไฟล์ได้เหมือน filesystem ธรรมดา

เปรียบเทียบ BorgBackup กับเครื่องมือ backup อื่น

คุณสมบัติBorgBackupResticrsync
Deduplication✅ Block-level✅ Content-defined❌ ไม่มี
Encryption✅ Built-in (AES-256)✅ Built-in❌ ต้องใช้ SFTP
Compression✅ lz4/zstd/zlib/lzma✅ zstd/zlib❌ ไม่มี
Remote SSH✅ Native✅ ผ่าน plugin✅ Native
Mount เป็น FUSE✅ ง่ายมาก✅ มี❌ ไม่มี
ความเร็วเร็วมาก (incremental)เร็วเร็ว

ติดตั้ง BorgBackup บน Ubuntu/Debian

# อัปเดต package list
sudo apt update

# ติดตั้ง BorgBackup
sudo apt install -y borgbackup

# ตรวจสอบ version ที่ได้
borg --version
# borg 1.2.x หรือใหม่กว่า

หากต้องการ version ล่าสุดติดตั้งผ่าน pip:

# ติดตั้งผ่าน pip (ได้ version ใหม่กว่า)
pip3 install borgbackup

# หรือดาวน์โหลด binary โดยตรงจาก GitHub Releases
wget https://github.com/borgbackup/borg/releases/latest/download/borg-linux64 -O /usr/local/bin/borg
chmod +x /usr/local/bin/borg

สร้าง Repository (Initialize)

Repository คือโฟลเดอร์ที่ Borg ใช้เก็บ archive ทั้งหมด ต้อง initialize ก่อนใช้งาน:

# สร้าง repository บนเครื่องเดียวกัน (local backup)
borg init --encryption=repokey /backup/borg-repo

# หรือสร้าง repository บน remote server (ผ่าน SSH)
borg init --encryption=repokey user@backup-server:/home/user/borg-repo

# ระบบจะให้ตั้ง passphrase — ตั้งให้แข็งแกร่งและเก็บไว้ให้ดี!
Tip: ตัวเลือก --encryption=repokey เข้ารหัส key ไว้ใน repository ตัวเอง สะดวกแต่ต้อง backup passphrase ด้วย หรือใช้ --encryption=keyfile เก็บ key แยกต่างหากเพื่อความปลอดภัยสูงกว่า

สร้าง Backup Archive ครั้งแรก

# รูปแบบ: borg create REPO::ARCHIVE_NAME PATH_TO_BACKUP
borg create /backup/borg-repo::backup-{now:%Y-%m-%d} /home /etc /var/www

# พร้อม options ที่แนะนำ
borg create \
  --verbose \
  --filter AME \
  --list \
  --stats \
  --show-rc \
  --compression lz4 \
  --exclude-caches \
  --exclude '/home/*/.cache' \
  --exclude '/home/*/.local/share/Trash' \
  /backup/borg-repo::backup-{now:%Y-%m-%dT%H:%M:%S} \
  /home \
  /etc \
  /var/www

หลัง backup เสร็จ จะแสดงสถิติ deduplication:

------------------------------------------------------------------------------
Archive name: backup-2026-08-12T09:00:00
Time (start): Tue, 2026-08-12 09:00:00
Time (end):   Tue, 2026-08-12 09:02:15
Duration: 2 minutes 15 seconds
------------------------------------------------------------------------------
                       Original size      Compressed size    Deduplicated size
This archive:               12.50 GB              8.21 GB            1.23 GB
All archives:               37.50 GB             24.63 GB            2.41 GB
------------------------------------------------------------------------------

Prune — จัดการ Archive เก่าไม่ให้เต็ม Disk

# เก็บ: 7 daily, 4 weekly, 6 monthly, 1 yearly
borg prune \
  --list \
  --prefix 'backup-' \
  --show-rc \
  --keep-daily 7 \
  --keep-weekly 4 \
  --keep-monthly 6 \
  --keep-yearly 1 \
  /backup/borg-repo

# Compact เพื่อคืน disk space จริง (borg 1.2+)
borg compact /backup/borg-repo

# ดู archive ที่เหลืออยู่
borg list /backup/borg-repo

Restore ไฟล์จาก Backup

# ดู archive ทั้งหมดใน repository
borg list /backup/borg-repo

# ดูไฟล์ภายใน archive เฉพาะ
borg list /backup/borg-repo::backup-2026-08-12T09:00:00

# Restore archive ทั้งหมดไปยัง /tmp/restore
mkdir -p /tmp/restore
cd /tmp/restore
borg extract /backup/borg-repo::backup-2026-08-12T09:00:00

# Restore เฉพาะไฟล์/โฟลเดอร์ที่ต้องการ
borg extract /backup/borg-repo::backup-2026-08-12T09:00:00 home/user/Documents

# Mount archive เพื่อดูและ copy ไฟล์แบบ interactive
sudo apt install -y python3-fuse
borg mount /backup/borg-repo::backup-2026-08-12T09:00:00 /mnt/borg-restore
ls /mnt/borg-restore/
# เมื่อเสร็จแล้ว unmount
borg umount /mnt/borg-restore

Script + Cron สำหรับ Backup อัตโนมัติ

สร้าง backup script ที่ครอบคลุม create + prune + compact:

sudo nano /usr/local/bin/borg-backup.sh
#!/usr/bin/env bash
set -euo pipefail

export BORG_REPO='/backup/borg-repo'
export BORG_PASSPHRASE='your-strong-passphrase-here'

LOG="/var/log/borg-backup.log"
exec >>"$LOG" 2>&1
echo "=== Borg Backup: $(date) ==="

borg create \
  --verbose --filter AME --list --stats --show-rc \
  --compression lz4 \
  --exclude-caches \
  --exclude '/home/*/.cache' \
  ::'{hostname}-{now:%Y-%m-%dT%H:%M:%S}' \
  /home /etc /var/www /root
CREATE_RC=$?

borg prune \
  --list --prefix '{hostname}-' --show-rc \
  --keep-daily 7 --keep-weekly 4 --keep-monthly 6 \
  ::
PRUNE_RC=$?

borg compact ::

echo "=== Done: create=$CREATE_RC prune=$PRUNE_RC ==="
exit $(( CREATE_RC + PRUNE_RC ))
# ให้สิทธิ์ execute และทดสอบ
sudo chmod +x /usr/local/bin/borg-backup.sh
sudo /usr/local/bin/borg-backup.sh

# เพิ่มใน crontab (backup ทุกวัน 2:00 AM)
sudo crontab -e
# เพิ่มบรรทัดนี้:
# 0 2 * * * /usr/local/bin/borg-backup.sh

Backup ไปยัง Remote Server ผ่าน SSH

# ตั้ง SSH key ไม่ต้องพิมพ์ password
ssh-keygen -t ed25519 -C "borg-backup" -f ~/.ssh/id_borg
ssh-copy-id -i ~/.ssh/id_borg.pub user@backup-server

# Initialize remote repository
borg init \
  --encryption=repokey \
  user@backup-server:/backup/borg-myserver

# Backup ไป remote (ตั้งค่า BORG_REPO ใน script)
export BORG_REPO='user@backup-server:/backup/borg-myserver'
export BORG_RSH='ssh -i ~/.ssh/id_borg'
borg create --compression lz4 ::'backup-{now:%Y-%m-%dT%H:%M:%S}' /home /etc

ตรวจสอบว่า BorgBackup ทำงานถูกต้อง

# แสดง archive ทั้งหมดพร้อม size
borg list /backup/borg-repo

# ตรวจสอบความสมบูรณ์ของ repository (integrity check)
borg check /backup/borg-repo

# ตรวจสอบ data จริง (ใช้เวลานานกว่า แต่มั่นใจสูงสุด)
borg check --verify-data /backup/borg-repo

# ดูสถิติรวมของ repository
borg info /backup/borg-repo

# ดู log backup ล่าสุด
tail -50 /var/log/borg-backup.log

# ทดสอบ restore ไฟล์เดียวเพื่อยืนยัน
cd /tmp
borg extract /backup/borg-repo::$(borg list /backup/borg-repo --last 1 --format '{archive}') etc/hostname
cat /tmp/etc/hostname
Tip: ตั้ง cron รัน borg check /backup/borg-repo สัปดาห์ละครั้ง และ borg check --verify-data เดือนละครั้ง — backup ที่ไม่ได้ verify อาจพบว่า restore ไม่ได้จริงตอนฉุกเฉิน

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

Error: "passphrase supplied in BORG_PASSPHRASE is incorrect"

Passphrase ใน environment variable ไม่ตรงกับที่ตั้งไว้ตอน init ตรวจสอบ special character ที่อาจถูก shell escape ผิด เช่น !, $, \

# ทดสอบ passphrase โดยตรง (ใส่ quotes ให้ถูก)
BORG_PASSPHRASE='your-passphrase' borg list /backup/borg-repo

# ถ้า passphrase มี single quote ให้ใช้ double quote แทน
BORG_PASSPHRASE="your'passphrase" borg list /backup/borg-repo

Error: "Failed to create/acquire the lock"

Backup process ก่อนหน้า crash โดยไม่ปล่อย lock ให้ตรวจสอบก่อนว่าไม่มี backup กำลังรันจริง แล้วค่อย break lock

# ตรวจสอบว่ามี borg process รันอยู่ไหม
ps aux | grep borg

# ถ้าไม่มี ให้ break lock
borg break-lock /backup/borg-repo

Error: "Repository already exists" ตอน init

โฟลเดอร์นั้นมี repository อยู่แล้ว ตรวจสอบก่อนว่าต้องการใช้ repository เดิมหรือสร้างใหม่

# ดูว่า repository มีอะไรอยู่
borg list /backup/borg-repo

# ถ้าต้องการสร้างใหม่จริงๆ (ข้อมูลเดิมหายทั้งหมด!)
rm -rf /backup/borg-repo
borg init --encryption=repokey /backup/borg-repo

Error: "disk quota exceeded" บน remote server

พื้นที่ remote เต็ม รัน prune และ compact เพื่อลบ archive เก่าและคืน space

# รัน prune ลด archive เก่า
borg prune --keep-daily 3 --keep-weekly 2 /backup/borg-repo

# Compact คืน space จริง
borg compact /backup/borg-repo

# ตรวจสอบ disk บน remote
ssh user@backup-server "df -h /backup"

Error: "Connection closed by remote host" ระหว่าง backup

SSH session timeout ขณะ backup ขนาดใหญ่ ให้ตั้ง ServerAliveInterval ใน SSH config

# เพิ่มใน ~/.ssh/config
Host backup-server
    ServerAliveInterval 60
    ServerAliveCountMax 10

# หรือตั้งผ่าน BORG_RSH
export BORG_RSH='ssh -o ServerAliveInterval=60 -o ServerAliveCountMax=10'

คำถามที่พบบ่อย

BorgBackup เหมาะกับ VPS ขนาดเล็กไหม?

เหมาะมากครับ เนื่องจาก deduplication ทำให้ backup ครั้งแรกใช้ space เท่าข้อมูลจริง แต่ backup ครั้งต่อไปจะเพิ่มเฉพาะ block ที่เปลี่ยนแปลง VPS ที่มีข้อมูล 20GB และ backup ทุกวัน 30 วัน อาจใช้ repository space แค่ 25-30GB แทนที่จะเป็น 600GB แบบ full backup ทั่วไป

BorgBackup กับ Restic ควรเลือกใช้ตัวไหน?

ทั้งคู่ดีมาก Restic เขียนด้วย Go รองรับ S3/B2/GCS โดยตรงและใช้งานบน Windows ได้ด้วย ส่วน BorgBackup เขียนด้วย Python, mature กว่า, deduplication มีประสิทธิภาพสูง แต่รองรับ Linux/macOS เท่านั้น ถ้า backup ไป cloud storage แนะนำ Restic ถ้า backup ระหว่าง Linux server ด้วยกัน BorgBackup ยอดเยี่ยมกว่า

จะ backup MySQL/PostgreSQL ด้วย BorgBackup ได้ไหม?

ได้ แต่ต้อง dump ก่อนเนื่องจากการ backup ไฟล์ database ที่ใช้งานอยู่อาจได้ข้อมูล corrupt ให้ dump ก่อนแล้วค่อย include ไฟล์ dump ใน Borg archive:

# ตัวอย่างใน backup script
mysqldump --all-databases | gzip > /tmp/mysql-backup.sql.gz
pg_dumpall | gzip > /tmp/postgres-backup.sql.gz

borg create ... /tmp/mysql-backup.sql.gz /tmp/postgres-backup.sql.gz /home /etc

# ลบ dump หลัง backup เสร็จ
rm -f /tmp/mysql-backup.sql.gz /tmp/postgres-backup.sql.gz