使用shell脚本自动备份文件到WebDAV,支持增量备份。
最近买的独服自己加了个2t的硬盘,装的pve开始玩,因为是小厂,最近在考虑备份的问题,如果是大厂就没这么多担忧了。首先是网站/数据库/docker,这个可以用面板来备份,小鸡鸡以及其他手搓项目的备份的话就不能用面板了。看了下别人的方法,都不是很适合我,于是,开始琢磨手搓一个备份脚本。搭配面板的计划任务,可以使用脚本备份多个目录的文件打包后传到alist挂载的网盘内,也可以是存储桶。主要是相对网上大多数的方法而言,更加的简单灵活,但网站备份方面依赖面板的备份,当然也可以直接指定项目运行的目录,免去使用面板生成备份文件。开始配置首先在alist内挂载存储,可以是本地,也可以是网盘&存储桶,我现在用的是夸克网盘,因为虚拟机的快照过大,存储桶显然不是性价比最高的选择。然后在alist设置→对象存储→生成id以及密钥→添加一个存储桶,设定名称以及选择你备份文件存储的网盘&存储桶(挂载网盘教程参考官方文档)。image然后复制粘贴代码保存到你想存储的目录下即可,使用简单,无需复杂配置。 xhj003/root/backup/├── backup.sh # 主脚本├── config.conf # 配置文件├── logs/ # 日志目录├── temp/ # 临时目录└── snar/ # snar文件目录├── dir1.snar # 对应目录1的snar文件 ├── dir2.snar # 对应目录2的snar文件 └── ... 备份流程:读取配置文件创建临时目录和日志目录检查每个备份目录的变化创建增量备份包上传到WebDAV清理临时文件记录日志WebDAV上传实现:使用 curl 命令进行WebDAV操作通过 HTTP PUT 方法将文件传输支持断点续传(未验证)验证上传完整性验证可行性测试了小文件的上传,打包网站什么的自然没什么问题。然后测试了把虚拟机备份上传到webdav,18G左右的快照,跑了一个多小时上传成功了,期间没有遇到大家说的webdav的断流大文件应该也没什么问题了,开始贴代码。测试日志小型备份配置文件config.confWebDAV配置WEBDAV_URL="http://127.0.0.1:5244/dav" # 此处根据实际情况修改,后缀/dav不要删除WEBDAV_USER="username"WEBDAV_PASS="password"备份目录配置(空格分隔多个目录)BACKUP_DIRS="/opt/1panel/backup/"远程备份目录REMOTE_BACKUP_DIR="/夸克/backup" # 根据你的命名自行修改其他配置COMPRESS_LEVEL=6 # 压缩级别(1-9)INCREMENTAL_BACKUP=false # 是否启用增量备份脚本代码fifi local end_time=$(date +%s) local duration=$((end_time - start_time)) console_log "INFO" "备份完成: ${dir} (耗时: ${duration} 秒)" log "BACKUP" "备份完成: ${dir}" "$backup_file" log "INFO" "备份耗时: ${duration} 秒" return 0}主函数main() {# 检查依赖 check_dependencies # 创建必要的目录 mkdir -p "$LOG_DIR" "$TEMP_DIR" "$SNAR_DIR" console_log "INFO" "开始备份任务..." log "INFO" "开始备份任务..." # 检查配置 if [ -z "$BACKUP_DIRS" ]; then handle_error "未配置备份目录" fi # 处理每个备份目录 for dir in $BACKUP_DIRS; do if [ ! -d "$dir" ]; then console_log "WARN" "目录不存在,跳过: ${dir}" log "WARN" "目录不存在,跳过: ${dir}" continue fi # 创建备份 create_backup "$dir" # 上传到WebDAV local dir_name=$(basename "$dir") local backup_file="${TEMP_DIR}/${BACKUP_PREFIX}_${dir_name}.tar.gz" upload_to_webdav "$backup_file" "${REMOTE_BACKUP_DIR}/${DATE}/${dir_name}.tar.gz" done # 清理 cleanup console_log "INFO" "备份任务完成" log "INFO" "备份任务完成"}执行主函数main "$@"