오픈소스 프로젝트 Nestjs-boilerplate를

분석하기에 앞서 clone받아 작성된 문서, docker관련 파일을 살펴보고 로컬 환경에서 실행해보는 작업을 해보겠습니다.

 

 

 

 

dockercompose & dockerfile 파악하기

docker-compose의 서비스들 도식화

 

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 서비스

http://localhost:3000/

서버에서 설정한 응답을 확인

 

2. swagger 문서에 접속하기

http://localhost:3000/docs

작성된 swagger api문서를 확인할 수 있습니다.

 

3. adminer 서비스

http://localhost:8080/
adminer서비스에 접속해 마이그레이션된 모습을 확인할 수 있습니다.

adminer에 접속한 모습(table확인 가능)

 

4. maildev 서비스
http://localhost:1080/

방금 실행해서 아무 메일도 없지만 1080port에 접속이 잘되는 모습을 볼 수 있습니다.

 

 

 

 

 

 

 

 

반응형

+ Recent posts