From 9d1609c88bfdaf9e27be35c6e096f74e00c90381 Mon Sep 17 00:00:00 2001 From: 4Ventures <4ventures@MacBook-Air-de-4Ventures.local> Date: Mon, 21 Sep 2026 18:47:08 +0200 Subject: [PATCH] docs: note JWT rotation ready but blocked on supabase compose Co-authored-by: Cursor --- .gitignore | 3 +++ SECURITY.md | 8 ++++++-- docs/RUNBOOK.md | 4 ++++ 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index e58c4e6..3af5bfd 100644 --- a/.gitignore +++ b/.gitignore @@ -43,6 +43,9 @@ scripts/dokploy_traefik_insert.py scripts/dokploy_traefik_only.py scripts/dokploy_traefik_unlock.py scripts/dokploy_view_deploy_error.py +scripts/dokploy_collect_supabase_env.py +scripts/dokploy_find_jwt_secret.py +scripts/dokploy_prepare_key_rotation.py tsconfig.tsbuildinfo # debug / OS diff --git a/SECURITY.md b/SECURITY.md index 2d58a90..ea12369 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -7,7 +7,8 @@ El PDF “Agencia 2030” y el antiguo `.env.example` del repo contenían **JWTs ### Rotación (checklist — hacerlo en ventana corta) -1. Supabase Studio → Settings → API → **regenerar** `anon` y `service_role`. +1. Supabase Studio → Settings → API → **regenerar** `anon` y `service_role` + **o** (self-hosted) cambiar `JWT_SECRET` / `GOTRUE_JWT_SECRET` y emitir JWTs nuevos. 2. Dokploy → client-portal Environment: pegar anon + service_role nuevos → Save → Deploy. 3. n8n (credenciales Supabase / HTTP headers): actualizar API keys. 4. Local: actualizar `.env.local` (gitignored); no tocar `.env.example` (placeholders). @@ -15,7 +16,10 @@ El PDF “Agencia 2030” y el antiguo `.env.example` del repo contenían **JWTs 6. Smoke: `curl /api/health` → `serviceRoleConfigured true`; `python3 scripts/smoke_operator_login.py`. 7. Rotar `ANTHROPIC_API_KEY` si estuvo en chats/docs (opcional, independiente). -**No automatizar la regeneración** desde scripts: hace falta confirmación en Studio. +**Estado 2026-09-21:** claves nuevas **preparadas** en `.ops/supabase_rotated.env` (gitignored). +**Aplicación bloqueada:** el stack vivo (`ventures-web-supabase-gm0nnn-*`) no tiene compose editable en Dokploy (`4ventures-infra` está en `error` / `composeFile` vacío) y SSH al VPS (`187.77.170.176:22`) hace timeout. Sin recrear contenedores con el nuevo `JWT_SECRET`, los JWT filtrados **siguen válidos**. + +**Desbloqueo:** acceso host (SSH/VPN) o restaurar el compose Supabase en Dokploy → sustituir env → recrear servicios auth/kong/rest/studio → Deploy client-portal. ## Superficies a restringir (amenaza) diff --git a/docs/RUNBOOK.md b/docs/RUNBOOK.md index 372b8ae..aa4726d 100644 --- a/docs/RUNBOOK.md +++ b/docs/RUNBOOK.md @@ -45,6 +45,10 @@ Detalle / revert: `.ops/HARDEN_SURFACES.md`. Re-aplicar: `python3 scripts/dokplo `app.4ventures.es` y Dokploy **sin** allowlist. +## Rotación JWT Supabase + +Claves nuevas en `.ops/supabase_rotated.env` (gitignored). Aplicar requiere recrear el stack Supabase (ver `SECURITY.md`). + ## Incidentes Ver `SECURITY.md`.