auto-deploy-demo/build-dist.sh

196 lines
3.9 KiB
Bash
Raw Normal View History

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