Servicio diseñado para apoyar la gestión integral de proyectos que permiten a los estudiantes aplicar conocimientos académicos a situaciones del mundo real, a menudo en colaboración con empresas en entornos de ingeniería aplicada. Su propósito es facilitar la administración, seguimiento y evaluación de los proyectos de titulación, permitiendo optimizar los recursos disponibles y mejorar la coordinación entre los distintos actores involucrados.
Monorepo con dos aplicaciones que comparten una base de datos PostgreSQL y un bucket de objetos (RustFS, S3-compatible):
| Carpeta | Qué es |
|---|---|
hub-backend/ |
API REST — NestJS 11, Prisma 7 (adaptador pg), PostgreSQL 15 y RustFS/S3. |
hub-frontend/ |
App web — Next.js 16 (App Router), React 19, Tailwind v4 y shadcn/ui. |
- Backend. Autenticación propia: contraseñas con scrypt y tokens HMAC-SHA256;
AuthGuardglobal (todas las rutas exigen token salvo las marcadas@Public()). Los roles globales (admin,directivo,evaluator,teacher,proposer,student) se combinan con asignaciones por proyecto enAuthorizationService. Swagger en/api. - Frontend. El navegador nunca llama al backend: cada
app/api/**/route.tsactúa como BFF y reenvía aBACKEND_URL, evitando CORS. La sesión se guarda enlocalStoragey la identidad visual sigue el sistema de diseño UTB. - Evaluación. Rúbricas por área creadas por directivos, asignadas por proyecto y semestre, y una evaluación con nota ponderada por cada evaluador asignado. El avance de fase y el cierre exigen las evaluaciones correspondientes.
- Archivos. Los binarios viven en RustFS/S3; las subidas y descargas pasan por la API y los objetos huérfanos se limpian con
npm run storage:gc. - Errores. Las respuestas siguen una forma consistente (
statusCode,message,error); la caída de la base de datos se traduce a503y hay una sondaGET /health.
El detalle de cada capa está en la documentación.
Requisitos: Docker + Docker Compose (recomendado) o Node 20+, PostgreSQL y RustFS locales. Ver BUILD.md para el detalle.
docker compose -f .devcontainer/docker-compose.yml up --buildAbre el proyecto en VS Code, ejecuta Dev Containers: Reopen in Container y, dentro del contenedor, instala dependencias y arranca:
cd /workspace/hub-backend && npm ci
cd /workspace/hub-frontend && npm cicp .env.example .env
cp hub-backend/.env.example hub-backend/.env
cp hub-frontend/.env.example hub-frontend/.env
docker compose up --build# Backend
cd hub-backend
npm ci
npx prisma generate
npx prisma migrate dev --name init
npm run start:dev # http://localhost:3001 (Swagger en /api)
# Frontend
cd hub-frontend
npm ci
npm run dev # http://localhost:3000Al correr el backend fuera de Docker, hub-backend/.env debe apuntar a localhost (DATABASE_URL, S3_ENDPOINT).
| Servicio | URL |
|---|---|
| Frontend | http://localhost:3000 |
| Backend (Swagger) | http://localhost:3001/api |
| RustFS (API / consola) | http://localhost:9000 · http://localhost:9001 |
| PostgreSQL | localhost:5432 |
hub-backend/.env:DATABASE_URL,AUTH_SECRET(mínimo 32 caracteres),S3_*y, para el primer arranque,INITIAL_ADMIN_EMAIL/INITIAL_ADMIN_PASSWORD/INITIAL_ADMIN_NAME(crean el admin inicial si la base está vacía).hub-frontend/.env:BACKEND_URL(por defectohttp://localhost:3001).
Con PostgreSQL migrado (y RustFS para los anexos):
cd hub-backend
npm run seed # usuarios, proyectos, actores, hitos, observaciones, anexos
npm run seed:reset # borra y vuelve a crear los datos sembradosCredenciales de ejemplo (todas con contraseña Capstone123!): admin.seed@capstonehub.test, coord.ana@capstonehub.test, eval.maria@capstonehub.test, advisor.sofia@capstonehub.test, student.juan@capstonehub.test. Más detalles y flags en BUILD.md.
- BUILD.md — setup, seeds, storage y despliegue.
- Arquitectura: backend · base de datos · frontend
- Sistema de diseño del frontend
- Plan de SSO
- Propuesta · MVP · Arc42 · Estructura Proyectos
- Jhonatan Romani Terán
- Josue Annicchiarico Correa
- Alejandro Duarte García