Tự động Backup và Upload lên Google Drive

Tự động Backup và Upload lên Google Drive

Sao lưu dữ liệu trên máy chủ là công việc rất quan trọng để đảm bảo an toàn dữ liệu. Ví dụ việc sao lưu dữ liệu Website sẽ giúp các bạn phục hồi website nhanh chóng khi có sự cố xảy ra.
Bài viết này sẽ hướng dẫn các bạn tạo script tự động sao lưu dữ liệu Website (source, database, web server config file) lên Google Drive.

Cài đặt Rclone

Rclone là công cụ giúp đồng bộ hóa dữ liệu có khả năng kết nối với các dịch vụ lưu trữ đám mây. Điều này đảm bảo cho dữ liệu được an toàn và tốc độ sao lưu cực nhanh.

Rclone hiện tại hỗ trợ kết nối tới rất nhiều dịch vụ lưu trữ như:

  • Amazon Drive
  • Amazon S3
  • DigitalOcean Spaces
  • Dropbox
  • Google Cloud Storage
  • Google Drive
  • Mega
  • Microsoft Azure Blob Storage
  • Microsoft OneDrive
  • Và các dịch vụ khác được liệt kê ở đây 

Bài viết này sẽ hướng dẫn kết nối Rclone với Google Drive, các dịch vụ khác hẹn các bạn ở những bài viết tiếp theo nhé.

Các bạn cài đặt Rclone theo các bước sau:

mkdir -p /home/backup

#Đối với Linux 64 bit:
cd /home/backup
wget https://downloads.rclone.org/v1.41/rclone-v1.41-linux-amd64.zip
unzip rclone-v*.zip
\cp rclone-v*-linux-amd64/rclone /usr/sbin/
rm -rf rclone-*

#Đối với Linux 32bit
cd /home/backup
wget https://downloads.rclone.org/v1.41/rclone-v1.41-linux-386.zip
unzip rclone-v*.zip
\cp rclone-v*-linux-386/rclone /usr/sbin/
rm -rf rclone-*

Dùng lệnh rclone để kiểm tra, ví dụ:

[root@itfromzero backup]# rclone version
rclone v1.41
- os/arch: linux/amd64
- go version: go1.10

Tạo kết nối từ server đến Google Cloud

Kết nối đến server qua SSH và sử dụng lệnh:

rclone config

Sau đó tương ứng với mỗi thông báo thì bạn cấu hình như sau:

No remotes found – make a new one Nhập n -> Enter

name> Bạn nhập tên kết nối. vd: upload_google_drive -> Enter

Choose a number from below, or type in your own value
<Danh sách Cloud Server>
Storage>  Chọn 11 để kết nối đến Google Drive -> Enter

client_id = Để trống -> Enter
client_secret = Để trống -> Enter

Scope that rclone should use when requesting access from drive. Chọn 1 – Full access all files… -> Enter

root_folder_id = Để trống -> Enter
service_account_file = Để trống -> Enter

Use auto config? Chọn n -> Enter

If your browser doesn’t open automatically go to the following link: https://accounts.google.com/o/oauth2/auth?access_type=offline&client_id=xxxxxxx

Bạn copy link trên, mở bằng trình duyệt, sau đó đăng nhập bằng user google drive -> Chọn Allow/Đồng Ý để cấp quyền truy cập. Sau đó copy dòng Code hiện ra.

Enter verification code> Dán dòng code đã copy ở trình duyệt vào đây -> Enter

Configure this as a team drive? Chọn n -> Enter

Sau đó Chọn y để đồng ý và q để thoát.

Sau khi cấu hình xong sử dụng lệnh sau để kiểm tra:

rclone lsd upload_google_drive:

Script tự động backup và upload lên google drive

Tạo file backup.py bằng lệnh:

nano /home/backup/backup.py

Script dưới đây mình viết bằng python nên vps phải đc cài python mới chạy nhé, mặc định thì python cũng được cài sẵn rồi nên các bạn yên tâm.

Nếu thiếu zip thì cài thêm bằng câu lệnh sau:

yum -y install zip

Nội dụng script:

#!/usr/bin/python
# -*- coding: utf-8 -*-

#################################################################
#
# Web Server Backup and Upload to Google Drive
#
# Author: itfromzero.com
#
#################################################################
import os
from datetime import datetime
import logging, logging.handlers
import time

#Logging
def setup_custom_logger(name):
    formatter = logging.Formatter(fmt='%(asctime)s %(levelname)-2s %(message)s', datefmt='%Y-%m-%d %H:%M:%S')
    handler = logging.handlers.RotatingFileHandler("/home/backup/backup.log", maxBytes=900000, backupCount=15)
    handler.setFormatter(formatter)
    screen_handler = logging.StreamHandler()
    screen_handler.setFormatter(formatter)
    logger = logging.getLogger(name)
    logger.setLevel(logging.DEBUG)
    logger.addHandler(handler)
    logger.addHandler(screen_handler)
    return logger


logger = setup_custom_logger('myapp')
MYSQL_LIST=['db1','db2'] #MYSQL Database
DB_NUM = len(MYSQL_LIST)
WEB_LIST=['a','b','c'] #WEB Folder name
WEB_NUM= len(WEB_LIST)
MYSQL_USER='' #MYSQL user
MYSQL_PW='' #MYSQL Password
GDRIVE_FOLDER='BACKUP_WEB'

logger.info('Web Server Backup Script')

#Create Backup Folder
logger.info('Create Backup Folder')
cmd = "mkdir -p /home/backup/`date +%Y%m%d`"
os.system(cmd)

logger.info('Database Backup')
for i in range(0,DB_NUM):
	cmd = "mysqldump -u "+MYSQL_USER+" -p"+MYSQL_PW+" "+MYSQL_LIST[i]+"  | gzip > /home/backup/`date +%Y%m%d`/"+MYSQL_LIST[i]+"-`date +%Y%m%d-%H-%M-%S`.sql.gz"
	os.system(cmd)
	logger.info('Backup database: %s Complete',MYSQL_LIST[i])

logger.info('Web Source Backup')
for j in range(0,WEB_NUM):
	cmd = "zip -r /home/backup/`date +%Y%m%d`/"+WEB_LIST[j]+".zip /home/www/"+WEB_LIST[j]+" -q -x /home/www/"+WEB_LIST[j]+"/wp-content/cache/**\*"
	os.system(cmd)
	logger.info('Backup Web Source: %s Complete',WEB_LIST[j])

logger.info('Web Server Config Backup')
cmd = "cp -r /etc/nginx/conf.d/ /home/backup/`date +%Y%m%d`/nginx/"
os.system(cmd)
logger.info('Backup Web Server Config Complete')

logger.info('Start Upload To Google Drive')
cmd = 'rclone move /home/backup/`date +%Y%m%d` "upload_google_drive:'+GDRIVE_FOLDER+'/`date +%Y%m%d`" >> /var/log/rclone.log 2>&1'
os.system(cmd)
logger.info('Upload Complete')

logger.info('Delete Backup File')

cmd = "rm -rf /home/backup/`date +%Y%m%d`"
os.system(cmd)
logger.info('Delete Complete')

logger.info("Remove all backups older than 3 days")
cmd = 'rclone -q --min-age 3d delete "upload_google_drive:'+GDRIVE_FOLDER+'"'
os.system(cmd) 
logger.info("Remove all empty folders older than 3 days")
cmd = 'rclone -q --min-age 3d rmdirs "upload_google_drive:'+GDRIVE_FOLDER+'"'
os.system(cmd) 
logger.info("Cleanup Trash")
cmd = 'rclone cleanup "upload_google_drive:"'
os.system(cmd)
logger.info("Finish Backup and Upload to Google Drive")

Lưu ý: Script trên mình để web source ở /home/www , thư mục backup ở /home/backup. Các bạn nhớ sửa lại phù hợp với server của mình nhé.

Script trên có kịch bản như sau:

  • Backup toàn bộ database MySQL trên server, mỗi database được tạo thành 1 file .gz và lưu trong thư mục mysql
  • Backup toàn bộ code trong thư mục /home/www/domain, mỗi code web tạo thành 1 file .zip
  • Backup toàn bộ file cấu hình Nginx trong thư mục /etc/nginx/conf.d/ và lưu trong thư mục nginx
  • Tổng hợp tất cả các file backup vào 1 folder
  • Tự động upload lên Google Drive vào khoảng thời gian bạn đặt.
  • Tự động xóa file backup trên server sau khi upload xong.
  • Thiết lập thời gian tự động xóa file backup cũ trên Google Drive.

Lập lịch backup

Sử dụng Crontab để lập lịch chạy script

Dùng lệnh sau để chỉnh sửa crontab:

crontab -e

Nội dụng tương tự như sau:

#
# Crontab - Auto backup
#
0 3 * * * python /home/backup/backup.py > /dev/null 2>&1

Nhấp ESC :wq để thoát.

0 3 * * * có nghĩa là chạy script hàng ngày vào lúc 3:00

Hi vọng bài viết trên sẽ giúp cho công việc backup dữ liệu của các bạn trở nên nhẹ nhàng hơn. Chúc các bạn thành công.