Skip to content

fix(infra): S3 de dev/teste passa ao fork Silo — minio/minio sumiu do Docker Hub - #1028

Merged
GabrielAderaldo merged 3 commits into
devfrom
fix/s3-dev-silo
Oct 1, 2026
Merged

GabrielAderaldo merged 3 commits into
devfrom
fix/s3-dev-silo

Conversation

@GabrielAderaldo

Copy link
Copy Markdown
Contributor

Fecha #1026.

Problema

A MinIO apagou minio/minio e minio/mc do Docker Hub em 2026-09-11, e o espelho quay.io/minio exige login. Nenhuma tag nem digest do MinIO oficial baixa sem conta. Por isso o workflow integration falha todo dia na main desde 2026-09-12, nos jobs storage, logo, photo e, por consequência, gate. Três suítes de storage estão sem rodar em CI desde então.

Mudança

  • compose.yaml: o serviço minio passa a pgsty/silo e o minio-bootstrap passa a pgsty/mc, os dois pinados por digest do índice multi-arch (amd64 e arm64).
    • Nomes de serviço, envs MINIO_*, secrets *_FILE, healthcheck, command e bootstrap não mudam.
    • O arquivo mantém o mesmo número de linhas, então citações compose.yaml:N em outros arquivos continuam válidas.
  • ADR-0071: supersede parcialmente o ADR-0019, só na fonte da imagem.
  • Inventário e docs: inventário do ADR-0019, índice de ADRs, doc de paridade local (comando de criar bucket), teste de infra e exemplo do agente docker-compose-expert passam a refletir a troca.

Por que o Silo

Seis hipóteses foram testadas em containers isolados contra as quatro suítes reais do CI e contra o que o compose exige além da API S3. O registro completo está na #1026.

O Silo é o único candidato que é, ao mesmo tempo:

  • drop-in: troca só a linha image: de cada serviço;
  • mantido: releases mensais;
  • da mesma licença já analisada no ADR-0019 (AGPL-3.0).

Por que as outras foram descartadas:

  • Bitnami legacy: imagem congelada, sem patches, e não é drop-in.
  • MinIO compilado do fonte: o upstream está arquivado.
  • RustFS e SeaweedFS: passam no S3, mas exigem refazer o serviço e o bootstrap. O RustFS fica registrado no ADR como saída se o Silo parar.

Como foi verificado

  • Runner oficial do CI (pnpm run test:integration:{storage,photo,logo}) com este compose.yaml: 13/13, 5/5 e 4/4.
  • Bootstrap do compose de dev com pgsty/mc: bucket criado, versionamento ativado e download anônimo liberado; healthcheck /minio/health/ready responde 200.
  • Comando do doc de paridade (criar program-logos) executado contra o Silo.
  • Gate: typecheck, format:check, lint e test verdes, com 11844 testes e 0 falhas.
  • Revisões: /code-review high com 9 achados tratados e 1 registrado como [shared] gate do Stop pula sem rodar quando o .ts alterado tem espaço no nome #1027; /security-review sem achados.

⚠️ Não provado localmente: no-new-privileges. O Docker de quem testou é o snap da Canonical, que não executa nenhum container com essa flag (nem alpine true). Os testes locais usaram um override fora do repositório que zera só essa flag. Este CI é a prova, porque roda o compose.yaml intacto.

Riscos de supply-chain (ADR-0011 §5), declarados

  • Bus factor baixo: o fork tem um mantenedor principal (pgsty / @Vonng) e existe desde out/2025. A saída prevista é o RustFS, com ADR próprio.
  • Root: as imagens rodam como root, igual ao MinIO oficial. no-new-privileges é mantido.
  • Proveniência: assinatura (cosign/SLSA) e varredura de CVE das imagens não foram verificadas.
  • Escopo: o Silo só existe em dev, teste e CI. Produção é AWS S3 (ADR-0021).

Notas para o merge

Os 20 comandos de hook do `.claude/settings.json` eram `${CLAUDE_PROJECT_DIR}/...` sem
aspas: num clone em "Área de trabalho" o `/bin/sh` partia o caminho no espaço e todo hook
falhava como "non-blocking" — Prettier pós-edição, bloqueios de Bash e o gate do Stop
deixavam de rodar em silêncio. Agora `"\"${CLAUDE_PROJECT_DIR}\"/..."`, a forma da doc.

Com os hooks de volta, apareceram mais três defeitos da mesma família:

- `pre-commit-typecheck.sh` guardava `pnpm --dir=${CORE_API_DIR}` numa string e a expandia
  sem aspas: os quatro gates do pre-commit morriam com `ENOENT ... lstat '/home/.../Área'`.
  Agora a chamada é direta, com `--dir` entre aspas.
- `stop-quality-gate.sh` reportava `pnpm: comando não encontrado` como QUATRO vermelhos.
  Shell de hook não carrega o nvm; ausência do pnpm agora é diagnóstico próprio ("gate
  não rodou"), que continua bloqueando, mas com a causa verdadeira.
- O fixture do `gate-blocker` montava `typecheck: <caminho do tsc> --noEmit` sem aspas no
  package.json temporário; o cenário GREEN falhava por ambiente, não por gate.

Assisted-by: Claude-Code:claude-opus-5-5
… Docker Hub

Fecha #1026. A MinIO apagou `minio/minio` e `minio/mc` do Docker Hub em 2026-09-11 e o
espelho quay.io/minio exige login: nenhuma tag nem digest do oficial baixa sem conta. O
`integration` falhava todo dia na main desde 2026-09-12 (storage, logo, photo → gate).

O compose passa a `pgsty/silo` + `pgsty/mc`, pinados por digest multi-arch. Fork mantido,
AGPLv3 como o MinIO, e drop-in: envs `MINIO_*`, secrets `*_FILE`, rotas `/minio/*`,
healthcheck e bootstrap inalterados. Escolhido entre seis hipóteses testadas em container
isolado contra as quatro suítes reais do CI (registro na #1026); ADR-0071 supersede
parcialmente o ADR-0019 só na fonte da imagem.

Assisted-by: Claude-Code:claude-opus-5-5
- compose.yaml volta ao MESMO número de linhas: os comentários novos deslocavam tudo abaixo
  do serviço `minio` e deixavam erradas as citações `compose.yaml:N` em integration.yml,
  ADR-0014.yaml, ADR-0064 e spec 033. O detalhe da troca vive no ADR-0071.
- Inventário do ADR-0019: C5 passa a `contradicted` na letra (a imagem não é mais a oficial
  minio/minio, por decisão do ADR-0071) e os `verify` voltam a achar as linhas; índice
  de ADRs anota "imagem superseded por 0071" na linha da 0019.
- Doc de paridade local: o comando de criar bucket usava `minio/mc`, que sumiu; passa ao
  `pgsty/mc` pinado, com `--entrypoint /bin/sh` (o entrypoint da imagem é `mc`).
- gate-blocker: fixture com espaço no caminho — prova inversa medida: sem as aspas do
  `--dir` o cenário GREEN quebra. Antes, a regressão voltaria sem teste vermelho.
- Gate do Stop sem pnpm: mensagem neutra quanto ao gerenciador de versão e manda escalar
  ao humano em vez de alterar a home; PATH só no log. Título "fallback npx" do pre-commit
  corrigido (não há fallback: falha fechado).
- Nome do teste de infra e exemplo do docker-compose-expert deixam de citar minio/mc e de
  usar placeholder inválido.

Fora do escopo, registrado: #1027 (gate do Stop pula com .ts de nome com espaço).

Assisted-by: Claude-Code:claude-opus-5-5
Copilot AI balanced review requested due to automatic review settings October 1, 2026 21:01
@GabrielAderaldo GabrielAderaldo added the ai-assisted PR de sessão de IA — commits exigem trailer Assisted-by (ADR-0054/#549) label Oct 1, 2026

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ai-assisted PR de sessão de IA — commits exigem trailer Assisted-by (ADR-0054/#549)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants