#!/bin/bash # 部署打包脚本 (Linux/Mac) # 使用方法: # ./build-dist.sh # 多端口模式(默认) # ./build-dist.sh --single-port # 单端口模式 set -e DIST_DIR="deploy-dist" SINGLE_PORT=false # 解析参数 while [[ "$#" -gt 0 ]]; do case $1 in --single-port) SINGLE_PORT=true ;; *) echo "未知参数: $1"; exit 1 ;; esac shift done echo "=== 构建部署包 ===" if [ "$SINGLE_PORT" = true ]; then echo "模式: 单端口模式(8080→80)" else echo "模式: 多端口模式(8888+9000-9100)" fi # 1. 清理旧的部署目录 if [ -d "$DIST_DIR" ]; then echo "清理旧的部署目录..." rm -rf "$DIST_DIR" fi # 2. 创建目录结构 echo "创建目录结构..." mkdir -p "$DIST_DIR/server" mkdir -p "$DIST_DIR/client/dist" mkdir -p "$DIST_DIR/data" mkdir -p "$DIST_DIR/projects" mkdir -p "$DIST_DIR/nginx/sites-enabled" mkdir -p "$DIST_DIR/deploy" # 3. 安装后端依赖 echo "安装后端依赖..." npm install --production # 4. 构建前端 echo "构建前端..." cd client npm install npm run build cd .. # 5. 复制文件 echo "复制文件..." # 后端代码 cp -r server/* "$DIST_DIR/server/" # 前端构建产物 cp -r client/dist/* "$DIST_DIR/client/dist/" # 配置文件 cp package.json "$DIST_DIR/" cp package-lock.json "$DIST_DIR/" cp .env.example "$DIST_DIR/" # Docker文件 cp deploy/start.sh "$DIST_DIR/deploy/" if [ "$SINGLE_PORT" = true ]; then # 单端口模式 cp deploy/Dockerfile.single "$DIST_DIR/Dockerfile" cp deploy/docker-compose.single.yml "$DIST_DIR/docker-compose.yml" else # 多端口模式 cp deploy/Dockerfile "$DIST_DIR/Dockerfile" cp deploy/docker-compose.yml "$DIST_DIR/docker-compose.yml" fi # 6. 创建 .env 文件 echo "创建 .env 文件..." if [ "$SINGLE_PORT" = true ]; then cat > "$DIST_DIR/.env" << 'EOF' # 服务端口(容器内部) PORT=8888 # 基础域名(修改为您的域名) BASE_DOMAIN= # 项目端口范围 PROJECT_PORT_START=9000 PROJECT_PORT_END=9100 # 单端口模式:项目绑定到127.0.0.1(容器内Nginx代理) PROJECT_BIND_ADDRESS=127.0.0.1 # 启用内置Nginx USE_NGINX=true EOF else cat > "$DIST_DIR/.env" << 'EOF' # 服务端口 PORT=8888 # 基础域名(修改为您的域名) BASE_DOMAIN= # 项目端口范围 PROJECT_PORT_START=9000 PROJECT_PORT_END=9100 # 多端口模式:绑定到0.0.0.0(宿主机可访问) PROJECT_BIND_ADDRESS=0.0.0.0 # 禁用内置Nginx(使用宿主机Nginx) USE_NGINX=false EOF fi # 7. 创建启动说明 if [ "$SINGLE_PORT" = true ]; then PORT_INFO="- 8080: 管理后台和所有项目(通过路径区分)" ACCESS_URL="http://demo.example.com/" else PORT_INFO="- 8888: 管理后台 - 9000-9009: 项目端口" ACCESS_URL="http://your-server-ip:8888" fi cat > "$DIST_DIR/README.md" << EOF # 部署说明 ## 模式: $(if [ "$SINGLE_PORT" = true ]; then echo "单端口模式"; else echo "多端口模式"; fi) ## 快速启动 1. 修改 .env 文件中的 BASE_DOMAIN 为您的域名 2. 启动容器: docker-compose up -d 3. 访问管理后台: $ACCESS_URL ## 默认账号 - 用户名: admin - 密码: admin123 ## 端口说明 $PORT_INFO ## 常用命令 # 查看日志 docker-compose logs -f # 重启服务 docker-compose restart # 停止服务 docker-compose down # 更新部署 docker-compose down docker-compose build docker-compose up -d EOF # 8. 打包 echo "打包..." TIMESTAMP=$(date +%Y%m%d_%H%M%S) if [ "$SINGLE_PORT" = true ]; then MODE_SUFFIX="-single" else MODE_SUFFIX="-multi" fi ZIP_FILE="auto-deploy-dist$MODE_SUFFIX-$TIMESTAMP.tar.gz" tar -czvf "$ZIP_FILE" -C "$DIST_DIR" . echo "" echo "=== 构建完成 ===" if [ "$SINGLE_PORT" = true ]; then echo "模式: 单端口(8080→80)" else echo "模式: 多端口(8888+9000-9100)" fi echo "部署包: $ZIP_FILE" echo "部署目录: $DIST_DIR" echo "" echo "上传到服务器后执行:" echo " tar -xzvf $ZIP_FILE" echo " docker-compose up -d"