Hướng dẫn sử dụng Rclone trên Ubuntu để tự động sao lưu dữ liệu lên Google Drive, S3 và OneDrive

Ubuntu tutorial - IT technology blog
Ubuntu tutorial - IT technology blog

Cú sập VPS lúc 2 giờ sáng và bài học nhớ đời

Hơn một năm trước, con VPS chạy PostgreSQL 45GB của mình đột ngột lăn ra chết. Nguyên nhân từ lỗi cụm ổ cứng vật lý của bên hosting. Toàn bộ database bán hàng và hơn 120GB file ảnh uploads biến mất sạch sẽ trong vài phút.

Trước đó, mình quá ỷ lại. Mình chỉ hẹn cronjob nén file rồi lưu ngay ở phân vùng /home/backup trên chính con VPS đó. Thêm quả auto-snapshot hàng tuần của nhà cung cấp làm bùa hộ mệnh. Đến khi cả cụm server vật lý cháy controller, dữ liệu gốc lẫn bản sao lưu đều bốc hơi không còn một dấu vết.

Đừng bao giờ để bản sao lưu chung rổ với máy chủ production. Từ bài học cay đắng đó, trên toàn bộ 20 con VPS Ubuntu hiện tại, việc đầu tiên mình làm luôn là dựng đường ống đẩy dữ liệu off-site ra ngoài.

Vì sao các công cụ đồng bộ thông thường dễ đứt gánh giữa đường?

Trước khi tìm được giải pháp ưng ý, mình từng thử nhiều cách và đều vấp phải các rào cản khó chịu:

  • Google Drive và OneDrive không có CLI chính chủ cho Linux: Muốn xác thực tài khoản trên VPS không có giao diện đồ họa (headless) qua SSH là cả một cực hình.
  • Công cụ bên thứ ba ngốn RAM: Mấy script Python hay Node.js thường đớp từ 150MB đến 300MB RAM lúc chạy. Với các gói VPS giá rẻ 1GB RAM, hệ điều hành dễ kích hoạt cơ chế OOM Killer rồi trảm luôn tiến trình database.
  • Tự viết script gọi REST API quá mệt: Dùng curl thì bạn phải tự viết logic refresh OAuth2 token, tự xử lý chunked upload cho file trên 5GB, lại còn phải canh retry khi đứt mạng giữa chừng.

Những phương án từng đưa lên bàn cân

Mình từng cân nhắc ba hướng đi quen thuộc:

  • Rsync qua SSH sang VPS backup riêng: Ổn định và nhanh. Tuy nhiên, bạn phải tốn thêm tầm 5$ đến 10$/tháng nuôi một con server phụ chỉ để chứa file. Nâng cấp ổ cứng lưu trữ trên VPS cũng đắt đỏ hơn nhiều so với object storage.
  • AWS CLI / s3cmd: Chạy cực mượt với AWS S3, Cloudflare R2 hay Wasabi. Điểm trừ lớn: bạn không thể tận dụng dung lượng miễn phí sẵn có từ Google Drive Workspace hay OneDrive Family 1TB.
  • BorgBackup: Nén và chống trùng lặp dữ liệu thuộc hàng top. Đổi lại, việc cấu hình remote backend lên cloud drive cá nhân rất phức tạp với anh em không chuyên sâu sysadmin.

Rclone: Cứu cánh gọn nhẹ cho sysadmin

Rclone chính là câu trả lời trọn vẹn nhất. Công cụ này được viết bằng Go, gói gọn trong một file binary duy nhất. Khi chạy, nó chỉ ăn tầm 20MB đến 35MB RAM. Rclone hỗ trợ hơn 40 dịch vụ cloud khác nhau, tự động lo trọn gói từ làm mới token đến chia nhỏ file khi upload.

Bước 1: Cài đặt Rclone chuẩn chỉ trên Ubuntu

Đừng dùng apt install rclone. Kho của Ubuntu thường giữ bản cũ từ 1-2 năm trước, rất hay lỗi khi Google hay Microsoft đổi API. Hãy kéo script cài đặt chính thức:

sudo -v && curl https://rclone.org/install.sh | sudo bash
# Kiểm tra phiên bản
rclone version

Bước 2: Cấu hình Remote cho Google Drive, AWS S3 và OneDrive

Mở giao diện tương tác:

rclone config

1. Cấu hình Google Drive

Bấm n để tạo mới, đặt tên là gdrive rồi chọn số đại diện cho Google Drive. Khi terminal hỏi Use web browser to automatically authenticate, hãy chọn n vì VPS không có trình duyệt.

Rclone sẽ xuất một câu lệnh. Bạn hãy mở terminal trên laptop cá nhân của mình và gõ lệnh đó:

# Chạy trên máy cá nhân có sẵn trình duyệt
rclone authorize "drive" "client_id" "client_secret"

Trình duyệt web sẽ tự mở ra để bạn cấp quyền. Cấp quyền xong, terminal trên laptop sẽ nhả ra một chuỗi JSON chứa access token. Bạn copy toàn bộ chuỗi này dán ngược lại vào màn hình terminal VPS là xong.

2. Cấu hình AWS S3 (hoặc Cloudflare R2 / MinIO)

S3 tiện hơn vì dùng Access Key trực tiếp. Tạo remote tên s3_backup, chọn Amazon S3 Compliant Storage Provider rồi nhập thông số:

provider> AWS
env_auth> false
access_key_id> AKIAIOSFODNN7EXAMPLE
secret_access_key> wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
region> ap-southeast-1
location_constraint> ap-southeast-1
acl> private

3. Cấu hình OneDrive

Các bước làm tương tự Google Drive. Đặt tên remote là onedrive, sau đó dùng rclone authorize "onedrive" trên laptop cá nhân để lấy token dán sang.

Bước 3: Thao tác kiểm tra kết nối

Đừng vội viết script tự động. Hãy test kết nối trước để chắc chắn mọi thứ thông suốt:

# Xem thư mục trên Google Drive
rclone lsd gdrive:

# Xem danh sách bucket S3
rclone lsd s3_backup:

# Test copy một file nhỏ
rclone copy /etc/hosts gdrive:Server_Backups/Test/

Cảnh báo cực quan trọng: Rclone có hai lệnh rất dễ nhầm là copy và sync. Lệnh copy chỉ đẩy file mới hoặc file bị sửa đổi, giữ nguyên file cũ trên cloud. Ngược lại, lệnh sync sẽ đồng bộ gương một chiều. Nghĩa là bạn lỡ tay xóa file dưới VPS thì lần chạy tới, Rclone cũng xóa sạch file đó trên cloud. Đi sao lưu dữ liệu thì hãy dùng copy.

Bước 4: Viết script tự động nén và đẩy dữ liệu

Tạo file /opt/scripts/backup.sh:

#!/usr/bin/env bash
set -euo pipefail

# Cấu hình biến
DATE=$(date +%Y-%m-%d_%H%M%S)
BACKUP_DIR="/var/backups/daily"
WEB_DIR="/var/www"
DB_NAME="my_production_db"
DB_USER="db_backup_user"
DB_PASS="MatKhauSieuKho123!"
LOG_FILE="/var/log/rclone_backup.log"

mkdir -p "$BACKUP_DIR"

# 1. Dump database an toàn với gzip
echo "[$(date)] Đang dump database..." >> "$LOG_FILE"
mysqldump -u"$DB_USER" -p"$DB_PASS" --single-transaction --quick "$DB_NAME" | gzip > "$BACKUP_DIR/db_${DATE}.sql.gz"

# 2. Nén source code
echo "[$(date)] Đang nén source code..." >> "$LOG_FILE"
tar -czf "$BACKUP_DIR/web_${DATE}.tar.gz" -C "$WEB_DIR" .

# 3. Đẩy file lên Google Drive
echo "[$(date)] Bắt đầu upload lên Google Drive..." >> "$LOG_FILE"
rclone copy "$BACKUP_DIR" gdrive:Server_Backups/Daily/ \
    --bwlimit 10M \
    --transfers 2 \
    --log-file "$LOG_FILE" \
    --log-level NOTICE

# Đẩy bản sao lưu phụ sang S3 dự phòng
rclone copy "$BACKUP_DIR" s3_backup:my-backup-bucket/Daily/ \
    --bwlimit 10M \
    --transfers 2

# 4. Xóa file backup local cũ hơn 3 ngày để nhẹ ổ cứng
find "$BACKUP_DIR" -type f -name "*.gz" -mtime +3 -delete

echo "[$(date)] Backup hoàn tất ngon lành!" >> "$LOG_FILE"

Cấp quyền chạy cho file:

sudo chmod +x /opt/scripts/backup.sh

Bước 5: Thiết lập chạy tự động bằng Crontab

Mở bảng cron của root:

sudo crontab -e

Thêm dòng sau để hệ thống chạy backup vào lúc 2 giờ 30 phút sáng hàng ngày:

30 2 * * * /opt/scripts/backup.sh > /dev/null 2>&1

Mẹo xương máu khi vận hành trên server thật

  • Đừng quên --bwlimit 10M: File nén nặng 20GB-30GB sẽ hút cạn băng thông mạng VPS nếu không giới hạn. Website của bạn sẽ bị nghẽn và khách không thể truy cập trong lúc sao lưu. Mức 10MB/s đến 15MB/s là con số lý tưởng.
  • Tránh bẫy HTTP 403 của Google Drive: Google giới hạn mỗi tài khoản chỉ được upload tối đa 750GB/ngày và khống chế tần suất gọi API. Bạn nên siết cờ --transfers 2 --checkers 4 để tránh bị tạm khóa API trong 24 giờ.
  • Bọc mã hóa dữ liệu với crypt: Nếu sợ lưu thông tin nhạy cảm lên cloud công cộng, hãy tạo thêm remote loại crypt bọc ngoài remote gốc. Rclone sẽ mã hóa AES-256 ngay trên RAM của VPS trước khi truyền đi, nhà cung cấp cloud chỉ thấy dữ liệu rác đã mã hóa.
Share: