方案原理
本方案通过 Linux 系统的 cron 定时任务,执行脚本调用 Dropbox 客户端进行文件同步,实现 VPS 数据的定时备份。相比实时同步,定时同步可以节省服务器资源。
请注意,原文中提到的“自动备份Linux VPS/服务器网站/数据库并上传到FTP的脚本”是另一种更通用的方案,本方案则专注于利用 Dropbox 进行备份。
1. 在 Linux 上安装 Dropbox 客户端
首先,根据你的系统架构下载对应的 Dropbox 客户端。
32位 Linux 系统:
wget -O dropbox.tar.gz "https://www.dropbox.com/download?plat=lnx.x86"
64位 Linux 系统:
wget -O dropbox.tar.gz "https://www.dropbox.com/download?plat=lnx.x86_64"
下载完成后,解压文件:
tar xzvf dropbox.tar.gz
首次运行 Dropbox 守护进程以生成主机 ID 并进行账户关联:
~/.dropbox-dist/dropboxd &
运行后,终端会输出一个包含 host_id 的链接。复制此链接并在浏览器中打开,登录你的 Dropbox 账户即可完成当前机器与账户的绑定。
2. 建立备份目录的软链接
绑定账户后,你的用户主目录下会生成 ~/Dropbox 文件夹。你可以通过创建软链接(Symbolic Link)的方式,将需要备份的网站目录链接到 Dropbox 文件夹内。
cd ~/Dropbox
ln -s /home/wwwroot/html
ln -s /home/wwwroot/htdocs
# 可以继续为其他需要备份的目录创建软链接
创建完成后,启动 Dropbox 守护进程即可开始同步:
~/.dropbox-dist/dropboxd &
3. 配置定时同步脚本以节省资源
为了节省服务器资源,我们可以不进行 7x24 小时实时同步,而是通过 cron 定时启动和停止同步进程。
首先,停止当前运行的 Dropbox 进程:
pkill dropbox
然后,创建一个控制脚本,例如 /root/backup.sh:
#!/bin/bash
# Dropbox 控制脚本
DROPBOX_PATH="/root/.dropbox-dist/dropboxd"
start() {
echo "[$(date)] 启动 Dropbox 同步..."
$DROPBOX_PATH &
}
stop() {
echo "[$(date)] 停止 Dropbox 同步..."
pkill -f "dropboxd"
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
sleep 2
start
;;
*)
echo "用法: $0 {start|stop|restart}"
exit 1
;;
esac
exit 0
给脚本添加执行权限:
chmod +x /root/backup.sh
最后,编辑 crontab 定时任务,设定同步时间。例如,设定每天凌晨4点开始同步,5点停止:
crontab -e
在打开的编辑器中添加以下两行:
0 4 * * * /bin/bash /root/backup.sh start
0 5 * * * /bin/bash /root/backup.sh stop
提示: 同步时长应根据每日数据变化量调整。如果数据更新不多,同步10-30分钟可能就足够了。
4. 补充:MySQL 数据库备份脚本
除了网站文件,数据库也需要定期备份。以下是一个使用 mysqldump 备份 MySQL 数据库到 Dropbox 目录的脚本示例 (/root/bakmysql.sh):
#!/bin/bash
# 数据库配置
DB_NAME="your_database_name" # 请修改为你的数据库名
DB_USER="your_database_user" # 请修改为你的数据库用户名
DB_PASS="your_database_password" # 请修改为你的数据库密码
# 路径配置
BACKUP_DIR="/root/Dropbox/mysql_backup"
LOG_FILE="/var/log/mysql_backup.log"
# 创建备份目录
mkdir -p $BACKUP_DIR
# 生成备份文件名 (格式: db_年月日.sql.gz)
BACKUP_FILE="${BACKUP_DIR}/db_$(date +%Y%m%d).sql.gz"
# 执行备份
echo "--- 开始备份 [$(date +"%Y-%m-%d %H:%M:%S")] ---" >> $LOG_FILE
# 使用 mysqldump 备份并压缩
mysqldump -u$DB_USER -p$DB_PASS $DB_NAME | gzip > $BACKUP_FILE
if [ $? -eq 0 ]; then
echo "成功: 数据库已备份至 $BACKUP_FILE" >> $LOG_FILE
else
echo "错误: 数据库备份失败!" >> $LOG_FILE
fi
# 删除7天前的旧备份 (可选)
find $BACKUP_DIR -name "db_*.sql.gz" -mtime +7 -delete >> $LOG_FILE 2>&1
echo "--- 备份结束 [$(date +"%Y-%m-%d %H:%M:%S")] ---" >> $LOG_FILE
echo "" >> $LOG_FILE
同样,给脚本添加执行权限并可以通过 crontab 定时运行,例如每天凌晨3点备份:
chmod +x /root/bakmysql.sh
# 在 crontab 中添加:
0 3 * * * /bin/bash /root/bakmysql.sh
5. 卸载 Dropbox 客户端
如果需要卸载 Dropbox,请按以下步骤操作:
# 1. 停止 Dropbox 进程
pkill dropbox
# 2. 删除相关文件和目录
rm -rf ~/.dropbox ~/.dropbox-dist ~/Dropbox dropbox.tar.gz
# 注意:删除 ~/Dropbox 会同时删除本地同步文件夹内的文件,请确保已备份重要数据。