fix(dev): 明确启动不重置数据库并新增安全 db:init
ci / 质量门禁 (push) Canceled after 0s

背景:开发机每次重启后被反馈需要重新用默认密码登录并强改,排查确认仓库启动链路(dev.sh / pnpm dev / API / worker / db:seed)均不重置密码;只有 db:reset / migrate reset / 重建数据卷会恢复种子密码。A2 收尾时为干净截图执行过 db:reset,是最近一次重置的直接原因。

改动:
- 新增 pnpm db:init = prisma migrate deploy + 幂等 seed,作为首次/迁移后的安全初始化;不重置数据、不覆盖已有密码。
- README / dev.sh / AGENTS 命令契约 / SEED.md / A1·A2 实施报告明确:日常启动不需要 DB 命令,db:reset 仅用于清库。
- 实测:对已改密的 admin 执行 db:init 后 password_hash 与 must_change_password 均未变化。

验证:pnpm format:check / pnpm lint 通过;db:init 实际执行通过。
This commit is contained in:
Stev_Wang committed 2026-11-03 13:37:34 +08:00
1 parent 7fb458f62f
commit 7824bc7b32
7 files changed
+27 -11

No files matched your search

+1 -1
View File
@@ -115,7 +115,7 @@ docs/ PRD / 技术架构 / 立项建议 / 工程规范
| 构建 | `pnpm build` |
| 质量 | `pnpm lint` · `pnpm lint:fix` · `pnpm format` · `pnpm format:check` · `pnpm typecheck` |
| 测试 | `pnpm test` · `pnpm test:int` · `pnpm test:e2e` · `pnpm ci:local` |
| 数据库 | `pnpm db:migrate` · `pnpm db:reset`(禁止手工删库 / 删数据卷) |
| 数据库 | `pnpm db:init`(迁移 + 幂等种子,不重置数据)· `pnpm db:migrate` · `pnpm db:reset`(清库重建,慎用;禁止手工删库 / 删数据卷) |
| 契约 | `pnpm openapi:diff` |
> 文档、脚本、CI 中出现的命令必须与上表一致,禁止自造别名。
+5 -2
View File
@@ -77,11 +77,14 @@ docs/ PRD / 技术架构 / 开发计划 / 立项建议 / 工程规范
cp .env.example .env.local
cp .env.local .env # Prisma CLI 只读取 .env(两者均已 gitignore)
pnpm check:dev # 检查本机 PostgreSQL / Redis 是否可用
pnpm db:migrate # 首次建表;后续由 Prisma 迁移管理
pnpm db:seed # 幂等写入 system_configs 基线
pnpm db:init # 首次/迁移后:应用已有迁移 + 幂等种子(不重置数据、不改已有密码)
pnpm dev # 并行启动 api(3000) / web(5173) / worker
```
> **日常启动不需要执行任何数据库命令**。`pnpm dev` / `./dev.sh` 都不会迁移、播种或重置数据库,已有账号密码保持不变。
> **只有需要清空本地库时才用 `pnpm db:reset`**:它会执行 `prisma migrate reset --force`,重建全部表并重新 seed,admin 等种子账号会回到初始密码 `lingxi2026` 且 `must_change_password=true`(这是“清库”的预期结果,不是启动行为)。
> 生产环境部署只用 `prisma migrate deploy`(`db:init` 的第一步),**不执行 seed / reset**;用户密码不会因重启或发布被重置。
也可以使用一键脚本(自动检测并释放端口、带健康检查,启动后默认跟随日志):
```bash
+4
View File
@@ -8,6 +8,7 @@
# 特性:
# · 启动前自动检测端口占用,占用则结束对应进程(可用 --no-kill 改为直接失败)
# · 后台启动 + 健康检查,返回后可用 logs/status/stop 管理
# · 不执行任何数据库迁移 / 种子 / 重置;已有账号密码不会被本脚本改动
# · 停止时按进程组结束,并兜底清理端口,避免遗留孤儿进程
# · api(3000) / web(5173) / worker(无端口)
#
@@ -71,6 +72,9 @@ usage() {
cat <<'EOF_USAGE'
灵犀 · 开发机服务启动脚本(不启动 DB / Redis 容器)
说明:本脚本只启停 api / web / worker,不执行迁移、seed 或 db:reset;
已有账号密码不会被改动。需要清库请显式运行 pnpm db:reset。
用法:
./dev.sh 启动服务并前台跟随运行日志(Ctrl+C 停止全部)
./dev.sh start 同上
@@ -86,13 +86,15 @@
```bash
pnpm check:dev # 确认 PG 5432 / Redis 6379
pnpm db:reset # 迁移 + 种子(admin / lingxi2026,首次登录须改密)
pnpm dev # API :3000 + Web :5173
pnpm db:init # 首次/迁移后:migrate deploy + 幂等种子(不重置数据、不改已有密码)
pnpm dev # API :3000 + Web :5173(日常启动不需要任何 DB 命令)
# 浏览器打开 http://127.0.0.1:5173/login
```
种子账号:`admin`(超级管理员);示例成员 `chen.mo` / `lin.qing` / `zhou.an` / `zhao.yinuo` / `gao.cen` / `su.he` / `shen.zhiyuan` / `jiang.lan`;停用示例 `tang.jia` / `he.an`。初始密码统一 `lingxi2026`,首次登录强制修改。
> 只有需要清空本地库时才执行 `pnpm db:reset`(会重建并恢复种子密码);`./dev.sh` / `pnpm dev` / `pnpm db:init` 不会重置已有账号密码。
---
## 5 已知差异与遗留
@@ -87,12 +87,14 @@ A2-QA-01 覆盖:6 个角色端点权限三态(200/201/204 vs 403 `40301`)
```bash
pnpm check:dev # 确认 PG 5432 / Redis 6379
pnpm db:reset # 迁移 + 种子(admin / lingxi2026,首次登录须改密)
pnpm dev # API :3000 + Web :5173
pnpm db:init # 首次/迁移后:migrate deploy + 幂等种子(不重置数据、不改已有密码)
pnpm dev # API :3000 + Web :5173(日常启动不需要任何 DB 命令)
# 浏览器打开 http://127.0.0.1:5173/login → 管理中心 / 角色权限
```
种子账号:`admin` 超管、`jiang.lan` 平台管理员等 11 个账号;初始密码 `lingxi2026`,首次登录强制修改。
种子账号:`admin` 超管、`jiang.lan` 平台管理员等 11 个账号;初始密码 `lingxi2026`,首次登录强制修改(仅 `must_change_password=true` 时;改完即持久为 false)。
> 只有需要清空本地库时才执行 `pnpm db:reset`:它会 `migrate reset --force` 并重新 seed,admin 回到 `lingxi2026` + 首登改密标记。`./dev.sh` / `pnpm dev` / `pnpm db:init` 都不会重置账号密码。生产部署只执行 `prisma migrate deploy`,不执行 seed / reset。
---
+1
View File
@@ -25,6 +25,7 @@
"ci:local": "node scripts/ci-local.mjs",
"db:generate": "prisma generate",
"db:migrate": "prisma migrate dev",
"db:init": "prisma migrate deploy && pnpm db:seed",
"db:reset": "prisma migrate reset --force",
"db:seed": "tsx prisma/seed.ts",
"openapi:export": "tsx --tsconfig apps/api/tsconfig.json apps/api/src/scripts/export-openapi.ts && openapi-typescript openapi/lingxi.openapi.json -o apps/web/src/api/generated/openapi.d.ts && prettier --write apps/web/src/api/generated/openapi.d.ts",
+7 -3
View File
@@ -37,11 +37,15 @@ A0 只 seed「已建表」的 `system_configs`;A1 补齐组织、账号与角
## 使用
```bash
pnpm db:migrate # 应用 a2_role_permissions_data_scopes 迁移(expand:permissions / data_scopes 两张新表)
pnpm db:seed # 幂等写入上述种子(可重复执行;空库与存量库均已验证)
# 本地重置:pnpm db:reset(会重新执行全部迁移与 seed)
pnpm db:init # 推荐:migrate deploy + 幂等 seed(不重置数据、不覆盖已有密码)
pnpm db:migrate # 开发期新增迁移时使用(prisma migrate dev)
pnpm db:seed # 只跑种子;幂等,不覆盖已有密码
# 本地清库:pnpm db:reset(会重建全部表并重新 seed,账号回到初始密码 + 首登改密标记)
```
> **密码何时会被重置**:只有执行 `db:reset` / `prisma migrate reset` / 手工删库或重建 PG 数据卷时,种子账号才会回到 `lingxi2026` 且 `must_change_password=true`。
> `dev.sh`、`pnpm dev`、`pnpm db:init`、`pnpm db:seed` 都不会覆盖已有用户密码;`must_change_password` 在用户成功改密后写为 `false`,之后登录不再要求改密。
## 与 A1 / A2 遗留的关系
- A1 记录的角色 / 用户种子已延续;A2 在其上补齐权限点目录、特殊权限口径(默认关闭、显式授予)与六类数据范围。