前言:禅道开源版备份不清理,磁盘早晚被撑爆!本文提供一套生产级自动清理方案,只删 7 天前的旧备份,不影响任何生产数据,彻底根治备份膨胀问题,运维小白也能直接复用。
作为运维,相信用禅道开源版的小伙伴都踩过同一个致命坑:
禅道默认每天自动全量备份,开源版居然阉割了「自动清理旧备份」核心功能(该功能仅企业版专属)!
时间一长,/opt/zbox/app/zentao/tmp/backup/目录疯狂膨胀,从几G涨到十几G、几十G,最终直接占满磁盘,导致禅道服务器崩溃,欲哭无泪。
本文分享一套生产级可用的禅道开源版自动清理脚本+定时任务,彻底解决备份无限膨胀问题,全程零风险、不影响业务数据,可直接复用。
一、问题根源:禅道开源版的「备份陷阱」
禅道的备份机制本身设计简单,但开源版的阉割操作直接埋下了磁盘爆炸的隐患:
- 默认全量备份:每天自动生成包含「数据库备份(
*.sql.php)+ 附件备份(*.file目录)+ 代码备份(*.code目录)」的完整备份 - 永久保留不清理:默认不会自动删除任何旧备份,所有备份永久存储在服务器
- 开源版无清理功能:后台完全没有「保留备份天数/自动清理旧备份」的可视化配置,仅企业版支持
- 体积爆炸式增长:对于附件多的团队,单天备份体积轻松突破1G,半个月就能占满15G+磁盘,几个月直接上百G,最终磁盘爆满,服务宕机
我在生产环境部署时,就遇到了备份目录从0涨到17G的情况,第一次手动清理只删了数据库备份,仅释放1G空间,治标不治本,这才下定决心做一套彻底的解决方案。
二、踩坑实录:从「只清1G」到「生产级脚本」的避坑之路
在最终脚本落地前,我踩了4个运维典型的坑,给大家提前避坑:
坑1:漏删核心备份,只清了1G空间
第一次手动清理时,只写了删除*.sql.php数据库备份的命令,完全没碰真正占空间的*.file附件目录、*.code代码目录,结果17G的备份只清了1G,没过几天磁盘又满了。
坑2:Cron定时任务的「隐形杀手」
直接把命令写进crontab,结果手动执行正常,定时任务静默失败:
- 环境变量缺失:cron默认PATH不包含
/usr/local/bin,导致find、du等命令找不到 - 权限问题:日志写
/var/log/,普通用户无权限,日志静默丢失,无法排查 - 执行逻辑风险:用
;连接命令,前一个命令失败,后续命令仍执行,导致清理不完整
坑3:Find报错「No such file or directory」
脚本执行时,find频繁报目录不存在的错误,其实是先删了目录,后续find遍历找不到,属于正常提示,但影响日志可读性和问题排查。
坑4:日志无时间戳,分不清哪天清理的
最初的脚本只记录备份大小,没有执行时间,无法追溯每条日志对应哪一天的清理,出问题难以排查。
三、最终生产级自动清理脚本(v1.2,零风险可直接复用)
针对以上所有坑,优化出一套生产级可用的脚本,核心原则:只删7天前的旧备份,绝对不碰真实业务数据,保留足够恢复周期。
脚本完整代码
#!/bin/bash# ==============================================# 禅道开源版 自动清理旧备份 生产级脚本# 功能:每天自动删除7天前的旧备份,仅操作备份目录,不碰真实数据# 适配:禅道一键安装包默认路径,无需修改# 版本:v1.2(新增日志时间戳,可追溯执行日期)# ==============================================# 1. 显式声明环境变量,彻底解决cron找不到命令的问题PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin# 2. 定义备份目录(禅道一键安装包默认路径,无需修改)BACKUP_DIR="/opt/zbox/app/zentao/tmp/backup/"# 3. 进入备份目录,失败则直接退出,杜绝误操作其他目录cd"${BACKUP_DIR}"||exit1# 4. 核心清理逻辑(&& 连接,任一环节失败则终止,避免不完整清理)# 4.1 删除7天前的数据库备份(*.sql.php),2>/dev/null 屏蔽正常提示find.-typef-name"*.sql.php"-mtime+7-delete2>/dev/null&&\# 4.2 删除7天前的附件备份(*.file目录,真正占空间的核心)find.-typed-name"*.file"-mtime+7-execrm-rf{}\;2>/dev/null&&\# 4.3 删除7天前的代码备份(*.code目录)find.-typed-name"*.code"-mtime+7-execrm-rf{}\;2>/dev/null&&\# 4.4 清理删除后产生的空目录find.-typed-empty-delete2>/dev/null# 5. 记录清理日志(带时间戳,写入/root目录,权限100%可用,方便排查)echo"$(date'+%Y-%m-%d %H:%M:%S')-$(du-sh${BACKUP_DIR})">>/root/zentao_backup.log2>&1脚本核心优化点(解决所有坑)
| 优化点 | 作用 |
|---|---|
| 显式声明PATH | 彻底解决cron环境变量缺失,找不到find/du命令的问题 |
| 路径校验+失败退出 | `cd 目录 |
&&连接命令 | 任一环节失败,后续命令不再执行,避免不完整清理 |
| 精准匹配备份类型 | 同时清理*.sql.php/*.file/*.code,彻底释放所有冗余空间 |
2>/dev/null屏蔽提示 | 屏蔽find「目录不存在」的正常提示,日志更干净 |
| 日志写入/root | 避免/var/log/权限问题,确保日志100%可写,方便排查 |
| 日志带时间戳 | 每条记录标注执行时间,可精准追溯,解决「分不清哪天清理」的问题 |
| 保留7天备份 | -mtime +7仅删除7天前的旧备份,保留最近7天完整备份,符合官方最佳实践 |
| 可重复执行 | 仅针对过期备份生效,重复执行不会误删新备份,100%安全 |
四、脚本部署全流程(零门槛,一步步跟着做)
步骤1:创建脚本文件
vi/opt/zbox/clean_zentao_backup.sh将上面的完整脚本复制进去,保存退出(ESC→:wq→ 回车)。
步骤2:给脚本添加执行权限
chmod+x /opt/zbox/clean_zentao_backup.sh步骤3:手动测试脚本(验证安全、有效)
# 执行脚本/opt/zbox/clean_zentao_backup.sh说明:首次执行时,
find可能会报少量「No such file or directory」,属于正常现象(已通过2>/dev/null屏蔽大部分),是因为先删除了目录,后续遍历找不到,不影响最终清理结果。
步骤4:验证脚本是否成功
无需等待定时任务,直接手动验证,两步就能确认:
- 查看清理日志
成功标志:日志中会显示带时间戳的备份目录大小(如cat/root/zentao_backup.log2026-04-10 23:31:23 - 15G),空间成功释放。 - 手动核对备份目录大小(双重验证)
大小和日志一致,说明清理完全生效。du-sh/opt/zbox/app/zentao/tmp/backup/
步骤5:重复执行验证(可选,100%安全)
你可以随时重复执行脚本,完全不会有任何风险:
# 再次执行脚本,验证无误删/opt/zbox/clean_zentao_backup.sh# 再次查看日志,确认备份大小无变化(无7天前的旧备份,不会删除任何内容)cat/root/zentao_backup.log安全原理:脚本的核心过滤条件是
-mtime +7,只删除7天前的旧备份,重复执行时,find找不到符合条件的旧文件,只会空跑,不会删除任何有用的新备份,更不会碰禅道的真实业务数据。
步骤6:添加定时任务,一劳永逸
# 编辑定时任务crontab-e# 在文件末尾添加以下内容(每天凌晨2点自动执行,无人值守)02* * * /opt/zbox/clean_zentao_backup.sh# 保存退出,定时任务立即生效步骤7:验证定时任务
# 查看定时任务是否添加成功crontab-l输出0 2 * * * /opt/zbox/clean_zentao_backup.sh即表示成功。
五、100%安全承诺:绝对不影响业务数据
这是大家最关心的问题,给大家吃定心丸:
1. 操作边界绝对安全
脚本全程只操作/opt/zbox/app/zentao/tmp/backup/这一个备份目录,
禅道的真实业务数据(项目、任务、缺陷、用户、附件)全部存储在/opt/zbox/data/mysql/目录,
脚本完全不碰、一丝不动真实数据目录,绝对不会影响生产数据。
2. 备份策略完全合规
脚本仅删除7天前的旧备份,最近7天的完整备份(数据库+附件+代码)全部保留,
完全符合禅道官方「保留至少7天备份用于故障恢复」的最佳实践,
就算出现极端故障,也有最近7天的备份可以完整恢复,数据绝对有兜底。
3. 运行状态零影响
禅道运行时根本不会读取备份目录的任何文件,删除旧备份对禅道服务、业务功能、页面访问零影响,
脚本执行后,禅道所有进程正常运行,数据完整无缺。
4. 重复执行零风险
脚本仅针对「7天前的旧备份」生效,重复执行不会删除任何新备份、不会误删数据,可随时验证,完全安全。
六、进阶优化(可选,进一步释放空间)
1. 取消「备份附件」,从根源减小备份体积
禅道后台 → 「系统」→「备份」→ 取消勾选「备份附件」,
这样每次备份仅备份数据库,单天备份体积从1G+降到几十MB,备份目录永久稳定在几百MB。
注意:取消附件备份后,需通过整机快照或rsync同步保障附件安全,避免数据丢失。
2. 附件同步到NAS/云存储
# 每天凌晨3点同步附件目录到NAS,双重保障附件安全03* * *rsync-avz/opt/zbox/app/zentao/www/data/upload/ nas-server:/backup/zentao/upload/3. 磁盘监控告警
添加定时任务,当备份目录超过10G时发邮件告警,提前预警:
04* * *[$(du-s/opt/zbox/app/zentao/tmp/backup/|awk'{print $1}')-gt10240000]&&echo"禅道备份目录超过10G,请排查"|mail-s"磁盘告警"admin@yourdomain.com七、最终总结
禅道开源版阉割自动清理备份功能,是很多运维的长期痛点,
本文分享的脚本,是我在生产环境踩坑后优化出的生产级可用方案,
- 彻底解决备份无限膨胀、磁盘占满的问题
- 全程零风险,不影响业务数据
- 可重复执行,随时验证
- 日志可追溯,问题可排查
- 一劳永逸,自动运维,无需手动操作
- 完美适配禅道一键安装包,无需修改任何配置
希望这篇分享能帮到同样踩坑的运维小伙伴,彻底解决禅道备份的烦恼!
如有问题,欢迎在评论区留言交流,一起优化运维方案~