diff --git a/src/backend/auth-server/docker-compose.yml b/src/backend/auth-server/docker-compose.yml
index 44f97b9e..4d60f654 100644
--- a/src/backend/auth-server/docker-compose.yml
+++ b/src/backend/auth-server/docker-compose.yml
@@ -9,6 +9,8 @@ services:
depends_on:
mysql:
condition: service_healthy
+ redis:
+ condition: service_healthy
ports:
- "${AUTH_PORT}:${AUTH_PORT}"
environment:
diff --git a/src/backend/chat-server/Dockerfile b/src/backend/chat-server/Dockerfile
index f90496f6..4951e2e7 100644
--- a/src/backend/chat-server/Dockerfile
+++ b/src/backend/chat-server/Dockerfile
@@ -1,5 +1,5 @@
# 1️⃣ 베이스 이미지로 OpenJDK 17 사용
-FROM openjdk:17-jdk-slim AS build
+FROM amazoncorretto:17-alpine AS build
# 2️⃣ 작업 디렉토리 설정
WORKDIR /app
@@ -12,11 +12,11 @@ RUN chmod +x gradlew
RUN ./gradlew build -x test
# 5️⃣ 런타임 이미지로 OpenJDK 17 사용
-FROM openjdk:17-jdk-slim
+FROM amazoncorretto:17-alpine
WORKDIR /app
# 6️⃣ 빌드된 JAR 파일 복사
COPY --from=build /app/build/libs/*.jar app.jar
# 7️⃣ 컨테이너 실행 시 Spring Boot 애플리케이션 실행
-ENTRYPOINT ["java", "-jar", "app.jar"]
\ No newline at end of file
+ENTRYPOINT ["java", "-jar", "app.jar"]
diff --git a/src/backend/chat-server/docker-compose.yml b/src/backend/chat-server/docker-compose.yml
index 8a71bd7e..5e9e9a7f 100644
--- a/src/backend/chat-server/docker-compose.yml
+++ b/src/backend/chat-server/docker-compose.yml
@@ -12,6 +12,9 @@ services:
- "${CHAT_PORT_1}:${CHAT_PORT_1}"
networks:
- kickzo-network
+ depends_on:
+ kafka:
+ condition: service_healthy
chat-2:
build:
@@ -24,6 +27,9 @@ services:
- "${CHAT_PORT_2}:${CHAT_PORT_2}"
networks:
- kickzo-network
+ depends_on:
+ kafka:
+ condition: service_healthy
networks:
kickzo-network:
diff --git a/src/backend/chat-server/src/main/resources/logback.xml b/src/backend/chat-server/src/main/resources/logback.xml
index ba195308..6da615f9 100644
--- a/src/backend/chat-server/src/main/resources/logback.xml
+++ b/src/backend/chat-server/src/main/resources/logback.xml
@@ -2,21 +2,6 @@
-
-
- [%thread] [%date] [%level] [%file:%line] - %msg%n
-
- kickzo-logs
- kickzo-log
- ap-northeast-1
- 50
- 30000
- 5000
- 0
- ${AWS_ACCESS_KEY}
- ${AWS_SECRET_KEY}
-
-
@@ -24,15 +9,33 @@
-
-
+
+
+
+
+ [%thread] [%date] [%level] [%file:%line] - %msg%n
+
+ kickzo-logs
+ kickzo-log
+ ap-northeast-1
+ 50
+ 30000
+ 5000
+ 0
+ ${AWS_ACCESS_KEY}
+ ${AWS_SECRET_KEY}
+
+
+
+
-
-
-
+
+
+
+
-
\ No newline at end of file
+
diff --git a/src/backend/elk/docker-compose-es.yml b/src/backend/elk/docker-compose-es.yml
index 2372d658..613305c6 100644
--- a/src/backend/elk/docker-compose-es.yml
+++ b/src/backend/elk/docker-compose-es.yml
@@ -16,24 +16,34 @@ services:
volumes:
- es-data:/usr/share/elasticsearch/data
- ./elasticsearch-init.sh:/usr/share/elasticsearch/init.sh
- entrypoint: [ "/bin/sh", "-c", "/usr/share/elasticsearch/init.sh & /usr/local/bin/docker-entrypoint.sh" ]
+ entrypoint:
+ [
+ "/bin/sh",
+ "-c",
+ "/usr/share/elasticsearch/init.sh & /usr/local/bin/docker-entrypoint.sh",
+ ]
ulimits:
memlock:
soft: -1
hard: -1
networks:
- kickzo-network
- restart: always
+ # ARM64 아키텍처 문제 해결을 위한 플랫폼 지정
+ platform: linux/amd64
healthcheck:
- test: [ "CMD", "curl", "-f", "http://localhost:9200/_cluster/health" ]
- interval: 10s
- timeout: 5s
- retries: 10
- start_period: 10s
+ test:
+ [
+ "CMD-SHELL",
+ 'curl -s http://localhost:9200/_cluster/health | grep -vq ''"status":"red"''',
+ ]
+ interval: 5s
+ timeout: 3s
+ retries: 20
+ start_period: 30s
volumes:
es-data:
networks:
kickzo-network:
- driver: bridge
\ No newline at end of file
+ driver: bridge
diff --git a/src/backend/elk/docker-compose-kibana.yml b/src/backend/elk/docker-compose-kibana.yml
index 5aaba3a7..5f89ecc0 100644
--- a/src/backend/elk/docker-compose-kibana.yml
+++ b/src/backend/elk/docker-compose-kibana.yml
@@ -16,16 +16,19 @@ services:
networks:
- kickzo-network
healthcheck:
- test: [ "CMD", "curl", "-f", "http://localhost:5601/api/status" ]
- interval: 10s
- timeout: 5s
- retries: 10
- start_period: 10s
-
+ test:
+ [
+ "CMD-SHELL",
+ "curl -s -I http://localhost:5601/app/home | grep -q '200 OK'",
+ ]
+ interval: 5s
+ timeout: 3s
+ retries: 20
+ start_period: 30s
volumes:
es-data:
networks:
kickzo-network:
- driver: bridge
\ No newline at end of file
+ driver: bridge
diff --git a/src/backend/file-server/Dockerfile b/src/backend/file-server/Dockerfile
index f90496f6..4951e2e7 100644
--- a/src/backend/file-server/Dockerfile
+++ b/src/backend/file-server/Dockerfile
@@ -1,5 +1,5 @@
# 1️⃣ 베이스 이미지로 OpenJDK 17 사용
-FROM openjdk:17-jdk-slim AS build
+FROM amazoncorretto:17-alpine AS build
# 2️⃣ 작업 디렉토리 설정
WORKDIR /app
@@ -12,11 +12,11 @@ RUN chmod +x gradlew
RUN ./gradlew build -x test
# 5️⃣ 런타임 이미지로 OpenJDK 17 사용
-FROM openjdk:17-jdk-slim
+FROM amazoncorretto:17-alpine
WORKDIR /app
# 6️⃣ 빌드된 JAR 파일 복사
COPY --from=build /app/build/libs/*.jar app.jar
# 7️⃣ 컨테이너 실행 시 Spring Boot 애플리케이션 실행
-ENTRYPOINT ["java", "-jar", "app.jar"]
\ No newline at end of file
+ENTRYPOINT ["java", "-jar", "app.jar"]
diff --git a/src/backend/history-server/Dockerfile b/src/backend/history-server/Dockerfile
index 6c24433d..4a0cb78f 100644
--- a/src/backend/history-server/Dockerfile
+++ b/src/backend/history-server/Dockerfile
@@ -1,9 +1,9 @@
# 베이스 이미지로 OpenJDK 17 사용
-FROM openjdk:17-jdk-slim
+FROM amazoncorretto:17-alpine
# 애플리케이션 파일을 컨테이너에 복사
ARG JAR_FILE=kickzo-0.0.1-SNAPSHOT.jar
COPY ${JAR_FILE} app.jar
# 애플리케이션 실행
-ENTRYPOINT ["java", "-jar", "/app.jar"]
\ No newline at end of file
+ENTRYPOINT ["java", "-jar", "/app.jar"]
diff --git a/src/backend/kafka/docker-compose.yml b/src/backend/kafka/docker-compose.yml
index cd37142e..45c28d42 100644
--- a/src/backend/kafka/docker-compose.yml
+++ b/src/backend/kafka/docker-compose.yml
@@ -8,6 +8,12 @@ services:
- "2181:2181"
networks:
- kickzo-network
+ healthcheck:
+ test: echo srvr | nc localhost 2181 || exit 1
+ interval: 5s
+ timeout: 3s
+ retries: 20
+ start_period: 30s
kafka:
image: wurstmeister/kafka:latest
@@ -26,6 +32,19 @@ services:
- /var/run/docker.sock:/var/run/docker.sock
networks:
- kickzo-network
+ healthcheck:
+ test:
+ [
+ "CMD-SHELL",
+ "/opt/kafka/bin/kafka-topics.sh --bootstrap-server kafka:${KAFKA_INTERNAL_PORT} --list",
+ ]
+ interval: 5s
+ timeout: 3s
+ retries: 20
+ start_period: 30s
+ depends_on:
+ zookeeper:
+ condition: service_healthy
networks:
kickzo-network:
diff --git a/src/backend/main-server/main/Dockerfile b/src/backend/main-server/main/Dockerfile
index 9625f7de..394a8f9b 100644
--- a/src/backend/main-server/main/Dockerfile
+++ b/src/backend/main-server/main/Dockerfile
@@ -1,5 +1,5 @@
# 1️⃣ Java 21 LTS 기반 이미지 사용
-FROM eclipse-temurin:21-jdk AS build
+FROM amazoncorretto:21-alpine AS build
# 2️⃣ 작업 디렉토리 설정
WORKDIR /app
@@ -12,7 +12,7 @@ RUN chmod +x gradlew
RUN ./gradlew build -x test
# 5️⃣ 실행을 위한 Java 21 런타임 이미지
-FROM eclipse-temurin:21-jdk-jammy
+FROM amazoncorretto:21-alpine
WORKDIR /app
# 6️⃣ 빌드된 JAR 복사
diff --git a/src/backend/main-server/main/docker-compose.yml b/src/backend/main-server/main/docker-compose.yml
index ab30b859..cd9cd174 100644
--- a/src/backend/main-server/main/docker-compose.yml
+++ b/src/backend/main-server/main/docker-compose.yml
@@ -24,6 +24,10 @@ services:
condition: service_healthy
kibana:
condition: service_healthy
+ mysql:
+ condition: service_healthy
+ redis:
+ condition: service_healthy
networks:
- kickzo-network
diff --git a/src/backend/main-server/main/src/main/resources/logback.xml b/src/backend/main-server/main/src/main/resources/logback.xml
index ba195308..6da615f9 100644
--- a/src/backend/main-server/main/src/main/resources/logback.xml
+++ b/src/backend/main-server/main/src/main/resources/logback.xml
@@ -2,21 +2,6 @@
-
-
- [%thread] [%date] [%level] [%file:%line] - %msg%n
-
- kickzo-logs
- kickzo-log
- ap-northeast-1
- 50
- 30000
- 5000
- 0
- ${AWS_ACCESS_KEY}
- ${AWS_SECRET_KEY}
-
-
@@ -24,15 +9,33 @@
-
-
+
+
+
+
+ [%thread] [%date] [%level] [%file:%line] - %msg%n
+
+ kickzo-logs
+ kickzo-log
+ ap-northeast-1
+ 50
+ 30000
+ 5000
+ 0
+ ${AWS_ACCESS_KEY}
+ ${AWS_SECRET_KEY}
+
+
+
+
-
-
-
+
+
+
+
-
\ No newline at end of file
+
diff --git a/src/backend/redis/docker-compose.yml b/src/backend/redis/docker-compose.yml
index 273be1f0..af1d4902 100644
--- a/src/backend/redis/docker-compose.yml
+++ b/src/backend/redis/docker-compose.yml
@@ -6,6 +6,12 @@ services:
container_name: redis
ports:
- "${REDIS_HOST_PORT}:${REDIS_CONTAINER_PORT}"
+ healthcheck:
+ test: ["CMD", "redis-cli", "ping"]
+ interval: 5s
+ timeout: 5s
+ retries: 10
+ start_period: 5s
networks:
- kickzo-network
volumes:
diff --git a/src/backend/signaling-server/Dockerfile b/src/backend/signaling-server/Dockerfile
index 9625f7de..394a8f9b 100644
--- a/src/backend/signaling-server/Dockerfile
+++ b/src/backend/signaling-server/Dockerfile
@@ -1,5 +1,5 @@
# 1️⃣ Java 21 LTS 기반 이미지 사용
-FROM eclipse-temurin:21-jdk AS build
+FROM amazoncorretto:21-alpine AS build
# 2️⃣ 작업 디렉토리 설정
WORKDIR /app
@@ -12,7 +12,7 @@ RUN chmod +x gradlew
RUN ./gradlew build -x test
# 5️⃣ 실행을 위한 Java 21 런타임 이미지
-FROM eclipse-temurin:21-jdk-jammy
+FROM amazoncorretto:21-alpine
WORKDIR /app
# 6️⃣ 빌드된 JAR 복사
diff --git a/src/backend/state-server/Dockerfile b/src/backend/state-server/Dockerfile
index 5947b752..c651b8be 100644
--- a/src/backend/state-server/Dockerfile
+++ b/src/backend/state-server/Dockerfile
@@ -1,9 +1,9 @@
# 베이스 이미지로 OpenJDK 17 사용
-FROM openjdk:17-jdk-slim
+FROM amazoncorretto:17-alpine
# 애플리케이션 파일을 컨테이너에 복사
ARG JAR_FILE=state-0.0.1-SNAPSHOT.jar
COPY ${JAR_FILE} app.jar
# 애플리케이션 실행
-ENTRYPOINT ["java", "-jar", "/app.jar"]
\ No newline at end of file
+ENTRYPOINT ["java", "-jar", "/app.jar"]
diff --git a/src/backend/state-server/docker-compose.yml b/src/backend/state-server/docker-compose.yml
index 1c451f59..f5213106 100644
--- a/src/backend/state-server/docker-compose.yml
+++ b/src/backend/state-server/docker-compose.yml
@@ -10,6 +10,15 @@ services:
- SERVER_PORT=${STATE_PORT} # server.port 설정
ports:
- "${STATE_PORT}:${STATE_PORT}"
+ depends_on:
+ elasticsearch:
+ condition: service_healthy
+ kibana:
+ condition: service_healthy
+ mysql:
+ condition: service_healthy
+ redis:
+ condition: service_healthy
networks:
- kickzo-network
diff --git a/src/backend/user-server/docker-compose.yml b/src/backend/user-server/docker-compose.yml
index 7641c824..2945bfe0 100644
--- a/src/backend/user-server/docker-compose.yml
+++ b/src/backend/user-server/docker-compose.yml
@@ -9,6 +9,8 @@ services:
depends_on:
mysql:
condition: service_healthy
+ redis:
+ condition: service_healthy
ports:
- "${USER_PORT}:${USER_PORT}"
environment:
diff --git a/src/frontend/Dockerfile b/src/frontend/Dockerfile
new file mode 100644
index 00000000..7275ac5d
--- /dev/null
+++ b/src/frontend/Dockerfile
@@ -0,0 +1,17 @@
+FROM node:20.11-alpine
+
+WORKDIR /app
+
+# pnpm 설치
+RUN npm install -g pnpm
+
+# 락파일과 package.json 복사
+COPY package.json pnpm-lock.yaml ./
+RUN pnpm install
+
+COPY . .
+
+EXPOSE 5173
+
+# 명시적인 host와 port 설정
+CMD ["pnpm", "run", "dev:docker"]
diff --git a/src/frontend/docker-compose.yml b/src/frontend/docker-compose.yml
new file mode 100644
index 00000000..b6ea12af
--- /dev/null
+++ b/src/frontend/docker-compose.yml
@@ -0,0 +1,28 @@
+name: kickzo-frontend
+
+services:
+ frontend:
+ build:
+ context: .
+ dockerfile: Dockerfile
+ container_name: kickzo-frontend
+ ports:
+ - '5173:5173'
+ volumes:
+ - .:/app
+ - /app/node_modules
+ environment:
+ - NODE_ENV=development
+ - VITE_IS_PROD=${VITE_IS_PROD:-false}
+ - VITE_API_URL=${VITE_API_URL:-http://localhost:8000/api}
+ - VITE_WEBSOCKET_URL=${VITE_WEBSOCKET_URL:-http://localhost:8000/api/chat/ws}
+ - VITE_YOUTUBE_API_KEY=${VITE_YOUTUBE_API_KEY}
+ - VITE_SENTRY_DSN=${VITE_SENTRY_DSN}
+ - SENTRY_AUTH_TOKEN=${SENTRY_AUTH_TOKEN}
+ networks:
+ - kickzo-frontend-network
+ restart: unless-stopped
+
+networks:
+ kickzo-frontend-network:
+ driver: bridge
diff --git a/src/frontend/package.json b/src/frontend/package.json
index c4c32531..88fc2fa3 100644
--- a/src/frontend/package.json
+++ b/src/frontend/package.json
@@ -5,6 +5,7 @@
"type": "module",
"scripts": {
"dev": "vite",
+ "dev:docker": "vite --host 0.0.0.0 --port 5173",
"build": "tsc -b && vite build",
"lint": "eslint .",
"preview": "vite preview",
diff --git a/src/makefile b/src/makefile
index f12d2d48..88102874 100644
--- a/src/makefile
+++ b/src/makefile
@@ -8,7 +8,7 @@ PROFILES = --profile mock \
SERVICE ?= chat-service # 기본 컨테이너 이름
# 기본 대상
-.PHONY: all up down re mock logs build ps clean fclean help
+.PHONY: all up down re mock logs build ps clean fclean help fe fe-down
all: ## 전체 컨테이너 실행
docker compose -f $(DOCKER_COMPOSE_FILE) $(PROFILES) up -d
@@ -48,6 +48,12 @@ fclean: ## 캐싱된 이미지, 볼륨, 네트워크 모두 제거
docker volume prune -f
docker network prune -f
+fe: ## 프론트엔드 컨테이너 실행
+ docker compose -f ./frontend/docker-compose.yml up -d
+
+fe-down: ## 프론트엔드 컨테이너 중지
+ docker compose -f ./frontend/docker-compose.yml down
+
help: ## 사용 가능한 명령어 표시
@echo "사용 가능한 명령어:"
@echo " make all - 전체 컨테이너 실행"
@@ -61,4 +67,5 @@ help: ## 사용 가능한 명령어 표시
@echo " make ps - 실행 중인 컨테이너 목록 확인"
@echo " make clean - 모든 컨테이너, 네트워크 및 볼륨 제거"
@echo " make fclean - 캐싱된 이미지, 볼륨, 네트워크 모두 제거"
- @echo " make help - 사용 가능한 명령어 표시"
+ @echo " make fe - 프론트엔드 컨테이너 실행"
+ @echo " make fe-down - 프론트엔드 컨테이너 중지"