-
Notifications
You must be signed in to change notification settings - Fork 2
1기 마지막 인수인계 자료.
서버 개발 : Nestjs
ORM : typeORM
Database : PostgreSQL
배포 : Docker
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- 배포 방식
- Docker Image Build 배포하고 싶은 버전의 코드를 Docker 이미지 형태로 빌드
- Docker Hub에 Upload
현재 이미지 1.5 버전으로 업로드 되어있음. - Production 서버에 접속하여 해당 이미지 실행
docker run --it --env-file ./.env -d -p 3000:80 --name sopt.org-backend deokam/sopt.org-backend:{배포 버전}
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 사용 현황
- 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 연동 관련
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'
- 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
-
개발서버 공식화
현재 박정무의 개인 AWS 계정과 개인 도메인으로 개발서버를 돌리고 있다.
해당 개발서버와 개발도메인의 공식화가 필요. -
Docker Registry 공식화 Docker 이미지가 박정무 개인 Docker Hub 계정에 배포되어있다.
Docker Hub 계정 공식화가 필요.