This commit is contained in:
2025-10-23 00:22:43 +08:00
parent 0881d3fbcb
commit d67ab615ce
34 changed files with 9442 additions and 1 deletions

102
scripts/build.sh Normal file
View File

@ -0,0 +1,102 @@
#!/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"