网上教程一堆,看着简单,不过自己技术太菜,折腾到符合自己需求要费不少功夫,简单记录一下。
Dropbox 准备
登录 Dropbox,打开 Apps 页面,点击 Create App 按钮,创建一个 App
获取 Access token,点击 Generate 获取备用。
接着 SSH 登录 VPS 获取最新的 Dropbox Uploader 脚本
git clone https://github.com/andreafabrizi/Dropbox-Uploader.git
chmod +x /root/Dropbox-Uploader/dropbox_uploader.sh
/root/Dropbox-Uploader/dropbox_uploader.sh info
根据提示输入 Access token,Dropbox 绑定成功。再次运行 ./dropbox_uploader.sh info
可以看到绑定的 Dropbox 账户信息。
创建备份脚本
参考脚本,需要根据实际环境修改,如文件路径、备份目录等。
#!/bin/bash
script_dir="/root/Dropbox-Uploader/" #这是 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="/data/www/cyhour.com /usr/local/apache/conf /usr/local/php/etc" #VPS上要备份的文件/目录,不同目录用空格分开
else #每天备份重要文件、数据
find /data/www/cyhour.com -maxdepth 1 -type f -exec tar cvf $backup_dst/important_files.tar.gz {} + #网站根目录文件
backup_src="/data/www/cyhour.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
脚本修改完,上传至 /root/ 目录下,并赋予执行权限。
mkdir -p /home/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
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
参考文章
KeenWon - 自动定时备份 VPS
TENNFY WU - 定时备份 VPS 数据至 Dropbox 教程
Unix & Linux Stack Exchange- tar files only, no directories
Centos 7 x86_64 bbr + LAMP 一键安装包环境下实测通过。
后记
执行脚本可能提示: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
难道刚才在备份,所以卡住了?!
说起来我好久没备份过自己的博客数据了。
@不亦乐乎 刚才是什么时候?内存没爆,应该不至于卡住啊,可能是网络抽风。常备份是好习惯。
dropbox很耗系统资源的,不用换个备份吧,比如我用btsync。
我现在的博客是bitcron,倒是自动备份到dropbox的
@Unee Wang 这个并没在 vps 安装 Dropbox 吧?只是用 api 把文件上传上去。btsync 也会占资源啊,bitcron 我也有一个,还是不大喜欢。
老头生活真闲适,到处折腾!
@方室网志 哪里哪里……生命不息,折腾不止。
请问oneinstack的自动备份,也是使用这个API吗?谢谢
@掩耳 我没用过 oneinstack 的自动备份……