docs(v02): record Keycloak deployment baseline

This commit is contained in:
Codex Agent
2026-06-04 13:46:23 +08:00
parent e70dab1f88
commit 683d7b7459
+46 -8
View File
@@ -2,7 +2,7 @@
本文是 HWLAB `v0.2` 登录、认证和应用层鉴权入口的长期规格。它把 Keycloak OIDC、浏览器 Web session、CLI/API/AgentRun 共用的用户 API key 和 HWLAB 内部 `AuthPrincipal` 归一到同一套口径,避免把本地账号密码、浏览器 cookie 和设备专用系统 key 混用。
基础设施实施跟踪见 [pikasTech/HWLAB#788](https://github.com/pikasTech/HWLAB/issues/788)。用户角色、Code Agent session owner、device pod grant 和资源授权矩阵见 [spec-user-access.md](spec-user-access.md);本文只定义“如何登录、如何恢复 actor、如何把请求归一成 actor”。
基础设施实施跟踪见 [pikasTech/HWLAB#788](https://github.com/pikasTech/HWLAB/issues/788)Keycloak 到 HWLAB 的接入收口见 [pikasTech/HWLAB#814](https://github.com/pikasTech/HWLAB/issues/814)。用户角色、Code Agent session owner、device pod grant 和资源授权矩阵见 [spec-user-access.md](spec-user-access.md);本文只定义“如何登录、如何恢复 actor、如何把请求归一成 actor”。
## 设计目标
@@ -47,6 +47,44 @@ https://auth.74-48-78-17.nip.io/realms/hwlab
- `hwlab-cloud-api``hwlab-cloud-web` 和 CLI 仍保持 v0.2 原入口 `19666/19667`Keycloak 只新增 auth 域名,不替代 HWLAB Cloud Web。
- Keycloak OIDC client 的 redirect URI 必须指向 `hwlab-cloud-api` callback(当前 v0.2 为 `http://74.48.78.17:19667/auth/oidc/callback`)。`https://auth.74-48-78-17.nip.io` 只作为 Keycloak issuer/authorization host,不能配置成 HWLAB callback 目标。
## Keycloak 当前部署基线
v0.2 的 Keycloak 部署已经具备公网 HTTPS 原生后台管理入口和 `hwlab` realm OIDC issuer。后续 HWLAB 接入工作应把 Keycloak 当成已存在的外部 OIDC provider 消费,不再把 Keycloak 基础部署、Postgres 或 HTTPS 暴露混入 Cloud Web/Cloud API 接入任务。
部署拓扑:
```text
browser
-> https://auth.74-48-78-17.nip.io
-> master Caddy :443
-> master frps remotePort 28443
-> G14 keycloak-frpc
-> keycloak.keycloak.svc.cluster.local:8080
```
运行基线:
- Kubernetes namespace 固定为 `keycloak`,与 `hwlab-v02` 解耦。
- Keycloak Deployment 使用 `quay.io/keycloak/keycloak:25.0`Postgres 使用 `postgres:16-alpine`FRP client 使用 `fatedier/frpc:v0.68.1`
- `keycloak` Deployment、`keycloak-frpc` Deployment 和 `keycloak-postgres` StatefulSet 必须 Ready`keycloak-bootstrap-realm` Job 必须已成功完成。
- 公网管理入口是 `https://auth.74-48-78-17.nip.io/admin/master/console/``/admin/` 可以重定向到该原生 console;不要在 HWLAB Cloud Web 中重做 Keycloak 管理 UI。
- 公网 issuer 是 `https://auth.74-48-78-17.nip.io/realms/hwlab`discovery 与 JWKS 必须全部返回 HTTPS URL。
- Keycloak management 端口 `9000` 不作为公网入口暴露;健康和管理探测留在集群内或受控透传内完成。
- `hwlab` realm 必须 enabled,并在小范围测试阶段允许 self-registration;新注册用户在 HWLAB 应用层只能默认成为普通 `user`,不自动拥有 device pod grant。
- `hwlab-cloud-web` client 的 redirect URI 指向 `http://74.48.78.17:19667/auth/oidc/callback`web origin 指向 `http://74.48.78.17:19666`
管理员凭据边界:
- `master` realm 的 `admin` 用户只用于 Keycloak 原生后台和自动化 bootstrap,不是 HWLAB 应用管理员账号。
- Kubernetes Secret `keycloak-admin/password` 是 Keycloak 初始管理员和后续自动化 Job 获取 admin token 的凭据来源;如果人工在 Keycloak UI 里轮换 admin 密码,必须同步更新该 Secret,否则重跑 bootstrap/admin REST Job 会继续使用旧密码并失败。
- 不要把 admin password、client secret、session token 或完整 API key 写入 issue、长期参考、ConfigMap、日志或 trace。临时取密脚本使用后必须删除。
- `hwlab-cloud-web-client` Secret 只保存 Keycloak OIDC client secretCloud Web 不直接读取它,只有 `hwlab-cloud-api` 在 callback/token exchange 中使用。
部署硬化项:
- Keycloak 当前已能通过公网 HTTPS issuer 和 forwarded headers 正常工作;后续 render 可显式固定 `--hostname=https://auth.74-48-78-17.nip.io` 和必要的 `--hostname-admin`,减少代理链路变化导致的 issuer/callback 歧义。
- 小范围测试可先使用 bootstrap 创建的 client secret;进入更大范围公网使用前应轮换为随机 secret,并同时更新 Keycloak client 与 `hwlab-cloud-web-client` Secret。
## 注册策略
短期小范围测试允许 Keycloak 开启自助注册,并且不要求邮箱或手机校验。该策略只有在以下条件同时满足时成立:
@@ -240,13 +278,13 @@ API key 行为:
| 规格项 | 状态 | 说明 |
| --- | --- | --- |
| Keycloak 独立 namespace 与公网 HTTPS issuer | 目标状态 | 实施跟踪见 #788;短期建议 `auth.74-48-78-17.nip.io` + Caddy/Let's Encrypt + FRP。 |
| Keycloak 自助注册且不强制邮箱/手机验证 | 目标状态 | 只适合小范围测试;默认 `user`、无 device pod grant。 |
| Web OIDC login/callback | 目标状态 | 当前源码仍以 `/auth/login` 本地账号密码为主。 |
| Web session 24 小时轮换 | 目标状态 | 当前 `internal/cloud/access-control.ts` 为 7 天本地 session,后续需改为 24 小时。 |
| CLI/AgentRun `HWLAB_API_KEY` 一等登录 | 目标状态 | 当前 CLI 主要保存 cookie sessionAgentRun/device-pod 仍有旧 shared key 口径;目标是统一 env API key 映射到用户,无浏览器跳转,无跨用户 device-pod key。 |
| 默认 API key 自动生成和 Web 可查看 | 目标状态 | 小范围测试允许重复查看明文;生产化再改为 hash-only。 |
| `AuthPrincipal` 归一 | 目标状态 | 后续实现必须把 Web session、CLI API key 和 AgentRun `hwpod` API key 都归一成同一用户 actor。 |
| Keycloak 独立 namespace 与公网 HTTPS issuer | 部署已完成 | `keycloak` namespace、Caddy/FRP HTTPS、`hwlab` issuer、admin console 和 bootstrap Job 已形成部署基线;后续只按本文件继续硬化。 |
| Keycloak 自助注册且不强制邮箱/手机验证 | Keycloak 侧已完成 | 只适合小范围测试;HWLAB 应用层仍必须默认 `user`、无 device pod grant。 |
| Web OIDC login/callback | 待 HWLAB 接入收口 | Keycloak 侧 redirect URI 已配置,Cloud API/Web rollout 和浏览器 callback 验收见 #814。 |
| Web session 24 小时轮换 | 待 HWLAB 接入收口 | 当前目标是 callback 成功后由 `hwlab-cloud-api` 发行 24 小时 `hwlab_session`;验收见 #814。 |
| CLI/AgentRun `HWLAB_API_KEY` 一等登录 | 待 HWLAB 接入收口 | 目标是统一 env API key 映射到用户,无浏览器跳转,无跨用户 device-pod key;验收见 #814。 |
| 默认 API key 自动生成和 Web 可查看 | 待 HWLAB 接入收口 | 小范围测试允许本人重复查看明文;生产化再改为 hash-only。 |
| `AuthPrincipal` 归一 | 待 HWLAB 接入收口 | 后续实现必须把 Web session、CLI API key 和 AgentRun `hwpod` API key 都归一成同一用户 actor。 |
| `admin/user` 与 device pod grant 授权 | 部分实现 | 现有 cloud-api 已有本地用户、session、grant 和 Code Agent owner 绑定;资源授权继续按 spec-user-access 收敛。 |
## Keycloak 部署纪律