Skip to content

Commit 3bec144

Browse files
KimgoonerEpicFnCopilottaekkongyonggi1234
authored
Develop -> Main, 운영 서버에 테스트 서버 내용 반영. (#116)
* [feat/OPS-262] GlobalExceptionHandler 설정 (#8) * feat: GlobalExceptionHandler 진행 사항 저장. * feat/OPS-262 : GlobalExceptionHandler 작성 완료. * [feat/OPS-126] Member 도메인 기초 설계 (#9) * feat/OPS-127 : Member 엔티티 작성(필드, 연관 관계, 생성자, 메소드) * feat/OPS-128 : MemberRepository 작성(name, email 검색 옵션 추가) * feat: GlobalExceptionHandler 작성을 위한 진행 사항 저장. * feat/OPS-129 : MemberService 작성(조회, 생성/수정, 삭제) * feat/OPS-126 : Member 도메인 설계 완료. Service 테스트 코드 추가 * [Chore/OPS-264] ci 워크플로우 개선 (#10) * chore/OPS-264 : ci.yml 수정 * Update .github/workflows/ci.yml Co-authored-by: Copilot <[email protected]> * Update .github/workflows/ci.yml Co-authored-by: Copilot <[email protected]> --------- Co-authored-by: Copilot <[email protected]> * Update .gitignore to exclude IntelliJ files (#11) Add .idea/ to .gitignore to exclude IntelliJ project files * feat/OPS-134 : ApiV1Controller 작성 완료. (#12) * [chore/OPS-268] CI 워크플로우 개선 #2 (#15) 헌재 소셜 로그인에 사용하는 특정 민감한 값(JWT 토큰, 소셜 client_id 등)을 @value 어노테이션을 통해 받아오고 있습니다. 하지만 해당 민감한 값을 저장한 yaml 파일을 레포지토리에 바로 올릴 수 없기에, 레포지토리의 secrets에 해당 값들을 저장해놓고, CI 워크플로우에 이 값들을 사용해서 application-secrets.yml 파일을 작성하는 로직을 추가했습니다. * [feat/OPS-155] 소셜 로그인 회원가입 기능 구현(카카오) (#18) * feat/OPS-155 : 소셜 로그인/회원가입 기능 구현 (카카오) 완료. 수정 사항 반영. * feat/OPS-155 : 소셜 로그인/회원가입 기능 구현 (카카오) 완료. 수정 사항 반영 #2. * feat/OPS-155 : 소셜 로그인/회원가입 기능 구현 (카카오) 완료. 수정 사항 반영 #3. * [chore/ops-130] Terraform을 활용해 EC2 인스턴스 생성 및 설정 (#17) * chore/OPS-266 : EC2 인스턴스 생성 * chore/OPS-267 : VPC, IAM, SG 설정 * chore : 서브넷 설정 수정 및 nginx, mysql 볼륨 마운트 설정 추가 * chore : Dockerfile 수정 및 EC2 보안 그룹 수정 * chore : MYSQL 컨테이너 실행시 초기 DB 이름 지정하도록 설정 * fix/OPS-271 : SecurityConfig 및 Jwt 인증 필터 수정 (#19) * Feat/ops 209 be feat 폴더 생성 (#21) * refactor: archive_id + name 복합 유니크 제약 추가 * refactor: folder_id + title 복합 유니크 제약 추가 * refactor: member_id, archive_id 단일 유니크 제약 추가 * refactor: 엔티티 제약 * feat/OPS-209-BE-feat-폴더-생성 완료 * feat/OPS-209-BE-feat-폴더-생성 완료 * fix : 컨벤션 통일 (#22) Co-authored-by: EpicFn <[email protected]> * Feat/ops 210 be feat 폴더 삭제 (#23) * feat/OPS-210 : 폴더 삭제 구현 * [feat/OPS-151] llm 활용 데이터 정제화 기능 구현 (#27) - groq api를 이용하여 요약, 태그 추출 기능 구현 * [feat/OPS-158] 소셜 로그인 회원가입 기능 구현(구글) (#28) * feat/OPS-158 : 소셜 로그인(구글) 구현, JWT, Member, Auth 도메인 고도화 * feat/OPS-158 : 테스트 케이스 수정. * fix/OPS-158 : template 충돌 해결. * fix/OPS-158 : @transactional import 수정 * feat/OPS-211 : 폴더 이름 변경 구현 (#25) * feat/OPS-211 : 폴더 이름 변경 구현 * refactor/OPS-211 : 폴더명 중복 예외처리 추가 * refactor/OPS-211 : 폴더명 중복 예외처리 추가 * [chore/OPS-187] Terraform을 활용해 RDS 인스턴스 생성 및 설정 (#29) * chore/OPS-187 : Terraform을 활용해 RDS 인스턴스 생성 및 설치 * chore : RDS 서브넷 그룹 private으로 수정 * chore : AWS 리소스 네이밍 규칙 적용 * [feat] 스페이스 데이터 관리 (#32) * new/OPS-222 : space controller, sevice, repository 빈 생성 # Conflicts: # src/main/java/org/tuna/zoopzoop/backend/global/initData/BaseInitData.java * feat/OPS-222 : 스페이스 생성 엔드포인트 추가 * new/OPS-222 : spaceControllerTest 파일 세팅 * refactor/OPS-222 : 테스트 클래스의 공용 파트 추상 클래스로 분리 * fix : 최신사항 반영 * fix/OPS-222 : 테스트 코드에서 형식 다르던 거 수정 * feat/OPS-222 : 스페이스 생성 구현 * feat/OPS-222 : space 단위 핸들러, 커스텀 에러 생성 * fix/OPS-222 : controller 생성 테스트 통과 * feat/OPS-222 : 스페이스 생성 로직 완성 * feat/OPS-222 : 스페이스 삭제 구현 * fix/OPS-222 : 테스트 케이스 통과 * feat/OPS-245 : controller 단위 테스트 케이스 작성 * feat/OPS-245 : 스페이스 명 변경 구현 * fix/OPS-244 : 이름 변경 시 saveAndFlush로 즉시 반영 * chore/OPS-222 : develop 최신 사항 반영 * fix : 저장 * fix/OPS-222 : globalExceptionHandler 컨벤션 통일 * feat/OPS-244 : 스페이스 목록 조회 controller 단위 테스트 작성 * feat/OPS-244 : membership 관리 빈 생성 * feat/OPS-244 : membership 생성 관련 테스트 케이스 작성 * fix : 테스트 케이스 간 충돌 해결 중 * fix : 최신 사항 반영 * 임시저장 * 초기 상태 * fix : 미봉책 적용 * feat/OPS-244 : 스페이스 멤버 추가 기능 * fix : spaceControllerTest와 memberControllerTest 간 충돌 해결 * feat/OPS-244 : 스페이스 목록 조회 엔드포인트 생성 * chore/OPS-244 : 인증 관련 코드 주석 처리 * feat/OPS-270 : 스페이스 로직에 사용자 정보 체크 추가 * feat/OPS-22 : 테스트 케이스에 WithUserDetails 반영 * feat/OPS-222 : 인증 관련 테스트 케이스 추가 * fix : 불필요한 주석 삭제 * new/OPS-222 : space controller, sevice, repository 빈 생성 # Conflicts: # src/main/java/org/tuna/zoopzoop/backend/global/initData/BaseInitData.java * feat/OPS-222 : 스페이스 생성 엔드포인트 추가 * new/OPS-222 : spaceControllerTest 파일 세팅 * refactor/OPS-222 : 테스트 클래스의 공용 파트 추상 클래스로 분리 * fix : 최신사항 반영 * fix/OPS-222 : 테스트 코드에서 형식 다르던 거 수정 * feat/OPS-222 : 스페이스 생성 구현 * feat/OPS-222 : space 단위 핸들러, 커스텀 에러 생성 * fix/OPS-222 : controller 생성 테스트 통과 * feat/OPS-222 : 스페이스 생성 로직 완성 * feat/OPS-222 : 스페이스 삭제 구현 * fix/OPS-222 : 테스트 케이스 통과 * feat/OPS-245 : controller 단위 테스트 케이스 작성 * feat/OPS-245 : 스페이스 명 변경 구현 * fix/OPS-244 : 이름 변경 시 saveAndFlush로 즉시 반영 * chore/OPS-222 : develop 최신 사항 반영 * fix : 저장 * fix/OPS-222 : globalExceptionHandler 컨벤션 통일 * feat/OPS-244 : 스페이스 목록 조회 controller 단위 테스트 작성 * feat/OPS-244 : membership 관리 빈 생성 * feat/OPS-244 : membership 생성 관련 테스트 케이스 작성 * fix : 테스트 케이스 간 충돌 해결 중 * fix : 최신 사항 반영 * 임시저장 * 초기 상태 * fix : 미봉책 적용 * feat/OPS-244 : 스페이스 멤버 추가 기능 * fix : spaceControllerTest와 memberControllerTest 간 충돌 해결 * feat/OPS-244 : 스페이스 목록 조회 엔드포인트 생성 * chore/OPS-244 : 인증 관련 코드 주석 처리 * feat/OPS-270 : 스페이스 로직에 사용자 정보 체크 추가 * feat/OPS-22 : 테스트 케이스에 WithUserDetails 반영 * feat/OPS-222 : 인증 관련 테스트 케이스 추가 * fix : 불필요한 주석 삭제 * fix : 불필요한 파일 삭제 --------- Co-authored-by: EpicFn <[email protected]> * Ops 272 be feat 자료 이름 조회 (#31) * feat/OPS-211 : 폴더 이름 변경 구현 * refactor/OPS-211 : 폴더명 중복 예외처리 추가 * refactor/OPS-211 : 폴더명 중복 예외처리 추가 * feat/OPS-272 : 폴더/파일 조회 구현 * refactor/OPS-272 : tag 생성자 추가 * feat/OPS-195 : 뉴스 목록 조회 기능 구현(최신 뉴스, 키워드 기반). 서비스 테스트 추가. (#33) * refactor/OPS-277 : default 폴더 자동 생성 (#34) * [chore/OPS-278] Auth, Member, News 도메인 문서화 및 고도화. (#35) * chore/OPS-278 : Auth 도메인 문서화 완료 & ApiV1MemberController 추가 기능 구현. * refactor/OPS-278 : ApiV1MemberController 추가 사항에 맞게 테스트 추가 구현. * refactor/OPS-278 : Member 생성 시, 랜덤한 UUID의 앞 5글자를 태그로 사용하도록 변경. * [Feat/OPS-186] 스페이스 초대 관리 (#38) * new/OPS-189 : 초대 관리 Controller 및 테스트 클래스 생성 * feat/OPS-189 : 초대 수락 관련 테스트 코드 작성 * feat : 멤버 권한 변경 함수 생성 * feat/OPS-189 : 초대 수락 구현 * feat/OPS-190 : 초대 거절 테스트 케이스 작성 * feat/OPS-190 : 초대 거절 엔드포인트 생성 * feat/OPS-190 : membershipService 관련 단위 테스트 추가 * refactor : 코드 간단한 위치 조정 * feat/OPS-188 : 스페이스 초대 목록 조회 완료 * fix/OPS-188 : dto 네이밍 수정 * refactor/OPS-188 : 스페이스에 초대된 유저 목록 조회의 controller 위치 변경 * feat : 사용자에게 온 스페이스 초대 목록 조회 엔드포인트 생성 * feat : 사용자에게 온 스페이스 초대 목록 조회 테스트 케이스 작성 --------- Co-authored-by: EpicFn <[email protected]> * refactor/OPS-283 : datasource 엔티티 수정 (#39) * refactor/OPS-285 : datasource 엔티티 thumbnailUrl 이름 변경 (#40) * refactor/OPS-285 : datasource 엔티티 thumbnailUrl 이름 변경 * refactor/OPS-285 : datasource 엔티티 thumbnailUrl 이름 변경 * [feat/OPS-175] 웹 크롤링 데이터 정제화 기능 구현 (#41) * feat/OPS-175 : 웹 크롤링 데이터 정제화 기능 구현 * [refactor/OPS-287] News 도메인 고도화 (#42) * refactor/OPS-287 : newsSearch 메소드 로직 변경 및 일부 API 문서화. * refactor/OPS-287 : NewsServiceTest API를 호출하는 방식으로 변경. * Ops 226 be feat 자료 등록 (#44) * refactor/OPS-283 : datasource 엔티티 수정 * [Feat/OPS-186] 스페이스 초대 관리 (#38) * new/OPS-189 : 초대 관리 Controller 및 테스트 클래스 생성 * feat/OPS-189 : 초대 수락 관련 테스트 코드 작성 * feat : 멤버 권한 변경 함수 생성 * feat/OPS-189 : 초대 수락 구현 * feat/OPS-190 : 초대 거절 테스트 케이스 작성 * feat/OPS-190 : 초대 거절 엔드포인트 생성 * feat/OPS-190 : membershipService 관련 단위 테스트 추가 * refactor : 코드 간단한 위치 조정 * feat/OPS-188 : 스페이스 초대 목록 조회 완료 * fix/OPS-188 : dto 네이밍 수정 * refactor/OPS-188 : 스페이스에 초대된 유저 목록 조회의 controller 위치 변경 * feat : 사용자에게 온 스페이스 초대 목록 조회 엔드포인트 생성 * feat : 사용자에게 온 스페이스 초대 목록 조회 테스트 케이스 작성 --------- Co-authored-by: EpicFn <[email protected]> * refactor/OPS-285 : datasource 엔티티 thumbnailUrl 이름 변경 (#40) * refactor/OPS-285 : datasource 엔티티 thumbnailUrl 이름 변경 * refactor/OPS-285 : datasource 엔티티 thumbnailUrl 이름 변경 * feat/OPS-226 : 자료 등록 구현 * refactor/OPS-226 : 메서드 명 수정 --------- Co-authored-by: Hyeok Jin Kim <[email protected]> Co-authored-by: EpicFn <[email protected]> * Ops 215 be feat 자료 삭제 (#46) * refactor/OPS-283 : datasource 엔티티 수정 * [Feat/OPS-186] 스페이스 초대 관리 (#38) * new/OPS-189 : 초대 관리 Controller 및 테스트 클래스 생성 * feat/OPS-189 : 초대 수락 관련 테스트 코드 작성 * feat : 멤버 권한 변경 함수 생성 * feat/OPS-189 : 초대 수락 구현 * feat/OPS-190 : 초대 거절 테스트 케이스 작성 * feat/OPS-190 : 초대 거절 엔드포인트 생성 * feat/OPS-190 : membershipService 관련 단위 테스트 추가 * refactor : 코드 간단한 위치 조정 * feat/OPS-188 : 스페이스 초대 목록 조회 완료 * fix/OPS-188 : dto 네이밍 수정 * refactor/OPS-188 : 스페이스에 초대된 유저 목록 조회의 controller 위치 변경 * feat : 사용자에게 온 스페이스 초대 목록 조회 엔드포인트 생성 * feat : 사용자에게 온 스페이스 초대 목록 조회 테스트 케이스 작성 --------- Co-authored-by: EpicFn <[email protected]> * refactor/OPS-285 : datasource 엔티티 thumbnailUrl 이름 변경 (#40) * refactor/OPS-285 : datasource 엔티티 thumbnailUrl 이름 변경 * refactor/OPS-285 : datasource 엔티티 thumbnailUrl 이름 변경 * feat/OPS-226 : 자료 등록 구현 * feat/OPS-215 : 자료 삭제 구현 * feat/OPS-215 : 자료 삭제 구현 * feat/OPS-215 : 자료 삭제 구현 * feat/OPS-215 : 자료 삭제 구현 --------- Co-authored-by: Hyeok Jin Kim <[email protected]> Co-authored-by: EpicFn <[email protected]> * [feat/OPS-293] LiveBlocks를 위한 React-flow 데이터 관리 도메인 설계 완료. 테스트 추가. (#47) * feat/OPS-293 : LiveBlocks를 위한 React-flow 데이터 관리 도메인 설계 완료. 테스트 추가. * feat/OPS-293 : folder 테스트에 @transactional 추가. * feat/OPS-293 : MemberServiceTest 수정 #1 * feat/OPS-293 : MemberServiceTest 수정 #2 * feat/OPS-293 : Folder 테스트에 ActiveProfile(test) 추가. * feat/OPS-293 : 테스트에 무결성 검증을 위한 @afterall, @AfterEach 추가. * feat/OPS-293 : 일부 수정. * feat/OPS-293 : 진짜 마지막 수정. * [chore/ops-132] CI/CD 파이프라인 구축 (#43) * chore/OPS-133 : CI 파이프라인 구축 * chore: 테스트/운영 환경용 GitHub Actions Terraform 수동 인프라 적용 워크플로우 추가 * chore : 환경변수로 test/prod 서버 분리 가능하도록 설정 * chore/OPS-135 : CD 워크플로우 추가 * chore: CI 후 CD 실행되도록 설정 * chore : CI 워크플로우 job 분리(테스트,빌드/도커 빌드,ghcr push) * chore : docker build jobs에서 checkout 단계 추가 * chore: CI 워크플로우 job 구분 없앰 * chore : develop/main 브랜치에 따라 CI/CD 워크플로우 분리 * chore : Spring Boot Acutator 의존성 추가 * chore: Actions에서 SSH 접속 후 docker 실행 권한 갖도록 설정 * chore: 컨테이너 실행 로그 터미널에 출력 설정 * chore : 헬스체크 설정 * chore: secrets 직접 ssh 환경 변수로 전달 * chore: 환경변수 직접 docker run에 넣기 * chore: spdocker run 에서 ring profile 제거 * chore: nginx 설정 * chore: test-cd 수정 * chore: test-cd 수정2 * chore: ghcr 로그인 토큰 수정 * chore: 도커 이미지 pull 이름 수정 * chore: ssh 내 안전한 ghcr 로그인 * chore : 이미 pull한 이미지와 run 이미지 이름 일치시키기 * chore: mysql driver 의존성 추가 * chore : 헬스체크 요청 스프링 시큐리티 필터에 걸리지 않도록 설정 * chore: nginx 포트 스위칭 설정 * chore: nginx 포트 스위칭 설정 수정 * chore: nginx 포트 스위칭 설정 수정2 * chore: 운영서버 CD 워크플로우 수정 * chore : prod-server 워크플로우 활성화 경로 설정 * chore : test commit 나중에 지우기 * [Feat/OPS-214] 스페이스 멤버 관리 (#50) * feat/OPS-227 : 스페이스 멤버 목록 조회 테스트 케이스 작성 * feat/OPS-227 : 스페이스 목록 반환 엔드포인트 완성 * feat/OPS-251 : 권한 변경 테스트 케이스 작성 * feat/OPS-214 : 권한 변경 엔드포인트 구현 * fix/OPS-214 : 단순 메세지 오류 테스트 케이스 수정 * fix/OPS-214 : 로직 관련 테스트 케이스 수정 * fix/OPS-251 : globalExceptionHandler에 역직렬화 실패 에러 추가 * refactor/OPS-214 : 비즈니스 로직을 서비스 계층에 일임 * feat/OPS-231 : 스페이스 초대 컨트롤러 테스트케이스 작성 * feat/OPS-231 : 스페이스 초대 로직 작성 * feat/OPS-231 : 스페이스초대 서비스 빈 테스트 케이스 추가 * feat/OPS-228 : 팀원 퇴출 컨트롤러 테스트 케이스 작성 * feeat/OPS-229 : 팀원 퇴출 구현 완료 * fix : 기존 테스트 케이스 일관성 있게 수정 * feat : 멤버 퇴출 서비스 테스트 콛드 작성 * refactor : DTO 패키지 변경 * feat/OPS-294 : 스페이스 나가기 컨트롤러 단위 테스트 작성 * feat/OPS-294 : 스페이스 나가기 로직 완성 * refactor : space 도메인 dto 패키지 변경 * feat/OPS-227 : 스페이스 멤버 목록 조회 테스트 케이스 작성 * feat/OPS-227 : 스페이스 목록 반환 엔드포인트 완성 * feat/OPS-251 : 권한 변경 테스트 케이스 작성 * feat/OPS-214 : 권한 변경 엔드포인트 구현 * fix/OPS-214 : 단순 메세지 오류 테스트 케이스 수정 * fix/OPS-214 : 로직 관련 테스트 케이스 수정 * fix/OPS-251 : globalExceptionHandler에 역직렬화 실패 에러 추가 * refactor/OPS-214 : 비즈니스 로직을 서비스 계층에 일임 * feat/OPS-231 : 스페이스 초대 컨트롤러 테스트케이스 작성 * feat : 최신 사항 반영 * feat/OPS-231 : 스페이스초대 서비스 빈 테스트 케이스 추가 * feat/OPS-228 : 팀원 퇴출 컨트롤러 테스트 케이스 작성 * feeat/OPS-229 : 팀원 퇴출 구현 완료 * fix : 기존 테스트 케이스 일관성 있게 수정 * feat : 멤버 퇴출 서비스 테스트 콛드 작성 * refactor : DTO 패키지 변경 * feat/OPS-294 : 스페이스 나가기 컨트롤러 단위 테스트 작성 * feat/OPS-294 : 스페이스 나가기 로직 완성 * refactor : space 도메인 dto 패키지 변경 --------- Co-authored-by: EpicFn <[email protected]> * refactor/OPS-308 : 도메인 분리 & CI 워크플로우에 application-secrets-server.yml 추가. (#52) * Ops 255 be feat 자료 수정 (#54) * refactor/OPS-283 : datasource 엔티티 수정 * [Feat/OPS-186] 스페이스 초대 관리 (#38) * new/OPS-189 : 초대 관리 Controller 및 테스트 클래스 생성 * feat/OPS-189 : 초대 수락 관련 테스트 코드 작성 * feat : 멤버 권한 변경 함수 생성 * feat/OPS-189 : 초대 수락 구현 * feat/OPS-190 : 초대 거절 테스트 케이스 작성 * feat/OPS-190 : 초대 거절 엔드포인트 생성 * feat/OPS-190 : membershipService 관련 단위 테스트 추가 * refactor : 코드 간단한 위치 조정 * feat/OPS-188 : 스페이스 초대 목록 조회 완료 * fix/OPS-188 : dto 네이밍 수정 * refactor/OPS-188 : 스페이스에 초대된 유저 목록 조회의 controller 위치 변경 * feat : 사용자에게 온 스페이스 초대 목록 조회 엔드포인트 생성 * feat : 사용자에게 온 스페이스 초대 목록 조회 테스트 케이스 작성 --------- Co-authored-by: EpicFn <[email protected]> * refactor/OPS-285 : datasource 엔티티 thumbnailUrl 이름 변경 (#40) * refactor/OPS-285 : datasource 엔티티 thumbnailUrl 이름 변경 * refactor/OPS-285 : datasource 엔티티 thumbnailUrl 이름 변경 * feat/OPS-226 : 자료 등록 구현 * feat/OPS-215 : 자료 삭제 구현 * feat/OPS-255 : 자료 이동 및 수정 구현 --------- Co-authored-by: Hyeok Jin Kim <[email protected]> Co-authored-by: EpicFn <[email protected]> * feat/OPS-289 : dataprocessor 서비스 생성 (#59) * fix/OPS-318 : proxy host 스위칭ì� ssl 인증서 유지 (#60) * [refactor/OPS-310] redirect url 변경 (#53) * refactor/OPS-310 : redirect-url 변경. * refactor/OPS-310 : 작은 수정. * refactor/OPS-310 : 또 하나의 작은 수정. * refactor/OPS-310 : 큰 수정. * refactor/OPS-310 : 테스트 * refactor/OPS-310 : 요청 사항 반영. * refactor/OPS-310 : 요청 사항 반영 #2 * refactor/OPS-255 : datasource 테이블 sources 칼럼 추가 (#64) * [refactor/OPS-323] News API 조회 로직 수정. (#65) * 배포 테스트 #2 * 로직 수정 테스트 * 로직 수정 테스트 #2 * refactor/OPS-322 : source 칼럼명 수정 (#68) * refactor/OPS-322 : source 칼럼명 수정 * refactor/OPS-322 : source 칼럼명 수정 * feat/OPS-321 : dataProcessorService에서 요약 로직 완성 (#69) * [fix/OPS-317] CI/CD 파이프라인 이벤트 분리 (#66) * fix : prod-server nginx 정보 출력 제거 * fix : prod-server CD 워크플로우 main에 push될 때 실행되도록 수정 * fix : test-server CI는 pr시 develop에 실행, CD는 push될 때 실행 * fix : test-server CI 워크플로우에서 CD 부분 제거 * chore : 빌드시 aws관련 정보 application-secret.yml에 들어가도록 설정 (#73) * chore : S3 사용을 위해 빌드시 AWS 정보 application-secrets.yml에 추가되도록 설정 * chore : 역할에 S3 접근 정책 부착 하도록 설정 * chore : ãyml에 추가정보 넣도록 설정 * [Feat/OPS-275] 스페이스 썸네일 이미지 저장 (#71) * chore : S3 환경 설정 * feat : S3Service 구성 * chore : multipart 데이터 크기 설정 * feat : S3 업로드 테스트용 엔드포인트 생성 * feat : S3 연동 완료 * feat : space entity에 imageUrl 항목 추가 * feat : 썸네일 캡처 테스트용 * feat : 썸네일 촬영 테스트 엔드포인트 작성 * feat : 스페이스 썸네일 갱신 API 생성 * feat : 스페이스 이미지 갱신 기능 완성 * feat : 스페이스 목록 반환 시 썸네일 url 같이 반환 * feat : 스페이스 단건 조회 테스트 케이스 작성 * feat : 스페이스 단건 조회 구현 * feat : 스페이스 목록 조회 페이징 기능 추가 --------- Co-authored-by: EpicFn <[email protected]> * [feat/OPS-324] 크롬 확장 프로그램 소셜 로그인 분기 & 소셜 로그인 테스트 API 추가. (#70) * feat/OPS-324 : 확장 프로그램 분기 및 소셜 로그인 테스트 API 추가. * feat/OPS-324 : 테스트 로직 일부 수정. * feat/OPS-324 : 테스트 로직 일부 수정. #2 * feat/OPS-324 : 테스트 완료, 테스트 코드 제거. * feat/OPS-324 : 로그인 분기 수정. * feat/OPS-324 : state 정보를 저장하는 resolver 추가. * feat/OPS-324 : session 등록을 위한 OAuth2LoginSourceFilter 클래스 추가. * feat/OPS-324 : 해결 * fix : ci 시 secrets 에서 S3 관련 시크릿 값 삭제하도록 변경(버킷명 제외) (#74) * fix : ci 시 secrets 에서 S3 관련 시크릿 값 삭제하도록 변경(버킷명 제외) * fix : CI 오타 수정 * fix : build 단계에선 testest를 수행하지 않도록 변경 --------- Co-authored-by: EpicFn <[email protected]> * [feat/OPS-198] 아카이브 정보로 뉴스 목록 조회 (#75) * feat/OPS-198 : 아카이브 기반 뉴스 조회 구현. * feat/OPS-198 : 테스트 케이스 추가. * feat/OPS-265 : LLM-활용-데이터-정제화-시-기존-아카이브의-태그-연동 (#77) * refactor/OPS-319: 아카이브 로그인 연동 (#76) * refactor/OPS-255 : datasource 테이블 sources 칼럼 추가 * refactor/OPS-319 : 아카이브 로그인 연동 * refactor/OPS-319 : 아카이브 로그인 연동 * fix : SpringDoc과 Spring AI 간 의존성 충돌 해결 (#79) * [Feat/OPS-327] 자료 등록 llm 연동 (#78) * refactor/OPS-255 : datasource 테이블 sources 칼럼 추가 * refactor/OPS-319 : 아카이브 로그인 연동 * refactor/OPS-319 : 아카이브 로그인 연동 * refactor/OPS-327 : 자료 등록 LLM 연동 * [feat/OPS-328] 인증/인가 로직 변경 (#80) * feat/OPS-328 : RefreshToken을 서버에서 저장하도록 변경. API 일부 수정. * feat/OPS-328 : 확장 프로그램 로그인 메소드 추가 및 데이터 캐싱 메소드 추가. * [refactor/OPS-337] 요구사항 반영 및 일부 로직 수정. (#81) * refactor/OPS-337 : 프론트 요구사항 반영 및 에러 수정. * refactor/OPS-337 : 테스트 케이스 수정. * refactor/OPS-338 : 아카이브 mock 데이터 입력 (#82) * refactor/OPS-338 : 아카이브 mock 데이터 입력 * refactor/OPS-338 : 아카이브 mock 데이터 입력 * refactor/OPS-338 : mock 추가로 인한 testcase 수정 * [feat/OPS-338] 아카이브 mock 데이터 입력 (#83) * refactor/OPS-338 : 아카이브 mock 데이터 입력 * refactor/OPS-338 : 아카이브 mock 데이터 입력 * refactor/OPS-338 : mock 추가로 인한 testcase 수정 * refactor/OPS-338 : Dev 토큰 발급 컨트롤러 추가 * [Feat/OPS-326] 대시보드 데이터 저장 체계 구축 (#85) * refactor : graph 도메인을 dashboard 도메인으로 수정, dashboard 엔티티 생성 * feat : 스페이스 단건 조회 시 대시보드 id도 함께 반환 * refactor : API 명 변경 * dashboard 기반으로 저장/조회 되도록 변경 * refactor : 테스트 코드 수정 * fix : 반환 메세지 수정 * feat : 서명 검증 로직 구현 * refactor : signature 서비스 분리 * fix : 오타 수정 * fix : CI 파이프라인 수정 --------- Co-authored-by: EpicFn <[email protected]> * [feat/OPS-329] Sentry를 통한 모니터링 환경 구축. (#86) * feat/OPS-329 : Sentry를 통한 모니터링 환경 구축. * feat/OPS-329: 추가로 프론트 요구 사항 반영. * refactor/OPS-353 : 분리 완료. (#87) * [refactor/OPS-354] 테스트 케이스 사용 프로필 변경. (#88) * refactor/OPS-354 : 테스트 케이스 사용 프로필 변경. * refactor/OPS-354 : 이래도 안돼? * refactor/OPS-355 : 요구 사항 반영. (#91) * feat/OPS-358: Redis 의존성 추가 및 RedisConfig 설정 완료. AuthResultData 직렬화 및 AuthResult 클래스에 TTL 도입. (#92) * feat/OPS-356 : 네이버 블로그 크롤러 생성 (#93) * [feat/OPS-252] 조건별 자료 검색 (#89) * refactor/OPS-255 : datasource 테이블 sources 칼럼 추가 * refactor/OPS-319 : 아카이브 로그인 연동 * refactor/OPS-319 : 아카이브 로그인 연동 * refactor/OPS-327 : 자료 등록 LLM 연동 * refactor/OPS-252 : 조건별 자료 검색 구현 * refactor/OPS-252 : 조건별 자료 검색 * fix : 스페이스, 사용자 목록 반환 시 항상 id 오름차순 정렬 (#94) Co-authored-by: EpicFn <[email protected]> * IllegalStateException(동시성 문제)관련 처리 메소드 추가. (#95) * [fix/OPS-362] 요구 사항 반영 (#96) * fix/OPS-362 : 요구사항 반영. * fix/OPS-362 : 요구사항 반영#2 * [feat/OPS-341] 벨로그 크롤러 생성 (#90) * feat/OPS-341 : Velog 크롤러 생성 * fix : createDate,modifyDate 자동 적용되도록 설정 * fix/OPS-362 : 요구사항 반영#3 (#97) * fix/OPS-362 : 요구사항 반영#4 (#98) * fix/OPS-362 : 요구사항 반영#5 (#99) * fix/OPS-362 : 요구사항 반영#6 (#100) * [refactor/OPS-360] folder&datasource 리펙토링 (#101) * refactor/OPS-360 : OpenAPI 애너테이션 추가 * refactor/OPS-360 : NoResultException 예외 분리 * refactor/OPS-360 : param 추가 * refactor/OPS-360 : param 추가 * refactor/OPS-360 : default 폴더 CRUD 로직 수정 * refactor/OPS-360 : 폴더 리스트는 호출 로직 수정 * fix/OPS-362 : 요구사항 반영#7 (#102) * fix/OPS-362 : 요구사항 반영#8 (#103) * hotfix/OPS-346 : 파일 조회 수정 (#104) * [feat/OPS-365 ] soft delete + 휴지통 조회 구현 (#105) * feat/OPS-365 : soft delete + 휴지통 조회 구현 * refactor/OPS-246 : 요구사항 리팩토링 * chore : rabbitmq 환경설정 (#106) * chore : rabbitmq 로컬 개발 환경 설정 * chore : rabbitmq 관련 springboot 환경 설정 * chore: rabbitmq 의존성 추가 * [Feat/OPS-344] message queue 구현 (#107) * chore : RabbitMQ 환경 설정 * chore : CI 파이프라인에서 RabbitMQ 컨테이너를 띄워서 사용하도록 설정 * new : RabbitMQ 설정 클래스, dto 생성 * feat : producer method 생성 * feat : 메세지 큐 구현 완료 * feat : 데이터 저장 요청 테스트 케이스 수정 * feat : ConsumerTest 코드 추가 * fix : 저장 테스트 케이스 성공 * fix : 테스트 코드 수정 중 * fix : 테스트 케이스 성공 * feat : dlq 도입 * feat : 데이터 순서 보장을 위해 version 추가 * refactor : MQConfig 파일 위치 변경 * chore : RabbitMQ 환경 설정 # Conflicts: # docker-compose.yml # src/main/resources/application.yml * chore : CI 파이프라인에서 RabbitMQ 컨테이너를 띄워서 사용하도록 설정 * new : RabbitMQ 설정 클래스, dto 생성 * feat : producer method 생성 * feat : 메세지 큐 구현 완료 * feat : 데이터 저장 요청 테스트 케이스 수정 * feat : ConsumerTest 코드 추가 * fix : 저장 테스트 케이스 성공 * fix : 테스트 코드 수정 중 * fix : 테스트 케이스 성공 * feat : dlq 도입 * feat : 데이터 순서 보장을 위해 version 추가 * refactor : MQConfig 파일 위치 변경 * fix : 최신 사항 반영 * fix : copilot review 반영 * feat : Dashboard에서 graph 참조 방식 EAGER -> LAZY 로 변경 * CI 실패해서 다시 EAGER로 변경 * fix : 다시 LAZY로 변경 --------- Co-authored-by: EpicFn <[email protected]> * [Refactor/OPS-373] 자료 조회 검색 요구사항 수정 (#108) * refactor/OPS-373 : 자료 이름 unique 속성 삭제 * refactor/OPS-373 : 자료 수정 가능 칼럼 추가 * refactor/OPS-373 : 명시적 null과 미전달 구분 * [Feat/OPS-376] 스페이스 목록 참여 인원 반환 api 구성 (#109) * refactor : dto 이름 일부 변경 * feat : 구현 완료 * feat : 관련 테스트 케이스 추가 * fix : 테스트 케이스 수정 --------- Co-authored-by: EpicFn <[email protected]> * [Refactor/OPS-290] 데이터소스 정제화 기능 고도화 (#112) * refactor/OPS-290 : 데이터소스 정제화 기능 고도화 * [Feat/OPS-346] 공유 폴더 관리 (#113) * refactor/OPS-360 : OpenAPI 애너테이션 추가 * refactor/OPS-360 : NoResultException 예외 분리 * refactor/OPS-360 : param 추가 * refactor/OPS-360 : param 추가 * refactor/OPS-360 : default 폴더 CRUD 로직 수정 * refactor/OPS-360 : 폴더 리스트는 호출 로직 수정 * refactor/OPS-346 : 공유 폴더 관리 * feat/OPS-365 : soft delete + 휴지통 조회 구현 * feat/OPS-346 : 공유 폴더 관리 * feat/OPS-346 : 공유 폴더 관리 * refactor/OPS-346 : 개인 / 공유 폳더 관리 분리 * refactor/OPS-346 : 검색 기능 출처 누락 수정 * feat : 스페이스 목록 조회 시 생성 일자도 반환 (#114) Co-authored-by: EpicFn <[email protected]> * [feat/OPS-377] 운영/테스트 서버 분리 작업 (#115) * feat/OPS-377 : 테스트/운영 환경 분리 * feat/OPS-377 : 테스트/운영 환경 분리 #2 * feat/OPS-377 : 테스트/운영 환경 분리 #3 * feat/OPS-377 : 테스트/운영 환경 분리 #4 --------- Co-authored-by: Hyeok Jin Kim <[email protected]> Co-authored-by: Copilot <[email protected]> Co-authored-by: taekkong <[email protected]> Co-authored-by: main <[email protected]> Co-authored-by: EpicFn <[email protected]> Co-authored-by: osh5030 <[email protected]>
1 parent 4de2b8d commit 3bec144

File tree

235 files changed

+16538
-203
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

235 files changed

+16538
-203
lines changed

.github/workflows/ci.yml

Lines changed: 0 additions & 52 deletions
This file was deleted.

.github/workflows/prod-server.yml

Lines changed: 161 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,161 @@
1+
# 워크플로우 이름
2+
name: Spring CD (Production)
3+
4+
# main 브랜치 PR에서만 실행 (이미 빌드된 Docker 이미지 사용)
5+
on:
6+
push:
7+
branches:
8+
- main
9+
paths:
10+
- 'src/**'
11+
- 'build.gradle*'
12+
- 'settings.gradle*'
13+
- 'gradle/**'
14+
- 'Dockerfile'
15+
- '.github/workflows/**'
16+
17+
jobs:
18+
# ==================================
19+
# CD: Deploy to Production Environment
20+
# ==================================
21+
cd-prod:
22+
runs-on: ubuntu-latest
23+
24+
steps:
25+
- name: Checkout code
26+
uses: actions/checkout@v4
27+
28+
- name: Deploy to Test Environment
29+
uses: appleboy/[email protected]
30+
with:
31+
host: ${{ secrets.PROD_SERVER_HOST }}
32+
username: ec2-user
33+
key: ${{ secrets.SSH_PRIVATE_KEY }}
34+
script: |
35+
36+
# GHCR 로그인 (EC2)
37+
echo "${{ secrets.GITHUB_TOKEN }}" | docker login ghcr.io -u "${{github.repository_owner}}" --password-stdin
38+
39+
# 최신 이미지 pull
40+
docker pull ghcr.io/${{ github.repository }}/zoopzoop:latest
41+
42+
# NPM API 설정
43+
NPM_HOST="localhost:81"
44+
NPM_EMAIL="${{secrets.NPM_ADMIN_EMAIL}}"
45+
NPM_PASSWORD="${{secrets.NPM_ADMIN_PASSWORD}}"
46+
PROXY_HOST_ID="${{secrets.NPM_PROXY_HOST_ID}}"
47+
48+
# NPM API 토큰 가져오기
49+
echo "Getting NPM API token..."
50+
TOKEN=$(curl -s -X POST "http://${NPM_HOST}/api/tokens" \
51+
-H "Content-Type: application/json" \
52+
-d "{\"identity\":\"${NPM_EMAIL}\",\"secret\":\"${NPM_PASSWORD}\"}" | \
53+
jq -r '.token')
54+
if [ "$TOKEN" == "null" ] || [ -z "$TOKEN" ]; then
55+
echo "❌ Failed to get NPM API token"
56+
exit 1
57+
fi
58+
59+
# 현재 NPM Proxy Host 설정 확인
60+
echo "📋 Checking current NPM configuration... 📋"
61+
CURRENT_CONFIG=$(curl -s -H "Authorization: Bearer $TOKEN" \
62+
"http://${NPM_HOST}/api/nginx/proxy-hosts/${PROXY_HOST_ID}")
63+
64+
CURRENT_TARGET=$(echo $CURRENT_CONFIG | jq -r '.[0].forward_host // .forward_host')
65+
CURRENT_PORT=$(echo $CURRENT_CONFIG | jq -r '.[0].forward_port // .forward_port')
66+
67+
echo "Current NPM target: $CURRENT_TARGET:$CURRENT_PORT"
68+
69+
# Blue-Green 배포
70+
if [ "$(docker ps -q -f name=zoopzoop-blue)" ]; then
71+
NEW_CONTAINER=zoopzoop-green
72+
OLD_CONTAINER=zoopzoop-blue
73+
NEW_PORT=8082
74+
else
75+
NEW_CONTAINER=zoopzoop-blue
76+
OLD_CONTAINER=zoopzoop-green
77+
NEW_PORT=8081
78+
fi
79+
80+
echo "Starting new container: $NEW_CONTAINER on port $NEW_PORT"
81+
docker run -d --restart unless-stopped \
82+
-p $NEW_PORT:8080 \
83+
--name $NEW_CONTAINER \
84+
--network common \
85+
-e SPRING_PROFILES_ACTIVE=prod \
86+
-e SPRING_DATASOURCE_URL="${{secrets.PROD_DB_URL}}" \
87+
-e SPRING_DATASOURCE_USERNAME="${{secrets.PROD_DB_USERNAME}}" \
88+
-e SPRING_DATASOURCE_PASSWORD="${{secrets.PROD_DB_PASSWORD}}" \
89+
-e SPRING_RABBITMQ_HOST="${{secrets.PROD_RABBITMQ_HOST}}" \
90+
-e SPRING_RABBITMQ_USERNAME="${{secrets.PROD_RABBITMQ_USERNAME}}" \
91+
-e SPRING_RABBITMQ_PASSWORD="${{secrets.PROD_RABBITMQ_PASSWORD}}" \
92+
ghcr.io/${{ github.repository }}/zoopzoop:latest
93+
94+
95+
# 헬스체크 (Spring Boot Actuator)
96+
for i in {1..30}; do
97+
if curl -s http://localhost:$NEW_PORT/actuator/health | grep -q '"status":"UP"'; then
98+
echo "✅New container is healthy!"
99+
break
100+
else
101+
echo "Waiting for new container to be healthy..."
102+
sleep 5
103+
fi
104+
105+
if [ $i -eq 30 ]; then
106+
echo "❌ Health check failed. Rolling back..."
107+
docker stop $NEW_CONTAINER || true
108+
docker rm $NEW_CONTAINER || true
109+
exit 1
110+
fi
111+
done
112+
113+
# NPM에서 트래픽 스위칭
114+
echo "🔄 Switching traffic in Nginx Proxy Manager..."
115+
DOMAIN_NAME=$(echo $CURRENT_CONFIG | jq -r '.domain_names[0]')
116+
CERT_ID=$(echo "$CURRENT_CONFIG" | jq -r '.certificate_id')
117+
118+
SWITCH_RESPONSE=$(curl -s -w "%{http_code}" -X PUT "http://${NPM_HOST}/api/nginx/proxy-hosts/${PROXY_HOST_ID}" \
119+
-H "Authorization: Bearer $TOKEN" \
120+
-H "Content-Type: application/json" \
121+
-d "{
122+
\"domain_names\": [\"$DOMAIN_NAME\"],
123+
\"forward_scheme\": \"http\",
124+
\"forward_host\": \"$NEW_CONTAINER\",
125+
\"forward_port\": 8080,
126+
\"caching_enabled\": false,
127+
\"block_exploits\": true,
128+
\"advanced_config\": \"\",
129+
\"locations\": [],
130+
\"certificate_id\": $CERT_ID,
131+
\"ssl_forced\": 1,
132+
\"hsts_enabled\": 1,
133+
\"hsts_subdomains\": 1
134+
}")
135+
136+
HTTP_CODE=${SWITCH_RESPONSE: -3}
137+
if [ "$HTTP_CODE" -eq 200 ] || [ "$HTTP_CODE" -eq 201 ]; then
138+
echo "✅ Traffic switching completed successfully!"
139+
echo "🎯 NPM now points to: $NEW_CONTAINER:8080"
140+
141+
# 최종 확인
142+
sleep 5
143+
echo "🔍 Final verification..."
144+
VERIFY_CONFIG=$(curl -s -H "Authorization: Bearer $TOKEN" \
145+
"http://${NPM_HOST}/api/nginx/proxy-hosts/${PROXY_HOST_ID}")
146+
VERIFY_TARGET=$(echo $VERIFY_CONFIG | jq -r '.forward_host')
147+
echo "✅ Verified NPM target: $VERIFY_TARGET"
148+
149+
else
150+
echo "❌ Traffic switching failed! HTTP Code: $HTTP_CODE"
151+
echo "Response: ${SWITCH_RESPONSE%???}"
152+
echo "🔄 Rolling back new container..."
153+
docker stop $NEW_CONTAINER || true
154+
docker rm $NEW_CONTAINER || true
155+
exit 1
156+
fi
157+
158+
# 이전 컨테이너 종료 및 제거
159+
echo "Stopping old container: $OLD_CONTAINER"
160+
docker stop $OLD_CONTAINER || true
161+
docker rm $OLD_CONTAINER || true

.github/workflows/terraform.yml

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
name: Terraform Apply
2+
3+
on:
4+
workflow_dispatch:
5+
6+
jobs:
7+
terraform-apply:
8+
runs-on: ubuntu-latest
9+
10+
steps:
11+
- name: Checkout code
12+
uses: actions/checkout@v3
13+
14+
- name: Setup Terraform
15+
uses: hashicorp/setup-terraform@v2
16+
with:
17+
terraform_version: 1.7.6
18+
19+
- name: Terraform Init
20+
working-directory: ./infra/terraform #워크플로우 파일 위치 폴더 기준 x, 체크아웃된 저장소 루트 기준
21+
run: terraform init
22+
23+
- name: Set Environment based on Branch
24+
run: |
25+
BRANCH=${{ github.ref_name }}
26+
if [ "$BRANCH" = "develop" ] ; then
27+
ENV="test"
28+
elif [ "$BRANCH" = "main" ] ; then
29+
ENV="prod"
30+
else
31+
echo "Unsupported branch: $BRANCH"
32+
exit 1
33+
fi
34+
echo "Environment: $ENV"
35+
36+
if [ "$ENV" = "prod" ] ; then
37+
echo "${{secrets.TFVARS_PROD}}" > ./infra/terraform/env/terraform.tfvars
38+
else
39+
echo "${{secrets.TFVARS_TEST}}" > ./infra/terraform/env/terraform.tfvars
40+
fi
41+
42+
- name: Select or Create Workspace
43+
working-directory: ./infra/terraform
44+
run: |
45+
if terraform workspace list | grep -q "$ENV"; then
46+
terraform workspace select "$ENV"
47+
else
48+
terraform workspace new "$ENV"
49+
fi
50+
51+
- name: Terraform Apply
52+
working-directory: ./infra/terraform/env
53+
run: terraform apply -auto-approve -var-file="terraform.tfvars"
54+
env:
55+
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
56+
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
name: Spring CD (Test Server)
2+
3+
on:
4+
push:
5+
branches:
6+
- develop
7+
8+
jobs:
9+
cd-test:
10+
runs-on: ubuntu-latest
11+
12+
steps:
13+
- name: Checkout code
14+
uses: actions/checkout@v4
15+
16+
- name: Deploy to Test Environment
17+
uses: appleboy/[email protected]
18+
with:
19+
host: ${{ secrets.TEST_SERVER_HOST }}
20+
username: ec2-user
21+
key: ${{ secrets.SSH_PRIVATE_KEY }}
22+
script: |
23+
# GHCR 로그인
24+
echo "${{ secrets.GITHUB_TOKEN }}" | docker login ghcr.io -u "${{ github.repository_owner }}" --password-stdin
25+
docker pull ghcr.io/${{ github.repository }}/zoopzoop:latest
26+
27+
NPM_HOST="localhost:81"
28+
NPM_EMAIL="${{ secrets.NPM_ADMIN_EMAIL }}"
29+
NPM_PASSWORD="${{ secrets.NPM_ADMIN_PASSWORD }}"
30+
PROXY_HOST_ID="${{ secrets.NPM_PROXY_HOST_ID }}"
31+
32+
# NPM 토큰
33+
TOKEN=$(curl -s -X POST "http://${NPM_HOST}/api/tokens" \
34+
-H "Content-Type: application/json" \
35+
-d "{\"identity\":\"${NPM_EMAIL}\",\"secret\":\"${NPM_PASSWORD}\"}" | jq -r '.token')
36+
if [ -z "$TOKEN" ] || [ "$TOKEN" == "null" ]; then
37+
echo "❌ Failed to get NPM API token"
38+
exit 1
39+
fi
40+
41+
CURRENT_CONFIG=$(curl -s -H "Authorization: Bearer $TOKEN" \
42+
"http://${NPM_HOST}/api/nginx/proxy-hosts/${PROXY_HOST_ID}")
43+
44+
CURRENT_TARGET=$(echo $CURRENT_CONFIG | jq -r '.[0].forward_host // .forward_host')
45+
CURRENT_PORT=$(echo $CURRENT_CONFIG | jq -r '.[0].forward_port // .forward_port')
46+
echo "Current NPM target: $CURRENT_TARGET:$CURRENT_PORT"
47+
48+
if [ "$(docker ps -q -f name=zoopzoop-blue)" ]; then
49+
NEW_CONTAINER=zoopzoop-green
50+
OLD_CONTAINER=zoopzoop-blue
51+
NEW_PORT=8082
52+
else
53+
NEW_CONTAINER=zoopzoop-blue
54+
OLD_CONTAINER=zoopzoop-green
55+
NEW_PORT=8081
56+
fi
57+
58+
docker run -d --restart unless-stopped \
59+
-p $NEW_PORT:8080 \
60+
--name $NEW_CONTAINER \
61+
--network common \
62+
-e SPRING_PROFILES_ACTIVE=server \
63+
-e SPRING_DATASOURCE_URL="${{secrets.TEST_DB_URL}}" \
64+
-e SPRING_DATASOURCE_USERNAME="${{secrets.TEST_DB_USERNAME}}" \
65+
-e SPRING_DATASOURCE_PASSWORD="${{secrets.TEST_DB_PASSWORD}}" \
66+
-e SPRING_RABBITMQ_HOST="${{secrets.TEST_RABBITMQ_HOST}}" \
67+
-e SPRING_RABBITMQ_USERNAME="${{secrets.TEST_RABBITMQ_USERNAME}}" \
68+
-e SPRING_RABBITMQ_PASSWORD="${{secrets.TEST_RABBITMQ_PASSWORD}}" \
69+
ghcr.io/${{ github.repository }}/zoopzoop:latest
70+
71+
# 헬스체크
72+
for i in {1..30}; do
73+
if curl -s http://localhost:$NEW_PORT/actuator/health | grep -q '"status":"UP"'; then
74+
echo "✅ New container is healthy!"
75+
break
76+
else
77+
echo "Waiting for new container to be healthy..."
78+
sleep 5
79+
fi
80+
if [ $i -eq 30 ]; then
81+
echo "❌ Health check failed. Rolling back..."
82+
docker stop $NEW_CONTAINER || true
83+
docker rm $NEW_CONTAINER || true
84+
exit 1
85+
fi
86+
done
87+
88+
# NPM 트래픽 스위칭
89+
DOMAIN_NAME=$(echo $CURRENT_CONFIG | jq -r '.domain_names[0]')
90+
CERT_ID=$(echo "$CURRENT_CONFIG" | jq -r '.certificate_id')
91+
92+
SWITCH_RESPONSE=$(curl -s -w "%{http_code}" -X PUT "http://${NPM_HOST}/api/nginx/proxy-hosts/${PROXY_HOST_ID}" \
93+
-H "Authorization: Bearer $TOKEN" \
94+
-H "Content-Type: application/json" \
95+
-d "{
96+
\"domain_names\": [\"$DOMAIN_NAME\"],
97+
\"forward_scheme\": \"http\",
98+
\"forward_host\": \"$NEW_CONTAINER\",
99+
\"forward_port\": 8080,
100+
\"caching_enabled\": false,
101+
\"block_exploits\": true,
102+
\"advanced_config\": \"\",
103+
\"locations\": [],
104+
\"certificate_id\": $CERT_ID,
105+
\"ssl_forced\": 1,
106+
\"hsts_enabled\": 1,
107+
\"hsts_subdomains\": 1
108+
}")
109+
110+
HTTP_CODE=${SWITCH_RESPONSE: -3}
111+
if [ "$HTTP_CODE" -ne 200 ] && [ "$HTTP_CODE" -ne 201 ]; then
112+
echo "❌ Traffic switching failed! HTTP Code: $HTTP_CODE"
113+
echo "Response: ${SWITCH_RESPONSE%???}"
114+
docker stop $NEW_CONTAINER || true
115+
docker rm $NEW_CONTAINER || true
116+
exit 1
117+
fi
118+
119+
docker stop $OLD_CONTAINER || true
120+
docker rm $OLD_CONTAINER || true

0 commit comments

Comments
 (0)