Skip to main content

[Thủ Thuật Linux] Hướng dẫn dùng Script Backup VPS lên Google Drive

Backup VPS lên Google Drive bằng Rclone tự động hàng ngày là một thao tác cần làm ngay khi lập trình viên khi khởi tạo một Server.

Đơn giản vì bất cứ lúc nào Server cũng có nguy cơ gặp sự cố từ nhiều lý do như tấn công bởi hacker, lỗi từ nhà cung cấp,... Vậy nên việc Backup dữ liệu website tự động hàng ngày thực sự là rất quan trọng, cần thiết.

Giới thiệu

Nên sử dụng Google Drive vì nó miễn phí 15GB ban đầu và giá mua thêm 100GB chỉ là 45k/ tháng. Một nơi lưu trữ dữ liệu gần như là miễn phí rồi.

Để làm được quá trình này cần sử dụng một package là Rclone. Vậy Rclone là gì?

Rclone là công cụ đồng bộ hóa dữ liệu giữa máy chủ và các dịch vụ lưu trữ đám mây giống như Rsync nhưng tập trung phát triển mảng liên kết với dịch vụ lưu trữ đám mây. Rclone hỗ trợ rất nhiều dịch vụ như:  Amazon S3, Amazon Drive, Google Drive, Google Cloud Storage, Openstack Swift / Rackspace cloud files / Memset, Memstore, Dropbox, Microsoft OneDrive…

Vậy bây giờ chúng ta đi vào nội dung chính "Hướng dẫn dùng Script Backup VPS lên Google Drive bằng Rclone tự động hàng ngày".

Chú ý: Bài viết này chạy trên nền tảng CENTOS nên bạn cần thay đổi lệnh shell phù hợp với hệ điều hành của bạn.

Bước 1 - Cài đặt Rclone

1.1. Cài đặt CURL

yum install curl

1.2. Cài đặt Rclone

Cách 1: Download xuống phiên bản phù hợp với OS của VPS

+ Với bản Linux 64 bit, lần lượt chạy các lệnh sau

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-*

+ Với bản Linux 34 bit, lần lượt chạy các lệnh sau

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-*

Cách 2: Download phiên bản mới nhất 

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

Check cài đặt thành công bằng lệnh rclone.

Tham khảo thêm trên trang Rclone.

Bước 2 - Backup VPS lên Google Drive

Đầu tiên chúng ta cần tạo kết nối với Google Drive

2.1. Chạy lện config Rclone

rclone config

2.2. Bạn sẽ nhận được thông báo "no remotes found". Gõ "n"để tạo mới remote mới.

2.3. Nhập name cho kết nối mới tạo, ở đây mình đặt là  “remote”.

2.4. Một danh sách các cloud, bạn check sẽ thấy Google Drive ở vị trí 15, nhập "15" để chọn Google Drive.

2.5. Bỏ trống ClientID Client Secret.

2.6. Xuất hiện yêu cầu chọn "Scope that rclone should use when requesting access from drive",  tiếp tục chọn "1".

2.7. Để trống ID of the root folder và Service Account Credentials JSON file path.

2.8. Tiếp tục nhập "n" với câu hỏi Edit advanced config? và Use auto config?

2.9. Lúc này trên màn hình xuất hiện link xác thực, để lấy link này cần mở terminal để tune đến server lại

Option config_token.
For this to work, you will need rclone available on a machine that has
a web browser available.
For more help and alternate methods see: https://rclone.org/remote_setup/
Execute the following on the machine with the web browser (same rclone
version recommended):
	rclone authorize "drive" "eyJzY29wZSI6ImRyaXZlIn0"
Then paste the result.
Enter a value.
config_token> 

2.10. Mở một terminal mới dùng lệnh 

ssh root@${ip_cua_ban} -L 53682:127.0.0.1:53682

sau khi tune đến server, bạn dùng lệnh 

rclone authorize "drive" "eyJzY29wZSI6ImRyaXZlIn0"

sẽ thấy xuát hiện link http://127.0.0.1:53682/auth?state=xxxxx

bạn lấy link đó mở trên trình duyệt để xác thực người dùng. Xong trên terminal bạn sẽ nhận được  

Paste the following into your remote machine --->
xxxxxxxxxxxxx
<---End paste

2.11. Copy đoạn code đó vào trong SSH tại "Enter verification code" và enter.

2.12. Tiếp tục chọn "n" với "Configure this as a team drive?"

2.13. Chọn "y" để xác nhận lại và tiếp tục "q" để thoát khỏi config Rclone.

2.14. Test Rclone có backup qua Google Drive không bằng lệnh

rclone copy /var/log/cloud-init.log backup:

Bước 3 - Script Backup VPS lên Google Drive

3.1. Tạo file script backup.sh

nano /root/backup.sh

3.2. Thêm đoạn script vào file trên

SERVER_NAME=A2HOSTING_BACKUP

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

mkdir -p "$BACKUP_DIR/mysql"
databases=`$MYSQL --user=$MYSQL_USER -p$MYSQL_PASSWORD -e "SHOW DATABASES;" | grep -Ev "(Database|information_schema|performance_schema|mysql)"`

echo "Starting Backup Database";

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

echo "Starting Backup Website";
# Loop through /home directory
for D in /var/www/*; do
	if [ -d "${D}" ]; then #If a directory
		domain=${D##*/} # Domain name
		echo "- "$domain;
		zip -r $BACKUP_DIR/$domain.zip /var/www/$domain/htdocs/ -q -x /var/www/$domain/htdocs/wp-content/cache/**\* #Exclude cache
	fi
done
echo "Finished";
echo '';

echo "Starting Backup Nginx Configuration";
cp -r /etc/nginx/ $BACKUP_DIR/nginx/
echo "Finished";
echo '';

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

echo "Starting Uploading Backup";
/usr/sbin/rclone --transfers=1 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 2d delete "remote:$SERVER_NAME" #Remove all backups older than 2 day
/usr/sbin/rclone -q --min-age 2d rmdirs "remote:$SERVER_NAME" #Remove all empty folders older than 2 day
echo "Finished";
echo '';

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

Bạn thay đổi các tham số trên như sau:

SERVER_NAME: tên thư mục chứa backup trên GoogleDrive.

Password: bạn thay bằng password của bạn.

remote:$SERVER_NAME  là tên remote của mình đây là trên bạn đã tạo ở bước kết nối Google Drive.Trong ví dụg của mình là "remote".

+ –transfers=1 : Thông số này có nghĩa là Rclone sẽ move lần lượt từng file lên Doogle Drive. Không có thông số này rclone sẽ move nhiều file cùng lúc. Với tham số này tránh tình trạng quá tải mà dẫn đến lỗi lúc backup qua Google Drive.

Chú ý: cần cài đặt zip để chạy được script trên.

3.3. Cấp quyền cho file backup.sh

chmod +x /root/backup.sh

3.4. Chạy backup đầu tiên bằng file backup.sh 

/root/backup.sh

Sau khi quá trình thành công, qua bên Google Drive để kiểm tra nhé.

Bước 4 - Backup VPS lên Google Drive hằng ngày

4.1. Mở cron job

EDITOR=nano crontab -e

4.2.  Thêm đoạn code bên dưới

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

Đoạn code này sẽ cho backup.sh chạy mỗi buổi sáng lúc 1h ( Giờ của VPS setup).

Bước 5 - Khôi phục dữ liệu VPS từ Google Drive

5.1. Đầu tiên backup toàn bộ về thư mục /root

rclone copy "remote_name:/directory_name/2017-09-16" /root/

Thay "remote" bằng trên remote bạn đã đặt lúc cài đặt.

5.2. Giải nén file backup lầy về từ Google Drive 

unzip /root/khamphaso.com.zip

5.3. Copy vào thư mục website được chứa

Ví dụ:

cp -rf /root/var/www/example.com/ /var/www/example.com

5.4. Giải nén file database

gunzip /root/mysql/example.sql.gz

5.5. Sau đó bạn có thể dùng lện mysql để import trở lại database

mysql -u root -p database_name < example.sql

Hy vọng bài viết có thể giúp bạn Backup VPS lên Google Drive hằng ngày một cách dễ dàng.