Files
iam-service/scripts/db/README.md
2026-01-31 17:23:56 +08:00

108 lines
4.1 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.

# 数据库脚本(版本化迁移)
## 目录结构
- `migrations/`:按版本顺序的升级脚本(只增不改)
- `rollback/`:与 migration 一一对应的回滚脚本(按版本号匹配)
- `migrate.sh`:按顺序执行未应用的 migrations
- `rollback.sh`:按版本回滚(需要显式确认)
- `verify.sh`:执行校验脚本,确认表结构与种子数据满足要求
- `reset.sh`:开发/测试用清库重置(会删除所有 IAM 表与迁移记录,需显式确认)
- `rebuild_iam_db.sh`:开发环境一键重建(会清库重建,不适合生产)
## 版本与执行顺序
| 版本 | 脚本 | 说明 |
|---|---|---|
| 0001 | `migrations/0001_core.sql` | IAM 核心表tenant/user/role/permission 等)与基础种子数据 |
| 0002 | `migrations/0002_enabled_apps.sql` | enabled_apps租户应用开通、平台租户与平台权限SuperAdmin |
| 0003 | `migrations/0003_app_lifecycle.sql` | apps 生命周期管理(扩展字段、变更记录、上下线审批) |
| 0004 | `migrations/0004_password_reset.sql` | 密码重置(权限码与 Admin/SuperAdmin 授权) |
| 0005 | `migrations/0005_refresh_token_fingerprint.sql` | refresh token 指纹索引(支持刷新时安全查找) |
| 0006 | `migrations/0006_cms_permissions.sql` | CMS 最小必要权限permissions 种子) |
校验脚本映射(与 migrations 一一对应):
| 版本 | 校验脚本 | 说明 |
|---|---|---|
| 0001 | `scripts/db/verify/0001_core.sql` | 校验核心表、索引与基础种子 |
| 0002 | `scripts/db/verify/0002_enabled_apps.sql` | 校验 enabled_apps 相关表与平台种子 |
| 0003 | `scripts/db/verify/0003_app_lifecycle.sql` | 校验 apps 生命周期管理相关表与权限种子 |
| 0004 | `scripts/db/verify/0004_password_reset.sql` | 校验密码重置权限码种子 |
| 0005 | `scripts/db/verify/0005_refresh_token_fingerprint.sql` | 校验 refresh_tokens 指纹字段 |
| 0006 | `scripts/db/verify/0006_cms_permissions.sql` | 校验 CMS 权限种子 |
## 执行方式
环境变量:
- `DATABASE_URL`:必填(也可放在项目根目录 `.env` 中)
依赖:
- 需要安装 PostgreSQL 客户端工具(`psql`);可选 `pg_dump`(仅当你要做备份)。
执行迁移:
```bash
./scripts/db/migrate.sh
./scripts/db/verify.sh
```
开发/测试环境清库重置(危险):
```bash
CONFIRM=1 ./scripts/db/reset.sh
```
回滚到指定版本(示例:回滚到 0001
```bash
CONFIRM=1 TARGET_VERSION=0001 ./scripts/db/rollback.sh
./scripts/db/verify.sh
```
验证步骤
- 执行 `./scripts/db/verify.sh`,应无错误退出
- 启动服务后通过 Scalar 访问 `/scalar`,检查 OpenAPI 中包含:
- `/platform/tenants/{tenant_id}/enabled-apps`
- `/users/{id}/roles`
## 首次环境准备DB/User
在具有足够权限的数据库账号下执行(示例):
```sql
CREATE USER iam_service_user WITH PASSWORD 'iam_service_password';
CREATE DATABASE iam_service_db OWNER iam_service_user;
GRANT ALL PRIVILEGES ON DATABASE iam_service_db TO iam_service_user;
```
说明:
- 生产环境不要在仓库内硬编码密码;应由密钥管理系统注入并轮换。
- 如需启用扩展(如 `uuid-ossp`),请确认应用账号是否有权限,或由 DBA 预先安装。
## 常见问题
### `.env` 配了 DATABASE_URL 但脚本报 “DATABASE_URL is required”
`.env` 只是文件不会自动变成进程环境变量。Rust 程序会通过 `dotenvy` 读取 `.env`,但 bash 脚本默认不会。
解决方式:
- 直接 `export DATABASE_URL=...` 后再执行脚本;或
- 保持项目根目录存在 `.env`,脚本会尝试读取其中的 `DATABASE_URL`
### 执行脚本报 “psql not found”
原因:系统未安装 PostgreSQL 客户端工具(`psql`/`pg_dump`),或不在 `PATH` 中。
安装方式:
- Ubuntu/Debian`sudo apt-get update && sudo apt-get install -y postgresql-client`
- RHEL/CentOS/Fedora`sudo dnf install -y postgresql`
- Alpine`sudo apk add postgresql-client`
- macOSHomebrew`brew install libpq && brew link --force libpq`
验证方式:
```bash
psql --version
```