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 - 프론트엔드 컨테이너 중지"