Index: backend/.gitignore
===================================================================
--- backend/.gitignore	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
+++ backend/.gitignore	(revision b195962b09cc87b68efe01f35cd5b386de7aaf63)
@@ -7,4 +7,6 @@
 /src/main/resources/application-dev.properties
 /src/main/resources/application-test.properties
+
+.env
 
 ### IntelliJ IDEA ###
Index: backend/Dockerfile
===================================================================
--- backend/Dockerfile	(revision b195962b09cc87b68efe01f35cd5b386de7aaf63)
+++ backend/Dockerfile	(revision b195962b09cc87b68efe01f35cd5b386de7aaf63)
@@ -0,0 +1,4 @@
+FROM maven:3.9-eclipse-temurin-21
+WORKDIR /app
+COPY . .
+CMD ["mvn", "spring-boot:run"]
Index: backend/pom.xml
===================================================================
--- backend/pom.xml	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
+++ backend/pom.xml	(revision b195962b09cc87b68efe01f35cd5b386de7aaf63)
@@ -128,5 +128,5 @@
 		</dependency>
 
-<!--		Amazon web services-->
+		<!-- Amazon web services-->
 		<dependency>
 			<groupId>software.amazon.awssdk</groupId>
@@ -136,4 +136,11 @@
 			<groupId>software.amazon.awssdk</groupId>
 			<artifactId>auth</artifactId>
+		</dependency>
+
+		<!-- Dotenv Java-->
+		<dependency>
+			<groupId>io.github.cdimascio</groupId>
+			<artifactId>dotenv-java</artifactId>
+			<version>3.2.0</version>
 		</dependency>
 	</dependencies>
Index: backend/src/main/java/com/shifterwebapp/shifter/ShifterApplication.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/ShifterApplication.java	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
+++ backend/src/main/java/com/shifterwebapp/shifter/ShifterApplication.java	(revision b195962b09cc87b68efe01f35cd5b386de7aaf63)
@@ -1,7 +1,7 @@
 package com.shifterwebapp.shifter;
+import io.github.cdimascio.dotenv.Dotenv;
 
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
-import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
 
 @SpringBootApplication
@@ -9,4 +9,18 @@
 
 	public static void main(String[] args) {
+		Dotenv dotenv = Dotenv.configure()
+				.ignoreIfMissing()
+				.load();
+
+		// Set env variables from .env file
+		System.setProperty("JWT_CONFIG_SECRET", dotenv.get("JWT_CONFIG_SECRET"));
+		System.setProperty("SPRING_DATASOURCE_URL", dotenv.get("SPRING_DATASOURCE_URL"));
+		System.setProperty("SPRING_DATASOURCE_USERNAME", dotenv.get("SPRING_DATASOURCE_USERNAME"));
+		System.setProperty("SPRING_DATASOURCE_PASSWORD", dotenv.get("SPRING_DATASOURCE_PASSWORD"));
+		System.setProperty("AWS_S3_REGION", dotenv.get("AWS_S3_REGION"));
+		System.setProperty("AWS_S3_BUCKET_NAME", dotenv.get("AWS_S3_BUCKET_NAME"));
+		System.setProperty("AWS_S3_ACCESS_KEY", dotenv.get("AWS_S3_ACCESS_KEY"));
+		System.setProperty("AWS_S3_SECRET_KEY", dotenv.get("AWS_S3_SECRET_KEY"));
+
 		SpringApplication.run(ShifterApplication.class, args);
 	}
Index: backend/src/main/java/com/shifterwebapp/shifter/course/CourseController.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/course/CourseController.java	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
+++ backend/src/main/java/com/shifterwebapp/shifter/course/CourseController.java	(revision b195962b09cc87b68efe01f35cd5b386de7aaf63)
@@ -109,5 +109,5 @@
             List<CourseDtoPreview> topRatedCourses = courseService.getTopRatedCourses();
 //            List<CourseDto> mostPopularCourses = courseService.getMostPopularCourses();
-            return ResponseEntity.ok(topRatedCourses.subList(0, 5));
+            return ResponseEntity.ok(topRatedCourses);
         }
 
Index: backend/src/main/java/com/shifterwebapp/shifter/course/CourseRepository.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/course/CourseRepository.java	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
+++ backend/src/main/java/com/shifterwebapp/shifter/course/CourseRepository.java	(revision b195962b09cc87b68efe01f35cd5b386de7aaf63)
@@ -14,5 +14,5 @@
     List<Course> findCoursesByIdNotIn(List<Long> courseIds);
 
-    @Query("select c from Course c order by c.rating/c.ratingCount desc")
+    @Query("select c from Course c order by case when c.ratingCount = 0 then 0 else c.rating/c.ratingCount end desc")
     List<Course> findCoursesOrderedByRating();
 
Index: backend/src/main/java/com/shifterwebapp/shifter/course/service/CourseService.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/course/service/CourseService.java	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
+++ backend/src/main/java/com/shifterwebapp/shifter/course/service/CourseService.java	(revision b195962b09cc87b68efe01f35cd5b386de7aaf63)
@@ -168,5 +168,9 @@
     public List<CourseDtoPreview> getTopRatedCourses() {
         List<Course> courses = courseRepository.findCoursesOrderedByRating();
-        return courseMapperPreview.toDto(courses);
+        int limit = Math.min(5, courses.size());
+        return courseMapperPreview.toDto(
+                courses
+                        .subList(0, limit)
+        );
     }
 
@@ -174,5 +178,9 @@
     public List<CourseDtoPreview> getMostPopularCourses() {
         List<Course> courses = courseRepository.findCoursesOrderedByPopularity();
-        return courseMapperPreview.toDto(courses);
+        int limit = Math.min(5, courses.size());
+        return courseMapperPreview.toDto(
+                courses
+                        .subList(0, limit)
+        );
     }
 
Index: docker-compose.yml
===================================================================
--- docker-compose.yml	(revision b195962b09cc87b68efe01f35cd5b386de7aaf63)
+++ docker-compose.yml	(revision b195962b09cc87b68efe01f35cd5b386de7aaf63)
@@ -0,0 +1,23 @@
+version: '3.8'
+
+services:
+  frontend:
+    build:
+      context: ./frontend
+      dockerfile: Dockerfile
+    ports:
+      - "5173:80"
+    depends_on:
+      - backend
+
+  backend:
+    build:
+      context: ./backend
+      dockerfile: Dockerfile
+    ports:
+      - "8080:8080"
+    volumes:
+      - ./backend:/app
+      - ~/.m2:/root/.m2
+    env_file:
+      - backend/.env
Index: frontend/Dockerfile
===================================================================
--- frontend/Dockerfile	(revision b195962b09cc87b68efe01f35cd5b386de7aaf63)
+++ frontend/Dockerfile	(revision b195962b09cc87b68efe01f35cd5b386de7aaf63)
@@ -0,0 +1,11 @@
+# Build stage
+FROM node:20-alpine as build
+WORKDIR /app/frontend
+COPY package*.json ./
+RUN npm install
+COPY . .
+RUN npm run build
+
+# Serve stage
+FROM nginx:alpine
+COPY --from=build /app/frontend/dist /usr/share/nginx/html
Index: frontend/src/components/CustomStepper.tsx
===================================================================
--- frontend/src/components/CustomStepper.tsx	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
+++ frontend/src/components/CustomStepper.tsx	(revision b195962b09cc87b68efe01f35cd5b386de7aaf63)
@@ -1,7 +1,6 @@
 import {StepConnector, stepConnectorClasses, type StepIconProps, styled} from "@mui/material";
 import Check from "@mui/icons-material/Check";
-import React from "react";
 
-const CustomStepperConnector = styled(StepConnector)(({ theme }) => ({
+const CustomStepperConnector = styled(StepConnector)(() => ({
     [`&.${stepConnectorClasses.alternativeLabel}`]: {
         top: 10,
Index: frontend/src/components/DashboardCourses.tsx
===================================================================
--- frontend/src/components/DashboardCourses.tsx	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
+++ frontend/src/components/DashboardCourses.tsx	(revision b195962b09cc87b68efe01f35cd5b386de7aaf63)
@@ -8,5 +8,5 @@
 function DashboardCourses() {
     const {allCourses: allCoursesStorage, setAllCourses: setAllCoursesStorage} = useCourseStorage();
-    const {user, loading, accessToken} = useAuthContext();
+    const {user, accessToken} = useAuthContext();
 
     const [selectedTab, setSelectedTab] = useState("all");
Index: frontend/src/context/AuthContext.tsx
===================================================================
--- frontend/src/context/AuthContext.tsx	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
+++ frontend/src/context/AuthContext.tsx	(revision b195962b09cc87b68efe01f35cd5b386de7aaf63)
@@ -70,5 +70,5 @@
                 setAccessToken(null);
                 setUser(null);
-                navigate("/");
+                navigate("/courses");
             })
             .catch(err => {
