#!/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