Vista de despliegue: el navegador habla con Astro SSR en Vercel a través de un único middleware que centraliza autenticación, chaos engineering y el enforcement de seguridad. Los cron externos disparan el sondeo de monitores y los backups; los datos viven en Turso (libSQL) y Vercel Blob.
flowchart TB
subgraph Cliente["Navegador"]
B["Visitante / Administrador"]
end
subgraph Vercel["Vercel (Fluid Compute)"]
direction TB
MW["Middleware Astro<br/>(auth, chaos, sensor, blocklist, rate-limit)"]
SSR["Páginas SSR<br/>(público + /admin)"]
API["Rutas /api/*<br/>(admin, cron, payments, status, contact)"]
CRON_H["Handlers de cron<br/>(uptime-check, rollups, backup)"]
end
subgraph Datos["Persistencia"]
TURSO[("Turso / libSQL<br/>(Drizzle ORM)")]
BLOB[("Vercel Blob<br/>(backups, screenshots)")]
end
subgraph Externos["Servicios externos"]
GH["GitHub OAuth + API<br/>(login, repos)"]
CRONJOB["cron-job.org<br/>(disparador de sondeos)"]
NTFY["ntfy.sh<br/>(push)"]
WOMPI["Wompi<br/>(pasarela de pagos)"]
RDAP["RDAP<br/>(vencimiento de dominios)"]
SEARCH["Buscadores<br/>(IndexNow, RSS, sitemap)"]
end
B -->|HTTPS| MW
MW --> SSR
MW --> API
SSR --> TURSO
API --> TURSO
API --> BLOB
CRONJOB -->|POST + CRON_SECRET| CRON_H
CRON_H --> API
API -->|OAuth| GH
API -->|push| NTFY
API <-->|webhooks| WOMPI
API -->|lookup| RDAP
SSR -->|IndexNow ping| SEARCH
Middleware (src/middleware.ts)
Único punto de entrada para chaos, sensor de seguridad, blocklist, rate limiting durable y headers de seguridad (CSP, HSTS, X-Frame-Options en /admin). Todo el bloque de enforcement es fail-open.
Cron externo
cron-job.org dispara los sondeos de uptime cada ~5 min; Vercel Cron dispara backups y rollups de seguridad. Ninguno mantiene estado propio: todo el estado vive en Turso.