diff --git a/project.yaml b/project.yaml index b9e7260..52eef43 100644 --- a/project.yaml +++ b/project.yaml @@ -65,7 +65,7 @@ deliverable: includes: - web-server/ # NestJS 源码 + 构建产物 - admin/ # React 管理端构建产物 - - deploy/ # docker-compose.yml / install.sh / .env.example + - deploy/ # install.sh / nginx / systemd / .env.example - contracts/ # 当前版本契约快照 - THIRD_PARTY.md # 开源声明 - README.txt # 使用说明 diff --git a/web-server/admin/README.md b/web-server/admin/README.md index a14c061..386b0e2 100644 --- a/web-server/admin/README.md +++ b/web-server/admin/README.md @@ -61,18 +61,24 @@ npm run build # 产物在 dist/ `vite.config.ts` 使用 `base: './'`,产物使用相对路径引用,可挂在任意子路径下。 -Docker(多阶段构建,产物由 nginx 托管): +**生产部署(Linux 原生站点,不使用 Docker)** + +构建产物 `dist/` 由同一站点的 nginx 直接托管,API 由 nginx 反向代理到本机 Node 进程。 +整个过程由仓库根目录的 `deploy/install.sh` 一键完成: ```bash -docker build -t opendance-admin . -docker run --rm -p 8080:80 opendance-admin +# 仓库根目录 +sudo bash deploy/install.sh ``` -- `Dockerfile`:stage 1 `node:22-alpine` 执行 `npm ci || npm install` + `npm run build`; - stage 2 `nginx:alpine` 拷贝 `dist` 到 `/usr/share/nginx/html` 与 `nginx.conf`。 -- `nginx.conf`:`try_files $uri $uri/ /index.html` 支持 SPA 路由, - 并把 `/api/` 与 `/health` 反向代理到 `http://api:3000`(Docker 网络内的服务名)。 - 部署时请确保管理端容器与服务端容器在同一 network,或把 `api` 换成实际主机名。 +对应的 nginx 站点配置见 `deploy/nginx/opendance.conf`: + +- `root` 指向安装后的 `admin/` 目录,`try_files $uri $uri/ /index.html` 支持 SPA 路由; +- `/api/`、`/health`、`/static/` 反向代理到 `127.0.0.1:3000`(Node 只监听回环); +- `client_max_body_size 512m` 与后端 `UPLOAD_MAX_BYTES` 保持一致。 + +本目录下的 `nginx.conf` 仅用于「把管理端单独托管到另一个 nginx 实例」的场景, +其中的 `proxy_pass http://api:3000` 需要按实际情况改成后端地址。 ## 目录结构 diff --git a/web-server/src/config/contract-versions.ts b/web-server/src/config/contract-versions.ts index 90ef4b5..6c45cd2 100644 --- a/web-server/src/config/contract-versions.ts +++ b/web-server/src/config/contract-versions.ts @@ -4,7 +4,9 @@ import { join } from 'node:path'; /** * 编译进代码的契约版本常量。 * 与 `contracts/VERSION` 必须一致;`npm run contracts:check` 在构建前校验。 - * 之所以编译进代码:Docker 构建上下文是 web-server/,contracts/ 不在其中。 + * 之所以编译进代码:这是运行时读不到 contracts/VERSION 时的兜底值 + * (原生部署会通过 CONTRACTS_DIR 指向安装目录下的 contracts/, + * 未设置该变量时回落到这里的常量)。 */ export const CONTRACT_VERSIONS: Readonly> = Object.freeze({ 'rest-api': '0.1.0',