fix/zot-anonymous-pull
main
原部署启用 OIDC Bearer 后无法匿名拉取;同域名 GET/HEAD 分流又使部分标准 OCI 客户端跳过 token 交换。现在用两个官方 zot 实例共用同一份 SeaweedFS 制品和 Bao 凭据:
zot.ad.ddupan.top
zot-push.ad.ddupan.top
验证通过:标准 crane 使用真实 SPIRE JWT-SVID 推送测试制品,随后以空 DOCKER_CONFIG 匿名拉取,两个入口 digest 一致。匿名 blob HEAD、tags/referrers、遗留客户端凭据兼容性通过;匿名写入、跨仓库写入、删除、错误签名/audience 和过期 SVID 均被拒绝。直接访问 reader Service 也无法写入。临时验收身份和写权限已撤销;两个 HelmRelease Ready;DNS 第二次 check 为 changed=0;Kustomize/Helm 渲染、diff 和敏感信息模式检查通过。
部署状态与合并后收尾:双域名已在线。为避免 main 的旧配置回写,当前仅对 HelmRelease/zot 设置了临时 kustomize.toolkit.fluxcd.io/reconcile=disabled,并在 spec.values 保存最终双域名配置(没有测试写权限)。Helm controller 正常运行,其他 Flux 对象正常 reconcile。合并后确认 zot-values 已同步新的推送域名,再移除临时 spec.values 和该 annotation,触发 zot Kustomization reconcile;新增 reader 随本 PR 纳管。
HelmRelease/zot
kustomize.toolkit.fluxcd.io/reconcile=disabled
No dependencies set.
The note is not visible to the blocked user.
原部署启用 OIDC Bearer 后无法匿名拉取;同域名 GET/HEAD 分流又使部分标准 OCI 客户端跳过 token 交换。现在用两个官方 zot 实例共用同一份 SeaweedFS 制品和 Bao 凭据:
zot.ad.ddupan.top:匿名拉取,只转发 GET/HEAD;reader 自身也只有 anonymousPolicy=read,关闭 GC。zot-push.ad.ddupan.top:保留 SPIRE issuer/audience/subject 和仓库权限校验;realm、service、externalUrl 与路由一致。没有常驻写入授权,后续为具体 CI 身份配置单仓库权限。验证通过:标准 crane 使用真实 SPIRE JWT-SVID 推送测试制品,随后以空 DOCKER_CONFIG 匿名拉取,两个入口 digest 一致。匿名 blob HEAD、tags/referrers、遗留客户端凭据兼容性通过;匿名写入、跨仓库写入、删除、错误签名/audience 和过期 SVID 均被拒绝。直接访问 reader Service 也无法写入。临时验收身份和写权限已撤销;两个 HelmRelease Ready;DNS 第二次 check 为 changed=0;Kustomize/Helm 渲染、diff 和敏感信息模式检查通过。
部署状态与合并后收尾:双域名已在线。为避免 main 的旧配置回写,当前仅对
HelmRelease/zot设置了临时kustomize.toolkit.fluxcd.io/reconcile=disabled,并在 spec.values 保存最终双域名配置(没有测试写权限)。Helm controller 正常运行,其他 Flux 对象正常 reconcile。合并后确认 zot-values 已同步新的推送域名,再移除临时 spec.values 和该 annotation,触发 zot Kustomization reconcile;新增 reader 随本 PR 纳管。