Compare commits
33
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
90764def8a
|
||
|
|
045c28b5c2
|
||
|
|
1dee295639
|
||
|
|
040b68cc25
|
||
|
|
d8a18793f2
|
||
|
|
3b0ca2245a
|
||
|
|
6c0fdc7ecb
|
||
|
|
c1a00cc28e
|
||
|
|
388e3f86f4
|
||
|
|
106fc29001
|
||
|
|
2d408906b4
|
||
|
|
eed96d3494
|
||
|
|
de13ab813c
|
||
|
|
7ba880cb71
|
||
|
|
78d0a8c03b
|
||
|
|
d8f20c017e
|
||
|
|
4f6b916ae5
|
||
|
|
172c17bfa3
|
||
|
|
8a6ce1d1b1 | ||
|
|
bf74d55813
|
||
|
|
0dbabe9ccd | ||
|
|
aae6138fa5
|
||
|
|
e37957f12d
|
||
|
|
42bcf8190e | ||
|
|
0aaf689e2b
|
||
|
|
0eb3f81726
|
||
|
|
6d614d8d08
|
||
|
|
6863474c01
|
||
|
|
e43442c266
|
||
|
|
adf2812767
|
||
|
|
ceb58eb42b
|
||
|
|
8d0992f039
|
||
|
|
7fdc97e02b |
+4
-2
@@ -69,8 +69,10 @@ accepted 不代表部署完成,implemented 必须附实现和验收依据。
|
|||||||
无需每次修改都更新首页、所有服务页或整个来源索引。
|
无需每次修改都更新首页、所有服务页或整个来源索引。
|
||||||
原仓库 README 同步按维护者要求暂缓,不阻塞 wiki 的维护。
|
原仓库 README 同步按维护者要求暂缓,不阻塞 wiki 的维护。
|
||||||
|
|
||||||
PR 使用 [.gitea/PULL_REQUEST_TEMPLATE.md](.gitea/PULL_REQUEST_TEMPLATE.md),简述问题、最终变化、依据与验证。
|
按维护者于 2026-09-25 的约定,纯文档变更检查通过后直接提交并推送 main,不另开 PR。
|
||||||
直接提交也遵循相同的检查与证据规则,不为纯文案修改制造额外审批。
|
含代码、配置或检查器行为变更时仍使用 PR;PR 使用
|
||||||
|
[.gitea/PULL_REQUEST_TEMPLATE.md](.gitea/PULL_REQUEST_TEMPLATE.md),简述问题、最终变化、依据与验证。
|
||||||
|
直接提交仍遵循相同的检查与证据规则,不跳过检查或覆盖 main 上的其他更新。
|
||||||
|
|
||||||
## 本地与 CI 检查
|
## 本地与 CI 检查
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,64 @@
|
|||||||
|
---
|
||||||
|
title: Ayatori 控制面边界
|
||||||
|
last_reviewed: 2026-09-24
|
||||||
|
---
|
||||||
|
|
||||||
|
# Ayatori 控制面边界
|
||||||
|
|
||||||
|
Ayatori 是规划和早期实现中的 homelab 基础设施控制平面。它使用 kube-apiserver、etcd、CRD
|
||||||
|
和 Kubernetes API machinery 作为版本化 API 与状态协调平面,主要复用对象并发控制、
|
||||||
|
list/watch、informer、RBAC、admission、审计和 API 版本机制,而不是复用 Kubernetes 的容器
|
||||||
|
编排产品边界。
|
||||||
|
|
||||||
|
Ayatori controller-manager 负责领域资源的调度、生命周期、故障恢复、垃圾回收和后端收敛。
|
||||||
|
这部分职责近似 Kubernetes 的 controller-manager,但面向 VM、LB、数据库、对象存储、任务、
|
||||||
|
托管 Kubernetes 和人工操作等 Ayatori 领域。
|
||||||
|
|
||||||
|
Kubernetes workload 集群只是与 OpenSandbox、Proxmox 等并列的 backend/executor,可能位于
|
||||||
|
远端,也可能在某个部署 profile 中不存在。除 Flux、Ayatori controllers 等管理组件的部署外,
|
||||||
|
领域 API 不得默认依赖同集群 Pod、Job、Service、NetworkPolicy、namespace 共置或 owner
|
||||||
|
reference;跨后端能力必须由领域 API 和 adapter 契约明确表达。
|
||||||
|
|
||||||
|
Kubernetes 内置资源也只是可选择复用的 API contract,不绑定其传统实现组件。例如 Ayatori
|
||||||
|
可以让 Compute Agent 更新 `core/v1 Node` 和 Lease,并由自有 controller 调度 VM,而不部署
|
||||||
|
kubelet、Pod、CRI 或 kube-scheduler。每个复用资源都必须单独明确 producer、consumer、
|
||||||
|
ownership、采用字段和有意舍弃的上游语义。
|
||||||
|
|
||||||
|
当前选择继续使用 kube-apiserver + CRD。generic-apiserver 或聚合 API Server 不会替代领域
|
||||||
|
controller,只会让项目额外接管资源服务端、watch、RBAC、API 兼容和存储迁移责任。只有 CRD
|
||||||
|
或 kube-apiserver 的限制形成经过验证的阻碍时,才重新评估自建 API Server。
|
||||||
|
|
||||||
|
Ayatori 不按传统私有云产品目录建设。当前已确认的首要管理缺口是 Database、LoadBalancer 与
|
||||||
|
Bucket/Object Storage;VirtualMachine 同样具有明确价值,但需要组合 Proxmox API、节点受限
|
||||||
|
Agent/CLI 和人工任务。当前 Job controller 是控制循环与 adapter 的验证切片,长期只可能收敛为
|
||||||
|
内部 Run 能力,不构成 FaaS、Cloud Run 或应用托管承诺。KaaS 只有出现实际需求时才评估,不是
|
||||||
|
产品路线的必达终点。
|
||||||
|
|
||||||
|
Compute 方向已被记录但延后实施:选择性复用 `core/v1 Node` 与 Lease,由 Ayatori Compute Agent
|
||||||
|
实现节点状态并由自有 controller 调度,不引入 kubelet、Pod 或 kube-scheduler。长期 VM 主路径
|
||||||
|
可以是普通 Linux 节点上的 libvirt/QEMU;Proxmox 用于 brownfield adopt 和过渡。OpenSandbox/Kata
|
||||||
|
microVM 属于 Run/Sandbox 的隔离实现,不因此成为 VirtualMachine 资源。
|
||||||
|
|
||||||
|
Database 资源模型于 2026-09-24 明确采用官方 PV/PVC 的资源/申请分离模式:Instance 提供
|
||||||
|
管理入口,独立 Database 表示实际资源,Tenant 表示用户申请。Retain 保留资源对象,支持
|
||||||
|
人工导入和明确授权后的重新绑定;不维护 PostgreSQL ownership registry,不为创建结果不确定
|
||||||
|
提供自动认领保证。详见 [DBaaS 设计](../services/postgresql-tenant-operator.md#当前资源模型2026-09-24-已确认)。
|
||||||
|
|
||||||
|
新增 Kubernetes 资源生命周期前须核对官方设计方式,记录采用与偏离的语义;参考模式不意味着
|
||||||
|
部署对应上游组件,也不意味着复制全部字段与抽象。
|
||||||
|
|
||||||
|
详细设计以 Ayatori 仓库的
|
||||||
|
[ADR-0001](https://git.ddupan.top/panxiao81/ayatori/src/branch/main/docs/decisions/0001-kubernetes-api-machinery.md)
|
||||||
|
、[ADR-0006](https://git.ddupan.top/panxiao81/ayatori/src/branch/main/docs/decisions/0006-demand-driven-resource-scope.md)
|
||||||
|
和[总体架构](https://git.ddupan.top/panxiao81/ayatori/src/branch/main/docs/architecture/overview.md)为准。
|
||||||
|
本页记录跨 homelab 的稳定边界,不表示 Ayatori 已部署或达到生产可用状态。
|
||||||
|
|
||||||
|
## CI 验证约定
|
||||||
|
|
||||||
|
2026-09-24 维护者决定:全量验证自动在 PR 执行,main push 不再重复运行;保留手动入口。
|
||||||
|
直接推送 main 不会自动验证,常规变更仍应经 PR;基线有实质变化时需更新分支并重验,
|
||||||
|
不能把分支 head 的成功当成任何合并结果的成功。测试项目未减少,不修改分支保护设置。
|
||||||
|
配置与边界见 Ayatori
|
||||||
|
[f347ee5 的环境文档](https://git.ddupan.top/panxiao81/ayatori/src/commit/f347ee5292ecf39ac0ecbb21e162ee406d8ce382/docs/concepts/environments.md),
|
||||||
|
已随 [PR #9](https://git.ddupan.top/panxiao81/ayatori/pulls/9) 合并 main;合并后未触发重复全量验证。
|
||||||
|
这不是整个 homelab 的统一 CI 策略。
|
||||||
@@ -1,16 +1,22 @@
|
|||||||
# 架构约束索引
|
# 架构约束索引
|
||||||
|
|
||||||
审阅日期:2026-09-16。以下是现有仓库明确记录的约束摘要,不是本轮新增的架构决策。
|
审阅日期:2026-09-25。以下是现有仓库明确记录的约束摘要;Ayatori 条目来自其独立项目的
|
||||||
来源路径相对于 homelab-infra;修改时必须读原文和对应代码,新出现的差异先向维护者确认;[首轮状态对齐](../verification.md)已完成。
|
已接受设计,其余来源路径相对于 homelab-infra。修改时必须读原文和对应代码,新出现的差异
|
||||||
|
先向维护者确认;[首轮状态对齐](../verification.md)已完成。
|
||||||
|
|
||||||
| 约束 | 原因与边界 | 来源 |
|
| 约束 | 原因与边界 | 来源 |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
|
| Ayatori 复用 Kubernetes API machinery,不复用其容器编排产品边界 | kube-apiserver/etcd 提供 API、watch、RBAC 与状态协调;领域调度、生命周期、恢复和 GC 属于 Ayatori controllers;Kubernetes workload 只是可替换 backend | [Ayatori 控制面边界](ayatori-control-plane.md) |
|
||||||
|
| Kubernetes 内置资源不绑定上游实现组件 | 可由 Ayatori Agent/controller 实现和消费 Node、Lease 等 API;使用 Node 不推导必须部署 kubelet、Pod 或 kube-scheduler | [Ayatori 控制面边界](ayatori-control-plane.md) |
|
||||||
|
| Ayatori 只为已验证的管理缺口新增北向资源 | 当前优先 Database、LoadBalancer、Bucket/Object Storage;VM 价值已确认但南向较重;Run 是内部切片,KaaS 按需,FaaS/PaaS 默认不做 | [Ayatori 控制面边界](ayatori-control-plane.md) |
|
||||||
|
| Ayatori Compute 复用 Node/Lease API,但不引入 Kubernetes workload plane | Compute Agent 实现 Node 状态;libvirt 是长期候选主路径,PVE 是 brownfield 过渡;Kata microVM 属于 Sandbox backend | [Ayatori 控制面边界](ayatori-control-plane.md) |
|
||||||
|
| Database 采用独立资源与用户申请分离 | Instance → Database → Tenant;Retain 保留资源并人工回收,显式导入,不维护 PG registry;替代旧所有权持久化合同 | [DBaaS 设计修订](../services/postgresql-tenant-operator.md#当前资源模型2026-09-24-已确认) |
|
||||||
| Samba AD、OCI、Proxmox 优先 IaC,以代码为准 | Ansible/Terraform 声明及任务优先于旧 README;声明不等于已验证部署 | 维护者于 2026-09-16 明确、各服务使用指南 |
|
| Samba AD、OCI、Proxmox 优先 IaC,以代码为准 | Ansible/Terraform 声明及任务优先于旧 README;声明不等于已验证部署 | 维护者于 2026-09-16 明确、各服务使用指南 |
|
||||||
| 服务独立部署,Terraform root/state 按服务隔离 | 避免认证和变更影响范围绑在一起 | `AGENTS.md`、`CLAUDE.md` |
|
| 服务独立部署,Terraform root/state 按服务隔离 | 避免认证和变更影响范围绑在一起 | `AGENTS.md`、`CLAUDE.md` |
|
||||||
| OpenBao 恢复不能依赖 k3s 或读取自己内部的恢复凭据 | 先恢复信任根,再恢复消费者 | `infrastructure/openbao/README.md`、`CLAUDE.md` |
|
| OpenBao 恢复不能依赖 k3s 或读取自己内部的恢复凭据 | 先恢复信任根,再恢复消费者 | `infrastructure/openbao/README.md`、`CLAUDE.md` |
|
||||||
| Terraform 管 API 配置,Ansible 管主机及不能安全纳管的密钥材料 | 不可读回秘密和根密钥不能靠反复重建实现收敛 | `infrastructure/openbao/README.md` |
|
| Terraform 管 API 配置,Ansible 管主机及不能安全纳管的密钥材料 | 不可读回秘密和根密钥不能靠反复重建实现收敛 | `infrastructure/openbao/README.md` |
|
||||||
| LAN HTTP 入口为 Envoy Gateway;新增服务核对 parentRefs、DNS 和认证 | 不直接套用 archive 中的 Gateway 示例 | `platform/envoy-gateway/README.md`、`AGENTS.md` |
|
| LAN HTTP 入口为 Envoy Gateway;新增服务核对 parentRefs、DNS 和认证 | 不直接套用 archive 中的 Gateway 示例 | `platform/envoy-gateway/README.md`、`AGENTS.md` |
|
||||||
| 人类身份由 Samba AD / Authelia 提供,Authelia 是 active 的唯一主 OIDC broker;workload 身份由 SPIRE 提供 | 身份签发不等于资源授权;SPIRE 基础设施与最小 PoC 已完成,后续集成以 #34 为准 | [Authelia](../services/authelia.md)、[SPIRE 状态与依据](../services/spire.md) |
|
| 人类认证仍由 Samba AD / Authelia 提供;Hydra 作为 Gitea 的实验性签发入口,通过 OIDC 复用 Authelia;workload 身份由 SPIRE 提供 | 2026-09-25 第一轮人类 PoC 扩展了原单 broker 接入边界,未迁移主入口、机器身份或应用权限 | [Authelia](../services/authelia.md)、[Hydra PoC](../services/hydra.md)、[SPIRE](../services/spire.md) |
|
||||||
| SPIFFE 提供跨基础设施的统一机器身份入口,替代 workload-sts 统一 IAM 平台方案 | 服务信任 SPIFFE 身份、签发自己的 token 并维护自身权限;非 Kubernetes 身份不依赖 Kubernetes ServiceAccount,优先复用服务现有接入机制 | [核心设计与取舍](../services/spire.md#核心设计与取舍),维护者于 2026-09-16 补充 |
|
| SPIFFE 提供跨基础设施的统一机器身份入口,替代 workload-sts 统一 IAM 平台方案 | 服务信任 SPIFFE 身份、签发自己的 token 并维护自身权限;非 Kubernetes 身份不依赖 Kubernetes ServiceAccount,优先复用服务现有接入机制 | [核心设计与取舍](../services/spire.md#核心设计与取舍),维护者于 2026-09-16 补充 |
|
||||||
| 已由 Flux 接管的资源通过 Git 修改;brownfield 不全局开启 prune | 防止漂移回滚与误删;未接管资源不能假定受 Flux 管理 | `clusters/homelab/README.md` |
|
| 已由 Flux 接管的资源通过 Git 修改;brownfield 不全局开启 prune | 防止漂移回滚与误删;未接管资源不能假定受 Flux 管理 | `clusters/homelab/README.md` |
|
||||||
| DNS 各视图保留权威边界;只管理明确声明的 RRset | 不清理 Samba 自动维护的域记录;LAN 现状按维护者说明对齐,旧源码文档待同步 | `infrastructure/dns/README.md`、[LAN DNS](../services/lan-dns.md) |
|
| DNS 各视图保留权威边界;只管理明确声明的 RRset | 不清理 Samba 自动维护的域记录;LAN 现状按维护者说明对齐,旧源码文档待同步 | `infrastructure/dns/README.md`、[LAN DNS](../services/lan-dns.md) |
|
||||||
@@ -24,3 +30,10 @@
|
|||||||
|
|
||||||
通用变更约束:先做适用的 plan/check/diff,再操作现场;不将凭据和 Terraform state
|
通用变更约束:先做适用的 plan/check/diff,再操作现场;不将凭据和 Terraform state
|
||||||
写入知识库;不更新 homelab-infra 的冻结 `CHANGELOG.md`。
|
写入知识库;不更新 homelab-infra 的冻结 `CHANGELOG.md`。
|
||||||
|
|
||||||
|
## 待评估草案
|
||||||
|
|
||||||
|
[独立 IAM 与 agent 身份草案](independent-iam-draft.md)(2026-09-25,draft)提出以 Hydra
|
||||||
|
解耦认证与签发,通过 OIDC 接入人类、machine 和 agent,并作为 Ayatori 的独立外部依赖。
|
||||||
|
完整方案仍为草案。2026-09-25 已按维护者要求先实施人类登录 PoC,上表显式记录其有限
|
||||||
|
变更;SPIFFE、agent 动态授权、组模型及 DNS 迁移未随之实施。
|
||||||
|
|||||||
@@ -0,0 +1,235 @@
|
|||||||
|
---
|
||||||
|
title: 独立 IAM 草案:人类、机器与 AI Agent 的统一应用接入
|
||||||
|
status: draft
|
||||||
|
last_reviewed: 2026-09-25
|
||||||
|
last_verified: null
|
||||||
|
sources:
|
||||||
|
- https://git.ddupan.top/panxiao81/iam-login/commit/9cf2d235dff0cd33f98012b0a114f14a8f9bfcda
|
||||||
|
- 维护者于 2026-09-25 的架构讨论与草案记录要求
|
||||||
|
---
|
||||||
|
|
||||||
|
# 独立 IAM 草案:人类、机器与 AI Agent 的统一应用接入
|
||||||
|
|
||||||
|
本页记录完整 IAM 的设计意图,状态仍为 **draft**。2026-09-25 维护者随后选择先实施
|
||||||
|
[Hydra 人类登录 PoC](../services/hydra.md):通用 OIDC 上游适配器暂用 Authelia,Gitea
|
||||||
|
新增 Hydra 登录源;维护者已确认成功返回原账号且仓库权限正常,第一轮人类 PoC
|
||||||
|
验收通过。这不表示完整方案已采纳或开始全面迁移。
|
||||||
|
长期名称、资源模型及 agent 接口尚未确定。
|
||||||
|
|
||||||
|
## 动机与首要目标
|
||||||
|
|
||||||
|
首要目标是降低下游应用集成成本。原生接入 SPIFFE 的应用覆盖有限,OIDC/OAuth 则已有
|
||||||
|
广泛的应用与 CLI 生态。通过独立 IAM 集中处理身份验证,让应用沿用标准登录和授权流程,
|
||||||
|
即可接入人类、传统机器账户和 AI agent,无需每个应用自行验证 SVID 或集成 SPIRE。
|
||||||
|
|
||||||
|
维护者认为,现有方案缺少好用的、真正区分 AI agent 与传统 service account 的身份及
|
||||||
|
授权模型,这是考虑自行建设的主要原因。拟自建的是主体语义、认证编排与授权能力,
|
||||||
|
OAuth2/OIDC 协议和 token 签发优先交给 Hydra。
|
||||||
|
|
||||||
|
Hydra 的核心价值是把“如何验证身份”与“如何完成标准授权流程并签发 token”解耦。
|
||||||
|
统一 token 格式不是主要目标,也不要求所有应用 API 直接接受 Hydra token。
|
||||||
|
|
||||||
|
## 独立服务边界
|
||||||
|
|
||||||
|
IAM 应当能够独立部署、运行和恢复,不依赖 Ayatori 的 API、CRD、controller 或领域资源。
|
||||||
|
Ayatori 是其消费者,依赖关系类似 OpenStack 其他服务对 Keystone 的依赖;这一类比
|
||||||
|
不意味着复刻 Keystone 的全部 API 或功能。即使未来命名为 Ayatori IAM,也不改变边界。
|
||||||
|
|
||||||
|
| 部分 | 拟承担的职责 |
|
||||||
|
|---|---|
|
||||||
|
| 人类认证后端 | 人类登录与 MFA;已选择 Spring Native 方向,首轮 AD 仍为用户与组权威 |
|
||||||
|
| SPIRE | workload 身份证明与 SVID 签发,可辅助 machine 或 agent 认证 |
|
||||||
|
| Login / Consent 与身份授权服务 | 验证不同主体的证明,映射稳定身份,处理登录、授权、组和必要的动态审批 |
|
||||||
|
| Hydra | OAuth2/OIDC 流程、client 与 token 签发 |
|
||||||
|
| 下游应用 | 关联本地账号,执行应用自身权限,按原有机制签发或使用应用凭据 |
|
||||||
|
|
||||||
|
```text
|
||||||
|
人类:交互登录 / 上游 IdP ──────┐
|
||||||
|
机器:SPIFFE 等预配置身份 ─────┼→ 独立身份验证与授权 → Hydra → OIDC/OAuth 消费者
|
||||||
|
Agent:人类授权 / SPIFFE / │ ├→ Gitea 等应用
|
||||||
|
后续专门认证方式 ──────┘ └→ Ayatori API server
|
||||||
|
```
|
||||||
|
|
||||||
|
Ayatori 使用裁剪的 kube-apiserver,目标是让它信任 Hydra 签发的 token 来验证身份,
|
||||||
|
再由自身 RBAC 执行资源授权。具体 token 类型、claims、audience 与 JWT authenticator
|
||||||
|
兼容性需要验证;不能预先把任意 Hydra access token 都视为 API server 可用凭据。
|
||||||
|
|
||||||
|
## 主体类型与认证方式分离
|
||||||
|
|
||||||
|
人类、machine、agent 是不同的主体类型,不能按所用认证协议决定分类。
|
||||||
|
Agent 可以使用 SPIFFE 辅助证明执行环境,而仍然是 agent 主体,不必冒充传统机器账户。
|
||||||
|
Agent 的负责人、委托人及当前执行实例也不应与 agent 自身身份混为一谈。
|
||||||
|
|
||||||
|
| 维度 | 传统机器账户 / CI | AI agent |
|
||||||
|
|---|---|---|
|
||||||
|
| 任务特征 | 预定义流程与资源范围 | 能理解任务、作出决策,可能跨应用并在执行中改变操作路径 |
|
||||||
|
| 权限需求 | 通常可以预先配置 | 潜在范围更广,可能执行中动态申请 |
|
||||||
|
| 授权方式 | 审核配置后按固定规则授予 | 基础权限与任务、会话或限时授权组合,由策略或人类批准 |
|
||||||
|
| 交互能力 | 固定程序处理约定流程 | 可使用 CLI、MCP 和 skills,自主组织请求并在需要时请求批准 |
|
||||||
|
| 审计语义 | 哪个 workload 执行了操作 | 哪个 agent、哪次执行、代表谁、依据哪次授权执行 |
|
||||||
|
|
||||||
|
更广的潜在权限不等于常驻全权。动态批准应转化为服务端认可的授权和适当凭据,
|
||||||
|
不能由 agent 自报身份或声明 scope 就自动生效。申请、批准、期限、撤销以及下游已有
|
||||||
|
会话和 token 的失效语义需要明确设计,不能假设 Hydra 自动提供完整实现。
|
||||||
|
|
||||||
|
认证入口保持可扩展:
|
||||||
|
|
||||||
|
- Remote MCP 的 OAuth 可提供人类参与的授权入口。设计上允许人类在流程中确认或选择
|
||||||
|
agent 身份、委托关系与权限,再由服务端绑定凭据。普通 MCP OAuth 并不自动定义
|
||||||
|
agent 主体语义;具体绑定属于本方案要实现的能力。
|
||||||
|
- SPIFFE 路径以经人类审核的 workload/身份绑定规则为信任来源,运行时验证证明是否
|
||||||
|
满足规则。交互批准和预配置批准都是可用的信任建立方式。
|
||||||
|
- MCP 和 skills 是 agent 参与流程的工具及操作约定,本身不替代可验证凭据。
|
||||||
|
后续可以增加专门的 agent 认证方式,不必现在锁定一个唯一协议。
|
||||||
|
|
||||||
|
Agent 可以独立使用自身权限,也可以接受人类委托。人类授权 agent 不等于 agent
|
||||||
|
变成人类账号;需要时保留“agent A,经用户 B 授权”的关系与审计信息。
|
||||||
|
|
||||||
|
## 无浏览器的标准登录与 Gitea 示例
|
||||||
|
|
||||||
|
Authorization code flow 不要求必须使用图形浏览器。对于可通过 HTTP 完成的流程,
|
||||||
|
agent 可以用 curl/CLI 保存 cookies、跟随重定向、提交表单和身份证明,并到达 callback。
|
||||||
|
必须保留 state、nonce、PKCE 等协议绑定;以 HTTP 客户端执行不意味着跳过这些校验。
|
||||||
|
专用登录 helper 可以作为便利工具,但不是架构前提。
|
||||||
|
|
||||||
|
关键是 Login 服务支持 machine/agent 的身份证明,而不强迫它们完成人类密码、
|
||||||
|
交互 MFA 等认证。Consent 按已有授权策略处理,必要时请求人类批准。
|
||||||
|
|
||||||
|
Gitea 的目标路径包含内外两层授权:
|
||||||
|
|
||||||
|
```text
|
||||||
|
官方 tea CLI 发起 Gitea OAuth 授权
|
||||||
|
→ Gitea 经 OIDC 请求 Hydra 登录
|
||||||
|
→ Login 服务验证 agent 或 machine 的身份
|
||||||
|
→ 接受 login challenge,按策略完成 Hydra consent
|
||||||
|
→ Hydra 回调 Gitea,Gitea 关联对应 bot 账号
|
||||||
|
→ 完成 Gitea 自身对 tea 的授权确认
|
||||||
|
→ Gitea 回调 tea,由 tea 完成 code 交换并取得 Gitea token
|
||||||
|
→ tea 按 bot 的 Gitea 权限调用 API
|
||||||
|
```
|
||||||
|
|
||||||
|
这里 Hydra token 用于 Gitea 的身份登录,Gitea token 用于 CLI 调用应用 API。
|
||||||
|
因此不要求 Gitea API 直接接受 Hydra bearer token,也不以自建 PAT 分发 broker 为前提。
|
||||||
|
Bot 是下游账号映射,不代表所有 agent 共享一个万能 bot。
|
||||||
|
|
||||||
|
该路径尚未端到端验证。需要验证官方 CLI 的授权 URL/callback 交接、Gitea 本地会话与
|
||||||
|
首次授权确认、账号关联和 scope,以及刷新与重新登录。其他应用可复用相同思路,
|
||||||
|
但支持 OIDC 不等于所有应用的无交互授权路径均已兼容,须按具体流程验收。
|
||||||
|
|
||||||
|
## 统一组与下游授权
|
||||||
|
|
||||||
|
集中维护较统一的粗粒度用户组,避免每个应用都独立维护一套 admins 成员关系。
|
||||||
|
应用仍保留自身角色、team 和资源权限,由明确映射决定中央组在应用内的权限。
|
||||||
|
统一组不等于一个全局 admins 自动拥有所有服务的管理权。
|
||||||
|
|
||||||
|
Agent 的动态授权需要落到应用可识别的 scope、角色、账号权限或其他已有授权机制上。
|
||||||
|
仅在 Hydra token 中增加一个 claim,不意味着下游会自动执行或撤销相应权限。
|
||||||
|
具体组名、角色模型及同步方式尚未确定。
|
||||||
|
|
||||||
|
## 人类后端、Samba AD 与 DNS 演进
|
||||||
|
|
||||||
|
### 人类认证后端的接口边界
|
||||||
|
|
||||||
|
2026-09-25 维护者明确:考虑 ZITADEL 是为了复用认证会话与登录状态机,而不是把它作为
|
||||||
|
另一个 OIDC 上游。下一阶段目标是由人类认证后端处理认证因素与会话,适配层验证结果、
|
||||||
|
映射稳定主体并接受 Hydra login challenge;面向下游的 OAuth2/OIDC 仍由 Hydra 提供。
|
||||||
|
第一轮通过 Authelia OIDC 的 PoC 保留为已验收基线,尚未部署此替代路径。
|
||||||
|
|
||||||
|
早期上游接口与源码评估曾形成以下两个候选;后续决定见下方“已确定的实现方向”:
|
||||||
|
|
||||||
|
| 候选 | 可复用能力 | 尚需承担的接入工作 |
|
||||||
|
|---|---|---|
|
||||||
|
| ZITADEL Session API + Login V2 | 逐步验证认证因素、会话、账号管理;Login V2 有登录编排与 UI | 将登录事务绑定到 Hydra challenge,服务端验证认证结果并接回 Hydra;按选定版本验证 LDAP、MFA 与完整恢复流程 |
|
||||||
|
| Ory Kratos + self-service UI | 登录、MFA、恢复与会话流程;上游已有 Hydra login challenge 集成 | 部署和维护独立 UI,保留主体映射与 consent;Samba AD 不能假设存在开箱即用的 LDAP 认证接入 |
|
||||||
|
|
||||||
|
早期评估认为 Kratos 在认证与签发的职责分离上更直接;但若必须继续使用
|
||||||
|
Samba AD 密码登录,LDAP 过渡成本可能使 ZITADEL 更合适。Kratos 本身是 headless 服务,
|
||||||
|
现成参考 UI 不等于无需维护的内置管理门户,亦不能把 Ory Network 的功能直接视为自托管
|
||||||
|
开源版能力。此判断是方案评估,不是新的部署决定。
|
||||||
|
|
||||||
|
ZITADEL Session API 返回会话不等于已完成全部认证;需要确认已验证因素、有效期、用户
|
||||||
|
状态和所需 MFA。官方 Login V2 的流程编排包含这些判断。无 OIDC 上下文登录及默认完成
|
||||||
|
跳转可用,但普通跳转不是传给 Hydra 的认证证明,也不自动绑定原始 login challenge。
|
||||||
|
|
||||||
|
查阅时上游文档与开发分支存在差异:Hosted Login 文档仍列出 LDAP 限制,而
|
||||||
|
[Login V2 固定源码](https://github.com/zitadel/zitadel/blob/5ca0b54ca311c4be535589e7c375f9bea50e3ec2/apps/login/src/lib/server/idp.ts)
|
||||||
|
已有 LDAP 认证实现;不能据此宣称某个发布版本已经验收。部署前需锁定发行版本再验证。
|
||||||
|
|
||||||
|
参考:[ZITADEL Session API](https://zitadel.com/docs/reference/api/session/zitadel.session.v2.SessionService.CreateSession)、
|
||||||
|
[Login App](https://zitadel.com/docs/guides/integrate/login-ui/login-app)、
|
||||||
|
[Hosted Login 限制](https://zitadel.com/docs/guides/integrate/login/hosted-login)、
|
||||||
|
[Kratos Hydra 集成源码](https://github.com/ory/kratos/blob/master/selfservice/flow/login/handler.go)、
|
||||||
|
[Kratos self-service UI](https://github.com/ory/kratos-selfservice-ui-node)、
|
||||||
|
[LDAP 功能请求](https://github.com/ory/kratos/issues/274)。
|
||||||
|
|
||||||
|
### 已确定的实现方向
|
||||||
|
|
||||||
|
维护者已选择 Java、Spring Security 与 GraalVM Native。阻碍 Java 的是 JVM 部署和运行
|
||||||
|
开销;能够通过 Native 功能与资源验收时,Java 仍是优先选择,不引入 Kotlin。
|
||||||
|
Quarkus、Micronaut 也有相应生态支持;最终选择 Spring 同时考虑了维护者的熟悉程度。
|
||||||
|
Keycloak 可参考认证实现,但其服务端模型与 SPI 不直接复用,采用 Quarkus 也不证明
|
||||||
|
Keycloak 有 Native 发行或完整原生兼容性。
|
||||||
|
|
||||||
|
原先薄 OIDC 适配器在 homelab-infra 内维护;现在直接承担 AD、MFA、认证状态与 Native
|
||||||
|
构建测试,因此按维护者决定拆为独立 [iam-login](https://git.ddupan.top/panxiao81/iam-login)
|
||||||
|
仓库,独立于 Ayatori。环境部署仍归 homelab-infra。
|
||||||
|
|
||||||
|
已按维护者提供的 start.spring.io 配置生成 Java 25、Spring Boot 4.1.1、Gradle 与 YAML
|
||||||
|
项目骨架,包含 LDAP、WebAuthn、校验、Actuator/Prometheus、OpenTelemetry/追踪、
|
||||||
|
Testcontainers、UnboundID、Lombok、配置处理器、DevTools 与 Native 插件。依赖存在不表示认证流程已实现;首次实现及 Native
|
||||||
|
验证由 [issue #1](https://git.ddupan.top/panxiao81/iam-login/issues/1) 跟踪。需在原生二进制上
|
||||||
|
验证 AD、MFA、Hydra、持久化及监控,实测资源成本;不能把编译成功等同完整验收。
|
||||||
|
|
||||||
|
首轮保持 AD 用户与组权威并直接映射组名。LDAP 与 MFA 绑定同一稳定主体;切换前需要
|
||||||
|
明确现役 issuer/sub 哈希主体到新主体的连续性映射。MFA 首先验证官方 WebAuthn 集成,
|
||||||
|
恢复与已有凭据迁移方式仍待实现。维护者接受必要时并存多个登录前端。
|
||||||
|
现役 Go/Authelia PoC 保留为已验收基线,尚未切换生产认证路径。
|
||||||
|
|
||||||
|
### 目录与 DNS 迁移
|
||||||
|
|
||||||
|
人类同样使用这套独立 IAM。首轮由 iam-login 直接连接 Samba AD 验证密码、查询用户与组,
|
||||||
|
按原组名直接映射;之后再推进统一粗粒度组模型与目录迁移,不要求同一步替换目录。
|
||||||
|
更换认证后端时应保持稳定主体与下游账号关联,避免按可变邮箱或用户名重新识别账号。
|
||||||
|
|
||||||
|
维护者认为 Samba AD 使用率较低,长期希望完全删除它。退役需处理 LDAP、Kerberos、
|
||||||
|
SMB 域身份、域成员和域 DNS 等实际依赖,不能用网页登录迁移成功代替全部退出条件。
|
||||||
|
|
||||||
|
DNS 可独立评估迁往 PowerDNS Authoritative,主要考虑其 API 与资源成本。可从简单后端
|
||||||
|
开始评估,不预先要求完整 Recursor/UI/数据库集群。实际资源占用尚未测量。
|
||||||
|
AD 存续期间保留其域记录权威与动态更新边界;普通记录的迁移、Blocky/路由器解析链和
|
||||||
|
最终域退役应分别设计。PowerDNS 不是 IAM 的必需组件。
|
||||||
|
|
||||||
|
## 与现役约束的关系
|
||||||
|
|
||||||
|
现役记录仍以 [架构约束](constraints.md)、[Authelia](../services/authelia.md) 和
|
||||||
|
[SPIFFE/SPIRE](../services/spire.md) 为准。当前文档中的 Authelia 主 OIDC 入口、
|
||||||
|
服务直接验证 SPIFFE 后签发自身 token 的规则,仍是现役基础。第一轮人类 PoC 对
|
||||||
|
Gitea 增加实验性 Hydra 签发入口的有限变更已在约束索引中单独记录。
|
||||||
|
|
||||||
|
本草案提出的变化是:增加独立的多主体 IAM,通过 Hydra 解耦认证与签发,让尚不支持
|
||||||
|
SPIFFE 的下游复用 OIDC;并为 agent 增加区别于传统 service account 的身份授权语义。
|
||||||
|
若采纳,应显式更新现役约束和相关服务文档。已能直接使用 SPIFFE 的服务无需强制改道。
|
||||||
|
这也不构成恢复已归档 [workload-sts](workload-sts-history.md) 项目的决定。
|
||||||
|
|
||||||
|
## 后续验证问题
|
||||||
|
|
||||||
|
以下是草案的验证范围,不是已启动的实施任务或第二份动态进度表:
|
||||||
|
|
||||||
|
1. 一个 SPIFFE 主体,通过官方 tea 的 OAuth 入口,用 CLI/HTTP 完成无浏览器登录,
|
||||||
|
以指定 bot 成功调用 Gitea API,同时验证错误身份不能取得该账号。
|
||||||
|
2. 人类和 agent 使用不同认证方式后,下游仍能通过同一 OIDC 接口识别正确身份与组。
|
||||||
|
3. Ayatori 的 kube-apiserver 验证 Hydra token,并正确映射主体、组与 RBAC。
|
||||||
|
4. Agent 动态申请权限,经过策略或人类批准后生效;到期与撤销行为覆盖下游凭据。
|
||||||
|
5. 明确稳定 agent、执行实例、委托者的绑定方式,以及可供 agent 使用的 MCP/CLI 接口。
|
||||||
|
6. 独立评估 Samba 退出条件、PowerDNS 资源成本与 DNS 迁移边界。
|
||||||
|
|
||||||
|
## 上游依据
|
||||||
|
|
||||||
|
以下文档用于说明协议与产品能力,不代表本方案已验证或已选定具体版本:
|
||||||
|
|
||||||
|
- [Hydra Login / Consent 流程](https://www.ory.com/docs/oauth2-oidc/custom-login-consent/flow)
|
||||||
|
- [Gitea OAuth2 provider 与 tea 内置客户端](https://docs.gitea.com/development/oauth2-provider/)
|
||||||
|
- [tea 登录命令定义](https://pkg.go.dev/code.gitea.io/tea/cmd/login)
|
||||||
|
- [Kubernetes 身份验证](https://kubernetes.io/docs/reference/access-authn-authz/authentication/)
|
||||||
|
- [ZITADEL LDAP 上游](https://zitadel.com/docs/guides/integrate/identity-providers/ldap)
|
||||||
|
- [PowerDNS Authoritative HTTP API](https://doc.powerdns.com/authoritative/http-api/index.html)
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
title: 按任务查找文档
|
title: 按任务查找文档
|
||||||
last_reviewed: 2026-09-18
|
last_reviewed: 2026-09-25
|
||||||
---
|
---
|
||||||
|
|
||||||
# 按任务查找文档
|
# 按任务查找文档
|
||||||
@@ -10,8 +10,10 @@ last_reviewed: 2026-09-18
|
|||||||
|
|
||||||
| 要做什么 | 先读 | 需要时再读 |
|
| 要做什么 | 先读 | 需要时再读 |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
|
| 评估独立 IAM 与 AI agent 身份 | [独立 IAM 草案](../architecture/independent-iam-draft.md) | [Hydra 人类登录 PoC](../services/hydra.md);完整 IAM 仍为草案 |
|
||||||
|
| 设计或实现 Ayatori 控制面能力 | [Ayatori 控制面边界](../architecture/ayatori-control-plane.md) | Ayatori 仓库 ADR、对应领域 API 与 adapter 文档 |
|
||||||
| 发布新的 LAN Web 服务 | [发布新服务](publish-service.md) | [DNS](../services/lan-dns.md)、[Authelia](../services/authelia.md) |
|
| 发布新的 LAN Web 服务 | [发布新服务](publish-service.md) | [DNS](../services/lan-dns.md)、[Authelia](../services/authelia.md) |
|
||||||
| 写 CI 或选择 Pod/VM runner | [Gitea / Actions](../services/gitea.md) | [Dynamic Runner](../services/gitea-dynamic-runner.md)、[SPIFFE](../services/spire.md) |
|
| 写 CI 或选择 Pod/VM runner | [Gitea / Actions](../services/gitea.md) | [Dynamic Runner](../services/gitea-dynamic-runner.md)、[SPIFFE](../services/spire.md)、[`ci-actions@v1`](https://git.ddupan.top/panxiao81/ci-actions/src/tag/v1) |
|
||||||
| 为 CI 缓存 Ansible/Go 依赖 | [Nexus POC](../services/nexus.md) | [Dynamic Runner](../services/gitea-dynamic-runner.md)、[OpenBao](../services/openbao.md) |
|
| 为 CI 缓存 Ansible/Go 依赖 | [Nexus POC](../services/nexus.md) | [Dynamic Runner](../services/gitea-dynamic-runner.md)、[OpenBao](../services/openbao.md) |
|
||||||
| 拉取或发布容器镜像 | [zot](../services/zot.md) | [SPIFFE](../services/spire.md);S3 后端维护才读 SeaweedFS |
|
| 拉取或发布容器镜像 | [zot](../services/zot.md) | [SPIFFE](../services/spire.md);S3 后端维护才读 SeaweedFS |
|
||||||
| 使用 S3 对象存储 | [SeaweedFS](../services/seaweedfs.md) | [OpenBao](../services/openbao.md) |
|
| 使用 S3 对象存储 | [SeaweedFS](../services/seaweedfs.md) | [OpenBao](../services/openbao.md) |
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
title: Authelia
|
title: Authelia
|
||||||
lifecycle: active
|
lifecycle: active
|
||||||
evidence: documented
|
evidence: documented
|
||||||
last_reviewed: 2026-09-16
|
last_reviewed: 2026-09-25
|
||||||
last_verified: null
|
last_verified: null
|
||||||
sources:
|
sources:
|
||||||
- 维护者于 2026-09-16 确认当前状态
|
- 维护者于 2026-09-16 确认当前状态
|
||||||
@@ -10,8 +10,10 @@ sources:
|
|||||||
|
|
||||||
# Authelia
|
# Authelia
|
||||||
|
|
||||||
**Authelia 已作为 homelab 唯一的主 OIDC broker 工作,当前状态为 active。**
|
**Authelia 继续作为 homelab 的主 OIDC 入口与人类认证后端工作,状态为 active。**
|
||||||
此状态由维护者于 2026-09-16 明确,本轮未查询运行环境。
|
基础状态由维护者于 2026-09-16 明确。2026-09-25 新增 [Hydra 人类登录 PoC](hydra.md),
|
||||||
|
以标准 OIDC client 复用 Authelia;其原有应用客户端、Samba AD 后端及 MFA 策略保留。
|
||||||
|
该次仅验证新增配置有效和 Pod 就绪,未更新本页原有功能的整体验收日期。
|
||||||
|
|
||||||
## 用途与入口
|
## 用途与入口
|
||||||
|
|
||||||
|
|||||||
@@ -2,10 +2,12 @@
|
|||||||
title: Gitea Dynamic Runner
|
title: Gitea Dynamic Runner
|
||||||
lifecycle: experimental
|
lifecycle: experimental
|
||||||
evidence: documented
|
evidence: documented
|
||||||
last_reviewed: 2026-09-16
|
last_reviewed: 2026-09-21
|
||||||
last_verified: null
|
last_verified: null
|
||||||
sources:
|
sources:
|
||||||
- https://git.ddupan.top/panxiao81/gitea-dynamic-runner/src/branch/main/README.md
|
- https://git.ddupan.top/panxiao81/gitea-dynamic-runner/src/branch/main/README.md
|
||||||
|
- https://git.ddupan.top/panxiao81/homelab-infra/src/branch/main/platform/dynamic-runner/README.md
|
||||||
|
- https://git.ddupan.top/panxiao81/ci-actions/src/tag/v1
|
||||||
---
|
---
|
||||||
|
|
||||||
# Gitea Dynamic Runner
|
# Gitea Dynamic Runner
|
||||||
@@ -48,13 +50,23 @@ runs-on: [self-hosted, vm]
|
|||||||
|
|
||||||
| 接口 | 执行方式 | 使用时需要理解的边界 |
|
| 接口 | 执行方式 | 使用时需要理解的边界 |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| `pod` | 动态 Kubernetes privileged Pod;workflow 使用 host executor | Docker、BuildKit、kind 等工具由 pipeline 按需 setup;这里的 host executor 指 Pod 内执行环境 |
|
| `pod` | 动态 Kubernetes privileged Pod;workflow 使用 host executor | 旧 README 要求 pipeline 按需 setup Docker;Docker 的新约定见下文。host executor 指 Pod 内执行环境 |
|
||||||
| `vm` | 动态 Cloud Hypervisor microVM | 每个任务创建独立 COW disk、seed 和 TAP,guest runner 执行一个 job 后关机并清理 |
|
| `vm` | 动态 Cloud Hypervisor microVM | 每个任务创建独立 COW disk、seed 和 TAP,guest runner 执行一个 job 后关机并清理 |
|
||||||
|
|
||||||
两种接口不能仅凭“环境一次性”就认定具有相同的隔离边界。
|
两种接口不能仅凭“环境一次性”就认定具有相同的隔离边界。
|
||||||
接入前需要结合项目设计约束和实际部署确认任务的信任范围。
|
接入前需要结合项目设计约束和实际部署确认任务的信任范围。
|
||||||
旧 homelab-infra 文档中的 `kind-microvm` 是早期记录,不作为本项目当前 workflow 接口。
|
旧 homelab-infra 文档中的 `kind-microvm` 是早期记录,不作为本项目当前 workflow 接口。
|
||||||
|
|
||||||
|
### Docker 可用性约定更新
|
||||||
|
|
||||||
|
维护者于 2026-09-21 明确:CI 后端正在修复,后续由 runner 保证 dockerd 默认可用。
|
||||||
|
这取代旧说明中要求业务 workflow 自行启动 Docker daemon 的部分;不能据此推断 BuildKit、
|
||||||
|
kind 等其他工具也默认就绪。数据库集成测试不因使用 Docker 而要求 VM。
|
||||||
|
消费方 workflow 应检查 Docker 是否可用,而不重复启动 daemon、强制 storage driver 或
|
||||||
|
覆盖 runner 提供的 endpoint。[Ayatori #6](https://git.ddupan.top/panxiao81/ayatori/pulls/6)
|
||||||
|
正在按此约定调整。此处依据维护者说明,不表示后端修复已经部署或远端集成已经通过,
|
||||||
|
`last_verified` 保持不变。
|
||||||
|
|
||||||
## 组件如何协作
|
## 组件如何协作
|
||||||
|
|
||||||
当前 README 描述的 bootstrap 路径为:
|
当前 README 描述的 bootstrap 路径为:
|
||||||
@@ -94,6 +106,16 @@ workflow 决定如何消费身份:登录哪个服务、请求哪个 audience
|
|||||||
不属于 runner 内置的业务流程。向其他服务请求 token 也遵循同一边界;
|
不属于 runner 内置的业务流程。向其他服务请求 token 也遵循同一边界;
|
||||||
runner 不应替 workflow 选择下游 role/policy,或统一代理其业务凭据交换。
|
runner 不应替 workflow 选择下游 role/policy,或统一代理其业务凭据交换。
|
||||||
|
|
||||||
|
通用实现已发布为 [`panxiao81/ci-actions@v1`](https://git.ddupan.top/panxiao81/ci-actions/src/tag/v1):
|
||||||
|
`spiffe-openbao-login` 负责获取 JWT-SVID、交换 Bao token 和退出吊销,`setup-nexus`
|
||||||
|
负责匿名配置 Ansible Galaxy、Go module proxy 与 OCI endpoint。后者读取 Nexus public
|
||||||
|
repository 时不需要 Bao 登录;发布制品应另建 repository service account 和最小权限
|
||||||
|
policy。
|
||||||
|
|
||||||
|
这些 Action 不扩大 runner 权限。runner 只提供 Node.js 20、`spire-agent` 与 Workload
|
||||||
|
API socket,workflow 明确声明 role、audience 和用途,目标服务 policy 做最终授权。
|
||||||
|
由于短期 token 会进入 Actions job 临时文件,只能在一次性 Pod/VM executor 使用。
|
||||||
|
|
||||||
因此,身份相关的环境验收应关注 Pod/VM 能否取得各自身份和是否保持隔离;
|
因此,身份相关的环境验收应关注 Pod/VM 能否取得各自身份和是否保持隔离;
|
||||||
具体服务的登录与 token 使用由对应 workflow 验收。
|
具体服务的登录与 token 使用由对应 workflow 验收。
|
||||||
本段记录设计职责,不表示获取身份的能力已经在所有 backend 完成实现或现场验证。
|
本段记录设计职责,不表示获取身份的能力已经在所有 backend 完成实现或现场验证。
|
||||||
@@ -115,6 +137,7 @@ runner 不应替 workflow 选择下游 role/policy,或统一代理其业务凭
|
|||||||
- [设计原则](https://git.ddupan.top/panxiao81/gitea-dynamic-runner/src/branch/main/docs/design-principles.md):README 指向的完整设计约束,本轮未逐篇复核。
|
- [设计原则](https://git.ddupan.top/panxiao81/gitea-dynamic-runner/src/branch/main/docs/design-principles.md):README 指向的完整设计约束,本轮未逐篇复核。
|
||||||
- [Runner 协议路线](https://git.ddupan.top/panxiao81/gitea-dynamic-runner/src/branch/main/docs/runner-protocol-roadmap.md):README 指向的长期调度路线与迁移边界,本轮未逐篇复核。
|
- [Runner 协议路线](https://git.ddupan.top/panxiao81/gitea-dynamic-runner/src/branch/main/docs/runner-protocol-roadmap.md):README 指向的长期调度路线与迁移边界,本轮未逐篇复核。
|
||||||
- [SPIFFE/SPIRE](spire.md):统一机器身份的设计定位与阶段依据。
|
- [SPIFFE/SPIRE](spire.md):统一机器身份的设计定位与阶段依据。
|
||||||
|
- [`ci-actions@v1`](https://git.ddupan.top/panxiao81/ci-actions/src/tag/v1):workflow 可复用的 SPIFFE/OpenBao 登录与 Nexus 配置 Action。
|
||||||
|
|
||||||
实际启用范围、workflow 验收、排障及消息队列约定在项目文档中维护。
|
实际启用范围、workflow 验收、排障及消息队列约定在项目文档中维护。
|
||||||
开发中的变化直接以项目文档为准,知识库不另列“启用范围待核实”任务。
|
开发中的变化直接以项目文档为准,知识库不另列“启用范围待核实”任务。
|
||||||
|
|||||||
+7
-1
@@ -2,7 +2,7 @@
|
|||||||
title: Gitea 与 Actions 使用指南
|
title: Gitea 与 Actions 使用指南
|
||||||
lifecycle: active
|
lifecycle: active
|
||||||
evidence: documented
|
evidence: documented
|
||||||
last_reviewed: 2026-09-16
|
last_reviewed: 2026-09-25
|
||||||
last_verified: null
|
last_verified: null
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -23,6 +23,12 @@ Gitea 托管 homelab 的代码、文档、issue 和 PR;Actions 执行仓库声
|
|||||||
登录成功但看不到仓库时,先确认当前账号与仓库权限;OIDC 登录本身不会赋予所有项目的管理权。
|
登录成功但看不到仓库时,先确认当前账号与仓库权限;OIDC 登录本身不会赋予所有项目的管理权。
|
||||||
已有账号应沿用原账号关联,遇到关联问题交由管理员处理,不另建同名账号规避。
|
已有账号应沿用原账号关联,遇到关联问题交由管理员处理,不另建同名账号规避。
|
||||||
|
|
||||||
|
## Hydra 实验性登录
|
||||||
|
|
||||||
|
2026-09-25 按维护者要求新增 [Hydra 人类登录 PoC](hydra.md),保留旧 Authelia 登录源。
|
||||||
|
从 <https://git.ddupan.top/user/oauth2/hydra> 发起,需 LAN/Tailscale 连通 Hydra 内网入口。
|
||||||
|
最终认证仍在 Authelia 完成;真实账号返回和权限验收结果见 Hydra 服务页。
|
||||||
|
|
||||||
## 创建与修改仓库
|
## 创建与修改仓库
|
||||||
|
|
||||||
通过页面的 New Repository 创建仓库,选择所属用户或组织、名称及可见性。
|
通过页面的 New Repository 创建仓库,选择所属用户或组织、名称及可见性。
|
||||||
|
|||||||
@@ -0,0 +1,84 @@
|
|||||||
|
---
|
||||||
|
title: Hydra 与 OIDC 上游适配器
|
||||||
|
lifecycle: experimental
|
||||||
|
evidence: live-verified
|
||||||
|
last_reviewed: 2026-09-25
|
||||||
|
last_verified: 2026-09-25
|
||||||
|
sources:
|
||||||
|
- https://git.ddupan.top/panxiao81/iam-login/commit/9cf2d235dff0cd33f98012b0a114f14a8f9bfcda
|
||||||
|
- https://git.ddupan.top/panxiao81/homelab-infra/pulls/142
|
||||||
|
- https://git.ddupan.top/panxiao81/homelab-infra/pulls/143
|
||||||
|
- 2026-09-25 部署、discovery、重定向与网络隔离检查
|
||||||
|
- 维护者于 2026-09-25 确认 Hydra 登录成功返回原 Gitea 账号且仓库权限正常
|
||||||
|
---
|
||||||
|
|
||||||
|
# Hydra 与 OIDC 上游适配器
|
||||||
|
|
||||||
|
第一轮人类登录 PoC:Hydra 负责 OIDC 签发,薄的 Login/Consent 服务通过标准 OIDC
|
||||||
|
验证上游身份。当前配置的上游是 Authelia,它继续连接 Samba AD 并执行人类 MFA。
|
||||||
|
适配器没有直接连接 LDAP,也不与 Authelia 专有认证协议绑定。
|
||||||
|
|
||||||
|
本服务独立于 Ayatori。现役 PoC 代码仍作为 homelab-infra 中的独立 Go module 保存。
|
||||||
|
下一阶段直接连接 AD 的 Java/Spring 登录服务已建立独立仓库
|
||||||
|
[iam-login](https://git.ddupan.top/panxiao81/iam-login),目前仅生成 Spring Initializr 骨架,
|
||||||
|
尚未替换现役 Go/Authelia 链路。应用代码、测试与 Native 构建发布归新仓库,环境部署归
|
||||||
|
homelab-infra;首轮实现由 [issue #1](https://git.ddupan.top/panxiao81/iam-login/issues/1) 跟踪。
|
||||||
|
完整的多主体 IAM 仍是[草案](../architecture/independent-iam-draft.md);
|
||||||
|
本轮不实现 SPIFFE 登录、agent 专用认证、动态授权或统一组迁移。
|
||||||
|
|
||||||
|
## 入口与首次使用
|
||||||
|
|
||||||
|
| 入口 | 用途 |
|
||||||
|
|---|---|
|
||||||
|
| <https://hydra.ad.ddupan.top> | Hydra 公共 OAuth2/OIDC API |
|
||||||
|
| <https://hydra-login.ad.ddupan.top> | Login/Consent 适配器,仅处理具体流程路径 |
|
||||||
|
| <https://git.ddupan.top/user/oauth2/hydra> | 从 Gitea 发起 Hydra 人类登录 |
|
||||||
|
|
||||||
|
Hydra 两个域名仅通过 LAN/Tailscale 可达,无公网 tunnel。请从 Gitea 的 `hydra`
|
||||||
|
登录源进入,在 Authelia 完成既有认证,然后返回 Gitea;旧 `authelia` 登录源保留。
|
||||||
|
Gitea 继续按原有账号关联、仓库权限与 gitea-admins 组映射执行授权。
|
||||||
|
|
||||||
|
```text
|
||||||
|
Gitea → Hydra → OIDC Login/Consent → Authelia → Samba AD
|
||||||
|
← OIDC ← 已验证的人类身份 ← OIDC callback
|
||||||
|
```
|
||||||
|
|
||||||
|
## 验证范围
|
||||||
|
|
||||||
|
2026-09-25 已现场验证:Hydra 数据库迁移成功、两个 Deployment 就绪、ESO SecretSynced、
|
||||||
|
TLS discovery 的 issuer/endpoints 正确、Flux hydra Kustomization Ready/Healthy;
|
||||||
|
HTTP 登录链路可从 Hydra 经适配器到达 Authelia 登录页。
|
||||||
|
|
||||||
|
无效 login、callback、consent 请求返回 403。Gitea Pod 能访问公共 discovery,不能
|
||||||
|
直连 Hydra admin Service;公共 HTTPS 入口的 admin API 返回 404。
|
||||||
|
|
||||||
|
Gitea 的新增登录源经 PR #143 接入,Helm revision 19 UpgradeSucceeded、Pod Ready;
|
||||||
|
登录页同时显示 hydra/authelia,从真实 Gitea 入口到达 Authelia 的整段跳转已验证。
|
||||||
|
**第一轮人类登录 PoC 已通过验收。** 维护者于 2026-09-25 实际使用 Hydra 登录入口后
|
||||||
|
确认:“已成功返回原账号,仓库权限正常”。这补齐了人类认证后的回调、原账号关联与
|
||||||
|
仓库权限验收;依据为维护者实际操作反馈,而非 agent 代为输入人类凭据。
|
||||||
|
`last_verified` 覆盖上述明确列出的检查及维护者登录反馈,不表示机器或 agent 路径已验证。
|
||||||
|
|
||||||
|
## 实现与维护
|
||||||
|
|
||||||
|
- Hydra 固定 `v26.2.0` 与镜像 digest,使用独立 hydra PostgreSQL database/role。
|
||||||
|
- 源码 `apps/hydra/login-consent`:标准 OIDC 上游适配器。校验 ID token issuer、audience、
|
||||||
|
签名、有效期和 nonce,使用 PKCE S256 与单次、cookie 绑定的 state。
|
||||||
|
- 当前只允许 Gitea client 和 openid/profile/email/groups;按请求 scope 释放 claims,
|
||||||
|
不签发 refresh token,不提供通用自动 consent。主体为上游 issuer/sub 的稳定哈希。
|
||||||
|
- 单副本短期登录事务保存在内存;重启使正在进行的登录失效,用户重新发起即可。
|
||||||
|
- Hydra admin 无 HTTPRoute,NetworkPolicy 仅允许适配器访问;维护时通过受控本地
|
||||||
|
kubectl port-forward,不对外开放 admin。
|
||||||
|
- 秘密保存在 OpenBao `kv/k8s/hydra`,ESO 投射给 Hydra/适配器和 Gitea。禁止重建
|
||||||
|
system_secret 来处理普通启动问题。
|
||||||
|
- Authelia 的新 hydra-login client 通过现有 Helm release 的增量 values 更新,保留全部
|
||||||
|
已有客户端与 two_factor 策略;Authelia 暂未由 Flux 接管。
|
||||||
|
|
||||||
|
源码、构建、claims/client 配置和恢复说明见
|
||||||
|
[Hydra README](https://git.ddupan.top/panxiao81/homelab-infra/src/branch/main/apps/hydra/README.md)。
|
||||||
|
Hydra 部署见 [PR #142](https://git.ddupan.top/panxiao81/homelab-infra/pulls/142),
|
||||||
|
Gitea 接入见 [PR #143](https://git.ddupan.top/panxiao81/homelab-infra/pulls/143)。
|
||||||
|
|
||||||
|
依赖共享 PostgreSQL、OpenBao/ESO、Authelia、Envoy、Samba DNS 与 zot。独立于 Ayatori
|
||||||
|
不等于已完成共享基础设施之外的灾备;恢复需保留 Hydra 数据库和秘密。
|
||||||
|
回退时先撤 Gitea 新登录源,沿用旧 Authelia 入口,不删除用户或原有认证配置。
|
||||||
+3
-2
@@ -14,6 +14,7 @@ SPIFFE/SPIRE 已按维护者授权补读 #34;LAN DNS 与 Authelia 已按维护
|
|||||||
|
|
||||||
| 组件 | 用途 | 记录入口 | 状态依据 | 来源 | 文档缺口 / 下一步 |
|
| 组件 | 用途 | 记录入口 | 状态依据 | 来源 | 文档缺口 / 下一步 |
|
||||||
|---|---|---|---|---|---|
|
|---|---|---|---|---|---|
|
||||||
|
| [hydra](hydra.md) | OIDC 签发与通用上游适配器,人类登录 PoC | `hydra.ad.ddupan.top / hydra-login.ad.ddupan.top` | experimental;9 月 25 日基础设施验证及维护者真实人类登录验收通过 | `apps/hydra/`、PR #142/#143 | 第一轮人类 PoC 完成;机器与 agent 接入另行推进 |
|
||||||
| [authelia](authelia.md) | 唯一主 OIDC broker、统一登录 | `auth.ddupan.top` | active;维护者于 2026-09-16 明确已在工作 | 维护者说明、`apps/authelia/` | 同步源码 README 中过时的 OIDC 阶段说明 |
|
| [authelia](authelia.md) | 唯一主 OIDC broker、统一登录 | `auth.ddupan.top` | active;维护者于 2026-09-16 明确已在工作 | 维护者说明、`apps/authelia/` | 同步源码 README 中过时的 OIDC 阶段说明 |
|
||||||
| [blocky](lan-dns.md) | LAN 主 DNS、广告过滤、分流 | `192.168.10.127:53` | 维护者说明已作为 DHCP 主 DNS,上游为路由器 | 维护者 2026-09-16 说明、`apps/blocky/README.md` | 无需逐台确认主机;旧源码说明待同步 |
|
| [blocky](lan-dns.md) | LAN 主 DNS、广告过滤、分流 | `192.168.10.127:53` | 维护者说明已作为 DHCP 主 DNS,上游为路由器 | 维护者 2026-09-16 说明、`apps/blocky/README.md` | 无需逐台确认主机;旧源码说明待同步 |
|
||||||
| [gitea](gitea.md) | 代码托管与 Actions | `git.ddupan.top` | 记录已部署 | `apps/gitea/README.md` | 已有登录、最小 CI 与 runner 选择指南 |
|
| [gitea](gitea.md) | 代码托管与 Actions | `git.ddupan.top` | 记录已部署 | `apps/gitea/README.md` | 已有登录、最小 CI 与 runner 选择指南 |
|
||||||
@@ -22,7 +23,7 @@ SPIFFE/SPIRE 已按维护者授权补读 #34;LAN DNS 与 Authelia 已按维护
|
|||||||
| [marker](marker.md) | GPU 文档转换 API | `集群内端口 8001` | 配置与部署指南;未附上线记录 | `apps/marker/README.md` | 已有转换示例;部署镜像仍为占位符 |
|
| [marker](marker.md) | GPU 文档转换 API | `集群内端口 8001` | 配置与部署指南;未附上线记录 | `apps/marker/README.md` | 已有转换示例;部署镜像仍为占位符 |
|
||||||
| netboot | PXE 与系统安装 | `192.168.10.127` | 有部署及使用记录 | `apps/netboot/README.md` | 已有客户端启动说明 |
|
| netboot | PXE 与系统安装 | `192.168.10.127` | 有部署及使用记录 | `apps/netboot/README.md` | 已有客户端启动说明 |
|
||||||
| [netbox](netbox.md) | 网络资产与地址管理评估 | `netbox.ad.ddupan.top` | 记录已部署;评估用途 | `apps/netbox/README.md` | 已有浏览与 Git 修改入口指南 |
|
| [netbox](netbox.md) | 网络资产与地址管理评估 | `netbox.ad.ddupan.top` | 记录已部署;评估用途 | `apps/netbox/README.md` | 已有浏览与 Git 修改入口指南 |
|
||||||
| [nexus](nexus.md) | CI 包代理与统一制品仓库 POC | `nexus.ad.ddupan.top` | 仅有未提交配置,尚未部署验证 | `apps/nexus/README.md` | 先验收 Ansible/Go,再补 OCI 声明式管理与 BuildKit 测试 |
|
| [nexus](nexus.md) | CI 包代理与统一制品仓库 POC | `nexus.ad.ddupan.top` | 2026-09-20 已现场验证 Ansible、Go、OCI 与 BuildKit cache | `apps/nexus/README.md` | 补 publisher account、外部 PostgreSQL 与备份恢复测试 |
|
||||||
| [openviking](openviking.md) | 上下文检索服务 | `记录端口 1933 / 8020` | 配置与部署指南;未附上线记录 | `apps/openviking/README.md` | 已有导入、任务查询、检索与原文读取指南 |
|
| [openviking](openviking.md) | 上下文检索服务 | `记录端口 1933 / 8020` | 配置与部署指南;未附上线记录 | `apps/openviking/README.md` | 已有导入、任务查询、检索与原文读取指南 |
|
||||||
| [ps3netsrv](ps3netsrv.md) | PS3 网络内容服务 | `宿主 TCP 38008;地址未记录` | Docker 运维文档记录运行 | `apps/ps3netsrv/docker-compose.yml` | 已有客户端与内容目录指南 |
|
| [ps3netsrv](ps3netsrv.md) | PS3 网络内容服务 | `宿主 TCP 38008;地址未记录` | Docker 运维文档记录运行 | `apps/ps3netsrv/docker-compose.yml` | 已有客户端与内容目录指南 |
|
||||||
| [seaweedfs](seaweedfs.md) | S3 对象存储 | `s3.ad.ddupan.top` | zot 文档记录已使用 | `apps/seaweedfs/README.md` | 已有客户端读写指南与备份边界说明 |
|
| [seaweedfs](seaweedfs.md) | S3 对象存储 | `s3.ad.ddupan.top` | zot 文档记录已使用 | `apps/seaweedfs/README.md` | 已有客户端读写指南与备份边界说明 |
|
||||||
@@ -75,7 +76,7 @@ SPIFFE/SPIRE 已按维护者授权补读 #34;LAN DNS 与 Authelia 已按维护
|
|||||||
|
|
||||||
- [e5renew、research-auto](external-consumers.md):GitHub 上的外部消费者,不属于 homelab 基础设施;仅保留归属入口。
|
- [e5renew、research-auto](external-consumers.md):GitHub 上的外部消费者,不属于 homelab 基础设施;仅保留归属入口。
|
||||||
- [Gitea Dynamic Runner](gitea-dynamic-runner.md):正在积极开发的动态 Pod/VM runner,原名 gitea-microvm-runner;具体启用范围、调度和队列约定以项目文档为准。
|
- [Gitea Dynamic Runner](gitea-dynamic-runner.md):正在积极开发的动态 Pod/VM runner,原名 gitea-microvm-runner;具体启用范围、调度和队列约定以项目文档为准。
|
||||||
- [PostgreSQL Tenant Operator](postgresql-tenant-operator.md):计划中的 DBaaS 中间层,管理共享实例中的数据库与账号;README 记录为 API 骨架阶段,不代表服务已上线。
|
- [PostgreSQL Tenant Operator](postgresql-tenant-operator.md):计划中的 DBaaS 中间层,管理共享实例中的数据库与账号;现转入 Ayatori Database,采用独立 Database 资源与 Tenant 申请;设计修订不代表服务上线。
|
||||||
- [workload-sts](../architecture/workload-sts-history.md):已归档的早期机器身份方案;停止开发、不部署 PoC,由 SPIFFE/SPIRE 替代。
|
- [workload-sts](../architecture/workload-sts-history.md):已归档的早期机器身份方案;停止开发、不部署 PoC,由 SPIFFE/SPIRE 替代。
|
||||||
- Backstage:规划中的服务目录与文档入口;本轮未发现独立部署目录。
|
- Backstage:规划中的服务目录与文档入口;本轮未发现独立部署目录。
|
||||||
- Keycloak、Casdoor:`archive/` 下有明确退役记录,替代入口为 Authelia。
|
- Keycloak、Casdoor:`archive/` 下有明确退役记录,替代入口为 Authelia。
|
||||||
|
|||||||
+43
-20
@@ -1,24 +1,27 @@
|
|||||||
---
|
---
|
||||||
title: Nexus Repository POC
|
title: Nexus Repository POC
|
||||||
lifecycle: experimental
|
lifecycle: experimental
|
||||||
evidence: configuration
|
evidence: live-verified
|
||||||
last_reviewed: 2026-09-18
|
last_reviewed: 2026-09-20
|
||||||
last_verified: null
|
last_verified: 2026-09-20
|
||||||
sources: []
|
sources: []
|
||||||
---
|
---
|
||||||
|
|
||||||
# Nexus Repository POC
|
# Nexus Repository POC
|
||||||
|
|
||||||
Nexus Repository Community Edition POC 计划为一次性 CI runner 提供共享的 Ansible Galaxy、
|
Nexus Repository Community Edition POC 为一次性 CI runner 提供共享的 Ansible Galaxy、
|
||||||
Go Modules 与 OCI/BuildKit 缓存,减少每个 job 从公网重新下载依赖的时间。当前只有未提交的
|
Go Modules、OCI 与 BuildKit 缓存,减少每个 job 从公网重新下载依赖的时间。GitOps 已部署,
|
||||||
GitOps 与 Terraform 配置,尚未部署、初始化或完成端到端验证;现役 zot 保持不变。
|
上述代理与缓存链路均已完成现场验证;数据库和备份仍是 POC,现役 zot 保持不变。
|
||||||
|
|
||||||
## 从哪里使用
|
## 从哪里使用
|
||||||
|
|
||||||
- 计划入口:`https://nexus.ad.ddupan.top`,仅 LAN。
|
- 入口:`https://nexus.ad.ddupan.top`,仅 LAN。
|
||||||
- 人类管理:POC 首次使用本地管理员;后续正式化优先使用 Samba AD LDAP。Community
|
- 人类管理:当前使用本地管理员,凭据受管于 OpenBao `kv/infra/nexus`;尚未配置 LDAP。
|
||||||
|
后续正式化优先使用 Samba AD LDAP。Community
|
||||||
Edition 不提供原生 OIDC/SAML,因此不能把 Authelia OIDC 写成已支持入口。
|
Edition 不提供原生 OIDC/SAML,因此不能把 Authelia OIDC 写成已支持入口。
|
||||||
- CI 读取:目标是对 public/group repository 开放 LAN 匿名只读。
|
- CI 读取:`ansible-public`、Ansible 返回制品 URL 使用的成员 proxy 与 `go-public` 已开放
|
||||||
|
LAN 匿名只读;`oci-public` 与其 `oci-proxy` 成员同样匿名只读,`oci-hosted` 不开放匿名。
|
||||||
|
Terraform 明确收窄权限,未使用默认的全仓库匿名角色。
|
||||||
- CI 发布:目标是少量按信任边界划分的本地 service account,凭据由 OpenBao 保存;
|
- CI 发布:目标是少量按信任边界划分的本地 service account,凭据由 OpenBao 保存;
|
||||||
当前 POC 尚未创建 publisher 或授予写权限。
|
当前 POC 尚未创建 publisher 或授予写权限。
|
||||||
|
|
||||||
@@ -45,8 +48,9 @@ ansible-galaxy collection install -r collections/requirements.yml \
|
|||||||
-p .ansible/collections
|
-p .ansible/collections
|
||||||
```
|
```
|
||||||
|
|
||||||
预期首次请求从上游获取 collection,第二次在全新 runner 中由 Nexus 返回已缓存内容。
|
2026-09-20 使用两个全新客户端目录下载 `community.general:11.2.0`:冷缓存 8.49 秒、
|
||||||
该预期尚未现场验证;验证时同时记录冷/热耗时和 Nexus 日志,不能只看命令退出码。
|
热缓存 1.89 秒,两份 tarball SHA-256 一致。Nexus Ansible format 返回的制品 URL 指向
|
||||||
|
成员 proxy,因此匿名角色必须同时具备 group 与该 proxy 的只读权限。
|
||||||
|
|
||||||
Go POC 使用:
|
Go POC 使用:
|
||||||
|
|
||||||
@@ -57,15 +61,30 @@ GOPROXY=https://nexus.ad.ddupan.top/repository/go-public/ go mod download
|
|||||||
私有 module 的 `GOPRIVATE`、认证和 fallback 需由实际 workflow 明确配置,不能把内部 module
|
私有 module 的 `GOPRIVATE`、认证和 fallback 需由实际 workflow 明确配置,不能把内部 module
|
||||||
路径意外发送到公共 proxy。
|
路径意外发送到公共 proxy。
|
||||||
|
|
||||||
|
2026-09-20 使用两个全新 Go module cache 下载 `golang.org/x/[email protected]`:冷缓存
|
||||||
|
2.92 秒、热缓存 1.51 秒,均通过 `go-public` 匿名入口完成。
|
||||||
|
|
||||||
|
OCI 使用 path-based routing。公共镜像从
|
||||||
|
`nexus.ad.ddupan.top/oci-public/<namespace>/<image>:<tag>` 匿名拉取;写入使用
|
||||||
|
`nexus.ad.ddupan.top/oci-hosted/<namespace>/<image>:<tag>` 并要求认证。2026-09-20 验证:
|
||||||
|
|
||||||
|
- Alpine 代理冷拉 4.75 秒、热拉 0.80 秒,digest 一致;
|
||||||
|
- hosted push/pull 成功,匿名 pull 返回 401;
|
||||||
|
- amd64/arm64 OCI image index 可 push 与 inspect;
|
||||||
|
- Helm OCI chart push/pull digest 及本地 tarball SHA-256 一致;
|
||||||
|
- Cosign 签名和公钥验证成功,OCI 1.1 referrers 返回一个 Sigstore bundle;
|
||||||
|
- BuildKit `mode=max` registry cache 成功导出;销毁首个 builder 后,新 builder 从 Nexus
|
||||||
|
导入缓存,两个 `RUN` step 均命中 `CACHED`。
|
||||||
|
|
||||||
## POC 限制
|
## POC 限制
|
||||||
|
|
||||||
- 单副本、50 GiB OpenEBS RWO PVC,资源上限 2 CPU / 4 GiB。
|
- 单副本、50 GiB OpenEBS RWO PVC,资源上限 2 CPU / 4 GiB。
|
||||||
- 当前使用 embedded H2,仅用于 POC;正式保存唯一制品前迁移至外部 PostgreSQL。
|
- 当前使用 embedded H2,仅用于 POC;正式保存唯一制品前迁移至外部 PostgreSQL。
|
||||||
- 当前没有独立备份或恢复验收,PVC 不能被视为备份。
|
- 当前没有独立备份或恢复验收,PVC 不能被视为备份。
|
||||||
- Terraform provider 已声明 Ansible 与 Go proxy/group;provider 1.17.0 尚未暴露 Nexus
|
- Terraform provider 管理 Ansible/Go、Realm 与权限;provider 1.17.0 尚未暴露 Nexus 3.94
|
||||||
3.94 新增的原生 OCI repository resource。
|
新增的原生 OCI repository resource,因此 OCI 仓库由实例 Swagger 固定 schema 的幂等 REST
|
||||||
- OCI 必须在补齐声明式 REST/provider 管理后再测试,不保留仅通过 UI 创建的长期配置。
|
调和器管理,不通过 UI 留下非声明式配置。
|
||||||
- BuildKit registry cache 有待单独验证,普通 OCI image push 成功不能替代该测试。
|
- 尚未创建正式 publisher service account;本轮写入测试临时使用受管管理员凭据。
|
||||||
|
|
||||||
## 出问题时
|
## 出问题时
|
||||||
|
|
||||||
@@ -83,8 +102,8 @@ WAN,不以重建 PVC 作为排障手段。
|
|||||||
|
|
||||||
## 运维入口
|
## 运维入口
|
||||||
|
|
||||||
实现入口为 homelab-infra 工作区中尚未提交的 `apps/nexus/` 与
|
实现入口为 homelab-infra 已合并的 `apps/nexus/` 与
|
||||||
`clusters/homelab/apps/nexus.yaml`。DNS 期望记录位于 `infrastructure/dns/records.yml`。
|
`clusters/homelab/apps/nexus.yaml`。DNS 记录位于 `infrastructure/dns/records.yml`。
|
||||||
源码 README 维护部署、初始化、Terraform、验收与恢复边界。
|
源码 README 维护部署、初始化、Terraform、验收与恢复边界。
|
||||||
|
|
||||||
部署依赖 Envoy Gateway、OpenEBS 和 LAN DNS;Terraform 管理依赖 Nexus 初始化后的受限管理
|
部署依赖 Envoy Gateway、OpenEBS 和 LAN DNS;Terraform 管理依赖 Nexus 初始化后的受限管理
|
||||||
@@ -92,6 +111,10 @@ WAN,不以重建 PVC 作为排障手段。
|
|||||||
|
|
||||||
## 当前状态与证据
|
## 当前状态与证据
|
||||||
|
|
||||||
2026-09-18 已准备未提交的 Kubernetes、Flux、DNS 与 Terraform POC 配置,并完成本地渲染和
|
2026-09-20 现场确认 Flux Kustomization Ready、Nexus Pod Ready、50 GiB PVC Bound,HTTPRoute
|
||||||
schema 检查后方可交付;未访问现场、未部署 Nexus、未申请凭据,也未修改或迁移 zot。
|
经 HTTPS 状态 API 返回 200;Samba DNS apply 后复查 `changed=0`。Terraform 已创建 Ansible、
|
||||||
后续状态必须以合并记录、Flux 状态和客户端冷/热缓存验收分别更新,不能仅凭本页推断上线。
|
Go proxy/group、OCI Bearer Token Realm 和最小匿名只读角色,二次 plan 为 `No changes`;OCI
|
||||||
|
REST 调和器复查三个仓库均为 `in sync`。Ansible、Go、OCI、Helm、Cosign/referrers 与
|
||||||
|
BuildKit cache 的上述客户端测试均成功。实现来源为 homelab-infra PR #103、#108 与 #109。
|
||||||
|
尚未验证备份恢复或外部 PostgreSQL,也未创建正式 publisher account、修改或迁移 zot,
|
||||||
|
因此本页的 `live-verified` 仅覆盖已明确列出的 POC 范围。
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
title: PostgreSQL Tenant Operator(计划中的 DBaaS)
|
title: PostgreSQL Tenant Operator(计划中的 DBaaS)
|
||||||
lifecycle: planned
|
lifecycle: planned
|
||||||
evidence: documented
|
evidence: documented
|
||||||
last_reviewed: 2026-09-16
|
last_reviewed: 2026-09-25
|
||||||
last_verified: null
|
last_verified: null
|
||||||
sources:
|
sources:
|
||||||
- https://git.ddupan.top/panxiao81/postgresql-tenant-operator
|
- https://git.ddupan.top/panxiao81/postgresql-tenant-operator
|
||||||
@@ -26,16 +26,119 @@ homelab 资源有限,为每个应用维护一套数据库会浪费资源。绝
|
|||||||
|
|
||||||
## 当前进度
|
## 当前进度
|
||||||
|
|
||||||
2026-09-16 查阅[项目 README](https://git.ddupan.top/panxiao81/postgresql-tenant-operator/src/branch/main/README.md)
|
维护者于 2026-09-20 提供的阶段状态如下:
|
||||||
与架构文档时,项目记录为 **API 骨架阶段,尚未对 PostgreSQL 或 OpenBao 执行写操作**。
|
|
||||||
已批准的设计合同不等于已经实现的功能,本文不表示 DBaaS 已上线。
|
- 已合并 Instance 的 Endpoint、凭据引用、身份/版本、定义与观测目标等值对象;
|
||||||
项目首页还注明 `config/samples` 保留旧 API 骨架,不能将其直接当作最终使用接口。
|
- 已合并扩展支持能力模型,以及 Instance 最小生命周期与状态 checkpoint;
|
||||||
|
- CI PR #14 已合并:lint/test 使用 Pod runner,e2e 使用 VM runner;当前没有开放 PR;
|
||||||
|
- 上述领域基础尚未接入实际运行链路,不能理解为新设计已经可用;
|
||||||
|
- 仍缺完整 Ready 判定、Kubernetes Secret 管理凭据与连接刷新、应用层/数据库 adapter/controller
|
||||||
|
接入、CRD 与批准规格对齐及集成验证;
|
||||||
|
- Tenant 的完整创建、凭据交付和 Retain/Delete 生命周期仍未完成;
|
||||||
|
- 旧运行链路仍包含直接读取 OpenBao 管理凭据的逻辑。
|
||||||
|
|
||||||
|
本地暂停在 `feature/instance-extension-observations`,有两个未提交文件,实现 Instance 接收扩展
|
||||||
|
观测及其测试。该部分此前只通过领域包 lint,未运行本地测试、未提交、未推送;分支仍基于 #13,
|
||||||
|
未包含刚合并的 CI 改动。该工作区必须原样保留,不能作为已合并能力或迁移来源。
|
||||||
|
|
||||||
|
已批准的设计合同不等于已经实现的功能,本文不表示 DBaaS 已上线。生成的 CRD/API 与 samples
|
||||||
|
仍可能落后于批准规格,不能直接作为最终使用接口。
|
||||||
|
|
||||||
|
2026-09-20,维护者决定将该项目合并为 Ayatori 的 Database 领域模块。已批准的规格、领域模型、
|
||||||
|
状态机和测试继续作为迁移合同;不会把独立仓库的 manager、生成文件和当前工作树整仓复制。
|
||||||
|
首个迁移基线使用包含已合并 Instance 领域基础与 CI #14 的最新 main commit,再按领域层、API、
|
||||||
|
adapter 和 controller 的纵向切片进入 Ayatori;暂停中的两个未提交文件不进入首个切片。旧仓库
|
||||||
|
在迁移完成并验收前仍是现有设计与代码的来源,本决定不表示 DBaaS 已上线。
|
||||||
|
|
||||||
|
维护者同时确认目前没有可用版本,也没有 PostgreSQL 实例或 Tenant 被该 operator 托管。因此
|
||||||
|
合并不承担旧运行链路、旧 CRD/status 或数据的兼容责任:直接读取 OpenBao 管理凭据的旧路径可以
|
||||||
|
删除,未投入使用且落后于规范的 CRD/samples/实现结构不保留兼容层。
|
||||||
|
|
||||||
|
2026-09-20 的迁移决定原要求整体沿用源设计。2026-09-24,维护者明确批准下述资源/申请
|
||||||
|
分离修订,替代 registry、自动所有权恢复与原 Retain 合同;管理凭据、TLS、OpenBao/ESO 和
|
||||||
|
其他适用安全边界继续保留。这是显式设计修订,不是已完成运行验证。
|
||||||
|
|
||||||
|
原 `database.ddupan.top/v1alpha1` API group 也不保留。Ayatori 中的目标 API 使用
|
||||||
|
`database.ayatori.ddupan.top/v1alpha1`,并纳入统一的 `api/database/v1alpha1` 与 Database 模块
|
||||||
|
结构;由于不存在已部署消费者,不建立 alias 或 conversion 入口。
|
||||||
|
|
||||||
|
合并边界记录在 Ayatori PR
|
||||||
|
[#3 的 ADR-0008](https://git.ddupan.top/panxiao81/ayatori/src/commit/33fb3ec9725dca8a10f2ad4bcd71cf83413932ee/docs/decisions/0008-merge-postgresql-tenant-operator.md);
|
||||||
|
该决定已于 2026-09-21 合并 main,链接固定到合并版本;设计合并不表示 Database 实现已完成。
|
||||||
|
|
||||||
|
## 当前资源模型(2026-09-24 已确认)
|
||||||
|
|
||||||
|
参考 [Kubernetes 官方 PV/PVC](https://kubernetes.io/docs/concepts/storage/persistent-volumes/) 的
|
||||||
|
资源/申请分离:Instance 是资源来源与管理入口;独立 Database 类似 PV;Tenant 是类似 PVC
|
||||||
|
的用户申请。Instance 一对多 Database,每个 Database 同时最多绑定一个 Tenant。
|
||||||
|
|
||||||
|
Database 自带 instanceRef,手工登记不依赖 Tenant;动态申请由 Tenant 选择 Instance,
|
||||||
|
引用已有 Database 时从资源获取 Instance,不重复声明另一份来源。
|
||||||
|
|
||||||
|
Retain 在申请删除后保留 Database 对象和外部数据,进入 Released,等待管理员处理数据、
|
||||||
|
旧访问权限和凭据后显式授权重新绑定。已有数据库可由管理员显式登记导入,初始验证不改密、
|
||||||
|
不改 owner;发现未知同名资源仍报 Conflict。回收策略位于资源侧,Database 不随 Tenant GC。
|
||||||
|
|
||||||
|
撤销 PostgreSQL ownership registry 和任意 status 丢失自动重建所有权的要求。CR 记录持久
|
||||||
|
身份、绑定和进度;普通失败幂等重试,无法确认外部创建结果时报告足够人工诊断的冲突。
|
||||||
|
不引入 CSI 协议、存储调度或通用 Claim。绑定字段和凭据重新交付协议仍需细化。
|
||||||
|
|
||||||
|
2026-09-25,维护者确认第一版 Database 的生命周期边界包含一个数据库、一个兼任 owner
|
||||||
|
的登录账号及其应用凭据;Tenant 负责申请与交付。不预留多账号字段或新增 Role/Credential
|
||||||
|
CRD;一库多账号若有实际需求,再通过后续 API 版本演进。此决定不扩大导入管理授权。
|
||||||
|
同日确认 Instance 与 Database 为 cluster-scoped,Tenant 为 namespaced。Database 由平台
|
||||||
|
管理员管理,不属于应用 namespace,也不需要资源专用 namespace。Tenant 按名称引用
|
||||||
|
Database,资源侧绑定记录包含 Tenant namespace/name/UID;普通申请者不能自行修改回收
|
||||||
|
策略或将 Released 资源重新开放。具体字段与 RBAC 规则仍待细化。
|
||||||
|
|
||||||
|
绑定采用资源侧先写:动态 Database 名称由 Tenant UID 确定;先写 Database 的 Tenant
|
||||||
|
namespace/name/UID,再写 Tenant status 的 Database name/UID,双向一致后才供应或交付。
|
||||||
|
API 版本冲突重新读取判断,已被其他 Tenant 占用则报冲突;资源侧成功、申请侧失败由
|
||||||
|
reconcile 核对身份后补齐,不回滚资源侧绑定。绑定不等于 Ready;外部数据库创建结果
|
||||||
|
不确定仍交给人工处理,不增加事务队列或 registry。该顺序由维护者于同日确认。
|
||||||
|
|
||||||
|
同日进一步明确:不增加允许绑定名单或逐 Tenant 审批,有权创建 Tenant 的申请者可显式
|
||||||
|
申请未绑定且可用的 Database;Released 仍需管理员处理旧访问后重新开放。
|
||||||
|
回收策略默认 Retain,资源管理者可在删除流程开始前修改;进入删除流程后固定,指定
|
||||||
|
Delete 即为删除授权,不加第二次审批。动态凭据路径按 Database UID 确定,导入显式关联
|
||||||
|
已有凭据位置;Released 不自动改密,重新开放前由管理员处理旧访问。
|
||||||
|
对应 Ayatori `docs/database/specification.md`、`domain-model.md` 与 `api-reference.md`
|
||||||
|
已推送为 [7e9e8e8](https://git.ddupan.top/panxiao81/ayatori/commit/7e9e8e828bfcbdc8d4e2fcb6bc3d13727712a82c),
|
||||||
|
已随 [Ayatori PR #10](https://git.ddupan.top/panxiao81/ayatori/pulls/10) 通过三项 CI 并合并 main,
|
||||||
|
合并版本为 [55b269c](https://git.ddupan.top/panxiao81/ayatori/commit/55b269ce2eb40f6b44c1afe838389093efdac98e)。
|
||||||
|
|
||||||
|
Ayatori main 已加入三资源 Go 类型、生成 CRD、Scheme 注册与 YAML 示例,尚未部署为业务服务。
|
||||||
|
`make test` 使用真实 API server 验证作用域、默认值、声明
|
||||||
|
校验、status 隔离、绑定写入版本冲突与示例。绑定 controller 已接入 manager:动态资源按
|
||||||
|
Tenant UID 命名,先写资源侧绑定,再回读补齐 Tenant status;进入 Binding 后固定申请目标,
|
||||||
|
拒绝 Released、旧 UID 和陈旧 Ready 观察。真实 API server 覆盖部分写入故障后新 reconciler
|
||||||
|
补齐、双 Tenant 竞争及实际 manager 在生成 RBAC 角色下的 watch;绑定角色不能读取 Secret。
|
||||||
|
Bound 仍为 Ready=False,尚无供应或凭据投射。已有 finalizer 保护,但删除清理未实现:
|
||||||
|
Tenant 删除保持 DeletionPending,资源和申请的 finalizer 不自动移除,不能视为可用的
|
||||||
|
Retain/Delete 生命周期或部署为业务 DBaaS。具体字段和未完成边界见
|
||||||
|
源码 [API 合同](https://git.ddupan.top/panxiao81/ayatori/src/commit/7e9e8e828bfcbdc8d4e2fcb6bc3d13727712a82c/docs/database/api-reference.md)
|
||||||
|
的“当前 API 切片”。
|
||||||
|
|
||||||
|
绑定代码按维护者要求分层:领域层负责纯规则,application service 协调绑定步骤和回读,
|
||||||
|
Kubernetes adapter 负责 CR 映射、版本保护及 Conditions/status/finalizer 呈现,controller
|
||||||
|
只连接事件、用例与重试。service 和领域层不依赖 Kubernetes 类型,不新增通用事务或
|
||||||
|
Repository 框架;该重构不扩展上述运行能力。对应源码 `docs/database/domain-model.md`
|
||||||
|
已随上述提交保存,见 [领域模型](https://git.ddupan.top/panxiao81/ayatori/src/commit/7e9e8e828bfcbdc8d4e2fcb6bc3d13727712a82c/docs/database/domain-model.md)。
|
||||||
|
|
||||||
|
本轮依据为维护者设计讨论和 Ayatori 已推送的
|
||||||
|
[ADR-0009](https://git.ddupan.top/panxiao81/ayatori/src/commit/6db8a495fb9f8981d336c9e6288253628ab478b6/docs/decisions/0009-database-resource-and-claim.md)、
|
||||||
|
[系统规格](https://git.ddupan.top/panxiao81/ayatori/src/commit/6db8a495fb9f8981d336c9e6288253628ab478b6/docs/database/specification.md)。
|
||||||
|
registry 实现、迁移与 Instance 初始化依赖已在
|
||||||
|
[23a2d81](https://git.ddupan.top/panxiao81/ayatori/commit/23a2d81b5041f8589baab1c234136cd2c701bb06)
|
||||||
|
撤除;本地测试与真实 PostgreSQL/API server 集成验证通过,但新三资源链路尚未完成。
|
||||||
|
上述设计与撤除已随 [PR #9](https://git.ddupan.top/panxiao81/ayatori/pulls/9) 合并 main,
|
||||||
|
合并版本为 `347a667`;不表示三资源链路已实现或部署。见 [同步记录](../verification.md#ayatori-database-设计修订同步)。
|
||||||
|
|
||||||
## 计划中的使用方式
|
## 计划中的使用方式
|
||||||
|
|
||||||
1. 平台管理员通过 `PostgreSQLInstance` 注册已有 PostgreSQL 实例及管理连接。
|
1. 平台管理员通过 `PostgreSQLInstance` 注册已有 PostgreSQL 实例及管理连接。
|
||||||
2. 下游以 namespaced `PostgreSQLTenant` 声明所需 database、login owner 和扩展。
|
2. 下游以 namespaced `PostgreSQLTenant` 申请数据库,或显式引用管理员登记的 Database。
|
||||||
3. controller 校验所有权与冲突,幂等创建凭据、role、database 和授权等资源。
|
3. controller 建立独立 Database 记录与排他绑定,供应或验证资源;未知同名及不确定创建报冲突。
|
||||||
4. 应用凭据以 OpenBao KV 为事实来源,由 ESO 投射为 Kubernetes Secret。
|
4. 应用凭据以 OpenBao KV 为事实来源,由 ESO 投射为 Kubernetes Secret。
|
||||||
非 Kubernetes 消费者使用提供的 OpenBao API URL,并通过自身授权获取凭据。
|
非 Kubernetes 消费者使用提供的 OpenBao API URL,并通过自身授权获取凭据。
|
||||||
5. ESO 投射成功且应用凭据实际登录成功后,Tenant 才能进入 Ready。
|
5. ESO 投射成功且应用凭据实际登录成功后,Tenant 才能进入 Ready。
|
||||||
@@ -45,9 +148,30 @@ GitOps、Terraform、kubectl 和未来 Backstage 计划共用这套 Kubernetes A
|
|||||||
|
|
||||||
## 职责边界
|
## 职责边界
|
||||||
|
|
||||||
|
2026-09-25 维护者确认第一版 PostgreSQL 管理账号使用原生非 superuser 方案,具有
|
||||||
|
CREATEDB/CREATEROLE,不引入 SECURITY DEFINER 接口。扩展安装按实际权限逐请求验证,
|
||||||
|
可用列表不等于任意扩展均可安装;基础管理能力不授予导入或接管他人资源的权限。
|
||||||
|
这项决定沿用原安全文档的非 superuser 原则,并明确了此前未选定的实施方式。
|
||||||
|
Instance 观测、Secret watch 与删除引用保护已在 CI 通过后,经维护者批准合并
|
||||||
|
[PR #11](https://git.ddupan.top/panxiao81/ayatori/pulls/11),main 合并提交为
|
||||||
|
[f4deb98](https://git.ddupan.top/panxiao81/ayatori/commit/f4deb98a7fcf61fb97ce52bbf190beb816d0141a)。
|
||||||
|
权限矩阵、启用方式和测试边界以该提交的
|
||||||
|
[模块说明](https://git.ddupan.top/panxiao81/ayatori/src/commit/f4deb98a7fcf61fb97ce52bbf190beb816d0141a/docs/database/README.md)
|
||||||
|
与安全文档为准;合并不表示部署或完整供应链路已完成。
|
||||||
|
|
||||||
|
后续应用凭据存储切片已签名提交为
|
||||||
|
[f6bb9e4](https://git.ddupan.top/panxiao81/ayatori/commit/f6bb9e4599afca49a9cdc3d40789e11d118db9c5),
|
||||||
|
由 [PR #12](https://git.ddupan.top/panxiao81/ayatori/pulls/12) 跟踪,尚未合并。
|
||||||
|
复用 OpenBao 官方 Go SDK 的 KV v2 CAS=0、回读七键与版本,禁止覆盖
|
||||||
|
或自动认领;明确权限拒绝等待依赖恢复,写入结果不确定则停止并人工处理。本地真实
|
||||||
|
OpenBao 测试已覆盖并发、软删除、固定前缀权限和响应丢失,尚未接入 manager、Kubernetes
|
||||||
|
auth、Database 供应或 ESO。源码模块文档与 wiki 已关联,见
|
||||||
|
[同步记录](../verification.md)。
|
||||||
|
|
||||||
- operator 管理实例内的租户资源,不运行 PostgreSQL/OpenBao,也不管理 VM、存储、备份或 OpenBao PKI。
|
- operator 管理实例内的租户资源,不运行 PostgreSQL/OpenBao,也不管理 VM、存储、备份或 OpenBao PKI。
|
||||||
- 应用密码写入 OpenBao,不进入 CR、Event 或日志;ESO 负责向 Kubernetes 消费者投射。
|
- 应用密码写入 OpenBao,不进入 CR、Event 或日志;ESO 负责向 Kubernetes 消费者投射。
|
||||||
- 默认删除策略为 `Retain`,删除声明不会默认删除业务数据;显式 `Delete` 需重新校验所有权。
|
- Database 默认 Retain;删除 Tenant 保留资源对象与数据,Released 不自动重新分配。
|
||||||
|
- 资源侧 Delete 需明确授权、finalizer 与实际管理范围检查,导入不隐含删除或改密授权。
|
||||||
- 遇到未知 database/role 等资源报告 Conflict,不能自动接管、覆盖或删除;现有数据库迁移需遵循迁移合同。
|
- 遇到未知 database/role 等资源报告 Conflict,不能自动接管、覆盖或删除;现有数据库迁移需遵循迁移合同。
|
||||||
- namespace 是 Kubernetes 身份与 RBAC 边界;database/role 名称在一个 PostgreSQL Instance 内仍全局唯一。
|
- namespace 是 Kubernetes 身份与 RBAC 边界;database/role 名称在一个 PostgreSQL Instance 内仍全局唯一。
|
||||||
|
|
||||||
@@ -63,5 +187,6 @@ GitOps、Terraform、kubectl 和未来 Backstage 计划共用这套 Kubernetes A
|
|||||||
- [部署](https://git.ddupan.top/panxiao81/postgresql-tenant-operator/src/branch/main/docs/deployment.md)与[安全](https://git.ddupan.top/panxiao81/postgresql-tenant-operator/src/branch/main/docs/security.md):依赖和权限。
|
- [部署](https://git.ddupan.top/panxiao81/postgresql-tenant-operator/src/branch/main/docs/deployment.md)与[安全](https://git.ddupan.top/panxiao81/postgresql-tenant-operator/src/branch/main/docs/security.md):依赖和权限。
|
||||||
- [迁移](https://git.ddupan.top/panxiao81/postgresql-tenant-operator/src/branch/main/docs/migration.md)与[运维](https://git.ddupan.top/panxiao81/postgresql-tenant-operator/src/branch/main/docs/operations.md):现有数据库、删除和恢复合同。
|
- [迁移](https://git.ddupan.top/panxiao81/postgresql-tenant-operator/src/branch/main/docs/migration.md)与[运维](https://git.ddupan.top/panxiao81/postgresql-tenant-operator/src/branch/main/docs/operations.md):现有数据库、删除和恢复合同。
|
||||||
|
|
||||||
具体实现进度回到[项目仓库](https://git.ddupan.top/panxiao81/postgresql-tenant-operator)查询,
|
迁移前的具体实现进度仍回到[项目仓库](https://git.ddupan.top/panxiao81/postgresql-tenant-operator)
|
||||||
后续查询前先向维护者对齐当前工作与 ticket。本页保留设计定位和带日期的阶段摘要。
|
查询;迁移后的实现与发布进度转到 Ayatori。后续查询前先向维护者对齐当前工作与 ticket。
|
||||||
|
本页保留设计定位和带日期的阶段摘要。
|
||||||
|
|||||||
+12
-3
@@ -2,11 +2,12 @@
|
|||||||
title: SPIFFE/SPIRE 使用入口与阶段状态
|
title: SPIFFE/SPIRE 使用入口与阶段状态
|
||||||
lifecycle: active
|
lifecycle: active
|
||||||
evidence: documented
|
evidence: documented
|
||||||
last_reviewed: 2026-09-16
|
last_reviewed: 2026-09-21
|
||||||
last_verified: null
|
last_verified: null
|
||||||
sources:
|
sources:
|
||||||
- https://git.ddupan.top/panxiao81/homelab-infra/issues/34
|
- https://git.ddupan.top/panxiao81/homelab-infra/issues/34
|
||||||
- https://git.ddupan.top/panxiao81/homelab-infra/src/branch/main/platform/spire/RUNBOOK.md
|
- https://git.ddupan.top/panxiao81/homelab-infra/src/branch/main/platform/spire/RUNBOOK.md
|
||||||
|
- https://git.ddupan.top/panxiao81/ci-actions/src/tag/v1/spiffe-openbao-login
|
||||||
---
|
---
|
||||||
|
|
||||||
# SPIFFE/SPIRE
|
# SPIFFE/SPIRE
|
||||||
@@ -55,7 +56,7 @@ SPIFFE/SPIRE 取代了原计划中由 **workload-sts 承担统一 IAM 平台**
|
|||||||
维护者指定以 [homelab-infra #34](https://git.ddupan.top/panxiao81/homelab-infra/issues/34)
|
维护者指定以 [homelab-infra #34](https://git.ddupan.top/panxiao81/homelab-infra/issues/34)
|
||||||
为主要状态依据。2026-09-16 查阅时 issue 为 open,最后更新时间为
|
为主要状态依据。2026-09-16 查阅时 issue 为 open,最后更新时间为
|
||||||
2026-09-14 12:43:54 UTC;本页是该次查阅的阶段摘要,不替代 ticket 的动态进度。
|
2026-09-14 12:43:54 UTC;本页是该次查阅的阶段摘要,不替代 ticket 的动态进度。
|
||||||
本轮没有访问运行环境,以下完成结论均为 ticket 记录。
|
基础设施阶段结论来自 ticket;2026-09-21 另对下表中的可复用 Action 做了现场验证。
|
||||||
|
|
||||||
| 已完成阶段 | 记录依据 |
|
| 已完成阶段 | 记录依据 |
|
||||||
|---|---|
|
|---|---|
|
||||||
@@ -63,6 +64,7 @@ SPIFFE/SPIRE 取代了原计划中由 **workload-sts 承担统一 IAM 平台**
|
|||||||
| OIDC HTTPS、DNS、TLS、discovery/JWKS 验证;OpenBao JWT backend/role/policy 创建 | [9 月 14 日端到端验收](https://git.ddupan.top/panxiao81/homelab-infra/issues/34#issuecomment-301),对应 #52、#53 |
|
| OIDC HTTPS、DNS、TLS、discovery/JWKS 验证;OpenBao JWT backend/role/policy 创建 | [9 月 14 日端到端验收](https://git.ddupan.top/panxiao81/homelab-infra/issues/34#issuecomment-301),对应 #52、#53 |
|
||||||
| 测试 Pod 获得 aud=openbao 的 JWT-SVID,交换为仅含 spire-poc policy、TTL 300 秒的 Bao token;lookup-self/revoke-self 验证完成 | 同上;临时 workload 与 registration entries 已清理,最终 Terraform plan 为 No changes |
|
| 测试 Pod 获得 aud=openbao 的 JWT-SVID,交换为仅含 spire-poc policy、TTL 300 秒的 Bao token;lookup-self/revoke-self 验证完成 | 同上;临时 workload 与 registration entries 已清理,最终 Terraform plan 为 No changes |
|
||||||
| 新 workload 接入、故障排查和恢复说明已合并 | [9 月 14 日文档记录](https://git.ddupan.top/panxiao81/homelab-infra/issues/34#issuecomment-308),对应 #54 |
|
| 新 workload 接入、故障排查和恢复说明已合并 | [9 月 14 日文档记录](https://git.ddupan.top/panxiao81/homelab-infra/issues/34#issuecomment-308),对应 #54 |
|
||||||
|
| `spiffe-openbao-login@v1` 使用本机 Workload API 获取 JWT-SVID、交换短期 token 并在 post 阶段 `revoke-self` | 2026-09-21 现场验证;Action 未向 stdout/stderr 输出 JWT-SVID 或 token |
|
||||||
|
|
||||||
## 如何使用
|
## 如何使用
|
||||||
|
|
||||||
@@ -82,6 +84,13 @@ SPIFFE/SPIRE 取代了原计划中由 **workload-sts 承担统一 IAM 平台**
|
|||||||
[Dynamic Runner](gitea-dynamic-runner.md) 提供 Pod/VM 执行环境及获取自身 SPIFFE 身份的能力,
|
[Dynamic Runner](gitea-dynamic-runner.md) 提供 Pod/VM 执行环境及获取自身 SPIFFE 身份的能力,
|
||||||
不将 OpenBao 或其他服务的业务登录流程内置为 runner 职责。
|
不将 OpenBao 或其他服务的业务登录流程内置为 runner 职责。
|
||||||
|
|
||||||
|
Gitea workflow 可使用
|
||||||
|
[`panxiao81/ci-actions/spiffe-openbao-login@v1`](https://git.ddupan.top/panxiao81/ci-actions/src/tag/v1/spiffe-openbao-login)
|
||||||
|
完成 JWT-SVID 交换与退出吊销。Action 会按 Actions 协议把短期 token 写入
|
||||||
|
`GITHUB_ENV`/`GITHUB_STATE` 临时文件,因此只允许用于 job 后销毁的一次性 Pod/VM
|
||||||
|
runner;不能用于共享或持久 runner。runner 仍只提供 Node.js 20、`spire-agent` 和
|
||||||
|
Workload API socket,role、audience 与调用时机必须由受审查的 workflow 声明。
|
||||||
|
|
||||||
可直接沿用的配置模板、交换示例和排障步骤见
|
可直接沿用的配置模板、交换示例和排障步骤见
|
||||||
[权威 RUNBOOK](https://git.ddupan.top/panxiao81/homelab-infra/src/branch/main/platform/spire/RUNBOOK.md)
|
[权威 RUNBOOK](https://git.ddupan.top/panxiao81/homelab-infra/src/branch/main/platform/spire/RUNBOOK.md)
|
||||||
的第 4–8 节。这里不复制第二份操作脚本。接入需要新增身份和授权配置,不是挂载 socket 后
|
的第 4–8 节。这里不复制第二份操作脚本。接入需要新增身份和授权配置,不是挂载 socket 后
|
||||||
@@ -94,7 +103,7 @@ OIDC issuer 为 `https://spire-oidc.ad.ddupan.top`,其 discovery/JWKS 用于
|
|||||||
|
|
||||||
## 仍在 ticket 中跟踪
|
## 仍在 ticket 中跟踪
|
||||||
|
|
||||||
截至本次查阅,后续范围包括真实 Gitea CI/AI Agent 的 OpenBao 接入、credential-exec、
|
截至本次查阅,后续范围包括在真实 Gitea CI/AI Agent 中验收已发布的登录 Action、
|
||||||
SeaweedFS Web Identity/STS、非 Kubernetes 主机与临时 VM 的证明和回收、
|
SeaweedFS Web Identity/STS、非 Kubernetes 主机与临时 VM 的证明和回收、
|
||||||
Compute/DBaaS 消费身份,以及 HA、备份恢复和多 issuer 约定。
|
Compute/DBaaS 消费身份,以及 HA、备份恢复和多 issuer 约定。
|
||||||
这些是 #34 的开放范围;单个消费者已有其他 PoC,不等于整项已完成。
|
这些是 #34 的开放范围;单个消费者已有其他 PoC,不等于整项已完成。
|
||||||
|
|||||||
@@ -63,3 +63,52 @@ SPIFFE/SPIRE 按维护者指定,以 [#34](https://git.ddupan.top/panxiao81/hom
|
|||||||
- Backstage 为计划中的统一入口,不作为已部署服务记录。
|
- Backstage 为计划中的统一入口,不作为已部署服务记录。
|
||||||
|
|
||||||
后续出现新的状态问题时,先向维护者对齐,再按授权范围更新对应服务文档。
|
后续出现新的状态问题时,先向维护者对齐,再按授权范围更新对应服务文档。
|
||||||
|
|
||||||
|
## Ayatori Database 设计修订同步
|
||||||
|
|
||||||
|
2026-09-24,维护者批准 Instance → Database → Tenant 资源/申请分离,替代原 PostgreSQL
|
||||||
|
registry 与自动所有权恢复合同。源仓库设计和 wiki 已同步,Ayatori 设计与 registry 撤除
|
||||||
|
已推送到 `feat/database-registry-inspection`;本记录随 wiki 来源同步提交发布。
|
||||||
|
registry 撤除通过本地全量测试、lint 及真实 API server/PostgreSQL 集成测试;
|
||||||
|
新资源 API 与三资源运行链路未完成,不属于部署或现场验证。
|
||||||
|
|
||||||
|
源设计:[6db8a49](https://git.ddupan.top/panxiao81/ayatori/commit/6db8a495fb9f8981d336c9e6288253628ab478b6);
|
||||||
|
代码撤除:[23a2d81](https://git.ddupan.top/panxiao81/ayatori/commit/23a2d81b5041f8589baab1c234136cd2c701bb06);
|
||||||
|
wiki 权威摘要:[DBaaS 设计](services/postgresql-tenant-operator.md#当前资源模型2026-09-24-已确认)。
|
||||||
|
来源链接固定到实现提交;相关设计、registry 撤除与 CI 去重修复已随
|
||||||
|
[PR #9](https://git.ddupan.top/panxiao81/ayatori/pulls/9) 合并为
|
||||||
|
[347a667](https://git.ddupan.top/panxiao81/ayatori/commit/347a667c0c1737bc4e2703dec5f11358f0425e43)。
|
||||||
|
最新 head 的 CI #781 已全部通过;无日志启动失败的 test 单项重试后通过。
|
||||||
|
旧仓库固定基线及受保护工作树未修改。
|
||||||
|
|
||||||
|
2026-09-25 的单数据库、单登录 owner 与凭据生命周期边界,以及 Database 集群级作用域、
|
||||||
|
引用与管理权限边界、资源侧先写的绑定顺序与部分写入重试规则,以及无绑定名单、
|
||||||
|
删除前策略可改与 Database UID 凭据定位的决定已同步到
|
||||||
|
[DBaaS 设计](services/postgresql-tenant-operator.md#当前资源模型2026-09-24-已确认)。
|
||||||
|
依据维护者当日确认;Ayatori 已提交为 `7e9e8e828bfcbdc8d4e2fcb6bc3d13727712a82c`,
|
||||||
|
源码已通过 [Ayatori PR #10](https://git.ddupan.top/panxiao81/ayatori/pulls/10) 的三项 CI,
|
||||||
|
并于同日按维护者要求合并为
|
||||||
|
[55b269c](https://git.ddupan.top/panxiao81/ayatori/commit/55b269ce2eb40f6b44c1afe838389093efdac98e)。
|
||||||
|
wiki 按维护者要求直接合入 main,原 [wiki PR #3](https://git.ddupan.top/panxiao81/homelab-wiki/pulls/3)
|
||||||
|
保留为历史讨论入口;后续纯文档变更不另开 PR。
|
||||||
|
关联源码:[7e9e8e8](https://git.ddupan.top/panxiao81/ayatori/commit/7e9e8e828bfcbdc8d4e2fcb6bc3d13727712a82c)。
|
||||||
|
这只是第一版 API 范围确认,不表示新资源链路已实现。
|
||||||
|
|
||||||
|
上述已合并实现包含三资源 schema 与真实 API server 校验,
|
||||||
|
本地 `make test` 与远端 CI 均通过。已接入绑定
|
||||||
|
controller、目标固定、finalizer 保留与生成 RBAC,真实 API server 验证并发、补写及 watch。
|
||||||
|
尚未实现 finalizer 清理、供应与交付,不宣称完成三资源生命周期或现场验收。
|
||||||
|
|
||||||
|
同日确认原生非 superuser + CREATEDB/CREATEROLE 管理方案,已同步至
|
||||||
|
[DBaaS 职责边界](services/postgresql-tenant-operator.md#职责边界)。Instance 观测链路的实现提交
|
||||||
|
[bc227bf](https://git.ddupan.top/panxiao81/ayatori/commit/bc227bfdb4b2f5b027fe522b8dcf72db17b84d26) 本地已通过
|
||||||
|
全量测试、三轮 controller/application race、真实 PostgreSQL/API server 集成测试及普通/integration lint。
|
||||||
|
[PR #11](https://git.ddupan.top/panxiao81/ayatori/pulls/11) 的三项 CI 均通过,维护者批准后已合并为
|
||||||
|
[f4deb98](https://git.ddupan.top/panxiao81/ayatori/commit/f4deb98a7fcf61fb97ce52bbf190beb816d0141a);
|
||||||
|
未部署或进行现场验收。
|
||||||
|
|
||||||
|
后续凭据存储切片已签名提交并推送为
|
||||||
|
[f6bb9e4](https://git.ddupan.top/panxiao81/ayatori/commit/f6bb9e4599afca49a9cdc3d40789e11d118db9c5),
|
||||||
|
由 [PR #12](https://git.ddupan.top/panxiao81/ayatori/pulls/12) 跟踪 CI 与 review。
|
||||||
|
全量测试、真实 PostgreSQL/API server/OpenBao 集成测试及两种 lint 本地通过;源码模块文档
|
||||||
|
和 wiki 已同步实现边界与正式链接。尚未合并或接入供应流程,不把本地验证等同于远端 CI。
|
||||||
|
|||||||
Reference in New Issue
Block a user