Skip to content

ewha-cse-HACK/HACK_Server

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

273 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

🌈 무지개편지

펫로스 극복을 위한 챗봇 서비스

저희 서비스 “무지개편지”의 목표는 펫로스 증후군을 앓는 사람들을 위해 챗봇이 주는 위로를 통해 극복의 토대를 제공하는 것입니다. 사용자들은 다른 사람에게 솔직히 말하기 어렵거나 시간이 많이 지나도 털어내지 못한 감정을 반려동물과의 가상 대화를 통해 부담 없이 털어놓을 수 있고, 이는 펫로스 증후군 극복에 긍정적인 작용을 할 수 있습니다. 시간이 흘러도 여전히 그리운, 당신의 가족이자 기억하고 싶은 이들에게 전하고 싶은 말을 모아 직접 보내보세요. “무지개 편지”는 그 말들이 닿길 기원하며 가상의 답변을 보내드립니다.

🖥️ Demo video

Video Label

🖼️ Project Architecture

image

💪 Teck stack

Server

🌱 Server 구성요소

  • java 17 : 사용한 프로그래밍 언어
  • springboot (3.1.1) : 프레임워크
  • JWT : 회원가입 및 로그인시 사용하는 토큰
  • Open AI (GPT-4, DALL-E) : 텍스트 생성을 위한 GPT 4, 이미지 생성을 위한 DALL-E 3 API 활용
  • EC2 : 서버
  • RDS : 데이터베이스
  • S3: 이미지 저장

🧩 사용한 오픈소스

  1. Open AI DALL-E
implementation 'com.theokanning.openai-gpt3-java:client:0.17.0'
implementation 'com.theokanning.openai-gpt3-java:service:0.17.0'

참고 https://velog.io/@minji1289/Springboot-스프링부트로-DALL-E-API-호출하기

2. 로그인 JWT

implementation 'io.jsonwebtoken:jjwt-api:0.11.5’

🌟 How to install

  1. AWS EC2 생성
EC2 name hack_server
AMI Amazon Linux 2023 AMI
Instance Type t2 micro (free tier eligible)
Key Pair Create new key pair
VPC Default
Subnet Default
Auto-assign public IP Enable
Security group SSH, HTTP, HTTPS, 8080

2. RDS 설정
Create method Standard create
Engine option MySQL Community
Templates free tier
DB instance identifier hack-db
Computer Resource Don’t connect to an EC2 compute resource
Public access Yes

3. S3 설정
Bucket name hack-s3bucket
ACLs enable
Block Public Access disable
DeleteObject, GetObject, PutObject에 대해 Allow 권한 설정

4. 도메인 설정
aws route53에서 도메인 구매 후 api.rainbow-letter.com과 rainbow-letter.com 등록


5. EC2 서버에 ssh 접속
ssh -i {pem_key경로} ec2-user@{public_ip}

6. java 17 설치 및 타임존 변경
## ec2에 java 17 설치
sudo yum install java-17-amazon-corretto

java -version //openjdk "17.0.7"

sudo rm /etc/localtime sudo ln -s /usr/share/zoneinfo/Asia/Seoul /etc/localtime date #타임존 확인


7. git 설치
sudo yum install git //git 설치
git --version //설치된 git 버전 확인

8. MySQL 설치
sudo yum localinstall https://dev.mysql.com/get/mysql80-community-release-el9-3.noarch.rpm
    # [제일 최신 버전으로 설치]
sudo yum install mysql-community-server
sudo systemctl start mysqld
sudo systemctl status mysqld

  1. EC2 서버에 application.properties, build.gradle, gradlew, gradle 폴더 추가
    a. open AI AP key
    b. RDS 엔드포인트 및 패스워드
    c. papago API key

  2. 배포 script 작성 후 ./deploy.sh or sh deploy.sh 로 실행
#!/bin/bash
REPOSITORY=/home/ec2-user/app/step1
PROJECT_NAME=HACK_Server
cd $REPOSITORY/$PROJECT_NAME/
echo "> Git Pull"
git pull
echo "> 프로젝트 Build 시작"
./gradlew build
echo "> 디렉토리로 이동"
cd $REPOSITORY
echo "> Build 파일 복사"
cp $REPOSITORY/$PROJECT_NAME/build/libs/*.jar $REPOSITORY/
echo "> 현재 구동중인 애플리케이션 pid 확인"
CURRENT_PID=$(pgrep -fl wow_server.*.jar | grep java | awk '{print $1}')
echo "> 현재 구동중인 애플리케이션pid: $CURRENT_PID"
if [ -z "$CURRENT_PID" ]; then
 echo "> 현재 구동중인 애플리케이션이 없으므로 종료하지 않습니다."
else
 echo "> kill -15 $CURRENT_PID"
 kill -15 $CURRENT_PID
 sleep 5
fi
echo "> 새 애플리케이션 배포"
JAR_NAME=$(ls -tr $REPOSITORY/ | grep jar | head -n 1)
echo "> JAR Name: $JAR_NAME"
nohup java -jar $JAR_NAME &

11. github action을 이용한 자동 배포
a. Github Repository의 Settings > Secrets and variables > Actions에 “Repository secrets" 3가지 추가
- HOST = EC2 인스턴스의 public IP
- USER = 사용자 (보통은 ec2-user)
- SSH_PRIVATE_KEY = `.pem` 키 파일 내용

b. github/workflows 폴더 생성 후 main.yml 파일 아래와 같이 추가

name: WORKFLOW_NAME # workflow 이름 설정

# workflow를 run하는 조건 설정
on:
    push:
        branches: [ main ]  #설정한 workflow run 조건: branch [main]에 push를 할때마다

# workflow가 run할때 실행하는 내용 정의
jobs:
    SSH:
        runs-on: ubuntu-latest # OS(workflow label)

       steps:
         - uses: actions/checkout@v3 #Repository 참고
         - name: ssh to ec2 #EC2에 접속
           uses: appleboy/ssh-action@master #접속 제공 Repository
           with:
             key: ${{ secrets.SSH_PRIVATE_KEY }}    #Repository secrets 사용
             host: ${{ secrets.HOST }}    #Repository secrets 사용
             username: ${{ secrets.USER }}    #Repository secrets 사용
             script: | #실행할 코드
               cd /home/ec2-user/app/step1    #배포 스크립트 파일이 있는 폴더로 이동
               sh deploy.sh    #배포 스크립트 파일 실행
            
               #기존 deploy.sh 파일에서 nohup 명령어를 포함한 line을 지우고, 아래와 같이 `.yml` 스크립트 파일에 추가
               nohup java -jar wow_server-0.0.1-SNAPSHOT.jar > nohup.out 2> nohup.err < /dev/null &
   

c. 기존 deploy.sh 파일에서 nohup 부분 주석 처리

 ## nohup java -jar $JAR_NAME &

🌤️ How to build

  1. git clone https://github.com/ewha-cse-HACK/HACK_Server.git
  2. application.properties 파일 설정
    a. openAI api key
    b. rds 혹은 local db 엔드포인트 및 패스워드
    c. papago api key
  3. 어플리케이션 실행
  4. postman에서 http://localhost:8080/{테스트할_URL} 을 통해 API 조회
  5. postman 혹은 chrome에서 https://api.rainbow-letter.com/{테스트할_URL} 을 통해 API 조회

🎮 How to test

API 명세서

  1. postman에서 http://localhost:8080/{테스트하고_싶은_api} 를 통해 API 조회
  2. postman 혹은 chrome에서 https://api.rainbow-letter.com/{테스트할_URL}을 통해 API 조회

🌳 Source Code tree

├── settings.gradle
└── src
    ├── main
    │   ├── java
    │   │   └── com
    │   │       └── hack
    │   │           └── hack_server
    │   │               ├── Authentication
    │   │               │   ├── Controller
    │   │               │   │   └── UserController.java
    │   │               │   ├── Dto
    │   │               │   │   ├── JoinRequestDto.java
    │   │               │   │   └── LoginRequestDto.java
    │   │               │   ├── JwtAuthenticationFilter.java
    │   │               │   ├── JwtAuthorizationFilter.java
    │   │               │   ├── JwtProvider.java
    │   │               │   ├── PrincipalDetails.java
    │   │               │   └── Service
    │   │               │       ├── PrincipalDetailsService.java
    │   │               │       └── UserService.java
    │   │               ├── ChatGpt
    │   │               │   ├── ChatGptConfig.java
    │   │               │   ├── Controller
    │   │               │   │   └── ChatGptController.java
    │   │               │   ├── Dto
    │   │               │   │   ├── ChatGptAnswerResponseDto.java
    │   │               │   │   ├── ChatGptRequestDto.java
    │   │               │   │   ├── ChatGptResponseDto.java
    │   │               │   │   ├── Choice.java
    │   │               │   │   ├── DalleAnswerResponseDto.java
    │   │               │   │   ├── MessageRequestDto.java
    │   │               │   │   ├── MessageResponseDto.java
    │   │               │   │   └── QuestionRequestDto.java
    │   │               │   └── Service
    │   │               │       └── ChatGptService.java
    │   │               ├── Community
    │   │               │   ├── Comment
    │   │               │   │   ├── Controller
    │   │               │   │   │   └── CommentController.java
    │   │               │   │   ├── Dto
    │   │               │   │   │   ├── CommentSaveRequestDto.java
    │   │               │   │   │   └── CommentUpdateRequestDto.java
    │   │               │   │   └── Service
    │   │               │   │       └── CommentService.java
    │   │               │   └── Post
    │   │               │       ├── Controller
    │   │               │       │   └── PostController.java
    │   │               │       ├── Dto
    │   │               │       │   ├── CommentDto.java
    │   │               │       │   ├── PostAddRequestDto.java
    │   │               │       │   ├── PostDetailResponseDto.java
    │   │               │       │   ├── PostImageDto.java
    │   │               │       │   ├── PostListResponseDto.java
    │   │               │       │   ├── PostModifyRequestDto.java
    │   │               │       │   └── PostResponseDto.java
    │   │               │       └── Service
    │   │               │           └── PostService.java
    │   │               ├── Dalle
    │   │               │   ├── Controller
    │   │               │   │   └── ImageGeneratorController.java
    │   │               │   ├── Dto
    │   │               │   │   ├── JournalCommentDto.java
    │   │               │   │   ├── JournalCommentResponseDto.java
    │   │               │   │   ├── JournalListDto.java
    │   │               │   │   ├── JournalListPageResponseDto.java
    │   │               │   │   ├── JournalListResponseDto.java
    │   │               │   │   └── JournalResponseDto.java
    │   │               │   ├── Service
    │   │               │   │   ├── AIService.java
    │   │               │   │   └── JournalService.java
    │   │               │   └── ServicesConfig.java
    │   │               ├── Entity
    │   │               │   ├── BaseTimeEntity.java
    │   │               │   ├── Comment.java
    │   │               │   ├── Heart.java
    │   │               │   ├── Journal.java
    │   │               │   ├── JournalComment.java
    │   │               │   ├── Pet.java
    │   │               │   ├── Post.java
    │   │               │   ├── PostImage.java
    │   │               │   └── User.java
    │   │               ├── Global
    │   │               │   ├── Config
    │   │               │   │   ├── JpaConfig.java
    │   │               │   │   └── SecurityConfig.java
    │   │               │   └── S3
    │   │               │       ├── S3Config.java
    │   │               │       ├── S3ImageController.java
    │   │               │       └── S3Uploader.java
    │   │               ├── HackServerApplication.java
    │   │               ├── MyPage
    │   │               │   ├── Controller
    │   │               │   │   └── MyPageController.java
    │   │               │   ├── Dto
    │   │               │   │   ├── MyPageRequestDto.java
    │   │               │   │   ├── NickNameModifyRequestDto.java
    │   │               │   │   └── ProfileImageModifyRequestDto.java
    │   │               │   └── Service
    │   │               │       └── MyPageService.java
    │   │               ├── Papago
    │   │               │   ├── NaverTransService.java
    │   │               │   └── PapagoController.java
    │   │               ├── Persona
    │   │               │   ├── Controller
    │   │               │   │   └── PersonaController.java
    │   │               │   ├── Dto
    │   │               │   │   ├── PersonaDto.java
    │   │               │   │   ├── PersonaListRequestDto.java
    │   │               │   │   ├── PetRequestDto.java
    │   │               │   │   └── SpeciesRequestDto.java
    │   │               │   └── Service
    │   │               │       └── PersonaService.java
    │   │               └── Repository
    │   │                   ├── CommentRepository.java
    │   │                   ├── HeartRepository.java
    │   │                   ├── JournalCommentRepository.java
    │   │                   ├── JournalRepository.java
    │   │                   ├── PetRepository.java
    │   │                   ├── PostImageRepository.java
    │   │                   ├── PostRepository.java
    │   │                   └── UserRepository.java
    │   └── resources
    │       ├── application.properties
    │       ├── static
    │       └── templates
  • Authentication: 로그인/회원가입
  • ChatGpt: 채팅
  • Community: 커뮤니티
  • Dalle: 일기 훔쳐보기
  • MyPage: 마이페이지
  • Papago: Papago API 호출
  • Persona: 페르소나 생성

👍 Developers

김민지 최유나 하윤지
Server
AI
Client
Design
Server
AI

About

Server side of Rainbow Letter

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages