From d87c10e964fc82616766d37fd280566996c16052 Mon Sep 17 00:00:00 2001 From: pikastech Date: Sun, 19 Jul 2026 10:53:17 +0200 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=A3=B0=E6=98=8E=E6=B1=82=E8=81=8C?= =?UTF-8?q?=E5=AF=86=E7=A0=81=E5=BA=93=20PostgreSQL=20=E5=AD=98=E5=82=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config/platform-db/postgres-pk01.yaml | 58 +++++++++++++++++++ .../specs/PJ2026-04-findjob-workbench.md | 17 +++--- 2 files changed, 67 insertions(+), 8 deletions(-) diff --git a/config/platform-db/postgres-pk01.yaml b/config/platform-db/postgres-pk01.yaml index 2e8d0056..777c77dd 100644 --- a/config/platform-db/postgres-pk01.yaml +++ b/config/platform-db/postgres-pk01.yaml @@ -361,6 +361,36 @@ postgres: user: hwlab_jd01_v03_app address: 74.48.78.17/32 method: scram-sha-256 + - type: hostssl + database: findjob + user: findjob + address: 10.0.8.0/22 + method: scram-sha-256 + - type: hostssl + database: postgres + user: findjob + address: 10.0.8.0/22 + method: scram-sha-256 + - type: hostssl + database: findjob + user: findjob + address: 74.48.78.17/32 + method: scram-sha-256 + - type: hostssl + database: postgres + user: findjob + address: 74.48.78.17/32 + method: scram-sha-256 + - type: hostssl + database: findjob + user: findjob + address: 152.53.229.148/32 + method: scram-sha-256 + - type: hostssl + database: postgres + user: findjob + address: 152.53.229.148/32 + method: scram-sha-256 secrets: source: master-local @@ -464,6 +494,20 @@ secrets: HWLAB_JD01_V03_DB_NAME: hwlab_jd01_v03 randomHex: HWLAB_JD01_V03_DB_PASSWORD: 32 + - name: findjob-db-credentials + sourceRef: platform-db/findjob-db.env + type: env + requiredKeys: + - FINDJOB_DB_USER + - FINDJOB_DB_PASSWORD + - FINDJOB_DB_NAME + createIfMissing: + enabled: true + values: + FINDJOB_DB_USER: findjob + FINDJOB_DB_NAME: findjob + randomHex: + FINDJOB_DB_PASSWORD: 32 objects: roles: - name: sub2api @@ -529,6 +573,15 @@ objects: createdb: false createrole: false superuser: false + - name: findjob + passwordRef: + sourceRef: platform-db/findjob-db.env + key: FINDJOB_DB_PASSWORD + login: true + attributes: + createdb: false + createrole: false + superuser: false databases: - name: sub2api owner: sub2api @@ -565,6 +618,11 @@ objects: encoding: UTF8 locale: C.UTF-8 extensions: [] + - name: findjob + owner: findjob + encoding: UTF8 + locale: C.UTF-8 + extensions: [] exports: connectionStrings: diff --git a/project-management/PJ2026-04/specs/PJ2026-04-findjob-workbench.md b/project-management/PJ2026-04/specs/PJ2026-04-findjob-workbench.md index 37e1c051..b9acee75 100644 --- a/project-management/PJ2026-04/specs/PJ2026-04-findjob-workbench.md +++ b/project-management/PJ2026-04/specs/PJ2026-04-findjob-workbench.md @@ -22,7 +22,7 @@ - 账号、简历、岗位和申请状态投影。 - 图形验证码、短信验证码、真人校验、资料补充和提交确认等人工事项。 - 统一管理员密码认证、HTTPS 公开入口和受控会话。 -- 招聘账号密码的本地加密保存、按单位生成、查看和复制。 +- 招聘账号密码在 host PostgreSQL 中按单位明文保存、生成、查看和复制。 - Vite 前端与 Bun API 的 native 热重载开发形态。 - 声明式业务状态、本地私密运行状态和外部表单工作流的边界。 @@ -42,7 +42,7 @@ | 人工事项 | 自动流程需要本人查看、填写或确认后才能继续的任务。 | | 业务状态 | 可提交到私有仓库的单位、材料和申请公开状态。 | | 私密运行状态 | 工作流 ID、验证码 artifact、本人答案和其他不得提交的临时状态。 | -| 招聘密码库 | 以统一管理员密码派生密钥加密、按单位保存招聘账号和密码的本地私密状态。 | +| 招聘密码库 | 在 host PostgreSQL 独立数据库中按单位保存招聘账号和明文密码的私密状态。 | ## 4. 系统边界 @@ -61,7 +61,7 @@ flowchart LR Career[单位与申请 YAML] --> API[Bun API] Tasks[本地人工事项] --> API Secret[统一密码 sourceRef] --> API - Vault[本地加密招聘密码库] <--> API + Vault[host PostgreSQL 明文招聘密码库] <--> API Workflow[外部表单工作流] <--> API API --> Vite[Vite Web 工作台] Vite --> Edge[HTTPS 公共边缘] @@ -72,7 +72,7 @@ flowchart LR - 端口、启动命令、状态路径和认证来源由求职仓库 `config.json` 拥有。 - 公共域名、TLS upstream 和 health path 由 UniDesk public exposure YAML 拥有。 - 私密运行状态只保存在求职仓库 `.state/`。 -- 招聘密码库密钥只从统一管理员密码派生,不维护第二个主密码。 +- 招聘密码库使用受控 Secret sourceRef 连接 host PostgreSQL,不维护第二个主密码。 - 招聘密码明文只在已认证会话的单条显式查看请求中返回。 ## 6. 原子需求 @@ -114,13 +114,14 @@ native 开发应同时保持前端 HMR 和 API 文件监听热重载。服务端 工作台应为每个单位管理独立招聘账号和密码,并满足以下要求: - 使用密码学安全随机源生成符合指定长度的密码。 -- 密码库文件只保存在 `.state/`,文件权限为 `0600`。 -- 密码库使用统一管理员密码派生的密钥进行认证加密。 +- 密码库使用 host PostgreSQL 独立数据库和最小权限角色。 +- `password_plaintext` 字段直接保存招聘密码明文,不进行应用层或字段级加密。 +- 数据库连接参数只从受控 Secret sourceRef 读取,不写入仓库。 - 单位列表和密码库摘要只返回账号、密码是否存在和更新时间,不返回密码明文。 - 查看或复制密码必须由已认证用户对单个单位显式触发。 - 前端不得把全部密码预加载到页面状态。 - API、CLI、日志、TaskTree、Git 和错误响应不得打印密码明文。 -- 更新密码时应覆盖该单位的加密条目,不保留可由普通接口读取的历史明文。 +- 更新密码时应覆盖该单位的当前明文记录,不保留可由普通接口读取的历史密码。 ## 7. 验收契约 @@ -132,4 +133,4 @@ native 开发应同时保持前端 HMR 和 API 文件监听热重载。服务端 - 桌面和移动视口均无文本重叠、横向页面溢出或操作按钮不可达。 - 正确登录后能为单个单位生成、查看和复制招聘密码。 - 未登录请求、单位列表请求和密码库摘要请求均不能取得密码明文。 -- 密码库文件和 Git diff 中不出现招聘密码明文。 +- Git diff、CLI、日志和 TaskTree 中不出现招聘密码明文。