WuYongJie 5821d73291 初始提交:3D家具安装展示系统
包含:
- furniture-3d-system:Next.js 16 全栈应用(资产中心、产品管理、3D装配动画)
- autocad-plugin:AutoCAD 家具导出插件源码
- 资产中心改造:编辑弹窗化、删除功能、Toast反馈、自定义Select组件

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-02 14:00:19 +08:00

126 lines
3.5 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
# ============================================
# 完整系统备份脚本 (Linux/Mac)
# ============================================
# 功能:
# - 备份 PostgreSQL 数据库
# - 备份 MinIO 文件存储
# - 备份关键配置文件 (.env, docker-compose*.yml, prisma/schema.prisma)
# - 生成本次完整备份的清单 (manifest)
# - 自动清理过期备份(默认保留 7 天)
# 使用:
# ./scripts/backup-all.sh [备份根目录] [保留天数]
# 默认为 ./backups/full,保留 7 天
# ============================================
set -e
BACKUP_ROOT="${1:-./backups/full}"
RETENTION_DAYS="${2:-7}"
TIMESTAMP="$(date +%Y%m%d-%H%M%S)"
BACKUP_DIR="${BACKUP_ROOT}/${TIMESTAMP}"
# 创建目录结构
mkdir -p "${BACKUP_DIR}/database" "${BACKUP_DIR}/files" "${BACKUP_DIR}/config"
echo "========================================"
echo " 完整系统备份脚本"
echo "========================================"
echo "备份根目录: ${BACKUP_ROOT}"
echo "本次备份目录: ${BACKUP_DIR}"
echo ""
# 1. 备份数据库
./scripts/backup-db.sh "${BACKUP_DIR}/database"
# 2. 备份文件存储 (MinIO)
./scripts/backup-files.sh "${BACKUP_DIR}/files"
# 3. 备份关键配置文件
CONFIG_TARGET="${BACKUP_DIR}/config"
if [ -f .env ]; then
cp .env "${CONFIG_TARGET}/.env" || true
fi
# 复制 docker-compose 配置
cp docker-compose*.yml "${CONFIG_TARGET}" 2>/dev/null || true
# 复制 Prisma schema
if [ -f prisma/schema.prisma ]; then
mkdir -p "${CONFIG_TARGET}/prisma"
cp prisma/schema.prisma "${CONFIG_TARGET}/prisma/schema.prisma" || true
fi
# 4. 生成简单清单文件
MANIFEST_FILE="${BACKUP_DIR}/backup-manifest.json"
DB_BACKUP_FILE="$(ls -1 "${BACKUP_DIR}/database"/db-backup-*.sql.gz 2>/dev/null | head -n 1)"
FILES_BACKUP_FILE="$(ls -1 "${BACKUP_DIR}/files"/files-backup-*.tar.gz 2>/dev/null | head -n 1)"
cat > "${MANIFEST_FILE}" << EOF
{
"timestamp": "$(date -Iseconds)",
"root": "${BACKUP_DIR}",
"components": {
"database": "${DB_BACKUP_FILE##*/}",
"files": "${FILES_BACKUP_FILE##*/}",
"config": [
".env",
"docker-compose*.yml",
"prisma/schema.prisma"
]
}
}
EOF
echo ""
echo "========================================"
echo " 🎉 完整备份完成"
echo "========================================"
echo "备份目录: ${BACKUP_DIR}"
echo "清单文件: ${MANIFEST_FILE}"
echo "========================================"
echo ""
# 5. 清理过期备份
echo "检查过期备份(保留 ${RETENTION_DAYS} 天)..."
DELETED_COUNT=0
if [ -d "${BACKUP_ROOT}" ]; then
CUTOFF_DATE=$(date -d "-${RETENTION_DAYS} days" +%Y%m%d 2>/dev/null || date -v-${RETENTION_DAYS}d +%Y%m%d)
for dir in "${BACKUP_ROOT}"/*/; do
if [ -d "$dir" ]; then
DIR_NAME=$(basename "$dir")
# 提取日期部分 (yyyyMMdd)
DIR_DATE="${DIR_NAME:0:8}"
if [[ "$DIR_DATE" =~ ^[0-9]{8}$ ]] && [ "$DIR_DATE" -lt "$CUTOFF_DATE" ]; then
echo " 删除过期备份: ${DIR_NAME}"
rm -rf "$dir"
DELETED_COUNT=$((DELETED_COUNT + 1))
fi
fi
done
fi
if [ "$DELETED_COUNT" -gt 0 ]; then
echo "已删除 ${DELETED_COUNT} 个过期备份"
else
echo "没有过期备份需要删除"
fi
# 6. 记录备份日志
LOG_DIR="${BACKUP_ROOT}/logs"
mkdir -p "${LOG_DIR}"
LOG_FILE="${LOG_DIR}/backup-log.jsonl"
LOG_ENTRY="{\"timestamp\":\"$(date -Iseconds)\",\"backupDir\":\"${BACKUP_DIR}\",\"retentionDays\":${RETENTION_DAYS},\"deletedBackups\":${DELETED_COUNT},\"status\":\"success\"}"
echo "${LOG_ENTRY}" >> "${LOG_FILE}"
echo ""
echo "备份日志已记录到: ${LOG_FILE}"
echo ""