Backup tự động VPS sang Google Drive / Cloudflare R2 mỗi ngày

Tài liệu » Quản trị VPS - Server » Backup tự động VPS sang Google Drive / Cloudflare R2 mỗi ngày

Vì sao cần Backup tự động VPS sang Google Drive / Cloudflare R2 mỗi ngày ngay?

Backup thủ công là “kẻ thù” của sự an toàn dữ liệu vì con người rất dễ quên. Chỉ một lần lỡ tay xóa nhầm file, cập nhật lỗi hoặc bị mã độc tống tiền (ransomware) tấn công, toàn bộ công sức xây dựng website/ứng dụng của bạn sẽ đổ sông đổ biển. Việc thiết lập hệ thống tự động đồng bộ dữ liệu sang các nền tảng cloud storage uy tín giúp bạn kê cao gối ngủ mỗi đêm.

Dưới đây là những lý do bạn cần triển khai ngay hệ thống này:
* 💾 Tránh rủi ro mất mát: Ổ cứng VPS có thể hỏng vật lý hoặc lỗi node bất cứ lúc nào.
* ⏰ Tiết kiệm thời gian: Setup một lần, hệ thống tự động chạy hàng đêm mà không cần bạn can thiệp.
* 🛡️ Bảo vệ trước Ransomware: Dữ liệu lưu trữ độc lập trên Google Drive hoặc Cloudflare R2 giúp cách ly bản sao lưu khỏi server gốc.
* 💸 Tối ưu chi phí: Google Drive có sẵn 15GB miễn phí, trong khi Cloudflare R2 miễn phí hoàn toàn băng thông tải ra (egress) và 10GB lưu trữ.
* 🔄 Lưu trữ nhiều phiên bản: Dễ dàng cấu hình giữ lại các bản backup trong 7 ngày, 14 ngày hoặc 30 ngày.

Cài đặt Rclone – Công cụ “Swiss Army Knife” cho Cloud Storage

Tóm gọn: Rclone là công cụ dòng lệnh mã nguồn mở cực kỳ mạnh mẽ, hỗ trợ đồng bộ dữ liệu từ VPS Linux lên hơn 40 dịch vụ lưu trữ đám mây khác nhau.

Cài đặt Rclone trên Ubuntu 22.04/24.04

Rclone cung cấp một script cài đặt tự động rất an toàn và nhanh chóng. Bạn chỉ cần truy cập vào VPS thông qua SSH với quyền root hoặc user có quyền sudo để thực thi lệnh sau. Script này sẽ tự động tải về bản binary mới nhất và cấu hình đường dẫn (PATH) chuẩn xác.

sudo -v ; curl https://rclone.org/install.sh | sudo bash

Output thành công sẽ trông giống như sau:

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  4494  100  4494    0     0  13536      0 --:--:-- --:--:-- --:--:-- 13577
Archive:  rclone-current-linux-amd64.zip
   creating: tmp_unzip_dir_for_rclone/rclone-v1.65.2-linux-amd64/
  inflating: tmp_unzip_dir_for_rclone/rclone-v1.65.2-linux-amd64/rclone.1  
  inflating: tmp_unzip_dir_for_rclone/rclone-v1.65.2-linux-amd64/rclone  
Purging old database entries in /usr/share/man...
Processing manual pages under /usr/share/man...
rclone v1.65.2 has successfully installed.

Giải thích các thành phần trong lệnh:
* sudo -v: Cập nhật lại thời gian timeout của sudo, đảm bảo script không bị ngắt quãng giữa chừng vì hỏi lại mật khẩu.
* curl https://rclone.org/install.sh: Tải script cài đặt chính thức từ trang chủ Rclone.
* | sudo bash: Đẩy (pipe) nội dung script vừa tải vào trình vỏ bash chạy dưới quyền root để thực thi cài đặt.

💡 Mẹo: Sau khi cài đặt, hãy chạy lệnh rclone version để kiểm tra lại phiên bản. Nếu bạn thấy phiên bản v1.6x.x hiện ra, nghĩa là công cụ đã sẵn sàng để cấu hình.

Cấu hình kết nối VPS với Google Drive

Tóm gọn: Bạn cần tạo một “remote” trong Rclone để cấp quyền cho VPS truy cập, đọc và ghi dữ liệu vào thư mục Google Drive của bạn thông qua giao thức OAuth2.

Khởi tạo cấu hình Remote

Bắt đầu quá trình cấu hình bằng cách gọi giao diện tương tác của Rclone. Chúng ta sẽ tạo một kết nối mới có tên là gdrive.

rclone config

Hệ thống sẽ hỏi bạn muốn làm gì. Nhập n (New remote) và đặt tên là gdrive. Sau đó, Rclone sẽ hiển thị một danh sách dài các dịch vụ lưu trữ.

No remotes found, make a new one?
n) New remote
s) Set configuration password
q) Quit config
n/s/q> n
name> gdrive
Type of storage to configure.
Enter a string value. Press Enter for the default ("").
Choose a number from below, or type in your own value
...
18 / Google Drive
   \ (drive)
...
Storage> 18

Xác thực OAuth2 trên VPS không có giao diện (Headless)

Khi được hỏi về client_idclient_secret, bạn có thể bỏ trống (nhấn Enter) để dùng mặc định của Rclone. Tại mục Scope, chọn 1 (Full access). Tới bước xác thực tự động (auto config), đây là bước quan trọng nhất trên VPS.

Use auto config?
 * Say Y if not sure
 * Say N if you are working on a remote or headless machine
y) Yes (default)
n) No
y/n> n

Giải thích các lựa chọn:
* client_id / client_secret: Bỏ trống nếu bạn không có nhu cầu tạo App riêng trên Google Cloud Console. Rclone có sẵn API nội bộ.
* Scope 1: Cho phép Rclone có toàn quyền tạo, xóa, sửa file trên toàn bộ Drive của bạn (cần thiết để tự động xóa backup cũ).
* Auto config = n: Bắt buộc chọn n vì VPS không có trình duyệt web (GUI) để bạn đăng nhập Google.

Rclone sẽ cung cấp một lệnh dạng rclone authorize "drive" "chuỗi_mã_hóa". Bạn cần copy lệnh này, chạy trên máy tính cá nhân (Windows/Mac có cài sẵn Rclone), đăng nhập Google trên trình duyệt, sau đó copy đoạn mã Token trả về dán ngược lại vào terminal của VPS.

⚠️ Cảnh báo: Tuyệt đối không chia sẻ chuỗi Token sinh ra ở bước cuối cùng cho bất kỳ ai. Ai sở hữu Token này đều có thể truy cập vào Google Drive của bạn mà không cần mật khẩu.

Cấu hình kết nối VPS với Cloudflare R2 (S3 Compatible)

Tóm gọn: Cloudflare R2 sử dụng chuẩn API của Amazon S3, mang lại tốc độ upload cực nhanh, miễn phí hoàn toàn băng thông tải ra và cấu hình trực tiếp qua file rclone.conf rất tiện lợi.

Lấy thông tin API từ Cloudflare Dashboard

Trước tiên, bạn cần truy cập tài khoản Cloudflare, vào mục R2 Object Storage. Tạo một Bucket mới (ví dụ: vps-backup-bucket). Sau đó, vào mục Manage R2 API Tokens để tạo token mới với quyền Object Read & Write.

Bạn sẽ nhận được 3 thông tin quan trọng:
1. Access Key ID
2. Secret Access Key
3. S3 Endpoint (Có dạng https://<account_id>.r2.cloudflarestorage.com)

Cấu hình R2 trực tiếp qua file rclone.conf

Thay vì dùng giao diện hỏi đáp dài dòng, với người dùng Intermediate, chúng ta có thể chèn trực tiếp cấu hình S3 vào file config của Rclone. Mở file cấu hình bằng nano:

nano ~/.config/rclone/rclone.conf

Thêm đoạn cấu hình sau vào cuối file (thay thế các giá trị tương ứng của bạn):

[cfr2]
type = s3
provider = Cloudflare
access_key_id = YOUR_ACCESS_KEY_ID_HERE
secret_access_key = YOUR_SECRET_ACCESS_KEY_HERE
endpoint = https://YOUR_ACCOUNT_ID.r2.cloudflarestorage.com
acl = private

Giải thích các thông số (keys):
* [cfr2]: Tên của remote. Bạn sẽ dùng tên này trong lệnh đồng bộ (ví dụ: cfr2:vps-backup-bucket).
* provider = Cloudflare: Chỉ định rõ nhà cung cấp S3 để Rclone tối ưu hóa các hàm gọi API.
* endpoint: Đường dẫn API duy nhất cấp cho tài khoản Cloudflare của bạn.
* acl = private: Đảm bảo các file backup tải lên không bị public ra ngoài internet.

💡 Mẹo: Cloudflare R2 không tính phí băng thông (egress fee). Đây là lợi thế tuyệt đối so với AWS S3 hay Google Cloud Storage, đặc biệt khi bạn cần tải bản backup dung lượng lớn về máy tính cá nhân để test khôi phục.

Viết Bash Script nén và đồng bộ dữ liệu

Tóm gọn: Một bash script hoàn chỉnh sẽ đảm nhiệm việc nén mã nguồn website (tar), xuất cơ sở dữ liệu (mysqldump), đẩy lên cloud storage và dọn dẹp các bản backup cũ để tránh đầy ổ cứng.

Tạo file script backup tự động

Tạo một thư mục chứa script và file log, sau đó dùng nano để soạn thảo script. Nên dùng đường dẫn tuyệt đối (absolute paths) để tránh lỗi khi chạy qua Cronjob.

mkdir -p /opt/backup_scripts
nano /opt/backup_scripts/daily_backup.sh

Dán đoạn mã bash chuẩn kỹ thuật sau vào file:

#!/bin/bash

# 1. Khai báo biến môi trường và đường dẫn (Absolute paths)
BACKUP_DIR="/tmp/vps_backups"
DATE=$(date +"%Y-%m-%d_%H-%M")
SITE_DIR="/var/www/html"
DB_NAME="wordpress_db"
DB_USER="root"
DB_PASS="YourStrongPassword"
RCLONE_REMOTE="cfr2:vps-backup-bucket/daily"
RETENTION_DAYS=7

# 2. Tạo thư mục tạm để chứa file nén
mkdir -p "$BACKUP_DIR"

# 3. Backup Database (MySQL/MariaDB)
echo "Đang xuất database: $DB_NAME..."
mysqldump -u"$DB_USER" -p"$DB_PASS" "$DB_NAME" > "$BACKUP_DIR/db_$DATE.sql"

# 4. Nén mã nguồn Website cùng với Database
echo "Đang nén mã nguồn và database..."
tar -czvf "$BACKUP_DIR/full_backup_$DATE.tar.gz" -C /var/www html -C "$BACKUP_DIR" "db_$DATE.sql"

# 5. Đồng bộ lên Cloud Storage bằng Rclone
echo "Đang upload lên Cloudflare R2..."
/usr/bin/rclone copy "$BACKUP_DIR/full_backup_$DATE.tar.gz" "$RCLONE_REMOTE"

# 6. Xóa file backup cũ trên Cloud (giữ lại theo RETENTION_DAYS)
echo "Dọn dẹp file cũ trên Cloud..."
/usr/bin/rclone delete "$RCLONE_REMOTE" --min-age "${RETENTION_DAYS}d"

# 7. Xóa file tạm trên VPS để giải phóng dung lượng
rm -rf "$BACKUP_DIR"/*

echo "Hoàn tất quá trình backup lúc $(date)!"

Giải thích các cờ (flags) và tùy chọn:
* tar -czvf: Lệnh nén file. -c (tạo mới), -z (nén gzip), -v (hiển thị quá trình), -f (chỉ định tên file xuất ra).
* -C /var/www html: Thay đổi thư mục làm việc (change directory) sang /var/www trước khi nén thư mục html, giúp cấu trúc file nén gọn gàng, không bị dính toàn bộ đường dẫn /var/www/html/ khi giải nén.
* rclone copy: Chỉ copy file mới lên cloud, không can thiệp vào các file khác đang có trên bucket.
* --min-age "${RETENTION_DAYS}d": Tùy chọn cực hay của Rclone, chỉ xóa những file có tuổi đời cũ hơn số ngày quy định (ở đây là 7 ngày).

Phân quyền thực thi cho script

Script bash không thể tự chạy nếu thiếu quyền thực thi (executable). Chạy lệnh sau để cấp quyền:

chmod +x /opt/backup_scripts/daily_backup.sh

⚠️ Cảnh báo: Không nên để mật khẩu database (DB_PASS) trực tiếp trong script nếu VPS của bạn có nhiều user truy cập. Hãy cấu hình file ~/.my.cnf để xác thực MySQL không cần mật khẩu qua dòng lệnh.

Thiết lập Cronjob chạy tự động và lưu Log

Tóm gọn: Cronjob là trình quản lý tác vụ theo thời gian của Linux. Chúng ta sẽ giao việc chạy script daily_backup.sh cho Cronjob vào lúc 2 giờ sáng mỗi ngày, thời điểm server ít traffic nhất.

Cấu hình Crontab cho User Root

Mở trình soạn thảo Cronjob của hệ thống bằng lệnh:

sudo crontab -e

Thêm dòng sau vào cuối file để lên lịch chạy tự động và ghi log chi tiết:

0 2 * * * /opt/backup_scripts/daily_backup.sh >> /var/log/vps_daily_backup.log 2>&1

Giải thích cú pháp Cron và Log:
* 0 2 * * *: Chạy vào lúc 0 phút, 2 giờ sáng, mỗi ngày, mỗi tháng, mỗi ngày trong tuần.
* /opt/backup_scripts/...: Đường dẫn tuyệt đối trỏ đến script bash vừa tạo.
* >> /var/log/vps_daily_backup.log: Nối (append) các dòng chữ echo và output của lệnh tar vào file log để sau này dễ kiểm tra (audit).
* 2>&1: Chuyển hướng cả luồng lỗi (Standard Error – stderr) gộp chung vào luồng đầu ra tiêu chuẩn (Standard Output – stdout) để ghi tất cả vào chung một file log.

💡 Mẹo: Nếu bạn không rành về cú pháp thời gian của Cron, hãy sử dụng trang web crontab.guru. Đây là công cụ trực quan giúp bạn dịch chuỗi 0 2 * * * ra ngôn ngữ dễ hiểu.

Pitfalls & lỗi thường gặp

Dù cấu hình cẩn thận, quá trình tự động hóa vẫn có thể phát sinh lỗi. Dưới đây là các case thực tế và cách xử lý nhanh chóng.

  • Lỗi 1: Token Google Drive bị hết hạn (Expired Token)
    • Triệu chứng: Rclone báo lỗi Failed to copy: HTTP error 401: Unauthorized.
    • Cách fix: Token của tài khoản Google cá nhân đôi khi bị thu hồi nếu không sử dụng thường xuyên. Hãy chạy lại lệnh rclone config reconnect gdrive: để cấp quyền lại. Để ổn định lâu dài (Enterprise), nên tạo Google Service Account (file JSON) thay vì dùng OAuth cá nhân.
  • Lỗi 2: MySQL Dump báo lỗi Access Denied hoặc Lock Tables
    • Triệu chứng: Log hiển thị mysqldump: Got error: 1044: Access denied for user... hoặc 1041: Lock wait timeout exceeded.
    • Cách fix: Đảm bảo user database có đủ quyền LOCK TABLESSELECT. Bạn có thể thêm cờ --single-transaction vào lệnh mysqldump trong bash script để backup không làm khóa (lock) các bảng InnoDB đang hoạt động.
  • Lỗi 3: Đầy ổ cứng VPS khi đang nén file (No space left on device)
    • Triệu chứng: Website dung lượng 20GB, ổ cứng VPS chỉ còn trống 10GB. Lệnh tar bị hủy giữa chừng do không đủ chỗ chứa file .tar.gz tạm thời.
    • Cách fix: Bỏ qua bước tạo file tạm. Dùng kỹ thuật “Streaming” nén trực tiếp và đẩy (pipe) thẳng lên Rclone bằng lệnh rcat:
      bash
      tar -czvf - -C /var/www html | rclone rcat cfr2:vps-backup-bucket/daily/stream_backup.tar.gz
  • Lỗi 4: Chạy thủ công thì được, nhưng Cronjob lại không chạy
    • Triệu chứng: File log trống rỗng hoặc báo command not found: rclone.
    • Cách fix: Môi trường (Environment PATH) của Cronjob rất hạn chế, nó không giống với môi trường khi bạn SSH vào. Luôn luôn sử dụng đường dẫn tuyệt đối cho mọi lệnh trong script (ví dụ: dùng /usr/bin/rclone thay vì rclone, /usr/bin/mysqldump thay vì mysqldump).

Key takeaways

  • Rclone là tiêu chuẩn: Đây là công cụ tối ưu và ổn định nhất để đồng bộ dữ liệu Linux lên môi trường Cloud Storage.
  • Cloudflare R2 tối ưu chi phí: Phù hợp lưu trữ file lớn nhờ chuẩn S3 và hoàn toàn miễn phí cước băng thông tải ra (Egress).
  • Bash script cần chặt chẽ: Luôn gom chung cả Source Code và Database vào một bản backup cùng thời điểm để đảm bảo tính đồng nhất dữ liệu.
  • Quản lý vòng đời (Retention): Phải tích hợp lệnh xóa file cũ (vd: --min-age 7d) trong script, nếu không Cloud Storage của bạn sẽ nhanh chóng cạn kiệt dung lượng.
  • Cronjob cần đường dẫn tuyệt đối: Luôn dùng Absolute paths trong script và crontab để tránh lỗi command not found khi chạy ngầm.

FAQ

Làm sao để khôi phục (restore) dữ liệu từ Rclone?

Rất đơn giản, bạn chỉ cần đảo ngược vị trí nguồn và đích trong lệnh rclone copy. Ví dụ: /usr/bin/rclone copy cfr2:vps-backup-bucket/daily/full_backup_xxx.tar.gz /tmp/restore_dir. Sau đó dùng lệnh tar -xzvf để giải nén file.

Tôi có thể mã hóa bản backup để bảo mật hơn không?

Hoàn toàn được. Rclone hỗ trợ tạo một remote trung gian gọi là “Crypt”. Bạn cấu hình remote Crypt đè lên remote Google Drive/R2. Khi cấu hình xong, mọi file đẩy qua remote Crypt sẽ được mã hóa chuẩn AES-256 trước khi rời khỏi VPS.

Cloudflare R2 có thực sự miễn phí không?

R2 miễn phí 10 GB lưu trữ mỗi tháng và miễn phí 100% băng thông tải ra (Egress). Nếu file backup của bạn lớn hơn 10GB, bạn sẽ trả một mức phí lưu trữ rất rẻ (chỉ khoảng 0.015$/GB/tháng), vẫn rẻ hơn rất nhiều so với các dịch vụ S3 truyền thống.

Rclone có làm chậm VPS khi đang chạy backup không?

Quá trình nén (tar) và mã hóa có thể tiêu tốn CPU. Để tránh ảnh hưởng đến website, bạn có thể giới hạn tài nguyên CPU bằng cờ --bwlimit (giới hạn băng thông mạng) hoặc dùng lệnh nice -n 19 tar... để hạ độ ưu tiên của tiến trình nén xuống mức thấp nhất.

Làm sao để biết script backup có chạy thành công hay không?

Ngoài việc kiểm tra file log /var/log/vps_daily_backup.log, bạn có thể chèn thêm lệnh curl gọi API của Telegram Bot hoặc Discord Webhook vào cuối bash script. Nếu script chạy đến dòng cuối cùng, nó sẽ gửi một tin nhắn “Backup thành công” về điện thoại của bạn.

Cần VPS chạy Backup tự động VPS sang Google Drive / Cloudflare R2 mỗi ngày?

Hệ thống backup tự động bằng Rclone đòi hỏi một máy chủ ảo hoạt động ổn định, I/O ổ cứng tốc độ cao để quá trình nén và đồng bộ không gây nghẽn cổ chai (bottleneck) cho website chính.

Đừng để mất bò mới lo làm chuồng! Khởi tạo ngay máy chủ ảo hiệu năng cao, ổ cứng NVMe siêu tốc tại vsis.net/vps để triển khai hệ thống an toàn dữ liệu chuyên nghiệp cho doanh nghiệp của bạn.

Lên đầu trang