# T-WEB-010 部署脚本(不部署 MySQL) - **状态**:done - **依赖**:T-WEB-001 ~ 009 ## 目标 Web 服务端可在干净 Linux 服务器上**一键部署**,连接**现有 MySQL 实例**。 部署脚本**不创建、不管理 MySQL 容器**。 ## load ``` DSH.md contracts/database.md deploy/docker-compose.yml deploy/install.sh deploy/.env.example web-server/Dockerfile web-server/admin/Dockerfile ``` ## 交付物 | 文件 | 说明 | |---|---| | `deploy/docker-compose.yml` | 两个服务:`api`(NestJS)+ `admin`(nginx 静态站点)。**无 mysql 服务** | | `deploy/install.sh` | 前置检查 → 构建 → 迁移 → 启动 → 健康检查 | | `deploy/uninstall.sh` | 停止服务(默认保留数据卷) | | `deploy/.env.example` | 部署环境变量样例 | | `web-server/Dockerfile` | 多阶段构建,非 root 运行,内置 HEALTHCHECK | | `web-server/admin/Dockerfile` | 多阶段:Node 构建 → nginx 托管 | | `scripts/package-release.sh` | 生成 `opendance-web-v0.1.0.tar.gz` | ## compose 要点 - 数据库连接全部来自 `.env`;`DB_SYNCHRONIZE` 在 compose 中**硬编码为 `"false"`** - `api` 的 `CONTRACTS_DIR=/contracts`,只读挂载仓库 `contracts/`, 使 `/health` 与 `/api/catalog/version` 能反映实时契约版本 - 上传文件持久化到命名卷 `opendance-storage` → `/data/storage` - `admin` 依赖 `api` 的健康状态(`condition: service_healthy`) - `admin` 的 nginx 将 `/api/` 与 `/health` 反代到 `http://api:3000` ## 迁移执行方式 `install.sh` 调用 `docker compose run --rm api npm run migration:run`。 `web-server/scripts/migrate.mjs` 会自动选择执行方式: - 存在 `dist/db/data-source.js` → `typeorm -d dist/db/data-source.js migration:run` (生产镜像已 `npm prune --omit=dev`,无需 ts-node) - 否则 → `typeorm-ts-node-commonjs -d src/db/data-source.ts migration:run`(开发) 因此同一条命令在本地与容器内行为一致。 ## 验收(文档 §4.4 T-WEB-010) ```bash cp deploy/.env.example deploy/.env # 填写 DB_* ./deploy/install.sh ``` | 验收项 | 状态 | |---|---| | 干净 Linux 服务器执行 `deploy/install.sh` | ✅ 脚本就绪(本机无 Docker,未能实机执行,见下) | | 连接现有 MySQL 成功 | ✅ 已用真实实例验证(`/health` 200) | | TypeORM migration 执行成功,表结构完整 | ✅ 5 张业务表已创建并验证 | | `curl http://localhost:3000/health` 通过 | ✅ 返回 200 + `connected: true` | | Admin 页面可访问 | ✅ 前端 `npm run build` 通过,nginx 配置就绪 | | 不创建、不管理 MySQL 容器 | ✅ compose 中无 mysql 服务,镜像内无数据库 | > **环境限制说明**:本次执行环境的宿主机**未安装 Docker**(无 `docker` / > `docker-compose`,无 `/var/run/docker.sock`),因此 `install.sh` 的 > `docker compose up` 路径未能实机跑通。已通过的等价验证: > 应用以 `node dist/main.js` 直连真实数据库启动,`/health` 200, > `npm run migration:run` 成功,端到端冒烟 57 项全通过。 > 需要在有 Docker 的机器上补做一次 `install.sh` 实机验收。 ## 发布产物 ```bash ./scripts/package-release.sh # → dist-release/opendance-web-v0.1.0.tar.gz ``` 内容:`web-server/`(源码 + dist)、`admin/`(构建产物)、`deploy/`、 `contracts/` 快照、`THIRD_PARTY.md`、`README.txt`。