EstevezAlvarez

Proyectos

Access Observability Dashboard

Sistema propio de analítica web: nada de Google Analytics. Un microservicio FastAPI recibe eventos del frontend vía beacon, los persiste en PostgreSQL y agrega métricas en tiempo real accesibles desde un dashboard privado con JWT.

FastAPI PostgreSQL Docker JWT Python

Arquitectura del sistema

Tres capas desacopladas: frontend estático, API de colecta y dashboard privado.

estevezalvarez .com HTML / CSS / JS beacon api.estevezalvarez .com FastAPI · Docker rate limit · CORS PostgreSQL access_event *_summary ×3 cron Agregación APScheduler cada hora admin. estevezalvarez JWT · privado GET /public/summary (sin auth)
Flujo completo: el beacon del sitio estático envía eventos a la API (sin bloquear navegación); PostgreSQL persiste y agrega; el dashboard privado consume con JWT; la ruta pública expone métricas agregadas.

Modelo de datos

Cuatro tablas: eventos brutos con TTL de 90 días y tres tablas de resumen que crecen indefinidamente.

access_event id BIGSERIAL PK created_atTIMESTAMPTZ page TEXT referrerTEXT lang TEXT device TEXT tz TEXT country TEXT city TEXT TTL 90 días daily_summary id SERIAL PK date DATE UNIQUE total INT mobile INT desktopINT page_summary id SERIAL PK date DATE page TEXT visits INT UNIQUE(date,page) country_summary id SERIAL PK date DATE country TEXT visits INT UNIQUE(date,country)
access_event almacena eventos brutos (se purgan a los 90 días). Las tres tablas de resumen acumulan agregaciones diarias generadas por el pipeline de APScheduler.

Privacidad y seguridad

El sistema no almacena IPs ni usa cookies. Todos los datos son anonimizados en origen.

Privacidad del usuario

  • Sin IP almacenada — solo el servidor la ve para derivar país/ciudad
  • Sin cookies — el beacon es stateless, no identifica usuarios
  • Sin fingerprinting — solo UA string para inferir mobile/desktop
  • Timezone del navegador para horarios de pico (no geolocalización exacta)
  • Datos brutos purgados a los 90 días automáticamente

Seguridad de la API

  • CORS restringido por subdominio y ruta
  • Rate limiting en POST /access-events (10 req/min/IP)
  • Dashboard admin protegido con JWT HS256 (24h expiry)
  • Contraseña admin almacenada como hash bcrypt en variable de entorno
  • Infraestructura separada del sitio estático (VPS + Docker)

Métricas en vivo conectando…

Datos agregados del sitio — actualizados cada hora por el pipeline de agregación.

Visitas (7 días)
% Mobile
Páginas distintas

Visitas por día (últimos 7 días)

Páginas más visitadas

Cargando…

Dispositivos

Cargando…

Stack técnico

Backend (microservicio)

Activo

API REST en FastAPI con SQLAlchemy async, pydantic-settings para configuración desde .env, APScheduler para las agregaciones horarias y SlowAPI para rate limiting.

FastAPI Python SQLAlchemy APScheduler

Infraestructura

Activo

Docker Compose con servicios separados para API y PostgreSQL en dev; Nginx como reverse proxy en producción con Certbot para TLS automático en api.* y admin.*.

Docker PostgreSQL Nginx JWT

Frontend de colecta

Un único bloque IIFE en app.js usa navigator.sendBeacon() para enviar datos al endpoint sin bloquear la navegación. Cero dependencias externas, cero cookies, cero impacto en el tiempo de carga.

sendBeacon Vanilla JS Privacy-first