定时备份vps上的网站文件和数据库到dropbox网盘

  • 注册dropbox网盘账号
  • 创建dropbox应用,并记录APP_KEY,APP_SECRET
  • 从github下载第三方备份软件dropbox_uploader.sh,配置APP_KEY,APP_SECRET
  • 编写备份脚本, 添加到crontab计划任务
技巧
Dropbox在墙外,请自备梯子,不要被墙外的网络限制。

注册地址:点击这里

  1. 注册一个Dropbox账号,姓名随便填写,看着像那么回事就行。邮箱需要填写能收到邮件的,因为需要激活验证才能使用网盘的功能。。下图是注册页面:
  1. 注册完成后开始激活邮箱,在主页面,点击右上角的头像,然后再点击下拉框中的设置按钮,进入个人账户页面。下拉有一个发送激活邮件按钮,进入邮箱完成激活。

创建dropbox应用,并记录APP_KEY,APP_SECRET

  1. 点击打开创建应用,看到 create app按钮,点击开始创建app
  1. 这里有几个选项,我在图中都给出了解释,照着填就完事了, 最后点击右下角的create app按钮
  1. 创建好后记录下app key 和 app secret, 主要用来配置上传脚本

从github下载第三方备份软件dropbox_uploader.sh,配置APP_KEY,APP_SECRET

  1. 执行下面代码块的命令配置dropbox_uploader,第一次执行"./dropbox_uploader.sh"的时候,会要求输入APP_KEY,APP_SECRET,对着输入就行了。输入错了也没关系,执行"./dropbox_uploader.sh"看帮助文档。有很多实用的命令,比如list查看目录下备份文件
1
2
3
curl "https://raw.githubusercontent.com/andreafabrizi/Dropbox-Uploader/master/dropbox_uploader.sh" -o dropbox_uploader.sh
chmod +x dropbox_uploader.sh
./dropbox_uploader.sh
  1. 调用dropbox_uploader.sh,实现手动上传文件到Dropbox网盘
1
2
3
# 注意,第一个参数是要上传的本地文件或文件夹, 第二个参数'/'是网盘应用下的根目录,建议去再去Dropbox网盘看看当前的目录结构
# 据作者测试,上传目录比较慢,上传文件很快,几十兆的单文件基本秒传,所以后面会讲压缩成单文件,以及要备份哪些文件,怎么定时备份
dropbox_uploader.sh upload /home/wwwroot/www.xxxxx.com/ /

crontab计划任务,每天定时执行备份

  1. 我们需要备份网站代码,数据库,和相关配置。一个一个的上传比较麻烦,容易出错,最好打包成一个压缩文件,而且我们还需要删除30天之前旧备份,所以需要编写一个backup.sh脚本,不说废话,请看代码
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#!/bin/bash
script_dir="/usr/bin" #dropbox_uploader.sh 所在目录,必填。环境变量是个坑,百度之。
dropbox_dir="/" #Dropbox网盘上存放备份文件的目录,/代表应用的根目录
mysql_server="localhost" #数据库服务器地址,一般填 localhost 即可
mysql_user="数据库帐号" #数据库帐号
mysql_pass="数据库密码" #数据库密码
backup_dst="/home/backup" #本地临时文件目录,手动创建

# if [ $(date +%w) -eq 0 ];then #周日备份整站数据
backup_src="/home/wwwroot/www.wtfplus.com /usr/local/nginx/conf /usr/local/php/etc" #VPS上要备份的文件/目录,不同目录用空格分开
# else                         #每天备份重要文件、数据
#     find /home/wwwroot/www.wtfplus.com -maxdepth 1 -type f -exec tar cvf $backup_dst/important_files.tar.gz {} + #网站根目录文件
#     backup_src="/data/www/wtfplus.com/wp-content/themes /usr/local/apache/conf /usr/local/php/etc" #VPS上要备份的文件/目录,不同目录用空格分开
# fi

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

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

cd $backup_dst

#导出SQL数据库,并且按数据库分个压缩
for db in `mysql -u $mysql_user -h $mysql_server -p$mysql_pass -B -N -e 'SHOW DATABASES' | xargs`; do
    (mysqldump -u $mysql_user -h $mysql_server -p$mysql_pass --skip-lock-tables ${db} | gzip -9 - > ${db}.sql.gz)
done

#压缩数据库文件合并为一个压缩文件,并删除单独数据库文件
tar zcf sql_all_$(date +%Y-%m-%d).tar.gz *.sql.gz
rm -rf *.sql.gz

#数据库、文件压缩到一起
tar cfzP "$dstfile" $backup_src $backup_dst/*.*.gz

# 将文件上传到 Dropbox
$script_dir/dropbox_uploader.sh upload "$dstfile" "$dropbox_dir/$(date +"%Y-%m-%d").tar.xz"

# 删除 VPS 本地临时文件
rm -rf $backup_dst/*.*

#开始删除远程30天前的文件
$script_dir/dropbox_uploader.sh delete $dropbox_old_file
  1. 脚本保存为backup.sh, 并执行一次测试可行性,定位到最后异常的删除错误,因为没有30天前的旧备份,所以删除出错,这是正常的报错,打开Dropbox碗盘,可看到备份文件完美上传,下载备份的文件,然后解压,文件完整。。。脚本没毛病!
  2. 将脚本添加到crontab计划任务,定时18:30运行,时间可自行修改
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# 执行crontab -e
# 在弹出的编辑框最下行添加以下代码,然后保存
30 18 * * * /usr/bin/backup.sh


# 该行包括六个域,其中前五个域是指定命令被执行的时间,最后一个域是要被执行的命# 令。
# 每个域之间使用空格或者制表符分隔。格式如下:
# minute hour day-of-month month-of-year day-of-week commands
# 合法值 00-59 00-23 01-31 01-12 0-6 (0 is sunday)
# 除了数字还有几个个特殊的符号就是"*"、"/"和"-"、",",*代表所有的取值范围内的数字,"/"代表每的意思,"/5"表示每5个单位,"-"代表从某个数字到某个数字,","分开几个离散的数字。

数据备份的重要性我就不说了,毕竟数据无价,指不定哪天vps就宕机了。因前车之鉴,于是有了这篇博文,作者精力有限,文中难免存在错误和疏漏,请各位读者能提出宝贵建议或给予指正,可在博文下评论指出,我会及时改进,在此先感谢各位。