前言

连接 Dropbox 备份 VPS 可以有两种方法:

  1. Dropbox Uploader
    开源脚本,命令多,功能丰富。使用 Dropbox API,可以调整权限使之只能访问 /Apps/YourApp 下的文件或允许其访问整个 Dropbox,非常适合在 VPS 上使用。

  2. Dropbox-CLI (CLI = Command Line Interface)
    Linux 上的 Dropbox 客户端,相当于使用命令行操作 PC 上的 Dropbox,稍作熟悉即可通过 Dropbox 提供的 python 脚本轻松实现管理。
    所以用它作为 VPS 的备份存在一个很重要的安全隐患。 Dropbox-CLI 有权限操作整个 Dropbox 中的所有文件,而 VPS 的安全风险相比于个人电脑显然高出许多,如果 VPS 被入侵,结果不堪想象。

因此在两种方案都实际使用后,最终老老实实使用 Dropbox Uploader, Dropbox-CLI 只做介绍非常不推荐。

Dropbox Uploader

Dropbox Uploader 是一个开源在 Github 的脚本,项目主页详细说明了脚本的用法。
若要使用 Dropbox Uploader 来备份,可以大致分为三个步骤:
1.到 Dropbox Developers 创建一个新的 App

  • 选择 Dropbox API
  • 选择 允许访问 App 目录 或 允许访问整个 Dropbox
  • 给自己的 App 起个名字,比如 YourApp
  • 在 OAuth 2 生成一个 App Access Token
  1. 配置 Dropbox Uploader
cd
wget https://raw.github.com/andreafabrizi/Dropbox-Uploader/master/dropbox_uploader.sh
chmod +x dropbox_uploader.sh

./dropbox_uploader.sh info #绑定 Dropbox App

按提示将生成的 Access Token 输入并确认,相关信息保存在 ~/.dropbox_uploader 文件中,如需修改配置可以直接编辑此文件。
再执行

./dropbox_uploader.sh upload /etc/passwd /vps/passwd.old

如果在 Dropbox 的目录 /Apps/YourApp 下看到了 /vps/passwd.old 就说明配置成功了。

题外话:
需要注意的是,根据用户在 Dropbox.com 设置的语言的不同,应用的目录名自动使用的语言也不同。语言是英文这个目录是 /Apps,语言是中文这个目录是 /应用,语言是日文这个目录是 /アプリ,以此类推。

  1. 配置计划任务:
vi /root/dropbox_uploader_backup.sh

添加如下内容:

#! /bin/bash
LOCAL_BAK_DIR="/root/BAK" #备份文件到指定位置
MYSQL_SERVER="localhost" #MySQL 服务器的地址,一般是本地地址
MYSQL_USER="mysqluser" #MySQL 的用户名名称,一般是 root 或 admin
MYSQL_PASS="mysqlpassword" #MySQL 用户的密码

echo "Start Backup"

# 备份并打包 MySQL 数据库
mysqldump -u $MYSQL_USER -h $MYSQL_SERVER -p $MYSQL_PASS --all-databases > /tmp/dbbak.sql
tar zcvf $LOCAL_BAK_DIR/MySQL.tar.gz -P /tmp/dbbak.sql
rm -f /tmp/dbbak.sql
echo "Database backup success..."

# 备份并打包网站文件
tar zcfP $LOCAL_BAK_DIR/web.tar.gz /var/www/
tar zcfP $LOCAL_BAK_DIR/nginx.tar.gz /etc/nginx/sites-available
#如果安装的是 LNMP 一键包则备份 /usr/local/nginx/conf /home/wwwroot
echo "Web files backup success..."

# 用脚本将备份的目录完整上传到Dropbox
$SCRIPT_DIR/dropbox_uploader.sh upload "$LOCAL_BAK_DIR" "/"

# 备份结束
echo "Backup Done! "$(date +"%Y.%m.%d") >> /root/backup.log

执行

chmod +x ~/dropbox_uploader_backup.sh
crontab -e

再添加

0 3 * * * /bin/bash /root/dropbox_uploader_backup.sh

大功告成。
为什么直接打包成同名文件,而不按日期分别打包呢?理由也很简单, Dropbox 的免费版也提供了 30 天的文件版本记录,可以回滚到这期间的任意时间点,可以节约存储空间。而如果网站备份坏了 30 天都没发现……

另一种选择: Dropbox-CLI

本机环境为 Ubuntu 16.04 x64,使用 PuTTY 连接 VPS。

cd ~ && wget -O - "https://www.dropbox.com/download?plat=lnx.x86_64" | tar xzf -
~/.dropbox-dist/dropboxd #从新建的 .dropbox-dist 文件夹运行 Dropbox 守护程序

Link-to-Dropbox
如图所示,此时 PuTTY 界面会不断刷出一个 Dropbox 的验证链接,将此链接复制到浏览器打开,按提示登入 Dropbox 账号,即可将 Dropbox 与 VPS 关联, Dropbox 会在主目录中自动创建 Dropbox 文件夹。

curl -LO https://www.dropbox.com/download?dl=packages/dropbox.py #下载 Dropbox 管理脚本
chmod +x ~/dropbox.py

运行./dropbox.py help可以看到脚本提供的命令,只是做备份的话需要用到的有 start stop status running exclude 这么几个。

./dropbox.py exclude [list] #列出不同步的 Dropbox 目录
./dropbox.py exclude add [DIRECTORY] [DIRECTORY] #添加不需要同步的目录
./dropbox.py exclude remove [DIRECTORY] [DIRECTORY] #恢复需要同步的目录

./dropbox.py exclude add ~/Dropbox/Pictures #例:不同步 Dropbox 中的 /Pictures 目录

把其他目录都排除掉,只保留用于备份的 Dropbox/VPS 目录, Dropbox-CLI 就配置好了。
需要注意的是不支持目录名字中的空格,建议用_替换。至于是否支持中文目录没有测试。

使用 Dropbox 备份 VPS

创建备份用的脚本:

vi /root/backup.sh

添加如下内容

#! /bin/bash

LOCAL_BAK_DIR="/root/BAK" #备份文件到指定位置
MYSQL_SERVER="localhost" #MySQL 服务器的地址,一般是本地地址
MYSQL_USER="mysqluser" #MySQL 的用户名名称,一般是 root 或 admin
MYSQL_PASS="mysqlpassword" #MySQL 用户的密码

echo "Start Backup"

# 备份并打包 MySQL 数据库
mysqldump -u $MYSQL_USER -h $MYSQL_SERVER -p $MYSQL_PASS --all-databases > /tmp/dbbak.sql
tar zcvf $LOCAL_BAK_DIR/MySQL.tar.gz -P /tmp/dbbak.sql
rm -f /tmp/dbbak.sql
echo "Database backup success..."

# 备份并打包网站文件
tar zcfP $LOCAL_BAK_DIR/web.tar.gz /var/www/
tar zcfP $LOCAL_BAK_DIR/nginx.tar.gz /etc/nginx/sites-available
#如果安装的是 LNMP 一键包则备份 /usr/local/nginx/conf /home/wwwroot
echo "Web files backup success..."

# 备份结束
echo "Backup Done! "$(date +"%Y.%m.%d") >> /root/backup.log

添加可执行权限

chmod +x ~/backup.sh

再将 VPS 备份的目录连接到 /Dropbox/VPS 目录下:

cd ~/Dropbox/VPS
ln -s ~/BAK

这样 Dropbox 就会自动同步存放备份的目录了。

配置计划任务

由于只需要定时进行备份,没有必要全天运行,因此可以用 cron 来管理。

crontab -e

添加如下内容:

0 3 * * * /bin/bash /root/backup.sh
0 4 * * * /usr/bin/python2.7 /root/dropbox.py start
0 5 * * * /usr/bin/python2.7 /root/dropbox.py stop

这样 VPS 就可以每天定时启动 Dropbox 进行备份,再定时关闭节约系统资源。


参考:

  1. Dropbox - Install Linux
  2. Dropbox - What Linux commands are available for Dropbox?
  3. Tennfy Wu - 定时备份VPS数据至Dropbox教程
  4. Fazero - 使用Dropbox备份网站附件和数据库