NestJS 모노레포에서 `npm run build api-gateway` 및 Docker 빌드/실행하기

ddoachi·2025년 6월 7일

TekaPicker

목록 보기
21/30

1. 목적

NestJS 기반 모노레포에서 api-gateway 앱을 npm run build로 빌드하고, Docker를 통해 배포 가능한 상태로 만드는 것이 목적임.


2. 전체 과정 요약

2.1 프로젝트 구조 요약

/
├── apps/
│   └── api-gateway/
├── libs/
├── proto/
├── Dockerfile
├── .env
├── tsconfig.base.json

2.2 목표 실행 명령어

npm run build api-gateway
docker build  -t api-gateway -f apps/api-gateway/Dockerfile .
docker run -p 5010:3000 -e PORT=3000 api-gateway

3. 주요 문제와 해결 방안

3.1 상대경로 import 문제

  • import x from "../../../../libs/..." 형태로 작성된 코드가 빌드 후에도 유지되며 오류 발생
  • 해결: tsconfig.json에 path alias 추가
{
  "compilerOptions": {
    "baseUrl": ".",
    "paths": {
      "@grpc-types/*": ["libs/grpc-types/*"],
      "@rest-dto/*": ["libs/rest-dto/*"],
      "@graphql/*": ["libs/graphql/*"]
    }
  }
}
  • 코드 내 import 문 수정
import { LoginRequest } from "@grpc-types/auth";

3.2 불필요한 .js, .js.map 파일 생성

  • 원인: tsconfig.json에서 "outDir"이 설정되지 않았거나, sourcemap:true 였기 때문.
  • 해결: tsconfig.build.jsonoutDir을 명확히 지정하고 ,sourcemap: false 로 변경
{
  "compilerOptions": {
    "outDir": "./dist"
  },
  "exclude": ["node_modules", "dist"]
}

3.3 Dockerfile 내 .proto, .env 누락

  • 문제: 빌드된 Docker 이미지 내에서 proto 폴더가 없다는 오류 발생

  • 해결:

    COPY ./proto ./proto
    COPY .env ./
  • 런타임 이미지에서도 .proto가 필요하면 아래처럼 추가 복사

    COPY --from=builder /app/proto ./proto

3.4 Docker build 후에도 경로 오류 지속

  • 문제: Cannot find module '../../../../libs/grpc-types/auth'
  • 원인: 캐시된 이미지 또는 alias 경로 적용 실패
  • 해결:
    • .js 파일 확인 → require('../../../../libs/...')로 바뀌어 있으면 alias 적용 실패
    • tsconfig 설정을 다시 확인하고 nest build로 빌드하여 해결
    • 이전 캐시 삭제: docker builder prune 또는 --no-cache 옵션 사용

3.5 기타 문제

  • @nestjs/cli/commands 모듈 오류
    • → 글로벌 Nest CLI와 프로젝트 내 Nest CLI 간 충돌 → 프로젝트 내 CLI 사용 유도
  • .env 누락
    • JwtStrategy requires a secret or key 오류 발생 → .env 명시적으로 복사
  • 포트 포워딩 문제: 처음에 4000번 포트로 했더니 크롬에서 ERR_UNSAFE_PORT 에러남.
    • → 5000번 포트 사용으로 해결
    • 애초에 unsafe port 라고 지정되어있는게 있고 4000번이 거기에 속한다고..
  • 접속 안됨 문제
    • ufw allow 5000 설정으로 해결
    • 이미 있는 걸 지우려면,
       sudo ufw status numbered
       sudo ufw delete <제일 앞의 index 번호>

4. 최종 확인 사항

  • 접속 확인
curl http://<서버 IP>:5000
  • Docker 컨테이너 이름 변경 필요 시
docker run --name api-gateway -p 5000:3000 api-gateway

5. 다음 단계

  • Docker 이미지 → 레지스트리 push
  • K8s Deployment/Service 구성
  • ConfigMap/Secret을 통한 환경변수 관리
  • Ingress 설정으로 도메인 기반 접근 가능하게 구성
profile
내일도 풀스택

0개의 댓글