1. 问题背景与核心痛点
禅道作为国内广泛使用的开源项目管理工具,其开源版本在长期运行后往往会遇到一个棘手问题——数据目录(zentao/data/)空间无限膨胀。这个问题我在为三家不同规模企业部署禅道时都遇到过,最严重的一个案例是2TB的服务器磁盘在8个月内被完全占满。
经过排查发现,主要膨胀源来自三个目录:
- /tmp/ 存放临时文件
- /file/ 存储上传附件
- /log/ 系统运行日志
这些目录缺乏自动清理机制,特别是/file/下的版本附件会随着项目迭代不断累积。当磁盘使用率达到95%以上时,禅道会出现附件上传失败、备份中断甚至服务崩溃等问题,直接影响团队协作效率。
2. 清理方案设计思路
2.1 常规清理方式的缺陷
手动清理虽然简单直接,但存在明显弊端:
- 需要专人定期登录服务器操作
- 清理时机依赖人工判断
- 存在误删关键文件的风险
- 无法形成可持续的维护机制
2.2 自动化方案的核心要素
一个生产级的自动清理方案需要包含:
- 安全边界:明确哪些文件可删(如超过30天的日志)、哪些需保留(最近项目附件)
- 触发机制:采用定时任务而非持续监控,降低系统负载
- 执行控制:设置单次清理上限,避免突发IO压力
- 状态反馈:清理结果需要记录并可追溯
- 熔断保护:当磁盘使用率正常时自动跳过清理
3. 脚本实现详解
3.1 基础环境准备
bash复制#!/bin/bash
# 定义禅道安装目录(根据实际安装路径修改)
ZENTAO_HOME="/opt/zbox/app/zentao"
# 设置各目录保留天数
LOG_KEEP_DAYS=30
TMP_KEEP_DAYS=7
FILE_KEEP_DAYS=180
重要提示:务必先通过
df -h确认禅道数据目录所在磁盘分区,避免误操作其他磁盘
3.2 核心清理逻辑
bash复制# 日志目录清理(按修改时间过滤)
find "${ZENTAO_HOME}/log/" -type f -mtime +${LOG_KEEP_DAYS} -exec rm -f {} \;
# 临时文件清理(排除session文件)
find "${ZENTAO_HOME}/tmp/" -not -name 'sess_*' -type f -mtime +${TMP_KEEP_DAYS} -exec rm -f {} \;
# 附件清理(保留最近半年的项目文件)
find "${ZENTAO_HOME}/file/" -type f -mtime +${FILE_KEEP_DAYS} -exec rm -f {} \;
3.3 安全增强措施
bash复制# 磁盘使用率检查(仅当使用率>80%时执行清理)
DISK_USAGE=$(df -h ${ZENTAO_HOME} | awk 'NR==2 {print $5}' | tr -d '%')
if [ ${DISK_USAGE} -lt 80 ]; then
echo "$(date) - Disk usage ${DISK_USAGE}% < 80%, skip cleaning." >> /var/log/zentao_clean.log
exit 0
fi
# 单次清理文件数限制(防止突发IO)
MAX_CLEAN_FILES=1000
find ... | head -n ${MAX_CLEAN_FILES} | xargs rm -f
4. 生产环境部署方案
4.1 定时任务配置
通过crontab设置每周日凌晨3点执行(低峰期):
bash复制# 编辑定时任务
crontab -e
# 添加如下内容(注意替换脚本实际路径)
0 3 * * 0 /opt/scripts/zentao_clean.sh >> /var/log/zentao_clean.log 2>&1
4.2 权限控制建议
- 创建专用系统账号:
bash复制useradd -r -s /bin/false zentaoclean chown -R zentaoclean:zentaoclean /opt/scripts/zentao_clean.sh chmod 750 /opt/scripts/zentao_clean.sh - 设置sudo权限(如需要):
code复制zentaoclean ALL=(root) NOPASSWD: /bin/find, /bin/rm
5. 监控与异常处理
5.1 清理效果验证
在脚本末尾添加统计代码:
bash复制# 计算释放空间大小
FREED_SPACE=$(du -sh ${ZENTAO_HOME}/{log,tmp,file} | awk '{sum+=$1} END {print sum}')
echo "$(date) - Clean completed. Freed space: ${FREED_SPACE}" >> /var/log/zentao_clean.log
5.2 异常场景处理
- 文件被占用:添加
-exec rm -f {} +替代单文件删除,减少IO操作 - 路径不存在:增加目录存在性检查:
bash复制[ -d "${ZENTAO_HOME}/log" ] || { echo "Log directory missing"; exit 1; } - 权限不足:在脚本开头添加
set -euo pipefail快速失败
6. 进阶优化方向
对于超大型禅道实例(50GB+附件),建议:
- 分目录清理:将/file/按年份分目录存储,按目录整体删除
- 动态保留策略:根据磁盘剩余空间自动调整保留天数
- 邮件通知:集成mailx发送清理报告
- 数据库联动:清理附件后同步更新数据库记录(需谨慎)
我在实际运维中发现,配合定期数据库优化(OPTIMIZE TABLE)可使整体存储效率提升40%以上。对于使用Docker部署的环境,还需要特别注意容器内外的路径映射问题。
