Este documento explica cómo ejecutar el proyecto completo, tanto en local como con Docker Compose.
El repositorio está compuesto por 4 microservicios Spring Boot:
auth-service→ autenticación y validación de tokenestudiantes-service→ gestión de estudiantescursos-service→ gestión de cursosmatriculas-service→ gestión de matrículas
Antes de ejecutar el proyecto, verifica que tengas instalado:
- Java 21
- Maven 3.9+
- Docker Desktop o Docker Engine + Docker Compose
- Un IDE como IntelliJ IDEA o VS Code
Comandos para validar el entorno:
java -version
mvn -version
docker --version
docker compose versionproyecto-s3/
├── auth-service/
├── estudiantes-service/
├── cursos-service/
├── matriculas-service/
├── docker-compose.yml
├── index.html
└── instrucciones/
| Servicio | Puerto |
|---|---|
| auth-service | 8081 |
| estudiantes-service | 8082 |
| cursos-service | 8083 |
| matriculas-service | 8084 |
Abre la carpeta raíz del proyecto en tu IDE.
Desde la carpeta raíz, ejecuta:
cd auth-service
mvn clean package -DskipTests
cd ..
cd estudiantes-service
mvn clean package -DskipTests
cd ..
cd cursos-service
mvn clean package -DskipTests
cd ..
cd matriculas-service
mvn clean package -DskipTests
cd ..Este paso es importante incluso si luego usarás Docker, porque los
Dockerfilecopian el.jardesde la carpetatarget/.
cd auth-service
mvn spring-boot:runEn otra terminal:
cd estudiantes-service
mvn spring-boot:runEn otra terminal:
cd cursos-service
mvn spring-boot:runEn otra terminal:
cd matriculas-service
mvn spring-boot:runUna vez levantados los servicios, puedes abrir Swagger en:
- Auth:
http://localhost:8081/swagger-ui.html - Estudiantes:
http://localhost:8082/swagger-ui.html - Cursos:
http://localhost:8083/swagger-ui.html - Matrículas:
http://localhost:8084/swagger-ui.html
Si necesitas revisar la base de datos en memoria de cada servicio:
- Auth:
http://localhost:8081/h2-console - Estudiantes:
http://localhost:8082/h2-console - Cursos:
http://localhost:8083/h2-console - Matrículas:
http://localhost:8084/h2-console
Parámetros generales de conexión:
- Driver:
org.h2.Driver - User Name:
sa - Password: vacío
Cada servicio tiene su propia URL JDBC interna definida en su application.yaml.
El auth-service carga automáticamente estos usuarios:
| Usuario | Contraseña | Rol |
|---|---|---|
| admin | admin123 | ADMIN |
| docente | docente123 | DOCENTE |
| estudiante | estudiante123 | ESTUDIANTE |
Se registra automáticamente un estudiante de ejemplo:
- Nombre: Ana Martínez
- Email:
ana@correo.edu - Edad: 19
Se registra automáticamente un curso de ejemplo:
- Código:
IS3-001 - Nombre:
Ingeniería de Software III - Créditos: 4
Abre:
http://localhost:8081/swagger-ui.html
Usa el endpoint POST /auth/login con este JSON:
{
"username": "admin",
"password": "admin123"
}Copia el valor del token que devuelve la respuesta.
Abre:
http://localhost:8082/swagger-ui.html
Haz clic en Authorize y pega:
Bearer TU_TOKEN_AQUI
Pruebas sugeridas:
GET /api/estudiantesPOST /api/estudiantesPUT /api/estudiantes/{id}DELETE /api/estudiantes/{id}
Abre:
http://localhost:8083/swagger-ui.html
Usa el mismo token y prueba:
GET /api/cursosPOST /api/cursosPUT /api/cursos/{id}DELETE /api/cursos/{id}
Abre:
http://localhost:8084/swagger-ui.html
Usa el mismo token y prueba:
GET /api/matriculasPOST /api/matriculas
Ejemplo de registro de matrícula:
{
"estudianteId": 1,
"cursoId": 1
}Debes ejecutar estos comandos antes de levantar Docker:
cd auth-service && mvn clean package -DskipTests && cd ..
cd estudiantes-service && mvn clean package -DskipTests && cd ..
cd cursos-service && mvn clean package -DskipTests && cd ..
cd matriculas-service && mvn clean package -DskipTests && cd ..Desde la raíz del proyecto:
docker compose up --builddocker psDeberías ver contenedores con nombres parecidos a:
auth-serviceestudiantes-servicecursos-servicematriculas-service
Las URLs siguen siendo las mismas:
http://localhost:8081/swagger-ui.htmlhttp://localhost:8082/swagger-ui.htmlhttp://localhost:8083/swagger-ui.htmlhttp://localhost:8084/swagger-ui.html
Docker Compose inyecta estas variables:
AUTH_SERVICE_URL=http://auth-service:8081
AUTH_SERVICE_URL=http://auth-service:8081
AUTH_SERVICE_URL=http://auth-service:8081ESTUDIANTES_SERVICE_URL=http://estudiantes-service:8082CURSOS_SERVICE_URL=http://cursos-service:8083
Si intentas acceder sin token o con token inválido, los servicios protegidos deben responder con una estructura uniforme similar a esta:
{
"success": false,
"message": "Debe enviar un token Bearer válido",
"errorCode": "AUTH_HEADER_MISSING",
"status": 401,
"path": "/api/recurso",
"timestamp": "2026-04-11T15:30:00"
}Si el token es válido pero el rol no tiene permisos suficientes, la respuesta esperada es 403.
Causa: no compilaste el servicio antes.
Solución:
mvn clean package -DskipTestsHazlo en cada módulo.
Causa: auth-service, estudiantes-service o cursos-service todavía no está arriba.
Solución:
- verifica que todos estén corriendo;
- espera unos segundos y vuelve a probar;
- revisa la terminal de cada servicio.
Causa posible:
- no enviaste el encabezado
Authorization; - el token expiró;
- el token no tiene formato
Bearer ....
Causa posible:
- el usuario sí está autenticado, pero no tiene el rol suficiente para ese endpoint.
Para demostrar que el proyecto corre correctamente, valida al menos esto:
- Login exitoso con
admin. - Login fallido con contraseña incorrecta.
- Acceso rechazado sin token a estudiantes, cursos o matrículas.
- Acceso exitoso con token válido.
- Creación de estudiante con rol
ADMIN. - Creación de curso con rol
ADMIN. - Registro de matrícula válido.
- Intento de matrícula con estudiante inexistente.
- Intento de matrícula duplicada.
- Intento de acceso con rol insuficiente.
docker compose downdocker compose down
cd auth-service && mvn clean package -DskipTests && cd ..
cd estudiantes-service && mvn clean package -DskipTests && cd ..
cd cursos-service && mvn clean package -DskipTests && cd ..
cd matriculas-service && mvn clean package -DskipTests && cd ..
docker compose up --buildSi quieres complementar este README, la carpeta instrucciones/ incluye las páginas HTML del proyecto, la guía general, la guía de seguridad y la explicación por cada módulo.