196 lines
3.9 KiB
Bash
196 lines
3.9 KiB
Bash
|
|
#!/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"
|