# 部署源真相与发布边界

## 1. 唯一编辑源

| 类型 | 唯一编辑源 | 生成/发布副本 | 规则 |
|---|---|---|---|
| 后端 | `app/` | `deployment/app/` | 禁止直接修复发布副本 |
| 数据库脚本 | `database/` | `deployment/database/` | 先改源脚本，再同步 |
| 后端入口 | 根目录 `wsgi.py` | `deployment/wsgi.py` | 两者使用同一 `app.create_app` |
| 前端 | `frontend/src/` | `frontend/dist/` | `dist/` 只由构建生成 |
| 本地容器 | `deploy/docker/` | Docker image/volume | 不复用生产容器和卷 |

`app/` 为唯一后端源码。历史上 `deployment/app/` 中仍有效的修复已经合并回 `app/`；此后只允许通过 `bash deployment/sync_release.sh` 生成发布副本。

## 2. 变更流

```mermaid
flowchart LR
    APP["app/"] --> TEST["Python tests"]
    DB["database/"] --> TEST
    FE["frontend/src/"] --> BUILD["npm production build"]
    TEST --> SYNC["deployment/sync_release.sh"]
    APP --> DOCKER["local Docker build"]
    DB --> DOCKER
    BUILD --> IMAGE["frontend image"]
    SYNC --> RELEASE["deployment/ 发布包"]
```

发布门禁：

```bash
python -m pytest -q
python -m compileall -q app
npm --prefix frontend run build
bash deployment/sync_release.sh
diff -qr app deployment/app
diff -qr database deployment/database
git diff --check
```

## 3. 环境配置

- DeepSeek 是当前唯一默认生成模型提供方；密钥只来自环境变量或密钥管理系统。
- Qwen 仅用于下一阶段 embedding，不替代 DeepSeek 的生成模型职责。
- `N8N_API_URL` 和 `N8N_API_KEY` 必须显式配置；缺失时失败关闭，不得回退线上地址。
- PostgreSQL、Neo4j、MinIO 默认值仅允许 localhost 开发值；生产发布必须显式注入。
- `.env.local`、密钥、数据库卷和构建日志不得提交。

## 4. 全本地隔离测试栈

`deploy/docker/docker-compose.yml` 使用独立项目网络和命名卷启动 PostgreSQL、Neo4j、MinIO、n8n、后端与前端。验证地址与命令见 [本地环境指南](../../deploy/docker/README.md)。

隔离约束：

1. 配置中不得出现生产域名、IP 或提交过的 API Key。
2. 本地 PostgreSQL 初始化只使用 `database/` 当前脚本和本地验收用户。
3. 本地卷只属于 `dataops-test` Compose 项目。
4. 模型外联是可选能力；不配置密钥时不得影响基础冒烟测试。
5. n8n 首次 owner 初始化和 API Key 只存在本地环境。

## 5. 数据库变更与回滚

- 本轮删除旧 SQL 文件不授权删除生产表。
- 下一阶段先引入带版本号的数据库迁移，禁止继续依赖“首次启动自动重放全部 SQL”。
- 每个迁移包含前置检查、向前迁移、数据验证和可逆回滚说明。
- 跨 PostgreSQL/Neo4j/MinIO/n8n 变更使用 outbox、幂等消费者和巡检任务；不伪装成单机事务。
- 发布回滚优先回滚应用镜像；数据库回滚必须单独评估数据兼容性。
