# Runbook — Centro de Mando 4Ventures Operador: `marketing@4ventures.es` Credenciales locales (gitignored): `.ops/marketing-credentials.txt` ## Health ```bash curl -sf https://app.4ventures.es/api/health # expect: serviceRoleConfigured true ./scripts/smoke.sh https://app.4ventures.es python3 scripts/smoke_operator_login.py python3 scripts/smoke_chat_auth.py ``` ## Deploy (Dokploy) 1. Push a `main` en Gitea `Marketing/4ventures-client-portal`. 2. Dokploy → **Web4Ventures / production / client-portal** → Deploy (id interno `web4ventures-clientportal-jntjhs`). 3. Environment (runtime + build via “Create Environment File”): - `NEXT_PUBLIC_SUPABASE_URL` - `NEXT_PUBLIC_SUPABASE_ANON_KEY` - `SUPABASE_SERVICE_ROLE_KEY` - `ANTHROPIC_API_KEY` (opcional, LLM) 4. Traefik: `portal.yml` → `http://web4ventures-clientportal-jntjhs:3000` 5. Smoke: `/login` → KPIs → creatividades → chat. ## Portafolio agencia (admin) 1. Login `marketing@` → redirige a `/dashboard/agencia`. 2. Cabecera **Contexto**: selector de cliente (modo superadmin) o vista global. 3. Tarjetas de portafolio: salud de integraciones + **Entrar** / **Integraciones**. 4. Ficha `/dashboard/agencia/cliente/[id]`: Meta, Google Ads, GA4, GSC, GTM, Clientify, Klaviyo, Mailchimp (estado manual por ahora). 5. SQL: `sql/agency_portfolio.sql` (tablas `integrations` + `agency_alerts`). OAuth live Meta/MCC/GA4 = siguiente fase; el esqueleto ya escala por tenant. ## Atribución ```html ``` `POST https://n8n-agencia.4ventures.es/webhook/lead-inbound` ## Endurecer git / n8n Aplicado 2026-09-21: IP allowlist `90.161.248.78/32` en UI de git + n8n; webhooks `/webhook` abiertos. Detalle / revert: `.ops/HARDEN_SURFACES.md`. Re-aplicar: `python3 scripts/dokploy_apply_traefik_harden.py`. `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`.