news 2026/4/26 23:01:11

禅道开源版空间无限膨胀?手把手写生产级自动清理脚本,彻底解决磁盘占满问题

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
禅道开源版空间无限膨胀?手把手写生产级自动清理脚本,彻底解决磁盘占满问题

前言:禅道开源版备份不清理,磁盘早晚被撑爆!本文提供一套生产级自动清理方案,只删 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,导致finddu等命令找不到
  • 权限问题:日志写/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:验证脚本是否成功

无需等待定时任务,直接手动验证,两步就能确认:

  1. 查看清理日志
    cat/root/zentao_backup.log
    成功标志:日志中会显示带时间戳的备份目录大小(如2026-04-10 23:31:23 - 15G),空间成功释放。
  2. 手动核对备份目录大小(双重验证)
    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

七、最终总结

禅道开源版阉割自动清理备份功能,是很多运维的长期痛点,
本文分享的脚本,是我在生产环境踩坑后优化出的生产级可用方案

  • 彻底解决备份无限膨胀、磁盘占满的问题
  • 全程零风险,不影响业务数据
  • 可重复执行,随时验证
  • 日志可追溯,问题可排查
  • 一劳永逸,自动运维,无需手动操作
  • 完美适配禅道一键安装包,无需修改任何配置

希望这篇分享能帮到同样踩坑的运维小伙伴,彻底解决禅道备份的烦恼!

如有问题,欢迎在评论区留言交流,一起优化运维方案~

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/17 3:36:52

如何用STM32CubeMX+MATLAB2023B玩转硬件在环?STM32G4xx实战案例解析

如何用STM32CubeMXMATLAB2023B玩转硬件在环?STM32G4xx实战案例解析 当工程师需要在物理硬件上验证控制算法时,硬件在环(HIL)仿真技术提供了完美的解决方案。本文将带您深入探索如何利用STM32CubeMX与MATLAB 2023B的协同工作&#…

作者头像 李华
网站建设 2026/4/18 2:07:55

VCF 5.2.2 非生产环境优化:vSAN ESA HCL 检查绕过实操教程

在部署 VMware Cloud Foundation(VCF)5.x 版本时,若选择 vSAN 快速存储架构(ESA)作为主存储,系统会强制进行硬件兼容性列表(HCL)校验,非认证硬件将直接阻断部署。这一机制虽能保障生产环境稳定,但在实验室测试、POC 验证等非生产场…

作者头像 李华
网站建设 2026/4/17 20:28:19

基于Three.js与Vue3的WebGL BIM模型查看器开发实战

1. 为什么选择Three.jsVue3开发BIM查看器 最近在做一个建筑行业的项目时,客户要求能在网页端直接查看BIM模型,并且要支持基本的测量功能。经过技术选型,最终选择了Three.jsVue3的方案,这里分享一下我的实战经验。 Three.js作为最流…

作者头像 李华
网站建设 2026/4/17 16:30:00

ROFL播放器终极指南:轻松查看和分析英雄联盟回放文件

ROFL播放器终极指南:轻松查看和分析英雄联盟回放文件 【免费下载链接】ROFL-Player (No longer supported) One stop shop utility for viewing League of Legends replays! 项目地址: https://gitcode.com/gh_mirrors/ro/ROFL-Player 还在为英雄联盟回放文件…

作者头像 李华