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
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-side | Dedup | Backend cloud | Khôi phục từng file | Phức tạp setup |
|---|---|---|---|---|---|
| Restic | Có (AES-256-GCM) | Có (content-defined chunking) | S3, B2, SFTP, Azure, GCS, local | Có, mount FUSE | Thấp |
| rsync + cron | Không (nếu không SSH tunnel) | Không (full copy mỗi lần) | Chỉ qua SSH | Có | Thấp (nhưng không dedup) |
| BorgBackup | Có | Có | Local, SSH, SFTP | Có, mount FUSE | Trung bình (mount hơi kỳ công) |
| Duplicati | Có | Có | Nhiều (B2, S3, OneDrive...) | Có | Cao (Java, hay lỗi database) |
| Kopia | Có | Có | S3, B2, GCS, local | Có | Thấp (UI có sẵn) |
Tôi chọn restic vì:
- Dùng Go — 1 binary duy nhất, không dependency. Không cần cài Python, không cần Java. Download 1 file là chạy.
- Backend B2 hỗ trợ native S3-compatible API. S3 backend của restic hoạt động với B2 luôn (B2 có S3 Compatible API từ 2023).
- Rất nhanh khi chỉ có thay đổi nhỏ: dedup content-defined chunking — chỉ upload khối dữ liệu thay đổi, dù file có được rename hay move.
- Có thể mount snapshot như một thư mục FUSE — không cần restore hết để xem file cũ.
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
- Vào B2 Cloud Storage → Create a Bucket: chọn name (vd: "my-vps-backup"), File Lock: disabled (nếu không có object lock)
- Vào App Keys → Generate New Master Application Key. Lưu lại:
keyID(bắt đầu bằng "00...")applicationKey(chỉ hiện 1 lần!)
- Quan trọng: ghi ra file .env hoặc password manager. B2 không cho xem lại applicationKey.
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"
/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.
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 data | Snapshot (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.
10. Các Lưu Ý Khi Backup Cả Hệ Thống
- Không backup /proc, /sys, /dev, /run — những thư mục ảo, backup sẽ treo hoặc đầy snapshot với dữ liệu vô dụng. Restic mặc định exclude các thư mục này, nhưng thêm vào script để chắc chắn.
- Database nên backup riêng bằng dump file — không nên backup raw data directory của database (MySQL, PostgreSQL) vì file có thể không consistent nếu đang ghi.
- Check định kỳ: mỗi tháng chạy
restic checkmột lần để phát hiện corruption sớm. Cron script trên bao gồm check thứ 7 hàng tuần. - Append-only mode: restic hỗ trợ
--append-onlytrên S3 backend — ngăn attacker xóa snapshot kể cả khi có quyền ghi. Nếu VPS bị compromise, attacker không thể xóa backup. Kích hoạt bằng IAM policy bên B2.
🛡️ 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