diff --git a/.github/actions/ecr-push/action.yml b/.github/actions/ecr-push/action.yml new file mode 100644 index 00000000..5a74dce3 --- /dev/null +++ b/.github/actions/ecr-push/action.yml @@ -0,0 +1,222 @@ +# msa actions + +name: "ECR Build & Push Action" +description: "Builds a Docker image and pushes it to Amazon ECR" + +# be-main.yml에게 값을 받아와 사용 (with) +inputs: + namespace: + description: "ECR namespace (msa or service)" + required: true + folder: + description: "Path to the project folder" + required: true + ecr_repo: + description: "ECR repository name" + required: true + aws_access_key_id: + description: "AWS Access Key ID" + required: true + aws_secret_access_key: + description: "AWS Secret Access Key" + required: true + aws_region: + description: "AWS ECR region" + required: true + ecr_uri: + description: "AWS ECR uri" + required: true + ec2_ip: + description: "AWS EC2 public ip" + required: true + ec2_username: + description: "AWS EC2 usename" + required: true + ec2_ssh_key: + description: "AWS EC2 ssh key" + required: true + container_name: + description: "AWS EC2 container name" + required: true + container_port: + description: "AWS EC2 container port" + required: true + config_private_ip: + description: "Config private ip" + required: true + config_port: + description: "Config default port" + required: true + config_application_yml: + description: "Config application.yml" + required: true + + + +runs: + using: "composite" + steps: + # 리포지토리 체크아웃 + - name: Checkout repository + uses: actions/checkout@v3 + + # AWS 인증 설정 + - name: Configure AWS credentials + uses: aws-actions/configure-aws-credentials@v1 + with: + aws-access-key-id: ${{ inputs.aws_access_key_id }} + aws-secret-access-key: ${{ inputs.aws_secret_access_key }} + aws-region: ap-northeast-2 + + # Amazon ECR 로그인 + - name: Login to Amazon ECR + id: login-ecr + uses: aws-actions/amazon-ecr-login@v2 + + - name: Generate dynamic bootstrap.yml & application.yml + shell: bash + run: | + if [[ "${{ inputs.container_name }}" == "config-server" ]]; then + # Generate bootstrap.yml for config-server + echo "encrypt:" > ${{ inputs.folder }}/src/main/resources/bootstrap.yml + echo " key: ${{ inputs.config_private_ip }}" >> ${{ inputs.folder }}/src/main/resources/bootstrap.yml + + # Generate application.yml + rm -f ${{ inputs.folder }}/src/main/resources/application.yml + echo "${{ inputs.config_application_yml }}" | base64 --decode > ${{ inputs.folder }}/src/main/resources/application.yml + + elif [[ "${{ inputs.container_name }}" == "apigateway-server" ]]; then + # Generate bootstrap.yml for API Gateway + echo "spring:" > ${{ inputs.folder }}/src/main/resources/bootstrap.yml + echo " application:" >> ${{ inputs.folder }}/src/main/resources/bootstrap.yml + echo " name: ${{ inputs.container_name }}" >> ${{ inputs.folder }}/src/main/resources/bootstrap.yml + echo " cloud:" >> ${{ inputs.folder }}/src/main/resources/bootstrap.yml + echo " config:" >> ${{ inputs.folder }}/src/main/resources/bootstrap.yml + echo " uri: http://${{ inputs.config_private_ip }}:${{ inputs.config_port }}" >> ${{ inputs.folder }}/src/main/resources/bootstrap.yml + + else + # Generate bootstrap.yml for other services + echo "spring:" > ${{ inputs.folder }}/src/main/resources/bootstrap.yml + echo " application:" >> ${{ inputs.folder }}/src/main/resources/bootstrap.yml + echo " name: ${{ inputs.container_name }}" >> ${{ inputs.folder }}/src/main/resources/bootstrap.yml + echo " cloud:" >> ${{ inputs.folder }}/src/main/resources/bootstrap.yml + echo " config:" >> ${{ inputs.folder }}/src/main/resources/bootstrap.yml + echo " uri: http://${{ inputs.config_private_ip }}:${{ inputs.config_port }}" >> ${{ inputs.folder }}/src/main/resources/bootstrap.yml + fi + + + # Docker 빌드 및 ECR에 푸시 + - name: Build and push Docker image to Amazon ECR + shell: bash + # github commit hash를 이미지 태그로 + run: | + ECR_REGISTRY=${{ steps.login-ecr.outputs.registry }} + IMAGE_TAG=${{ github.sha }} + FULL_ECR_PATH=${{ steps.login-ecr.outputs.registry }}/${{ inputs.namespace }}/${{ inputs.ecr_repo }} + + echo "Moving to project folder: ${{ inputs.folder }}" + cd ${{ inputs.folder }} + + echo "Building Docker image..." + docker build -t $FULL_ECR_PATH:$IMAGE_TAG . + + echo "Pushing image to Amazon ECR..." + docker push $FULL_ECR_PATH:$IMAGE_TAG + + echo "Cleaning up sensitive file..." + rm -f src/main/resources/bootstrap.yml + + echo "Build & Push completed!" + + - name: EC2에서 ECR에 로그인하기 + uses: appleboy/ssh-action@master + with: + host: ${{ inputs.ec2_ip }} + username: ${{ inputs.ec2_username }} + key: ${{ inputs.ec2_ssh_key }} + script: | + aws ecr get-login-password --region ${{ inputs.aws_region }} | sudo docker login --username AWS --password-stdin ${{ inputs.ecr_uri }} + + - name: 기존 EC2에서 실행중인 컨테이너 종료 및 삭제 + uses: appleboy/ssh-action@master + with: + host: ${{ inputs.ec2_ip }} + username: ${{ inputs.ec2_username }} + key: ${{ inputs.ec2_ssh_key }} + script: | + # docker-compose.yml 파일이 있는 경우만 실행 + if [ -f "docker-compose.yml" ]; then + cd $COMPOSE_DIR + sudo docker compose down --rmi all + sudo docker volume prune -f + sudo docker network prune -f + + # docker-compose.yml 파일 삭제 + echo "docker-compose.yml 파일 삭제 중..." + rm -f docker-compose.yml + echo "docker-compose.yml 파일 삭제 완료." + + else + echo "No docker-compose.yml found. Skipping docker compose down." + fi + + - name: Generate docker-compose.yml for EC2 based on namespace + uses: appleboy/ssh-action@master + with: + host: ${{ inputs.ec2_ip }} + username: ${{ inputs.ec2_username }} + key: ${{ inputs.ec2_ssh_key }} + script: | + if [ "${{ inputs.namespace }}" == "msa" ]; then + echo "Generating docker-compose.yml for MSA architecture..." + echo "version: '3.8'" > docker-compose.yml + echo "" >> docker-compose.yml + echo "services:" >> docker-compose.yml + echo " apigateway-server:" >> docker-compose.yml + echo " image: ${{ inputs.ecr_uri }}/${{ inputs.namespace }}/${{ inputs.ecr_repo }}:${{ github.sha }}" >> docker-compose.yml + echo " container_name: ${{ inputs.container_name }}" >> docker-compose.yml + echo " ports:" >> docker-compose.yml + echo " - \"${{ inputs.container_port }}:${{ inputs.container_port }}\"" >> docker-compose.yml + echo " healthcheck:" >> docker-compose.yml + echo " test: [\"CMD-SHELL\", \"curl -f http://${{ inputs.container_name }}:${{ inputs.container_port }}/actuator/health || exit 1\"]" >> docker-compose.yml + echo " interval: 10s" >> docker-compose.yml + echo " timeout: 5s" >> docker-compose.yml + echo " retries: 2" >> docker-compose.yml + echo " restart: unless-stopped" >> docker-compose.yml + + elif [ "${{ inputs.namespace }}" == "service" ]; then + echo "Generating docker-compose.yml for Service architecture..." + echo "version: '3.8'" > docker-compose.yml + echo "" >> docker-compose.yml + echo "services:" >> docker-compose.yml + echo " ${{ inputs.container_name }}:" >> docker-compose.yml + echo " image: ${{ inputs.ecr_uri }}/${{ inputs.namespace }}/${{ inputs.ecr_repo }}:${{ github.sha }}" >> docker-compose.yml + echo " network_mode: host" >> docker-compose.yml + echo " container_name: ${{ inputs.container_name }}" >> docker-compose.yml + echo " restart: unless-stopped" >> docker-compose.yml + + + if [ "${{ inputs.container_name }}" == "user-server" ]; then + echo " redis:" >> docker-compose.yml + echo " image: redis:latest" >> docker-compose.yml + echo " container_name: redis" >> docker-compose.yml + echo " ports:" >> docker-compose.yml + echo " - \"6379:6379\"" >> docker-compose.yml + echo " restart: unless-stopped" >> docker-compose.yml + fi + + else + echo "Unknown namespace: ${{ inputs.namespace }}" + exit 1 + fi + + - name: Start container using Docker Compose + uses: appleboy/ssh-action@master + with: + host: ${{ inputs.ec2_ip }} + username: ${{ inputs.ec2_username }} + key: ${{ inputs.ec2_ssh_key }} + script: | + sudo docker compose up -d + + diff --git a/.github/workflows/be-main.yml b/.github/workflows/be-main.yml new file mode 100644 index 00000000..bd74bb70 --- /dev/null +++ b/.github/workflows/be-main.yml @@ -0,0 +1,425 @@ +name: ECR actions for multiple folders + +on: + pull_request: + branches: + - main + +env: + NAMESPACE_MSA: "msa" + NAMESPACE_SERVICE: "service" + +jobs: + # 변경 사항 감지 Job (각 서비스별로 실행) + check-folder-change: + runs-on: ubuntu-latest + + outputs: + msa_discovery_changed: ${{ steps.check_msa_discovery.outputs.changed }} + msa_config_changed: ${{ steps.check_msa_config.outputs.changed }} + msa_apigateway_changed: ${{ steps.check_msa_apigateway.outputs.changed }} + service_user_changed: ${{ steps.check_service_user.outputs.changed }} + service_chat_changed: ${{ steps.check_service_chat.outputs.changed }} + service_state_changed: ${{ steps.check_service_state.outputs.changed }} + service_guild_changed: ${{ steps.check_service_guild.outputs.changed }} + service_notification_changed: ${{ steps.check_service_notification.outputs.changed }} + service_signaling_changed: ${{ steps.check_service_signaling.outputs.changed }} + + steps: + - name: Checkout repository + uses: actions/checkout@v3 + with: + fetch-depth: 0 # 모든 브랜치의 전체 히스토리 가져오기 + + # 브랜치 확인 + - name: Debug Git Branches + run: | + echo "Fetching all branches..." + git fetch --all + echo "Available remote branches:" + git branch -r + echo "Current branch:" + git branch + + - name: Check for changes in MSA - Discovery + id: check_msa_discovery + run: | + if git rev-parse --verify origin/main >/dev/null 2>&1; then + if git diff --name-only origin/main...HEAD | grep -q "^src/backend/discovery-server/"; then + echo "changed=true" >> "$GITHUB_OUTPUT" + else + echo "changed=false" >> "$GITHUB_OUTPUT" + fi + else + echo "First PR: marking as changed" + echo "changed=true" >> "$GITHUB_OUTPUT" + fi + + + - name: Check for changes in MSA - Config + id: check_msa_config + run: | + if git rev-parse --verify origin/main >/dev/null 2>&1; then + if git diff --name-only origin/main...HEAD | grep -q "^src/backend/config-server/"; then + echo "changed=true" >> "$GITHUB_OUTPUT" + else + echo "changed=false" >> "$GITHUB_OUTPUT" + fi + else + echo "First PR: marking as changed" + echo "changed=true" >> "$GITHUB_OUTPUT" + fi + + - name: Check for changes in MSA - API Gateway + id: check_msa_apigateway + run: | + if git rev-parse --verify origin/main >/dev/null 2>&1; then + if git diff --name-only origin/main...HEAD | grep -q "^src/backend/apigateway-server/"; then + echo "changed=true" >> "$GITHUB_OUTPUT" + else + echo "changed=false" >> "$GITHUB_OUTPUT" + fi + else + echo "First PR: marking as changed" + echo "changed=true" >> "$GITHUB_OUTPUT" + fi + + - name: Check for changes in Service - User + id: check_service_user + run: | + if git rev-parse --verify origin/main >/dev/null 2>&1; then + if git diff --name-only origin/main...HEAD | grep -q "^src/backend/user-server/"; then + echo "changed=true" >> "$GITHUB_OUTPUT" + else + echo "changed=false" >> "$GITHUB_OUTPUT" + fi + else + echo "First PR: marking as changed" + echo "changed=true" >> "$GITHUB_OUTPUT" + fi + + - name: Check for changes in Service - Chat + id: check_service_chat + run: | + if git rev-parse --verify origin/main >/dev/null 2>&1; then + if git diff --name-only origin/main...HEAD | grep -q "^src/backend/chat-server/"; then + echo "changed=true" >> "$GITHUB_OUTPUT" + else + echo "changed=false" >> "$GITHUB_OUTPUT" + fi + else + echo "First PR: marking as changed" + echo "changed=true" >> "$GITHUB_OUTPUT" + fi + + - name: Check for changes in Service - State + id: check_service_state + run: | + if git rev-parse --verify origin/main >/dev/null 2>&1; then + if git diff --name-only origin/main...HEAD | grep -q "^src/backend/state-server/"; then + echo "changed=true" >> "$GITHUB_OUTPUT" + else + echo "changed=false" >> "$GITHUB_OUTPUT" + fi + else + echo "First PR: marking as changed" + echo "changed=true" >> "$GITHUB_OUTPUT" + fi + + - name: Check for changes in Service - Guild + id: check_service_guild + run: | + if git rev-parse --verify origin/main >/dev/null 2>&1; then + if git diff --name-only origin/main...HEAD | grep -q "^src/backend/guild-server/"; then + echo "changed=true" >> "$GITHUB_OUTPUT" + else + echo "changed=false" >> "$GITHUB_OUTPUT" + fi + else + echo "First PR: marking as changed" + echo "changed=true" >> "$GITHUB_OUTPUT" + fi + + - name: Check for changes in Service - Notification + id: check_service_notification + run: | + if git rev-parse --verify origin/main >/dev/null 2>&1; then + if git diff --name-only origin/main...HEAD | grep -q "^src/backend/notification-server/"; then + echo "changed=true" >> "$GITHUB_OUTPUT" + else + echo "changed=false" >> "$GITHUB_OUTPUT" + fi + else + echo "First PR: marking as changed" + echo "changed=true" >> "$GITHUB_OUTPUT" + fi + + - name: Check for changes in Service - Signaling + id: check_service_signaling + run: | + if git rev-parse --verify origin/main >/dev/null 2>&1; then + if git diff --name-only origin/main...HEAD | grep -q "^src/backend/signaling-server/"; then + echo "changed=true" >> "$GITHUB_OUTPUT" + else + echo "changed=false" >> "$GITHUB_OUTPUT" + fi + else + echo "First PR: marking as changed" + echo "changed=true" >> "$GITHUB_OUTPUT" + fi + + # MSA 빌드 및 푸시 + build-msa-discovery: + needs: check-folder-change + if: ${{ needs.check-folder-change.outputs.msa_discovery_changed == 'true' }} + runs-on: ubuntu-latest + steps: + # 레포 가져오기 + - name: Checkout repository + uses: actions/checkout@v3 + + - name: Build & Push MSA Discovery + uses: ./.github/actions/ecr-push + with: + namespace: ${{ env.NAMESPACE_MSA }} + folder: "src/backend/discovery-server" + ecr_repo: "discovery" + aws_access_key_id: ${{ secrets.AWS_MSA_ACCESS_KEY_ID }} + aws_secret_access_key: ${{ secrets.AWS_MSA_SECRET_ACCESS_KEY }} + aws_region: ${{ secrets.AWS_ECR_REGION }} + ecr_uri: ${{ secrets.AWS_MSA_ECR_URI }} + ec2_ip: ${{ secrets.AWS_DISCOVERY_EC2_IP }} + ec2_username: ${{ secrets.AWS_EC2_USERNAME }} + ec2_ssh_key: ${{ secrets.AWS_MSA_SSH_KEY }} + container_name: "discovery-server" + container_port: ${{ secrets.DISCOVERY_PORT }} + config_private_ip: ${{ secrets.CONFIG_PRIVATE_IP }} + config_port: ${{ secrets.CONFIG_PORT }} + config_application_yml: "" + + + build-msa-config: + needs: check-folder-change + if: ${{ needs.check-folder-change.outputs.msa_config_changed == 'true' }} + runs-on: ubuntu-latest + steps: + + # 레포 가져오기 + - name: Checkout repository + uses: actions/checkout@v3 + + - name: Build & Push MSA Config + uses: ./.github/actions/ecr-push + with: + namespace: ${{ env.NAMESPACE_MSA }} + folder: "src/backend/config-server" + ecr_repo: "config" + aws_access_key_id: ${{ secrets.AWS_MSA_ACCESS_KEY_ID }} + aws_secret_access_key: ${{ secrets.AWS_MSA_SECRET_ACCESS_KEY }} + aws_region: ${{ secrets.AWS_ECR_REGION }} + ecr_uri: ${{ secrets.AWS_MSA_ECR_URI }} + ec2_ip: ${{ secrets.AWS_CONFIG_EC2_IP }} + ec2_username: ${{ secrets.AWS_EC2_USERNAME }} + ec2_ssh_key: ${{ secrets.AWS_MSA_SSH_KEY }} + container_name: "config-server" + container_port: ${{ secrets.CONFIG_PORT }} + config_private_ip: ${{ secrets.CONFIG_ENCRYPT_KEY }} + config_port: ${{ secrets.CONFIG_PORT }} + config_application_yml: ${{ secrets.CONFIG_APPLICATION_YML }} + + build-msa-apigateway: + needs: check-folder-change + if: ${{ needs.check-folder-change.outputs.msa_apigateway_changed == 'true' }} + runs-on: ubuntu-latest + steps: + # 레포 가져오기 + - name: Checkout repository + uses: actions/checkout@v3 + + - name: Build & Push MSA API Gateway + uses: ./.github/actions/ecr-push + with: + namespace: ${{ env.NAMESPACE_MSA }} + folder: "src/backend/apigateway-server" + ecr_repo: "apigateway" + aws_access_key_id: ${{ secrets.AWS_MSA_ACCESS_KEY_ID }} + aws_secret_access_key: ${{ secrets.AWS_MSA_SECRET_ACCESS_KEY }} + aws_region: ${{ secrets.AWS_ECR_REGION }} + ecr_uri: ${{ secrets.AWS_MSA_ECR_URI }} + ec2_ip: ${{ secrets.AWS_APIGATEWAY_EC2_IP }} + ec2_username: ${{ secrets.AWS_EC2_USERNAME }} + ec2_ssh_key: ${{ secrets.AWS_MSA_SSH_KEY }} + container_name: "apigateway-server" + container_port: ${{ secrets.APIGATEWAY_PORT }} + config_private_ip: ${{ secrets.CONFIG_PRIVATE_IP }} + config_port: ${{ secrets.CONFIG_PORT }} + config_application_yml: "" + + # Service 빌드 및 푸시 + build-service-user: + needs: check-folder-change + if: ${{ needs.check-folder-change.outputs.service_user_changed == 'true' }} + runs-on: ubuntu-latest + steps: + # 레포 가져오기 + - name: Checkout repository + uses: actions/checkout@v3 + + - name: Build & Push Service User + uses: ./.github/actions/ecr-push + with: + namespace: ${{ env.NAMESPACE_SERVICE }} + folder: "src/backend/user-server" + ecr_repo: "user" + aws_access_key_id: ${{ secrets.AWS_SERVICE_ACCESS_KEY_ID }} + aws_secret_access_key: ${{ secrets.AWS_SERVICE_SECRET_ACCESS_KEY }} + aws_region: ${{ secrets.AWS_ECR_REGION }} + ecr_uri: ${{ secrets.AWS_SERVICE_ECR_URI }} + ec2_ip: ${{ secrets.AWS_USER_EC2_IP }} + ec2_username: ${{ secrets.AWS_EC2_USERNAME }} + ec2_ssh_key: ${{ secrets.AWS_SERVICE_SSH_KEY }} + container_name: "user-server" + container_port: 8100 + config_private_ip: ${{ secrets.CONFIG_PRIVATE_IP }} + config_port: ${{ secrets.CONFIG_PORT }} + config_application_yml: "" + + build-service-chat: + needs: check-folder-change + if: ${{ needs.check-folder-change.outputs.service_chat_changed == 'true' }} + runs-on: ubuntu-latest + steps: + # 레포 가져오기 + - name: Checkout repository + uses: actions/checkout@v3 + + - name: Build & Push Service Chat + uses: ./.github/actions/ecr-push + with: + namespace: ${{ env.NAMESPACE_SERVICE }} + folder: "src/backend/chat-server" + ecr_repo: "chat" + aws_access_key_id: ${{ secrets.AWS_CHAT_ACCESS_KEY_ID }} + aws_secret_access_key: ${{ secrets.AWS_CHAT_SECRET_ACCESS_KEY }} + aws_region: ${{ secrets.AWS_ECR_REGION }} + ecr_uri: ${{ secrets.AWS_CHAT_ECR_URI }} + ec2_ip: ${{ secrets.AWS_CHAT_EC2_IP }} + ec2_username: ${{ secrets.AWS_EC2_USERNAME }} + ec2_ssh_key: ${{ secrets.AWS_CHAT_SSH_KEY }} + container_name: "chat-server" + container_port: 8600 + config_private_ip: ${{ secrets.CONFIG_PRIVATE_IP }} + config_port: ${{ secrets.CONFIG_PORT }} + config_application_yml: "" + + build-service-state: + needs: check-folder-change + if: ${{ needs.check-folder-change.outputs.service_state_changed == 'true' }} + runs-on: ubuntu-latest + steps: + # 레포 가져오기 + - name: Checkout repository + uses: actions/checkout@v3 + + - name: Build & Push Service State + uses: ./.github/actions/ecr-push + with: + namespace: ${{ env.NAMESPACE_SERVICE }} + folder: "src/backend/state-server" + ecr_repo: "state" + aws_access_key_id: ${{ secrets.AWS_SERVICE_ACCESS_KEY_ID }} + aws_secret_access_key: ${{ secrets.AWS_SERVICE_SECRET_ACCESS_KEY }} + aws_region: ${{ secrets.AWS_ECR_REGION }} + ecr_uri: ${{ secrets.AWS_SERVICE_ECR_URI }} + ec2_ip: ${{ secrets.AWS_STATE_EC2_IP }} + ec2_username: ${{ secrets.AWS_EC2_USERNAME }} + ec2_ssh_key: ${{ secrets.AWS_SERVICE_SSH_KEY }} + container_name: "state-server" + container_port: 8200 + config_private_ip: ${{ secrets.CONFIG_PRIVATE_IP }} + config_port: ${{ secrets.CONFIG_PORT }} + config_application_yml: "" + + build-service-guild: + needs: check-folder-change + if: ${{ needs.check-folder-change.outputs.service_guild_changed == 'true' }} + runs-on: ubuntu-latest + steps: + # 레포 가져오기 + - name: Checkout repository + uses: actions/checkout@v3 + + - name: Build & Push Service Guild + uses: ./.github/actions/ecr-push + with: + namespace: ${{ env.NAMESPACE_SERVICE }} + folder: "src/backend/guild-server" + ecr_repo: "guild" + aws_access_key_id: ${{ secrets.AWS_SERVICE_ACCESS_KEY_ID }} + aws_secret_access_key: ${{ secrets.AWS_SERVICE_SECRET_ACCESS_KEY }} + aws_region: ${{ secrets.AWS_ECR_REGION }} + ecr_uri: ${{ secrets.AWS_SERVICE_ECR_URI }} + ec2_ip: ${{ secrets.AWS_GUILD_EC2_IP }} + ec2_username: ${{ secrets.AWS_EC2_USERNAME }} + ec2_ssh_key: ${{ secrets.AWS_SERVICE_SSH_KEY }} + container_name: "guild-server" + container_port: 8500 + config_private_ip: ${{ secrets.CONFIG_PRIVATE_IP }} + config_port: ${{ secrets.CONFIG_PORT }} + config_application_yml: "" + + build-service-notification: + needs: check-folder-change + if: ${{ needs.check-folder-change.outputs.service_notification_changed == 'true' }} + runs-on: ubuntu-latest + steps: + # 레포 가져오기 + - name: Checkout repository + uses: actions/checkout@v3 + + - name: Build & Push Service Notification + uses: ./.github/actions/ecr-push + with: + namespace: ${{ env.NAMESPACE_SERVICE }} + folder: "src/backend/notification-server" + ecr_repo: "notification" + aws_access_key_id: ${{ secrets.AWS_SERVICE_ACCESS_KEY_ID }} + aws_secret_access_key: ${{ secrets.AWS_SERVICE_SECRET_ACCESS_KEY }} + aws_region: ${{ secrets.AWS_ECR_REGION }} + ecr_uri: ${{ secrets.AWS_SERVICE_ECR_URI }} + ec2_ip: ${{ secrets.AWS_NOTIFICATION_EC2_IP }} + ec2_username: ${{ secrets.AWS_EC2_USERNAME }} + ec2_ssh_key: ${{ secrets.AWS_SERVICE_SSH_KEY }} + container_name: "notification-server" + container_port: 8400 + config_private_ip: ${{ secrets.CONFIG_PRIVATE_IP }} + config_port: ${{ secrets.CONFIG_PORT }} + config_application_yml: "" + + build-service-signaling: + needs: check-folder-change + if: ${{ needs.check-folder-change.outputs.service_signaling_changed == 'true' }} + runs-on: ubuntu-latest + steps: + # 레포 가져오기 + - name: Checkout repository + uses: actions/checkout@v3 + + - name: Build & Push Service Signaling + uses: ./.github/actions/ecr-push + with: + namespace: ${{ env.NAMESPACE_SERVICE }} + folder: "src/backend/signaling-server" + ecr_repo: "media" + aws_access_key_id: ${{ secrets.AWS_SERVICE_ACCESS_KEY_ID }} + aws_secret_access_key: ${{ secrets.AWS_SERVICE_SECRET_ACCESS_KEY }} + aws_region: ${{ secrets.AWS_ECR_REGION }} + ecr_uri: ${{ secrets.AWS_SERVICE_ECR_URI }} + ec2_ip: ${{ secrets.AWS_SIGNALING_EC2_IP }} + ec2_username: ${{ secrets.AWS_EC2_USERNAME }} + ec2_ssh_key: ${{ secrets.AWS_SERVICE_SSH_KEY }} + container_name: "signaling-server" + container_port: 8300 + config_private_ip: ${{ secrets.CONFIG_PRIVATE_IP }} + config_port: ${{ secrets.CONFIG_PORT }} + config_application_yml: "" \ No newline at end of file diff --git a/.gitignore b/.gitignore index 833a07c8..4e8fb424 100644 --- a/.gitignore +++ b/.gitignore @@ -64,4 +64,7 @@ src/backend/**/src/main/resources/bootstrap.yml src/backend/**/generated/ # http env -src/backend/**/http/http-client.private.env.json \ No newline at end of file +src/backend/**/http/http-client.private.env.json + +# docker-compose env +src/backend/.env \ No newline at end of file diff --git a/src/backend/apigateway-server/Dockerfile b/src/backend/apigateway-server/Dockerfile new file mode 100644 index 00000000..d648e81b --- /dev/null +++ b/src/backend/apigateway-server/Dockerfile @@ -0,0 +1,20 @@ +# 빌드 단계 +FROM amazoncorretto:17-alpine AS builder + +WORKDIR /app + +# Gradle 설치 +RUN apk add --no-cache gradle + +COPY . /app + +# Gradle 빌드 실행 (gradlew 없이 Gradle 직접 실행) +RUN gradle clean build -x test + +# 실행 단계 +FROM amazoncorretto:17-alpine +WORKDIR /app + +COPY --from=builder /app/build/libs/*.jar app.jar + +CMD ["java", "-jar", "app.jar"] diff --git a/src/backend/apigateway-server/build.gradle b/src/backend/apigateway-server/build.gradle index ca11338a..7a469637 100644 --- a/src/backend/apigateway-server/build.gradle +++ b/src/backend/apigateway-server/build.gradle @@ -58,4 +58,4 @@ dependencyManagement { tasks.named('test') { useJUnitPlatform() -} +} \ No newline at end of file diff --git a/src/backend/apigateway-server/src/main/resources/application.yml b/src/backend/apigateway-server/src/main/resources/application.yml index 19ae6d1c..5a3d237a 100644 --- a/src/backend/apigateway-server/src/main/resources/application.yml +++ b/src/backend/apigateway-server/src/main/resources/application.yml @@ -67,4 +67,4 @@ management: endpoints: web: exposure: - include: refresh, health, beans \ No newline at end of file + include: refresh, health, beans, info \ No newline at end of file diff --git a/src/backend/chat-server/Dockerfile b/src/backend/chat-server/Dockerfile new file mode 100644 index 00000000..d648e81b --- /dev/null +++ b/src/backend/chat-server/Dockerfile @@ -0,0 +1,20 @@ +# 빌드 단계 +FROM amazoncorretto:17-alpine AS builder + +WORKDIR /app + +# Gradle 설치 +RUN apk add --no-cache gradle + +COPY . /app + +# Gradle 빌드 실행 (gradlew 없이 Gradle 직접 실행) +RUN gradle clean build -x test + +# 실행 단계 +FROM amazoncorretto:17-alpine +WORKDIR /app + +COPY --from=builder /app/build/libs/*.jar app.jar + +CMD ["java", "-jar", "app.jar"] diff --git a/src/backend/config-server/Dockerfile b/src/backend/config-server/Dockerfile new file mode 100644 index 00000000..d648e81b --- /dev/null +++ b/src/backend/config-server/Dockerfile @@ -0,0 +1,20 @@ +# 빌드 단계 +FROM amazoncorretto:17-alpine AS builder + +WORKDIR /app + +# Gradle 설치 +RUN apk add --no-cache gradle + +COPY . /app + +# Gradle 빌드 실행 (gradlew 없이 Gradle 직접 실행) +RUN gradle clean build -x test + +# 실행 단계 +FROM amazoncorretto:17-alpine +WORKDIR /app + +COPY --from=builder /app/build/libs/*.jar app.jar + +CMD ["java", "-jar", "app.jar"] diff --git a/src/backend/config-server/build.gradle b/src/backend/config-server/build.gradle index ef60d531..b59a4da7 100644 --- a/src/backend/config-server/build.gradle +++ b/src/backend/config-server/build.gradle @@ -40,4 +40,4 @@ dependencyManagement { tasks.named('test') { useJUnitPlatform() -} +} \ No newline at end of file diff --git a/src/backend/config-server/src/main/resources/application.yml b/src/backend/config-server/src/main/resources/application.yml index 21e8c600..2a2caa26 100644 --- a/src/backend/config-server/src/main/resources/application.yml +++ b/src/backend/config-server/src/main/resources/application.yml @@ -12,9 +12,9 @@ spring: git: uri: https://github.com/sgdevcamp2025/asyncgate # ToDo 테스트 후 변경 -# default-label: be/feat/10-user +# default-label: be/setting/24-test # default-label: dev - default-label: main + default-label: main search-paths: - "config" diff --git a/src/backend/discovery-server/Dockerfile b/src/backend/discovery-server/Dockerfile new file mode 100644 index 00000000..d648e81b --- /dev/null +++ b/src/backend/discovery-server/Dockerfile @@ -0,0 +1,20 @@ +# 빌드 단계 +FROM amazoncorretto:17-alpine AS builder + +WORKDIR /app + +# Gradle 설치 +RUN apk add --no-cache gradle + +COPY . /app + +# Gradle 빌드 실행 (gradlew 없이 Gradle 직접 실행) +RUN gradle clean build -x test + +# 실행 단계 +FROM amazoncorretto:17-alpine +WORKDIR /app + +COPY --from=builder /app/build/libs/*.jar app.jar + +CMD ["java", "-jar", "app.jar"] diff --git a/src/backend/docker-compose-dev.yml b/src/backend/docker-compose-dev.yml new file mode 100644 index 00000000..711e63d0 --- /dev/null +++ b/src/backend/docker-compose-dev.yml @@ -0,0 +1,61 @@ +# local 실행용 docker compose +services: + discovery-service: + build: + context: discovery-server + dockerfile: Dockerfile + ports: + - 8761:8761 + networks: + - msa-network + healthcheck: + test: ["CMD-SHELL", "curl -f http://discovery-service:8761/actuator/health || exit 1"] + interval: 10s + timeout: 5s + retries: 2 + apigateway-service: + build: + context: apigateway-server + dockerfile: Dockerfile + ports: + - 8000:8000 + healthcheck: + test: ["CMD-SHELL", "curl -f http://apigateway-service:8000/actuator/health || exit 1"] + interval: 10s + timeout: 5s + retries: 2 + depends_on: + - config-service + networks: + - msa-network + restart: on-failure + config-service: + build: + context: config-server + dockerfile: Dockerfile + ports: + - 8888:8888 + networks: + - msa-network + restart: on-failure + healthcheck: + test: ["CMD-SHELL", "curl -f http://config-service:8888/actuator/health || exit 1"] + interval: 10s + timeout: 5s + retries: 2 + depends_on: + - discovery-service + user-service: + build: + context: user-server + dockerfile: Dockerfile + expose: + - 1000 # 내부 컨테이너 포트만 노출 + depends_on: + - apigateway-service + networks: + - msa-network + restart: on-failure + +networks: + msa-network: \ No newline at end of file diff --git a/src/backend/guild-server/Dockerfile b/src/backend/guild-server/Dockerfile new file mode 100644 index 00000000..d648e81b --- /dev/null +++ b/src/backend/guild-server/Dockerfile @@ -0,0 +1,20 @@ +# 빌드 단계 +FROM amazoncorretto:17-alpine AS builder + +WORKDIR /app + +# Gradle 설치 +RUN apk add --no-cache gradle + +COPY . /app + +# Gradle 빌드 실행 (gradlew 없이 Gradle 직접 실행) +RUN gradle clean build -x test + +# 실행 단계 +FROM amazoncorretto:17-alpine +WORKDIR /app + +COPY --from=builder /app/build/libs/*.jar app.jar + +CMD ["java", "-jar", "app.jar"] diff --git a/src/backend/notification-server/Dockerfile b/src/backend/notification-server/Dockerfile new file mode 100644 index 00000000..d648e81b --- /dev/null +++ b/src/backend/notification-server/Dockerfile @@ -0,0 +1,20 @@ +# 빌드 단계 +FROM amazoncorretto:17-alpine AS builder + +WORKDIR /app + +# Gradle 설치 +RUN apk add --no-cache gradle + +COPY . /app + +# Gradle 빌드 실행 (gradlew 없이 Gradle 직접 실행) +RUN gradle clean build -x test + +# 실행 단계 +FROM amazoncorretto:17-alpine +WORKDIR /app + +COPY --from=builder /app/build/libs/*.jar app.jar + +CMD ["java", "-jar", "app.jar"] diff --git a/src/backend/signaling-server/Dockerfile b/src/backend/signaling-server/Dockerfile new file mode 100644 index 00000000..d648e81b --- /dev/null +++ b/src/backend/signaling-server/Dockerfile @@ -0,0 +1,20 @@ +# 빌드 단계 +FROM amazoncorretto:17-alpine AS builder + +WORKDIR /app + +# Gradle 설치 +RUN apk add --no-cache gradle + +COPY . /app + +# Gradle 빌드 실행 (gradlew 없이 Gradle 직접 실행) +RUN gradle clean build -x test + +# 실행 단계 +FROM amazoncorretto:17-alpine +WORKDIR /app + +COPY --from=builder /app/build/libs/*.jar app.jar + +CMD ["java", "-jar", "app.jar"] diff --git a/src/backend/state-server/Dockerfile b/src/backend/state-server/Dockerfile new file mode 100644 index 00000000..d648e81b --- /dev/null +++ b/src/backend/state-server/Dockerfile @@ -0,0 +1,20 @@ +# 빌드 단계 +FROM amazoncorretto:17-alpine AS builder + +WORKDIR /app + +# Gradle 설치 +RUN apk add --no-cache gradle + +COPY . /app + +# Gradle 빌드 실행 (gradlew 없이 Gradle 직접 실행) +RUN gradle clean build -x test + +# 실행 단계 +FROM amazoncorretto:17-alpine +WORKDIR /app + +COPY --from=builder /app/build/libs/*.jar app.jar + +CMD ["java", "-jar", "app.jar"] diff --git a/src/backend/user-server/Dockerfile b/src/backend/user-server/Dockerfile new file mode 100644 index 00000000..d648e81b --- /dev/null +++ b/src/backend/user-server/Dockerfile @@ -0,0 +1,20 @@ +# 빌드 단계 +FROM amazoncorretto:17-alpine AS builder + +WORKDIR /app + +# Gradle 설치 +RUN apk add --no-cache gradle + +COPY . /app + +# Gradle 빌드 실행 (gradlew 없이 Gradle 직접 실행) +RUN gradle clean build -x test + +# 실행 단계 +FROM amazoncorretto:17-alpine +WORKDIR /app + +COPY --from=builder /app/build/libs/*.jar app.jar + +CMD ["java", "-jar", "app.jar"] diff --git a/src/backend/user-server/src/main/java/com/asyncgate/user_server/controller/MemberCommandController.java b/src/backend/user-server/src/main/java/com/asyncgate/user_server/controller/MemberCommandController.java index ca2f7fe6..b6a0d2c6 100644 --- a/src/backend/user-server/src/main/java/com/asyncgate/user_server/controller/MemberCommandController.java +++ b/src/backend/user-server/src/main/java/com/asyncgate/user_server/controller/MemberCommandController.java @@ -22,6 +22,7 @@ public class MemberCommandController { private final DeleteUserUseCase DeleteUserUseCase; private final UpdateDeviceTokenUseCase UpdateDeviceTokenUseCase; + // 사소한 주석 추가 테스트테스트용 용용용가리 /** * 1.0 임시 회원가입 */ diff --git a/src/backend/user-server/src/main/resources/application.yml b/src/backend/user-server/src/main/resources/application.yml index 0ef7f70a..1317acc7 100644 --- a/src/backend/user-server/src/main/resources/application.yml +++ b/src/backend/user-server/src/main/resources/application.yml @@ -11,6 +11,10 @@ eureka: spring: application: name: user-server + redis: + host: host.docker.internal + port: 6379 + management: endpoints: