- 完整实现Apple HIG 2025设计系统 - 添加Modal弹窗组件(毛玻璃效果、流畅动画) - 添加FileUpload文件上传组件(拖拽、批量上传、进度显示) - 实现产品上传功能(支持DWG/GLB/GLTF文件) - 优化产品列表展示(可折叠的产品+SKU结构) - 实现Tab切换功能(3D模型管理、五金件、BOM、文档) - 修复主题系统hydration错误 - 优化按钮和间距,符合Apple设计规范 - 添加分享页面的Apple风格重设计 - 创建测试数据脚本
211 lines
5.3 KiB
Bash
211 lines
5.3 KiB
Bash
#!/bin/bash
|
||
|
||
# 3D 家具安装展示系统 - 本地部署脚本
|
||
# 适用于: Linux / NAS (群晖/威联通)
|
||
#
|
||
# 使用方法:
|
||
# chmod +x scripts/deploy.sh
|
||
# ./scripts/deploy.sh
|
||
|
||
set -e
|
||
|
||
# 颜色输出
|
||
RED='\033[0;31m'
|
||
GREEN='\033[0;32m'
|
||
YELLOW='\033[1;33m'
|
||
BLUE='\033[0;34m'
|
||
NC='\033[0m' # No Color
|
||
|
||
# 打印带颜色的消息
|
||
print_info() {
|
||
echo -e "${BLUE}[INFO]${NC} $1"
|
||
}
|
||
|
||
print_success() {
|
||
echo -e "${GREEN}[SUCCESS]${NC} $1"
|
||
}
|
||
|
||
print_warning() {
|
||
echo -e "${YELLOW}[WARNING]${NC} $1"
|
||
}
|
||
|
||
print_error() {
|
||
echo -e "${RED}[ERROR]${NC} $1"
|
||
}
|
||
|
||
# 打印欢迎信息
|
||
print_welcome() {
|
||
echo ""
|
||
echo "=========================================="
|
||
echo " 3D 家具安装展示系统"
|
||
echo " 自动部署脚本 v1.0"
|
||
echo "=========================================="
|
||
echo ""
|
||
}
|
||
|
||
# 检查系统要求
|
||
check_requirements() {
|
||
print_info "检查系统要求..."
|
||
|
||
# 检查 Docker
|
||
if ! command -v docker &> /dev/null; then
|
||
print_error "Docker 未安装,请先安装 Docker"
|
||
exit 1
|
||
fi
|
||
print_success "Docker 已安装: $(docker --version)"
|
||
|
||
# 检查 Docker Compose
|
||
if ! command -v docker-compose &> /dev/null; then
|
||
print_error "Docker Compose 未安装,请先安装 Docker Compose"
|
||
exit 1
|
||
fi
|
||
print_success "Docker Compose 已安装: $(docker-compose --version)"
|
||
|
||
# 检查 Docker 是否运行
|
||
if ! docker info &> /dev/null; then
|
||
print_error "Docker 服务未运行,请启动 Docker"
|
||
exit 1
|
||
fi
|
||
print_success "Docker 服务运行正常"
|
||
}
|
||
|
||
# 检测硬件配置
|
||
detect_hardware() {
|
||
print_info "检测硬件配置..."
|
||
|
||
# 检测内存 (GB)
|
||
TOTAL_MEM=$(free -g | awk '/^Mem:/{print $2}')
|
||
print_info "总内存: ${TOTAL_MEM}GB"
|
||
|
||
# 检测 CPU 核心数
|
||
CPU_CORES=$(nproc)
|
||
print_info "CPU 核心数: ${CPU_CORES}"
|
||
|
||
# 检测磁盘空间 (GB)
|
||
DISK_AVAIL=$(df -BG / | awk 'NR==2 {print $4}' | sed 's/G//')
|
||
print_info "可用磁盘空间: ${DISK_AVAIL}GB"
|
||
|
||
# 推荐部署模式
|
||
if [ "$TOTAL_MEM" -lt 4 ]; then
|
||
print_error "内存不足 4GB,无法部署系统"
|
||
exit 1
|
||
elif [ "$TOTAL_MEM" -lt 8 ]; then
|
||
DEPLOYMENT_MODE="lightweight"
|
||
print_warning "内存为 ${TOTAL_MEM}GB,将使用轻量级模式"
|
||
else
|
||
DEPLOYMENT_MODE="standard"
|
||
print_success "内存充足,将使用标准模式"
|
||
fi
|
||
|
||
if [ "$DISK_AVAIL" -lt 50 ]; then
|
||
print_warning "磁盘可用空间不足 50GB,建议清理磁盘"
|
||
fi
|
||
}
|
||
|
||
# 生成配置文件
|
||
generate_config() {
|
||
print_info "生成配置文件..."
|
||
|
||
# 检查 .env 文件是否存在
|
||
if [ -f ".env" ]; then
|
||
print_warning ".env 文件已存在"
|
||
read -p "是否覆盖现有配置? (y/N): " -n 1 -r
|
||
echo
|
||
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
|
||
print_info "保留现有配置"
|
||
return
|
||
fi
|
||
fi
|
||
|
||
# 复制模板
|
||
cp .env.example .env
|
||
|
||
# 生成随机密码
|
||
ADMIN_PASSWORD=$(openssl rand -base64 16 | tr -d "=+/" | cut -c1-16)
|
||
DB_PASSWORD=$(openssl rand -base64 32 | tr -d "=+/" | cut -c1-32)
|
||
MINIO_PASSWORD=$(openssl rand -base64 32 | tr -d "=+/" | cut -c1-32)
|
||
|
||
# 更新 .env 文件
|
||
sed -i "s/DEPLOYMENT_MODE=.*/DEPLOYMENT_MODE=${DEPLOYMENT_MODE}/" .env
|
||
sed -i "s/ADMIN_PASSWORD=.*/ADMIN_PASSWORD=${ADMIN_PASSWORD}/" .env
|
||
sed -i "s/DB_PASSWORD=.*/DB_PASSWORD=${DB_PASSWORD}/" .env
|
||
sed -i "s/MINIO_PASSWORD=.*/MINIO_PASSWORD=${MINIO_PASSWORD}/" .env
|
||
|
||
print_success "配置文件已生成"
|
||
print_info "管理员密码: ${ADMIN_PASSWORD}"
|
||
print_warning "请妥善保存以上密码!"
|
||
}
|
||
|
||
# 启动服务
|
||
start_services() {
|
||
print_info "启动 Docker 服务..."
|
||
|
||
COMPOSE_FILE="docker-compose.${DEPLOYMENT_MODE}.yml"
|
||
|
||
if [ ! -f "$COMPOSE_FILE" ]; then
|
||
print_error "配置文件 ${COMPOSE_FILE} 不存在"
|
||
exit 1
|
||
fi
|
||
|
||
# 拉取镜像
|
||
print_info "拉取 Docker 镜像..."
|
||
docker-compose -f "$COMPOSE_FILE" pull
|
||
|
||
# 启动服务
|
||
print_info "启动服务..."
|
||
docker-compose -f "$COMPOSE_FILE" up -d
|
||
|
||
print_success "服务已启动"
|
||
}
|
||
|
||
# 等待服务就绪
|
||
wait_for_services() {
|
||
print_info "等待服务就绪..."
|
||
|
||
MAX_WAIT=120
|
||
ELAPSED=0
|
||
|
||
while [ $ELAPSED -lt $MAX_WAIT ]; do
|
||
if docker-compose ps | grep -q "healthy"; then
|
||
print_success "服务已就绪"
|
||
return 0
|
||
fi
|
||
sleep 5
|
||
ELAPSED=$((ELAPSED + 5))
|
||
echo -n "."
|
||
done
|
||
|
||
echo ""
|
||
print_warning "服务启动超时,请检查日志"
|
||
}
|
||
|
||
# 显示访问信息
|
||
show_access_info() {
|
||
echo ""
|
||
echo "=========================================="
|
||
echo " 部署完成!"
|
||
echo "=========================================="
|
||
echo ""
|
||
print_success "访问地址: http://localhost:3000"
|
||
print_success "管理员账号: admin"
|
||
print_info "管理员密码: 请查看上方输出"
|
||
echo ""
|
||
print_info "查看日志: docker-compose -f docker-compose.${DEPLOYMENT_MODE}.yml logs -f"
|
||
print_info "停止服务: docker-compose -f docker-compose.${DEPLOYMENT_MODE}.yml down"
|
||
echo ""
|
||
}
|
||
|
||
# 主函数
|
||
main() {
|
||
print_welcome
|
||
check_requirements
|
||
detect_hardware
|
||
generate_config
|
||
start_services
|
||
wait_for_services
|
||
show_access_info
|
||
}
|
||
|
||
# 运行主函数
|
||
main
|