An AI-driven course recommendation system designed specifically for TUM Informatics Master students. The platform combines collaborative filtering with AI-powered content analysis to provide personalized course suggestions based on student preferences, peer reviews, and curriculum requirements.
Master students in TUM Informatics face significant challenges when selecting suitable courses due to:
- Overwhelming options: 100+ modules across specializations (AI, Robotics, Software Engineering, etc.)
- Lack of peer insights: Difficulty gauging course relevance, workload, and quality
- Complex module handbooks: Technical descriptions that are often vague or hard to parse efficiently
Current solutions like Excel sheets and word-of-mouth recommendations lack personalization and data-driven insights.
A comprehensive web-based platform that:
- Collects user data through TUM-ID authentication and intuitive course rating interfaces
- Analyzes preferences using hybrid filtering algorithms and LLM-powered content analysis
- Generates recommendations that balance popularity with personal relevance while adhering to TUM curriculum requirements
- Reduces time spent on course selection research
- Increases satisfaction via personalized, peer-validated suggestions
- Improves curriculum adherence to TUM's degree requirements
- Provides transparency through community-driven reviews and ratings
- JWT-based authentication with TUM matriculation number and email login options
- Secure password hashing using Spring Security
- Student profile management with course enrollment tracking
- Comprehensive course catalog with 100+ TUM Informatics modules
- Category-based organization (AI, Robotics, Software Engineering, etc.)
- Detailed course information including credits, descriptions, and difficulty levels
- Search and filtering capabilities for easy course discovery
- 5-star rating system for course evaluation
- Written reviews with structured feedback collection
- Average rating calculation with real-time updates
- Student review history and management dashboard
- Hybrid recommendation engine combining collaborative and content-based filtering
- LLM integration (GPT-4/LangChain) for semantic course analysis
- RAG pipeline for processing TUM module handbooks
- Personalized suggestions based on preferences and peer reviews
- Prometheus metrics collection across all microservices
- Grafana dashboards for system health and performance monitoring
- Distributed tracing with comprehensive logging
- Alerting system for proactive issue detection
Our course recommendation system follows a microservices architecture designed for scalability and maintainability:
The system is decomposed into focused microservices with clear responsibilities:
graph TD
Client[Client Application<br/>React/TypeScript] --> API[API Gateway<br/>Nginx]
API --> Auth[Authentication Service<br/>Spring Boot]
API --> Course[Course Service<br/>Spring Boot]
API --> Review[Review Service<br/>Spring Boot]
API --> Rec[Recommendation Gateway<br/>Spring Boot]
Rec --> AI[GenAI Service<br/>FastAPI]
Auth --> DB[(Database<br/>MySQL)]
Course --> DB
Review --> DB
AI --> LLM[External LLM API<br/>GPT-4/OpenAI]
Monitor[Prometheus/Grafana] -.-> Auth
Monitor -.-> Course
Monitor -.-> Review
Monitor -.-> Rec
Monitor -.-> AI
style Client fill:#f9f,stroke:#333,stroke-width:2px
style API fill:#ccf,stroke:#333,stroke-width:2px
style Auth fill:#cfc,stroke:#333,stroke-width:2px
style Course fill:#cfc,stroke:#333,stroke-width:2px
style Review fill:#cfc,stroke:#333,stroke-width:2px
style Rec fill:#cfc,stroke:#333,stroke-width:2px
style AI fill:#fcc,stroke:#333,stroke-width:2px
style DB fill:#fcf,stroke:#333,stroke-width:2px
style Monitor fill:#cff,stroke:#333,stroke-width:2px
style LLM fill:#ffc,stroke:#333,stroke-width:2px
The system follows a microservices architecture with clear separation of concerns:
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ Client App │ │ Authentication │ │ Course Service │
│ (React/TS) │ │ Service │ │ (Spring Boot) │
│ │ │ (Spring Boot) │ │ │
└─────────────────┘ └─────────────────┘ └─────────────────┘
│ │ │
│ ┌─────────────────┐ │
└──────────────│ Gateway │─────────────┘
│ (Nginx) │
└─────────────────┘
│
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ Review Service │ │ Recommendation │ │ GenAI Service │
│ (Spring Boot) │ │ Gateway │ │ (FastAPI) │
│ │ │ (Spring Boot) │ │ │
└─────────────────┘ └─────────────────┘ └─────────────────┘
│
┌─────────────────┐
│ MySQL Database │
│ Cluster │
└─────────────────┘
team-git-happens/
├── client/ # React frontend application
│ ├── src/
│ │ ├── components/ # Reusable UI components
│ │ ├── pages/ # Route-based page components
│ │ ├── services/ # API service layer
│ │ ├── types/ # TypeScript type definitions
│ │ └── hooks/ # Custom React hooks
│ ├── Dockerfile # Multi-stage build configuration
│ └── nginx.conf # Reverse proxy configuration
├── server/ # Backend microservices
│ ├── authentication-service/ # User auth & JWT management
│ ├── course-service/ # Course catalog management
│ ├── review-service/ # Rating & review system
│ └── recommendation-gateway/ # AI recommendation orchestration
├── genai-service/ # Python AI/ML service
│ ├── main.py # FastAPI application
│ ├── ChatWebUI.py # LLM integration layer
│ └── requirements.txt # Python dependencies
├── helm-charts/ # Kubernetes deployment manifests
├── k8s/ # Additional K8s configurations
├── terraform/ # AWS infrastructure as code
├── monitoring/ # Prometheus & Grafana configuration
├── ansible/ # Configuration management
└── docs/ # Project documentation
- React 18 with TypeScript for type-safe development
- Vite for fast development and optimized builds
- TailwindCSS with Radix UI for modern, accessible components
- React Router for client-side routing
- Zustand for lightweight state management
- React Query for efficient server state management
- Spring Boot 3.4 with Java 21 for robust microservices
- Spring Security for authentication and authorization
- Spring Data JPA with Flyway migrations
- MySQL 8.0 for persistent data storage
- JWT for stateless authentication
- OpenAPI/Swagger for API documentation
- FastAPI for high-performance Python API
- LangChain for LLM orchestration and RAG pipelines
- HuggingFace Transformers for embeddings and NLP
- FAISS for efficient vector similarity search
- Sentence Transformers for semantic text analysis
- Docker & Docker Compose for containerization
- Kubernetes with Helm charts for orchestration
- Nginx for reverse proxy and load balancing
- Prometheus & Grafana for monitoring and observability
- GitHub Actions for CI/CD automation
- Terraform for AWS infrastructure provisioning
- Ansible for configuration management
Our project implements a comprehensive CI/CD strategy with separated pipelines for different deployment targets:
graph LR
A[Developer Push] --> B[GitHub Actions CI]
B --> C{Tests Pass?}
C -->|Yes| D[Build Docker Images]
C -->|No| E[Notify Failure]
D --> F[Push to GHCR]
F --> G1[AWS EC2 Deployment]
F --> G2[Kubernetes Deployment]
G1 --> H1[Terraform + Ansible]
G2 --> H2[Helm Charts]
H1 --> I1[Monitor EC2]
H2 --> I2[Monitor K8s]
style A fill:#f9f,stroke:#333,stroke-width:2px
style B fill:#ccf,stroke:#333,stroke-width:2px
style D fill:#cfc,stroke:#333,stroke-width:2px
style F fill:#fcf,stroke:#333,stroke-width:2px
style G1 fill:#fcc,stroke:#333,stroke-width:2px
style G2 fill:#cff,stroke:#333,stroke-width:2px
style E fill:#fdd,stroke:#333,stroke-width:2px
Purpose: Continuous Integration - Test and Build
- Triggers: Push to
main/develop, Pull requests - Actions:
- Frontend tests (Jest, linting)
- Backend tests (JUnit for all Spring Boot services)
- Build and push Docker images to GHCR with SHA tags
Purpose: Cloud deployment using Infrastructure as Code
- Triggers: Push to
main/develop, Manual dispatch - Environments:
staging|prod - Workflow:
- Infrastructure: Terraform provisions AWS EC2 infrastructure
- Deployment: Ansible deploys using
docker-compose.prod.yml - Health Checks: Automated service validation
Purpose: Container orchestration deployment
- Triggers: Manual dispatch with environment selection
- Actions: Deploy to Kubernetes cluster using Helm charts
- Features: Rolling updates, service mesh integration, monitoring
For detailed CI/CD architecture, see CI/CD Documentation.
- Docker & Docker Compose (v20.10+)
- Node.js (v18+) for local frontend development
- Java 21 for local backend development
- Python 3.9+ for AI service development
- kubectl & Helm (optional, for Kubernetes deployment)
-
Clone the repository
git clone https://github.com/aet-devops25/team-git-happens.git cd team-git-happens -
Set up environment variables
cp .env.example .env # Edit .env with your configuration -
Start the complete stack
docker-compose up -d
-
Access the application
- Frontend: http://localhost:3000
- API Documentation: http://localhost:8080/swagger-ui.html
- Grafana Dashboard: http://localhost:3001 (admin/admin123)
- Prometheus: http://localhost:9090
cd client
npm install
npm run dev # Start development server
npm run test # Run test suite
npm run lint # Run ESLint
npm run build # Create production buildcd server/[service-name]
./gradlew bootRun # Start service locally
./gradlew test # Run tests
./gradlew build # Create JAR filecd genai-service
python -m venv venv
source venv/bin/activate # On Windows: venv\Scripts\activate
pip install -r requirements.txt
uvicorn main:app --reload --host 0.0.0.0 --port 8000- Navigate to the registration page
- Enter TUM matriculation number, name, email, and password
- Login using either email or matriculation number
- JWT token is automatically managed for authenticated sessions
- Browse the course catalog with filtering options
- View detailed course information including descriptions and categories
- Read peer reviews and average ratings
- Submit your own reviews and ratings (authentication required)
- Access the recommendation page
- Select preferred course categories
- Specify credit preferences and additional interests
- Receive personalized course suggestions with explanations
- Explore recommended courses directly from results
# Health check all services
curl http://localhost:3000/api/health
# Get course recommendations
curl -X POST http://localhost:3000/api/recommendation \
-H "Content-Type: application/json" \
-d '{
"credits": 10,
"categories": ["Machine Learning"],
"description": "interested in AI and data science"
}'
# Submit a course review
curl -X POST http://localhost:3000/api/reviews \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_JWT_TOKEN" \
-d '{
"courseId": "IN2000",
"rating": 5,
"reviewText": "Excellent course!"
}'The TUM Course Recommendation System provides comprehensive API documentation using Swagger UI/OpenAPI. Instead of listing all endpoints in this README, you can explore the interactive API documentation directly.
Interactive Swagger UI interface for exploring and testing API endpoints
Each microservice has its own Swagger UI documentation available at:
| Service | Swagger UI URL | Description |
|---|---|---|
| Authentication Service | /swagger/auth/ | User registration, login, and JWT management |
| Course Service | /swagger/course/ | Course catalog management and category operations |
| Review Service | /swagger/review/ | Course rating and review system |
| Recommendation Gateway | /swagger/gateway/ | AI-powered course recommendations |
- Explore Endpoints: Browse available API endpoints with detailed parameter descriptions
- Try It Out: Execute API calls directly from the browser interface
- View Responses: See real response examples and status codes
- Authentication: Use the "Authorize" button to test authenticated endpoints
- Download Specs: Export OpenAPI specifications for integration
- Development:
http://localhost:3000 - Production:
http://k83-client-app.student.k8s.aet.cit.tum.de
cd client
npm test # Run Jest test suite
npm run test:coverage # Generate coverage report
npm run test:e2e # Run end-to-end testscd server/[service-name]
./gradlew test # Run unit tests
./gradlew integrationTest # Run integration tests
./gradlew jacocoTestReport # Generate coverage report- Unit Tests: Component/service level isolation testing
- Integration Tests: Database and API endpoint testing
- End-to-End Tests: Complete user workflow validation
- Load Tests: Performance and scalability validation
- Minimum 80% code coverage for all services
- Critical path testing for authentication and recommendations
- API contract testing using OpenAPI specifications
Our system implements comprehensive monitoring and observability using Prometheus, Grafana, and distributed logging to ensure system health and performance tracking.
Prometheus collects metrics from all microservices with custom instrumentation:
- Application metrics: Request rates, response times, error rates
- Business metrics: User registrations, course recommendations, review submissions
- Infrastructure metrics: CPU, memory, disk usage, container health
- Database metrics: Connection pools, query performance, transaction rates
Grafana provides real-time dashboards for different stakeholder needs:
| Dashboard | Purpose | Key Metrics |
|---|---|---|
| System Overview | High-level health monitoring | Service availability, response times, error rates |
| Application Performance | Deep-dive into service performance | Database queries, API latency, throughput |
| Business Intelligence | User engagement and system usage | Daily active users, recommendation accuracy, review trends |
| Infrastructure | Resource utilization and capacity | CPU/Memory usage, container health, network traffic |
Alertmanager provides proactive issue detection with configured rules:
- Critical alerts: Service downtime, database connection failures
- Warning alerts: High response times, elevated error rates
- Performance alerts: Memory/CPU threshold breaches
- Business alerts: Unusual user activity patterns
- Grafana Dashboard: http://localhost:3001 (admin/admin123)
- Prometheus UI: http://localhost:9090
- Alert Manager: http://localhost:9093
Each service exposes health check endpoints for monitoring:
# Service health endpoints
curl http://localhost:8080/actuator/health # Course Service
curl http://localhost:8081/actuator/health # Auth Service
curl http://localhost:8082/actuator/health # Review Service
curl http://localhost:8083/actuator/health # Recommendation Gateway
curl http://localhost:8000/health # GenAI ServiceFor detailed monitoring setup and configuration, see Monitoring Documentation.
# Database Configuration
DB_PASSWORD=your_mysql_password
DB_USERNAME=your_mysql_username
# AI Service Configuration
API_KEY=your_llm_api_key
API_URL=https://your-llm-api-endpoint
MODEL=gpt-4
# AWS Configuration
AWS_ACCESS_KEY_ID=your_aws_access_key
AWS_SECRET_ACCESS_KEY=your_aws_secret_key
AWS_SESSION_TOKEN=your_aws_session_token
AWS_REGION=us-east-1
# Kubernetes Configuration
KUBECONFIG=path_to_your_kubeconfig_file
# Infrastructure Configuration
EC2_SSH_PRIVATE_KEY=your_ec2_private_key- Client: 3000
- Course Service: 8080
- Authentication Service: 8081
- Review Service: 8082
- Recommendation Gateway: 8083
- GenAI Service: 8000
- MySQL: 3306
- Prometheus: 9090
- Grafana: 3001
docker-compose up -d # Start all services
docker-compose -f docker-compose.prod.yml up -d # Production configuration# Deploy with Helm
helm install course-app ./helm-charts/client-app
helm install auth-service ./helm-charts/authentication-service
helm install course-service ./helm-charts/course-service
helm install review-service ./helm-charts/review-service
helm install recommendation-gateway ./helm-charts/recommendation-gateway
helm install genai-service ./helm-charts/genai-service
# Apply additional configurations
kubectl apply -f k8s/unified-ingress.yaml
kubectl apply -f k8s/database-secret.yaml# Infrastructure provisioning
cd terraform
terraform init
terraform plan -var-file="prod.tfvars"
terraform apply -var-file="prod.tfvars"
# Application deployment
cd ../ansible
ansible-playbook -i inventory/hosts playbook.yml- Fork the repository and create a feature branch
- Follow coding standards (ESLint for frontend, CheckStyle for backend)
- Write comprehensive tests for new functionality
- Update documentation for API changes
- Submit pull request with detailed description
- Use functional components with hooks
- Implement TypeScript strict mode for type safety
- Follow React best practices for component design
- Use TailwindCSS for consistent styling
- Write comprehensive unit tests with Jest and Testing Library
- Follow Spring Boot conventions and annotations
- Implement proper exception handling with custom exceptions
- Use DTOs for API layer separation
- Write integration tests for database operations
- Document APIs with OpenAPI/Swagger annotations
- Follow PEP 8 style guidelines
- Use type hints for all function signatures
- Implement async/await for I/O operations
- Write comprehensive docstrings
- Use pytest for testing
- Ensure all tests pass and coverage requirements are met
- Update relevant documentation and API specifications
- Add appropriate labels and assign reviewers
- Address feedback and maintain clean commit history
- Merge only after approval from code owners
- Use issue templates for bug reports and feature requests
- Include reproduction steps and environment details
- Add appropriate labels for categorization
- Reference related issues and pull requests
This project is licensed under the MIT License - see the LICENSE file for details.
Copyright (c) 2025 AET-DevOps25
- Technical University of Munich (TUM) for providing the educational context and especially the Department of Computer Science.
- Spring Boot Community for the robust microservices framework
- React Team for the excellent frontend library
- LangChain for the powerful LLM integration capabilities
- Prometheus & Grafana communities for monitoring solutions
This project was developed as part of the TUM Advanced Engineering Technologies DevOps course. Special thanks to all team members who contributed to the design, development, and deployment of this comprehensive system.
- Spring Boot: Apache License 2.0
- React: MIT License
- LangChain: MIT License
- TailwindCSS: MIT License
- Prometheus: Apache License 2.0
- Grafana: AGPL-3.0 License
For more detailed information, please refer to the documentation in the /docs directory or visit our project wiki.


