From c5c9b0243afbb6ff06db36770eb32057b6038e0d Mon Sep 17 00:00:00 2001 From: Francisco Solla Date: Sun, 8 Nov 2026 20:09:51 -0300 Subject: [PATCH] =?UTF-8?q?docs(ops131):=20registra=20a=20decis=C3=A3o=20A?= =?UTF-8?q?=20e=20o=20runbook=20do=20cutover?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Decisão A (site público + /campanha no domínio novo, passkeys re-registradas uma vez) refletida no plano; runbook de cutover/rollback no docs/ops/teqo-1313-deploy.md com pré-flight, ingress/DNS, env, verificação e janela read-only do WordPress; changelog da entrega. --- .../2026-11-08-ops131-redirects-wordpress.md | 1 + docs/ops/teqo-1313-deploy.md | 70 +++++++++++++++++++ .../ops131-cutover-dominio-jorgesolla.md | 23 +++++- 3 files changed, 92 insertions(+), 2 deletions(-) create mode 100644 docs/changelog/2026-11-08-ops131-redirects-wordpress.md diff --git a/docs/changelog/2026-11-08-ops131-redirects-wordpress.md b/docs/changelog/2026-11-08-ops131-redirects-wordpress.md new file mode 100644 index 00000000..c9629a4e --- /dev/null +++ b/docs/changelog/2026-11-08-ops131-redirects-wordpress.md @@ -0,0 +1 @@ +**OPS131 — redirects do WordPress legado e decisão de cutover total (2026-11-08):** o domínio novo `jorgesolla.com.br` vai receber o site público e o `/campanha` juntos (decisão A); as 4 contas com passkey (7 credenciais) re-registram uma vez no domínio novo e o login por senha segue disponível. Os 43 permalinks do WordPress (`/////`, último post em 2026-08-17) foram mapeados para o caminho canônico do Teqo em `scripts/lib/legacyWordPressRedirects.mjs`; categoria, tag, author, feeds, paginação e arquivos de data vão para `/artigos`, `/home` vai para `/` e `wp-admin`/`wp-login.php` para `/` (`next.config.mjs`). A paridade do acervo é 43/43 (Teqo com 43 publicados, último em 2026-08-18), registrada como evidência do OPS130 — o REST do WordPress não responde do homeserver/workstation, mas o inventário foi lido pela API pública via proxy externo. O runbook de cutover/rollback ficou em `docs/ops/teqo-1313-deploy.md` §OPS131; a janela de DNS/Cloudflare, a troca de `NEXT_PUBLIC_SITE_URL` + rebuild, o reenrollment e a verificação em produção seguem pendentes. Testes: unit do mapa (43 entradas, forma e unicidade) e e2e do frontend para os redirects do legado; sem migration e sem mudança de conteúdo no CMS. diff --git a/docs/ops/teqo-1313-deploy.md b/docs/ops/teqo-1313-deploy.md index 1ebdb33f..db211593 100644 --- a/docs/ops/teqo-1313-deploy.md +++ b/docs/ops/teqo-1313-deploy.md @@ -1953,6 +1953,76 @@ pula o que já entrou). Rollback: nada de schema. O kill switch é despublicar/apagar as peças no admin (a Central pública atualiza na hora pelo tag `contentPieces`). +## OPS131 — cutover do domínio jorgesolla.com.br + +Decisão de produto: **A — cutover total**. O site público e `/campanha` passam a +viver em `https://jorgesolla.com.br`; as passkeys são re-registradas uma vez no +domínio novo (o RP ID do WebAuthn é o hostname de `NEXT_PUBLIC_SITE_URL`). O +login por senha continua funcionando durante e depois da troca. + +### Pré-flight (evidência de 2026-11-08) + +- **WordPress:** sitemap com **43 posts** publicados (último em 2026-08-17), + 2 categorias (`noticias`, `uncategorized`), tags e author; o page sitemap só + tem `home`. O REST do WordPress não responde a partir do homeserver/workstation + (timeout/WAF), mas o inventário foi lido pela API pública via proxy externo. +- **Teqo:** **43 posts** publicados (último em 2026-08-18) — paridade 43/43, sem + conteúdo novo a importar. O `pnpm db:seed:posts` não roda a partir do + homeserver enquanto o REST do WordPress estiver bloqueado; o registro desta + paridade é a evidência do OPS130. +- **Redirects:** os 43 permalinks `/YYYY/MM/DD//` estão em + `scripts/lib/legacyWordPressRedirects.mjs` (destino = caminho canônico Teqo). + Categorias, tags, author, feeds, paginação e arquivos de data vão para + `/artigos`; `/home` vai para `/`; `wp-admin`/`wp-login.php` para `/`. +- **Passkeys:** 4 usuários / 7 credenciais no RP ID atual + (`jorgesolla1313.com.br`); serão re-registradas no domínio novo. +- **Metadados:** `metadata.URL` já é `https://jorgesolla.com.br`; + `NEXT_PUBLIC_SITE_URL` de produção ainda é `https://jorgesolla1313.com.br`. + +### Janela de cutover + +1. **Congelar o WordPress (read-only)** e guardar o backup final. Confirmar que + o sitemap continua com os 43 posts; se houver post novo, regenerar o mapa e + rodar o teste unitário antes de seguir. +2. **Env de produção:** editar `~/stack/teqo-1313.env` com + `NEXT_PUBLIC_SITE_URL=https://jorgesolla.com.br` (backup do arquivo antes). + Como o valor é inlined no build, o deploy precisa rebuildar. +3. **Cloudflare:** no túnel remotely-managed, adicionar o ingress + `jorgesolla.com.br` → `http://localhost:1313`; criar o DNS proxied do apex + para o túnel e o `www` (CNAME para o apex ou para o túnel). Na zona + `jorgesolla1313.com.br`, criar uma Redirect Rule 301 de + `https://jorgesolla1313.com.br/*` para `https://jorgesolla.com.br` preservando + `http.request.uri.path`. No `www`, 301 para o apex. **Não tocar em MX, TXT, + SPF, DKIM ou DMARC** — o e-mail `@jorgesolla.com.br` continua no mesmo lugar. +4. **Deploy:** rodar o workflow de deploy (push em `main` ou `workflow_dispatch`) + e aprovar produção. O build novo inlina o domínio novo. +5. **Passkeys:** avisar os 4 usuários para re-registrar a passkey em + `https://jorgesolla.com.br/campanha` depois do switch. Quem usa senha não + precisa fazer nada; as credenciais antigas ficam no banco, mas o browser não + as oferece no domínio novo. +6. **Verificação (read-only):** + - `https://jorgesolla.com.br/` e `https://www.jorgesolla.com.br/` → 200 + (www 301 para o apex), canonical/OG no domínio novo; + - `https://jorgesolla1313.com.br/artigos` → 301 para + `https://jorgesolla.com.br/artigos` (Redirect Rule do Cloudflare); + - amostras do WordPress: `/2026/08/17/bruno-reis-.../` → caminho canônico, + `/category/noticias/`, `/tag/lula/`, `/2026/08/` → `/artigos` (o Next + responde **308 permanente** para os redirects in-app; o Cloudflare usa 301 + no domínio 1313); + - `/api/media/file/...` e a imagem OG respondem 200 no domínio novo; + - `/campanha` autentica por senha; uma passkey nova é registrada e usada. +7. **WordPress:** manter read-only por ~30 dias (janela de rollback), depois + desligar o host antigo. O backup/dump fica arquivado; as uploads antigas não + são proxiadas (não há imagem do WordPress no corpo dos 43 posts do Teqo). + +### Rollback + +- Reverter `NEXT_PUBLIC_SITE_URL` para `https://jorgesolla1313.com.br` e + redeployar; as passkeys antigas voltam a valer. +- Remover o ingress/DNS de `jorgesolla.com.br` do túnel e restaurar o A record + do WordPress (`128.201.75.110`) enquanto a janela de rollback estiver aberta. +- O WordPress fica read-only, então o rollback não perde conteúdo novo. + ## Referências - `scripts/deploy-homeserver.sh` — o script (fonte da verdade do fluxo; parametrizado por `TEQO_ENV`) diff --git a/docs/plans/ops131-cutover-dominio-jorgesolla.md b/docs/plans/ops131-cutover-dominio-jorgesolla.md index 83d69ce8..1f60a5a9 100644 --- a/docs/plans/ops131-cutover-dominio-jorgesolla.md +++ b/docs/plans/ops131-cutover-dominio-jorgesolla.md @@ -1,6 +1,6 @@ # OPS131 — Cutover do domínio jorgesolla.com.br para o Teqo e desativação do WordPress -Status: rascunho +Status: em andamento — decisão A assinada; redirects do legado implementados; janela de DNS pendente Atualizado em: 2026-10-21 Issue: #1445 Priority: P1 @@ -78,7 +78,7 @@ O site do mandato ainda vive em duas casas: o Teqo em `jorgesolla1313.com.br` (c ## Questões em aberto (produto) -- **Passkeys:** **Opções:** A) cutover total + reenrollment dos usuários de campanha; B) manter `/campanha` em `jorgesolla1313.com.br` e só o site público no novo domínio; C) adiar o cutover até um mecanismo de migração. **Recomendação:** A — a eleição acabou e a equipe é pequena; reenrollment assistido é aceitável, com aviso prévio. _(assumido — decisão humana obrigatória)_ +- **Passkeys:** **Decidido em 2026-11-08: A** — cutover total + reenrollment assistido dos 4 usuários com passkey (7 credenciais); o login por senha segue disponível durante e depois da troca. - **Janela do WordPress:** **Opções:** A) desligar após a verificação, com backup/arquivo; B) manter read-only por 30 dias. **Recomendação:** B — janela curta de rollback, sem escritas. _(assumido)_ - **Redirect de `jorgesolla1313.com.br`:** **Opções:** A) 301 permanente; B) 302 por 90 dias. **Recomendação:** A — o 1313 não volta; 301 preserva o SEO. _(assumido)_ - **Escopo dos redirects antigos:** **Opções:** A) posts + páginas conhecidas; B) todas as URLs do sitemap do WP. **Recomendação:** B — inventariar o sitemap e mapear; o que não tiver equivalente vai para `/`. _(assumido)_ @@ -89,3 +89,22 @@ O site do mandato ainda vive em duas casas: o Teqo em `jorgesolla1313.com.br` (c - `docs/ops/teqo-1313-deploy.md` (homeserver, tunnel, envs, staging); `AGENTS-infra.md` - `src/utilities/seo.ts`, `src/utilities/campaignInviteOrigin.ts`, `src/utilities/webauthn/campaignWebAuthnConfig.ts`, `next.config.mjs` - OPS80/OPS81 (`pt.jorgesolla.com.br`), OPS130 (sync), S47 (site pós-eleição) + +## Progresso (2026-11-08) + +- **Decisão A assinada:** o site público e `/campanha` vão juntos para + `jorgesolla.com.br`; as 4 contas com passkey (7 credenciais) re-registram uma + vez no domínio novo. Login por senha permanece disponível. +- **Redirects do legado implementados:** os 43 permalinks + `/YYYY/MM/DD//` estão em + `scripts/lib/legacyWordPressRedirects.mjs` (destino canônico Teqo); categoria, + tag, author, feeds, paginação e arquivos de data vão para `/artigos`; `/home` + para `/`; `wp-admin`/`wp-login.php` para `/` (`next.config.mjs`). +- **Evidência OPS130:** WordPress com 43 posts (último 2026-08-17) e Teqo com 43 + posts (último 2026-08-18) — paridade 43/43; o REST do WordPress não responde + do homeserver/workstation, mas o inventário foi lido pela API pública via + proxy externo. +- **Runbook de cutover/rollback:** `docs/ops/teqo-1313-deploy.md` §OPS131. +- **Pendente:** janela de DNS/Cloudflare (ingress + apex/www + 301 do 1313), + `NEXT_PUBLIC_SITE_URL` de produção + rebuild, reenrollment das passkeys, + verificação e desligamento do WordPress após a janela read-only.