배경

nest.js로 작성한 앱을 fly.io에 배포하려고 합니다. fly.io에서는 공식적으로 가이드를 제공하지 않습니다. 따라서 Dockerfile을 사용하여 직접 배포하는 방식을 사용합니다.

fly.io 로그인을 이미 완료했다고 가정합니다.

Dockerfile

빌더와 운영 이미지를 따로 사용합니다. 또한 패키지 매니저로는 pnpm을 사용했습니다.

FROM node:18-alpine AS builder
WORKDIR /app
COPY . .
RUN npm install -g pnpm && \\
    pnpm install && \\
    pnpm build

FROM node:18-alpine
WORKDIR /app
ENV NODE_ENV production
COPY --from=builder /app ./
RUN npm install -g pnpm
EXPOSE 3000
ENTRYPOINT ["pnpm","start:prod"]

fly.toml 파일 작성

내부적으론 3000번 포트를 쓰고 외부로 공개되는 포트는 http/https 기본 포트(80,443) 으로 사용했다.

app = "APP_NAME"
kill_signal = "SIGINT"
kill_timeout = 5

[[services]]
  http_checks = []
  internal_port = 3000
  processes = ["app"]
  protocol = "tcp"
  script_checks = []
  [services.concurrency]
    hard_limit = 25
    soft_limit = 20
    type = "connections"

  [[services.ports]]
    handlers = ["http"]
    port = 80

  [[services.ports]]
    handlers = ["tls", "http"]
    port = 443

  [[services.tcp_checks]]
    grace_period = "1s"
    interval = "15s"
    restart_limit = 6
    timeout = "2s"

배포

우선 flyio에 앱을 만든다.

fly launch

이후 flyio의 dashboard로 가면 배포된 앱을 확인할 수 있다.