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

3.3 KiB
Raw Blame History

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)

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 实机验收。

发布产物

./scripts/package-release.sh
# → dist-release/opendance-web-v0.1.0.tar.gz

内容:web-server/(源码 + dist)、admin/(构建产物)、deploy/、 contracts/ 快照、THIRD_PARTY.md、README.txt。