沙唐桔

自动备份 VPS 网站数据到 Dropbox 折腾记录

网上教程一堆,看着简单,不过自己技术太菜,折腾到符合自己需求要费不少功夫,简单记录一下。

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