# DataOps Platform 全本地隔离测试栈设计

## 目标

为历史代码清理后的 DataOps Platform 建立可重复启动、可销毁、不会访问生产数据服务的本地验收环境，并把该环境作为后续 RBAC、DataFlow–n8n 版本映射、数据治理知识库和工作台迭代的共同验证基线。

## 已确认边界

- PostgreSQL、Neo4j、MinIO、n8n、Flask 后端和 Vue 前端全部运行在 Docker Compose 的独立网络内。
- 仅 DeepSeek 保持外部依赖；未配置密钥时，平台基础功能仍可启动，只有显式调用生成式能力时返回配置错误。
- 不挂载、不导入、不连接任何生产数据库、生产 Neo4j、生产 MinIO 或生产 n8n。
- 使用 `dataops-test` Compose 项目名、独立命名卷和高位宿主机端口；销毁环境必须显式执行 `down -v`。
- 测试数据库使用仓库当前保留的建库 SQL；测试管理员仅用于本地验收，不代表下一轮正式 RBAC 已完成。
- `app/` 是后端唯一源码；Docker 镜像不得从 `deployment/app/` 构建。

## 容器与端口

| 服务 | 容器端口 | 宿主机端口 | 说明 |
|---|---:|---:|---|
| frontend | 80 | 18183 | Nginx 承载 SPA，并把 `/api/` 代理到 backend |
| backend | 5500 | 15500 | Gunicorn + Flask |
| postgres | 5432 | 15432 | `dataops` 与 `n8n` 两个隔离数据库 |
| neo4j | 7474 / 7687 | 17474 / 17687 | 图数据和浏览器管理界面 |
| minio | 9000 / 9001 | 19000 / 19001 | 对象 API 和控制台 |
| n8n | 5678 | 15678 | 执行编排与 API |

## 启动顺序和健康条件

```mermaid
flowchart LR
    P["PostgreSQL healthy"] --> N["n8n"]
    P --> B["Backend"]
    G["Neo4j healthy"] --> B
    M["MinIO healthy"] --> I["Bucket init complete"]
    I --> B
    B --> F["Frontend / Nginx"]
```

Compose 只把基础设施健康作为启动依赖。最终验收另外检查：前端首页、后端系统健康、PostgreSQL 初始化表、Neo4j 连通、MinIO bucket、n8n `/healthz`，以及后端日志中不存在生产域名和生产内网地址。

## 数据初始化

PostgreSQL 官方入口按顺序执行：

1. 创建 n8n 独立数据库。
2. 通过 `\ir` 执行 `database/` 中当前保留的六个 SQL 文件。
3. 创建本地测试 `users` 表并写入 `admin` 测试账号。

现有认证仅使用 Base64 密码和 `is_admin` 标记，属于已知 P0 技术债。正式三角色 RBAC、密码哈希、JWT 和管理员创建用户由下一轮独立计划替换，本测试账号不得复制到其他环境。

## 隔离保护

- Compose 显式设置每个依赖的容器内地址，后端不得使用代码中的默认生产地址。
- n8n 客户端不再包含线上 URL 或 API Key；配置缺失时必须失败关闭，而不是回退到线上。
- Compose 文件不保存 DeepSeek 或 n8n API Key；私密值只允许通过未跟踪的 `.env.local` 或当前 shell 注入。
- 本地 n8n 首次启动后由用户在 UI 完成 owner 初始化并生成 API Key，再通过 `N8N_API_KEY` 注入后端。未完成该步骤时 n8n 容器健康，但平台 n8n 管理 API 会明确显示未授权。

## 验收口径

- `docker compose config` 成功，且渲染结果中不存在 `192.168.3.143`、`company.citupro.com`、`n8n.citupro.com`。
- 七个服务均为 `running`，有健康检查的服务均为 `healthy`。
- `GET http://localhost:18183/` 返回 200。
- `GET http://localhost:18183/api/system/health` 返回业务码 200，PostgreSQL 和 Neo4j 均为 true。
- PostgreSQL 存在 `users`、`data_orders`、`data_products`、`metadata_review_records`、`metadata_version_history`、`task_list`。
- MinIO 中存在 `dataops-bucket`。
- `GET http://localhost:15678/healthz` 返回 200。
- 当前 Python 测试和前端生产构建继续通过。

## 非目标

- 不在本次实现正式 RBAC、知识库、Workflow 版本表或工作台持久化接口。
- 不迁移 Vue 3。
- 不验证 DeepSeek 计费调用。
- 不对生产表执行任何 DDL 或数据迁移。
