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.