Pulsa una habilidad: se encienden en el mapa las piezas donde la usé y te cuento para qué.
- NestJS
- Toda la API: un módulo por dominio, guards de JWT y roles, transacciones al dar XP y el gateway de WebSockets.
- JavaScript / TypeScript
- Backend y frontend en TypeScript, con los mismos tipos compartidos en el monorepo.
- Next.js
- Contribuí al frontend: componentes de servidor para los rankings y la sesión con NextAuth en una cookie HTTP-Only.
- PostgreSQL
- Esquema con UUID, preguntas en JSONB, índices para el ranking y la restricción única que acabó con el doble XP.
- Keycloak
- Login OIDC con PKCE, realm propio, roles de administrador y estudiante, y validación del JWT con sus claves públicas.
- Redis
- Puente de Socket.io entre réplicas y caché del ranking: de 150 ms a 2 ms.
- Kubernetes / K3s
- Clúster K3s de un nodo: Deployments, PostgreSQL en StatefulSet, volúmenes, Jobs de migración y rutas de Traefik.
- Argo CD
- GitOps: Argo CD dejaba el clúster igual que lo descrito en Git. Nada se aplicaba a mano.
- GitLab CI · GitHub Actions
- Lint, tests (Jest y Playwright con informes JUnit), build multi-stage y publicación de imágenes con la etiqueta del commit.
- Prometheus · Grafana · Loki
- Prometheus con cAdvisor, Loki y Promtail para los logs, y siete reglas de alerta en Grafana.
- Docker
- Imágenes multi-stage de 1,2 GB a 180 MB; en local todo arrancaba con docker-compose.
- Traefik
- Ingress de K3s con Let's Encrypt, detrás del Traefik de casa. El bucle con Keycloak se arregló con X-Forwarded-Proto.
- Linux (Debian, Alpine, Arch)
- El nodo lo preparé desde cero: sistema, cortafuegos y K3s.
- Proxmox VE
- La VM del clúster vivía en mi servidor Proxmox, junto al resto del homelab.
- Git
- Monorepo con ramas por funcionalidad y hooks (husky y lint-staged) que no dejaban commitear código con errores.