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