7.6 KiB
7.6 KiB
前端独立部署 + 统一后端入口实施计划
目标:在已经切换到“前端独立部署 + 同域反代”的基础上,进一步取消前端 Nginx 对
/api的路径级分流,改为反代到一个真正的 unified backend,一次性解决长期维护成本。
1. 背景
当前项目已经完成了两项关键演进:
- 前端从历史
static/托管模式中抽离,开始走独立构建与独立部署 - 前端通过同域 Nginx 反代访问后端 API 与分析产物
但当前 Nginx 仍然承担了“后端路由所有权判断”的职责:
- 一部分
/api/...被转发到moldinsight - 另一部分
/api/...被转发到inventory
这虽然能跑通当前功能,但长期存在明显问题:
- 每新增一个 gemold API,Nginx 都要同步改配置
- Nginx 配置承担了业务边界知识,维护成本高
/health只能代表某一套后端,而不是统一入口- 与“unified / gemold-only / inventory-only”三种部署模式的目标不完全一致
因此,本轮改造的目标是:
把前端入口反代逻辑从“按路径分流到两套后端”升级为“统一反代到一个 unified backend”。
2. 目标状态
浏览器视角
浏览器始终只访问一个同域入口:
/→ 前端静态页面/api/*→ unified backend/health→ unified backend/html/*→ unified backend(由 unified backend 再提供 gemold 产物访问)
Nginx 视角
Nginx 不再负责理解 gemold / inventory 的业务边界。
它只做两件事:
- 提供前端静态文件与 SPA fallback
- 把
/api、/health、/html统一转发给一个 backend upstream
后端视角
后端新增一个统一入口,负责组合:
- auth
- moldinsight routes
- inventory routes
/health/html
同时继续保留:
moldinsight-onlyinventory-only
以满足模块独立部署场景。
3. 设计决策
3.1 为什么要引入 unified backend
因为前端与网关层最适合面对的是一个统一后端,而不是两套需要网关手工分流的内部模块。
收益:
- Nginx 配置显著简化
- 新增 API 不需要修改网关规则
- 文档和运维认知更简单
- 前端保持统一
/api契约 - 更符合模块化蓝图中对
unified模式的定义
3.2 为什么不直接把 split 模式删掉
因为:
gemold-only和inventory-only仍然有独立部署价值- 当前仓库已经形成了清晰模块边界
- 统一入口应该成为前端同域反代的默认方案,而不是抹掉模块部署模式
所以最终保留三类入口:
src/entrypoints/unified.pysrc/entrypoints/moldinsight.pysrc/entrypoints/inventory.py
4. 需要改动的核心文件
4.1 新增 unified 入口
新增:
src/entrypoints/unified.py
职责:
- 基于
shared.app_factory.create_app()创建应用 - 统一挂载:
moldinsight.api.router(prefix=/api)inventory.api.inventory_router
- 使用:
mount_html=Trueserve_frontend_static=False
- 不额外挂载 auth(交给
app_factory) - 不手工重复定义
/health
4.2 简化前端 Nginx
修改:
deploy/nginx/frontend.conf
从当前:
- 双 upstream:
moldinsight/inventory - 多个
location /api/...手工分流
改成:
- 单 upstream:例如
gemold_backend_upstream - 统一转发:
/api/→ unified backend/health→ unified backend/html/→ unified backend
保留:
/的 SPA fallback/assets/的静态缓存策略
4.3 调整 Compose
修改:
docker-compose.yml
目标:
- 增加 unified backend 服务
frontend只依赖 unified backend- 保留
moldinsight-celery - 按需保留 split backend 入口作为独立 profile
建议最终 profile 语义:
full:frontend + unified + celeryfrontend:仅前端入口moldinsight:仅 gemold-onlyinventory:仅 inventory-only- (可选)
unified:仅 unified backend
4.4 视实现需要调整 Dockerfile
可能新增:
deploy/Dockerfile.unified
或复用已有:
deploy/Dockerfile.moldinsight
取决于是否希望 unified backend 使用单独镜像名。
统一要求:
- unified backend 镜像必须包含:
src/moldinsight/src/inventory/src/shared/src/entrypoints/unified.py
4.5 文档同步
需要更新:
README.mdfrontend/README.mddocs/deployment/LINUX_SETUP.mddocs/deployment/DEPLOY_PORT.mddocs/deployment/PORT_CONFIG.md
重点改动:
- 当前推荐部署方式改为“frontend + unified backend + celery”
- 说明 split 模式仍保留,但不再是前端同域反代默认方式
- 端口说明中要区分:
- 前端入口端口
- unified backend 内部/对外端口
- gemold-only / inventory-only 模块端口
5. 路由与冲突评估
根据当前代码结构,unified 模式可行,主要原因:
- inventory 所有业务路由都挂在
/api下,并且以独立业务前缀区分 - moldinsight 业务路由同样挂在
/api下,但使用不同子路径 - auth 路由使用
/api/auth - top-level
/health由app_factory提供 - moldinsight 内部还有
/api/health,与 top-level/health不冲突 /html只有 moldinsight 需要
关键约束:
- unified 入口中不要重复 include auth
- unified 入口中不要手工再定义 top-level
/health - unified 入口必须
mount_html=True
6. 风险与控制
风险 1:统一入口与现有 split 入口行为不一致
控制:
- 保留现有
moldinsight.py与inventory.py - 只把 unified 作为前端默认 upstream
风险 2:/health 语义变化
当前前端只请求一个 /health,但 split 时代它实际上只代表某个后端。
控制:
- unified 上的
/health明确作为“前端默认 backend 健康入口” - 文档中明确其语义
风险 3:/html 丢失或不可达
控制:
- unified backend 继续
mount_html=True - 前端 Nginx 保留
/html/反代
风险 4:Compose、Nginx、文档不同步
控制:
- 先写本计划文档
- 再改 unified 入口、Nginx、Compose
- 最后统一 README 与 deployment docs
7. 验证方案
7.1 路由验证
unified backend 启动后应验证:
/api/auth/login/api/auth/me/api/upload/api/status/{task_id}/api/history/api/cost-estimate/api/products/api/inventory/api/dashboard/api/finance/*/health/html/...
7.2 前端验证
前端同域访问应验证:
/login/moldinsight/inventory/moldinsight/result/:taskId
关键交互:
- 登录
- 模具上传
- 任务轮询
- 成本估算
- 产品/库存/订单页面加载
/html分析结果页访问
7.3 Compose 验证
完整系统:
docker compose --profile full up -d
应满足:
frontend正常提供页面frontend只反代一个 unified backendmoldinsight-celery正常运行- 不再依赖 Nginx 路径级业务分流
8. 实施顺序
- 新增
docs/FRONTEND_UNIFIED_DEPLOYMENT_PLAN.md - 新增
src/entrypoints/unified.py - 修改
deploy/nginx/frontend.conf - 修改
docker-compose.yml - 按需要修改 Dockerfile / 构建脚本
- 更新 README 与 deployment docs
- 做一致性验证
9. 最终预期
完成后,系统对外部署形态将变成:
- 前端:独立 Nginx 静态站点
- 网关:同域同入口
- 后端:一个 unified backend 作为前端默认 upstream
- worker:保留 gemold Celery 异步处理
- split 模式:继续作为模块独立部署能力保留
这能一次性解决当前“前端入口依赖 Nginx 路径级业务分流”的长期维护问题。