diff --git a/.dockerignore b/.dockerignore
new file mode 100644
index 0000000..eeab35a
--- /dev/null
+++ b/.dockerignore
@@ -0,0 +1,8 @@
+# Ignore everything by default
+*
+
+# Include what we need
+!**/src
+!.mvn
+!**/pom.xml
+!mvnw
diff --git a/docker-compose.yaml b/docker-compose.yaml
index 62c0038..2edd805 100644
--- a/docker-compose.yaml
+++ b/docker-compose.yaml
@@ -16,19 +16,21 @@ services:
timeout: 5s
interval: 5s
retries: 10
- shareit:
- image: shareit:latest
- build: .
- container_name: shareit-app
+ server:
+ image: shareit-server:latest
+ build:
+ context: .
+ dockerfile: server/Dockerfile
+ container_name: server
restart: unless-stopped
ports:
- - "8080:8080"
+ - "9090:9090"
environment:
SPRING_DATASOURCE_URL: jdbc:postgresql://db:5432/shareit
SPRING_DATASOURCE_USERNAME: shareit_user
SPRING_DATASOURCE_PASSWORD: secret
healthcheck:
- test: wget --no-verbose --tries=1 --spider http://localhost:8080/actuator/health || exit 1
+ test: wget --no-verbose --tries=1 --spider http://localhost:9090/actuator/health || exit 1
interval: 30s
timeout: 5s
start_period: 30s
@@ -37,5 +39,27 @@ services:
db:
condition: service_healthy
+ gateway:
+ image: shareit-gateway:latest
+ build:
+ context: .
+ dockerfile: gateway/Dockerfile
+ container_name: gateway
+ restart: unless-stopped
+ ports:
+ - "8080:8080"
+ environment:
+ SHAREIT_SERVER_URL: http://server:9090
+ healthcheck:
+ test: wget --no-verbose --tries=1 --spider http://localhost:8080/actuator/health || exit 1
+ interval: 30s
+ timeout: 5s
+ start_period: 30s
+ retries: 5
+ depends_on:
+ server:
+ condition: service_healthy
+
+
volumes:
postgres-data:
diff --git a/gateway/Dockerfile b/gateway/Dockerfile
new file mode 100644
index 0000000..651c654
--- /dev/null
+++ b/gateway/Dockerfile
@@ -0,0 +1,40 @@
+FROM maven:3.9.11-amazoncorretto-21 AS builder
+WORKDIR /application
+
+COPY pom.xml ./
+
+COPY gateway/pom.xml gateway/pom.xml
+COPY server/pom.xml server/pom.xml
+
+ENV MAVEN_OPTS="-Dmaven.repo.local=/app/.m2/repository"
+RUN mvn -pl gateway -am dependency:go-offline -B
+COPY gateway/src ./gateway/src
+
+RUN mvn clean package -pl gateway -am -DskipTests
+
+FROM amazoncorretto:21.0.8-alpine AS layers
+WORKDIR /application
+COPY --from=builder /application/gateway/target/*.jar app.jar
+RUN java -Djarmode=tools -jar app.jar extract --layers --destination extracted
+
+FROM amazoncorretto:21.0.8-alpine
+VOLUME /tmp
+RUN adduser -S spring-user
+USER spring-user
+
+WORKDIR /application
+
+COPY --from=layers /application/extracted/dependencies/ ./
+COPY --from=layers /application/extracted/spring-boot-loader/ ./
+COPY --from=layers /application/extracted/snapshot-dependencies/ ./
+COPY --from=layers /application/extracted/application/ ./
+
+RUN java -XX:ArchiveClassesAtExit=app.jsa -Dspring.context.exit=onRefresh -jar app.jar & exit 0
+
+ENV JAVA_CDS_OPTS="-XX:SharedArchiveFile=app.jsa -Xlog:class+load:file=/tmp/classload.log"
+ENV JAVA_ERROR_FILE_OPTS="-XX:ErrorFile=/tmp/java_error.log"
+
+ENTRYPOINT java \
+ $JAVA_ERROR_FILE_OPTS \
+ $JAVA_CDS_OPTS \
+ -jar app.jar
diff --git a/gateway/pom.xml b/gateway/pom.xml
new file mode 100644
index 0000000..c4d9312
--- /dev/null
+++ b/gateway/pom.xml
@@ -0,0 +1,32 @@
+
+
+ 4.0.0
+
+ ru.practicum
+ shareit
+ 0.0.1-SNAPSHOT
+
+
+ shareit-gateway
+
+ ShareIt Gateway
+
+
+
+ org.springframework.boot
+ spring-boot-starter-validation
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
+
diff --git a/gateway/src/main/java/ru/practicum/shareit/ShareItGateway.java b/gateway/src/main/java/ru/practicum/shareit/ShareItGateway.java
new file mode 100644
index 0000000..f00d25d
--- /dev/null
+++ b/gateway/src/main/java/ru/practicum/shareit/ShareItGateway.java
@@ -0,0 +1,12 @@
+package ru.practicum.shareit;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class ShareItGateway {
+
+ public static void main(String[] args) {
+ SpringApplication.run(ShareItGateway.class, args);
+ }
+}
diff --git a/gateway/src/main/java/ru/practicum/shareit/booking/BookingController.java b/gateway/src/main/java/ru/practicum/shareit/booking/BookingController.java
new file mode 100644
index 0000000..e906bf0
--- /dev/null
+++ b/gateway/src/main/java/ru/practicum/shareit/booking/BookingController.java
@@ -0,0 +1,102 @@
+package ru.practicum.shareit.booking;
+
+import jakarta.validation.Valid;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.client.RestClient;
+import ru.practicum.shareit.booking.dto.BookingDto;
+
+@Validated
+@RestController
+@RequestMapping(path = "/bookings")
+public class BookingController {
+ private static final String SHARER_USER_ID_HEADER = "X-Sharer-User-Id";
+ private final RestClient restClient;
+
+ @Autowired
+ public BookingController(@Value("${shareit-server.url}") String baseUrl) {
+ this.restClient = RestClient.builder()
+ .baseUrl(baseUrl.concat("/bookings"))
+ .build();
+ }
+
+ @PostMapping
+ public ResponseEntity