使用Google Drive自动备份网站数据

VPS商提供的自动备份往往是需要收费的,许多站点程序都没有较好的自动备份插件,譬如我使用的wordpress就有updraft备份插件,可以很好将wordpress的数据定时备份到多种远程云服务或通过邮件发送。但wikipedia就找不到那么好的备份插件了,这时候我们可以使用Google Drive 的API来完成类似于updraft插件的功能(GITHUB上有不少的七牛云备份程序,但这样不便和其他站点统一管理),网上的相关教程较少,因此在此记录,方便各位参照。

首先创建google api凭据

1 移步https://console.developers.google.com/flows/enableapi?apiid=drive 如果已经有应用选择一项,没有创建一个新的应用。
2 点击启用API,跳转到“凭据”页面,这里直接取消。
3 点击“OAuth同意屏幕”,填写电子邮件地址和产品名称
4 点击“凭据”,创建凭据,选择第二项:OAuth 2.0 客户端 ID。
5 记下你的客户端 ID和客户端密钥。

创建SH代码,备份vhosts站点及数据库

直接使用以下代码:

#You need modify below varriable to appropriate with your
BACKUP_TEMP_DIR="/data1/www/backup/tmp"
BACKUP_CODE="/data1/www/backup"
#if your site is stored in /var/www/yourdomain.com
# then PARENT_WORDPRESS_SITE="/data1/www"
# and SITE_NAME="mediawiki"
PARENT_WORDPRESS_SITE="/data1/www"
SITE_NAME="mediawiki"

DBNAME='####'
DBUSER='####'
DBPASSWORD='####'

#End define, below is my work 🙂

WORDPRESS_SITE_PATH=$PARENT_WORDPRESS_SITE"/"$SITE_NAME

BACKUP_FILE=$SITE_NAME"_`date +%Y%m%d-%H%M`.tar.gz"
#Sql file name with year-month-date-hour-minute
SQLFILE=$DBNAME'.sql'
SQL_BACKUP_FILE=$DBNAME'.tar.gz'

BACKUP_FILE_PATH=$BACKUP_TEMP_DIR'/'$BACKUP_FILE

echo "Dumping DB name=$DBNAME"
#Create backup folder if folder is not existing

mkdir -p $BACKUP_TEMP_DIR

cd $WORDPRESS_SITE_PATH
#Dump sql file to $SQLFILE
mysqldump -u $DBUSER -p $DBNAME --password=$DBPASSWORD --skip-lock-tables --force >$SQLFILE
#Zip sql file
tar -zcvf $SQL_BACKUP_FILE $SQLFILE
#Remove sql file
rm -f $SQLFILE

#Cd to backup code folder
cd $PARENT_WORDPRESS_SITE
tar -zcvf $BACKUP_FILE_PATH $SITE_NAME

echo "Uploading to google drive"
cd $BACKUP_CODE
#UPload backup file to google drive
python3 upload.py
#Remove backup file since file is uploaded to google drive
rm -f $BACKUP_FILE_PATH
#echo "Done"

cd $WORDPRESS_SITE_PATH
rm -f $SQL_BACKUP_FILE

在调用python代码前,该shell会将mediawiki的网站数据和数据库备份到同目录的tmp文件夹下,用tar格式进行压缩。(注意修改网站目录和数据库等设置,如此处我的网站安装在/data1/www目录下。)

Python代码

在同目录下建立upload.py和settings.yaml
首先安装GoogleAuth和pydrive:

pip install --upgrade google-api-python-client
pip install PyDrive

settings.yaml内容如下:

client_config_backend: settings
client_config:
  client_id: 客户端 ID
  client_secret: 客户端密匙

save_credentials: True
save_credentials_backend: file
save_credentials_file: credentials.json

get_refresh_token: True

oauth_scope:
  - https://www.googleapis.com/auth/drive.file
  - https://www.googleapis.com/auth/drive.install

upload.py内容如下:

from pydrive.auth import GoogleAuth
from pydrive.drive import GoogleDrive
import os
file_upload = "/data1/www/backup/tmp/"+os.listdir("/data1/www/backup/tmp")[0]
gauth = GoogleAuth()
gauth.LocalWebserverAuth()
drive = GoogleDrive(gauth)

###folderid的取得方式为:点击googledrive目录的链接,浏览器地址栏folders/********后面的********即为folderid,如果要保存在根目录,可以不用folderid参数,直接file1 = drive.CreateFile()即可
folderid = "0B4_SMiWHgOfmdGhLTXdCeEw2ek0"
file1 = drive.CreateFile({"parents": [{"kind": "drive#fileLink", "id": folderid}]})
file1.SetContentFile(file_upload)
file1.Upload()

最后将backup.sh加入crontab定时任务中即可。

例如每周周一凌晨一点定时备份

0  1  *  *  0 root       sh /data1/www/backup/backup.sh

发表评论

电子邮件地址不会被公开。 必填项已用*标注