Files
Cloud-Tour-to-Libo/docs/data-center-mysql-interface-center.md
T
xuelong 3dd5731751 feat: streamline platform and secure data access
- move the relational data center to MySQL and a standalone workbench\n- add Interface Center API credentials, policies, logs, and DBeaver SSH guidance\n- harden authentication and deployment while retiring unused management surfaces
2026-08-25 02:06:28 -07:00

129 lines
5.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 数据中心 MySQL 与接口中心部署说明
## 已确定的系统边界
- PostgreSQL:继续保存账号、权限、图谱项目与 Schema 等系统元数据。
- FalkorDB:继续保存已发布知识图谱节点和关系。
- MySQL:只负责“数据中心”的关系型业务数据。
- 接口中心:只通过受控 HTTPS API 访问 MySQL 数据中心,不允许外部用户执行任意 SQL。
- DBeaver:仅供受信任的数据管理员通过 SSH 隧道管理 MySQL,使用独立 MySQL 用户和 `GRANT` 权限;不复用接口密钥,也不公开 MySQL 端口。
- SQL 控制台:生产默认只读;写入通过数据表页面执行,以保留记录级变更历史,物理删除始终禁止。
每个数据中心数据库都是真实 MySQL Database:中文名称只用于页面显示,英文数据库编码直接作为物理 MySQL 数据库名。前端数据中心的现有 URL、布局和 `/v1/admin/data-platform/*` 契约保持不变。
## 配置
关键环境变量:
```dotenv
DATA_MYSQL_URL=mysql://data_center:strong-password@mysql:3306/platform_control
DATA_MYSQL_REQUIRED=true
DATA_MYSQL_POOL_MIN_SIZE=2
DATA_MYSQL_POOL_MAX_SIZE=20
INTERFACE_API_SECRET=another-long-random-secret
DATA_MYSQL_DIRECT_ACCESS_ENABLED=false
MYSQL_HOST_BIND=127.0.0.1
MYSQL_PORT=3307
DATA_MYSQL_DIRECT_TRANSPORT=SSH 隧道(强制)
DATA_MYSQL_SSH_TUNNEL_REQUIRED=true
DATA_MYSQL_SSH_HOST=server.example.com
DATA_MYSQL_SSH_PORT=22
DATA_MYSQL_SSH_AUTH_METHOD=SSH 私钥 / SSH Agent
DATA_MYSQL_ADMIN_HOST=127.0.0.1
DATA_MYSQL_ADMIN_PORT=3307
DATA_MYSQL_ADMIN_ACCOUNT_POLICY=一人一号 · 单库授权 · 禁止 root
DATA_MYSQL_AUDIT_ENABLED=false
DATA_SQL_CONSOLE_WRITE_ENABLED=false
DATA_BACKUP_ENABLED=false
```
`MYSQL_HOST_BIND` 在生产环境必须保持 `127.0.0.1`。`DATA_MYSQL_DIRECT_ACCESS_ENABLED` 只表示管理员接入是否完成运维配置,不会开放端口;本项目不提供公开 MySQL 直连模式。只有数据库审计真实启用后,才把 `DATA_MYSQL_AUDIT_ENABLED` 改成 `true`。
应用会记录 API 调用、记录新增/修改/软删除以及 SQL 控制台的成功、失败和拒绝
事件;SQL 审计只保存语句 SHA-256,不保存可能包含敏感值的原文。DBeaver 绕过
应用,因此仍必须由数据库审计能力单独留痕,未完成前不得开放长期写权限。
生产 MySQL 开启 ROW Binlog、`sync_binlog=1` 与
`innodb_flush_log_at_trx_commit=1`,用于时间点恢复与事务落盘;加密备份脚本和
恢复要求见 `docs/DEPLOYMENT.md`。
`platform_control` 保存数据库目录、表定义、数据审计、接口客户端、密钥哈希、权限策略与接口调用日志。完整接口密钥不会保存,只保存带服务端 pepper 的 HMAC-SHA256 哈希。
## 首次部署
```bash
docker compose up -d mysql
docker compose up -d --build api
```
接口中心页面:`/admin/system/interfaces`。
页面以“服务器被访问”为方向:`DBeaver 管理接入`只给受信任的数据管理员展示 SSH 隧道参数,`HTTPS API`负责电脑、设备和业务系统的身份、密钥、最小权限与调用日志。接口中心不会主动连接外部数据库。
## DBeaver 安全连接
DBeaver 不使用 URL 模式直接填写服务器公网地址。按两组参数配置:
1. `SSH` 标签页:`Host/IP=服务器域名`、`Port=22`、认证方式使用私钥或 SSH Agent;
2. `Main` 标签页:`Server Host=127.0.0.1`、`Port=3307`、`Database=获授权数据库编码`;
3. 关闭 `Show all databases`;
4. 使用运维为当前人员签发的独立 MySQL 账号,禁止使用 `root` 和后端服务账号 `data_center`;
5. 默认只授予 `SELECT`,写入和结构修改权限按需临时授予。
运维人员可在服务器上创建或撤销独立账号:
```bash
./scripts/mysql_admin_account.sh create zhangsan tourism_data read
./scripts/mysql_admin_account.sh create lisi tourism_data write
./scripts/mysql_admin_account.sh revoke zhangsan
```
脚本只授予指定数据库权限:`read` 为 `SELECT/SHOW VIEW`,`write` 额外包含
`INSERT/UPDATE/DELETE`,不授予建库、删库、授权、文件或系统库权限;账号连续
失败 5 次锁定一天,密码 90 天过期。MySQL 端口仍必须绑定回环地址,账号的
`'%'` 主机范围不能替代网络隔离。
接口中心不会显示或复制 MySQL 密码。服务器安全组只允许受控来源访问 SSH 与 HTTPS,不开放 `3307`。
外部数据接口前缀:`/v1/openapi/data`。调用时使用:
```http
Authorization: Bearer YOUR_API_KEY
```
## 迁移旧数据中心
先预览,不写入:
```bash
python3 scripts/migrate_data_center_postgres_to_mysql.py
```
确认计划后执行:
```bash
python3 scripts/migrate_data_center_postgres_to_mysql.py --execute
```
如果目标 MySQL 中已存在同编码数据库,脚本默认拒绝覆盖。只有确认目标可以重建时才使用:
```bash
python3 scripts/migrate_data_center_postgres_to_mysql.py --execute --replace-target
```
迁移会保留记录 UUID、创建/更新时间、软删除状态和数据变更审计,从而避免实体引用失效;不会修改 PostgreSQL 源数据,也不会操作 FalkorDB 或知识图谱。
## 权限模型
一条接口策略包含:
1. 客户端(电脑、应用、合作方或设备);
2. 数据库;
3. 数据表或全部表;
4. `metadata/read/create/update/delete` 动作;
5. 可读字段与可写字段;
6. 可选的行级 JSON 范围,例如 `{"district":"荔波县"}`;
7. 启用/停用状态。
接口客户端无法访问 `platform_control`、MySQL 系统库或其他业务数据库,也不能通过 API 执行 SQL。每次接口调用都会记录客户端、动作、资源范围、状态码、耗时和来源 IP。