- 文件上传验证: ModelUploader组件增强、上传API错误处理 - GLTF解析器: 增强节点提取和元数据 - 板材编辑: PanelEditor客户端验证 + panels API服务端验证 - 装配步骤编辑: 修复未使用代码,添加预览按钮 - 装配动画播放: AssemblyPlayer步骤导航边界检查优化 - 分享链接: 完整CRUD API(创建、获取、删除),含验证和过期检查 跳过可选测试任务以加快MVP开发
102 lines
3.1 KiB
Bash
102 lines
3.1 KiB
Bash
#!/bin/bash
|
||
|
||
# ============================================
|
||
# 系统恢复脚本 (Linux/Mac)
|
||
# ============================================
|
||
# 功能:
|
||
# - 从指定的完整备份目录恢复数据库和文件存储
|
||
# - 恢复前先执行一次完整备份作为 "before-restore" 快照
|
||
# 使用:
|
||
# ./scripts/restore.sh <完整备份目录>
|
||
# 示例:
|
||
# ./scripts/restore.sh ./backups/full/20251218-120000
|
||
# ============================================
|
||
|
||
set -e
|
||
|
||
if [ -z "$1" ]; then
|
||
echo "用法: $0 <完整备份目录>"
|
||
exit 1
|
||
fi
|
||
|
||
BACKUP_DIR="$1"
|
||
DB_BACKUP_DIR="${BACKUP_DIR}/database"
|
||
FILES_BACKUP_DIR="${BACKUP_DIR}/files"
|
||
|
||
if [ ! -d "$DB_BACKUP_DIR" ] || [ ! -d "$FILES_BACKUP_DIR" ]; then
|
||
echo "错误:${BACKUP_DIR} 下未找到 database/ 或 files/ 子目录。"
|
||
exit 1
|
||
fi
|
||
|
||
echo "========================================"
|
||
echo " 系统恢复脚本"
|
||
echo "========================================"
|
||
echo "目标备份目录: ${BACKUP_DIR}"
|
||
echo "警告:该操作会覆盖当前数据库和文件存储,请确保在测试环境中执行。"
|
||
echo "========================================"
|
||
read -p "确认继续恢复?(yes/[no]): " CONFIRM
|
||
|
||
if [ "$CONFIRM" != "yes" ]; then
|
||
echo "已取消恢复操作。"
|
||
exit 0
|
||
fi
|
||
|
||
# 0. 恢复前先做一次完整备份
|
||
echo "\n[步骤 0] 恢复前备份当前系统..."
|
||
./scripts/backup-all.sh "./backups/before-restore" || echo "恢复前备份失败(已记录),继续尝试恢复..."
|
||
|
||
# 1. 恢复数据库
|
||
echo "\n[步骤 1] 恢复数据库..."
|
||
|
||
# 加载当前 .env 中的 DATABASE_URL
|
||
if [ -f .env ]; then
|
||
export $(cat .env | grep -v '^#' | xargs)
|
||
fi
|
||
|
||
if [ -z "$DATABASE_URL" ]; then
|
||
echo "错误:未在当前环境或 .env 中找到 DATABASE_URL,无法恢复数据库。"
|
||
exit 1
|
||
fi
|
||
|
||
LATEST_DB_BACKUP="$(ls -1 "${DB_BACKUP_DIR}"/db-backup-*.sql.gz 2>/dev/null | head -n 1)"
|
||
if [ -z "$LATEST_DB_BACKUP" ]; then
|
||
echo "错误:在 ${DB_BACKUP_DIR} 下未找到 db-backup-*.sql.gz 文件。"
|
||
exit 1
|
||
fi
|
||
|
||
echo "使用备份文件: ${LATEST_DB_BACKUP}"
|
||
|
||
gunzip -c "$LATEST_DB_BACKUP" | psql "$DATABASE_URL"
|
||
|
||
echo "数据库恢复完成。"
|
||
|
||
# 2. 恢复文件存储 (MinIO)
|
||
echo "\n[步骤 2] 恢复文件存储 (MinIO)..."
|
||
|
||
LATEST_FILES_BACKUP="$(ls -1 "${FILES_BACKUP_DIR}"/files-backup-*.tar.gz 2>/dev/null | head -n 1)"
|
||
if [ -z "$LATEST_FILES_BACKUP" ]; then
|
||
echo "错误:在 ${FILES_BACKUP_DIR} 下未找到 files-backup-*.tar.gz 文件。"
|
||
exit 1
|
||
fi
|
||
|
||
echo "使用备份文件: ${LATEST_FILES_BACKUP}"
|
||
|
||
# 目标 MinIO 数据目录(与备份脚本使用的默认值一致)
|
||
MINIO_DATA_DIR="${MINIO_DATA_DIR:-./minio-data}"
|
||
mkdir -p "$MINIO_DATA_DIR"
|
||
|
||
echo "清空当前 MinIO 数据目录: ${MINIO_DATA_DIR}"
|
||
rm -rf "${MINIO_DATA_DIR:?}"/*
|
||
|
||
tar -xzf "$LATEST_FILES_BACKUP" -C "$(dirname "$MINIO_DATA_DIR")"
|
||
|
||
echo "文件存储恢复完成。"
|
||
|
||
echo "\n========================================"
|
||
echo " 🎉 系统恢复完成 (基础版本)"
|
||
echo "========================================"
|
||
echo "来源备份: ${BACKUP_DIR}"
|
||
echo "恢复前快照目录: ./backups/before-restore"
|
||
echo "========================================"
|
||
echo ""
|