Backup VPS lên S3: hướng dẫn sao lưu mã hoá, tự động, khôi phục được
Cách backup VPS lên S3 (AWS, Cloudflare R2, Backblaze B2, Wasabi) bằng restic - mã hoá, tăng dần, có lịch và thử khôi phục - hoặc chỉ vài cú bấm với ZoPanel.

Ý chính
- Bản sao lưu nằm trên chính VPS không bảo vệ bạn khi mất server; cần một bản rời khỏi server, ví dụ trên S3.
- Hãy mã hoá trước khi tải lên và dùng access key chỉ có quyền với đúng một bucket.
- Database phải được dump nhất quán trước khi sao lưu, không chép thẳng thư mục dữ liệu MariaDB.
- Một bản sao lưu chưa từng được khôi phục thử thì chưa được chứng minh là dùng được.
Cách đơn giản và an toàn nhất để backup VPS lên S3 là dùng một công cụ sao lưu tăng dần có mã hoá như restic: dump database ra file, sao lưu file website, database và cấu hình lên một bucket S3 (AWS S3, Cloudflare R2, Backblaze B2, Wasabi hoặc MinIO), chạy theo lịch mỗi đêm, tự xoá bản cũ theo chính sách giữ lại, và định kỳ thử khôi phục. Toàn bộ thiết lập mất khoảng 30 phút và chi phí lưu trữ thường chỉ vài USD mỗi tháng cho vài chục GB.
Bài này hướng dẫn cả cách làm tay trên Ubuntu 24.04 / Debian 12 (từng lệnh) và cách làm với ZoPanel, kèm cách chọn nhà cung cấp S3, cách giữ bản sao lưu an toàn ngay cả khi server bị chiếm quyền, và những lỗi khiến bản sao lưu vô dụng đúng lúc cần.
Vì sao phải backup VPS lên S3?
Nhiều người nghĩ "nhà cung cấp VPS có snapshot rồi" hoặc "tôi có backup trong /backup trên server". Cả hai đều không đủ:
- Backup nằm trên chính server mất cùng server khi ổ hỏng, tài khoản VPS bị khoá, bị xoá nhầm hoặc server bị mã hoá tống tiền.
- Snapshot của nhà cung cấp tiện nhưng nằm cùng một nhà cung cấp, thường không khôi phục được từng file, và chụp database đang ghi dở có thể cho ra dữ liệu không nhất quán.
- S3 là kho lưu trữ đối tượng ở nơi khác, giá theo dung lượng, có API chuẩn mà gần như mọi công cụ sao lưu đều hỗ trợ.
Đây chính là chữ "1" ngoài cùng của quy tắc 3-2-1: ít nhất ba bản, trên hai loại lưu trữ, một bản ở nơi khác.
Cần sao lưu những gì trên VPS?
Không cần sao lưu cả ổ đĩa. Hệ điều hành và phần mềm cài lại được trong vài phút; thứ không tạo lại được là dữ liệu:
| Thành phần | Đường dẫn thường gặp | Ghi chú |
|---|---|---|
| File website | /var/www, /home |
Gồm cả upload của người dùng |
| Database | Dump bằng mariadb-dump, pg_dump |
Không chép thẳng /var/lib/mysql khi đang chạy |
| Cấu hình | /etc (nginx, PHP, cron, SSL) |
Nhẹ, nhưng tiết kiệm hàng giờ khi dựng lại |
/var/vmail hoặc thư mục Maildir |
Nếu server có chạy mail | |
| Khoá và secret | file .env, khoá DKIM |
Cẩn thận: bản sao lưu phải được mã hoá |
Chọn kho S3 nào để backup VPS?
Mọi kho tương thích S3 đều dùng được với restic. Vài điểm để so sánh:
- Phí tải xuống (egress). Khi khôi phục, bạn tải dữ liệu về. Cloudflare R2 không tính phí egress; tại thời điểm viết (tháng 10/2026), R2 tính 0,015 USD/GB-tháng cho lưu trữ chuẩn và miễn phí 10 GB-tháng đầu. AWS S3 và một số nhà cung cấp khác tính phí khi tải ra.
- Vị trí. Chọn khu vực khác với VPS, nhưng đủ gần để tải lên nhanh. Server ở Việt Nam thường dùng khu vực Singapore hoặc Châu Á.
- Thời gian lưu tối thiểu. Một số nhà cung cấp tính phí lưu trữ tối thiểu theo số ngày cho mỗi đối tượng; điều này ảnh hưởng tới chính sách xoá bản cũ.
- Khoá đối tượng (Object Lock) và versioning. Giúp chống việc kẻ tấn công xoá bản sao lưu (xem phần bên dưới).
Giá thay đổi thường xuyên, hãy kiểm tra bảng giá hiện hành của từng nhà cung cấp trước khi chọn.
Cách backup VPS lên S3 bằng restic (làm tay)
restic mã hoá dữ liệu ngay trên server trước khi gửi đi, chỉ tải lên phần thay đổi (tăng dần, chống trùng lặp) và khôi phục được từng file.
Bước 1: Tạo bucket và access key riêng
Trong trang quản trị của nhà cung cấp S3, tạo một bucket riêng (ví dụ vps-backup-web1), để riêng tư, rồi tạo access key chỉ có quyền trên đúng bucket đó. Đừng dùng key gốc của tài khoản: nếu server bị chiếm, kẻ tấn công chỉ có được key của một bucket.
Bước 2: Cài restic và lưu thông tin truy cập
sudo apt update && sudo apt install -y restic
restic version
sudo install -d -m 700 /etc/restic
openssl rand -base64 32 | sudo tee /etc/restic/password >/dev/null
sudo chmod 600 /etc/restic/password
Tạo /etc/restic/env (quyền 600) với thông tin của bạn:
export AWS_ACCESS_KEY_ID="khoa-cua-bucket"
export AWS_SECRET_ACCESS_KEY="bi-mat-cua-bucket"
export RESTIC_REPOSITORY="s3:https://<endpoint-cua-nha-cung-cap>/vps-backup-web1"
export RESTIC_PASSWORD_FILE="/etc/restic/password"
Với AWS, endpoint có dạng s3.<region>.amazonaws.com; với R2 là <ACCOUNT_ID>.r2.cloudflarestorage.com. Nếu nhà cung cấp yêu cầu region khác us-east-1, thêm export AWS_DEFAULT_REGION=.... Cú pháp chi tiết cho từng dịch vụ có trong tài liệu restic.
Chép file /etc/restic/password ra ngoài server ngay bây giờ (trình quản lý mật khẩu, hoặc giấy cất kỹ). Mất mật khẩu này là mất toàn bộ bản sao lưu, không ai giải mã được.
Khởi tạo kho:
sudo bash -c 'source /etc/restic/env && restic init'
Bước 3: Viết script sao lưu
Tạo /usr/local/sbin/backup-s3.sh:
#!/bin/bash
set -euo pipefail
source /etc/restic/env
# 1. Dump database nhất quán (InnoDB) ra file
install -d -m 700 /var/backups/db
mariadb-dump --all-databases --single-transaction --routines --triggers --events \
| gzip > /var/backups/db/all-databases.sql.gz
# 2. Sao lưu lên S3 (chỉ phần thay đổi được tải lên)
restic backup /etc /home /var/www /var/backups/db --exclude-caches --tag nightly
# 3. Giữ 7 bản ngày, 4 bản tuần, 6 bản tháng; xoá phần còn lại
restic forget --tag nightly --keep-daily 7 --keep-weekly 4 --keep-monthly 6 --prune
sudo chmod 700 /usr/local/sbin/backup-s3.sh
sudo /usr/local/sbin/backup-s3.sh
Nếu dùng PostgreSQL, thêm sudo -u postgres pg_dumpall | gzip > /var/backups/db/postgres.sql.gz. Bỏ các thư mục không cần (cache, node_modules) bằng --exclude.
Bước 4: Chạy tự động mỗi đêm bằng systemd timer
/etc/systemd/system/backup-s3.service:
[Unit]
Description=Backup VPS to S3 with restic
After=network-online.target
Wants=network-online.target
[Service]
Type=oneshot
ExecStart=/usr/local/sbin/backup-s3.sh
Nice=10
IOSchedulingClass=idle
/etc/systemd/system/backup-s3.timer:
[Unit]
Description=Nightly backup to S3
[Timer]
OnCalendar=*-*-* 02:30:00
RandomizedDelaySec=15m
Persistent=true
[Install]
WantedBy=timers.target
sudo systemctl daemon-reload
sudo systemctl enable --now backup-s3.timer
systemctl list-timers backup-s3.timer
journalctl -u backup-s3 -n 50 # log lần chạy gần nhất
Persistent=true cho phép bản sao lưu chạy bù nếu server tắt đúng giờ hẹn. Thêm một cách báo khi lỗi (email, Telegram, hoặc dịch vụ "heartbeat") để không phát hiện ra backup đã hỏng ba tuần sau.
Bước 5: Kiểm tra và thử khôi phục
sudo bash -c 'source /etc/restic/env && restic snapshots'
sudo bash -c 'source /etc/restic/env && restic check --read-data-subset=5%'
# Khôi phục thử một thư mục ra chỗ khác, không ghi đè dữ liệu đang chạy
sudo bash -c 'source /etc/restic/env && restic restore latest --target /tmp/restore-test --include /var/www/example.com'
Mỗi tháng hoặc mỗi quý, hãy dựng một VPS tạm, cài restic, khôi phục toàn bộ rồi nạp lại database. Đó là cách duy nhất để biết chắc bạn có thể quay lại khi mất server.
Bảo vệ bản sao lưu khi server bị chiếm quyền
Nếu kẻ tấn công có root trên VPS, họ có cả access key S3 và có thể xoá bản sao lưu. Vài lớp phòng vệ:
- Key chỉ cho một bucket, như ở bước 1.
- Bật versioning hoặc Object Lock trên bucket (nếu nhà cung cấp hỗ trợ), kèm quy tắc vòng đời xoá phiên bản cũ sau N ngày. Một đối tượng bị ghi đè hay xoá vẫn còn phiên bản trước.
- Tách việc dọn bản cũ ra khỏi server. Server chỉ cần quyền ghi; lệnh
restic forget --prunecó thể chạy từ một máy khác với key có quyền xoá. - Giữ một bản thứ hai ở nhà cung cấp khác cho dữ liệu quan trọng.
Backup VPS lên S3 với ZoPanel
ZoPanel có sẵn các bước trên trong giao diện. Sao lưu từ xa lên S3 cần license Pro.
- Mở Cài đặt → Sao lưu từ xa, bật công tắc và chọn Nhà cung cấp (AWS, Cloudflare R2, Backblaze B2, Wasabi, MinIO…), rồi điền endpoint, region, bucket, access key và secret key. Bật URL dạng path (R2, MinIO) nếu nhà cung cấp yêu cầu (R2, MinIO).
- Đặt Số bản giữ lại trên cloud mỗi tài khoản (1 đến 365, mặc định 14), bấm Kiểm tra kết nối rồi Lưu. Từ đó mọi bản sao lưu tài khoản và database đều được tải lên sau khi hoàn tất.
- Dữ liệu được mã hoá trên server trước khi tải lên bằng XChaCha20-Poly1305 với khoá suy ra từ khoá khôi phục của panel. Xem khoá ở Sao lưu → Cứu hộ thảm họa → Xem khóa và cất ở ngoài server.
- Ở thẻ Sao lưu tăng dần, bật snapshot mỗi đêm (01:00) cho mọi tài khoản, chọn nơi lưu là S3 và chính sách giữ (mặc định 7 ngày, 4 tuần, 6 tháng). Mỗi thứ Bảy, ZoPanel kiểm tra cấu trúc kho và đọc lại 2% dữ liệu; nếu lỗi, quản trị viên nhận cảnh báo.
- Database có thể sao lưu riêng mỗi giờ, mỗi 6 giờ hoặc mỗi ngày, và bản sao cũng được gửi lên S3.
Khôi phục cũng nằm trong panel: khôi phục cả tài khoản từ S3 qua Duyệt S3 (kể cả bản sao lưu của server không còn tồn tại), hoặc chọn một snapshot để khôi phục từng file, thư mục hay hộp thư. Trước khi sao lưu, ZoPanel kiểm tra dung lượng trống để bản sao lưu không làm đầy ổ, và mỗi file có checksum SHA-256 được kiểm tra lại trước khi khôi phục. Khách hàng cũng có thể đặt lịch riêng và chép bản sao lưu lên kho S3 của chính họ. Chi tiết trong tài liệu Sao lưu và Cứu hộ thảm họa.
Những lỗi khiến bản sao lưu vô dụng
- Chép thư mục MariaDB đang chạy thay vì dump: file có thể không nhất quán và không khởi động được.
- Không mã hoá trước khi tải lên: bản sao lưu chứa mật khẩu database, khoá và dữ liệu khách hàng.
- Mất mật khẩu mã hoá vì chỉ lưu nó trên chính server đã mất.
- Không có cảnh báo khi lỗi: script hỏng vì key hết hạn hay ổ đầy, và không ai biết.
- Chỉ giữ một bản: lỗi được phát hiện sau một tuần thì bản duy nhất cũng đã chứa lỗi đó.
- Chưa bao giờ khôi phục thử.
Kết luận
Backup VPS lên S3 là một trong những việc rẻ nhất mà bạn có thể làm để bảo vệ website: một bucket, một công cụ mã hoá như restic, một timer và thói quen thử khôi phục. Nếu bạn quản lý nhiều website hoặc bán hosting, phần tốn công là làm điều đó đều đặn cho từng tài khoản, có cảnh báo và có cách khôi phục nhanh. ZoPanel làm sẵn phần này; bạn có thể xem bảng giá và bắt đầu với gói Free để thử toàn bộ quy trình sao lưu trên server, rồi bật sao lưu từ xa khi nâng lên Pro.
Câu hỏi thường gặp
Backup VPS lên S3 tốn bao nhiêu tiền?
Tuỳ dung lượng và nhà cung cấp. Ví dụ, tại thời điểm viết, Cloudflare R2 tính 0,015 USD mỗi GB-tháng cho lưu trữ chuẩn, miễn phí 10 GB-tháng đầu và không tính phí tải xuống. Vì restic chỉ tải phần thay đổi và có nén, dung lượng thực tế thường nhỏ hơn tổng dữ liệu nhân số bản giữ lại.
Nên dùng restic hay rclone để backup lên S3?
restic là công cụ sao lưu: mã hoá, tăng dần, chống trùng lặp, có nhiều phiên bản và khôi phục từng file. rclone là công cụ đồng bộ và chép file; nó có lớp mã hoá crypt nhưng không tự quản lý snapshot hay chính sách giữ bản. Với sao lưu server, restic phù hợp hơn; rclone hợp để chép các file sao lưu đã có sẵn lên S3.
Có cần dừng website khi backup không?
Không. mariadb-dump --single-transaction tạo bản dump nhất quán cho bảng InnoDB mà không khoá website, và restic đọc file trong khi website vẫn chạy. Hãy chạy sao lưu vào giờ ít truy cập và đặt mức ưu tiên CPU, I/O thấp.
Mất server thì khôi phục từ S3 thế nào?
Tạo VPS mới, cài restic, đặt lại thông tin truy cập và mật khẩu kho, chạy restic restore latest --target /, cài lại phần mềm rồi nạp file dump database. Với ZoPanel, cài panel trên server mới, kết nối cùng bucket, khôi phục cấu hình bằng khoá khôi phục rồi khôi phục từng tài khoản qua Duyệt S3.
Snapshot của nhà cung cấp VPS có thay được backup lên S3 không?
Không hoàn toàn. Snapshot hữu ích để quay lại nhanh trước một thay đổi lớn, nhưng nằm cùng nhà cung cấp, thường không khôi phục được từng file và có thể chụp database đang ghi dở. Hãy dùng snapshot như một lớp bổ sung, không phải bản sao lưu ở nơi khác.
Đọc tiếp

VPS cho WordPress cấu hình bao nhiêu là đủ? Cách chọn CPU, RAM, ổ đĩa
VPS cho WordPress cấu hình bao nhiêu là đủ cho 1, 10 hay 100 website? Cách ước lượng CPU, RAM, ổ đĩa theo lưu lượng, kèm số liệu đo thực tế và lỗi cần tránh.

Chiến lược sao lưu website 3-2-1: áp dụng thực tế cho VPS
Chiến lược sao lưu website 3-2-1 cho VPS: sao lưu gì, bao lâu một lần, lưu ở đâu, chống ransomware, thử khôi phục, kèm lệnh restic và cách làm trên ZoPanel.

Chạy nhiều phiên bản PHP trên một server: hướng dẫn PHP-FPM
Cách chạy nhiều phiên bản PHP trên một server Ubuntu hoặc Debian với PHP-FPM: cài song song, gán phiên bản cho từng website, xử lý CLI, cron và lỗi thường gặp.