包含: - furniture-3d-system:Next.js 16 全栈应用(资产中心、产品管理、3D装配动画) - autocad-plugin:AutoCAD 家具导出插件源码 - 资产中心改造:编辑弹窗化、删除功能、Toast反馈、自定义Select组件 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
126 lines
3.5 KiB
Bash
126 lines
3.5 KiB
Bash
#!/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 ""
|