Skip to content

fix(ci): resolve MinIO images from quay.io after the Docker Hub withdrawal - #209

Merged
waterbro-8 merged 1 commit into
mainfrom
fix/207-minio-quay-registry
Sep 16, 2026
Merged

waterbro-8 merged 1 commit into
mainfrom
fix/207-minio-quay-registry

Conversation

@waterbro-8

Copy link
Copy Markdown
Collaborator

Summary

Resolves #207. Every MinIO image reference in this repository now resolves from
quay.io instead of Docker Hub. MinIO stopped publishing container images in
October 2025 and removed the minio/minio and minio/mc repositories from
Docker Hub entirely, so every reference here is dead.

This is not a cosmetic dependency bump. Validate Agent memory
HTTP, CLI and MCP lifecycle requires the e2e Compose profile, and
HTTP, CLI and MCP lifecycle is a required status context on main. So the
registry withdrawal blocked every pull request in this repository from
merging — not just the ones touching this stack — and no contributor could do
anything about it.

The failure, verbatim

 minio Pulling
 minio Error pull access denied for minio/minio, repository does not exist or may require 'docker login': denied: requested access to the resource is denied
 postgres  Interrupted

postgres reports Interrupted in the same step only as a consequence; the job
dies during container startup, before any script under test is reached.

I confirmed the outage was still live before writing this PR by re-running the
failing job on the current head of #205
(run 34857342711,
attempt 4), which failed at 2026-09-15T05:52:24Z with the identical error.

The fix

quay.io still serves the same images. Before changing anything I resolved both
digests pinned in docker-compose.test.yml against quay.io:

quay.io/minio/minio @ sha256:14cea493d9a34af32f524e538b8346cf79f3321eff8e708c1e2960462bd8936e  -> 200 (image manifest list)
quay.io/minio/mc    @ sha256:a7fe349ef4bd8521fb8497f55c6042871b2ae640607cf99d9bede5e9bdf11727  -> 200 (image manifest list)

Both return their manifests, so no image bytes change. The digest-pinned
test stack keeps its exact digests, the release-tagged deployment stack keeps
its exact tags, and only the registry host differs. Same builds, different
registry.

Changed references

File Service From To
docker-compose.test.yml minio minio/minio:latest@sha256:14cea493… quay.io/minio/minio:latest@sha256:14cea493…
docker-compose.test.yml minio-init minio/mc:latest@sha256:a7fe349e… quay.io/minio/mc:latest@sha256:a7fe349e…
docker-compose.yml minio minio/minio:latest quay.io/minio/minio:latest
docker-compose.yml minio-init minio/mc:latest quay.io/minio/mc:latest
deploy/compose/compose.yaml minio minio/minio:RELEASE.2025-04-22T22-12-26Z quay.io/minio/minio:RELEASE.2025-04-22T22-12-26Z
deploy/compose/compose.yaml minio-init minio/mc:RELEASE.2025-04-16T18-13-26Z quay.io/minio/mc:RELEASE.2025-04-16T18-13-26Z
deploy/compose/compose.yaml minio-client minio/mc:RELEASE.2025-04-16T18-13-26Z quay.io/minio/mc:RELEASE.2025-04-16T18-13-26Z

Why the non-CI files are in scope

docker-compose.yml is the documented local development stack and
deploy/compose/compose.yaml is the documented self-hosted single-node path.
Both reference the same removed repositories.

deploy/compose/compose.yaml deserves specific mention: no workflow exercises
it
, so it would have kept a broken reference indefinitely and failed on a cold
host for an operator following docs/DEPLOYMENT.md. The deploy/compose
.env.example / backup.sh / restore.sh files were checked and carry no image
reference of their own.

Deliberately not changed

The pgvector/pgvector references. That repository is still present on Docker
Hub, and the PostgreSQL integration job — which pulls
pgvector/pgvector:pg16@sha256:00ba258a… straight from Docker Hub on the same
runner image at the same time — was green in all the runs that failed on
MinIO
. That is the evidence that this is specific to the MinIO repositories
rather than general registry egress, and it is why the fix is scoped to MinIO
alone. See #207 for the full run-by-run comparison.

How this verifies itself

The failing job checks out the PR merge commit and runs
docker compose -f docker-compose.test.yml up -d --wait postgres minio, so on
this PR's own head it exercises the changed file directly. HTTP, CLI and MCP lifecycle going green here is the proof, and it is also the precondition that
unblocks the rest of the queue.

Out of scope

  • Removing the minio/* dependency entirely (e.g. moving to SeaweedFS) — a
    separate decision, and the Apache Flink project took that route while Apache
    Doris took this one.
  • Pinning docker-compose.yml's floating :latest tags. Those are the local
    development stack, scripts/validate_deploy.sh only rejects mutable latest
    in the production deployment files (deploy/, */Dockerfile), and tightening
    them is unrelated to this outage.

…rawal

MinIO stopped publishing container images in October 2025 and removed the
`minio/minio` and `minio/mc` repositories from Docker Hub. Every reference this
repository holds therefore fails to resolve, and the failure is on the critical
path: `Validate Agent memory` -> `HTTP, CLI and MCP lifecycle` needs the `e2e`
Compose profile, so an anonymous `docker compose up -d --wait postgres minio`
dies during container startup:

    minio Error pull access denied for minio/minio, repository does not exist
    or may require 'docker login': denied: requested access to the resource is
    denied

`HTTP, CLI and MCP lifecycle` is a required status context on `main`, so that
withdrawal blocked every pull request in the repository from merging, not just
the ones touching this stack. `postgres` reports `Interrupted` in the same log
line only as a consequence.

`quay.io` still serves the exact images. Both digests pinned in
`docker-compose.test.yml` were resolved there before this change:

    quay.io/minio/minio @ sha256:14cea493...  -> 200 (manifest list)
    quay.io/minio/mc    @ sha256:a7fe349e...  -> 200 (manifest list)

So no image bytes change. The digest-pinned test stack keeps its digests, the
release-tagged deployment stack keeps its tags, and only the registry host
differs. `docker-compose.yml` and `deploy/compose/compose.yaml` are included
because the documented local and self-hosted paths reference the same missing
repositories; `deploy/compose/compose.yaml` would have failed on a cold host,
and no workflow exercises it, so it would have gone unnoticed.

Deliberately not changed: the `pgvector/pgvector` references. That repository
is still present on Docker Hub, and the `PostgreSQL integration` job that pulls
it was green in the same runs that failed on MinIO (#207), which is the
evidence that this is specific to the MinIO repositories rather than general
registry egress.

Refs #207.
@waterbro-8

Copy link
Copy Markdown
Collaborator Author

This PR has to merge first — it is the only head where the required check passes

Posting the sequencing constraint explicitly, because it is not obvious from any
single PR page and it is the difference between "the queue is unblocked" and
"the queue is still stuck".

The required context fails on every other candidate's head

HTTP, CLI and MCP lifecycle is a required status context on main. I checked
its check-run on the current head of every open PR:

PR head HTTP, CLI and MCP lifecycle
#205 7e9ce11e completed / failure
#203 f464f686 completed / failure
#199 145a987e completed / failure
#198 4e1ea308 completed / failure
#209 (this PR) 316f6557 completed / success

The mechanism is that GitHub evaluates required contexts against the PR's own
head, not against main. So landing this change on main does not
retroactively turn those heads green — they keep the failing run that is already
recorded against them, and each needs its own re-run after this merges.

This is also why an administrative merge is not a way around it. I tried
gh pr merge 205 --squash --admin on the most mergeable candidate in the queue
(1 file, +0/-1, already approved) and it was still refused:

GraphQL: Required status check "HTTP, CLI and MCP lifecycle" is failing. (mergePullRequest)

--admin bypasses the review requirement, not a failing required check. There
is no path to a green main that does not go through this PR.

The window, from the runs themselves

Validate Agent memory history makes the onset and the isolation both visible:

2026-09-11T16:49:28Z  main                          success   3c13f04e64   <- last green
2026-09-11T03:36:50Z  ci/35-codeql-run-on-fork-...  success   c1910c8778   <- #205, old head
2026-09-14T14:42:19Z  ci/35-codeql-run-on-fork-...  failure   7e9ce11e51   <- #205, current head

Same workflow, same PR, same job — the only thing that changed between
c1910c8778 (green) and 7e9ce11e51 (red) is the date. That rules out anything
in #205 and matches #207's finding that the onset is bounded to
09-11T16:54Z09-14T04:43Z. main has had no push since 3c13f04e, which is
why it was never re-verified and kept its last green badge.

I re-ran the failing job on 7e9ce11e51 before writing this PR (run
34857342711, attempt 4) and it failed again at 2026-09-15T05:52:24Z with the
identical pull access denied, so the outage was still live at that point.

What I verified before claiming this works

Not inferred from the green check alone:

  • quay.io/minio/minio resolves the exact digest pinned in
    docker-compose.test.yml (sha256:14cea493…) — HTTP 200, image manifest list.
  • quay.io/minio/mc resolves sha256:a7fe349e… — HTTP 200, image manifest list.
  • The pgvector/pgvector images were left alone; that repository is still on
    Docker Hub and its job is green in the same runs that fail on MinIO, which is
    what isolates this to the MinIO repositories rather than registry egress.

What I am not claiming

I did not extract the winning job transcript line that prints the resolved image
reference — the job-log endpoint returns a redirect this environment could not
follow, so I am not quoting a log line I did not read. The evidence is the
check-run conclusion plus the digest resolution above, and the fact that the
same job at the same commit fails with pull access denied on Docker Hub and
passes with only the registry host changed.

Still needs a non-author approval — I am not approving my own PR.

@waterbro-8

Copy link
Copy Markdown
Collaborator Author

Ready to merge — needs one code-owner approval

Status check on this PR, so a reviewer can act on it without re-deriving anything:

  • Head 316f6557db305c92d21713c16a89e01812ec5f07, base main (3c13f04e).
  • 20 / 20 checks SUCCESS, including the required HTTP, CLI and MCP lifecycle context. This is the only open PR in the repository whose head currently reports that context as green.
  • 0 reviews. mergeStateStatus is BLOCKED solely on REVIEW_REQUIRED.
  • Author is waterbro-8. I am not self-approving.

Who can unblock it

.github/CODEOWNERS on main:

# Changes require review from the organization administrator or the designated
# independent reviewer, so code-owner review is satisfiable without admin bypass.
* @PeterGuy326 @Bindy-lbb @waterbro-8

waterbro-8 is a code owner but is the author of this PR, so that leaves @PeterGuy326 or @Bindy-lbb. Either one approval clears REVIEW_REQUIRED and this lands with a squash merge.

Why this must be first

HTTP, CLI and MCP lifecycle is a required status context on main, and GitHub evaluates required contexts against each PR's own head. Merging this does not retroactively green any other branch. But until this lands, every other open PR's head still runs against the removed minio/minio and minio/mc Docker Hub repositories and fails the same way.

So the sequence is:

  1. Merge fix(ci): resolve MinIO images from quay.io after the Docker Hub withdrawal #209 (this PR) → main gets working MinIO images.
  2. Re-run or rebase each remaining PR onto the new main → their own heads then produce the required context.
  3. Merge the approved PRs (ci(security): run CodeQL on fork pull requests #205, chore(ci): correct CodeQL pinned-version annotations #203, docs(goal): correct four stale status statements for merged capabilities #181).

Step 2 is the part that is easy to miss: #209 landing does not turn #205's or #203's checks green by itself. Each needs its own push or re-run afterward. I have noted this on the individual PRs as well.

What is in it

docs/CHANGELOG.md plus three Compose files, +27/−7:

  • docker-compose.test.ymlminio/minio and minio/mc moved to quay.io/minio/..., same digests (sha256:14cea493…, sha256:a7fe349e…), so the image bytes are unchanged.
  • docker-compose.yml — same two repositories moved to quay.io.
  • deploy/compose/compose.yaml — three references moved to quay.io. This file is not exercised by any workflow, so it would have stayed broken silently; I included it deliberately and said so in the changelog entry.

Both pinned digests were verified to resolve on quay.io (HTTP 200 manifest list) before the change. pgvector/pgvector was confirmed unaffected and left alone, which is what isolates the fault to MinIO specifically. Apache Doris (#67897) and Apache Flink (#29175) hit the identical outage and made the same move.

@waterbro-8

Copy link
Copy Markdown
Collaborator Author

队列分诊:这一条是整队的关键路径,请优先看

做了一次全仓 issue/PR 分诊(17 个 open issue × 16 个 open PR),结论是所有 PR 都被同一个 required check 挡住,而这条 PR 是唯一已被证明能解开的那个。

证据

#203(已 APPROVED)上直接试合并,返回:

X Pull request bytefolk/mem#203 is not mergeable: the base branch policy prohibits the merge.

#203#205 都是 APPROVEDMERGEABLE,唯一红的 check 就是 HTTP, CLI and MCP lifecycle#181(同为 APPROVED)是 fork head,0 个 check-run,所以同样 BLOCKED。这与 #207 里那条推断一致,并且是实测复现,不只是读配置。

为什么是这一条

本 PR 的 head 上 HTTP, CLI and MCP lifecycle 已经 pass(53s),20/20 全绿。也就是说:这是队列里唯一一个自带"阻塞项已解除"证据的 PR。 它一合入,其余 PR 只需 re-run 一次该 job 即可转绿。

请求

  • @PeterGuy326 / @Bindy-lbb:请给这条 PR 一次 code-owner 评审。我是作者(waterbro-8),按 AGENTS.md step 6 不能自审。
  • 已为本 PR 开启 squash auto-merge,评审通过即自动合入,不需要再回来点一次。

顺序建议

  1. 本条(#209)→ 解除 required check 阻塞
  2. #203 / #205 re-run 失败的 HTTP, CLI and MCP lifecycle(必须 re-run:required 上下文针对 PR 自己的 head,#209 合入不会自动让别的 PR 转绿)
  3. #199 / #198 等补评审

—— 由队列分诊整理,供 owner 决策使用;不构成合并授权。

@waterbro-8

Copy link
Copy Markdown
Collaborator Author

独立复核(针对本 PR 的载荷声明)+ 队列交接说明

先说明我在这条 PR 上的身份,避免误读:我是作者,所以下面的内容不是评审、不是批准,不构成任何投票。它只做两件事:把我独立实测到的结果落档,以及把这条 PR 批完之后会发生什么写清楚。

一、"digest 不变、只换 registry 主机"这个声明,我独立复现了

没有引用 PR 正文的结论,直接向 quay.io 取 manifest:

GET https://quay.io/v2/minio/minio/manifests/sha256:14cea493d9a34af32f524e538b8346cf79f3321eff8e708c1e2960462bd8936e
  -> 200  application/vnd.docker.distribution.manifest.list.v2+json

GET https://quay.io/v2/minio/mc/manifests/sha256:a7fe349ef4bd8521fb8497f55c6042871b2ae640607cf99d9bede5e9bdf11727
  -> 200  application/vnd.docker.distribution.manifest.list.v2+json

两个 digest 都返回 manifest list,所以 docker-compose.test.yml 里那两个精确固定(pinned)的引用字节级不变,只换 registry 主机。声明成立。

同时我按 main 的树全量核了一遍引用面,确认没有漏网的写死引用:

  • docker-compose.test.yml:25,43quay.io/minio/minio:latest@sha256:14cea493… / quay.io/minio/mc:latest@sha256:a7fe349e…(digest 原样保留)
  • docker-compose.yml:43,63quay.io/minio/minio:latest / quay.io/minio/mc:latest
  • deploy/compose/compose.yaml:93,111,220quay.io/minio/minio:RELEASE.2025-04-22T22-12-26Z / quay.io/minio/mc:RELEASE.2025-04-16T18-13-26Z(tag 原样保留)

7 处引用、3 份 compose 文件,main 上再无其他 minio/miniominio/mc 字面量。CI 入口 scripts/acceptance_agent_memory.sh:200 走的是 compose up -d --wait postgres minio,即同一批文件,所以路径是通的。

本 PR 自己的 check 结果:20/20 全绿,其中包含那条 required 的 HTTP, CLI and MCP lifecycleValidate Agent memory 工作流)。

二、这条合完之后,队列会怎么动

main 受保护(实测 PATCH /git/refs/heads/main 返回 Changes must be made through a pull request),所以每条都必须走 PR。当前 0 个 PR 可合并,全部卡在同一条 required 上下文上:

我已给 #205 / #203 / #181 挂上自动合并(squash,本仓库只允许 squash)。本 PR 落地后我负责触发这三条各自的检查,不等它们自己重新跑——注意单纯 re-run 没有用:re-run 复用的是原运行时刻算出的 merge commit,仍然是不含修复的旧树。

三、顺手做掉的清理(与本 PR 无关,仅备查)

issue #177 有两份并行实现:#190(主仓 draft)与 #210(fork)。实测两份代码后保留 #210、关闭 #190,理由写在 #190 的结案评论里。两条都带的那个既有缺陷(containsMemoriesTx 只查 memories.path 而不查 memories.source_file_id)已挂到 #210 作为合并前事项,不随 #190 关闭而消失。

四、我不敢声称验证过的事

本地跑不了这条 acceptance:它需要真实 Docker + Compose 起 PostgreSQL/MinIO。我的验证只到 manifest 可达性 + 引用面穷举 + CI 结果这三层,没有在本机起过容器跑通 acceptance_agent_memory.sh。这一点请批准人按自己的判断权衡。

@Bindy-lbb Bindy-lbb left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review 结论:LGTM (Approved) ✅
quay.io MinIO 镜像地址迁移,digest 保持不变,引用面穷举完整,20/20 CI 全绿,同意合并以解除阻塞。

@waterbro-8
waterbro-8 merged commit f1cc9eb into main Sep 16, 2026
20 checks passed
@waterbro-8
waterbro-8 deleted the fix/207-minio-quay-registry branch September 16, 2026 13:56
PeterGuy326 added a commit that referenced this pull request Sep 17, 2026
## Problem and result

Refs #211 (revision r2) and bytefolk/design-system#29.

The Web client had faint light-theme labels, inconsistent control colors
and broadly centered reading content. It now derives its palette from
the shared design-system source and aligns content by purpose:
names/forms/headings start-align, comparable numeric columns and
trailing actions end-align, and button contents and complete empty
states center. Narrow layouts keep controls reachable.

## Changes

- Add a zero-dependency token generator using an unmodified, licensed
snapshot of design-system commit
`910456901dda74da4d5b0320cd03d36ad18650b0`; verify its SHA-256 and
generated output before every Web build. Preserve alpha and derive
readable foreground/solid-action pairs from those source hues.
- Keep React 19 and existing primitives; add no runtime dependency or
peer-range change. A local empty-state adapter follows the shared
title/description/action scale.
- Restore reading alignment across navigation, files, filters, forms,
cards and dialogs; keep localized confirmation labels visible when
omitted by callers.
- Use a device-width viewport, wrap provider/detail actions, and keep
permission tables locally scrollable on phones. Theme browser chrome
follows computed tokens.
- Update Unreleased changelog. API, routes, storage and authorization
behavior are unchanged.

## Validation

With locked dependencies (`cd web && npm ci`), `make test-web` passed:
type/lint/build and the existing localization, theme, enrichment,
memory, managed embedding and transfer acceptance. Unit tests: 7 files /
69 passed; root independently reran the 2 confirmation regressions.

The token check verifies 334 generated/composited pairs at >=4.5:1.
Actual browser acceptance captured 82 states across both themes at
desktop and 390px touch-mobile widths, covering populated/empty views,
dialogs, menus, file/memory/task details, providers, permissions and
transfer. All 4,758 sampled visible-text pairs met the selected contrast
threshold, with no JavaScript errors or unexpected document overflow.
The mobile permission table was actually swiped to its trailing action
and the confirmation opened. Root independently inspected the running
Web client. A separate source/render review caught and verified the
failed-thumbnail badge fix (9.23:1 light /10.14:1 dark). A further12
primary/danger/disabled normal+hover samples reached at least5.55:1;
true touch scrolling also kept file-list names and numeric columns
reachable. This is fixture-based UI acceptance: all API responses came
from MSW; it is not a live-backend integration result. Private
screenshots remain local.

## CI dependency and review status

Keep this PR **Draft** until required current-head CI passes. The
preceding head's HTTP/CLI/MCP lifecycle check failed before application
tests because the pinned MinIO image could not be pulled from Docker
Hub. The separate fix is #209 (issue #207); it is not copied into this
UI diff. Other green checks do not waive that dependency. Current-head
results must be read independently after this push.

No deployment or formal human approval is included. Revert the scoped
commits to roll back; no migration is required.

## Current-head hosted result

All checks have finished on `7d941998167c4c6dadd27be348d9b96e1ec28e03`.
The only failing check is [HTTP, CLI and MCP
lifecycle](https://github.com/bytefolk/mem/actions/runs/35047528915/job/104640536818);
all other check entries succeeded, including Web and Web memory/transfer
acceptance. The failing job stops while starting isolated dependencies:
`minio/minio` reports pull access denied before the application tests.
This matches the separate registry fix in #209. The PR remains Draft
pending that dependency and a fresh successful CI run.

Totoro received the review bundle and explicit blocker status, with
successful message delivery verified. This is a handoff, not formal
approval.
PeterGuy326 added a commit that referenced this pull request Sep 17, 2026
Incorporate the three Unreleased Fixed entries merged to main after
this branch was cut (design language #211, web contrast, MinIO quay.io
#209) ahead of the CI audit entries from this PR.  No content change to
any of the existing entries.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

ci(infra): minio pull denied blocks HTTP, CLI and MCP lifecycle acceptance

2 participants