Skip to content

Commit

Permalink
release/v2.1.3 (#259)
Browse files Browse the repository at this point in the history
* [IDLE-000] Production CI 스크립트 작성

* [IDLE-000] 센터 공고 수정 API 내 접수 방법 null 비허용

* [IDLE-000] 공고 지원자 조회 시, 삭제된 유저는 조회되지 않도록 수정

* [IDLE-363] 센터 관리자 전화 인증 요청 API

* [IDLE-363] 개발 환경 ddl-auto 옵션 임시로 create 옵션으로 변경

* [IDLE-365] 공고 크롤러 selenium 로직 수정 및 로컬 동작 확인

* [IDLE-365] 테스트를 위한 스케줄러 기준 시각 변경

* [IDLE-365] batch job enable 옵션 비활성화

* [IDLE-365] ddl-auto update로 변경

* [IDLE-365] 크롤링 공고 필드 null 비허용

* [IDLE-365] 스케줄러 시간 02시로 설정

* [IDLE-366] spring batch selenium 크롤링을 위한 빌드 스크립트 수정

* [IDLE-366] worknet 사이트가 고용 24 사이트로 통합됨에 따라, 크롤링 스크립트 수정

* [IDLE-366] 크롤러 동작 스케줄링 시간 변경

* [IDLE-366] 스프링 초기 실행 시, spring batch 자동 실행 방지 옵션 추가

* [IDLE-366] spring batch 5 버전에서 업데이트 된 변경사항 적용 및 별도의 JobLauncher 구현

* [IDLE-366] 불필요 의존성 및 옵션 제거

* [IDLE-366] 크롤링 조회 API 내 entity status 필드 추가 및 쿼리 수정

* [IDLE-358] 운영 환경 CD 구축 및 운영 환경 profile 설정 추가

* [IDLE-358] 운영 환경 docker run 실행 시 예외 처리

* [IDLE-000] 크롤링 전체 조회 DTO 생성자 추가

* [IDLE-000] 공고 전체 조회 fetchJoin() 중복 이슈 해결을 위한 subquery 분리

* [IDLE-000] AI 코드리뷰 coderabbit 도입

* [IDLE-000] 크롤링 공고 반경범위 조회 필터를 위한 where절 추가

* [IDLE-000] TimeZone 설정이 적용되지 않는 문제 해결

* [IDLE-000] TimeZone 지정 및 @EnableScheduling 설정

* [IDLE-000] TimeZone 설정 제거

* [IDLE-000] 공고 전체 조회 쿼리 롤백

* [IDLE-000] 기존 공고 내 location을 기반으로 위.경도 값을 decoding하도록 변경

* [IDLE-000] 배포 전 최종 QA

* [IDLE-000] 크롤링 공고 생성일자 필드 type 변경(timestamp -> date)

* [IDLE-000] Redis 비밀번호 설정 추가 (#171)

* [IDLE-000] Redis 비밀번호 설정 추가

* [IDLE-000] yaml 파일에 password 필드 추가

* [IDLE-000] redis local default password 설정

* [IDLE-000] compose 파일 내, 비밀번호 지정 command 설정

* [IDLE-000] Redis 볼륨 설정

* [IDLE-000] ci triggering branch 임시 변경

* [IDLE-000] ci triggering branch 롤백

* [IDLE-000] 테스트 심사 통과를 위한 전화번호 검증 로직 추가

* [IDLE-000] 테스트 심사 통과를 위한 전화번호 검증 로직 추가

* [IDLE-389] 센터 인증 요청 이벤트 발생 시, 디스코드 웹훅 알림을 전송하는 로직 작성

* [IDLE-389] 사업자 등록번호 client properties 클래스명 변경

* [IDLE-389] 코드 리뷰 반영

* [IDLE-000] 트랜잭션 전파 레벨 변경(REQUIRED -> REQUIRES_NEW)

* [IDLE-396] FCM 모듈 추가 및 firebase 의존성 설정

* readme 제목 수정

* readme 제목 수정

* [IDLE-399] FCM Device Token 관리 API

* [IDLE-399] 알림 도메인 설계

* [IDLE-000] fcm service 설정값 주입을 위한 디렉토리 구조 변경

* [IDLE-000] fcm service 설정값 주입을 위한 디렉토리 구조 변경

* [IDLE-400] 채용 공고 지원자 발생 시, 센터 관리자에게 알림을 발송한다.

* [IDLE-400] fcm 모듈 설정 추가

* [IDLE-400] 공고 지원자 발생 시, 모든 센터 관리자들에게 다중 알림을 발송한다.

* [IDLE-415] 알림 조회 처리 API

* [IDLE-417] 읽지 않은 알림 수 집계 API

* [IDLE-418] 알림 목록 조회 API

* [IDLE-418] 피드백 반영

* [IDLE-423] soft-delete가 적용된 즐겨찾기 entity에서, 즐겨찾기 해제 후 다시 설정하는 경우 발생하는 버그를 해결한다.

* [IDLE-424] 요양 보호사 공고 전체 조회 시, 삭제된 공고가 함께 보이는 문제 해결

* [IDLE-400] 채용 공고 지원자 발생 시, 센터 관리자에게 알림을 발송한다. (#183)

* [IDLE-400] 채용 공고 지원자 발생 시, 센터 관리자에게 알림을 발송한다.

* [IDLE-400] fcm 모듈 설정 추가

* [IDLE-400] 공고 지원자 발생 시, 모든 센터 관리자들에게 다중 알림을 발송한다.

* [IDLE-400] 채용 공고 지원자 발생 시, 센터 관리자에게 알림을 발송한다.

* [IDLE-400] fcm 모듈 설정 추가

* [IDLE-400] 공고 지원자 발생 시, 모든 센터 관리자들에게 다중 알림을 발송한다.

* [IDLE-415] 알림 조회 처리 API

* [IDLE-417] 읽지 않은 알림 수 집계 API

* [IDLE-418] 알림 목록 조회 API

* [IDLE-418] 피드백 반영

* [IDLE-423] soft-delete가 적용된 즐겨찾기 entity에서, 즐겨찾기 해제 후 다시 설정하는 경우 발생하는 버그를 해결한다.

* [IDLE-424] 요양 보호사 공고 전체 조회 시, 삭제된 공고가 함께 보이는 문제 해결

* [IDLE-400] 알림 명세 변경

* [IDLE-400] fcm 설정 파일 디렉토리 path 변경

* [IDLE-400] ddl 옵션 변경

* [IDLE-400] ci/cd 옵션 변경

* [IDLE-000] ci triggering branch 복구

* [IDLE-000] develop 환경에서 fcm service 설정 파일 path 수정

* [IDLE-000] fcm service json 파일명 변경

* [IDLE-000] firebase service key 설정 경로 체크를 위해, cd 스크립트를 수정합니다.

* Update README.md

* [IDLE-000] fcm service key 경로를 class path 경로로 수정 시도

* [IDLE-000] ci triggering branch 임시 변경

* [IDLE-000] firebaseApp 초기화 임시 비활성화

* [IDLE-000] firebaseApp 초기화 임시 비활성화

* [IDLE-000] firebaseApp 초기화 임시 비활성화

* [IDLE-000] file path 앞에 ./ 제외

* [IDLE-000] 절대 경로로 변경 시도

* [IDLE-000] fcm service key 생성 path 수정

* [IDLE-000] fcm service key json file 생성 스크립트 작성

* [IDLE-000] ci triggering branch develop으로 롤백

* [IDLE-000] 불필요 스크립트 제거

* [IDLE-000] firebase config의 현재 경로를 출력하도록 print문 추가 (#197)

* [IDLE-000] firebase config의 현재 경로를 출력하도록 print문 추가

* [IDLE-000] ci triggering branch 수정

* [IDLE-000] ci triggering branch 수정

* [IDLE-000] firebase app 초기화 로직 주석 처리

* [IDLE-000] firebase app 초기화 로직 주석 처리

* [IDLE-000] firebase app 초기화 로직 주석 처리

* [IDLE-000] file 대신 string으로 주입받아 초기화하는 방식으로 전환

* [IDLE-000] 일반 string 대신 base64 인코딩 된 문자열을 주입하도록 처리

* [IDLE-000] 일반 string 주입으로 rollback

* [IDLE-000] json string log 추가

* [IDLE-000] base64 문자열로 재 변경

* [IDLE-000] firebase config의 현재 경로를 출력하도록 print문 추가

* [IDLE-429] DB 형상관리를 위한 Flyway 적용

* [IDLE-429] Flyway latest version으로 설정

* [IDLE-429] 피드백 반영

* [IDLE-000] firebase config의 현재 경로를 출력하도록 print문 추가

* [IDLE-000] 알림 조회 처리 로직에 @transactional 추가

* [IDLE-000] 알림 조회 시, 생성 시각 기준이 아닌 uuid v7 id 기준으로 내림차순 정렬하도록 변경

* [IDLE-000] CI 트리거 브랜치 복구

* [IDLE-454] 테스트를 위한 크롤링 수행 시각 변경 및 로깅 추가

* [IDLE-000] 공고 범위 검색 내 중복 데이터 발생 방지

* [IDLE-000] ci 트리거 브랜치 변경

* [IDLE-000] ci 트리거 브랜치 롤백

* [IDLE-000] monitoring 모듈 추가 및 actuator, prometheus 의존성 추가

* [IDLE-456] monitoring.yml 작성

* [IDLE-456] monitoring profile 추가

* [IDLE-456] actuator dependency group name 수정

* [IDLE-000] 크롤링 주기 하루 2회로 변경

* [IDLE-000] 불필요 로그 제거

* [IDLE-000] 인증번호 SMS 내용 수정

* [IDLE-000] classPath 하위 yaml 파일 확장자 모두 .yml로 통일

* [IDLE-000] 즐겨찾기 facade service에 트랜잭션 추가 (#206)

* [IDLE-000] firebase config의 현재 경로를 출력하도록 print문 추가

* [IDLE-000] facade service에 transaction 추가

* [IDLE-461] 유저가 다중 디바이스에서 알림을 받을 수 있도록 개선한다. (#207)

* [IDLE-000] firebase config의 현재 경로를 출력하도록 print문 추가

* [IDLE-461] 한 유저가 다중 디바이스 설정이 가능하도록 한다.

* [IDLE-000] firebase config의 현재 경로를 출력하도록 print문 추가

* [IDLE-000] presentation module의 gradle 파일에 monitoring 모듈 dependency 추가

* [IDLE-000] deviceToken 서비스에서 트랜잭션 어노테이션 추가

* [IDLE-000] batch 테스트를 위해 30분마다 동작하도록 변경

* [IDLE-475] 채팅, 채팅방 도메인 설계

* [IDLE-475] 채팅 메세지 최소, 최대 길이 제한 설정

* [IDLE-000] Batch 메타데이터 테이블 스크립트 변경 및 크롤링 수행 주기 설정

* [IDLE-000] 운영 환경 CD 스크립트에서 불필요한 step 제거

* [IDLE-000] 도텐브 파일 공백 제거 스크립트 작성, 크롤링 대상일자 전날 등록된 공고로 변경

* [IDLE-000] 크롤링 기준 시각 15시로 임시 변경

* [IDLE-000] cd env 파일 생성 스크립트 변경

* [IDLE-492] 동일 유저가 여러 개의 디바이스를 사용 시, 알림이 중복해서 누적되는 현상

* [IDLE-493] flyway 스크립트 오탈자 수정

* [IDLE-493] flyway 스크립트 오탈자 수정

* [IDLE-494] 요양 보호사 및 센터 프로필에서 긴 텍스트를 입력 가능한 항목을 TEXT 컬럼으로 지정한다.

* [IDLE-495] 요양 보호사는 마감된 공고에 지원이 불가능하다.

* [IDLE-495] 공고 마감 처리 메서드명 변경 complete -> completed

* [IDLE-496] 스프링 프로파일 지정을 위한 환경변수 주입

* [IDLE-496] 로그 일부 수정

* [IDLE-000] 안드로이드 app link를 위한 asset 추가

* [IDLE-190] 센터 관리자 인증 요청 목록 조회 API

* [IDLE-000] 크롤링 주기 변경 및 테스트용 에러 로그 추가

* [IDLE-000] 크롤링 대상 사이트에 알림창(alert)이 뜨는 케이스에 대한 처리

* [IDLE-509] 크롤링 전체 조회 시, 공고가 중복 노출되는 현상 해결

* [IDLE-509] 피드백 반영

* [IDLE-509] 사용하지 않는 하위 서비스 의존성 제거

* [IDLE-000] 크롤링 진행 시각 저녁 11시로 변경

* [IDLE-000] 크롤링 공고 즐겨찾기 조회 로직 버그 수정

* [IDLE-000] 요양 보호사 및 센터 관리자 전화번호 컬럼에 unique index 추가

* [IDLE-512] 센터 관리자 인증 요청 event 변경 및 NotificationInfo 인터페이스 패키지 이동

* [IDLE-512] 센터 관리자 인증 요청 event 변경 및 NotificationInfo 인터페이스 패키지 이동

* [IDLE-513] 요양 보호사 location 필드 추가 및 기존 데이터 마이그레이션

* [IDLE-513] 센터 관리자 공고 등록 시, 주변 요양보호사에게 FCM 알림을 일괄 전송한다.

* [IDLE-513] 센터 관리자 공고 등록 시, 주변 요양보호사에게 FCM 알림을 일괄 전송한다.

* [IDLE-000] notification type enum 속성 추가

* [IDLE-000] 센터 공고 등록 알림 제목 및 프로필 url null로 수정

* [IDLE-000] Readme 업데이트

* [IDLE-504] 센터 관리자 인증 승인 및 거절 API

* [IDLE-456] prometheus, grafana 설정을 위한 monitoring.yml 설정

* [IDLE-476] 웹소켓, Redis pub/sub을 이용한 채팅 전송 기능 (#217)

* [IDLE-476] 웹소켓 dependency 추가

* [IDLE-476] 웹소켓, Redis pub/sub을 이용한 채팅 전송 기능

* [IDLE-476] 불필요 클래스 제거

* [IDLE-476] 채팅 메세지 생성 책임을 하위 도메인에서 생성하도록 수정

* [IDLE-476] hash 역직렬화 시 필요한 처리를 Serializer 설정 추가

* [IDLE-476] json 역직렬화 시, 특수문자 허용

* [IDLE-476] websocket stomp 엔드포인트 노출 설정 변경

* [IDLE-476] 채팅 메세지 길이 정책 적용

* [IDLE-518] bastion서버를 통해 production 서버로 접근 후, 배포하도록 설정 (#252)

* [IDLE-518] ECR 레파지토리 변경 (#254)

* [IDLE-518] bastion서버를 통해 production 서버로 접근 후, 배포하도록 설정

* [IDLE-518] ECR 레파지토리 변경

* [IDLE-518] docker-compose 파일 위치 변경 (#256)

* [IDLE-518] bastion서버를 통해 production 서버로 접근 후, 배포하도록 설정

* [IDLE-518] ECR 레파지토리 변경

* [IDLE-518] docker-compose 파일 경로 변경

* [IDLE-518] 소스파일 경로 변경

* [IDLE-518] target 경로 변경

* [IDLE-518] 소스파일 경로 변경

* [IDLE-518] 타겟파일 경로 원상복구

* [IDLE-518] 타겟파일 경로 수정

* [IDLE-518] compose 파일 실행 경로 수정

* [IDLE-518] 하드코딩된 변수를 secrets로 변경

* [IDLE-518] 하드코딩된 변수를 secrets로 변경

* [IDLE-518] 하드코딩된 변수를 secrets로 변경

* [IDLE-518] Configuration Env file 스탭 추가

* [IDLE-518] secrets로 변경

* [IDLE-518] CI/CD재가동 전, 수동 실행으로 변경 (#257)

* [IDLE-518] bastion서버를 통해 production 서버로 접근 후, 배포하도록 설정

* [IDLE-518] ECR 레파지토리 변경

* [IDLE-518] docker-compose 파일 경로 변경

* [IDLE-518] 소스파일 경로 변경

* [IDLE-518] target 경로 변경

* [IDLE-518] 소스파일 경로 변경

* [IDLE-518] 타겟파일 경로 원상복구

* [IDLE-518] 타겟파일 경로 수정

* [IDLE-518] compose 파일 실행 경로 수정

* [IDLE-518] 하드코딩된 변수를 secrets로 변경

* [IDLE-518] 하드코딩된 변수를 secrets로 변경

* [IDLE-518] 하드코딩된 변수를 secrets로 변경

* [IDLE-518] Configuration Env file 스탭 추가

* [IDLE-518] secrets로 변경

* [IDLE-518] CI/CD 재가동 전 수동으로 수정

* [IDLE-518] CI/CD 재가동 전 수동으로 수정

* [IDLE-518] ECR 레파지토리 작성

* [IDLE-518] 서버 재구축 및 CI/CD 재가동 (#258)

* [IDLE-518] bastion서버를 통해 production 서버로 접근 후, 배포하도록 설정

* [IDLE-518] ECR 레파지토리 변경

* [IDLE-518] docker-compose 파일 경로 변경

* [IDLE-518] 소스파일 경로 변경

* [IDLE-518] target 경로 변경

* [IDLE-518] 소스파일 경로 변경

* [IDLE-518] 타겟파일 경로 원상복구

* [IDLE-518] 타겟파일 경로 수정

* [IDLE-518] compose 파일 실행 경로 수정

* [IDLE-518] 하드코딩된 변수를 secrets로 변경

* [IDLE-518] 하드코딩된 변수를 secrets로 변경

* [IDLE-518] 하드코딩된 변수를 secrets로 변경

* [IDLE-518] Configuration Env file 스탭 추가

* [IDLE-518] secrets로 변경

* [IDLE-518] CI/CD 재가동 전 수동으로 수정

* [IDLE-518] CI/CD 재가동 전 수동으로 수정

* [IDLE-518] ECR 레파지토리 작성

* [IDLE-518] .env 파일 경로 변경

* [IDLE-518] 레지스트리 내용 변경

* [IDLE-518] DB 이름을 caremeet으로 변경

* [IDLE-518] 서비스 간 통신을 위한 컨테이너간 네트워크 설정 추가

* [IDLE-518] ddl create 적용

* [IDLE-518] private_key.pem 파일을 통해 접근하도록 수정

* [IDLE-518] 호스트키 체크 우회 수정

* [IDLE-518] SSH 세션에 터미널을 할당하도록 옵션 추가

* [IDLE-518] 터널링 방법을 수정

* [IDLE-518] Private Subnet에 존재하는 서버의 22번 포트를 로컬 2222 포트로 연결

* [IDLE-518] .env파일 생성하는 명령어 수정

* [IDLE-518] 들여쓰기 수정

* [IDLE-518] INPUT_으로 시작하는 항목, .env 파일에 제외

* [IDLE-518] null 값을 제외하는 처리를 추가

* [IDLE-518] 병합 전에 null 값을 제외하는 처리를 추가

* [IDLE-518] context 출력문 추가

* [IDLE-518] JSON 형식으로 변환한 후, SSH 스크립트 내부에서 이를 파일로 저장

* [IDLE-518] .env 파일에 INSTANCE_PEM_KEY가 들어가지 않도록 수정

* [IDLE-518] ddl을 validate으로 수정

* [IDLE-518] 브랜치 push시에 동작하도록 수정

---------

Co-authored-by: wonjunYou <[email protected]>
Co-authored-by: Wonjun You <[email protected]>
  • Loading branch information
3 people authored Jan 19, 2025
1 parent 47122c0 commit 6c6eb7c
Show file tree
Hide file tree
Showing 20 changed files with 393 additions and 64 deletions.
8 changes: 4 additions & 4 deletions .github/workflows/dev-server-deployer.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -86,9 +86,9 @@ jobs:
key: ${{ secrets.INSTANCE_PEM_KEY }}
envs: VARS_CONTEXT,SECRETS_CONTEXT
script: |
cd ~/app/docker
cd ~/app/docker/idle-presentation
jq -s '.[0] * .[1]' <(echo "$VARS_CONTEXT") <(echo "$SECRETS_CONTEXT") \
| jq -r 'to_entries | map("\(.key)=\(.value)") | .[]' > .env
| jq -r 'to_entries | map(select(.key != "INSTANCE_PEM_KEY")) | map("\(.key)=\(.value)") | .[]' > .env
- name: Run Docker Compose up
uses: appleboy/ssh-action@master
Expand All @@ -98,8 +98,8 @@ jobs:
key: ${{ secrets.INSTANCE_PEM_KEY }}
script: |
echo "${{ secrets.DOCKER_PASSWORD }}" | sudo docker login -u ${{ secrets.DOCKER_USERNAME }} --password-stdin
sudo docker-compose -f ~/app/docker/compose-dev.yaml pull
sudo docker-compose -f ~/app/docker/compose-dev.yaml up -d --force-recreate
sudo docker-compose -f ~/app/docker/idle-presentation/compose-dev.yaml pull
sudo docker-compose -f ~/app/docker/idle-presentation/compose-dev.yaml up -d --force-recreate
- name: Remove GitHub Actions IP
run: |
Expand Down
12 changes: 6 additions & 6 deletions .github/workflows/dev-server-integrator.yaml
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
name: Develop Server Integrator (CI)

on:
push:
branches:
- develop
on: workflow_dispatch
# push:
# branches:
# - develop

jobs:
build_and_push:
Expand All @@ -29,7 +29,7 @@ jobs:
env:
REGISTRY: ${{ steps.login-ecr-public.outputs.registry }}
REGISTRY_ALIAS: ${{ secrets.ECR_REGISTRY_ALIAS }}
REPOSITORY: idle-ecr
REPOSITORY: caremeet
IMAGE_TAG: latest
run: |
echo "REPOSITORY: $REPOSITORY"
Expand All @@ -38,4 +38,4 @@ jobs:
echo "::set-output name=image::$REGISTRY/$REGISTRY_ALIAS/$REPOSITORY:$IMAGE_TAG"
- name: Logout of Amazon ECR
run: docker logout ${{ env.ECR_REGISTRY }}
run: docker logout ${{ env.ECR_REGISTRY }}
118 changes: 80 additions & 38 deletions .github/workflows/prod-server-deployer.yaml
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
name: Production Server Deployer (CD)

on: workflow_dispatch
on:
push:
branches:
- main
jobs:
deploy:
runs-on: ubuntu-latest
Expand Down Expand Up @@ -43,64 +46,103 @@ jobs:
--port 22 \
--cidr ${{ steps.publicip.outputs.ip }}/32
- name: Install Docker if not present
- name: SSH to Bastion and Install Docker if not present on Production server
uses: appleboy/[email protected]
with:
host: ${{ vars.INSTANCE_HOST }}
username: ${{ vars.INSTANCE_USERNAME }}
host: ${{ vars.BASTION_HOST }}
username: ${{ vars.BASTION_USERNAME }}
key: ${{ secrets.INSTANCE_PEM_KEY }}
script: |
if ! command -v docker >/dev/null 2>&1; then
echo "Installing Docker..."
sudo apt-get update
sudo apt-get install -y docker.io
else
echo "Docker already installed."
fi
if ! command -v docker-compose >/dev/null 2>&1; then
echo "Installing Docker Compose..."
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
else
echo "Docker Compose already installed."
if [ ! -f private_key.pem ]; then
echo "${{ secrets.INSTANCE_PEM_KEY }}" > private_key.pem
chmod 600 private_key.pem
fi
ssh -f -N -M -S my-cicd-socket -o StrictHostKeyChecking=no -i private_key.pem -L 2222:${{ vars.INSTANCE_HOST }}:22 ec2-user@${{ vars.BASTION_HOST }}
ssh -o StrictHostKeyChecking=no -i private_key.pem -p 2222 ubuntu@localhost << 'EOF'
echo "Connected to Private Subnet productionServer via SSH Tunneling"
if ! command -v docker >/dev/null 2>&1; then
echo "Installing Docker..."
sudo apt-get update
sudo apt-get install -y docker.io
else
echo "Docker already installed."
fi
if ! command -v docker-compose >/dev/null 2>&1; then
echo "Installing Docker Compose..."
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
else
echo "Docker Compose already installed."
fi
EOF
ssh -S my-cicd-socket -O exit ec2-user@${{ vars.BASTION_HOST }}
rm -f private_key.pem
- name: Configuration Env file
uses: appleboy/ssh-action@master
env:
VARS_CONTEXT: ${{ toJson(vars) }}
SECRETS_CONTEXT: ${{ toJson(secrets) }}
with:
host: ${{ vars.INSTANCE_HOST }}
username: ${{ vars.INSTANCE_USERNAME }}
host: ${{ vars.BASTION_HOST }}
username: ${{ vars.BASTION_USERNAME }}
key: ${{ secrets.INSTANCE_PEM_KEY }}
envs: VARS_CONTEXT,SECRETS_CONTEXT
script: |
cd ~/app/docker
jq -s '.[0] * .[1] | del(.INSTANCE_PEM_KEY)' <(echo "$VARS_CONTEXT") <(echo "$SECRETS_CONTEXT") \
| jq -r 'to_entries | map("\(.key)=\(.value)") | .[]' > .env
if [ ! -f private_key.pem ]; then
echo "${{ secrets.INSTANCE_PEM_KEY }}" > private_key.pem
chmod 600 private_key.pem
fi
ssh -f -N -M -S my-cicd-socket -o StrictHostKeyChecking=no -i private_key.pem -L 2222:${{ vars.INSTANCE_HOST }}:22 ec2-user@${{ vars.BASTION_HOST }}
ssh -o StrictHostKeyChecking=no -i private_key.pem -p 2222 ubuntu@localhost << 'EOF'
echo "Connected to Private Subnet productionServer via SSH Tunneling"
cd ~/app/docker
echo "VARS_CONTEXT: ${{ toJson(vars) }}"
echo "SECRETS_CONTEXT: ${{ toJson(secrets) }}"
VARS_CONTEXT_JSON='${{ toJson(vars) }}'
SECRETS_CONTEXT_JSON='${{ toJson(secrets) }}'
- name: Run Docker
echo "$VARS_CONTEXT_JSON" > vars_context.json
echo "$SECRETS_CONTEXT_JSON" > secrets_context.json
jq -s '.[0] * .[1]' vars_context.json secrets_context.json \
| jq -r 'to_entries | map(select(.key != "INSTANCE_PEM_KEY")) | map("\(.key)=\(.value)") | .[]' > .env
echo ".env file generated:"
cat .env
EOF
ssh -S my-cicd-socket -O exit ec2-user@${{ vars.BASTION_HOST }}
rm -f private_key.pem
- name: SSH to Bastion and deploy to Production server
uses: appleboy/ssh-action@master
with:
host: ${{ vars.INSTANCE_HOST }}
username: ${{ vars.INSTANCE_USERNAME }}
host: ${{ vars.BASTION_HOST }}
username: ${{ vars.BASTION_USERNAME }}
key: ${{ secrets.INSTANCE_PEM_KEY }}
script: |
sudo docker login -u ${{ secrets.DOCKER_USERNAME }} -p ${{ secrets.DOCKER_PASSWORD }}
sudo docker pull public.ecr.aws/f5q3r6m5/idle-prod-ecr:latest
if [ $(sudo docker ps -q -f name=caremeet_server_prod) ]; then
sudo docker stop caremeet_server_prod
sudo docker rm caremeet_server_prod
if [ ! -f private_key.pem ]; then
echo "${{ secrets.INSTANCE_PEM_KEY }}" > private_key.pem
chmod 600 private_key.pem
fi
sudo docker run --name caremeet_server_prod --env-file ./app/docker/.env \
-e SPRING_PROFILES_ACTIVE=prod \
-d -p 8080:8080 public.ecr.aws/f5q3r6m5/idle-prod-ecr:latest
ssh -f -N -M -S my-cicd-socket -o StrictHostKeyChecking=no -i private_key.pem -L 2222:${{ vars.INSTANCE_HOST }}:22 ec2-user@${{ vars.BASTION_HOST }}
ssh -o StrictHostKeyChecking=no -i private_key.pem -p 2222 ubuntu@localhost << 'EOF'
echo "Connected to Private Subnet productionServer via SSH Tunneling"
sudo docker login -u ${{ secrets.DOCKER_USERNAME }} -p ${{ secrets.DOCKER_PASSWORD }}
sudo docker pull public.ecr.aws/e4z1s9l7/caremeet:latest
if [ $(sudo docker ps -q -f name=caremeet_server_prod) ]; then
sudo docker stop caremeet_server_prod
sudo docker rm caremeet_server_prod
fi
sudo docker run --name caremeet_server_prod --env-file ./app/docker/.env \
-e SPRING_PROFILES_ACTIVE=prod \
-d -p 8080:8080 public.ecr.aws/e4z1s9l7/caremeet:latest
EOF
ssh -S my-cicd-socket -O exit ec2-user@${{ vars.BASTION_HOST }}
rm -f private_key.pem
- name: Remove GitHub Actions IP
run: |
aws ec2 revoke-security-group-ingress \
--group-id ${{ secrets.SECURITY_GROUP_ID }} \
--protocol tcp \
--port 22 \
--cidr ${{ steps.publicip.outputs.ip }}/32
--cidr ${{ steps.publicip.outputs.ip }}/32
10 changes: 5 additions & 5 deletions .github/workflows/prod-server-integrator.yaml
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
name: Production Server Integrator (CI)

on:
push:
branches:
- main
on: workflow_dispatch
# push:
# branches:
# - main

jobs:
build_and_push:
Expand All @@ -29,7 +29,7 @@ jobs:
env:
REGISTRY: ${{ steps.login-ecr-public.outputs.registry }}
REGISTRY_ALIAS: ${{ secrets.ECR_REGISTRY_ALIAS }}
REPOSITORY: idle-prod-ecr
REPOSITORY: caremeet
IMAGE_TAG: latest
run: |
echo "REPOSITORY: $REPOSITORY"
Expand Down
1 change: 1 addition & 0 deletions gradle/libs.versions.toml
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,7 @@ kotest-assertions-core = { group = "io.kotest", name = "kotest-assertions-core",
kotest-extensions-spring = { group = "io.kotest.extensions", name = "kotest-extensions-spring", version.ref = "kotest-extensions-spring" }
spring-boot-starter-actuator = { group = "org.springframework.boot", name = "spring-boot-starter-actuator", version.ref = "spring-boot" }
spring-boot-starter-test = { group = "org.springframework.boot", name = "spring-boot-starter-test", version.ref = "spring-boot" }
spring-boot-starter-websocket = { group = "org.springframework.boot", name = "spring-boot-starter-websocket", version.ref = "spring-boot" }
kotest-extensions-testcontainers = { group = "io.kotest.extensions", name = "kotest-extensions-testcontainers", version.ref = "kotest-extensions-testcontainers" }
testcontainers-junit-jupiter = { group = "org.testcontainers", name = "junit-jupiter", version.ref = "testcontainers" }

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package com.swm.idle.application.chat.domain

import com.swm.idle.domain.chat.entity.jpa.ChatMessage
import com.swm.idle.domain.chat.enums.SenderType
import org.springframework.stereotype.Service
import java.util.*

@Service
class ChatMessageService {

fun createByUser(roomId: UUID, userId: UUID, contents: List<ChatMessage.Content>): ChatMessage {
return ChatMessage(
roomId = roomId,
senderId = userId,
senderType = SenderType.USER,
contents = contents
)
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package com.swm.idle.application.chat.facade

import com.swm.idle.application.chat.domain.ChatMessageService
import com.swm.idle.domain.chat.entity.jpa.ChatMessage
import com.swm.idle.domain.chat.event.ChatMessageRedisPublisher
import org.springframework.stereotype.Service
import java.util.*

@Service
class ChatMessageFacadeService(
private val chatMessageRedisPublisher: ChatMessageRedisPublisher,
private val chatMessageService: ChatMessageService,
) {

fun sendTextMessage(
roomId: UUID,
senderId: UUID,
contents: List<ChatMessage.Content>,
) {
chatMessageService.createByUser(
roomId = roomId,
userId = senderId,
contents = contents,
).also {
chatMessageRedisPublisher.publish(it)
}
}

fun saveMessage(chatMessage: ChatMessage) {
// TODO : 메세지 저장 로직 구현
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.swm.idle.application.chat.facade

import org.springframework.stereotype.Service

@Service
class ChatRoomFacadeService {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package com.swm.idle.domain.chat.config

import com.swm.idle.domain.chat.event.ChatMessageRedisConsumer
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
import org.springframework.data.redis.connection.RedisConnectionFactory
import org.springframework.data.redis.listener.ChannelTopic
import org.springframework.data.redis.listener.RedisMessageListenerContainer
import org.springframework.data.redis.listener.adapter.MessageListenerAdapter

@Configuration
class ChatMessageRedisConfig {

@Bean
fun redisListenerContainer(
connectionFactory: RedisConnectionFactory,
messageListenerAdapter: MessageListenerAdapter,
): RedisMessageListenerContainer {
val container = RedisMessageListenerContainer()
container.setConnectionFactory(connectionFactory)
container.addMessageListener(messageListenerAdapter, chatChannelTopic())
return container
}

@Bean
fun messageListenerAdapter(chatMessageRedisConsumer: ChatMessageRedisConsumer): MessageListenerAdapter {
return MessageListenerAdapter(chatMessageRedisConsumer)
}

@Bean
fun chatChannelTopic(): ChannelTopic {
return ChannelTopic(CHAT_MESSAGE)
}

companion object {

const val CHAT_MESSAGE = "chat_message"

}

}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ package com.swm.idle.domain.chat.entity.jpa

import com.swm.idle.domain.chat.enums.ContentType
import com.swm.idle.domain.chat.enums.SenderType
//import com.swm.idle.domain.chat.vo.Content
import com.swm.idle.domain.common.entity.BaseEntity
import jakarta.persistence.Column
import jakarta.persistence.Entity
Expand Down Expand Up @@ -43,6 +42,12 @@ class ChatMessage(
data class Content(
val type: ContentType,
val value: String,
)
) {

init {
require(value.isNotBlank()) { "채팅 메세지는 최소 1자 이상 입력해 주셔야 합니다." }
require(value.length <= 500) { "채팅 메세지는 500자를 초과할 수 없습니다." }
}
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package com.swm.idle.domain.chat.event

import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.module.kotlin.readValue
import com.swm.idle.domain.chat.entity.jpa.ChatMessage
import io.github.oshai.kotlinlogging.KotlinLogging
import org.springframework.context.ApplicationEventPublisher
import org.springframework.data.redis.connection.Message
import org.springframework.data.redis.connection.MessageListener
import org.springframework.stereotype.Component

@Component
class ChatMessageRedisConsumer(
private val applicationEventPublisher: ApplicationEventPublisher,
private val objectMapper: ObjectMapper,
) : MessageListener {

val logger = KotlinLogging.logger {}

override fun onMessage(
message: Message,
pattern: ByteArray?,
) {
logger.debug { "Received message: $message" }

objectMapper.readValue<ChatMessage>(message.body)
.also { applicationEventPublisher.publishEvent(it) }
}

}
Loading

0 comments on commit 6c6eb7c

Please sign in to comment.