From b6ba919e7a368bc6db40596c96f4e7cde2860a6f Mon Sep 17 00:00:00 2001 From: 0515-Yoonseo-Kim Date: Mon, 1 Dec 2025 16:42:46 +0900 Subject: [PATCH 1/7] =?UTF-8?q?fix:=20ECR=20=EC=A0=91=EA=B7=BC=20=ED=99=95?= =?UTF-8?q?=EC=9D=B8=20=EB=B0=8F=20=EB=94=94=EB=B2=84=EA=B9=85=20=EB=8B=A8?= =?UTF-8?q?=EA=B3=84=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - AWS 인증 정보 확인 (sts get-caller-identity) - ECR 리포지토리 존재 여부 확인 - 리포지토리가 없으면 자동 생성 - 디버깅 로그 추가하여 문제 원인 파악 가능 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- .github/workflows/docker-ecr.yml | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/.github/workflows/docker-ecr.yml b/.github/workflows/docker-ecr.yml index 87a8733..697b64e 100644 --- a/.github/workflows/docker-ecr.yml +++ b/.github/workflows/docker-ecr.yml @@ -28,6 +28,33 @@ jobs: id: login-ecr uses: aws-actions/amazon-ecr-login@v2 + - name: Verify ECR access and repository + env: + ECR_REGISTRY: ${{ secrets.ECR_REGISTRY }} + ECR_REPOSITORY: ${{ secrets.ECR_REPOSITORY }} + run: | + echo "🔍 Checking AWS credentials and ECR access..." + echo "AWS Region: ${{ env.AWS_REGION }}" + echo "ECR Registry: $ECR_REGISTRY" + echo "ECR Repository: $ECR_REPOSITORY" + + # AWS 인증 확인 + echo "✓ AWS Identity:" + aws sts get-caller-identity + + # ECR 리포지토리 존재 확인 + echo "✓ Checking ECR repository..." + aws ecr describe-repositories \ + --repository-names $ECR_REPOSITORY \ + --region ${{ env.AWS_REGION }} || { + echo "❌ Repository does not exist. Creating..." + aws ecr create-repository \ + --repository-name $ECR_REPOSITORY \ + --region ${{ env.AWS_REGION }} + } + + echo "✅ ECR access verified!" + - name: Extract metadata for Docker id: meta run: | From d33a8bcb09f9d3830ae34a9a0a33aac77814606b Mon Sep 17 00:00:00 2001 From: 0515-Yoonseo-Kim Date: Mon, 1 Dec 2025 17:12:12 +0900 Subject: [PATCH 2/7] =?UTF-8?q?debug:=20ECR=20push=20=EC=8B=A4=ED=8C=A8=20?= =?UTF-8?q?=EC=9B=90=EC=9D=B8=20=EC=83=81=EC=84=B8=20=EB=A1=9C=EA=B9=85=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - push 단계별 상세 로그 추가 - 실패 시 ECR 권한 정책 확인 - 각 태그별 push 결과 출력 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- .github/workflows/docker-ecr.yml | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/.github/workflows/docker-ecr.yml b/.github/workflows/docker-ecr.yml index 697b64e..73e8f06 100644 --- a/.github/workflows/docker-ecr.yml +++ b/.github/workflows/docker-ecr.yml @@ -75,10 +75,24 @@ jobs: ECR_REGISTRY: ${{ secrets.ECR_REGISTRY }} ECR_REPOSITORY: ${{ secrets.ECR_REPOSITORY }} run: | - docker push $ECR_REGISTRY/$ECR_REPOSITORY:latest + echo "🚀 Pushing Docker images to ECR..." + + echo "📦 Pushing: latest" + docker push $ECR_REGISTRY/$ECR_REPOSITORY:latest || { + echo "❌ Failed to push latest tag" + echo "Checking ECR permissions..." + aws ecr get-repository-policy --repository-name $ECR_REPOSITORY --region ${{ env.AWS_REGION }} || echo "No repository policy set" + exit 1 + } + + echo "📦 Pushing: ${{ steps.meta.outputs.sha_short }}" docker push $ECR_REGISTRY/$ECR_REPOSITORY:${{ steps.meta.outputs.sha_short }} + + echo "📦 Pushing: ${{ steps.meta.outputs.timestamp }}" docker push $ECR_REGISTRY/$ECR_REPOSITORY:${{ steps.meta.outputs.timestamp }} + echo "✅ All images pushed successfully!" + - name: Image digest env: ECR_REGISTRY: ${{ secrets.ECR_REGISTRY }} From e51264c5f3245d0ee255d17d16cb482a5a216469 Mon Sep 17 00:00:00 2001 From: 0515-Yoonseo-Kim Date: Mon, 1 Dec 2025 17:22:14 +0900 Subject: [PATCH 3/7] =?UTF-8?q?refactor:=20ECR=20=EC=A0=95=EB=B3=B4=20?= =?UTF-8?q?=ED=95=98=EB=93=9C=EC=BD=94=EB=94=A9=EC=9C=BC=EB=A1=9C=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - ECR_REGISTRY와 ECR_REPOSITORY를 env에 하드코딩 - Secrets 대신 환경변수 사용 - 민감한 정보(AWS 자격증명)만 Secrets로 관리 - 더 명확한 설정 및 디버깅 용이 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- .github/workflows/docker-ecr.yml | 40 ++++++++++++-------------------- 1 file changed, 15 insertions(+), 25 deletions(-) diff --git a/.github/workflows/docker-ecr.yml b/.github/workflows/docker-ecr.yml index 73e8f06..0535047 100644 --- a/.github/workflows/docker-ecr.yml +++ b/.github/workflows/docker-ecr.yml @@ -7,6 +7,8 @@ on: env: AWS_REGION: ap-northeast-2 + ECR_REGISTRY: 672271953867.dkr.ecr.ap-northeast-2.amazonaws.com + ECR_REPOSITORY: konnect-women-b jobs: build-and-push: @@ -29,14 +31,11 @@ jobs: uses: aws-actions/amazon-ecr-login@v2 - name: Verify ECR access and repository - env: - ECR_REGISTRY: ${{ secrets.ECR_REGISTRY }} - ECR_REPOSITORY: ${{ secrets.ECR_REPOSITORY }} run: | echo "🔍 Checking AWS credentials and ECR access..." echo "AWS Region: ${{ env.AWS_REGION }}" - echo "ECR Registry: $ECR_REGISTRY" - echo "ECR Repository: $ECR_REPOSITORY" + echo "ECR Registry: ${{ env.ECR_REGISTRY }}" + echo "ECR Repository: ${{ env.ECR_REPOSITORY }}" # AWS 인증 확인 echo "✓ AWS Identity:" @@ -45,11 +44,11 @@ jobs: # ECR 리포지토리 존재 확인 echo "✓ Checking ECR repository..." aws ecr describe-repositories \ - --repository-names $ECR_REPOSITORY \ + --repository-names ${{ env.ECR_REPOSITORY }} \ --region ${{ env.AWS_REGION }} || { echo "❌ Repository does not exist. Creating..." aws ecr create-repository \ - --repository-name $ECR_REPOSITORY \ + --repository-name ${{ env.ECR_REPOSITORY }} \ --region ${{ env.AWS_REGION }} } @@ -62,45 +61,36 @@ jobs: echo "timestamp=$(date +%Y%m%d-%H%M%S)" >> $GITHUB_OUTPUT - name: Build Docker image - env: - ECR_REGISTRY: ${{ secrets.ECR_REGISTRY }} - ECR_REPOSITORY: ${{ secrets.ECR_REPOSITORY }} run: | - docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:latest . - docker tag $ECR_REGISTRY/$ECR_REPOSITORY:latest $ECR_REGISTRY/$ECR_REPOSITORY:${{ steps.meta.outputs.sha_short }} - docker tag $ECR_REGISTRY/$ECR_REPOSITORY:latest $ECR_REGISTRY/$ECR_REPOSITORY:${{ steps.meta.outputs.timestamp }} + docker build -t ${{ env.ECR_REGISTRY }}/${{ env.ECR_REPOSITORY }}:latest . + docker tag ${{ env.ECR_REGISTRY }}/${{ env.ECR_REPOSITORY }}:latest ${{ env.ECR_REGISTRY }}/${{ env.ECR_REPOSITORY }}:${{ steps.meta.outputs.sha_short }} + docker tag ${{ env.ECR_REGISTRY }}/${{ env.ECR_REPOSITORY }}:latest ${{ env.ECR_REGISTRY }}/${{ env.ECR_REPOSITORY }}:${{ steps.meta.outputs.timestamp }} - name: Push Docker image to ECR - env: - ECR_REGISTRY: ${{ secrets.ECR_REGISTRY }} - ECR_REPOSITORY: ${{ secrets.ECR_REPOSITORY }} run: | echo "🚀 Pushing Docker images to ECR..." echo "📦 Pushing: latest" - docker push $ECR_REGISTRY/$ECR_REPOSITORY:latest || { + docker push ${{ env.ECR_REGISTRY }}/${{ env.ECR_REPOSITORY }}:latest || { echo "❌ Failed to push latest tag" echo "Checking ECR permissions..." - aws ecr get-repository-policy --repository-name $ECR_REPOSITORY --region ${{ env.AWS_REGION }} || echo "No repository policy set" + aws ecr get-repository-policy --repository-name ${{ env.ECR_REPOSITORY }} --region ${{ env.AWS_REGION }} || echo "No repository policy set" exit 1 } echo "📦 Pushing: ${{ steps.meta.outputs.sha_short }}" - docker push $ECR_REGISTRY/$ECR_REPOSITORY:${{ steps.meta.outputs.sha_short }} + docker push ${{ env.ECR_REGISTRY }}/${{ env.ECR_REPOSITORY }}:${{ steps.meta.outputs.sha_short }} echo "📦 Pushing: ${{ steps.meta.outputs.timestamp }}" - docker push $ECR_REGISTRY/$ECR_REPOSITORY:${{ steps.meta.outputs.timestamp }} + docker push ${{ env.ECR_REGISTRY }}/${{ env.ECR_REPOSITORY }}:${{ steps.meta.outputs.timestamp }} echo "✅ All images pushed successfully!" - name: Image digest - env: - ECR_REGISTRY: ${{ secrets.ECR_REGISTRY }} - ECR_REPOSITORY: ${{ secrets.ECR_REPOSITORY }} run: | echo "### 🐳 Docker Image Published to ECR" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY - echo "**Repository:** \`$ECR_REGISTRY/$ECR_REPOSITORY\`" >> $GITHUB_STEP_SUMMARY + echo "**Repository:** \`${{ env.ECR_REGISTRY }}/${{ env.ECR_REPOSITORY }}\`" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY echo "**Tags:**" >> $GITHUB_STEP_SUMMARY echo "- \`latest\`" >> $GITHUB_STEP_SUMMARY @@ -109,5 +99,5 @@ jobs: echo "" >> $GITHUB_STEP_SUMMARY echo "**Pull command:**" >> $GITHUB_STEP_SUMMARY echo "\`\`\`bash" >> $GITHUB_STEP_SUMMARY - echo "docker pull $ECR_REGISTRY/$ECR_REPOSITORY:latest" >> $GITHUB_STEP_SUMMARY + echo "docker pull ${{ env.ECR_REGISTRY }}/${{ env.ECR_REPOSITORY }}:latest" >> $GITHUB_STEP_SUMMARY echo "\`\`\`" >> $GITHUB_STEP_SUMMARY \ No newline at end of file From 3a4afec106517a1c0c71d31ee0025510419bb9c6 Mon Sep 17 00:00:00 2001 From: 0515-Yoonseo-Kim Date: Mon, 1 Dec 2025 17:28:05 +0900 Subject: [PATCH 4/7] =?UTF-8?q?debug:=20Docker=20=EC=9D=B4=EB=AF=B8?= =?UTF-8?q?=EC=A7=80=20=EB=B9=8C=EB=93=9C=20=EB=B0=8F=20push=20=EC=83=81?= =?UTF-8?q?=EC=84=B8=20=EB=A1=9C=EA=B9=85=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 빌드된 이미지 이름 명확히 출력 - Docker 로그인 상태 확인 - 로컬 이미지 목록 출력 - push 실패 시 상세 정보 제공 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- .github/workflows/docker-ecr.yml | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/.github/workflows/docker-ecr.yml b/.github/workflows/docker-ecr.yml index 0535047..bc38dfa 100644 --- a/.github/workflows/docker-ecr.yml +++ b/.github/workflows/docker-ecr.yml @@ -62,17 +62,32 @@ jobs: - name: Build Docker image run: | + echo "🔨 Building Docker image..." + echo "Full image name: ${{ env.ECR_REGISTRY }}/${{ env.ECR_REPOSITORY }}:latest" + docker build -t ${{ env.ECR_REGISTRY }}/${{ env.ECR_REPOSITORY }}:latest . docker tag ${{ env.ECR_REGISTRY }}/${{ env.ECR_REPOSITORY }}:latest ${{ env.ECR_REGISTRY }}/${{ env.ECR_REPOSITORY }}:${{ steps.meta.outputs.sha_short }} docker tag ${{ env.ECR_REGISTRY }}/${{ env.ECR_REPOSITORY }}:latest ${{ env.ECR_REGISTRY }}/${{ env.ECR_REPOSITORY }}:${{ steps.meta.outputs.timestamp }} + echo "✅ Docker images built:" + docker images | grep ${{ env.ECR_REPOSITORY }} + - name: Push Docker image to ECR run: | echo "🚀 Pushing Docker images to ECR..." + echo "Target: ${{ env.ECR_REGISTRY }}/${{ env.ECR_REPOSITORY }}" + + # ECR 로그인 확인 + echo "Checking Docker login status..." + docker info | grep -A 3 "Registry:" - echo "📦 Pushing: latest" + echo "" + echo "📦 Pushing: ${{ env.ECR_REGISTRY }}/${{ env.ECR_REPOSITORY }}:latest" docker push ${{ env.ECR_REGISTRY }}/${{ env.ECR_REPOSITORY }}:latest || { echo "❌ Failed to push latest tag" + echo "Available local images:" + docker images | head -20 + echo "" echo "Checking ECR permissions..." aws ecr get-repository-policy --repository-name ${{ env.ECR_REPOSITORY }} --region ${{ env.AWS_REGION }} || echo "No repository policy set" exit 1 From 29651c8bea2fd303771df71a5decac593847cec6 Mon Sep 17 00:00:00 2001 From: 0515-Yoonseo-Kim Date: Mon, 1 Dec 2025 17:39:18 +0900 Subject: [PATCH 5/7] =?UTF-8?q?fix:=20grep=20=EC=8B=A4=ED=8C=A8=EB=A1=9C?= =?UTF-8?q?=20=EC=9D=B8=ED=95=9C=20=EC=8A=A4=ED=81=AC=EB=A6=BD=ED=8A=B8=20?= =?UTF-8?q?=EC=A4=91=EB=8B=A8=20=EB=B0=A9=EC=A7=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - docker info grep 실패 시에도 계속 진행 - bash -e 모드에서 grep 매칭 실패로 인한 exit 방지 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- .github/workflows/docker-ecr.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/docker-ecr.yml b/.github/workflows/docker-ecr.yml index bc38dfa..7727e15 100644 --- a/.github/workflows/docker-ecr.yml +++ b/.github/workflows/docker-ecr.yml @@ -79,7 +79,7 @@ jobs: # ECR 로그인 확인 echo "Checking Docker login status..." - docker info | grep -A 3 "Registry:" + docker info | grep -A 3 "Registry:" || echo "No registry info found (this is normal)" echo "" echo "📦 Pushing: ${{ env.ECR_REGISTRY }}/${{ env.ECR_REPOSITORY }}:latest" From 88f90715bc60f820514bbcc9b5670e78531ea100 Mon Sep 17 00:00:00 2001 From: 0515-Yoonseo-Kim Date: Mon, 1 Dec 2025 17:53:56 +0900 Subject: [PATCH 6/7] =?UTF-8?q?refactor:=20CD=20job=EC=97=90=EC=84=9C=20?= =?UTF-8?q?=ED=99=98=EA=B2=BD=EB=B3=80=EC=88=98=EB=A5=BC=20.env=20?= =?UTF-8?q?=ED=8C=8C=EC=9D=BC=EB=A1=9C=20=EA=B4=80=EB=A6=AC=ED=95=98?= =?UTF-8?q?=EB=8F=84=EB=A1=9D=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 개별 환경변수 secret 대신 PROD_ENV_FILE 단일 secret 사용 - docker run 시 --env-file 옵션으로 환경변수 전달 - 보안을 위해 배포 후 임시 .env 파일 자동 삭제 - 환경변수 관리 간소화 및 유지보수성 향상 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- .github/workflows/docker-ecr.yml | 62 +++++++++++++++++++++++++++++++- 1 file changed, 61 insertions(+), 1 deletion(-) diff --git a/.github/workflows/docker-ecr.yml b/.github/workflows/docker-ecr.yml index 7727e15..6ae9e99 100644 --- a/.github/workflows/docker-ecr.yml +++ b/.github/workflows/docker-ecr.yml @@ -115,4 +115,64 @@ jobs: echo "**Pull command:**" >> $GITHUB_STEP_SUMMARY echo "\`\`\`bash" >> $GITHUB_STEP_SUMMARY echo "docker pull ${{ env.ECR_REGISTRY }}/${{ env.ECR_REPOSITORY }}:latest" >> $GITHUB_STEP_SUMMARY - echo "\`\`\`" >> $GITHUB_STEP_SUMMARY \ No newline at end of file + echo "\`\`\`" >> $GITHUB_STEP_SUMMARY + + deploy: + name: Deploy to EC2 + needs: build-and-push + runs-on: ubuntu-latest + + steps: + - name: Setup SSH + run: | + mkdir -p ~/.ssh + echo "${{ secrets.PROD_SSH_KEY }}" > ~/.ssh/id_rsa + chmod 600 ~/.ssh/id_rsa + ssh-keyscan -H ${{ secrets.PROD_HOST }} >> ~/.ssh/known_hosts + + - name: Deploy to EC2 + run: | + ssh ${{ secrets.PROD_USER }}@${{ secrets.PROD_HOST }} << 'EOF' + set -e + + echo "🔐 Logging in to ECR..." + aws ecr get-login-password --region ${{ env.AWS_REGION }} | docker login --username AWS --password-stdin ${{ env.ECR_REGISTRY }} + + echo "📥 Pulling latest image from ECR..." + docker pull ${{ env.ECR_REGISTRY }}/${{ env.ECR_REPOSITORY }}:latest + + echo "📝 Creating .env file..." + cat > /tmp/konnect-backend.env << 'ENVEOF' + ${{ secrets.PROD_ENV_FILE }} + ENVEOF + + echo "🛑 Stopping existing container..." + docker stop konnect-backend || true + docker rm konnect-backend || true + + echo "🚀 Starting new container..." + docker run -d \ + --name konnect-backend \ + -p ${{ secrets.PROD_SERVER_PORT }}:8080 \ + --env-file /tmp/konnect-backend.env \ + --restart unless-stopped \ + ${{ env.ECR_REGISTRY }}/${{ env.ECR_REPOSITORY }}:latest + + echo "🧹 Cleaning up .env file..." + rm -f /tmp/konnect-backend.env + + echo "⏳ Waiting for application to start..." + sleep 15 + + echo "🔍 Checking container status..." + if docker ps | grep konnect-backend > /dev/null; then + echo "✅ Container is running" + docker logs konnect-backend --tail 20 + else + echo "❌ Container failed to start" + docker logs konnect-backend --tail 50 + exit 1 + fi + + echo "✅ Deployment completed successfully!" + EOF \ No newline at end of file From 92e1534de6bd5cde8eb122858b67c0e39284d24d Mon Sep 17 00:00:00 2001 From: 0515-Yoonseo-Kim Date: Tue, 2 Dec 2025 14:20:47 +0900 Subject: [PATCH 7/7] =?UTF-8?q?fix:=20CORS=20=EC=84=A4=EC=A0=95=EC=97=90?= =?UTF-8?q?=20www=20=EC=84=9C=EB=B8=8C=EB=8F=84=EB=A9=94=EC=9D=B8=20?= =?UTF-8?q?=ED=97=88=EC=9A=A9=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - https://www.konnect-women.site 추가 - http://www.konnect-women.site 추가 - CORS preflight 에러 해결 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- .../konnect_backend/global/config/WebSecurityConfig.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/example/konnect_backend/global/config/WebSecurityConfig.java b/src/main/java/com/example/konnect_backend/global/config/WebSecurityConfig.java index 4c2e2b9..90e0fb2 100644 --- a/src/main/java/com/example/konnect_backend/global/config/WebSecurityConfig.java +++ b/src/main/java/com/example/konnect_backend/global/config/WebSecurityConfig.java @@ -107,8 +107,10 @@ public CorsConfigurationSource corsConfigurationSource() { "ws://localhost:8080", "http://localhost:3000", "https://konnect-women.site", - "http://localhost:8081", - "http://konnect-women.site" + "https://www.konnect-women.site", + "http://konnect-women.site", + "http://www.konnect-women.site", + "http://localhost:8081" ); config.setAllowedOrigins(allowedOrigins);