diff --git a/.claude/commands/deploy-actions-cicd-guide-back.md b/.claude/commands/deploy-actions-cicd-guide-back.md new file mode 100644 index 0000000..ae97c1d --- /dev/null +++ b/.claude/commands/deploy-actions-cicd-guide-back.md @@ -0,0 +1,17 @@ +--- +command: "/deploy-actions-cicd-guide-back" +description: "백엔드 GitHub Actions CI/CD 파이프라인 가이드 작성" +--- + +@cicd +'백엔드GitHubActions파이프라인작성가이드'에 따라 GitHub Actions를 이용한 CI/CD 가이드를 작성해 주세요. + +프롬프트에 '[실행정보]'항목이 없으면 수행을 중단하고 안내 메시지를 표시해 주세요. + +{안내메시지} +'[실행정보]'섹션 하위에 아래 예와 같이 필요한 정보를 제시해 주세요. +[실행정보] +- ACR_NAME: acrdigitalgarage01 +- RESOURCE_GROUP: rg-digitalgarage-01 +- AKS_CLUSTER: aks-digitalgarage-01 +- NAMESPACE: phonebill-dg0500 diff --git a/.claude/commands/deploy-actions-cicd-guide-front.md b/.claude/commands/deploy-actions-cicd-guide-front.md new file mode 100644 index 0000000..b4e818a --- /dev/null +++ b/.claude/commands/deploy-actions-cicd-guide-front.md @@ -0,0 +1,18 @@ +--- +command: "/deploy-actions-cicd-guide-front" +description: "프론트엔드 GitHub Actions CI/CD 파이프라인 가이드 작성" +--- + +@cicd +'프론트엔드GitHubActions파이프라인작성가이드'에 따라 GitHub Actions를 이용한 CI/CD 가이드를 작성해 주세요. + +프롬프트에 '[실행정보]'항목이 없으면 수행을 중단하고 안내 메시지를 표시해 주세요. + +{안내메시지} +'[실행정보]'섹션 하위에 아래 예와 같이 필요한 정보를 제시해 주세요. +[실행정보] +- SYSTEM_NAME: phonebill +- ACR_NAME: acrdigitalgarage01 +- RESOURCE_GROUP: rg-digitalgarage-01 +- AKS_CLUSTER: aks-digitalgarage-01 +- NAMESPACE: phonebill-dg0500 diff --git a/.claude/commands/deploy-build-image-back.md b/.claude/commands/deploy-build-image-back.md new file mode 100644 index 0000000..242c4a4 --- /dev/null +++ b/.claude/commands/deploy-build-image-back.md @@ -0,0 +1,7 @@ +--- +command: "/deploy-build-image-back" +description: "백엔드 컨테이너 이미지 작성" +--- + +@cicd +'백엔드컨테이너이미지작성가이드'에 따라 컨테이너 이미지를 작성해 주세요. diff --git a/.claude/commands/deploy-build-image-front.md b/.claude/commands/deploy-build-image-front.md new file mode 100644 index 0000000..e2d8426 --- /dev/null +++ b/.claude/commands/deploy-build-image-front.md @@ -0,0 +1,7 @@ +--- +command: "/deploy-build-image-front" +description: "프론트엔드 컨테이너 이미지 작성" +--- + +@cicd +'프론트엔드컨테이너이미지작성가이드'에 따라 컨테이너 이미지를 작성해 주세요. diff --git a/.claude/commands/deploy-help.md b/.claude/commands/deploy-help.md new file mode 100644 index 0000000..660195b --- /dev/null +++ b/.claude/commands/deploy-help.md @@ -0,0 +1,64 @@ +--- +command: "/deploy-help" +description: "배포 작업 순서 및 명령어 안내" +--- + +# 배포 작업 순서 + +## 컨테이너 이미지 작성 +### 백엔드 +/deploy-build-image-back +- 백엔드 서비스들의 컨테이너 이미지를 작성합니다 + +### 프론트엔드 +/deploy-build-image-front +- 프론트엔드 서비스의 컨테이너 이미지를 작성합니다 + +## 컨테이너 실행 가이드 작성 +### 백엔드 +/deploy-run-container-guide-back +- 백엔드 컨테이너 실행 가이드를 작성합니다 +- [실행정보] 섹션에 ACR명, VM 접속 정보 제공 필요 + +### 프론트엔드 +/deploy-run-container-guide-front +- 프론트엔드 컨테이너 실행 가이드를 작성합니다 +- [실행정보] 섹션에 시스템명, ACR명, VM 접속 정보 제공 필요 + +## Kubernetes 배포 가이드 작성 +### 백엔드 +/deploy-k8s-guide-back +- 백엔드 서비스 Kubernetes 배포 가이드를 작성합니다 +- [실행정보] 섹션에 ACR명, k8s명, 네임스페이스, 리소스 정보 제공 필요 + +### 프론트엔드 +/deploy-k8s-guide-front +- 프론트엔드 서비스 Kubernetes 배포 가이드를 작성합니다 +- [실행정보] 섹션에 시스템명, ACR명, k8s명, 네임스페이스, Gateway Host 정보 제공 필요 + +## CI/CD 파이프라인 작성 +### Jenkins CI/CD +#### 백엔드 +/deploy-jenkins-cicd-guide-back +- Jenkins를 이용한 백엔드 CI/CD 파이프라인 가이드를 작성합니다 +- [실행정보] 섹션에 ACR_NAME, RESOURCE_GROUP, AKS_CLUSTER, NAMESPACE 제공 필요 + +#### 프론트엔드 +/deploy-jenkins-cicd-guide-front +- Jenkins를 이용한 프론트엔드 CI/CD 파이프라인 가이드를 작성합니다 +- [실행정보] 섹션에 SYSTEM_NAME, ACR_NAME, RESOURCE_GROUP, AKS_CLUSTER, NAMESPACE 제공 필요 + +### GitHub Actions CI/CD +#### 백엔드 +/deploy-actions-cicd-guide-back +- GitHub Actions를 이용한 백엔드 CI/CD 파이프라인 가이드를 작성합니다 +- [실행정보] 섹션에 ACR_NAME, RESOURCE_GROUP, AKS_CLUSTER, NAMESPACE 제공 필요 + +#### 프론트엔드 +/deploy-actions-cicd-guide-front +- GitHub Actions를 이용한 프론트엔드 CI/CD 파이프라인 가이드를 작성합니다 +- [실행정보] 섹션에 SYSTEM_NAME, ACR_NAME, RESOURCE_GROUP, AKS_CLUSTER, NAMESPACE 제공 필요 + +--- + +**참고**: 각 명령어 실행 시 [실행정보] 섹션에 필요한 정보를 함께 제공해야 합니다. diff --git a/.claude/commands/deploy-jenkins-cicd-guide-back.md b/.claude/commands/deploy-jenkins-cicd-guide-back.md new file mode 100644 index 0000000..96a9093 --- /dev/null +++ b/.claude/commands/deploy-jenkins-cicd-guide-back.md @@ -0,0 +1,17 @@ +--- +command: "/deploy-jenkins-cicd-guide-back" +description: "백엔드 Jenkins CI/CD 파이프라인 가이드 작성" +--- + +@cicd +'백엔드Jenkins파이프라인작성가이드'에 따라 Jenkins를 이용한 CI/CD 가이드를 작성해 주세요. + +프롬프트에 '[실행정보]'항목이 없으면 수행을 중단하고 안내 메시지를 표시해 주세요. + +{안내메시지} +'[실행정보]'섹션 하위에 아래 예와 같이 필요한 정보를 제시해 주세요. +[실행정보] +- ACR_NAME: acrdigitalgarage01 +- RESOURCE_GROUP: rg-digitalgarage-01 +- AKS_CLUSTER: aks-digitalgarage-01 +- NAMESPACE: phonebill-dg0500 diff --git a/.claude/commands/deploy-jenkins-cicd-guide-front.md b/.claude/commands/deploy-jenkins-cicd-guide-front.md new file mode 100644 index 0000000..af3807d --- /dev/null +++ b/.claude/commands/deploy-jenkins-cicd-guide-front.md @@ -0,0 +1,18 @@ +--- +command: "/deploy-jenkins-cicd-guide-front" +description: "프론트엔드 Jenkins CI/CD 파이프라인 가이드 작성" +--- + +@cicd +'프론트엔드Jenkins파이프라인작성가이드'에 따라 Jenkins를 이용한 CI/CD 가이드를 작성해 주세요. + +프롬프트에 '[실행정보]'항목이 없으면 수행을 중단하고 안내 메시지를 표시해 주세요. + +{안내메시지} +'[실행정보]'섹션 하위에 아래 예와 같이 필요한 정보를 제시해 주세요. +[실행정보] +- SYSTEM_NAME: phonebill +- ACR_NAME: acrdigitalgarage01 +- RESOURCE_GROUP: rg-digitalgarage-01 +- AKS_CLUSTER: aks-digitalgarage-01 +- NAMESPACE: phonebill-dg0500 diff --git a/.claude/commands/deploy-k8s-guide-back.md b/.claude/commands/deploy-k8s-guide-back.md new file mode 100644 index 0000000..e5f4009 --- /dev/null +++ b/.claude/commands/deploy-k8s-guide-back.md @@ -0,0 +1,19 @@ +--- +command: "/deploy-k8s-guide-back" +description: "백엔드 Kubernetes 배포 가이드 작성" +--- + +@cicd +'백엔드배포가이드'에 따라 백엔드 서비스 배포 방법을 작성해 주세요. + +프롬프트에 '[실행정보]'항목이 없으면 수행을 중단하고 안내 메시지를 표시해 주세요. + +{안내메시지} +'[실행정보]'섹션 하위에 아래 예와 같이 필요한 정보를 제시해 주세요. +[실행정보] +- ACR명: acrdigitalgarage01 +- k8s명: aks-digitalgarage-01 +- 네임스페이스: tripgen +- 파드수: 2 +- 리소스(CPU): 256m/1024m +- 리소스(메모리): 256Mi/1024Mi diff --git a/.claude/commands/deploy-k8s-guide-front.md b/.claude/commands/deploy-k8s-guide-front.md new file mode 100644 index 0000000..0d62215 --- /dev/null +++ b/.claude/commands/deploy-k8s-guide-front.md @@ -0,0 +1,21 @@ +--- +command: "/deploy-k8s-guide-front" +description: "프론트엔드 Kubernetes 배포 가이드 작성" +--- + +@cicd +'프론트엔드배포가이드'에 따라 프론트엔드 서비스 배포 방법을 작성해 주세요. + +프롬프트에 '[실행정보]'항목이 없으면 수행을 중단하고 안내 메시지를 표시해 주세요. + +{안내메시지} +'[실행정보]'섹션 하위에 아래 예와 같이 필요한 정보를 제시해 주세요. +[실행정보] +- 시스템명: tripgen +- ACR명: acrdigitalgarage01 +- k8s명: aks-digitalgarage-01 +- 네임스페이스: tripgen +- 파드수: 2 +- 리소스(CPU): 256m/1024m +- 리소스(메모리): 256Mi/1024Mi +- Gateway Host: http://tripgen-api.20.214.196.128.nip.io diff --git a/.claude/commands/deploy-run-container-guide-back.md b/.claude/commands/deploy-run-container-guide-back.md new file mode 100644 index 0000000..47dc409 --- /dev/null +++ b/.claude/commands/deploy-run-container-guide-back.md @@ -0,0 +1,18 @@ +--- +command: "/deploy-run-container-guide-back" +description: "백엔드 컨테이너 실행방법 가이드 작성" +--- + +@cicd +'백엔드컨테이너실행방법가이드'에 따라 컨테이너 실행 가이드를 작성해 주세요. + +프롬프트에 '[실행정보]'항목이 없으면 수행을 중단하고 안내 메시지를 표시해 주세요. + +{안내메시지} +'[실행정보]'섹션 하위에 아래 예와 같이 필요한 정보를 제시해 주세요. +[실행정보] +- ACR명: acrdigitalgarage01 +- VM + - KEY파일: ~/home/bastion-dg0500 + - USERID: azureuser + - IP: 4.230.5.6 diff --git a/.claude/commands/deploy-run-container-guide-front.md b/.claude/commands/deploy-run-container-guide-front.md new file mode 100644 index 0000000..ff3f3d4 --- /dev/null +++ b/.claude/commands/deploy-run-container-guide-front.md @@ -0,0 +1,19 @@ +--- +command: "/deploy-run-container-guide-front" +description: "프론트엔드 컨테이너 실행방법 가이드 작성" +--- + +@cicd +'프론트엔드컨테이너실행방법가이드'에 따라 컨테이너 실행 가이드를 작성해 주세요. + +프롬프트에 '[실행정보]'항목이 없으면 수행을 중단하고 안내 메시지를 표시해 주세요. + +{안내메시지} +'[실행정보]'섹션 하위에 아래 예와 같이 필요한 정보를 제시해 주세요. +[실행정보] +- 시스템명: tripgen +- ACR명: acrdigitalgarage01 +- VM + - KEY파일: ~/home/bastion-dg0500 + - USERID: azureuser + - IP: 4.230.5.6 diff --git a/.claude/commands/design-api.md b/.claude/commands/design-api.md index 5375bf7..750eae3 100644 --- a/.claude/commands/design-api.md +++ b/.claude/commands/design-api.md @@ -1,3 +1,6 @@ +--- +command: "/design-api" +--- @architecture API를 설계해 주세요: -- '공통설계원칙'과 'API설계가이드'를 준용하여 설계 +- '공통설계원칙'과 'API설계가이드'를 준용하여 설계 \ No newline at end of file diff --git a/.claude/commands/design-class.md b/.claude/commands/design-class.md index dc76da9..178bdb1 100644 --- a/.claude/commands/design-class.md +++ b/.claude/commands/design-class.md @@ -1,3 +1,6 @@ +--- +command: "/design-class" +--- @architecture '공통설계원칙'과 '클래스설계가이드'를 준용하여 클래스를 설계해 주세요. 프롬프트에 '[클래스설계 정보]'항목이 없으면 수행을 중단하고 안내 메시지를 표시합니다. @@ -9,4 +12,4 @@ - User: Layered - Trip: Clean - Location: Layered - - AI: Layered + - AI: Layered \ No newline at end of file diff --git a/.claude/commands/design-data.md b/.claude/commands/design-data.md index 8d9fd77..b5ff1dd 100644 --- a/.claude/commands/design-data.md +++ b/.claude/commands/design-data.md @@ -1,3 +1,6 @@ +--- +command: "/design-data" +--- @architecture 데이터 설계를 해주세요: -- '공통설계원칙'과 '데이터설계가이드'를 준용하여 설계 +- '공통설계원칙'과 '데이터설계가이드'를 준용하여 설계 \ No newline at end of file diff --git a/.claude/commands/design-fix-prototype.md b/.claude/commands/design-fix-prototype.md index d1ddb8a..5cc1890 100644 --- a/.claude/commands/design-fix-prototype.md +++ b/.claude/commands/design-fix-prototype.md @@ -1,5 +1,8 @@ +--- +command: "/design-fix-prototype" +--- @fix as @front '[오류내용]'섹션에 제공된 오류를 해결해 주세요. 프롬프트에 '[오류내용]'섹션이 없으면 수행 중단하고 안내 메시지 표시 {안내메시지} -'[오류내용]'섹션 하위에 오류 내용을 제공 +'[오류내용]'섹션 하위에 오류 내용을 제공 \ No newline at end of file diff --git a/.claude/commands/design-front.md b/.claude/commands/design-front.md index 67bc0a5..8dd99c9 100644 --- a/.claude/commands/design-front.md +++ b/.claude/commands/design-front.md @@ -1,3 +1,6 @@ +--- +command: "/design-front" +--- @plan as @front '프론트엔드설계가이드'를 준용하여 **프론트엔드설계서**를 작성해 주세요. 프롬프트에 '[백엔드시스템]'항목이 없으면 수행을 중단하고 안내 메시지를 표시합니다. @@ -13,4 +16,4 @@ - ai service: http://localhost:8084/v3/api-docs [요구사항] - 각 화면에 Back 아이콘 버튼과 화면 타이틀 표시 -- 하단 네비게이션 바 아이콘화: 홈, 새여행, 주변장소검색, 여행보기 +- 하단 네비게이션 바 아이콘화: 홈, 새여행, 주변장소검색, 여행보기 \ No newline at end of file diff --git a/.claude/commands/design-high-level.md b/.claude/commands/design-high-level.md index d7028b1..0debc5e 100644 --- a/.claude/commands/design-high-level.md +++ b/.claude/commands/design-high-level.md @@ -1,6 +1,9 @@ +--- +command: "/design-high-level" +--- @architecture 'HighLevel아키텍처정의가이드'를 준용하여 High Level 아키텍처 정의서를 작성해 주세요. 'CLOUD' 정보가 없으면 수행을 중단하고 안내메시지를 표시하세요. {안내메시지} 아래 예와 같이 CLOUD 제공자를 Azure, AWS, Google과 같이 제공하세요. -- CLOUD: Azure +- CLOUD: Azure \ No newline at end of file diff --git a/.claude/commands/design-improve-prototype.md b/.claude/commands/design-improve-prototype.md index 0d1b31b..22bc079 100644 --- a/.claude/commands/design-improve-prototype.md +++ b/.claude/commands/design-improve-prototype.md @@ -1,5 +1,8 @@ +--- +command: "/design-improve-prototype" +--- @improve as @front '[개선내용]'섹션에 있는 내용을 개선해 주세요. 프롬프트에 '[개선내용]'항목이 없으면 수행을 중단하고 안내 메시지 표시 {안내메시지} -'[개선내용]'섹션 하위에 개선할 내용을 제공 +'[개선내용]'섹션 하위에 개선할 내용을 제공 \ No newline at end of file diff --git a/.claude/commands/design-improve-userstory.md b/.claude/commands/design-improve-userstory.md index a1055f2..73fd453 100644 --- a/.claude/commands/design-improve-userstory.md +++ b/.claude/commands/design-improve-userstory.md @@ -1,2 +1,5 @@ +--- +command: "/design-improve-userstory" +--- @analyze as @front 프로토타입을 웹브라우저에서 분석한 후, -@document as @scribe 수정된 프로토타입에 따라 유저스토리를 업데이트 해주십시오. +@document as @scribe 수정된 프로토타입에 따라 유저스토리를 업데이트 해주십시오. \ No newline at end of file diff --git a/.claude/commands/design-logical.md b/.claude/commands/design-logical.md index 28f15e9..3d50c8f 100644 --- a/.claude/commands/design-logical.md +++ b/.claude/commands/design-logical.md @@ -1,3 +1,6 @@ +--- +command: "/design-logical" +--- @architecture 논리 아키텍처를 설계해 주세요: -- '공통설계원칙'과 '논리아키텍처 설계 가이드'를 준용하여 설계 +- '공통설계원칙'과 '논리아키텍처 설계 가이드'를 준용하여 설계 \ No newline at end of file diff --git a/.claude/commands/design-pattern.md b/.claude/commands/design-pattern.md index 06ed88d..decb145 100644 --- a/.claude/commands/design-pattern.md +++ b/.claude/commands/design-pattern.md @@ -1,3 +1,6 @@ +--- +command: "/design-pattern" +--- @design-pattern 클라우드 아키텍처 패턴 적용 방안을 작성해 주세요: -- '클라우드아키텍처패턴선정가이드'를 준용하여 작성 +- '클라우드아키텍처패턴선정가이드'를 준용하여 작성 \ No newline at end of file diff --git a/.claude/commands/design-physical.md b/.claude/commands/design-physical.md index 2dc8a51..7df5bca 100644 --- a/.claude/commands/design-physical.md +++ b/.claude/commands/design-physical.md @@ -1,6 +1,9 @@ +--- +command: "/design-physical" +--- @architecture '물리아키텍처설계가이드'를 준용하여 물리아키텍처를 설계해 주세요. 'CLOUD' 정보가 없으면 수행을 중단하고 안내메시지를 표시하세요. {안내메시지} 아래 예와 같이 CLOUD 제공자를 Azure, AWS, Google과 같이 제공하세요. -- CLOUD: Azure +- CLOUD: Azure \ No newline at end of file diff --git a/.claude/commands/design-prototype.md b/.claude/commands/design-prototype.md index f43547f..dbd24a0 100644 --- a/.claude/commands/design-prototype.md +++ b/.claude/commands/design-prototype.md @@ -1,3 +1,6 @@ +--- +command: "/design-prototype" +--- @prototype 프로토타입을 작성해 주세요: -- '프로토타입작성가이드'를 준용하여 작성 +- '프로토타입작성가이드'를 준용하여 작성 \ No newline at end of file diff --git a/.claude/commands/design-seq-inner.md b/.claude/commands/design-seq-inner.md index 5583610..d2bc4ac 100644 --- a/.claude/commands/design-seq-inner.md +++ b/.claude/commands/design-seq-inner.md @@ -1,3 +1,6 @@ +--- +command: "/design-seq-inner" +--- @architecture 내부 시퀀스 설계를 해 주세요: -- '공통설계원칙'과 '내부시퀀스설계 가이드'를 준용하여 설계 +- '공통설계원칙'과 '내부시퀀스설계 가이드'를 준용하여 설계 \ No newline at end of file diff --git a/.claude/commands/design-seq-outer.md b/.claude/commands/design-seq-outer.md index 0546370..8e05435 100644 --- a/.claude/commands/design-seq-outer.md +++ b/.claude/commands/design-seq-outer.md @@ -1,3 +1,6 @@ +--- +command: "/design-seq-outer" +--- @architecture 외부 시퀀스 설계를 해 주세요: -- '공통설계원칙'과 '외부시퀀스설계가이드'를 준용하여 설계 +- '공통설계원칙'과 '외부시퀀스설계가이드'를 준용하여 설계 \ No newline at end of file diff --git a/.claude/commands/design-test-prototype.md b/.claude/commands/design-test-prototype.md index bd45346..350788a 100644 --- a/.claude/commands/design-test-prototype.md +++ b/.claude/commands/design-test-prototype.md @@ -1,2 +1,5 @@ +--- +command: "/design-test-prototype" +--- @test-front -프로토타입을 테스트 해 주세요. +프로토타입을 테스트 해 주세요. \ No newline at end of file diff --git a/.claude/commands/design-uiux.md b/.claude/commands/design-uiux.md index 2b1c387..d68d857 100644 --- a/.claude/commands/design-uiux.md +++ b/.claude/commands/design-uiux.md @@ -1,3 +1,6 @@ +--- +command: "/design-uiux" +--- @uiux UI/UX 설계를 해주세요: -- 'UI/UX설계가이드'를 준용하여 작성 +- 'UI/UX설계가이드'를 준용하여 작성 \ No newline at end of file diff --git a/.claude/commands/design-update-uiux.md b/.claude/commands/design-update-uiux.md index 6994cd9..afd7cf9 100644 --- a/.claude/commands/design-update-uiux.md +++ b/.claude/commands/design-update-uiux.md @@ -1,2 +1,5 @@ +--- +command: "/design-update-uiux" +--- @document @front -현재 프로토타입과 유저스토리를 기준으로 UI/UX설계서와 스타일가이드를 수정해 주세요. +현재 프로토타입과 유저스토리를 기준으로 UI/UX설계서와 스타일가이드를 수정해 주세요. \ No newline at end of file diff --git a/.claude/commands/think-help.md b/.claude/commands/think-help.md index 49bc697..17ad05a 100644 --- a/.claude/commands/think-help.md +++ b/.claude/commands/think-help.md @@ -1,3 +1,6 @@ +--- +command: "/think-help" +--- 기획 작업 순서 1단계: 서비스 기획 diff --git a/.claude/commands/think-planning.md b/.claude/commands/think-planning.md index c40eaec..beec938 100644 --- a/.claude/commands/think-planning.md +++ b/.claude/commands/think-planning.md @@ -1,3 +1,6 @@ +--- +command: "/think-planning" +--- 아래 내용을 터미널에 표시만 하고 수행을 하지는 않습니다. ``` 아래 가이드를 참고하여 서비스 기획을 수행합니다. diff --git a/.claude/commands/think-userstory.md b/.claude/commands/think-userstory.md index abdcb97..a002c30 100644 --- a/.claude/commands/think-userstory.md +++ b/.claude/commands/think-userstory.md @@ -1,3 +1,7 @@ +--- +command: "/think-userstory" +--- +``` @document 유저스토리를 작성하세요. 프롬프트에 '[요구사항]'섹션이 없으면 수행을 중단하고 안내 메시지를 표시합니다. @@ -16,3 +20,5 @@ Case 2) 다른 방법으로 이벤트스토밍을 한 경우는 요구사항을 2. 유저스토리 작성 - '유저스토리작성방법'과 '유저스토리예제'를 참고하여 유저스토리를 작성 - 결과파일은 'design/userstory.md'에 생성 + +``` diff --git a/.github/README.md b/.github/README.md new file mode 100644 index 0000000..55fcb41 --- /dev/null +++ b/.github/README.md @@ -0,0 +1,186 @@ +# KT Event Marketing - CI/CD Infrastructure + +이 디렉토리는 KT Event Marketing 백엔드 서비스의 CI/CD 인프라를 포함합니다. + +## 디렉토리 구조 + +``` +.github/ +├── README.md # 이 파일 +├── workflows/ +│ └── backend-cicd.yaml # GitHub Actions 워크플로우 +├── kustomize/ # Kubernetes 매니페스트 관리 +│ ├── base/ # 기본 리소스 정의 +│ │ ├── kustomization.yaml +│ │ ├── cm-common.yaml +│ │ ├── secret-common.yaml +│ │ ├── secret-imagepull.yaml +│ │ ├── ingress.yaml +│ │ └── {service}-*.yaml # 각 서비스별 리소스 +│ └── overlays/ # 환경별 설정 +│ ├── dev/ +│ │ ├── kustomization.yaml +│ │ └── *-patch.yaml # 1 replica, 256Mi-1024Mi +│ ├── staging/ +│ │ ├── kustomization.yaml +│ │ └── *-patch.yaml # 2 replicas, 512Mi-2048Mi +│ └── prod/ +│ ├── kustomization.yaml +│ └── *-patch.yaml # 3 replicas, 1024Mi-4096Mi +├── config/ +│ ├── deploy_env_vars_dev # Dev 환경 변수 +│ ├── deploy_env_vars_staging # Staging 환경 변수 +│ └── deploy_env_vars_prod # Prod 환경 변수 +└── scripts/ + ├── deploy.sh # 수동 배포 스크립트 + ├── generate-patches.sh # 패치 파일 생성 스크립트 + └── copy-manifests-to-base.py # 매니페스트 복사 스크립트 +``` + +## 주요 파일 설명 + +### workflows/backend-cicd.yaml +GitHub Actions 워크플로우 정의 파일입니다. + +**트리거**: +- develop 브랜치 push → dev 환경 배포 +- main 브랜치 push → prod 환경 배포 +- Manual workflow dispatch → 원하는 환경과 서비스 선택 + +**Jobs**: +1. `detect-changes`: 변경된 서비스 감지 +2. `build-and-push`: 서비스 빌드 및 ACR 푸시 +3. `deploy`: AKS에 배포 +4. `notify`: 배포 결과 알림 + +### kustomize/base/kustomization.yaml +모든 환경에서 공통으로 사용하는 기본 리소스를 정의합니다. + +**포함 리소스**: +- Common ConfigMaps and Secrets +- Ingress +- 7개 서비스의 Deployment, Service, ConfigMap, Secret + +### kustomize/overlays/{env}/kustomization.yaml +환경별 설정을 오버라이드합니다. + +**주요 차이점**: +- 이미지 태그 (dev/staging/prod) +- Replica 수 (1/2/3) +- 리소스 할당량 (작음/중간/큼) + +### scripts/deploy.sh +로컬에서 수동 배포를 위한 스크립트입니다. + +**사용법**: +```bash +# 모든 서비스를 dev 환경에 배포 +./scripts/deploy.sh dev + +# 특정 서비스만 prod 환경에 배포 +./scripts/deploy.sh prod user-service +``` + +## 배포 프로세스 + +### 자동 배포 (GitHub Actions) + +1. **Dev 환경**: + ```bash + git checkout develop + git push origin develop + ``` + +2. **Prod 환경**: + ```bash + git checkout main + git merge develop + git push origin main + ``` + +3. **수동 배포**: + - GitHub Actions UI → Run workflow + - Environment 선택 (dev/staging/prod) + - Service 선택 (all 또는 특정 서비스) + +### 수동 배포 (로컬) + +```bash +# 사전 요구사항: Azure CLI, kubectl, kustomize 설치 +# Azure 로그인 필요 + +# Dev 환경에 모든 서비스 배포 +./.github/scripts/deploy.sh dev + +# Prod 환경에 user-service만 배포 +./.github/scripts/deploy.sh prod user-service +``` + +## 환경별 설정 + +| 환경 | 브랜치 | 이미지 태그 | Replicas | CPU Request | Memory Request | +|------|--------|-------------|----------|-------------|----------------| +| Dev | develop | dev | 1 | 256m | 256Mi | +| Staging | manual | staging | 2 | 512m | 512Mi | +| Prod | main | prod | 3 | 1024m | 1024Mi | + +## 서비스 목록 + +1. **user-service** (8081) - 사용자 관리 +2. **event-service** (8082) - 이벤트 관리 +3. **ai-service** (8083) - AI 기반 콘텐츠 생성 +4. **content-service** (8084) - 콘텐츠 관리 +5. **distribution-service** (8085) - 경품 배포 +6. **participation-service** (8086) - 이벤트 참여 +7. **analytics-service** (8087) - 분석 및 통계 + +## 모니터링 + +### Pod 상태 확인 +```bash +kubectl get pods -n kt-event-marketing +``` + +### 로그 확인 +```bash +# 실시간 로그 +kubectl logs -n kt-event-marketing -l app=user-service -f + +# 이전 컨테이너 로그 +kubectl logs -n kt-event-marketing --previous +``` + +### 리소스 사용량 +```bash +# Pod 리소스 +kubectl top pods -n kt-event-marketing + +# Node 리소스 +kubectl top nodes +``` + +## 트러블슈팅 + +상세한 트러블슈팅 가이드는 [deployment/cicd/CICD-GUIDE.md](../../deployment/cicd/CICD-GUIDE.md)를 참조하세요. + +**주요 문제 해결**: +- ImagePullBackOff → ACR Secret 확인 +- CrashLoopBackOff → 로그 확인 및 환경 변수 검증 +- Readiness Probe Failed → Context Path 및 Actuator 경로 확인 + +## 롤백 + +```bash +# 이전 버전으로 롤백 +kubectl rollout undo deployment/user-service -n kt-event-marketing + +# 특정 리비전으로 롤백 +kubectl rollout undo deployment/user-service --to-revision=2 -n kt-event-marketing +``` + +## 참고 자료 + +- [CI/CD 가이드 (한글)](../../deployment/cicd/CICD-GUIDE.md) +- [GitHub Actions 공식 문서](https://docs.github.com/en/actions) +- [Kustomize 공식 문서](https://kustomize.io/) +- [Azure AKS 공식 문서](https://docs.microsoft.com/en-us/azure/aks/) diff --git a/.github/config/deploy_env_vars_dev b/.github/config/deploy_env_vars_dev new file mode 100644 index 0000000..ad6353e --- /dev/null +++ b/.github/config/deploy_env_vars_dev @@ -0,0 +1,11 @@ +# Development Environment Variables +ENVIRONMENT=dev +ACR_NAME=acrdigitalgarage01 +RESOURCE_GROUP=rg-digitalgarage-01 +AKS_CLUSTER=aks-digitalgarage-01 +NAMESPACE=kt-event-marketing +REPLICAS=1 +CPU_REQUEST=256m +MEMORY_REQUEST=256Mi +CPU_LIMIT=1024m +MEMORY_LIMIT=1024Mi diff --git a/.github/config/deploy_env_vars_prod b/.github/config/deploy_env_vars_prod new file mode 100644 index 0000000..d37386c --- /dev/null +++ b/.github/config/deploy_env_vars_prod @@ -0,0 +1,11 @@ +# Production Environment Variables +ENVIRONMENT=prod +ACR_NAME=acrdigitalgarage01 +RESOURCE_GROUP=rg-digitalgarage-01 +AKS_CLUSTER=aks-digitalgarage-01 +NAMESPACE=kt-event-marketing +REPLICAS=3 +CPU_REQUEST=1024m +MEMORY_REQUEST=1024Mi +CPU_LIMIT=4096m +MEMORY_LIMIT=4096Mi diff --git a/.github/config/deploy_env_vars_staging b/.github/config/deploy_env_vars_staging new file mode 100644 index 0000000..4fc4c2b --- /dev/null +++ b/.github/config/deploy_env_vars_staging @@ -0,0 +1,11 @@ +# Staging Environment Variables +ENVIRONMENT=staging +ACR_NAME=acrdigitalgarage01 +RESOURCE_GROUP=rg-digitalgarage-01 +AKS_CLUSTER=aks-digitalgarage-01 +NAMESPACE=kt-event-marketing +REPLICAS=2 +CPU_REQUEST=512m +MEMORY_REQUEST=512Mi +CPU_LIMIT=2048m +MEMORY_LIMIT=2048Mi diff --git a/.github/kustomize/base/ai-service-cm-ai-service.yaml b/.github/kustomize/base/ai-service-cm-ai-service.yaml new file mode 100644 index 0000000..5ed101f --- /dev/null +++ b/.github/kustomize/base/ai-service-cm-ai-service.yaml @@ -0,0 +1,55 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: cm-ai-service +data: + # Server Configuration + SERVER_PORT: "8083" + + # Redis Configuration (service-specific) + REDIS_DATABASE: "3" + REDIS_TIMEOUT: "3000" + REDIS_POOL_MIN: "2" + + # Kafka Configuration (service-specific) + KAFKA_CONSUMER_GROUP: "ai-service-consumers" + + # Kafka Topics Configuration + KAFKA_TOPICS_AI_JOB: "ai-event-generation-job" + KAFKA_TOPICS_AI_JOB_DLQ: "ai-event-generation-job-dlq" + + # AI Provider Configuration + AI_PROVIDER: "CLAUDE" + AI_CLAUDE_API_URL: "https://api.anthropic.com/v1/messages" + AI_CLAUDE_ANTHROPIC_VERSION: "2023-06-01" + AI_CLAUDE_MODEL: "claude-sonnet-4-5-20250929" + AI_CLAUDE_MAX_TOKENS: "4096" + AI_CLAUDE_TEMPERATURE: "0.7" + AI_CLAUDE_TIMEOUT: "300000" + + # Circuit Breaker Configuration + RESILIENCE4J_CIRCUITBREAKER_FAILURE_RATE_THRESHOLD: "50" + RESILIENCE4J_CIRCUITBREAKER_SLOW_CALL_RATE_THRESHOLD: "50" + RESILIENCE4J_CIRCUITBREAKER_SLOW_CALL_DURATION_THRESHOLD: "60s" + RESILIENCE4J_CIRCUITBREAKER_PERMITTED_CALLS_HALF_OPEN: "3" + RESILIENCE4J_CIRCUITBREAKER_SLIDING_WINDOW_SIZE: "10" + RESILIENCE4J_CIRCUITBREAKER_MINIMUM_CALLS: "5" + RESILIENCE4J_CIRCUITBREAKER_WAIT_DURATION_OPEN: "60s" + RESILIENCE4J_TIMELIMITER_TIMEOUT_DURATION: "300s" + + # Redis Cache TTL Configuration (seconds) + CACHE_TTL_RECOMMENDATION: "86400" + CACHE_TTL_JOB_STATUS: "86400" + CACHE_TTL_TREND: "3600" + CACHE_TTL_FALLBACK: "604800" + + # Logging Configuration + LOG_LEVEL_ROOT: "INFO" + LOG_LEVEL_AI: "DEBUG" + LOG_LEVEL_KAFKA: "INFO" + LOG_LEVEL_REDIS: "INFO" + LOG_LEVEL_RESILIENCE4J: "DEBUG" + LOG_FILE_NAME: "logs/ai-service.log" + LOG_FILE_MAX_SIZE: "10MB" + LOG_FILE_MAX_HISTORY: "7" + LOG_FILE_TOTAL_CAP: "100MB" diff --git a/.github/kustomize/base/ai-service-deployment.yaml b/.github/kustomize/base/ai-service-deployment.yaml new file mode 100644 index 0000000..a5ad50d --- /dev/null +++ b/.github/kustomize/base/ai-service-deployment.yaml @@ -0,0 +1,62 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: ai-service + labels: + app: ai-service +spec: + replicas: 1 + selector: + matchLabels: + app: ai-service + template: + metadata: + labels: + app: ai-service + spec: + imagePullSecrets: + - name: kt-event-marketing + containers: + - name: ai-service + image: acrdigitalgarage01.azurecr.io/kt-event-marketing/ai-service:latest + imagePullPolicy: Always + ports: + - containerPort: 8083 + name: http + envFrom: + - configMapRef: + name: cm-common + - configMapRef: + name: cm-ai-service + - secretRef: + name: secret-common + - secretRef: + name: secret-ai-service + resources: + requests: + cpu: "256m" + memory: "256Mi" + limits: + cpu: "1024m" + memory: "1024Mi" + startupProbe: + httpGet: + path: /actuator/health + port: 8083 + initialDelaySeconds: 30 + periodSeconds: 10 + failureThreshold: 30 + readinessProbe: + httpGet: + path: /actuator/health/readiness + port: 8083 + initialDelaySeconds: 10 + periodSeconds: 5 + failureThreshold: 3 + livenessProbe: + httpGet: + path: /actuator/health/liveness + port: 8083 + initialDelaySeconds: 30 + periodSeconds: 10 + failureThreshold: 3 diff --git a/.github/kustomize/base/ai-service-secret-ai-service.yaml b/.github/kustomize/base/ai-service-secret-ai-service.yaml new file mode 100644 index 0000000..7ad14cb --- /dev/null +++ b/.github/kustomize/base/ai-service-secret-ai-service.yaml @@ -0,0 +1,8 @@ +apiVersion: v1 +kind: Secret +metadata: + name: secret-ai-service +type: Opaque +stringData: + # Claude API Key + AI_CLAUDE_API_KEY: "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" diff --git a/.github/kustomize/base/ai-service-service.yaml b/.github/kustomize/base/ai-service-service.yaml new file mode 100644 index 0000000..4aac354 --- /dev/null +++ b/.github/kustomize/base/ai-service-service.yaml @@ -0,0 +1,15 @@ +apiVersion: v1 +kind: Service +metadata: + name: ai-service + labels: + app: ai-service +spec: + type: ClusterIP + ports: + - port: 80 + targetPort: 8083 + protocol: TCP + name: http + selector: + app: ai-service diff --git a/.github/kustomize/base/analytics-service-cm-analytics-service.yaml b/.github/kustomize/base/analytics-service-cm-analytics-service.yaml new file mode 100644 index 0000000..a306909 --- /dev/null +++ b/.github/kustomize/base/analytics-service-cm-analytics-service.yaml @@ -0,0 +1,37 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: cm-analytics-service +data: + # Server Configuration + SERVER_PORT: "8086" + + # Database Configuration + DB_HOST: "analytic-postgresql" + DB_PORT: "5432" + DB_NAME: "analytics_db" + DB_USERNAME: "eventuser" + + # Redis Configuration (service-specific) + REDIS_DATABASE: "5" + + # Kafka Configuration (service-specific) + KAFKA_ENABLED: "true" + KAFKA_CONSUMER_GROUP_ID: "analytics-service" + + # Sample Data Configuration (MVP only) + SAMPLE_DATA_ENABLED: "true" + + # Batch Scheduler Configuration + BATCH_REFRESH_INTERVAL: "300000" # 5분 (밀리초) + BATCH_INITIAL_DELAY: "30000" # 30초 (밀리초) + BATCH_ENABLED: "true" + + # Logging Configuration + LOG_LEVEL_APP: "INFO" + LOG_LEVEL_WEB: "INFO" + LOG_LEVEL_SQL: "WARN" + LOG_LEVEL_SQL_TYPE: "WARN" + SHOW_SQL: "false" + DDL_AUTO: "update" + LOG_FILE: "logs/analytics-service.log" diff --git a/.github/kustomize/base/analytics-service-deployment.yaml b/.github/kustomize/base/analytics-service-deployment.yaml new file mode 100644 index 0000000..92a37a3 --- /dev/null +++ b/.github/kustomize/base/analytics-service-deployment.yaml @@ -0,0 +1,62 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: analytics-service + labels: + app: analytics-service +spec: + replicas: 1 + selector: + matchLabels: + app: analytics-service + template: + metadata: + labels: + app: analytics-service + spec: + imagePullSecrets: + - name: kt-event-marketing + containers: + - name: analytics-service + image: acrdigitalgarage01.azurecr.io/kt-event-marketing/analytics-service:latest + imagePullPolicy: Always + ports: + - containerPort: 8086 + name: http + envFrom: + - configMapRef: + name: cm-common + - configMapRef: + name: cm-analytics-service + - secretRef: + name: secret-common + - secretRef: + name: secret-analytics-service + resources: + requests: + cpu: "256m" + memory: "256Mi" + limits: + cpu: "1024m" + memory: "1024Mi" + startupProbe: + httpGet: + path: /actuator/health/liveness + port: 8086 + initialDelaySeconds: 60 + periodSeconds: 10 + failureThreshold: 30 + livenessProbe: + httpGet: + path: /actuator/health/liveness + port: 8086 + initialDelaySeconds: 0 + periodSeconds: 10 + failureThreshold: 3 + readinessProbe: + httpGet: + path: /actuator/health/readiness + port: 8086 + initialDelaySeconds: 0 + periodSeconds: 10 + failureThreshold: 3 diff --git a/.github/kustomize/base/analytics-service-secret-analytics-service.yaml b/.github/kustomize/base/analytics-service-secret-analytics-service.yaml new file mode 100644 index 0000000..80ae2fc --- /dev/null +++ b/.github/kustomize/base/analytics-service-secret-analytics-service.yaml @@ -0,0 +1,7 @@ +apiVersion: v1 +kind: Secret +metadata: + name: secret-analytics-service +type: Opaque +stringData: + DB_PASSWORD: "Hi5Jessica!" diff --git a/.github/kustomize/base/analytics-service-service.yaml b/.github/kustomize/base/analytics-service-service.yaml new file mode 100644 index 0000000..029f9e0 --- /dev/null +++ b/.github/kustomize/base/analytics-service-service.yaml @@ -0,0 +1,15 @@ +apiVersion: v1 +kind: Service +metadata: + name: analytics-service + labels: + app: analytics-service +spec: + type: ClusterIP + ports: + - port: 80 + targetPort: 8086 + protocol: TCP + name: http + selector: + app: analytics-service diff --git a/.github/kustomize/base/cm-common.yaml b/.github/kustomize/base/cm-common.yaml new file mode 100644 index 0000000..da25d52 --- /dev/null +++ b/.github/kustomize/base/cm-common.yaml @@ -0,0 +1,46 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: cm-common +data: + # Redis Configuration + REDIS_ENABLED: "true" + REDIS_HOST: "redis" + REDIS_PORT: "6379" + REDIS_TIMEOUT: "2000ms" + REDIS_POOL_MAX: "8" + REDIS_POOL_IDLE: "8" + REDIS_POOL_MIN: "0" + REDIS_POOL_WAIT: "-1ms" + + # Kafka Configuration + KAFKA_BOOTSTRAP_SERVERS: "20.249.182.13:9095,4.217.131.59:9095" + EXCLUDE_KAFKA: "" + EXCLUDE_REDIS: "" + + # CORS Configuration + CORS_ALLOWED_ORIGINS: "http://localhost:8081,http://localhost:8082,http://localhost:8083,http://localhost:8084,http://kt-event-marketing.20.214.196.128.nip.io" + CORS_ALLOWED_METHODS: "GET,POST,PUT,DELETE,OPTIONS,PATCH" + CORS_ALLOWED_HEADERS: "*" + CORS_ALLOW_CREDENTIALS: "true" + CORS_MAX_AGE: "3600" + + # JWT Configuration + JWT_ACCESS_TOKEN_VALIDITY: "604800000" + JWT_REFRESH_TOKEN_VALIDITY: "86400000" + + # JPA Configuration + DDL_AUTO: "update" + SHOW_SQL: "false" + JPA_DIALECT: "org.hibernate.dialect.PostgreSQLDialect" + H2_CONSOLE_ENABLED: "false" + + # Logging Configuration + LOG_LEVEL_APP: "INFO" + LOG_LEVEL_WEB: "INFO" + LOG_LEVEL_SQL: "WARN" + LOG_LEVEL_SQL_TYPE: "WARN" + LOG_LEVEL_ROOT: "INFO" + LOG_FILE_MAX_SIZE: "10MB" + LOG_FILE_MAX_HISTORY: "7" + LOG_FILE_TOTAL_CAP: "100MB" diff --git a/.github/kustomize/base/content-service-cm-content-service.yaml b/.github/kustomize/base/content-service-cm-content-service.yaml new file mode 100644 index 0000000..2190f0f --- /dev/null +++ b/.github/kustomize/base/content-service-cm-content-service.yaml @@ -0,0 +1,24 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: cm-content-service +data: + # Server Configuration + SERVER_PORT: "8084" + + # Redis Configuration (service-specific) + REDIS_DATABASE: "1" + + # Replicate API Configuration (Stable Diffusion) + REPLICATE_API_URL: "https://api.replicate.com" + REPLICATE_MODEL_VERSION: "stability-ai/sdxl:39ed52f2a78e934b3ba6e2a89f5b1c712de7dfea535525255b1aa35c5565e08b" + + # HuggingFace API Configuration + HUGGINGFACE_API_URL: "https://api-inference.huggingface.co" + HUGGINGFACE_MODEL: "runwayml/stable-diffusion-v1-5" + + # Azure Blob Storage Configuration + AZURE_CONTAINER_NAME: "content-images" + + # Logging Configuration + LOG_FILE_PATH: "logs/content-service.log" diff --git a/.github/kustomize/base/content-service-deployment.yaml b/.github/kustomize/base/content-service-deployment.yaml new file mode 100644 index 0000000..919578f --- /dev/null +++ b/.github/kustomize/base/content-service-deployment.yaml @@ -0,0 +1,62 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: content-service + labels: + app: content-service +spec: + replicas: 1 + selector: + matchLabels: + app: content-service + template: + metadata: + labels: + app: content-service + spec: + imagePullSecrets: + - name: kt-event-marketing + containers: + - name: content-service + image: acrdigitalgarage01.azurecr.io/kt-event-marketing/content-service:latest + imagePullPolicy: Always + ports: + - containerPort: 8084 + name: http + envFrom: + - configMapRef: + name: cm-common + - configMapRef: + name: cm-content-service + - secretRef: + name: secret-common + - secretRef: + name: secret-content-service + resources: + requests: + cpu: "256m" + memory: "256Mi" + limits: + cpu: "1024m" + memory: "1024Mi" + startupProbe: + httpGet: + path: /api/v1/content/actuator/health + port: 8084 + initialDelaySeconds: 30 + periodSeconds: 10 + failureThreshold: 30 + readinessProbe: + httpGet: + path: /api/v1/content/actuator/health/readiness + port: 8084 + initialDelaySeconds: 10 + periodSeconds: 5 + failureThreshold: 3 + livenessProbe: + httpGet: + path: /api/v1/content/actuator/health/liveness + port: 8084 + initialDelaySeconds: 30 + periodSeconds: 10 + failureThreshold: 3 diff --git a/.github/kustomize/base/content-service-secret-content-service.yaml b/.github/kustomize/base/content-service-secret-content-service.yaml new file mode 100644 index 0000000..47ddc32 --- /dev/null +++ b/.github/kustomize/base/content-service-secret-content-service.yaml @@ -0,0 +1,14 @@ +apiVersion: v1 +kind: Secret +metadata: + name: secret-content-service +type: Opaque +stringData: + # Azure Blob Storage Connection String + AZURE_STORAGE_CONNECTION_STRING: "DefaultEndpointsProtocol=https;AccountName=blobkteventstorage;AccountKey=tcBN7mAfojbl0uGsOpU7RNuKNhHnzmwDiWjN31liSMVSrWaEK+HHnYKZrjBXXAC6ZPsuxUDlsf8x+AStd++QYg==;EndpointSuffix=core.windows.net" + + # Replicate API Token + REPLICATE_API_TOKEN: "r8_BsGCJtAg5U5kkMBXSe3pgMkPufSKnUR4NY9gJ" + + # HuggingFace API Token + HUGGINGFACE_API_TOKEN: "" diff --git a/.github/kustomize/base/content-service-service.yaml b/.github/kustomize/base/content-service-service.yaml new file mode 100644 index 0000000..d63854b --- /dev/null +++ b/.github/kustomize/base/content-service-service.yaml @@ -0,0 +1,15 @@ +apiVersion: v1 +kind: Service +metadata: + name: content-service + labels: + app: content-service +spec: + type: ClusterIP + ports: + - port: 80 + targetPort: 8084 + protocol: TCP + name: http + selector: + app: content-service diff --git a/.github/kustomize/base/distribution-service-cm-distribution-service.yaml b/.github/kustomize/base/distribution-service-cm-distribution-service.yaml new file mode 100644 index 0000000..87c5f9e --- /dev/null +++ b/.github/kustomize/base/distribution-service-cm-distribution-service.yaml @@ -0,0 +1,28 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: cm-distribution-service +data: + # Server Configuration + SERVER_PORT: "8085" + + # Database Configuration + DB_HOST: "distribution-postgresql" + DB_PORT: "5432" + DB_NAME: "distributiondb" + DB_USERNAME: "eventuser" + + # Kafka Configuration + KAFKA_ENABLED: "true" + KAFKA_CONSUMER_GROUP: "distribution-service" + + # External Channel APIs + URIDONGNETV_API_URL: "http://localhost:9001/api/uridongnetv" + RINGOBIZ_API_URL: "http://localhost:9002/api/ringobiz" + GINITV_API_URL: "http://localhost:9003/api/ginitv" + INSTAGRAM_API_URL: "http://localhost:9004/api/instagram" + NAVER_API_URL: "http://localhost:9005/api/naver" + KAKAO_API_URL: "http://localhost:9006/api/kakao" + + # Logging Configuration + LOG_FILE: "logs/distribution-service.log" diff --git a/.github/kustomize/base/distribution-service-deployment.yaml b/.github/kustomize/base/distribution-service-deployment.yaml new file mode 100644 index 0000000..feb2698 --- /dev/null +++ b/.github/kustomize/base/distribution-service-deployment.yaml @@ -0,0 +1,62 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: distribution-service + labels: + app: distribution-service +spec: + replicas: 1 + selector: + matchLabels: + app: distribution-service + template: + metadata: + labels: + app: distribution-service + spec: + imagePullSecrets: + - name: kt-event-marketing + containers: + - name: distribution-service + image: acrdigitalgarage01.azurecr.io/kt-event-marketing/distribution-service:latest + imagePullPolicy: Always + ports: + - containerPort: 8085 + name: http + envFrom: + - configMapRef: + name: cm-common + - configMapRef: + name: cm-distribution-service + - secretRef: + name: secret-common + - secretRef: + name: secret-distribution-service + resources: + requests: + cpu: "256m" + memory: "256Mi" + limits: + cpu: "1024m" + memory: "1024Mi" + startupProbe: + httpGet: + path: /api/v1/distribution/actuator/health + port: 8085 + initialDelaySeconds: 30 + periodSeconds: 10 + failureThreshold: 30 + readinessProbe: + httpGet: + path: /api/v1/distribution/actuator/health/readiness + port: 8085 + initialDelaySeconds: 10 + periodSeconds: 5 + failureThreshold: 3 + livenessProbe: + httpGet: + path: /api/v1/distribution/actuator/health/liveness + port: 8085 + initialDelaySeconds: 30 + periodSeconds: 10 + failureThreshold: 3 diff --git a/.github/kustomize/base/distribution-service-secret-distribution-service.yaml b/.github/kustomize/base/distribution-service-secret-distribution-service.yaml new file mode 100644 index 0000000..602fc6b --- /dev/null +++ b/.github/kustomize/base/distribution-service-secret-distribution-service.yaml @@ -0,0 +1,7 @@ +apiVersion: v1 +kind: Secret +metadata: + name: secret-distribution-service +type: Opaque +stringData: + DB_PASSWORD: "Hi5Jessica!" diff --git a/.github/kustomize/base/distribution-service-service.yaml b/.github/kustomize/base/distribution-service-service.yaml new file mode 100644 index 0000000..b995ca9 --- /dev/null +++ b/.github/kustomize/base/distribution-service-service.yaml @@ -0,0 +1,15 @@ +apiVersion: v1 +kind: Service +metadata: + name: distribution-service + labels: + app: distribution-service +spec: + type: ClusterIP + selector: + app: distribution-service + ports: + - name: http + port: 80 + targetPort: 8085 + protocol: TCP diff --git a/.github/kustomize/base/event-service-cm-event-service.yaml b/.github/kustomize/base/event-service-cm-event-service.yaml new file mode 100644 index 0000000..86c14ad --- /dev/null +++ b/.github/kustomize/base/event-service-cm-event-service.yaml @@ -0,0 +1,28 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: cm-event-service +data: + # Server Configuration + SERVER_PORT: "8080" + + # Database Configuration + DB_HOST: "event-postgresql" + DB_PORT: "5432" + DB_NAME: "eventdb" + DB_USERNAME: "eventuser" + + # Redis Configuration (service-specific) + REDIS_DATABASE: "2" + + # Kafka Configuration (service-specific) + KAFKA_CONSUMER_GROUP: "event-service-consumers" + + # Service URLs + CONTENT_SERVICE_URL: "http://content-service" + DISTRIBUTION_SERVICE_URL: "http://distribution-service" + + # Logging Configuration + LOG_LEVEL: "INFO" + SQL_LOG_LEVEL: "WARN" + LOG_FILE: "logs/event-service.log" diff --git a/.github/kustomize/base/event-service-deployment.yaml b/.github/kustomize/base/event-service-deployment.yaml new file mode 100644 index 0000000..992f705 --- /dev/null +++ b/.github/kustomize/base/event-service-deployment.yaml @@ -0,0 +1,62 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: event-service + labels: + app: event-service +spec: + replicas: 1 + selector: + matchLabels: + app: event-service + template: + metadata: + labels: + app: event-service + spec: + imagePullSecrets: + - name: kt-event-marketing + containers: + - name: event-service + image: acrdigitalgarage01.azurecr.io/kt-event-marketing/event-service:latest + imagePullPolicy: Always + ports: + - containerPort: 8080 + name: http + envFrom: + - configMapRef: + name: cm-common + - configMapRef: + name: cm-event-service + - secretRef: + name: secret-common + - secretRef: + name: secret-event-service + resources: + requests: + cpu: "256m" + memory: "256Mi" + limits: + cpu: "1024m" + memory: "1024Mi" + startupProbe: + httpGet: + path: /actuator/health + port: 8080 + initialDelaySeconds: 30 + periodSeconds: 10 + failureThreshold: 30 + readinessProbe: + httpGet: + path: /actuator/health/readiness + port: 8080 + initialDelaySeconds: 10 + periodSeconds: 5 + failureThreshold: 3 + livenessProbe: + httpGet: + path: /actuator/health/liveness + port: 8080 + initialDelaySeconds: 30 + periodSeconds: 10 + failureThreshold: 3 diff --git a/.github/kustomize/base/event-service-secret-event-service.yaml b/.github/kustomize/base/event-service-secret-event-service.yaml new file mode 100644 index 0000000..3f7dfa2 --- /dev/null +++ b/.github/kustomize/base/event-service-secret-event-service.yaml @@ -0,0 +1,8 @@ +apiVersion: v1 +kind: Secret +metadata: + name: secret-event-service +type: Opaque +stringData: + # Database Password + DB_PASSWORD: "Hi5Jessica!" diff --git a/.github/kustomize/base/event-service-service.yaml b/.github/kustomize/base/event-service-service.yaml new file mode 100644 index 0000000..302f2b5 --- /dev/null +++ b/.github/kustomize/base/event-service-service.yaml @@ -0,0 +1,15 @@ +apiVersion: v1 +kind: Service +metadata: + name: event-service + labels: + app: event-service +spec: + type: ClusterIP + ports: + - port: 80 + targetPort: 8080 + protocol: TCP + name: http + selector: + app: event-service diff --git a/.github/kustomize/base/ingress.yaml b/.github/kustomize/base/ingress.yaml new file mode 100644 index 0000000..4ad2008 --- /dev/null +++ b/.github/kustomize/base/ingress.yaml @@ -0,0 +1,116 @@ +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: kt-event-marketing + annotations: + nginx.ingress.kubernetes.io/ssl-redirect: "false" + nginx.ingress.kubernetes.io/use-regex: "true" +spec: + ingressClassName: nginx + rules: + - host: kt-event-marketing-api.20.214.196.128.nip.io + http: + paths: + # User Service + - path: /api/v1/users + pathType: Prefix + backend: + service: + name: user-service + port: + number: 80 + + # Content Service + - path: /api/v1/content + pathType: Prefix + backend: + service: + name: content-service + port: + number: 80 + + # Event Service + - path: /api/v1/events + pathType: Prefix + backend: + service: + name: event-service + port: + number: 80 + + - path: /api/v1/jobs + pathType: Prefix + backend: + service: + name: event-service + port: + number: 80 + + - path: /api/v1/redis-test + pathType: Prefix + backend: + service: + name: event-service + port: + number: 80 + + # AI Service + - path: /api/v1/ai-service + pathType: Prefix + backend: + service: + name: ai-service + port: + number: 80 + + # Participation Service + - path: /api/v1/participations + pathType: Prefix + backend: + service: + name: participation-service + port: + number: 80 + + - path: /api/v1/winners + pathType: Prefix + backend: + service: + name: participation-service + port: + number: 80 + + - path: /debug + pathType: Prefix + backend: + service: + name: participation-service + port: + number: 80 + + # Analytics Service - Event Analytics + - path: /api/v1/events/([0-9]+)/analytics + pathType: ImplementationSpecific + backend: + service: + name: analytics-service + port: + number: 80 + + # Analytics Service - User Analytics + - path: /api/v1/users/([0-9]+)/analytics + pathType: ImplementationSpecific + backend: + service: + name: analytics-service + port: + number: 80 + + # Distribution Service + - path: /distribution + pathType: Prefix + backend: + service: + name: distribution-service + port: + number: 80 diff --git a/.github/kustomize/base/kustomization.yaml b/.github/kustomize/base/kustomization.yaml new file mode 100644 index 0000000..a57fa23 --- /dev/null +++ b/.github/kustomize/base/kustomization.yaml @@ -0,0 +1,71 @@ +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization + +# Common resources +resources: + # Common ConfigMaps and Secrets + - cm-common.yaml + - secret-common.yaml + - secret-imagepull.yaml + + # Ingress + - ingress.yaml + + # user-service + - user-service-deployment.yaml + - user-service-service.yaml + - user-service-cm-user-service.yaml + - user-service-secret-user-service.yaml + + # event-service + - event-service-deployment.yaml + - event-service-service.yaml + - event-service-cm-event-service.yaml + - event-service-secret-event-service.yaml + + # ai-service + - ai-service-deployment.yaml + - ai-service-service.yaml + - ai-service-cm-ai-service.yaml + - ai-service-secret-ai-service.yaml + + # content-service + - content-service-deployment.yaml + - content-service-service.yaml + - content-service-cm-content-service.yaml + - content-service-secret-content-service.yaml + + # distribution-service + - distribution-service-deployment.yaml + - distribution-service-service.yaml + - distribution-service-cm-distribution-service.yaml + - distribution-service-secret-distribution-service.yaml + + # participation-service + - participation-service-deployment.yaml + - participation-service-service.yaml + - participation-service-cm-participation-service.yaml + - participation-service-secret-participation-service.yaml + + # analytics-service + - analytics-service-deployment.yaml + - analytics-service-service.yaml + - analytics-service-cm-analytics-service.yaml + - analytics-service-secret-analytics-service.yaml + +# Image tag replacement (will be overridden by overlays) +images: + - name: acrdigitalgarage01.azurecr.io/kt-event-marketing/user-service + newTag: latest + - name: acrdigitalgarage01.azurecr.io/kt-event-marketing/event-service + newTag: latest + - name: acrdigitalgarage01.azurecr.io/kt-event-marketing/ai-service + newTag: latest + - name: acrdigitalgarage01.azurecr.io/kt-event-marketing/content-service + newTag: latest + - name: acrdigitalgarage01.azurecr.io/kt-event-marketing/distribution-service + newTag: latest + - name: acrdigitalgarage01.azurecr.io/kt-event-marketing/participation-service + newTag: latest + - name: acrdigitalgarage01.azurecr.io/kt-event-marketing/analytics-service + newTag: latest diff --git a/.github/kustomize/base/participation-service-cm-participation-service.yaml b/.github/kustomize/base/participation-service-cm-participation-service.yaml new file mode 100644 index 0000000..124dd5c --- /dev/null +++ b/.github/kustomize/base/participation-service-cm-participation-service.yaml @@ -0,0 +1,24 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: cm-participation-service +data: + # Server Configuration + SERVER_PORT: "8084" + + # Database Configuration + DB_HOST: "participation-postgresql" + DB_PORT: "5432" + DB_NAME: "participationdb" + DB_USERNAME: "eventuser" + + # Redis Configuration (service-specific) + REDIS_DATABASE: "4" + + # Kafka Configuration (service-specific) + KAFKA_CONSUMER_GROUP: "participation-service-consumers" + + # Logging Configuration + LOG_LEVEL: "INFO" + SHOW_SQL: "false" + LOG_FILE: "logs/participation-service.log" diff --git a/.github/kustomize/base/participation-service-deployment.yaml b/.github/kustomize/base/participation-service-deployment.yaml new file mode 100644 index 0000000..3b9895b --- /dev/null +++ b/.github/kustomize/base/participation-service-deployment.yaml @@ -0,0 +1,62 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: participation-service + labels: + app: participation-service +spec: + replicas: 1 + selector: + matchLabels: + app: participation-service + template: + metadata: + labels: + app: participation-service + spec: + imagePullSecrets: + - name: kt-event-marketing + containers: + - name: participation-service + image: acrdigitalgarage01.azurecr.io/kt-event-marketing/participation-service:latest + imagePullPolicy: Always + ports: + - containerPort: 8084 + name: http + envFrom: + - configMapRef: + name: cm-common + - configMapRef: + name: cm-participation-service + - secretRef: + name: secret-common + - secretRef: + name: secret-participation-service + resources: + requests: + cpu: "256m" + memory: "256Mi" + limits: + cpu: "1024m" + memory: "1024Mi" + startupProbe: + httpGet: + path: /actuator/health/liveness + port: 8084 + initialDelaySeconds: 60 + periodSeconds: 10 + failureThreshold: 30 + livenessProbe: + httpGet: + path: /actuator/health/liveness + port: 8084 + initialDelaySeconds: 0 + periodSeconds: 10 + failureThreshold: 3 + readinessProbe: + httpGet: + path: /actuator/health/readiness + port: 8084 + initialDelaySeconds: 0 + periodSeconds: 10 + failureThreshold: 3 diff --git a/.github/kustomize/base/participation-service-secret-participation-service.yaml b/.github/kustomize/base/participation-service-secret-participation-service.yaml new file mode 100644 index 0000000..6b73f2e --- /dev/null +++ b/.github/kustomize/base/participation-service-secret-participation-service.yaml @@ -0,0 +1,7 @@ +apiVersion: v1 +kind: Secret +metadata: + name: secret-participation-service +type: Opaque +stringData: + DB_PASSWORD: "Hi5Jessica!" diff --git a/.github/kustomize/base/participation-service-service.yaml b/.github/kustomize/base/participation-service-service.yaml new file mode 100644 index 0000000..243456b --- /dev/null +++ b/.github/kustomize/base/participation-service-service.yaml @@ -0,0 +1,15 @@ +apiVersion: v1 +kind: Service +metadata: + name: participation-service + labels: + app: participation-service +spec: + type: ClusterIP + ports: + - port: 80 + targetPort: 8084 + protocol: TCP + name: http + selector: + app: participation-service diff --git a/.github/kustomize/base/secret-common.yaml b/.github/kustomize/base/secret-common.yaml new file mode 100644 index 0000000..bbf5715 --- /dev/null +++ b/.github/kustomize/base/secret-common.yaml @@ -0,0 +1,11 @@ +apiVersion: v1 +kind: Secret +metadata: + name: secret-common +type: Opaque +stringData: + # Redis Password + REDIS_PASSWORD: "Hi5Jessica!" + + # JWT Secret + JWT_SECRET: "QL0czzXckz18kHnxpaTDoWFkq+3qKO7VQXeNvf2bOoU=" diff --git a/.github/kustomize/base/secret-imagepull.yaml b/.github/kustomize/base/secret-imagepull.yaml new file mode 100644 index 0000000..f445009 --- /dev/null +++ b/.github/kustomize/base/secret-imagepull.yaml @@ -0,0 +1,16 @@ +apiVersion: v1 +kind: Secret +metadata: + name: kt-event-marketing +type: kubernetes.io/dockerconfigjson +stringData: + .dockerconfigjson: | + { + "auths": { + "acrdigitalgarage01.azurecr.io": { + "username": "acrdigitalgarage01", + "password": "+OY+rmOagorjWvQe/tTk6oqvnZI8SmNbY/Y2o5EDcY+ACRDCDbYk", + "auth": "YWNyZGlnaXRhbGdhcmFnZTAxOitPWStybU9hZ29yald2UWUvdFRrNm9xdm5aSThTbU5iWS9ZMm81RURjWStBQ1JEQ0RiWWs=" + } + } + } diff --git a/.github/kustomize/base/user-service-cm-user-service.yaml b/.github/kustomize/base/user-service-cm-user-service.yaml new file mode 100644 index 0000000..6b98cb9 --- /dev/null +++ b/.github/kustomize/base/user-service-cm-user-service.yaml @@ -0,0 +1,31 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: cm-user-service +data: + # Server Configuration + SERVER_PORT: "8081" + + # Database Configuration + DB_URL: "jdbc:postgresql://user-postgresql:5432/userdb" + DB_HOST: "user-postgresql" + DB_PORT: "5432" + DB_NAME: "userdb" + DB_USERNAME: "eventuser" + DB_DRIVER: "org.postgresql.Driver" + DB_KIND: "postgresql" + DB_POOL_MAX: "20" + DB_POOL_MIN: "5" + DB_CONN_TIMEOUT: "30000" + DB_IDLE_TIMEOUT: "600000" + DB_MAX_LIFETIME: "1800000" + DB_LEAK_THRESHOLD: "60000" + + # Redis Configuration (service-specific) + REDIS_DATABASE: "0" + + # Kafka Configuration (service-specific) + KAFKA_CONSUMER_GROUP: "user-service-consumers" + + # Logging Configuration + LOG_FILE_PATH: "logs/user-service.log" diff --git a/.github/kustomize/base/user-service-deployment.yaml b/.github/kustomize/base/user-service-deployment.yaml new file mode 100644 index 0000000..4ea16a9 --- /dev/null +++ b/.github/kustomize/base/user-service-deployment.yaml @@ -0,0 +1,62 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: user-service + labels: + app: user-service +spec: + replicas: 1 + selector: + matchLabels: + app: user-service + template: + metadata: + labels: + app: user-service + spec: + imagePullSecrets: + - name: kt-event-marketing + containers: + - name: user-service + image: acrdigitalgarage01.azurecr.io/kt-event-marketing/user-service:latest + imagePullPolicy: Always + ports: + - containerPort: 8081 + name: http + envFrom: + - configMapRef: + name: cm-common + - configMapRef: + name: cm-user-service + - secretRef: + name: secret-common + - secretRef: + name: secret-user-service + resources: + requests: + cpu: "256m" + memory: "256Mi" + limits: + cpu: "1024m" + memory: "1024Mi" + startupProbe: + httpGet: + path: /actuator/health + port: 8081 + initialDelaySeconds: 30 + periodSeconds: 10 + failureThreshold: 30 + readinessProbe: + httpGet: + path: /actuator/health/readiness + port: 8081 + initialDelaySeconds: 10 + periodSeconds: 5 + failureThreshold: 3 + livenessProbe: + httpGet: + path: /actuator/health/liveness + port: 8081 + initialDelaySeconds: 30 + periodSeconds: 10 + failureThreshold: 3 diff --git a/.github/kustomize/base/user-service-secret-user-service.yaml b/.github/kustomize/base/user-service-secret-user-service.yaml new file mode 100644 index 0000000..89da804 --- /dev/null +++ b/.github/kustomize/base/user-service-secret-user-service.yaml @@ -0,0 +1,8 @@ +apiVersion: v1 +kind: Secret +metadata: + name: secret-user-service +type: Opaque +stringData: + # Database Password + DB_PASSWORD: "Hi5Jessica!" diff --git a/.github/kustomize/base/user-service-service.yaml b/.github/kustomize/base/user-service-service.yaml new file mode 100644 index 0000000..2585c2d --- /dev/null +++ b/.github/kustomize/base/user-service-service.yaml @@ -0,0 +1,15 @@ +apiVersion: v1 +kind: Service +metadata: + name: user-service + labels: + app: user-service +spec: + type: ClusterIP + ports: + - port: 80 + targetPort: 8081 + protocol: TCP + name: http + selector: + app: user-service diff --git a/.github/kustomize/overlays/dev/ai-service-patch.yaml b/.github/kustomize/overlays/dev/ai-service-patch.yaml new file mode 100644 index 0000000..bb6d107 --- /dev/null +++ b/.github/kustomize/overlays/dev/ai-service-patch.yaml @@ -0,0 +1,17 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: ai-service +spec: + replicas: 1 + template: + spec: + containers: + - name: ai-service + resources: + requests: + cpu: "256m" + memory: "256Mi" + limits: + cpu: "1024m" + memory: "1024Mi" diff --git a/.github/kustomize/overlays/dev/analytics-service-patch.yaml b/.github/kustomize/overlays/dev/analytics-service-patch.yaml new file mode 100644 index 0000000..5983774 --- /dev/null +++ b/.github/kustomize/overlays/dev/analytics-service-patch.yaml @@ -0,0 +1,17 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: analytics-service +spec: + replicas: 1 + template: + spec: + containers: + - name: analytics-service + resources: + requests: + cpu: "256m" + memory: "256Mi" + limits: + cpu: "1024m" + memory: "1024Mi" diff --git a/.github/kustomize/overlays/dev/content-service-patch.yaml b/.github/kustomize/overlays/dev/content-service-patch.yaml new file mode 100644 index 0000000..bbf37e7 --- /dev/null +++ b/.github/kustomize/overlays/dev/content-service-patch.yaml @@ -0,0 +1,17 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: content-service +spec: + replicas: 1 + template: + spec: + containers: + - name: content-service + resources: + requests: + cpu: "256m" + memory: "256Mi" + limits: + cpu: "1024m" + memory: "1024Mi" diff --git a/.github/kustomize/overlays/dev/distribution-service-patch.yaml b/.github/kustomize/overlays/dev/distribution-service-patch.yaml new file mode 100644 index 0000000..e3f7445 --- /dev/null +++ b/.github/kustomize/overlays/dev/distribution-service-patch.yaml @@ -0,0 +1,17 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: distribution-service +spec: + replicas: 1 + template: + spec: + containers: + - name: distribution-service + resources: + requests: + cpu: "256m" + memory: "256Mi" + limits: + cpu: "1024m" + memory: "1024Mi" diff --git a/.github/kustomize/overlays/dev/event-service-patch.yaml b/.github/kustomize/overlays/dev/event-service-patch.yaml new file mode 100644 index 0000000..f60203b --- /dev/null +++ b/.github/kustomize/overlays/dev/event-service-patch.yaml @@ -0,0 +1,17 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: event-service +spec: + replicas: 1 + template: + spec: + containers: + - name: event-service + resources: + requests: + cpu: "256m" + memory: "256Mi" + limits: + cpu: "1024m" + memory: "1024Mi" diff --git a/.github/kustomize/overlays/dev/kustomization.yaml b/.github/kustomize/overlays/dev/kustomization.yaml new file mode 100644 index 0000000..a3a1579 --- /dev/null +++ b/.github/kustomize/overlays/dev/kustomization.yaml @@ -0,0 +1,34 @@ +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization + +namespace: kt-event-marketing + +bases: + - ../../base + +# Environment-specific patches +patchesStrategicMerge: + - user-service-patch.yaml + - event-service-patch.yaml + - ai-service-patch.yaml + - content-service-patch.yaml + - distribution-service-patch.yaml + - participation-service-patch.yaml + - analytics-service-patch.yaml + +# Override image tags for dev environment +images: + - name: acrdigitalgarage01.azurecr.io/kt-event-marketing/user-service + newTag: dev + - name: acrdigitalgarage01.azurecr.io/kt-event-marketing/event-service + newTag: dev + - name: acrdigitalgarage01.azurecr.io/kt-event-marketing/ai-service + newTag: dev + - name: acrdigitalgarage01.azurecr.io/kt-event-marketing/content-service + newTag: dev + - name: acrdigitalgarage01.azurecr.io/kt-event-marketing/distribution-service + newTag: dev + - name: acrdigitalgarage01.azurecr.io/kt-event-marketing/participation-service + newTag: dev + - name: acrdigitalgarage01.azurecr.io/kt-event-marketing/analytics-service + newTag: dev diff --git a/.github/kustomize/overlays/dev/participation-service-patch.yaml b/.github/kustomize/overlays/dev/participation-service-patch.yaml new file mode 100644 index 0000000..8cbf67d --- /dev/null +++ b/.github/kustomize/overlays/dev/participation-service-patch.yaml @@ -0,0 +1,17 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: participation-service +spec: + replicas: 1 + template: + spec: + containers: + - name: participation-service + resources: + requests: + cpu: "256m" + memory: "256Mi" + limits: + cpu: "1024m" + memory: "1024Mi" diff --git a/.github/kustomize/overlays/dev/user-service-patch.yaml b/.github/kustomize/overlays/dev/user-service-patch.yaml new file mode 100644 index 0000000..8b8aa3a --- /dev/null +++ b/.github/kustomize/overlays/dev/user-service-patch.yaml @@ -0,0 +1,17 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: user-service +spec: + replicas: 1 + template: + spec: + containers: + - name: user-service + resources: + requests: + cpu: "256m" + memory: "256Mi" + limits: + cpu: "1024m" + memory: "1024Mi" diff --git a/.github/kustomize/overlays/prod/ai-service-patch.yaml b/.github/kustomize/overlays/prod/ai-service-patch.yaml new file mode 100644 index 0000000..7d73fdc --- /dev/null +++ b/.github/kustomize/overlays/prod/ai-service-patch.yaml @@ -0,0 +1,17 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: ai-service +spec: + replicas: 3 + template: + spec: + containers: + - name: ai-service + resources: + requests: + cpu: "1024m" + memory: "1024Mi" + limits: + cpu: "4096m" + memory: "4096Mi" diff --git a/.github/kustomize/overlays/prod/analytics-service-patch.yaml b/.github/kustomize/overlays/prod/analytics-service-patch.yaml new file mode 100644 index 0000000..aff5cad --- /dev/null +++ b/.github/kustomize/overlays/prod/analytics-service-patch.yaml @@ -0,0 +1,17 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: analytics-service +spec: + replicas: 3 + template: + spec: + containers: + - name: analytics-service + resources: + requests: + cpu: "1024m" + memory: "1024Mi" + limits: + cpu: "4096m" + memory: "4096Mi" diff --git a/.github/kustomize/overlays/prod/content-service-patch.yaml b/.github/kustomize/overlays/prod/content-service-patch.yaml new file mode 100644 index 0000000..91705e8 --- /dev/null +++ b/.github/kustomize/overlays/prod/content-service-patch.yaml @@ -0,0 +1,17 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: content-service +spec: + replicas: 3 + template: + spec: + containers: + - name: content-service + resources: + requests: + cpu: "1024m" + memory: "1024Mi" + limits: + cpu: "4096m" + memory: "4096Mi" diff --git a/.github/kustomize/overlays/prod/distribution-service-patch.yaml b/.github/kustomize/overlays/prod/distribution-service-patch.yaml new file mode 100644 index 0000000..a3a05c2 --- /dev/null +++ b/.github/kustomize/overlays/prod/distribution-service-patch.yaml @@ -0,0 +1,17 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: distribution-service +spec: + replicas: 3 + template: + spec: + containers: + - name: distribution-service + resources: + requests: + cpu: "1024m" + memory: "1024Mi" + limits: + cpu: "4096m" + memory: "4096Mi" diff --git a/.github/kustomize/overlays/prod/event-service-patch.yaml b/.github/kustomize/overlays/prod/event-service-patch.yaml new file mode 100644 index 0000000..18e485d --- /dev/null +++ b/.github/kustomize/overlays/prod/event-service-patch.yaml @@ -0,0 +1,17 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: event-service +spec: + replicas: 3 + template: + spec: + containers: + - name: event-service + resources: + requests: + cpu: "1024m" + memory: "1024Mi" + limits: + cpu: "4096m" + memory: "4096Mi" diff --git a/.github/kustomize/overlays/prod/kustomization.yaml b/.github/kustomize/overlays/prod/kustomization.yaml new file mode 100644 index 0000000..4e3528f --- /dev/null +++ b/.github/kustomize/overlays/prod/kustomization.yaml @@ -0,0 +1,38 @@ +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization + +namespace: kt-event-marketing + +bases: + - ../../base + +# Environment-specific labels +commonLabels: + environment: prod + +# Environment-specific patches +patchesStrategicMerge: + - user-service-patch.yaml + - event-service-patch.yaml + - ai-service-patch.yaml + - content-service-patch.yaml + - distribution-service-patch.yaml + - participation-service-patch.yaml + - analytics-service-patch.yaml + +# Override image tags for prod environment +images: + - name: acrdigitalgarage01.azurecr.io/kt-event-marketing/user-service + newTag: prod + - name: acrdigitalgarage01.azurecr.io/kt-event-marketing/event-service + newTag: prod + - name: acrdigitalgarage01.azurecr.io/kt-event-marketing/ai-service + newTag: prod + - name: acrdigitalgarage01.azurecr.io/kt-event-marketing/content-service + newTag: prod + - name: acrdigitalgarage01.azurecr.io/kt-event-marketing/distribution-service + newTag: prod + - name: acrdigitalgarage01.azurecr.io/kt-event-marketing/participation-service + newTag: prod + - name: acrdigitalgarage01.azurecr.io/kt-event-marketing/analytics-service + newTag: prod diff --git a/.github/kustomize/overlays/prod/participation-service-patch.yaml b/.github/kustomize/overlays/prod/participation-service-patch.yaml new file mode 100644 index 0000000..b4e96e3 --- /dev/null +++ b/.github/kustomize/overlays/prod/participation-service-patch.yaml @@ -0,0 +1,17 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: participation-service +spec: + replicas: 3 + template: + spec: + containers: + - name: participation-service + resources: + requests: + cpu: "1024m" + memory: "1024Mi" + limits: + cpu: "4096m" + memory: "4096Mi" diff --git a/.github/kustomize/overlays/prod/user-service-patch.yaml b/.github/kustomize/overlays/prod/user-service-patch.yaml new file mode 100644 index 0000000..5edc66c --- /dev/null +++ b/.github/kustomize/overlays/prod/user-service-patch.yaml @@ -0,0 +1,17 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: user-service +spec: + replicas: 3 + template: + spec: + containers: + - name: user-service + resources: + requests: + cpu: "1024m" + memory: "1024Mi" + limits: + cpu: "4096m" + memory: "4096Mi" diff --git a/.github/kustomize/overlays/staging/ai-service-patch.yaml b/.github/kustomize/overlays/staging/ai-service-patch.yaml new file mode 100644 index 0000000..820d2c9 --- /dev/null +++ b/.github/kustomize/overlays/staging/ai-service-patch.yaml @@ -0,0 +1,17 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: ai-service +spec: + replicas: 2 + template: + spec: + containers: + - name: ai-service + resources: + requests: + cpu: "512m" + memory: "512Mi" + limits: + cpu: "2048m" + memory: "2048Mi" diff --git a/.github/kustomize/overlays/staging/analytics-service-patch.yaml b/.github/kustomize/overlays/staging/analytics-service-patch.yaml new file mode 100644 index 0000000..b0483ee --- /dev/null +++ b/.github/kustomize/overlays/staging/analytics-service-patch.yaml @@ -0,0 +1,17 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: analytics-service +spec: + replicas: 2 + template: + spec: + containers: + - name: analytics-service + resources: + requests: + cpu: "512m" + memory: "512Mi" + limits: + cpu: "2048m" + memory: "2048Mi" diff --git a/.github/kustomize/overlays/staging/content-service-patch.yaml b/.github/kustomize/overlays/staging/content-service-patch.yaml new file mode 100644 index 0000000..118c134 --- /dev/null +++ b/.github/kustomize/overlays/staging/content-service-patch.yaml @@ -0,0 +1,17 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: content-service +spec: + replicas: 2 + template: + spec: + containers: + - name: content-service + resources: + requests: + cpu: "512m" + memory: "512Mi" + limits: + cpu: "2048m" + memory: "2048Mi" diff --git a/.github/kustomize/overlays/staging/distribution-service-patch.yaml b/.github/kustomize/overlays/staging/distribution-service-patch.yaml new file mode 100644 index 0000000..fa3f6c1 --- /dev/null +++ b/.github/kustomize/overlays/staging/distribution-service-patch.yaml @@ -0,0 +1,17 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: distribution-service +spec: + replicas: 2 + template: + spec: + containers: + - name: distribution-service + resources: + requests: + cpu: "512m" + memory: "512Mi" + limits: + cpu: "2048m" + memory: "2048Mi" diff --git a/.github/kustomize/overlays/staging/event-service-patch.yaml b/.github/kustomize/overlays/staging/event-service-patch.yaml new file mode 100644 index 0000000..18113bb --- /dev/null +++ b/.github/kustomize/overlays/staging/event-service-patch.yaml @@ -0,0 +1,17 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: event-service +spec: + replicas: 2 + template: + spec: + containers: + - name: event-service + resources: + requests: + cpu: "512m" + memory: "512Mi" + limits: + cpu: "2048m" + memory: "2048Mi" diff --git a/.github/kustomize/overlays/staging/kustomization.yaml b/.github/kustomize/overlays/staging/kustomization.yaml new file mode 100644 index 0000000..a7bb48e --- /dev/null +++ b/.github/kustomize/overlays/staging/kustomization.yaml @@ -0,0 +1,38 @@ +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization + +namespace: kt-event-marketing + +bases: + - ../../base + +# Environment-specific labels +commonLabels: + environment: staging + +# Environment-specific patches +patchesStrategicMerge: + - user-service-patch.yaml + - event-service-patch.yaml + - ai-service-patch.yaml + - content-service-patch.yaml + - distribution-service-patch.yaml + - participation-service-patch.yaml + - analytics-service-patch.yaml + +# Override image tags for staging environment +images: + - name: acrdigitalgarage01.azurecr.io/kt-event-marketing/user-service + newTag: staging + - name: acrdigitalgarage01.azurecr.io/kt-event-marketing/event-service + newTag: staging + - name: acrdigitalgarage01.azurecr.io/kt-event-marketing/ai-service + newTag: staging + - name: acrdigitalgarage01.azurecr.io/kt-event-marketing/content-service + newTag: staging + - name: acrdigitalgarage01.azurecr.io/kt-event-marketing/distribution-service + newTag: staging + - name: acrdigitalgarage01.azurecr.io/kt-event-marketing/participation-service + newTag: staging + - name: acrdigitalgarage01.azurecr.io/kt-event-marketing/analytics-service + newTag: staging diff --git a/.github/kustomize/overlays/staging/participation-service-patch.yaml b/.github/kustomize/overlays/staging/participation-service-patch.yaml new file mode 100644 index 0000000..65465c4 --- /dev/null +++ b/.github/kustomize/overlays/staging/participation-service-patch.yaml @@ -0,0 +1,17 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: participation-service +spec: + replicas: 2 + template: + spec: + containers: + - name: participation-service + resources: + requests: + cpu: "512m" + memory: "512Mi" + limits: + cpu: "2048m" + memory: "2048Mi" diff --git a/.github/kustomize/overlays/staging/user-service-patch.yaml b/.github/kustomize/overlays/staging/user-service-patch.yaml new file mode 100644 index 0000000..7761f3c --- /dev/null +++ b/.github/kustomize/overlays/staging/user-service-patch.yaml @@ -0,0 +1,17 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: user-service +spec: + replicas: 2 + template: + spec: + containers: + - name: user-service + resources: + requests: + cpu: "512m" + memory: "512Mi" + limits: + cpu: "2048m" + memory: "2048Mi" diff --git a/.github/scripts/copy-manifests-to-base.py b/.github/scripts/copy-manifests-to-base.py new file mode 100644 index 0000000..b0f6501 --- /dev/null +++ b/.github/scripts/copy-manifests-to-base.py @@ -0,0 +1,79 @@ +#!/usr/bin/env python3 +""" +Copy K8s manifests to Kustomize base directory and remove namespace declarations +""" +import os +import shutil +import yaml +from pathlib import Path + +# Service names +SERVICES = [ + 'user-service', + 'event-service', + 'ai-service', + 'content-service', + 'distribution-service', + 'participation-service', + 'analytics-service' +] + +# Base directories +SOURCE_DIR = Path('deployment/k8s') +BASE_DIR = Path('.github/kustomize/base') + +def remove_namespace_from_yaml(content): + """Remove namespace field from YAML content""" + docs = list(yaml.safe_load_all(content)) + + for doc in docs: + if doc and isinstance(doc, dict): + if 'metadata' in doc and 'namespace' in doc['metadata']: + del doc['metadata']['namespace'] + + return yaml.dump_all(docs, default_flow_style=False, sort_keys=False) + +def copy_and_process_file(source_path, dest_path): + """Copy file and remove namespace declaration""" + with open(source_path, 'r', encoding='utf-8') as f: + content = f.read() + + # Remove namespace from YAML + processed_content = remove_namespace_from_yaml(content) + + # Write to destination + dest_path.parent.mkdir(parents=True, exist_ok=True) + with open(dest_path, 'w', encoding='utf-8') as f: + f.write(processed_content) + + print(f"✓ Copied and processed: {source_path} -> {dest_path}") + +def main(): + print("Starting manifest copy to Kustomize base...") + + # Copy common resources + print("\n[Common Resources]") + common_dir = SOURCE_DIR / 'common' + for file in ['cm-common.yaml', 'secret-common.yaml', 'secret-imagepull.yaml', 'ingress.yaml']: + source = common_dir / file + if source.exists(): + dest = BASE_DIR / file + copy_and_process_file(source, dest) + + # Copy service-specific resources + print("\n[Service Resources]") + for service in SERVICES: + service_dir = SOURCE_DIR / service + if not service_dir.exists(): + print(f"⚠ Service directory not found: {service_dir}") + continue + + print(f"\nProcessing {service}...") + for file in service_dir.glob('*.yaml'): + dest = BASE_DIR / f"{service}-{file.name}" + copy_and_process_file(file, dest) + + print("\n✅ All manifests copied to base directory!") + +if __name__ == '__main__': + main() diff --git a/.github/scripts/deploy.sh b/.github/scripts/deploy.sh new file mode 100644 index 0000000..4bfb139 --- /dev/null +++ b/.github/scripts/deploy.sh @@ -0,0 +1,181 @@ +#!/bin/bash +set -e + +############################################################################### +# Backend Services Deployment Script for AKS +# +# Usage: +# ./deploy.sh [service-name] +# +# Arguments: +# environment - Target environment (dev, staging, prod) +# service-name - Specific service to deploy (optional, deploys all if not specified) +# +# Examples: +# ./deploy.sh dev # Deploy all services to dev +# ./deploy.sh prod user-service # Deploy only user-service to prod +############################################################################### + +# Color output +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +NC='\033[0m' # No Color + +# Functions +log_info() { + echo -e "${GREEN}[INFO]${NC} $1" +} + +log_warn() { + echo -e "${YELLOW}[WARN]${NC} $1" +} + +log_error() { + echo -e "${RED}[ERROR]${NC} $1" +} + +# Validate arguments +if [ $# -lt 1 ]; then + log_error "Usage: $0 [service-name]" + log_error "Environment must be one of: dev, staging, prod" + exit 1 +fi + +ENVIRONMENT=$1 +SERVICE=${2:-all} + +# Validate environment +if [[ ! "$ENVIRONMENT" =~ ^(dev|staging|prod)$ ]]; then + log_error "Invalid environment: $ENVIRONMENT" + log_error "Must be one of: dev, staging, prod" + exit 1 +fi + +# Load environment variables +ENV_FILE=".github/config/deploy_env_vars_${ENVIRONMENT}" +if [ ! -f "$ENV_FILE" ]; then + log_error "Environment file not found: $ENV_FILE" + exit 1 +fi + +source "$ENV_FILE" +log_info "Loaded environment configuration: $ENVIRONMENT" + +# Service list +SERVICES=( + "user-service" + "event-service" + "ai-service" + "content-service" + "distribution-service" + "participation-service" + "analytics-service" +) + +# Validate service if specified +if [ "$SERVICE" != "all" ]; then + if [[ ! " ${SERVICES[@]} " =~ " ${SERVICE} " ]]; then + log_error "Invalid service: $SERVICE" + log_error "Must be one of: ${SERVICES[*]}" + exit 1 + fi + SERVICES=("$SERVICE") +fi + +log_info "Services to deploy: ${SERVICES[*]}" + +# Check prerequisites +log_info "Checking prerequisites..." + +if ! command -v az &> /dev/null; then + log_error "Azure CLI not found. Please install Azure CLI." + exit 1 +fi + +if ! command -v kubectl &> /dev/null; then + log_error "kubectl not found. Please install kubectl." + exit 1 +fi + +if ! command -v kustomize &> /dev/null; then + log_error "kustomize not found. Please install kustomize." + exit 1 +fi + +# Azure login check +log_info "Checking Azure authentication..." +if ! az account show &> /dev/null; then + log_error "Not logged in to Azure. Please run 'az login'" + exit 1 +fi + +# Get AKS credentials +log_info "Getting AKS credentials..." +az aks get-credentials \ + --resource-group "$RESOURCE_GROUP" \ + --name "$AKS_CLUSTER" \ + --overwrite-existing + +# Check namespace +log_info "Checking namespace: $NAMESPACE" +if ! kubectl get namespace "$NAMESPACE" &> /dev/null; then + log_warn "Namespace $NAMESPACE does not exist. Creating..." + kubectl create namespace "$NAMESPACE" +fi + +# Build and deploy with Kustomize +OVERLAY_DIR=".github/kustomize/overlays/${ENVIRONMENT}" +if [ ! -d "$OVERLAY_DIR" ]; then + log_error "Kustomize overlay directory not found: $OVERLAY_DIR" + exit 1 +fi + +log_info "Building Kustomize manifests for $ENVIRONMENT..." +cd "$OVERLAY_DIR" + +# Update image tags +log_info "Updating image tags to: $ENVIRONMENT" +kustomize edit set image \ + ${ACR_NAME}.azurecr.io/kt-event-marketing/user-service:${ENVIRONMENT} \ + ${ACR_NAME}.azurecr.io/kt-event-marketing/event-service:${ENVIRONMENT} \ + ${ACR_NAME}.azurecr.io/kt-event-marketing/ai-service:${ENVIRONMENT} \ + ${ACR_NAME}.azurecr.io/kt-event-marketing/content-service:${ENVIRONMENT} \ + ${ACR_NAME}.azurecr.io/kt-event-marketing/distribution-service:${ENVIRONMENT} \ + ${ACR_NAME}.azurecr.io/kt-event-marketing/participation-service:${ENVIRONMENT} \ + ${ACR_NAME}.azurecr.io/kt-event-marketing/analytics-service:${ENVIRONMENT} + +# Apply manifests +log_info "Applying manifests to AKS..." +kustomize build . | kubectl apply -f - + +cd - > /dev/null + +# Wait for deployments +log_info "Waiting for deployments to be ready..." +for service in "${SERVICES[@]}"; do + log_info "Waiting for $service deployment..." + if ! kubectl rollout status deployment/"$service" -n "$NAMESPACE" --timeout=5m; then + log_error "Deployment of $service failed!" + exit 1 + fi + log_info "✓ $service is ready" +done + +# Verify deployment +log_info "Verifying deployment..." +echo "" +echo "=== Pods Status ===" +kubectl get pods -n "$NAMESPACE" -l app.kubernetes.io/part-of=kt-event-marketing + +echo "" +echo "=== Services ===" +kubectl get svc -n "$NAMESPACE" + +echo "" +echo "=== Ingress ===" +kubectl get ingress -n "$NAMESPACE" + +log_info "Deployment completed successfully!" +log_info "Environment: $ENVIRONMENT" +log_info "Services: ${SERVICES[*]}" diff --git a/.github/scripts/generate-patches.sh b/.github/scripts/generate-patches.sh new file mode 100644 index 0000000..7b5f6d0 --- /dev/null +++ b/.github/scripts/generate-patches.sh @@ -0,0 +1,51 @@ +#!/bin/bash + +SERVICES=(user-service event-service ai-service content-service distribution-service participation-service analytics-service) + +# Staging patches (2 replicas, increased resources) +for service in "${SERVICES[@]}"; do + cat > ".github/kustomize/overlays/staging/${service}-patch.yaml" << YAML +apiVersion: apps/v1 +kind: Deployment +metadata: + name: ${service} +spec: + replicas: 2 + template: + spec: + containers: + - name: ${service} + resources: + requests: + cpu: "512m" + memory: "512Mi" + limits: + cpu: "2048m" + memory: "2048Mi" +YAML +done + +# Prod patches (3 replicas, maximum resources) +for service in "${SERVICES[@]}"; do + cat > ".github/kustomize/overlays/prod/${service}-patch.yaml" << YAML +apiVersion: apps/v1 +kind: Deployment +metadata: + name: ${service} +spec: + replicas: 3 + template: + spec: + containers: + - name: ${service} + resources: + requests: + cpu: "1024m" + memory: "1024Mi" + limits: + cpu: "4096m" + memory: "4096Mi" +YAML +done + +echo "✅ Generated all patch files for staging and prod" diff --git a/.gitignore b/.gitignore index 74a08c5..9f987d9 100644 --- a/.gitignore +++ b/.gitignore @@ -61,3 +61,5 @@ k8s/**/*-local.yaml # Gradle (로컬 환경 설정) gradle.properties +*.hprof +test-data.json diff --git a/.playwright-mcp/test-results/events-page-api-integration-success.png b/.playwright-mcp/test-results/events-page-api-integration-success.png new file mode 100644 index 0000000..199f3eb Binary files /dev/null and b/.playwright-mcp/test-results/events-page-api-integration-success.png differ diff --git a/.run/AiServiceApplication.run.xml b/.run/AiServiceApplication.run.xml new file mode 100644 index 0000000..250ffbc --- /dev/null +++ b/.run/AiServiceApplication.run.xml @@ -0,0 +1,31 @@ + + + + diff --git a/.run/AnalyticsServiceApplication.run.xml b/.run/AnalyticsServiceApplication.run.xml new file mode 100644 index 0000000..bf57744 --- /dev/null +++ b/.run/AnalyticsServiceApplication.run.xml @@ -0,0 +1,31 @@ + + + + diff --git a/.run/ContentServiceApplication.run.xml b/.run/ContentServiceApplication.run.xml new file mode 100644 index 0000000..2f5218b --- /dev/null +++ b/.run/ContentServiceApplication.run.xml @@ -0,0 +1,31 @@ + + + + diff --git a/.run/DistributionServiceApplication.run.xml b/.run/DistributionServiceApplication.run.xml new file mode 100644 index 0000000..b023d5b --- /dev/null +++ b/.run/DistributionServiceApplication.run.xml @@ -0,0 +1,31 @@ + + + + diff --git a/.run/EventServiceApplication.run.xml b/.run/EventServiceApplication.run.xml index 38d1691..46ef667 100644 --- a/.run/EventServiceApplication.run.xml +++ b/.run/EventServiceApplication.run.xml @@ -1,25 +1,29 @@ - +