Mike (@mikerb95) CodeByMike
Volver
/architecture Diseño de sistemas

Cómo está
construido esto.

Este sitio no es una plantilla: es un sistema con un panel privado, monitoreo propio y una pasarela de pagos. Aquí está su anatomía —capa por capa— y el porqué de cada decisión.

Cliente
Navegador del visitante
HTML SSR + islas
Astro entrega HTML renderizado; JS solo donde hace falta.
RUM web-vitals
Mide LCP/INP/CLS reales y los envía por beacon.
Borde
Vercel — Edge & Functions
CDN + caché
Páginas públicas con s-maxage + stale-while-revalidate.
Middleware
Auth, allowlist, headers de seguridad (CSP/HSTS), chaos flags.
SSR Functions
Astro server output: rutas dinámicas y API en Node.
Aplicación
Astro 6 (SSR) + Auth.js
Panel /admin
CRM, costos/P&L, bóveda cifrada, monitores, LAB.
API routes
Endpoints REST tipados; validación en servidor.
Auth JWT
GitHub OAuth + allowlist; sesiones por dispositivo revocables.
Datos
Turso (libSQL) + Drizzle ORM
Esquema tipado
Drizzle: migraciones versionadas en git.
Secretos AES-256-GCM
Credenciales cifradas en reposo; reveladas bajo demanda.

Servicios externos

cron-job.org
Dispara el motor de checks cada pocos minutos (el plan Hobby solo da 1 cron/día).
ntfy.sh
Push al móvil: caídas, SSL por vencer, sesión de admin nueva.
GitHub Actions
CI: tests + cobertura → registra cada run y habilita rollback.
GitHub OAuth
Único proveedor de identidad para el panel.
Resend
Email transaccional de alertas (canal secundario).

Decisiones y trade-offs

SSR sobre estático puro

El panel privado necesita datos en vivo y auth por request. Las páginas públicas se cachean en el edge, así que pago SSR solo donde aporta y sirvo el resto casi gratis.

JWT stateless, no sesiones en BD

Logins sin tocar la base de datos y cero infraestructura de sesión. El punto ciego —revocar— lo resolví con un sid firmado dentro del token y una tabla de dispositivos, sin abandonar el JWT.

Turso/libSQL en vez de Postgres

SQLite en el edge: latencia mínima, réplicas, y un modelo mental simple para un dominio que no necesita concurrencia masiva. Drizzle mantiene el esquema tipado y las migraciones en git.

Cron externo en vez del de Vercel

El plan Hobby limita a un cron diario, inútil para uptime. Un cron externo golpea un endpoint autenticado por token cada pocos minutos; el cron de Vercel queda de red de seguridad. La restricción de la plataforma fue el comienzo del diseño, no el final.

Fail-open en todo lo secundario

Telemetría, registro de sesiones y notificaciones nunca deben tumbar el flujo principal. Si un subsistema de observabilidad falla, degrada en silencio en vez de romper la experiencia.

Todo el código vive en un repositorio público como portafolio. Las decisiones aquí no son teoría: cada una tiene su commit, sus tests y —cuando aplica— su hallazgo de seguridad documentado en /security.