OPS52-media — OPS52-media — Recuperar os arquivos de media de produção (40 rows com URLs locais e nenhum arquivo em disco) #10

Closed
opened 2026-08-17 22:37:30 +00:00 by fsolla · 4 comments
Owner
id depends serializes priority model
OPS52-media
OPS52
P1 cursor-grok-4.5-medium

Plano: docs/plans/ops52-media-recuperar-arquivos.md

Achado da OPS51 (2026-08-17, migração Neon→homeserver): as 40 rows da collection media têm URLs RELATIVAS (/api/media/file/…) e os arquivos não existem em lugar nenhum (workstation, homeserver, imagem — .dockerignore exclui media/; pasta media/ não existe no repo). Consequência: as capas dos posts dão 500 no homeserver e 404 no próprio Vercel/produção atual (pt.jorgesolla.com.br) — estado pré-existente à migração (paridade mantida, sem regressão). O OPS51 registrou o achado; este item recupera os arquivos (fontes candidatas: Vercel Blob store — o seed de posts usa chaves determinísticas <slug>.<ext>; WordPress de origem; dumps antigos do Neon) e deixa as URLs resolvendo no storage definido pelo OPS52. Depende do OPS52 (storage real) para a forma final, mas a investigação de onde estão os arquivos pode começar antes.

Gate do plano (2026-08-18): absorvido o relato "imagens dos artigos não carregam na seção de conteúdos da home de campanha (S1)". Causa raiz confirmada única: arquivos inexistentes (contrato de URL relativa via proxy comprovado no Payload 3.82 — uploads novos seguem servindo). Prioridade elevada P2→P1 no gate.

--- id: OPS52-media depends: [OPS52] serializes: [] priority: P1 model: cursor-grok-4.5-medium --- Plano: [`docs/plans/ops52-media-recuperar-arquivos.md`](docs/plans/ops52-media-recuperar-arquivos.md) Achado da OPS51 (2026-08-17, migração Neon→homeserver): as 40 rows da collection `media` têm URLs RELATIVAS (`/api/media/file/…`) e os arquivos não existem em lugar nenhum (workstation, homeserver, imagem — `.dockerignore` exclui `media/`; pasta `media/` não existe no repo). Consequência: as capas dos posts dão 500 no homeserver e **404 no próprio Vercel/produção atual** (pt.jorgesolla.com.br) — estado pré-existente à migração (paridade mantida, sem regressão). O OPS51 registrou o achado; este item recupera os arquivos (fontes candidatas: Vercel Blob store — o seed de posts usa chaves determinísticas `<slug>.<ext>`; WordPress de origem; dumps antigos do Neon) e deixa as URLs resolvendo no storage definido pelo OPS52. Depende do OPS52 (storage real) para a forma final, mas a investigação de onde estão os arquivos pode começar antes. Gate do plano (2026-08-18): absorvido o relato "imagens dos artigos não carregam na seção de conteúdos da home de campanha (S1)". Causa raiz confirmada única: arquivos inexistentes (contrato de URL relativa via proxy comprovado no Payload 3.82 — uploads novos seguem servindo). Prioridade elevada P2→P1 no gate.
fsolla added the
kind:chore
prio:P2
ready
labels 2026-08-17 22:37:30 +00:00
fsolla added
blocked
prio:P1
and removed
ready
prio:P2
labels 2026-08-18 10:26:02 +00:00
fsolla added
ready
and removed
blocked
labels 2026-08-18 10:28:00 +00:00
Author
Owner

Promovido a ready: plano de intenção em main (ciclo OPS17 — pnpm agent:ready).

Promovido a `ready`: plano de intenção em `main` (ciclo OPS17 — `pnpm agent:ready`).
fsolla added
in-progress
and removed
ready
labels 2026-08-18 10:31:02 +00:00
Author
Owner

Claimed by agent run at 2026-08-18T10:31:02.273Z. Lock otimista: outro claim deve falhar e re-rodar pnpm agent:claim.

Claimed by agent run at 2026-08-18T10:31:02.273Z. Lock otimista: outro claim deve falhar e re-rodar `pnpm agent:claim`.
Author
Owner

Fechado pelo PR #38 (merge 45e29a77, CI verde incl. e2e). Entrega: pnpm media:recover (reconcile/--dry-run/--verify) + lib extraída scripts/lib/wpArticles.mjs (fetch WP + resolução de capa compartilhada com o seed, unit-testada). Fail-closed: S3_* completas, ALLOW_REMOTE_DB=true, echo do alvo, timeouts curtos, covers só do origin WP e image/*. Runbook de execução em prod (pós-merge, homeserver): docs/plans/ops52-media-recuperar-arquivos-impl.md — inclui pre-flight container→Garage (a rota pública de media de prod pendurava >25s na sondagem; se persistir com objetos no bucket, é infra — abrir sucessor OPS). Dívida registrada: #37 (guard de intenção para escrita em bucket). ⚠️ Aceite 200/row depende da execução do runbook (ferramenta entregue; objetos ainda não restaurados — execução fica com o humano, fora da skill).

Fechado pelo PR #38 (merge 45e29a77, CI verde incl. e2e). Entrega: `pnpm media:recover` (reconcile/--dry-run/--verify) + lib extraída `scripts/lib/wpArticles.mjs` (fetch WP + resolução de capa compartilhada com o seed, unit-testada). Fail-closed: S3_* completas, `ALLOW_REMOTE_DB=true`, echo do alvo, timeouts curtos, covers só do origin WP e `image/*`. Runbook de execução em prod (pós-merge, homeserver): `docs/plans/ops52-media-recuperar-arquivos-impl.md` — inclui pre-flight container→Garage (a rota pública de media de prod pendurava >25s na sondagem; se persistir com objetos no bucket, é infra — abrir sucessor OPS). Dívida registrada: #37 (guard de intenção para escrita em bucket). ⚠️ Aceite 200/row depende da execução do runbook (ferramenta entregue; objetos ainda não restaurados — execução fica com o humano, fora da skill).
Author
Owner

Execução em prod concluída (2026-08-18) — aceite verificado:

  • 38/40 objetos restaurados no bucket teqo-media a partir do WordPress de origem (chaves determinísticas <slug>.<ext>, rows do DB intocadas); reexecutável com pnpm media:recover (idempotente).
  • --verify: 38/40 respondendo 200 em https://jorgesolla1313.com.br/api/media/file/... (era 000/timeout antes). Exceções honestas (404, sem fonte no WP, rows manuais não referenciadas): fim-escala-6x1.jpg e jorgesolla.jpg.
  • Check visual na home de campanha: seção "Acompanhe de perto" com todas as capas carregando (incl. otimizador _next/image); 0 requests falhados.
  • E3 — causa raiz do pendurar resolvida: firewall do host derrubava toda a sub-rede do docker (container→Garage inalcançável; headObject pendurava). Fix: 2 regras ufw (allow from 10.0.11.0/24 to any port 3900, INPUT + route/FWD) + extra_hosts: host.docker.internal:host-gateway nos serviços teqo-1313/teqo-1313-migrate + S3_ENDPOINT=http://host.docker.internal:3900 no ~/stack/teqo-1313.env (backup do compose em .pre-ops52-media-hostgateway; sobrevive aos deploys OPS53). Detalhes no runbook (docs/plans/ops52-media-recuperar-arquivos-impl.md).
  • Docs atualizadas no PR #41.

Fechado em: PR #38 (ferramenta) + #41 (docs).

**Execução em prod concluída (2026-08-18) — aceite verificado:** - **38/40 objetos restaurados** no bucket `teqo-media` a partir do WordPress de origem (chaves determinísticas `<slug>.<ext>`, rows do DB intocadas); reexecutável com `pnpm media:recover` (idempotente). - **`--verify`: 38/40 respondendo 200 em `https://jorgesolla1313.com.br/api/media/file/...`** (era 000/timeout antes). Exceções honestas (404, sem fonte no WP, rows manuais não referenciadas): `fim-escala-6x1.jpg` e `jorgesolla.jpg`. - **Check visual na home de campanha:** seção "Acompanhe de perto" com todas as capas carregando (incl. otimizador `_next/image`); 0 requests falhados. - **E3 — causa raiz do pendurar resolvida:** firewall do host derrubava toda a sub-rede do docker (container→Garage inalcançável; `headObject` pendurava). Fix: 2 regras ufw (`allow from 10.0.11.0/24 to any port 3900`, INPUT + route/FWD) + `extra_hosts: host.docker.internal:host-gateway` nos serviços `teqo-1313`/`teqo-1313-migrate` + `S3_ENDPOINT=http://host.docker.internal:3900` no `~/stack/teqo-1313.env` (backup do compose em `.pre-ops52-media-hostgateway`; sobrevive aos deploys OPS53). Detalhes no runbook (`docs/plans/ops52-media-recuperar-arquivos-impl.md`). - Docs atualizadas no PR #41. Fechado em: PR #38 (ferramenta) + #41 (docs).
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: fsolla/teqo#10
No description provided.