#!/usr/bin/env bash # ============================================================ # 蝶雅采购智能体平台 - 每日自动备份脚本 # 打包内容:完整项目源码 + 数据库 # 运行方式:每天早上 8:30 由 cron 自动执行 # ============================================================ set -euo pipefail PROJECT_DIR="$(cd "$(dirname "$0")" && pwd)" BACKUP_DIR="${PROJECT_DIR}/backups" TIMESTAMP=$(date +"%Y%m%d_%H%M") DB_USER="dy_app" DB_PASS="dy_data_2026" DB_NAME="dy_data" # 确保备份目录存在 mkdir -p "$BACKUP_DIR" echo "[$(date '+%Y-%m-%d %H:%M:%S')] 开始备份蝶雅采购智能体平台..." # 1. 导出数据库到项目根目录(解压时直接可见) DB_DUMP="${PROJECT_DIR}/dy_data_${TIMESTAMP}.sql" echo " 导出数据库 → dy_data_${TIMESTAMP}.sql" mysqldump \ -h 127.0.0.1 \ -u "${DB_USER}" \ -p"${DB_PASS}" \ --single-transaction \ --no-tablespaces \ --routines \ --triggers \ --default-character-set=utf8mb4 \ "${DB_NAME}" > "${DB_DUMP}" DB_SIZE=$(du -h "${DB_DUMP}" | cut -f1) echo " 数据库导出完成 (${DB_SIZE})" # 2. 打包整个项目(含数据库导出文件) BACKUP_FILE="${BACKUP_DIR}/dy_platform_backup_${TIMESTAMP}.tar.gz" echo " 打包项目 → dy_platform_backup_${TIMESTAMP}.tar.gz" # 排除不需要打包的目录和文件 tar czf "${BACKUP_FILE}" \ -C "$(dirname "${PROJECT_DIR}")" \ --exclude="dy-dashboard/backups/*.tar.gz" \ --exclude="dy-dashboard/venv" \ --exclude="dy-dashboard/node_modules" \ --exclude="dy-dashboard/__pycache__" \ --exclude="dy-dashboard/*/__pycache__" \ --exclude="dy-dashboard/.git" \ --exclude="dy-dashboard/tmp_csv" \ --exclude="dy-dashboard/logs/*.log" \ --exclude="dy-dashboard/dy_data_v*.sql" \ dy-dashboard # 2.5 独立备份新品图片(部署源图片目录单独保留,便于恢复核对) NEW_IMAGES_BACKUP="${BACKUP_DIR}/new_products_images_${TIMESTAMP}.tar.gz" if [ -d "${PROJECT_DIR}/static/uploads/new_products" ]; then echo " 独立备份新品图片 → ${NEW_IMAGES_BACKUP}" tar czf "${NEW_IMAGES_BACKUP}" -C "${PROJECT_DIR}/static/uploads" new_products fi # 3. 删除临时 SQL 文件(已打包进 tar.gz) rm -f "${DB_DUMP}" BACKUP_SIZE=$(du -h "${BACKUP_FILE}" | cut -f1) echo "[$(date '+%Y-%m-%d %H:%M:%S')] 备份完成!" echo " 文件:${BACKUP_FILE}" echo " 大小:${BACKUP_SIZE}" # 4. 清理 30 天前的旧备份 echo " 清理 30 天前的旧备份..." find "${BACKUP_DIR}" -name "dy_platform_backup_*.tar.gz" -mtime +30 -delete 2>/dev/null || true echo " 完成" exit 0