历经两次重装系统,终于把这个新的脚本写好了。之前的那个脚本后把明文密码放在bash命令中,这样不是很安全,于是让bing ai帮我优化了下代码,结果它给的代码有些目录不全,导致把系统删了,所以这次仔仔细细了的检查了所有代码,并且拿其他机器测试十几次没问题后,才正式放到生产环境里。
这次脚本为上一篇《利用rclone对lnmp环境下的网站备份》的升级版,前面rclone挂载的步骤按照上一篇文章就好了,如果已经挂载,就不用管,直接看这篇文章就行。
准备事项
创建文件夹
在系统根目录创建backup文件夹,记得是系统根目录,不是root根目录,要注意区分。然后再到backup目录里创建web、sql、log这三个文件夹,再到log目录里创建backup.log文件,web指存放网站备份文件的地方,sql为存放数据库备份文件的地方,log为存放备份日志的目录,backup.log就是备份日志文件。
开启Mysqldump功能
#打开文件
nano /etc/my.cnf
#编辑文件
[client]
user =root
password = 你的数据库root密码
port = 3306
socket = /tmp/mysql.sock
我们只需要把前面几行改成这样就可以了,然后按ctrl+x保存,输入y确认,回车保存文件。
自动备份代码
完成上面操作后,到root根目录将如下代码放到backup.sh里,因为没有这个文件,我们需要手动创建。
#创建backup.sh文件
nano /root/backup.sh
将如下代码粘贴到这个文件里,并且保存
#!/bin/bash -e
# 设置变量
web_dir=/home/wwwroot/yunlogs.com #请将yunlogs.com改为你的网站目录
database=vliang #请将vliang改为你的数据库名
backup_dir=/root/backup
log_file=/root/backup/log/backup.log
date=$(date +"%Y%m%d%H%M%S")
random=$(shuf -i 10000-99999 -n 1)
zip_cmd="zip -q -r" # 压缩命令
rclone_cmd="rclone sync" # 同步命令
# 定义函数
# 备份网站文件并压缩
backup_web() {
# 拼接压缩包的名字
zipname=web_${date}_${random}.zip
# 进入网站目录
cd $web_dir
# 压缩当前目录下的所有文件
$zip_cmd $zipname *
# 移动压缩包到/backup/web目录并删除多余的备份文件
mv $zipname $backup_dir/web/
find $backup_dir/web/ -maxdepth 1 -name "web_*.zip" -type f -printf "%T@ %p\n" | sort -n | head -n -5 | cut -d' ' -f2 | xargs rm -f
}
# 备份数据库并压缩
backup_db() {
# 拼接压缩包的名字
filename=db_${date}_${random}.gz
# 备份数据库并压缩
mysqldump --defaults-file=/etc/my.cnf -C --single-transaction $database | gzip > $filename 2>>$log_file
# 移动压缩包到/backup/sql目录并删除多余的备份文件
mv $filename $backup_dir/sql/
find $backup_dir/sql/ -name "db_*.gz" -type f -printf "%T@ %p\n" | sort -n | head -n -5 | cut -d' ' -f2 | xargs rm -f
}
# 同步最新的备份文件到OneDrive,并删除多余的文件
sync_onedrive() {
$rclone_cmd $backup_dir cysui:/test/ #请将cysui改为你在rclone挂载时创建的名字,/test/改为你在onedrive的目录
}
# 执行函数并写入日志
echo "**********开始备份网站文件**********" >> $log_file
cd $web_dir && backup_web && echo "备份成功 $(date)" >> $log_file || echo "备份失败 $(date)" >> $log_file
echo "**********结束备份网站文件**********" >> $log_file
echo "" >> $log_file
echo "**********开始备份数据库**********" >> $log_file
cd $backup_dir && backup_db && echo "备份成功 $(date)" >> $log_file || echo "备份失败 $(date)" >> $log_file
echo "**********结束备份数据库**********" >> $log_file
echo "" >> $log_file
echo "**********开始同步到OneDrive**********" >> $log_file
sync_onedrive && echo "同步成功 $(date)" >> $log_file || echo "同步失败 $(date)" >> $log_file
echo "**********结束同步到OneDrive**********" >> $log_file
echo "" >> $log_file
给这个文件赋予可执行权限
chmod +x backup.sh
然后手动执行一次代码,需要等个十几二十秒就能上传到onedrive,到onedrive里看看是否存在。
/root/backup.sh
设置定时任务执行脚本
#输入
crontab -e
#选择vim或者nano编辑器都行
#在最后一行加入如下内容
0 2 * * * /root/backup.sh
#该参数表示每天2点的时候自动执行这个脚本,也可以改其他时间