#!/usr/bin/env bash set -euo pipefail ROOT_DIR="$(cd "$(dirname "$0")"/.. && pwd)" FRONTEND_DIR="$ROOT_DIR/frontend" BACKEND_DIR="$ROOT_DIR" RELEASE_DIR="$ROOT_DIR/release" BUNDLE_DIR="$RELEASE_DIR/qiandao_bundle" TS="$(date +%Y%m%d_%H%M%S)" ARCHIVE_NAME="qiandao_${TS}.tar.gz" echo "==> 清理并准备发布目录" rm -rf "$BUNDLE_DIR" mkdir -p "$BUNDLE_DIR" echo "==> 构建前端 (vite build)" pushd "$FRONTEND_DIR" >/dev/null npm ci npm run build popd >/dev/null echo "==> 构建后端 (cargo build --release)" pushd "$BACKEND_DIR" >/dev/null cargo build --release popd >/dev/null echo "==> 收集构建产物" # 后端二进制 mkdir -p "$BUNDLE_DIR/backend" cp "$BACKEND_DIR/target/release/qiandao" "$BUNDLE_DIR/backend/" # 前端静态文件 mkdir -p "$BUNDLE_DIR/frontend" cp -r "$FRONTEND_DIR/dist" "$BUNDLE_DIR/frontend/" # 环境变量示例(如存在,优先示例文件,否则复制现有 .env) if [[ -f "$ROOT_DIR/.env.example" ]]; then cp "$ROOT_DIR/.env.example" "$BUNDLE_DIR/backend/.env.example" elif [[ -f "$ROOT_DIR/.env" ]]; then cp "$ROOT_DIR/.env" "$BUNDLE_DIR/backend/.env" fi # 生成部署说明 cat > "$BUNDLE_DIR/README_DEPLOY.md" << 'EOF' # 部署说明(前后端打包) ## 内容结构 - backend/: 后端二进制与环境变量 - qiandao: 后端二进制 - .env 或 .env.example: 环境变量文件 - frontend/: 前端静态资源 - dist/: 生产构建后的静态文件 ## 运行后端 ```bash cd backend chmod +x ./qiandao ./qiandao ``` 后端默认监听端口:`3001` ## 运行前端 将 `frontend/dist` 作为静态网站托管(例如 Nginx): ```nginx server { listen 80; server_name your-domain; root /var/www/qiandao/frontend/dist; index index.html; location / { try_files $uri $uri/ /index.html; } # 反向代理后端 API location /api/ { proxy_pass http://127.0.0.1:3001/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } ``` ## 环境变量 将 `.env` 放在 `backend/` 目录或系统环境中。确保配置正确的 MySQL、Redis、JWT 等。 ## 注意事项 - 前端构建后产物在 `frontend/dist`,直接静态托管即可。 - 后端为单个二进制,无需额外依赖(运行期需 MySQL/Redis 服务)。 - 若需使用 Docker,请联系生成生产用 Dockerfile 与 compose。 EOF mkdir -p "$RELEASE_DIR" echo "==> 生成压缩包: $ARCHIVE_NAME" pushd "$RELEASE_DIR" >/dev/null tar -czf "$ARCHIVE_NAME" "$(basename "$BUNDLE_DIR")" popd >/dev/null echo "==> 打包完成" echo "包路径: $RELEASE_DIR/$ARCHIVE_NAME" echo "内容目录: $BUNDLE_DIR"