diff --git a/.github/workflows/cd.develop.yml b/.github/workflows/cd.develop.yml index 141beed..20fefc8 100644 --- a/.github/workflows/cd.develop.yml +++ b/.github/workflows/cd.develop.yml @@ -26,13 +26,19 @@ jobs: - name: Checkout uses: actions/checkout@v2 + - name: Configure AWS credentials + uses: aws-actions/configure-aws-credentials@v1 + with: + aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY }} + aws-secret-access-key: ${{ secrets.AWS_SECRET_KEY }} + - name: Push Image to AWS ECR Public Repo id: ecr-image-push run: | aws ecr-public get-login-password --region ${{ secrets.AWS_PUBLIC_REPO_REGION }} | docker login --username AWS --password-stdin public.ecr.aws/${{ secrets.AWS_ACCOUNT_ID }} - docker build -t ${{ secrets.ECR_REPOSITORY }}:latest . - docker tag ${{ secrets.ECR_REPOSITORY }}:latest public.ecr.aws/${{ secrets.AWS_ACCOUNT_ID }}/${{ secrets.ECR_REPOSITORY }}:latest - docker push public.ecr.aws/${{ secrets.AWS_ACCOUNT_ID }}/${{ secrets.ECR_REPOSITORY }}:latest + docker build -t ${{ secrets.DEV_ECR_REPO }}:latest . + docker tag ${{ secrets.DEV_ECR_REPO }}:latest public.ecr.aws/${{ secrets.AWS_ACCOUNT_ID }}/${{ secrets.DEV_ECR_REPO }}:latest + docker push public.ecr.aws/${{ secrets.AWS_ACCOUNT_ID }}/${{ secrets.DEV_ECR_REPO }}:latest deploy: needs: build @@ -49,6 +55,6 @@ jobs: sudo docker rm dev-server sudo docker rm -f $(docker ps -qa) sudo docker image prune -a -f - sudo docker pull public.ecr.aws/${{ secrets.AWS_ACCOUNT_ID }}/${{ secrets.ECR_REPOSITORY }}:latest - sudo docker run --name dev-server --env-file .env -d -p 3000:3000 -t public.ecr.aws/${{ secrets.AWS_ACCOUNT_ID }}/${{ secrets.ECR_REPOSITORY }}:latest + sudo docker pull public.ecr.aws/${{ secrets.AWS_ACCOUNT_ID }}/${{ secrets.DEV_ECR_REPO }}:latest + sudo docker run --name dev-server --env-file .env -d -p 3000:3000 -t public.ecr.aws/${{ secrets.AWS_ACCOUNT_ID }}/${{ secrets.DEV_ECR_REPO }}:latest diff --git a/README.md b/README.md index 48d7cc6..d8fc186 100644 --- a/README.md +++ b/README.md @@ -1,51 +1,48 @@ # README ## Description -- SoptOfficial 공홈 API 서버 입니다. +- Sopt Official NestJS 공홈 API 서버 입니다. - Package Manager는 ```Yarn Package Manager``` 를 사용합니다. ## INDEX 1. [Getting Started](#Getting-started) -2. [project-structure](#project-structure) -3. [Deploy_Pipeline](#deploy-pipeline) +2. [Project Structure](#Project Structure) +3. [Deploy_Pipeline](#Deploy-Pipeline) # Getting-started -### 1.Local 서버 실행 +### 서버 실행 환경 +- Node v16 +### 서버 실행 ```bash - yarn start:local +# Local + npm run start:local ``` -```yarn start:local``` 를 실행게되면 다음과 같은 작업을 수행합니다. - -1. envs/local.develop.env 파일을 읽어서 환경변수를 root directory에 .env 파일로 copy 합니다. -2. docker-compose를 이용하여 local에 postgresql 데이터베이스 컨테이너를 실행합니다. -3. nestjs가 env파일을 읽어서 local Database에 연결하여 서버를 실행시킵니다. - -### Develop Stage 서버 실행 ```bash - yarn start:develop +# Dev + npm run start:dev ``` - env에 명시된 데이터베이스에 연결되어 서버를 실행합니다. - -> production stage 서버는 직접 실행시키는 script가 없고, ```config:prod``` 명령어로 env파일을 읽어서 실행합니다. > env 과같은 환경 변수는 담당자에게 공유 받으세요. -# project-structure +### OpenAPI +> /api-docs -아키텍처는 다음과 같이 형성되어있습니다. -## dev arichitecture -![img.png](public/dev-structure.png) +# Project Structure -## prod arichitecture -![img_1.png](public/prod-structure.png) +아키텍처는 다음과 같이 형성되어있습니다. +## Architecture +![Sopt_Official_diagram drawio](https://github.com/user-attachments/assets/16103a1c-61c7-4d19-9e81-709aa9e29fc7) - 인스턴스는 EC2 내부에서 동작합니다. -- EC2 내부에 Docker container가 존재하고, 호스트, 컨테이너 포트는 3000:3000으로 포워딩 되어있습니다. -- docker image는 개인 dockerHub에서 관리하고 있고 인수인계시 계정을 전환하는 작업이 필요합니다. +- EC2 내부에 Docker container가 존재합니다. +- NestJS 의 경우, 3000:3000으로 포워딩 및 / route 에 매핑되어 있습니다. +- Spring Boot 의 경우, 8080:8080으로 포워딩 및 /v2 route 에 매핑되어 있습니다. +- Docker image는 AWS Public ECR 에서 관리하고 있고, 인수인계 시 AWS 계정에 PublicECR 관련 IAM Role 을 부여받아야 합니다. -둘다 비슷한 구조를 형성하고있지만 Nginx, ElB 존재 여부의 차이밖에 없습니다. +Dev, Prod 모두 동일한 구조를 형성하고 있고, 리소스 차이밖에 없습니다. -## deploy-pipeline +## Deploy-Pipeline - deploy pipeline은 github action을 이용하여 구성되어있습니다. - github action은 ```./github/workflows``` 에서 확인할 수 있습니다. - workflow 파일은 총 3가지가 있고, 각각 다음과 같은 역할을 합니다. @@ -54,11 +51,11 @@ 3. ```cd.prod.yml``` : main 브랜치에 푸시(또는 머지)가 되었을때마다 수행합니다. production 서버에 배포가 됩니다. - ```cd.***.yml``` workflow는 다음과 같은 동작을 합니다. 1. docker image를 빌드합니다. - 2. docker image를 dockerHub에 push합니다. - 3. EC2에 ssh로 접속하여 dockerHub에서 이미지를 pull합니다. + 2. docker image를 ECR 에 push합니다. + 3. EC2에 ssh로 접속하여 ECR 에서 이미지를 pull합니다. 4. EC2에서 실행중인 container를 종료합니다. - 5. docker container를 실행합니다. -> DockerHub 관련 Secret은, gitHub 관리자에게 문의하여 Owner권한을 획득 후, Repository secret에서 설정하시기 바랍니다. 자세한 설명은 별도로 공유드린 문서에서 확인 하실 수 있습니다. + 5. docker container 를 실행합니다. +> GitAction 관련 Secret은, GitHub 관리자에게 문의하여 Owner권한을 획득 후, Repository secret에서 설정하시기 바랍니다. 자세한 설명은 별도로 공유드린 문서에서 확인 하실 수 있습니다. diff --git a/public/dev-structure.png b/public/dev-structure.png deleted file mode 100644 index bdc476a..0000000 Binary files a/public/dev-structure.png and /dev/null differ diff --git a/public/prod-structure.png b/public/prod-structure.png deleted file mode 100644 index 2c0193a..0000000 Binary files a/public/prod-structure.png and /dev/null differ