風車

使用 Dropbox Uploader 将 VPS 博客网站数据自动备份到 Dropbox

不管是 VPS 博客网站数据,还是日常工作文件、重要资料、生活照片等,为确保数据安全不丢失,都必须有多个备份(3-2-1 备份原则),定时自动备份或者手动整理备份都可以,前者更省心。

数据备份方法很多,VPS 备份教程也能找到不少,这里仅简单详细介绍一下使用 Dropbox Uploader 将 VPS 博客网站数据自动备份到 Dropbox 方法。

VPS 使用 Dropbox Uploader 连接 Dropbox

登录 Dropbox,打开 Apps 页面,点击 Create App 按钮,创建一个 App

「Permissions」开启 files.metadata.write、files.metadata.read、files.content.write、files.content.read 权限:

接着 SSH 登录 VPS 获取最新 Dropbox Uploader 脚本:

cd /root/ && git clone https://github.com/andreafabrizi/Dropbox-Uploader.git && chmod +x /root/Dropbox-Uploader/dropbox_uploader.sh && /root/Dropbox-Uploader/dropbox_uploader.sh info

根据提示输入 App key 和 App secret:

复制类似「https://www.dropbox.com/oauth2/authorize?client_id=abcdefghijk&token_access_type=offline&response_type=code」url 到浏览器获取 Dropbox access code:

拿到应用访问代码,粘贴到 SSH 命令行处:

回车,y 确认,如无意外 Dropbox 绑定成功。

再次运行 /root/Dropbox-Uploader/dropbox_uploader.sh info 可以看到绑定的 Dropbox 账户信息。

创建定时备份脚本

参考脚本,需要根据实际环境修改,如文件路径、备份目录等。

#!/bin/bash
SCRIPT_DIR="/root/Dropbox-Uploader/" #dropbox_uploader.sh 文件夹位置
DROPBOX_DIR="/" #Dropbox上的备份目录
MySQL_DIR="/usr/local/mariadb" #which mysql 可查询路径,如 /usr/local/mariadb/bin/mysql 填入 /bin/mysql 之前路径即可
MYSQL_SERVER="localhost" #mysql服务器地址,一般填 localhost 本地地址即可
MYSQL_USER="root" #数据库帐号
MYSQL_PASS="KoYem9Xxc1QLCrhI" #数据库密码
BACKUP_SYS="/usr/local/nginx/conf/ /usr/local/php/etc/" #需要备份的系统配置文件
BACKUP_DST="/data/backup" #本地备份文件存放目录,手动创建
SITEROOT1="/data/wwwroot/ae.mba" #网站路径
BACKWPUP1="$SITEROOT1/wp-content/uploads/backwpup*backups" #BACKWPUP 插件备份存放路径
UPLOAD1="--exclude=backwpup* $SITEROOT1/wp-content/uploads/"
BACKUP_SRC1_Lite="--exclude=wp-admin --exclude=wp-includes --exclude=wp-content/languages --exclude=wp-content/plugins --exclude=wp-content/uploads --exclude=wp-content/upgrade $SITEROOT1/"
BACKUP_SRC1_Full="--exclude=1024 $SITEROOT1/"

DESTFILE="$BACKUP_DST/$(date +"%Y-%m-%d").tar.xz" #压缩好的备份文件

#定义Dropbox旧数据的名字(7天前)
DROPBOX_OLD_DATA=$(date -d -7day +%Y-%m-%d).tar.xz

cp $BACKWPUP1/*.tar $BACKUP_DST

cd $BACKUP_DST

#使用命令导出SQL数据库,并且按数据库分个压缩
for db in `${MySQL_DIR}/bin/mysql -uroot -h $MYSQL_SERVER -p$MYSQL_PASS -B -N -e 'SHOW DATABASES' | xargs`; do
(${MySQL_DIR}/bin/mysqldump -uroot -h $MYSQL_SERVER -p$MYSQL_PASS --databases ${db} | gzip -9 - > ${db}.sql.gz)
done
#压缩数据库文件合并为一个压缩文件,并删除单独数据库文件
tar zcf SQL_ALL_$(date +%Y-%m-%d).tar.gz *.sql.gz
rm -rf *.sql.gz

echo "数据库备份完成,打包网站数据中..."

if [ $(date +%w) -eq 0 ];then
BACKUP_SRC1=$BACKUP_SRC1_Full #星期天备份整站
else # 日常增量备份 UPLOAD
BACKUP_SRC1=$BACKUP_SRC1_Lite #日常备份部分数据
tar --newer-mtime "4 days ago" -czvf Upload_Recent_4days_$(date +%Y-%m-%d).tar.gz $UPLOAD1
echo "upload 增量备份完成,打包网站数据中..."
fi

cd ~

#数据库、文件压缩到一起
tar cfzP "$DESTFILE" $BACKUP_SYS $BACKUP_SRC1 $BACKUP_DST/*.*.gz $BACKUP_DST/*.tar /root/*.sh

echo "所有数据打包完成,准备上传..."

# 用脚本上传到dropbox
$SCRIPT_DIR/dropbox_uploader.sh upload "$DESTFILE" "$DROPBOX_DIR/$(date +"%Y-%m-%d").tar.xz"
if [ $? -eq 0 ];then
echo "上传完成"
else
echo "上传失败,重新尝试"
fi
# 删除
rm -rf $BACKUP_DST/*.*
#开始删除远程7天前的文件
$SCRIPT_DIR/dropbox_uploader.sh delete $DROPBOX_OLD_DATA

脚本修改完,保存为 backup.sh 上传至 /root/ 目录下,并赋予执行权限:

mkdir -p /data/backup
chmod +x /root/backup.sh

注意:如果上面脚本 tar 打包 --exclude 无法排除指定目录,请将需要打包的目录放至排除参数后。

如:test 目录下有 1 2 3 4 5 这5个目录;1 下有 6 7 两个目录。现在要将 3 4 5 6 目录 tar 打包,2和1下的6这两个目录不要。

命令:tar -zcvf test.tar.gz --exclude=1/6 --exclude=2 test

执行脚本可能提示:which: no shasum in

比如:

which: no shasum in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin)

CentOS 系统,SSH 安装一下 perl-Digest-SHA 就好:yum install -y perl-Digest-SHA

crontab 定时执行脚本

44 4 * * * /root/backup.sh

每天 4:44 自动执行脚本

注意:最好运行 service crond status (Debian:/etc/init.d/cron status)检查 crond 服务是否启动,service crond start 可手动启动,或者设置开机启动:chkconfig --level 35 crond on