가수면

Next 및 React를 EC2로 배포하기 (feat. Docker) 본문

React/Next.js

Next 및 React를 EC2로 배포하기 (feat. Docker)

니비앙 2024. 4. 14. 15:59

기본 환경 설정

도커 설치

도커 설치 방법은 아래 글 참조

https://jhchoi1182.tistory.com/282

 

EC2로 Docker를 이용해 배포하기 (feat. Mysql)

개발 환경 설정 문서는 다음 과정을 따른다. Dockerfile을 생성해 도커 내부로 파일을 옮긴 뒤 도커 이미지를 생성하고, Docker Compose로 컨테이너를 실행한다. (도커 컴포즈를 사용하지 않고 각각 실

jhchoi1182.tistory.com

 

노드 설치

https://nodejs.org/en/download/package-manager

// Node Version Manager 설치
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash

// nvm 명령어를 사용할 수 있도록 쉘 환경을 다시 로드
source ~/.bashrc

// Node.js 다운
nvm install 20

// 확인
node -v
npm -v

이후 ec2에 프로젝트를 클론해온다.

 

https 설정

외부 서버로 인증서 발급받고 리버스 프록시 구성

상세 방법은 아래글 참조

// studysync.store과 www.studysync.store에 대해 인증서를 발급받고
// server_name에 대한 요청들을 https://www.studysync.store로 리다이렉트 시킴
// server_name www.studysync.store studysync.store; 처럼 합쳐도 됨
server {
    listen 80;
    server_name studysync.store;
    return 301 https://www.studysync.store$request_uri;
}
server {
    listen 80;
    server_name www.studysync.store;
    return 301 https://www.studysync.store$request_uri;
}

server {
        listen 443 ssl;
        server_name www.studysync.store;

        ssl_certificate /etc/letsencrypt/live/www.studysync.store/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/www.studysync.store/privkey.pem;
        include /etc/letsencrypt/options-ssl-nginx.conf;

    location / {
        proxy_pass http://localhost:3000;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
    }

// https://www.studysync.store/api로 시작하는 요청은 8080으로 연결
    location /api {
        proxy_pass http://localhost:8080;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
    }


}

https://jhchoi1182.tistory.com/283

 

스프링 부트 서버에 https 설정

외부 웹 서버 설정 사이트에 접속할 때, 기본적으로 443 포트를 사용하게 되어 https://~~~.com에 에 접속하게 되면 자동으로 443 포트로 연결을 시도하게 된다. (8443같은 포트를 사용하면 주소 뒤에 포

jhchoi1182.tistory.com

Next에 도커 이용한 방법

https://nextjs.org/docs/app/building-your-application/deploying#docker-image

공식 문서에 친절히도 예제 코드와 방법이 제시되어 있다.

 

1. 먼저 루트 경로에 Dockerfile을 생성한 뒤 아래 코드를 붙여넣는다.

코드는 여러 환경에서 전부 배포될 수 있도록 구성되어있다.

FROM node:18-alpine AS base

# Install dependencies only when needed
FROM base AS deps
# Check https://github.com/nodejs/docker-node/tree/b4117f9333da4138b03a546ec926ef50a31506c3#nodealpine to understand why libc6-compat might be needed.
RUN apk add --no-cache libc6-compat
WORKDIR /app

# Install dependencies based on the preferred package manager
COPY package.json yarn.lock* package-lock.json* pnpm-lock.yaml* ./
RUN \
  if [ -f yarn.lock ]; then yarn --frozen-lockfile; \
  elif [ -f package-lock.json ]; then npm ci; \
  elif [ -f pnpm-lock.yaml ]; then corepack enable pnpm && pnpm i --frozen-lockfile; \
  else echo "Lockfile not found." && exit 1; \
  fi


# Rebuild the source code only when needed
FROM base AS builder
WORKDIR /app
COPY --from=deps /app/node_modules ./node_modules
COPY . .

# Next.js collects completely anonymous telemetry data about general usage.
# Learn more here: https://nextjs.org/telemetry
# Uncomment the following line in case you want to disable telemetry during the build.
# ENV NEXT_TELEMETRY_DISABLED 1

RUN \
  if [ -f yarn.lock ]; then yarn run build; \
  elif [ -f package-lock.json ]; then npm run build; \
  elif [ -f pnpm-lock.yaml ]; then corepack enable pnpm && pnpm run build; \
  else echo "Lockfile not found." && exit 1; \
  fi

# Production image, copy all the files and run next
FROM base AS runner
WORKDIR /app

ENV NODE_ENV production
# Uncomment the following line in case you want to disable telemetry during runtime.
# ENV NEXT_TELEMETRY_DISABLED 1

RUN addgroup --system --gid 1001 nodejs
RUN adduser --system --uid 1001 nextjs

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

# Set the correct permission for prerender cache
RUN mkdir .next
RUN chown nextjs:nodejs .next

# Automatically leverage output traces to reduce image size
# https://nextjs.org/docs/advanced-features/output-file-tracing
COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./
COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static

USER nextjs

EXPOSE 3000

ENV PORT 3000

# server.js is created by next build from the standalone output
# https://nextjs.org/docs/pages/api-reference/next-config-js/output
CMD HOSTNAME="0.0.0.0" node server.js

2. 컨테이너 빌드

docker build -t nextjs-docker .

3. 컨테이너 실행

docker run -p 3000:3000 nextjs-docker

근데 도커 이미지 용량이 상당히 크다.

도커 없이 배포

그냥 로컬처럼 패키지 설치 (npm install 등) 후 빌드해서 실행하면 된다.

다만 사용중인 ec2 터미널을 종료하면 실행이 종료되니 백그라운드에서 실행시켜줄 필요가 있다.

 

screen 사용하기

터미널 멀티플렉서로, 사용자가 여러 터미널 세션을 생성하고 관리할 수 있게 해준다.

 

설치

// Debian/Ubuntu 기반 시스템
sudo apt update
sudo apt install screen

// CentOS/RHEL 기반 시스템
sudo yum install screen

screen 명령어들

// 새로운 세션 시작
screen

// 종료
Ctrl-A 다음 D

// 세션 목록 확인
screen -list

There are several suitable screens on:	// screen -r 결과
        560354.pts-0.ip-172-31-43-29    (Detached)
        559890.pts-0.ip-172-31-43-29    (Detached)

// 세션 재접속
screen -r 560354

// 세션 종료
screen -S 560354 -X quit

// 모든 세션 종료
screen -ls | grep 'Attached\|Detached' | cut -d. -f1 | awk '{print $1}' | xargs -I {} screen -S {} -X quit
// screen -ls | grep 'Attached\|Detached': 실행 중인 모든 screen 세션을 리스트업
// cut -d. -f1 | awk '{print $1}': 세션 ID만 추출
// xargs -I {} screen -S {} -X quit: 추출된 각 세션 ID에 대해 screen 세션을 종료

세션 접속 후 프로젝트 경로로 들어가 실행시키면 된다.

'React > Next.js' 카테고리의 다른 글

Next 12버전과 13버전 다른점 정리  (0) 2023.07.24
React 앱을 Next로 마이그레이션 하기  (0) 2023.07.09
Next.js 심화  (0) 2023.06.20
라우팅 심화  (0) 2023.06.12
리액트에서 사용했던 기능들  (0) 2023.06.07
Comments