Files
qiandao/scripts/build.sh
2025-10-23 00:22:43 +08:00

102 lines
2.7 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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