diff --git a/deploy.sh b/deploy.sh index a4369ad..27712fe 100755 --- a/deploy.sh +++ b/deploy.sh @@ -301,6 +301,60 @@ verify_master_key() { return 1 } +# ---------- 适配器备份保留策略 ---------- +# 每次部署都新建一个 adapters.bak.<时间戳> 目录,而回滚只用到最近一次 +# ($BACKUP_BIN / $BACKUP_CONFIG 都是单文件覆盖)。多出来的目录从没人清理, +# 实测线上已积累 71 个,/etc/llmsproxy 因此涨到 122M。 +# +# 保留最近 KEEP_ADAPTER_BACKUPS 份足够回滚,同时给目录数设上限——否则 +# 一次误配置(比如 adapter_dir 指错)就可能在几秒内造出成百上千个目录。 +# 只删名字严格匹配 adapters.bak.<14位时间戳> 的目录,避免误伤人工放的目录。 +KEEP_ADAPTER_BACKUPS=5 + +prune_adapter_backups() { + local base="/etc/llmsproxy" + [[ -d "$base" ]] || return 0 + + # 先按数量上限硬裁:即使时间戳排序失效也不会无上限增长。 + local all + mapfile -t all < <(find "$base" -maxdepth 1 -type d -name 'adapters.bak.*' -printf '%f\n' | sort) + local cap=$((KEEP_ADAPTER_BACKUPS * 4)) + if (( ${#all[@]} > cap )); then + warn "适配器备份目录有 ${#all[@]} 个(异常),裁到 $cap" + local i=0 + for d in "${all[@]}"; do + i=$((i + 1)) + # 从最旧的开始删(sort 后升序)。名字不规范的跳过不删。 + if (( i <= ${#all[@]} - cap )); then + if [[ "$d" =~ ^adapters\.bak\.[0-9]{14}$ ]]; then + rm -rf "${base:?}/$d" + else + warn "跳过名字不规范的备份目录(不删): $d" + fi + fi + done + mapfile -t all < <(find "$base" -maxdepth 1 -type d -name 'adapters.bak.*' -printf '%f\n' | sort) + fi + + # 再按时间保留最近 KEEP_ADAPTER_BACKUPS 份(sort 后最新在末尾)。 + local total=${#all[@]} i=0 + for d in "${all[@]}"; do + i=$((i + 1)) + # i <= total-KEEP 的是较旧的,要删。 + if (( i <= total - KEEP_ADAPTER_BACKUPS )); then + if [[ "$d" =~ ^adapters\.bak\.[0-9]{14}$ ]]; then + rm -rf "${base:?}/$d" + else + warn "跳过名字不规范的备份目录(不删): $d" + fi + fi + done + + local left + left=$(find "$base" -maxdepth 1 -type d -name 'adapters.bak.*' | wc -l) + log " 适配器备份保留最近 $KEEP_ADAPTER_BACKUPS 份(当前剩 $left 个)" +} + # ---------- 同步适配器 ---------- sync_adapters() { log "同步适配器" @@ -318,6 +372,7 @@ sync_adapters() { cp -rf "$TARGET_ADAPTERS/"*.lua "$BACKUP_DIR/" 2>/dev/null || true log " 旧适配器已备份到 $BACKUP_DIR" fi + prune_adapter_backups cp -f "$SRC_ADAPTERS/"*.lua "$TARGET_ADAPTERS/" chmod 0644 "$TARGET_ADAPTERS/"*.lua