# DataOps Platform 架构总览 > 状态基线:2026-07-18。本文只描述当前可验证事实和已确认的下一阶段目标,不把占位入口描述为已完成功能。 ## 1. 系统边界 DataOps Platform 面向数据治理人员、数据编辑者和数据消费者,负责数据源登记、业务域/元数据/数据流治理、数据产品与订单管理,并通过 n8n 承载流程编排和执行。当前唯一后端源码是 `app/`,前端为 Vue 2;Vue 3 迁移安排在业务能力稳定后的独立阶段。 ```mermaid flowchart LR U["管理员 / 编辑者 / 查看者"] --> FE["Vue 前端"] FE --> API["Flask API / app/"] API --> PG["PostgreSQL\n交易、审核、布局、映射"] API --> DSP["外部数据源连接池\nPostgreSQL / MySQL"] API --> NEO["Neo4j\n治理对象与血缘图"] API --> OBJ["MinIO\n非结构化原件与附件"] API --> N8N["n8n\nWorkflow 定义与执行"] API --> DS["DeepSeek\n生成与问答"] API --> QW["Qwen Embedding\n向量化"] ``` 外部模型调用是唯一可选的非本地依赖。没有配置密钥时,本地基础设施、登录和非模型功能仍可验证,且代码不得回退到任何生产地址。 ## 2. 容器与代码层级 ```mermaid flowchart TB subgraph Browser["浏览器"] UI["frontend/src"] end subgraph Runtime["应用运行时"] NGINX["Nginx 静态资源与 /api 代理"] ROUTES["app/api 蓝图路由"] CORE["app/core 领域逻辑"] SERVICES["app/services 基础服务"] CONFIG["app/config 环境配置"] end subgraph Stores["本地隔离数据服务"] POSTGRES["平台 PostgreSQL 16\n控制面与凭据密文"] SOURCEPG["外部 PostgreSQL\n业务数据"] SOURCEMY["外部 MySQL\n业务数据"] NEO4J["Neo4j 5"] MINIO["MinIO"] N8NLOCAL["n8n 1.100.1"] end UI --> NGINX --> ROUTES ROUTES --> CORE CORE --> SERVICES SERVICES --> CONFIG SERVICES --> POSTGRES CORE --> SOURCEPG CORE --> SOURCEMY SERVICES --> NEO4J SERVICES --> MINIO SERVICES --> N8NLOCAL ``` 职责规则: - `app/api/` 只负责协议转换、参数校验、鉴权和响应封装。 - `app/core/` 承载领域用例;`app/core/data_source/` 负责外部数据源凭据、 驱动白名单、连接池、熔断和生命周期编排。 - `app/services/` 提供 PostgreSQL、Neo4j、MinIO、n8n 和模型客户端。 - `database/` 是基础建库脚本源;`migrations/` 是已启用的 Alembic 增量迁移链。 - `deployment/app/` 与 `deployment/database/` 是发布镜像,不是编辑源。 ## 3. 当前业务闭环 | 能力 | 前端入口 | 后端前缀 | 主要存储 | 当前状态 | |---|---|---|---|---| | 数据源 | 数据治理/数据源 | `/api/datasource` | Neo4j 安全定义、PostgreSQL 凭据密文、Worker 本地连接池 | PostgreSQL/MySQL 可用 | | 业务域 | 数据治理/业务域 | `/api/bd` | Neo4j、PostgreSQL 审核表 | 可用 | | 元数据 | 元数据详情与审核 | `/api/meta` | Neo4j、PostgreSQL 审核/历史 | 可用 | | 数据标准与标签 | 数据治理相关页面 | `/api/interface` | Neo4j | 可用 | | DataFlow 定义 | 数据流程 | `/api/dataflow` | Neo4j | 可用;版本映射待实现 | | n8n Workflow | n8n 适配页面 | `/api/datafactory` | n8n | 代理可用;首次需本地 API Key | | 数据产品/订单 | 数据服务 | `/api/dataservice` | PostgreSQL、Neo4j | 可用 | | 数据安全 | 保留入口 | 无完整接口 | 无 | 占位,不宣称实现 | | 数据治理知识库 | 保留入口 | 待实现 | PostgreSQL/pgvector、Neo4j | 下一阶段 | | 工作台 | 首页 | 待完善 | PostgreSQL | 验收样例;下一阶段持久化 | 当前 Flask 路由的机器可读清单和实际数量见 [OPENAPI.yaml](OPENAPI.yaml), 该文件由路由源码自动生成并由契约测试校验。 ## 4. 外部数据源连接池边界 ```mermaid flowchart LR ROUTE["数据源 API"] --> SERVICE["DataSourceService"] SERVICE --> GRAPH["Neo4j\n无密钥连接定义"] SERVICE --> CREDS["平台 PostgreSQL\nAES-256-GCM 凭据版本"] USE["元数据 / 质量 / DataFlow"] --> MANAGER["Worker 本地 ConnectionManager"] MANAGER --> REGISTRY["惰性 PoolRegistry\n2 + 3 / 数据源 / Worker"] REGISTRY --> PGADAPTER["postgresql+psycopg2"] REGISTRY --> MYADAPTER["mysql+pymysql"] PGADAPTER --> EXTPG["外部 PostgreSQL"] MYADAPTER --> EXTMYSQL["外部 MySQL"] ``` - 平台 PostgreSQL 是控制面数据库,沿用应用自身数据库会话,不进入该连接池注册表。 - 外部池按 `数据源 UID + 凭据版本 + 配置指纹` 隔离;一个后端 Worker 对一个键最多创建一个 Engine。当前单实例使用 2 个 Gunicorn Worker,因此 总连接预算必须按“单池上限 × Worker 数 × 活跃数据源数”核算。 - 仅允许 PostgreSQL 和 MySQL 固定驱动;客户端不能传入驱动名、任意 `connect_args` 或自由连接串。 - 查询用途明确区分只读与写入;只读事务回滚,写入事务只执行一次并提交, 连接失败不会自动重放写事务。 - 连续三次连接失败仅打开对应数据源的熔断器,30 秒后允许一个半开探测。 故障不会改变平台 PostgreSQL、其他数据源或其他 Worker 的状态。 - 连接定义保存在 Neo4j,但不含用户名、密码或连接串;不可变凭据版本及审计 事件保存在平台 PostgreSQL。日志、错误和管理诊断均经过脱敏。 - 配置或凭据版本变化会使旧池排空并惰性重建;空闲池 15 分钟回收,每个 Worker 默认最多保留 20 个空闲池。进程退出时统一关闭。 ## 5. 下一阶段目标链路 ```mermaid flowchart LR CHANGE["治理对象变更"] --> OUTBOX["PostgreSQL Outbox"] OUTBOX --> INDEXER["知识库增量同步"] INDEXER --> EMB["Qwen Embedding"] EMB --> VECTOR["pgvector"] VECTOR --> QA["DeepSeek 问答"] AUDIT["每日全量一致性巡检"] --> INDEXER DF["DataFlow 治理定义"] --> MAP["版本映射"] MAP --> WF1["n8n Workflow v1"] MAP --> WF2["n8n Workflow v2"] MAP --> ACTIVE["环境级唯一生效版本"] ``` 实施顺序、依赖和验收口径见 [NEXT_ITERATION_ROADMAP.md](NEXT_ITERATION_ROADMAP.md)。 ## 6. 架构产物索引 - [数据模型](DATA_MODEL.md) - [部署源真相](DEPLOYMENT_SOURCE_OF_TRUTH.md) - [前端历史删除清单](FRONTEND_REMOVAL_INVENTORY.md) - [认证与权限 ADR](ADR-001-authentication.md) - [DataFlow 与 n8n ADR](ADR-002-workflow-engine.md) - [跨存储一致性 ADR](ADR-003-cross-store-consistency.md) - [全本地 Docker 环境](../../deploy/docker/README.md)