← PROYECTOS
Caso de estudio — Hobby · 2026

ATHLETIC

DE COÍN

Un proyecto por puro hobby y para apoyar al club. El club necesitaba algo más que una web: publicar noticias sin depender de nadie, llevar el marcador desde el campo, gestionar socios y tener la clasificación al día. Diseño, desarrollo e infraestructura, de la primera maqueta al servidor en producción.

Escudo del Club Athletic de Coín
● EN PRODUCCIÓN
NUXT 4 ✦ SSR ✦ API REST ✦ SQLITE ✦ NODE.JS ✦ LINUX ✦ CLOUDFLARE ✦ CLAUDE CODE ✦ DIRECTO ✦ PANEL ✦ NUXT 4 ✦ SSR ✦ API REST ✦ SQLITE ✦ NODE.JS ✦ LINUX ✦ CLOUDFLARE ✦ CLAUDE CODE ✦ DIRECTO ✦ PANEL ✦
700+
Commits desde mayo
56
Ficheros de tests
17
Migraciones de esquema
<15
Minutos en restaurar todo
01 / QUÉ HACE

Dos caras.

Web pública

[FANS]
  • → Próximo partido con cuenta atrás y últimos resultados
  • → Calendario completo y acta de cada partido
  • → Clasificación con la forma de los últimos partidos
  • → Plantilla con ficha y estadísticas de cada jugador
  • → Noticias por categoría, optimizadas para buscadores
  • → Marcador en directo para seguir el partido
  • → Hazte socio y formulario de contacto

Panel del club

[ADMIN]
  • → Editor de noticias con vista previa y «Crear con IA»
  • → Partidos, alineaciones y actas con avisos de incoherencias
  • → Mando del directo para anotar desde la banda
  • → Estadísticas, hoja y apuntes del entrenador
  • → Socios, equipos, patrocinadores y galería
  • → Correo del club integrado en el panel
  • → Usuarios con roles, permisos por categoría y auditoría
02 / ARQUITECTURA

Cómo está montado.

Un servidor Linux propio, una sola entrada pública y servicios separados por responsabilidad. Elige un recorrido para ver qué piezas intervienen.

INTERNET
Navegadores
Aficionados, grada y editores del club
DNS
Resolución del dominio
Fuente externa
Clasificación y resultados
ENTRADA SERVIDOR PROPIO
Proxy inverso
HTTPS y única entrada pública
Inicio de sesión
Acceso protegido al panel
SERVICIOS NODE SIN ACCESO DIRECTO
Web SSR
Nuxt 4 renderizado en servidor
API REST
Datos públicos y de administración, con permisos
Panel
Contenido, fotos y mando del directo
Directo
Marcador en vivo para la grada
Contacto
Formulario protegido contra bots
DATOS Y TAREAS CON RESPALDO
SQLite
Fuente única de verdad del club
Media
Fotos optimizadas a WebP
Tareas programadas
Clasificación, vigilancia y respaldos
FUERA
Copia externa
Respaldo fuera del servidor
FLUJO

El visitante entra por la única puerta pública, que sirve la web renderizada en servidor. La web no accede a los datos directamente: los pide a la API como cualquier otro cliente. El formulario de contacto está protegido contra bots.

03 / EVOLUCIÓN

De estático a plataforma.

  1. MAY 2026

    Arranque

    Nuxt 4 con Options API y Tailwind 4. El contenido vivía en ficheros JSON dentro del repositorio.

  2. JUN 2026

    Cloudflare Workers y primer panel

    Despliegue en Cloudflare Workers con GitHub Actions y un panel para editar el contenido. Publicar era un commit y un build.

  3. AGO 2026

    Directo sobre Workers y D1

    Marcador en vivo sobre Cloudflare Workers y D1, y el sitio estrena dominio propio: athleticdecoin.com.

  4. SEP 2026

    Migración a un VPS

    Los bloqueos de IPs de LaLiga afectaban a la infraestructura compartida justo en día de partido, cuando más se usa el directo. La plataforma pasa a un servidor propio.

  5. SEP 2026

    SQLite, API REST y SSR

    Los datos salen de git a SQLite detrás de una API propia y la web pasa a SSR. Publicar deja de esperar un build de un minuto: es inmediato.

  6. A FUTUROPRÓXIMO

    Siguiente etapa

    Web, panel y API juntos en un monorepo, cada servicio en su contenedor con Docker, Supabase como base de datos, las imágenes en un almacenamiento de objetos compatible con S3 y todos los despliegues automatizados con GitHub Actions.

    MonorepoDockerSupabaseAlmacenamiento S3GitHub Actions
04 / DECISIONES

Lo que no se ve.

01

Una sola puerta

Solo una entrada está expuesta a internet; el resto de servicios no es accesible desde fuera. El panel exige iniciar sesión y los permisos se comprueban en el servidor en cada petición, nunca solo en la interfaz.

02

Una fuente de verdad

Solo la API abre la base. Las estadísticas de cada jugador se derivan del acta y nadie las escribe a mano: corregir una asistencia es corregir el acta.

03

Respaldos que se ensayan

Instantáneas periódicas de la base con recuentos para verificarlas, restauraciones de prueba y copia fuera del servidor. Recuperar la aplicación entera se midió por debajo de 15 minutos.

04

Staging espejo

Un segundo entorno con su propia base, datos de producción anonimizados y el correo real apagado. Las migraciones se ensayan ahí antes de tocar producción.

05

Integraciones con permiso

La clasificación se trae con permiso de la fuente, con cadencia limitada y validada: si la tabla no cuadra consigo misma, no se publica.

06

SEO y privacidad

Títulos y descripciones con presupuesto de longitud, URLs canónicas y sitemap. La analítica no se carga hasta que el visitante acepta.

05 / MÉTODO

Cómo lo construí.

Cada cambio grande del proyecto nació de un problema real del club, no de probar tecnología por probarla.

01

Entender

Antes de cambiar algo, lo mido. La salida de Cloudflare llegó tras ver la web caer en día de partido, y el paso a base de datos tras comprobar que publicar una noticia obligaba a esperar un minuto de build.

02

Construir

Cambios pequeños y por fases, con tests automáticos, lint y build en CI. Lo que toca datos o servidor se ensaya en staging, con datos de producción anonimizados, antes de llegar a producción, y siempre hay respaldo para volver atrás.

03

Documentar

Cada decisión queda escrita en el repositorio: por qué se tomó, qué se descartó y qué errores enseñó. El proyecto se puede mantener y retomar sin depender de la memoria de nadie.

[HERRAMIENTAS]

La IA, una herramienta más

Uso asistentes como Claude Code igual que el editor o la terminal: para agilizar tareas repetitivas, moverme más rápido por el código o preparar tests. La arquitectura, el código que llega a producción y su mantenimiento son responsabilidad mía, y los conozco al detalle.

[EN EL PRODUCTO]

Crear con IA

También integré IA para los editores del club: el panel genera un prompt con las categorías y los límites de longitud para SEO, y la respuesta vuelve en JSON, se valida y rellena la noticia, lista para revisar antes de publicar.

06 / STACK

Con qué.

Nuxt 4Vue 3Options APITailwind CSS 4PiniaNode.jsSQLiteAPI RESTLinuxCloudflareTurnstileGitHub ActionsClaude Code