将路由参数从 `:id` 和 `:key` 格式统一为 `{id}` 和 `{key}` 格式
更新 build.sh 脚本以优先使用实际 .env 文件,并同步更新部署说明文档
104 lines
2.8 KiB
Bash
104 lines
2.8 KiB
Bash
#!/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;若不存在则用 .env.example 作为 .env
|
||
if [[ -f "$ROOT_DIR/.env" ]]; then
|
||
cp "$ROOT_DIR/.env" "$BUNDLE_DIR/backend/.env"
|
||
elif [[ -f "$ROOT_DIR/.env.example" ]]; then
|
||
cp "$ROOT_DIR/.env.example" "$BUNDLE_DIR/backend/.env"
|
||
fi
|
||
|
||
# 生成部署说明
|
||
cat > "$BUNDLE_DIR/README_DEPLOY.md" << 'EOF'
|
||
# 部署说明(前后端打包)
|
||
|
||
## 内容结构
|
||
- backend/: 后端二进制与环境变量
|
||
- qiandao: 后端二进制
|
||
- .env: 环境变量文件(若为空,请复制并编辑)
|
||
- frontend/: 前端静态资源
|
||
- dist/: 生产构建后的静态文件
|
||
|
||
## 运行后端
|
||
```bash
|
||
cd backend
|
||
chmod +x ./qiandao
|
||
# 如需自定义端口或数据库,修改 .env 或以环境变量覆盖:
|
||
# SERVER_ADDR=0.0.0.0:3001 DATABASE_URL=... JWT_SECRET=... ./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、JWT 等。
|
||
|
||
## 注意事项
|
||
- 前端构建后产物在 `frontend/dist`,直接静态托管即可。
|
||
- 后端为单个二进制,无需额外依赖(运行期需 MySQL 服务)。
|
||
- 若需使用 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" |