Backup VPS Tự Động Với Restic + Backblaze B2 2026 — Tôi Mất Đúng Một Lần Để Học Bài Học Backup

📅 25/06/2026 · ⏱ 14 phút đọc · 🏷 Backup · DevOps · Bảo mật

1. Câu Chuyện Backup — Có Bao Nhiêu Dev Mất Data Mới Chịu Cài?

Năm 2023, tôi quản lý một VPS cho khách — 3 WordPress site, 1 Node.js API, và 8GB dữ liệu upload. Tôi nghĩ "à, host tự backup hằng ngày". Cho đến một hôm, tôi SSH vào thì thấy lệnh sudo rm -rf / đã được chạy bởi một user bị compromise (một plugin WordPress lỗi từ 2019). Toàn bộ dữ liệu bay. Khôi phục từ host snapshot? Họ chỉ giữ snapshot 7 ngày và snapshot cuối bị corrupt. Tôi mất 3 site của khách, may có database backup manual từ 2 tuần trước. Không sao lưu file upload.

Từ đó, tôi set backup cho mọi VPS mình làm. Và công cụ tôi chọn là restic + Backblaze B2. Lý do: rẻ, mã hóa phía client, dedup thông minh, và quan trọng nhất — nó không đòi hỏi hạ tầng phức tạp. Không cần NAS riêng, không cần server backup thứ hai. Chỉ một bucket B2 và một file script cron. Chi phí: khoảng 50K/tháng cho 20GB dữ liệu backup + lịch sử snapshot 3 tháng.

2. Restic Là Gì? Tại Sao Lại Chọn Nó Thay Vì rsync, Borg, Duplicati?

Restic là công cụ backup mã nguồn mở viết bằng Go. Nó tạo snapshot mã hóa dữ liệu của bạn và gửi lên nhiều loại storage backend khác nhau. Điểm khác biệt so với các lựa chọn phổ biến:

Công cụMã hóa client-sideDedupBackend cloudKhôi phục từng filePhức tạp setup
ResticCó (AES-256-GCM)Có (content-defined chunking)S3, B2, SFTP, Azure, GCS, localCó, mount FUSEThấp
rsync + cronKhông (nếu không SSH tunnel)Không (full copy mỗi lần)Chỉ qua SSHThấp (nhưng không dedup)
BorgBackupLocal, SSH, SFTPCó, mount FUSETrung bình (mount hơi kỳ công)
DuplicatiNhiều (B2, S3, OneDrive...)Cao (Java, hay lỗi database)
KopiaS3, B2, GCS, localThấp (UI có sẵn)

Tôi chọn restic vì:

3. Chuẩn Bị: Tài Khoản Backblaze B2 + Bucket

3.1. Đăng ký Backblaze

Lên backblaze.com đăng ký. B2 tier free: 10GB storage + 1GB egress/ngày. Đủ cho VPS vài GB dữ liệu.

3.2. Tạo Bucket + App Key

4. Cài Restic Trên VPS

# Tải binary restic
curl -Lo /usr/local/bin/restic https://github.com/restic/restic/releases/latest/download/restic_linux_amd64.bz2
bzip2 -d /usr/local/bin/restic  # nếu tải về file .bz2
# Hoặc dùng apt
sudo apt install -y restic

Kiểm tra:

restic version
# restic 0.17.x compiled with go1.22

5. Khởi Tạo Restic Repository Trên B2

# Set biến môi trường
export AWS_ACCESS_KEY_ID="your_b2_keyID"
export AWS_SECRET_ACCESS_KEY="your_b2_applicationKey"
export RESTIC_REPOSITORY="s3:s3.us-west-004.backblazeb2.com/my-vps-backup"
export RESTIC_PASSWORD="your-very-strong-repo-password-here"
⚠️ Bẫy #1 — Mất RESTIC_PASSWORD là mất tất cả: restic mã hóa AES-256-GCM phía client. Không có password này, không thể giải mã snapshot nào — kể cả Backblaze cũng không. Lưu 2 nơi. Tôi để 1 bản trong password manager + 1 bản trên VPS ở /root/.restic-password (được backup... vào chính repo này — cần 1 vòng tròn logic để không kẹt).
# Khởi tạo repo (chạy 1 lần duy nhất)
restic init

# created restic repository at s3:.../my-vps-backup

6. Script Backup Tự Động — Cho Vào Cron

Tạo script backup script:

sudo nano /usr/local/bin/backup-vps.sh
#!/bin/bash
set -e

# === Cấu hình ===
export AWS_ACCESS_KEY_ID="b2_keyID_của_bạn"
export AWS_SECRET_ACCESS_KEY="b2_app_key_của_bạn"
export RESTIC_REPOSITORY="s3:s3.us-west-004.backblazeb2.com/my-vps-backup"
export RESTIC_PASSWORD_FILE="/root/.restic-password"

# === Các thư mục cần backup ===
BACKUP_DIRS=(
    "/etc"           # Config hệ thống
    "/var/www"       # Web app / WordPress
    "/root"          # Scripts + cron config
    "/home"          # User home
    "/usr/local/bin" # Custom scripts
)

# === Exclude: những thứ không cần backup ===
EXCLUDES=(
    "--exclude=/var/www/cache"
    "--exclude=/var/www/nextcloud/data/**.cache"
    "--exclude=*.log"
    "--exclude=/tmp"
    "--exclude=/var/tmp"
)

# === Backup ===
echo "=== $(date) ==="
echo "Bắt đầu backup..."

restic backup "${EXCLUDES[@]}" "${BACKUP_DIRS[@]}" \
    --tag "vps-automatic" \
    --verbose 2>&1

# === Dọn dẹp snapshot cũ ===
echo "Dọn dẹp snapshot cũ..."
restic forget \
    --keep-daily 7 \
    --keep-weekly 4 \
    --keep-monthly 3 \
    --prune \
    2>&1

# === Kiểm tra tính toàn vẹn (chạy 1 lần/tuần) ===
if [ $(date +%u) -eq 6 ]; then  # Thứ 7
    echo "Kiểm tra tính toàn vẹn (chạy cuối tuần)..."
    restic check --with-cache 2>&1 || true
fi

echo "=== Backup hoàn tất ==="
sudo chmod +x /usr/local/bin/backup-vps.sh

Policy dọn dẹp giải thích: --keep-daily 7 = giữ snapshot 7 ngày gần nhất, --keep-weekly 4 = giữ 4 snapshot của tuần, --keep-monthly 3 = snapshot tháng cuối tháng. Tổng tối đa ~14 snapshot, đủ để quay lại bất kỳ thời điểm nào trong 3 tháng gần. --prune xóa dữ liệu không còn thuộc snapshot nào trên B2 — tiết kiệm tiền storage.

6.1. Cron hàng ngày

sudo crontab -e
# Backup VPS hàng ngày lúc 3h sáng
0 3 * * * /usr/local/bin/backup-vps.sh >> /var/log/restic-backup.log 2>&1

# Clean log cũ
0 5 * * 0 truncate -s 0 /var/log/restic-backup.log 2>/dev/null || true

7. Test Khôi Phục — Bước Mà 90% Người Dùng Bỏ Qua

Tôi đã làm backup cho mình 3 tháng mới phát hiện: script của tôi sai biến môi trường (tôi ghi sai keyID) từ ngày đầu. Tất cả snapshot đều fail, nhưng tôi không nhận ra vì cron không gửi email cảnh báo (VPS không có MTA).

Test ngay sau khi setup:

# Liệt kê các snapshot
restic snapshots

# Khôi phục 1 file cụ thể (VD: /etc/nginx/nginx.conf)
restic restore latest --target /tmp/restore-test --include /etc/nginx/nginx.conf

# Hoặc mount snapshot để browse
restic mount /mnt/restic-mount &
# mountpoint at /mnt/restic-mount
ls /mnt/restic-mount/  # Thấy hostname/snapshots/
# unmount khi xong
umount /mnt/restic-mount

Mỗi lần deploy một cấu hình mới quan trọng lên VPS, tôi chạy backup thủ công trước: sudo bash /usr/local/bin/backup-vps.sh. Nếu hỏng, restore chỉ mất 1-2 phút.

💡 Cảnh báo thực tế về restore tốc độ: restore lần đầu từ B2 sẽ chậm vì download toàn bộ dữ liệu. Với 10GB dữ liệu từ B2 (us-west), throughput ~50-80 Mbps ở Việt Nam — mất khoảng 15-20 phút. Lần sau nếu restore một snapshot sau đó, restic chỉ download khối khác — nhanh hơn nhiều. Nếu bạn cần restore nhanh, cân nhắc backup đến SFTP server cùng datacenter với VPS.

8. Backup Docker Volumes — Cái Khó Nhất Trên VPS

Nếu bạn chạy Docker, backup /var/lib/docker/volumes raw là sẽ gặp vấn đề: file đang mở, database không consistent. Cách xử lý:

#!/bin/bash
# Snapshot Docker volume

# Dừng container viết database (hoặc dùng lock dịu nhẹ)
docker compose -f /home/app/docker-compose.yml pause

# Dump database
docker exec db-postgres pg_dumpall -U postgres > /tmp/db-dump.sql

# Backup directory chứa docker-compose + dumps
restic backup /home/app /tmp/db-dump.sql --tag docker-app

# Tiếp tục
docker compose -f /home/app/docker-compose.yml unpause

Với MySQL/MariaDB, dùng mariabackup hoặc mysqldump. Với PostgreSQL, dùng pg_dumpall hoặc pg_basebackup. Với file tĩnh (image upload), Docker volume có thể backup trực tiếp nếu không có database ghi vào cùng lúc.

9. Ước Tính Chi Phí B2 Cho Backup VPS

Giá Backblaze B2 (Pay-as-you-go, 2026): ~$6/TB/tháng storage, free egress lên tới 3x dung lượng trung bình hàng tháng, egress vượt quá $0.01/GB.

Dung lượng dataSnapshot (7 daily + 4 weekly + 3 monthly)Dung lượng B2 sau dedup (ước)Chi phí/tháng
~8 GB (VPS cơ bản: 2-3 WordPress)~14 snapshot~4.5 GB~$0.03 (~700đ)
~20 GB (VPS: nhiều app + DB)~14 snapshot~12 GB~$0.08 (~1.800đ)
~50 GB (VPS chạy ứng dụng lớn)~14 snapshot~30 GB~$0.20 (~4.600đ)

Chi phí thấp đến mức vô lý. Cả năm backup 20GB data tốn chưa tới 60K — rẻ hơn một cốc cà phê sữa đá mỗi tháng. Và so với hosting snapshot (thường giữ 7 ngày, hết là mất), B2 cho bạn restore snapshot từ 3 tháng trước.

⚠️ Bẫy #2 — Egress cost khi restore: Nếu bạn restore toàn bộ 50GB dữ liệu, egress ~50GB. B2 free egress = 3x dung lượng trung bình (~90GB nếu bạn giữ 30GB). Nếu restore nhiều lần trong tháng, bạn có thể vượt free tier. $0.01/GB extra egress — 50GB = $0.50 (~11K). Chấp nhận được, nhưng đừng bất ngờ. Tối ưu: restore trong tháng với snapshot đầu tiên, các snapshot sau chỉ download delta.

10. Các Lưu Ý Khi Backup Cả Hệ Thống

🛡️ Backup là tấm vé bảo hiểm rẻ nhất cho VPS của bạn

Chưa có VPS để setup backup? Thuê VPS giá rẻ từ 40K/tháng + B2 backup 50K/tháng = bạn có hệ thống backup chuyên nghiệp, tự động, mã hóa end-to-end. Cài 30 phút, yên tâm mãi mãi.

Thuê VPS Ngay