오픈소스 프로젝트 Nestjs-boilerplate를
분석하기에 앞서 clone받아 작성된 문서, docker관련 파일을 살펴보고 로컬 환경에서 실행해보는 작업을 해보겠습니다.
dockercompose & dockerfile 파악하기
docker compose
docker compose는 총 4개의 서비스를 오케스트레이션합니다.
services:
postgres:
image: postgres:16.1-alpine
ports:
- ${DATABASE_PORT}:5432
volumes:
- boilerplate-db:/var/lib/postgresql/data
environment:
POSTGRES_USER: ${DATABASE_USERNAME}
POSTGRES_PASSWORD: ${DATABASE_PASSWORD}
POSTGRES_DB: ${DATABASE_NAME}
maildev:
build:
context: .
dockerfile: maildev.Dockerfile
ports:
- ${MAIL_CLIENT_PORT}:1080
- ${MAIL_PORT}:1025
adminer:
image: adminer
restart: always
ports:
- 8080:8080
# Uncomment to use redis
# redis:
# image: redis:7-alpine
# ports:
# - 6379:6379
api:
build:
context: .
dockerfile: Dockerfile
ports:
- ${APP_PORT}:${APP_PORT}
volumes:
boilerplate-db:
각 서비스들을 살펴보면
- PostgreSQL 서비스:
PostgreSQL 데이터베이스 컨테이너를 실행합니다.**postgres:16.1-alpine
를 기반이미지로 사용하며, 데이터베이스가 **/var/lib/postgresql/data
에 저장되고${DATABASE_PORT}
포트로 외부와 통신합니다.(데이터를 영속적으로 저장하기 위해 volumes 명시한 부분) - Maildev 서비스:
로컬에서 이메일을 개발 및 디버깅하기 위한 Maildev를 실행합니다.maildev.Dockerfile
을 사용하여 빌드하고${MAIL_CLIENT_PORT}
와${MAIL_PORT}
포트로 통신하며 1080포트로 웹 ui에 접속할 수 있습니다. - Adminer 서비스:
데이터베이스를 시각화하고 관리하기 위한 Adminer를 실행합니다.adminer
이미지를 사용하여 8080 포트로 접속 가능합니다. - API 서비스:
NestJS API를 실행하기 위한 서비스가 구성되었습니다.
이 서비스는 Dockerfile을 사용하여 빌드되고${APP_PORT}
포트로 외부와 통신합니다.
Dockerfile
# 기반 이미지 선택
FROM node:20.10.0-alpine
RUN apk add --no-cache bash
RUN npm i -g @nestjs/cli typescript ts-node
# app 종속성 설치
COPY package*.json /tmp/app/
RUN cd /tmp/app && npm install
# 실행에 필요한 스크립트 복사 및 준비
COPY . /usr/src/app
RUN cp -a /tmp/app/node_modules /usr/src/app
COPY ./wait-for-it.sh /opt/wait-for-it.sh
RUN chmod +x /opt/wait-for-it.sh
COPY ./startup.relational.dev.sh /opt/startup.relational.dev.sh
RUN chmod +x /opt/startup.relational.dev.sh
RUN sed -i 's/\r//g' /opt/wait-for-it.sh
RUN sed -i 's/\r//g' /opt/startup.relational.dev.sh
WORKDIR /usr/src/app
RUN if [ ! -f .env ]; then cp env-example-relational .env; fi
RUN npm run build
CMD ["/opt/startup.relational.dev.sh"]
wait-for-it.sh
: 스크립트로 db에 종속적으로 nest가 실행되도록 합니다.startup.relational.dev.sh
: wait-for-it.sh를 실행하고 db마이그레션, 시딩을 진행합니다.
ps. 해당 프로젝트는 mongoDB도 지원하며 startup.document.dev.sh, docker-compose.document.yaml, document.Dockerfile 따로 mongoDB용 파일이 작성되어있습니다.
위와 같은 dockerfile, docker-compose를 작성하여 프로젝트를 실행하는걸로 파악됩니다.
이제 진짜 실행해보고 결과를 확인해보겠습니다.
nest, postgresql 실행하기
1. 저장소 clone받기
git clone https://github.com/brocoders/nestjs-boilerplate my-app
cd my-app
cp env-example-relational .env
2. env파일 복사 및 실행위한 환경변수 변경
cd my-app
cp env-example-relational .env
DATABASE_HOST=postgres를 DATABASE_HOST=localhost로 변경
MAIL_HOST=maildev를 MAIL_HOST=localhost로 변경
3. postgres adminer maildev 서비스 컨테이너 올리기(api는 로컬에서 실행)
docker compose up -d postgres adminer maildev
4. 종속성 설치 및 실행
추가로 postgres 마이그레이션, 기본 데이터 시딩까지 실행해줍니다.
npm install
npm run migration:run
npm run seed:run:relational
npm run start:dev
아래는 실행중 종속성 문제로 에러가 발생한 모습입니다.
문제가 되는 패키지를 npm install해서 해결해줍니다.
[오후 10:48:43] Starting compilation in watch mode...
[오후 10:48:45] Found 0 errors. Watching for file changes.
Error: Cannot find module '@aws-sdk/abort-controller'
Require stack:
- /Users/lks/project/my-app2/node_modules/@aws-sdk/lib-storage/dist-cjs/Upload.js
- /Users/lks/project/my-app2/node_modules/@aws-sdk/lib-storage/dist-cjs/index.js
- /Users/lks/project/my-app2/node_modules/multer-s3/index.js
- /Users/lks/project/my-app2/dist/files/files.module.js
- /Users/lks/project/my-app2/dist/users/users.module.js
- /Users/lks/project/my-app2/dist/app.module.js
- /Users/lks/project/my-app2/dist/main.js
at Function.Module._resolveFilename (node:internal/modules/cjs/loader:1144:15)
at Function.Module._load (node:internal/modules/cjs/loader:985:27)
at Module.require (node:internal/modules/cjs/loader:1235:19)
at require (node:internal/modules/helpers:176:18)
at Object.<anonymous> (/Users/lks/project/my-app2/node_modules/@aws-sdk/lib-storage/dist-cjs/Upload.js:4:28)
at Module._compile (node:internal/modules/cjs/loader:1376:14)
at Object.Module._extensions..js (node:internal/modules/cjs/loader:1435:10)
at Module.load (node:internal/modules/cjs/loader:1207:32)
at Function.Module._load (node:internal/modules/cjs/loader:1023:12)
at Module.require (node:internal/modules/cjs/loader:1235:19)
npm install @aws-sdk/abort-controller
서비스 별로 실행 확인하기
1. API 서비스
2. swagger 문서에 접속하기
작성된 swagger api문서를 확인할 수 있습니다.
3. adminer 서비스
http://localhost:8080/
adminer서비스에 접속해 마이그레이션된 모습을 확인할 수 있습니다.
4. maildev 서비스
http://localhost:1080/
방금 실행해서 아무 메일도 없지만 1080port에 접속이 잘되는 모습을 볼 수 있습니다.
'etc' 카테고리의 다른 글
오픈 소스 분석하기(1) - 프로젝트 선정 및 Overview (0) | 2024.01.02 |
---|---|
https (0) | 2023.07.01 |
퍼페티어(puppeteer)사용하여 크롤링 하기 (1) | 2023.03.12 |
인증과 인가 (0) | 2022.07.24 |
OOP(객체 지향 프로그래밍)이란? with typescript (0) | 2022.05.29 |