Files
opendance-web/tasks/010-deploy.md
T

88 lines
3.3 KiB
Markdown
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.
# 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`。