Skip to content

1기 마지막 인수인계 자료.

qkrwjdan edited this page Jan 7, 2023 · 1 revision

기술 스택

서버 개발 : Nestjs
ORM : typeORM
Database : PostgreSQL
배포 : Docker

개발 Repository

https://github.com/sopt-makers/sopt.org-backend

도메인 현황

development 도메인 : dguchatbot.com
production 도메인 : sopt.org

데이터베이스 배포 현황

sopt 메이커스 공식 AWS 계정에 RDS로 배포되어있음.

  • 이메일 알려주시면 해당 정보에 대한 노션 페이지에 접근할 수 있는 권한을 드립니다.

서버 배포 현황

  • 개발서버 박정무 개인의 AWS 계정에서 동작중.
    AWS Elastic Beanstalk + AWS Codepipeline 서비스를 사용해 CI/CD 구현
    develop branch에 반영되는 경우 CI/CD로 개발서버에 자동 배포됨.

  • production 서버 AWS EC2 Instance에 Docker 이미지를 사용해 배포중.
    CI/CD 구현 X

    • 배포 방식
    1. Docker Image Build 배포하고 싶은 버전의 코드를 Docker 이미지 형태로 빌드
    2. Docker Hub에 Upload
      스크린샷 2023-01-08 오전 1 51 16
      현재 이미지 1.5 버전으로 업로드 되어있음.
    3. Production 서버에 접속하여 해당 이미지 실행
      docker run --it --env-file ./.env -d -p 3000:80 --name sopt.org-backend deokam/sopt.org-backend:{배포 버전}

백엔드 API 명세서

development API 명세서 : https://dev.dguchatbot.com/api-docs
production API 명세서 : https://api.sopt.org/api-docs

development API host : https://dev.dguchatbot.com/
production API host : https://api.sopt.org/

API 사용 현황

  • API 사용 현황
    • GET / Health Check Url로 사용
    • GET /partners
    • GET /logos
    • GET /cooperation-projects
    • GET /projects
    • GET /projects/{projectId}
    • GET /semesters
    • GET /semesters/{semesterId}

백엔드 서버 배포 현황

Docker Image Link : https://hub.docker.com/repository/docker/deokam/sopt.org-backend

지금까지 겪은 문제 및 해결방법

  • 기존 배포 방식의 문제 기존 백엔드 서버는 pm2를 사용해 배포되고 있었으며, 간헐적으로 다음 에러가 발생하며 서버가 죽는 현상이 발생했다.

    Please make sure your database server is running at `{db url}`:`db port`.^[[39m
    Error:
    Invalid `prisma.logo.aggregate()` invocation:
    
      Can't reach database server at `db url`:`db port`
    
    Please make sure your database server is running at `db url`:`db port`.
        at RequestHandler.handleRequestError (/home/ubuntu/sopt.org-backend/node_modules/@prisma/client/runtime/index.js:49670:13)
        at RequestHandler.request (/home/ubuntu/sopt.org-backend/node_modules/@prisma/client/runtime/index.js:49652:12)
        at async PrismaService._request (/home/ubuntu/sopt.org-backend/node_modules/@prisma/client/runtime/index.js:50572:18)
    Error: ENFILE: file table overflow, uv_resident_set_memory
        at memoryUsage (<anonymous>)
        at process.memoryUsage (node:internal/process/per_thread:170:5)
        at ConsoleReporter.checkPeakMemory (/home/ubuntu/.nvm/versions/node/v16.17.0/lib/node_modules/yarn/lib/cli.js:33421:40)
        at Timeout._onTimeout (/home/ubuntu/.nvm/versions/node/v16.17.0/lib/node_modules/yarn/lib/cli.js:33414:13)
        at listOnTimeout (node:internal/timers:559:17)
        at processTimers (node:internal/timers:502:7) {
      errno: -23,
      code: 'ENFILE',
      syscall: 'uv_resident_set_memory'
    }
    Error: ENFILE: file table overflow, uv_resident_set_memory
        at memoryUsage (<anonymous>)
        at process.memoryUsage (node:internal/process/per_thread:170:5)
        at ConsoleReporter.checkPeakMemory (/home/ubuntu/.nvm/versions/node/v16.17.0/lib/node_modules/yarn/lib/cli.js:33421:40)
        at Timeout._onTimeout (/home/ubuntu/.nvm/versions/node/v16.17.0/lib/node_modules/yarn/lib/cli.js:33414:13)
        at listOnTimeout (node:internal/timers:559:17)
        at processTimers (node:internal/timers:502:7) {
      errno: -23,
      code: 'ENFILE',
      syscall: 'uv_resident_set_memory'
    }
    error Couldn't find a package.json file in "/home/ubuntu"
    error Couldn't find a package.json file in "/home/ubuntu"
    error Couldn't find a package.json file in "/home/ubuntu"
    Error: ENFILE: file table overflow, uv_resident_set_memory
        at memoryUsage (<anonymous>)
        at process.memoryUsage (node:internal/process/per_thread:170:5)
        at ConsoleReporter.checkPeakMemory (/home/ubuntu/.nvm/versions/node/v16.17.0/lib/node_modules/yarn/lib/cli.js:33421:40)
        at Timeout._onTimeout (/home/ubuntu/.nvm/versions/node/v16.17.0/lib/node_modules/yarn/lib/cli.js:33414:13)
        at listOnTimeout (node:internal/timers:559:17)
        at processTimers (node:internal/timers:502:7) {
      errno: -23,
      code: 'ENFILE',
      syscall: 'uv_resident_set_memory'

    prisma 관련 error 로 생각되며,
    메이커스 1기 중 ORM 을 prisma → typeorm, 배포 방식을 pm2 → docker로 변경한 뒤에는 해당 에러가 발생하고 있지 않은 상태이다.

  • Playground API 연동 관련
    스크린샷 2023-01-08 오전 2 14 00
    sopt.org/project 페이지에서 playground 팀의 API를 사용해 project를 가져오는데 이 때 playground 팀에서 발급해준 jwt token이 필요함.
    해당 jwt token이 만료되거나, 오류가 있을 경우 다른 API는 동작하는데, project 관련 API 만 동작하지 않는 장애가 발생.
    정상적인 jwt token을 환경변수에 넣어주면 해당 에러 해결.

  • AWS Amplify 두번째 빌드가 안되는 문제.
    sopt.org 프론트엔드는 AWS Amplify 서비스를 사용하여 배포되고 있음.
    Amplify 서비스 이용 시 다음과 같은 build.yaml 파일을 사용해 배포하고 있었음.

    version: 1
    frontend:
      phases:
        preBuild:
          commands:
            - nvm install 16.18.0
            - pnpm install
        build:
          commands:
            - nvm use 16.18.0
            - pnpm run build
      artifacts:
        baseDirectory: .next
        files:
          - '**/*'
      cache:
        paths:
          - node_modules/**/*

    이 때 cache 로 인해 두번째 빌드가 안되는 에러 발생 cache를 지워 해결.

    AWS Amplify build 문제 : cannot find module 'semver/functions/cmp'

Health Check 로직

  • https://api.sopt.org/, https://sopt.org/, https://www.sopt.org/ URL 에 대한 Health Check 로직이 있음.
  • curl 명령어를 통해서 해당 URL 들에 http request를 보내고, status code가 200이 아니라면 slack message를 보내는 로직
  • cron.d를 사용해 1분에 한번씩 health_check.sh 파일을 실행.
  • 해당 시스템은 production API 서버가 실행중인 인스턴스에 설정되어 있다.
  • ~/health_check.sh 파일
"health_check.sh" 26L, 1285C                                                                                                                                           25,12         All
#!/bin/bash
nowdate=$(date +"%Y-%m-%d %H:%M:%S")

url="https://api.sopt.org"
status_code=$(curl -LI ${url} -o /dev/null -w '%{http_code}\n' -s)
if [ $status_code != '200' ]
then
    echo "${nowdate} ${url}에 문제가 있습니다." >> /home/ubuntu/health_log.log
    curl -X POST -H 'Content-type: application/json' --data '{"text":"api.sopt.org에 문제가 있습니다."}' https://hooks.slack.com/services/
fi

url="https://sopt.org"
status_code=$(curl -LI ${url} -o /dev/null -w '%{http_code}\n' -s)
if [ $status_code != '200' ]
then
    echo "${nowdate} ${url}에 문제가 있습니다.." >> /home/ubuntu/health_log.log
    curl -X POST -H 'Content-type: application/json' --data '{"text":"sopt.org에 문제가 있습니다."}' https://hooks.slack.com/services/
fi

url="https://www.sopt.org"
status_code=$(curl -LI ${url} -o /dev/null -w '%{http_code}\n' -s)
if [ $status_code != '200' ]
then
    echo "${nowdate} ${url}에 문제가 있습니다.." >> /home/ubuntu/health_log.log
    curl -X POST -H 'Content-type: application/json' --data '{"text":"www.sopt.org에 문제가 있습니다."}' https://hooks.slack.com/services/
fi
  • crontab -e
스크린샷 2023-01-08 오전 1 53 29 crontab -e 명령어를 실행하면 나타나는 파일

해결해야하는 문제

  • 개발서버 공식화
    현재 박정무의 개인 AWS 계정과 개인 도메인으로 개발서버를 돌리고 있다.
    해당 개발서버와 개발도메인의 공식화가 필요.

  • Docker Registry 공식화 Docker 이미지가 박정무 개인 Docker Hub 계정에 배포되어있다.
    Docker Hub 계정 공식화가 필요.