之前寫過一篇博客,記錄了 定時自動備份網站和數據庫 的腳本,不過只是將 VPS 上的數據打包保存在了本機的一個目錄下,要知道真正的容災備份需要至少在 3 個不同的物理節點上都有一份拷貝的。Email 發送備份文件在數據超多的情況下不太實際,而出於成本考慮我不想為了一個 VPS 又購買另一個來用作 FTP。不禁想到 DropBox,它無疑是很好的選擇——基於 Amazon S3 的雲存儲保證了可靠性,免費的容量已經足夠用,也不必擔心數據被審查。

一、設置 Dropbox

Dropbox 提供了豐富的 API,使得我們不必使用官方龐大的客戶端,而用一些簡單輕量的腳本即可直接上傳文件。

Dropbox-Uploader 就是這樣一個第三方的腳本,並且它已經開源在了 Github。我們將此腳本下載到 VPS 中,即可使用。

$ wget https://raw.github.com/andreafabrizi/Dropbox-Uploader/master/dropbox_uploader.sh
$ chmod +x dropbox_uploader.sh
$ ./dropbox_uploader.sh

運行腳本,根據提示設置自己的 Dropbox 應用 API,然後按照步驟設置,就可以使用其命令上傳和下載文件了。

dropbox_app_create

二、同步備份腳本

腳本根據自己的 VPS 配置進行一些修改。

#!/bin/bash
# 一些配置
DROPBOX_DIR=/$(date +%Y-%m-%d) # Dropbox 目錄,根目錄 / 是你已經創建的 app 目錄
MYSQL_USER="root"
MYSQL_PASS="password"
MYSQL_DB=('wordpress' 'project2')
BACK_DATA=/root/backup-data # 備份文件保存在本地的目錄
DATA=/var/www # 需要備份的網站文件
 
# 定義備份文件名
DataBakName=Database_$(date +"%Y-%m-%d").tar.gz
WebBakName=Web_$(date +%Y-%m-%d).tar.gz
OldData=Database_$(date -d -6day +"%Y-%m-%d").tar.gz
OldWeb=Web_$(date -d -6day +"%Y-%m-%d").tar.gz
# Dropbox 里 30 天以上的舊數據可以清除
Old_DROPBOX_DIR=/$(date -d -30day +%Y-%m-%d) 
# 清理本地保存了 6 天的備份
echo -ne "Delete local data of 6 days old..."
rm -rf $BACK_DATA/$OldData $BACK_DATA/$OldWeb
echo -e "Done"
 
cd $BACK_DATA
# 導出 MySQL 數據庫,並壓縮
echo -ne "Dump mysql..."
for db in ${MYSQL_DB[@]}; do
    (/usr/bin/mysqldump -u$MYSQL_USER -p$MYSQL_PASS ${db} > ${db}.sql)
done
tar zcf $BACK_DATA/$DataBakName *.sql
rm -rf $BACK_DATA/*.sql
echo -e "Done"
 
# 備份網站文件
echo -ne "Backup web files..."
cd $DATA
tar zcf $BACK_DATA/$WebBakName *
echo -e "Done"
 
cd $BACK_DATA
# 開始上傳到 Dropbox
echo -e "Start uploading..."
./dropbox_uploader.sh upload  $BACK_DATA/$DataBakName $DROPBOX_DIR/$DataBakName
./dropbox_uploader.sh upload  $BACK_DATA/$WebBakName $DROPBOX_DIR/$WebBakName
 
# 清理 Dropbox 里 30 天前的舊數據
./dropbox_uploader.sh delete $Old_DROPBOX_DIR/
 
echo -e "Thank you! All done."

然後使用 crontab,讓此腳本每幾天定時自動運行,網站的所有數據就會安全地備份到 Dropbox 了。其他注意事項,可以參考我之前的一篇 定時自動備份網站和數據庫

– EOF –