Bài 4: Hướng dẫn backup toàn bộ VPS lên Google Drive với Rclone

Bài viết dưới đây chắc là thứ nhiều bạn đang cần để đảm bảo cho dữ liệu luôn được lưu trữ an toàn một cách tự động.

Rclone là một công cụ đồng bộ hóa dữ liệu tương tự Rsync nhưng lại được tập trung phát triển chức năng kết nối với các dịch vụ lưu trữ đám mây.

Ưu điểm của việc sử dụng dịch vụ lưu trữ đám mây đó là tốc độ cao (do có server được đặt trên khắp thế giới), an toàn dữ liệu (không lo ngại các vấn đề phần cứng, network) và nhất là hầu hết đều Free.

Rclone hỗ trợ rất nhiều dịch vụ Cloud thông dụng như:

  • Google Drive
  • Amazon S3
  • Dropbox
  • Google Cloud Storage
  • Amazon Drive
  • Microsoft OneDrive

Giờ thay vì backup đưa lên VPS khác để lưu trữ, mình chuyển sang sử dụng Google Drive, dung lượng miễn phí 15GB, mua thêm cũng khá rẻ, chỉ 45k/tháng là được 100GB rồi.

Trong bài viết này sẽ có 2 phần chính, 1 là cài đặt Rclone trên VPS, 2 là sử dụng Rclone để upload backup lên Google Drive. Với những cloud service khác các bạn làm tương tự.

Kịch bản tự động backup như sau:

  • Sao lưu toàn bộ database MySQL, mỗi database một file .gz
  • Sao lưu toàn bộ code trong thư mục /home/nginx/domains/domain/public/
  • Sao lưu toàn bộ cấu hình Nginx trong thư mục /usr/local/nginx/conf/conf.d/
  • Sao lưu SSL trong thư mục /usr/local/nginx/conf/ssl/
  • Sao lưu cấu hình Centmin Mod trong /etc/centminmod/custom_config.inc
  • Sao lưu log của từng Domain trong /home/nginx/domains/domain/log/
  • Tổng hợp tất cả dữ liệu vào 1 folder
  • Upload file backup lên Google Drive vào lúc 2h00 sáng thứ 6 hàng tuần
  • Tự động xóa file backup trên VPS sau khi upload xong, xóa file backup trên Cloud nếu quá 4 tuần

Rồi chúng ta bắt đầu nhé!

Hướng dẫn backup toàn bộ VPS lên Google Drive với Rclone
Hướng dẫn backup toàn bộ VPS lên Google Drive với Rclone

I. Hướng dẫn cài đặt Rclone

Rclone là một chương trình dòng lệnh nên mình sẽ down xuống rồi di chuyển file chạy đến thư mục /usr/sbin/ của VPS để sử dụng sau này.

Chú ý : Nếu bạn đã cài đặt phiên bản cũ, cũng chỉ cần chạy chuỗi lệnh dưới để update.

– Cài đặt bản mới nhất với hệ điều hành Linux 64bit

cd /root/
wget https://downloads.rclone.org/rclone-current-linux-amd64.zip
unzip rclone-current-linux-amd64.zip
\cp rclone-v*-linux-amd64/rclone /usr/sbin/
rm -rf rclone-*

– Cài đặt bản mới nhất với hệ điều hành Linux 32bit

cd /root/
wget https://downloads.rclone.org/rclone-current-linux-386.zip
unzip rclone-current-linux-386.zip
\cp rclone-v*-linux-386/rclone /usr/sbin/
rm -rf rclone-*

Giờ bạn có thể sử dụng lệnh rclone để xem thêm thông tin sử dụng.

II. Backup VPS lên Cloud với Rclone

1. Tạo kết nối với Google Drive

Đầu tiên chúng ta sẽ cấu hình kết nối Rclone với Google Drive, việc này chỉ phải làm 1 lần duy nhất. Kết nối được tạo tên remote

Kết nối SSH với VPS rồi chạy lệnh:

rclone config

Bạn sẽ nhận được thông báo: No remotes found - make a new one, nhập n rồi nhấn Enter để tạo kết nối mới.

Ở dòng name bạn nhập remote để đặt tên cho kết nối, hoặc bạn có thể đặt tên nào cũng được.

Một danh sách các dịch vụ cloud xuất hiện, hãy chọn  số tương ứng với Google Drive rồi nhấn Enter.

Ở 2 dòng tiếp theo Client ID và Client Secret bạn hãy để trống nhấn Enter.

Mục Scope that rclone should use when requesting access from drive chọn 1 – drive

Tiếp theo, để trống với ID of the root folder và Service Account Credentials JSON file path

Khi được hỏi Use auto config? hãy nhập n rồi nhấn Enter. Ngay lập tức, Rclone sẽ đưa ra một đường link, bạn có thể click thẳng vào đó hoặc bôi đen để copy rồi paste vào trình duyệt.

Trên trình duyệt bạn ấn cho phép Rclone. Lưu ý: Nếu cop link vào trình duyệt báo lỗi thì bạn tắt kết nối SSH và truy cập lại SSH làm theo 2 cách dưới đây:

  • Cách 1: Sử dụng tunnels trong Putty:
    • B1: Chọn vps
    • B2: SSH -> Tunnels -> Ô Source Port điền:53682 -> Ô dưới Destination điền: localhost:53682 -> Add -> Open
  • Cách 2: Sử dụng tulnel trực tiếp bằng CMD (nhấn giữ đồng thời phím cửa sổ window + R => Gõ CMD)
    • Gõ lệnh: ssh root@116.118.51.214 -p 2222 -L 53682:127.0.0.1:53682
    • Thay IP ở trên bằng IP VPS của bạn

Sau khi vào được SSH các bạn làm lại từ bước chạy lệnh:

rclone config

Mọi thứ chắc đã ổn! Sau khi xác nhận thành công thì quay lại SSH để thao tác tiếp. Chọn n tức no đối với Configure this as a team drive?

Rclone cần xác nhận thông tin một lần nữa, bạn nhấn y để đồng ý rồi nhấn q để thoát khỏi giao diện cấu hình kết nối.

Toàn bộ quá trình cài đặt sẽ tương tự như sau (bôi đỏ là cần nhập input):

rclone config
No remotes found - make a new one
n) New remote
s) Set configuration password
q) Quit config
n/s/q> n
name> remote
Type of storage to configure.
Choose a number from below, or type in your own value
 1 / Alias for a existing remote
   \ "alias"
 2 / Amazon Drive
   \ "amazon cloud drive"
 3 / Amazon S3 Compliant Storage Providers (AWS, Ceph, Dreamhost, IBM COS, Minio)
   \ "s3"
 4 / Backblaze B2
   \ "b2"
 5 / Box
   \ "box"
 6 / Cache a remote
   \ "cache"
 7 / Dropbox
   \ "dropbox"
 8 / Encrypt/Decrypt a remote
   \ "crypt"
 9 / FTP Connection
   \ "ftp"
10 / Google Cloud Storage (this is not Google Drive)
   \ "google cloud storage"
11 / Google Drive
   \ "drive"
Storage> 11
Google Application Client Id - leave blank normally.
client_id>
Google Application Client Secret - leave blank normally.
client_secret>
Scope that rclone should use when requesting access from drive.
Choose a number from below, or type in your own value
 1 / Full access all files, excluding Application Data Folder.
   \ "drive"
 2 / Read-only access to file metadata and file contents.
   \ "drive.readonly"
   / Access to files created by rclone only.
 3 | These are visible in the drive website.
   | File authorization is revoked when the user deauthorizes the app.
   \ "drive.file"
   / Allows read and write access to the Application Data folder.
 4 | This is not visible in the drive website.
   \ "drive.appfolder"
   / Allows read-only access to file metadata but
 5 | does not allow any access to read or download file content.
   \ "drive.metadata.readonly"
scope> 1
ID of the root folder - leave blank normally.  Fill in to access "Computers" folders. (see docs).
root_folder_id>
Service Account Credentials JSON file path  - leave blank normally.
Needed only if you want use SA instead of interactive login.
service_account_file>
Remote config
Use auto config?
 * Say Y if not sure
 * Say N if you are working on a remote or headless machine or Y didn't work
y) Yes
n) No
y/n> n
If your browser doesn't open automatically go to the following link: https://accounts.google.com/o/oauth2/auth?access_type=offlinexxxx
Log in and authorize rclone for access
Enter verification code> 4/AABw8gMKPxxxxxxxxxx
Configure this as a team drive?
y) Yes
n) No
y/n> n
--------------------
[remote]
type = drive
client_id =
client_secret =
scope = drive
root_folder_id =
service_account_file =
token = {"access_token":"xxx","token_type":"Bearer","refresh_token":"1/xxx","expiry":"2018-05-16T10:55:03.488381196+07:00"}
--------------------
y) Yes this is OK
e) Edit this remote
d) Delete this remote
y/e/d> y
Current remotes:

Name                 Type
====                 ====
remote               drive

e) Edit existing remote
n) New remote
d) Delete remote
r) Rename remote
c) Copy remote
s) Set configuration password
q) Quit config
e/n/d/r/c/s/q> q

Vậy là xong, giờ bạn có thể test với lệnh liệt kê thư mục trong kết nối remote:

rclone lsd remote:

2. Script backup toàn bộ VPS và upload lên Cloud

Một số lưu ý trước khi backup:

– Script hoạt động với Rclone phiên bản 1.35 trở lên.
– Kết nối Rclone với Cloud tên remote, nếu bạn sử dụng kết nối khác thì thay đổi tên trong script

Script này được viết theo cấu trúc folder trên server do Centmin Mod quản lý.

– Tạo file backup-centminmod.sh ở thư mục /root/

nano /root/backup-centminmod.sh

– Copy toàn bộ nội dung script bên dưới rồi paste vào:

#!/bin/bash

# CentminMod Script Plugin - Backup Server and Upload to Cloud

SERVER_NAME=TEN_FOLDER_BACKUP

TIMESTAMP=$(date +"%F")
BACKUP_DIR="/root/backup/$TIMESTAMP"
MYSQL=/usr/bin/mysql
MYSQLDUMP=/usr/bin/mysqldump
SECONDS=0

mkdir -p "$BACKUP_DIR/mysql"

echo "Starting Backup Database";
databases=`$MYSQL -e "SHOW DATABASES;" | grep -Ev "(Database|information_schema|performance_schema|mysql)"`

for db in $databases; do
$MYSQLDUMP --force --opt $db | gzip > "$BACKUP_DIR/mysql/$db.gz"
done
echo "Finished";
echo '';

echo "Starting Backup Website";
# Loop through CentminMod domains directory
for D in /home/nginx/domains/*; do
if [ -d "${D}" ]; then # If a directory
domain=${D##*/} # Domain name
if [ -d "${D}/public" ]; then # Check if public directory exists
echo "- "$domain;
# Backup website files, exclude common cache directories
zip -r $BACKUP_DIR/$domain.zip /home/nginx/domains/$domain/public/ -q \
-x "/home/nginx/domains/$domain/public/wp-content/cache/*" \
-x "/home/nginx/domains/$domain/public/wp-content/uploads/cache/*" \
-x "/home/nginx/domains/$domain/public/wp-content/w3tc-config/*" \
-x "/home/nginx/domains/$domain/public/wp-content/object-cache.php" \
-x "/home/nginx/domains/$domain/public/.htaccess"
fi
fi
done
echo "Finished";
echo '';

echo "Starting Backup Nginx Configuration";
mkdir -p "$BACKUP_DIR/nginx"
# Backup CentminMod Nginx configurations
cp -r /usr/local/nginx/conf/conf.d/ $BACKUP_DIR/nginx/conf.d/
# Backup SSL certificates if any
if [ -d "/usr/local/nginx/conf/ssl" ]; then
cp -r /usr/local/nginx/conf/ssl/ $BACKUP_DIR/nginx/ssl/
fi
# Backup main nginx.conf
cp /usr/local/nginx/conf/nginx.conf $BACKUP_DIR/nginx/
# Backup other important conf files
cp /usr/local/nginx/conf/php.conf $BACKUP_DIR/nginx/ 2>/dev/null
cp /usr/local/nginx/conf/staticfiles.conf $BACKUP_DIR/nginx/ 2>/dev/null
cp /usr/local/nginx/conf/ssl_include.conf $BACKUP_DIR/nginx/ 2>/dev/null
echo "Finished";
echo '';

echo "Starting Backup CentminMod Configuration";
mkdir -p "$BACKUP_DIR/centminmod"
# Backup centmin mod configuration
if [ -f "/etc/centminmod/custom_config.inc" ]; then
cp /etc/centminmod/custom_config.inc $BACKUP_DIR/centminmod/
fi
# Backup PHP configuration
if [ -d "/usr/local/lib/php.ini.d" ]; then
cp -r /usr/local/lib/php.ini.d $BACKUP_DIR/centminmod/
fi
cp /usr/local/lib/php.ini $BACKUP_DIR/centminmod/ 2>/dev/null
echo "Finished";
echo '';

echo "Starting Backup Logs";
mkdir -p "$BACKUP_DIR/logs"
# Backup domain logs (only recent ones to save space)
for D in /home/nginx/domains/*; do
if [ -d "${D}/log" ]; then
domain=${D##*/}
mkdir -p "$BACKUP_DIR/logs/$domain"
# Only backup logs from last 7 days to save space
find ${D}/log -name "*.log" -mtime -7 -exec cp {} "$BACKUP_DIR/logs/$domain/" \;
fi
done
echo "Finished";
echo '';

size=$(du -sh $BACKUP_DIR | awk '{ print $1}')

echo "Starting Uploading Backup";
/usr/sbin/rclone move $BACKUP_DIR "remote:$SERVER_NAME/$TIMESTAMP" >> /var/log/rclone.log 2>&1
# Clean up
rm -rf $BACKUP_DIR
/usr/sbin/rclone -q --min-age 4w delete "remote:$SERVER_NAME" #Remove all backups older than 4 week
/usr/sbin/rclone -q --min-age 4w rmdirs "remote:$SERVER_NAME" #Remove all empty folders older than 4 week
/usr/sbin/rclone cleanup "remote:" #Cleanup Trash
echo "Finished";
echo '';

duration=$SECONDS
echo "Total $size, $(($duration / 60)) minutes and $(($duration % 60)) seconds elapsed."

Lưu ý:

  • Script trên sẽ back up toàn bộ database, mỗi database nén thành một file .gz, lưu trong thư mục mysql
  • Mỗi thư mục chứa website được nén lại thành 1 file .zip
  • Toàn bộ cấu hình Nginx của các website được lưu trong thư mục nginx
  • SERVER_NAME mặc định là TEN_FOLDER_BACKUP, nếu muốn thay đổi folder trên Cloud bạn hãy thay đổi tham số này.
  • Muốn điều chỉnh thời gian xóa file backup, bạn sửa thông số ở dòng delete và rmdirs. Hiện tại, tự động xóa file/folder cũ hơn 4 tuần.

– Nhấn Ctrl+O, Enter để lưu và Ctrl+X để thoát.

– Phân quyền cho script

chmod +x /root/backup-centminmod.sh

– Vậy là xong rồi đó, giờ bạn có thể test lại bằng cách chạy lệnh:

/root/backup-centminmod.sh

Thử kiểm tra trên Cloud xem có thư mục mới với dữ liệu backup chưa nhé, hoặc test với lệnh:

rclone lsl remote:TEN_FOLDER_BACKUP

Nếu không có vấn đề gì sẽ thấy kết quả trả về có một thư mục là ngày hiện tại, bên trong có chứa file nén website (.zip), cấu hình Nginx (.conf) và database (.gz).

3. Tạo cronjob tự động backup hàng ngày

Giờ mình sẽ cho script tự động chạy lúc 2h00 sáng thứ 6 hàng tuần.

EDITOR=nano crontab -e

Dán nội dung sau vào cửa sổ Terminal

0 2 * * 5 /root/backup-centminmod.sh > /dev/null 2>&1

Nhấn Ctrl+O, Enter để lưu và Ctrl+X để thoát

Vậy là xong, cứ 2h sáng thứ sáu script sẽ tự động chạy, backup toàn bộ dữ liệu của VPS rồi upload lên Cloud. Đồng thời, dữ liệu backup trên VPS sẽ được xóa luôn sau khi upload xong.

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *