🏗️ Arquitectura del Proyecto Yana
La arquitectura de Yana está diseñada para ser modular, escalable, mantenible y adecuada para ambientes productivos reales. Cada componente tiene una responsabilidad clara y se comunica con los demás de forma eficiente a través de protocolos estándar.
📊 Diagrama general del ecosistema
graph TD
Bot --> Core
Core --> DB
Core --> UI
UI --> Core
┌────────────────────────┐
│ Usuario (Discord) │
└────────────┬───────────┘
│
▼
┌────────────┐
│ yana-bot │ ◄──┐
└─────┬──────┘ │
│ │ Comandos Slash, eventos
▼ │
┌──────────────────┐ │
│ yana-core │◄┘
│ (NestJS + API) │
└─────┬──────┬──────┘
│ │
┌────────────────────────────┘ └────────────────────────────┐
▼ ▼
┌──────────────────────┐ ┌────────────────────────┐
│ PostgreSQL + Prisma │ │ WebSocket Gateway │
└──────────────────────┘ └──────────┬─────────────┘
│
▼
┌─────────────────────┐
│ yana-desk (UI) │
│ React + Vite + WS │
└─────────────────────┘
🔹 1. yana-bot (Bot de Discord)
Es el componente de entrada desde Discord. Construido con discord.js, se encarga de:
- Escuchar y ejecutar comandos Slash
/ - Detectar menciones especiales a roles o canales
- Asignar roles de forma dinámica
- Expulsar usuarios, enviar mensajes programados, registrar actividad
- Interactuar con
yana-corepor REST o WebSocket
✅ Este servicio es stateless y puede escalarse fácilmente en horizontal.
🔹 2. yana-core (Backend API)
Backend construido con NestJS, encargado de:
- Exponer endpoints HTTP REST
- Gestionar sockets WebSocket en tiempo real
- Manejar lógica de negocio: validaciones, acciones, reglas
- Gestionar usuarios, roles, sedes, clanes y actividad
- Conectarse a PostgreSQL usando Prisma ORM
🔐 Incluye validaciones de entrada, autenticación y capa de seguridad.
🔹 3. yana-desk (Frontend Admin)
Interfaz visual para administrar todo el ecosistema, creada con React + Vite. Permite:
- Iniciar sesión (con usuario y con OAuth de Teams)
- Visualizar dashboards, estadísticas y logs
- Programar mensajes, añadir cohortes, clanes y sedes
- Asignar o quitar usuarios, ver actividad por clan o sede
- Usar filtros y búsqueda inteligente
Se comunica con yana-core por REST y WebSocket.
🎨 Utiliza una paleta de colores corporativa inspirada en RIWI.io y diseño responsivo empresarial.
🔹 4. Base de Datos
Usamos PostgreSQL, gestionado por Prisma como ORM. Algunas tablas principales:
users: Usuarios registrados y validadosroles: Roles de Discord asociadosclans,cohorts,sedes: Agrupaciones organizativasmessages: Mensajes programados o enviadosactivity_logs: Logs de actividad (mensajes, comandos, reacciones, etc.)
🧩 La base de datos crece modularmente según las nuevas necesidades del ecosistema.
🔹 5. Infraestructura (yana-infrastructure)
Toda la infraestructura está contenida y orquestada con Docker. Características:
docker-composepara levantar los servicios de forma centralizada- GHCR (GitHub Container Registry) como repositorio de imágenes
- NGINX Proxy Manager como proxy reverso y gestor de certificados SSL
- CI/CD usando GitHub Actions, con despliegue automático a tu VPS
🚀 El objetivo es lograr zero downtime y despliegues automatizados desde el repositorio.
🌐 Comunicación entre componentes
| De → A | Protocolo | Ejemplo |
|---|---|---|
yana-desk → yana-core | REST / WS | GET /api/cohorts, ws://.../activity |
yana-bot → yana-core | REST / WS | Validación de usuarios, obtener roles |
yana-core → DB | Prisma ORM | prisma.user.findMany() |
🔐 Seguridad
- Comunicación por red interna privada en Docker
- Acceso a VPS solo por SSH con clave privada (desde CI o admins)
- Uso de
secretsen GitHub Actions para variables sensibles - Tokens API entre microservicios si se requiere
- HTTPS a través de NGINX Proxy Manager
♻️ Escalabilidad
El diseño permite escalar según sea necesario:
- Añadir Redis para colas o eventos pub/sub entre servicios
- Aumentar réplicas de
yana-coreoyana-bot - Usar CDN si en algún momento hay archivos públicos o contenido pesado
- Migrar a contenedores orquestados (Kubernetes) si se requiere a futuro
Con esta arquitectura, Yana puede crecer de forma controlada, organizada y profesional, manteniendo su enfoque en facilitar la gestión de comunidades en Discord.