#!/usr/bin/env bash # clean.sh — 清理本次私有化部署,恢复到全新状态,供重新 deploy.sh 使用 # # 操作: # 1. 停止并删除所有 Compose 容器及网络 # 2. 删除 deploy.sh 生成的所有配置文件 # 3. 清空 data/ 数据目录(MySQL / Redis / uploads / update),保留 .gitkeep # 4. 清除部署状态文件和日志 set -euo pipefail ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" cd "$ROOT_DIR" ok() { printf ' \033[32m✓\033[0m %s\n' "$*"; } info() { printf ' \033[1;36m→\033[0m %s\n' "$*"; } warn() { printf ' \033[33m⚠\033[0m %s\n' "$*"; } printf '\n\033[1;31m══════════════════════════════════════════════════\033[0m\n' printf '\033[1;31m XuqmGroup 私有化部署清理脚本\033[0m\n' printf '\033[1;31m══════════════════════════════════════════════════\033[0m\n' printf ' 目录: %s\n\n' "$ROOT_DIR" printf ' \033[33m警告:此操作将删除所有容器、配置和数据,不可恢复!\033[0m\n' read -rp " 确认清理?输入 yes 继续: " _confirm [ "$_confirm" = "yes" ] || { printf ' 已取消\n'; exit 0; } # --------------------------------------------------------------------------- # 1. 停止并删除 Compose 容器、网络 # --------------------------------------------------------------------------- printf '\n [1/4] 停止容器并删除网络...\n' _compose_down() { local f="$1"; shift if [ -f "$f" ]; then docker compose -f "$f" "$@" down --remove-orphans --timeout 15 2>/dev/null && true fi } # 先尝试带 override,再降级到单文件 if [ -f docker-compose.override.yml ]; then docker compose \ -f docker-compose.infra.yml \ -f docker-compose.yml \ -f docker-compose.override.yml \ down --remove-orphans --timeout 15 2>/dev/null && true else docker compose \ -f docker-compose.infra.yml \ -f docker-compose.yml \ down --remove-orphans --timeout 15 2>/dev/null && true fi ok "容器已停止" # --------------------------------------------------------------------------- # 2. 删除 deploy.sh 生成的配置文件 # --------------------------------------------------------------------------- printf '\n [2/4] 删除生成的配置文件...\n' # 顶层生成文件 rm -f .env rm -f docker-compose.override.yml ok ".env、docker-compose.override.yml" # config/ 下的生成文件 rm -f config/secrets.env rm -f config/xuqm.env rm -f config/tenant/bootstrap.env rm -f config/nginx/conf.d/xuqm.conf rm -f config/sdk/xuqm-private-sdk.json rm -f config/docs/docs-runtime.json ok "config/secrets.env、xuqm.env、bootstrap.env、nginx conf、sdk json" # vendors / mail 中由 deploy.sh 写入的文件(保留 .example 模板) # deploy.sh 用 cat > 覆盖写入,清理后让脚本重新生成 rm -f config/vendors/push.env rm -f config/vendors/store-submit.env rm -f config/mail/smtp.env ok "config/vendors/*.env、config/mail/smtp.env" # --------------------------------------------------------------------------- # 3. 清空数据目录(保留 .gitkeep) # --------------------------------------------------------------------------- printf '\n [3/4] 清空 data/ 数据目录...\n' _clean_dir() { local dir="$1" if [ -d "$dir" ]; then find "$dir" -mindepth 1 ! -name '.gitkeep' -exec rm -rf {} + 2>/dev/null && true ok "$dir" else warn "$dir 不存在,跳过" fi } _clean_dir data/mysql _clean_dir data/redis _clean_dir data/uploads _clean_dir data/update _clean_dir data/backups # --------------------------------------------------------------------------- # 4. 清除状态文件和日志 # --------------------------------------------------------------------------- printf '\n [4/4] 清除部署状态和日志...\n' if [ -d .deploy-state ]; then rm -rf .deploy-state ok ".deploy-state/" fi if [ -f logs/audit.log ]; then rm -f logs/audit.log ok "logs/audit.log" fi # --------------------------------------------------------------------------- # 完成 # --------------------------------------------------------------------------- printf '\n\033[1;32m══════════════════════════════════════════════════\033[0m\n' printf '\033[1;32m 清理完成!\033[0m\n' printf '\033[1;32m══════════════════════════════════════════════════\033[0m\n' printf ' 现在可以重新运行一键部署:\n' printf '\n bash scripts/deploy.sh\n\n'