ContextualWisdomLab/pg-erd-cloud

GitHub: ContextualWisdomLab/pg-erd-cloud

一个基于云端的 PostgreSQL/Snowflake schema 逆向工程与 ERD 协作分享服务,支持 DDL 导出、跨方言类型映射及 LLM 辅助规格说明书生成。

Stars: 1 | Forks: 0

# pg-erd-cloud (MVP 骨架) 这是一个以 PostgreSQL 为核心的云端 ERD(协作/共享)软件的**可运行 MVP 骨架**。 ## 当前提供的功能 - **Backend DB = PostgreSQL**(用于存储应用元数据) - **Reverse engineering(逆向工程)**:连接到目标 PostgreSQL 后 - schema/table/column - PK/FK/UNIQUE/CHECK - index(包含 access method,例如:btree/hash/gist/gin/spgist/brin + extension AM) 基于 pg_catalog 进行收集,并保存为快照 - **Snowflake reverse engineering(可选)**:如果使用 `snowflake://user:password@account/database/schema` 格式的 DSN, 将从 Snowflake 的 `INFORMATION_SCHEMA` 中收集 schema/table/column、 PK/UNIQUE/FK 元数据,并将其保存为 `source_dialect: "snowflake"` 的快照。 运行环境中需要可选依赖项 `snowflake-connector-python`。 - **ERD UI**:使用 React Flow(MIT)以图形化方式渲染 PK/FK - **Forward engineering(正向工程)**:在 MVP 阶段,主要侧重于“基于快照的 DDL(导出)” (基于 diff/生成变更 SQL 的功能在路线图中) - SQL export:`GET /api/snapshots/{snapshot_uuid}/export.sql` - Target dialect:`?dialect=postgresql`(默认)或 `?dialect=snowflake` - 将 PostgreSQL 快照转换为 Snowflake DDL 时,会映射主要的 column type, 并将 PostgreSQL 专用的 index/tablespace/partition/check constraint 以注释形式保留。 - Snowflake reverse snapshot JSON(`source_dialect: "snowflake"`)在导出为 PostgreSQL DDL 时也会映射主要的 type。 - **生成 DB Reversing 规格说明书**: - Markdown draft:`GET /api/snapshots/{snapshot_uuid}/reversing-spec.md` - LLM prompt:`GET /api/snapshots/{snapshot_uuid}/reversing-spec.md?mode=llm-prompt` - Live LLM draft:`GET /api/snapshots/{snapshot_uuid}/reversing-spec.md?mode=llm-draft` - 调用配置了 `LLM_API_BASE_URL`、`LLM_API_KEY`、`LLM_MODEL` 的 OpenAI 兼容 chat-completions provider。 - 在 Share link 中也可以使用相同的 `/api/share/{share_uuid}/snapshots/{snapshot_uuid}/...` 路径。 - **列示例值提示**:在逆向工程快照的每一列中添加 `example_value`。 由于这是利用列名/类型元数据生成的合成示例,而非对实际表数据进行采样, 因此可以在 ERD、PlantUML/SVG export、规格说明书和 LLM prompt 中安全地参考。 ## 共享(向同事分享链接) 项目所有者可以创建共享链接。 ``` curl -X POST "http://localhost:8000/api/projects//share-links" ``` 同事可以通过返回的 `url_path` 查看最新的快照列表/快照 JSON/DDL export。 `/api/share/*` 公开查看/导出路径应用了比全局 `/api/*` 限制更严格的独立 基于 IP 的 rate limit。 ## 索引类型支持原则 在 PostgreSQL 中,`CREATE INDEX ... USING ` 中的 `` 不仅限于内置类型(btree/hash/gist/gin/spgist/brin),还可以是**通过 extension(扩展)添加的 access method**。 因此,本项目**不硬编码固定列表**, 而是通过以下方式广泛支持“现存(已安装在该数据库中)的索引类型”: - 使用 `pg_am` + `pg_class.relam` 收集“当前数据库中实际存在的 access method (amname)” - 使用 `pg_get_indexdef()` **无损**保留 DDL 依据(官方文档): - Index types / extension bloom 示例: - CREATE INDEX(用户安装的 access methods): - pg_am / pg_class / pg_index: - pg_get_indexdef / pg_get_expr: ## 运行(本地,Docker) ``` cp .env.example .env docker compose up -d --build ``` - Frontend: - Backend:(health:/healthz) ## 运行(生产环境风格,Docker) 使用 Traefik 作为 edge router。将 `/api/*` 和 `/healthz` 路由到后端, 将其余路径路由到静态构建的 frontend SPA。 ``` cp .env.example .env # 在生产模式中,通过 Docker secret 文件注入 APP_SECRET。 # (禁止提交此文件:在 .gitignore 中包含 **/secrets/**) mkdir -p secrets python - <<'PY' import secrets with open('secrets/app_secret', 'w', encoding='utf-8') as f: f.write(secrets.token_urlsafe(48) + "\n") PY # 限制 secret 文件权限(仅所有者可读写) chmod 600 secrets/app_secret docker compose -f compose.prod.yaml up -d --build ``` - 应用入口:(可通过 `TRAEFIK_HTTP_PORT` 修改) - Health: ### Azure VMSS 状态探测(可选) 如果使用 VMSS Application Health Extension,有关 `/healthz` 探测配置示例请 参考以下文档。 - [Azure VMSS Application Health Extension 指南](docs/azure-vmss-health-extension.md) ## 开发(非 Docker) ### Backend ``` cd backend python -m venv .venv && source .venv/bin/activate pip install -U pip pip install -e . alembic upgrade head hypercorn --config python:app.hypercorn_config app.main:app \ --bind 0.0.0.0:8000 --reload \ --access-logfile - --error-logfile - ``` 在需要使用 Snowflake reverse engineering 的开发环境中,请在后端虚拟环境中 一并安装可选依赖项。 ``` pip install -e ".[snowflake]" ``` #### 运维提示 - Hypercorn worker 数量可通过 `HYPERCORN_WORKERS`(或 `WEB_CONCURRENCY`)进行调整。 - `APP_SECRET` 用作应用 DB 中存储的 DSN 加密密钥,因此更改它可能会 影响现有数据的解密。请尽可能通过 `APP_SECRET_FILE`(例如: `/run/secrets/app_secret`)方式进行安全注入。 ### Frontend ``` cd frontend npm ci npm run dev ``` ## 安全/运维注意事项 - 禁止提交 `.env`(已包含在 .gitignore 中)。 - 目标数据库连接信息 (DSN) 基于 **APP_SECRET** 进行加密并存储在应用 DB 中。 - 逆向工程操作不在请求路径中同步等待,而是通过 job queue 进行异步处理。 - API 安全检查清单(项目标准):[docs/api-security-checklist.md](docs/api-security-checklist.md) ## 路线图(摘要) - Casdoor OIDC 登录 UI/重定向流程(目前仅支持 token 验证/DEV 模式) - 实时协作(光标/评论/基于 CRDT 的协同编辑) - 正向工程(基于 diff 生成/验证变更 SQL)
标签:DDL生成, ERD, PostgreSQL, Snowflake, 云资产清单, 数据库工具, 测试用例, 请求拦截, 逆向工具, 逆向工程