next.js 프로젝트를 pm2 + ec2를 활용해서 배포하기

HappyFrog·2023년 3월 22일
1
post-thumbnail

개요

next.js 기반으로 만든 프로젝트를 ec2상에 배포하면서 백그라운드 배포를 위해 pm2를 사용하였다. pm2 start 명령어로 배포하는것 까지는 쉽게 가능 하였는데, pm2의 deploy를 활용하는 과정중 여러 트러블을 겪어 정리하고자 한다

SSH 연결 가능하게 하기

맥 OS 기준으로 작성된 문서 입니다

pm2 deploy에서는 ssh 연결을 사용해서 git과 ec2에 접속하기 때문에 사전 설정을 해줄 필요성이 있다.
ec2상에서 배포가 진행되어야 하니 ec2에 접속해야 한다. (접속하는 방법은 관련 리소스가 많으니 생략)

접속 후 첫번째로 git repo에 ssh 공개키를 등록하여야 하므로 ssh-keygen을 통해 키를 생성해준다

$ ssh-keygen -t ed25519 -C "your_email@example.com"

ed25519를 지원하지 않는 레거시 시스템에서는 다음과 같은 명령어를 입력해준다

$ ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

해당 명령어를 입력하면 path 설정과 password 설정이 나오게 되는데 본 문서에서는 생략 하고자 한다 (다만 기존에 .ssh 디렉토리 아래에 만들어둔 키가 존재한다면, path 설정을 해주지 않았을시 자동으로 override 되니 이점은 주의하는 것이 좋다)

ec2에 접속한 후 다음 명령어를 통해 ssh 설정파일에 들어가 i를 누르고 편집 해준다(vi 기준)

$ sudo vi ~/.ssh/config

그 후 다음과 같은 설정을 입력 해준다

Host production #hostname alias
HostName github.com
User myname #유저네임
IdentityFile ~/.ssh/id_ed25519 #생성한 비밀키

이 후 ssh public키를 github에 등록하여야 한다.
개인 계정(public)에 접근한다면 오른쪽 유저 아이콘 클릭 후 setting > SSH and GPG Keys에서 등록할 수도 있으나, 필자는 organization의 private repo에 접근 했어야 했으므로 해당하는 레퍼지토리 -> settings -> security 섹션에 있는 deploy key에 접근 해준다.
또한 ec2 상에서 다음 명령어를 통해 public key를 확인 해준다

$ cat ~/.ssh/id_ed25519.pub

ssh-ed25519 xxxxkeyxxxxx user@email.com 과 같은 구조의 비밀키를 확인하였다면 deploy key > Add new 버튼을 누르고 해당 내용을 입력해 ssh public key를 등록 해준다


(title이 달라진건 실수)

pm2 config 파일 작성하기

이제 로컬상에서 pm2의 config 파일을 만들고 작성해야 한다. (가급적 이름은 ecosystem.config.js 아님 pm2.config.js 중 하나로 짓는 것을 추천한다. 공식문서에 따르면 위 두가지 이름은 매번 설정 파일 이름을 입력하지 않아도 된다고 한다)

module.exports = {
	// 배포 대상에 대한 설정
  	apps: [
      {
      	name: "test", // pm2 instance 이름
        script: "yarn", // yarn 혹은 npm 혹은 다른 것도 가능
        args: "start", // script args
        instances: 2, // 생성할 pm2 인스턴스 개수
        exec_mode: "cluster", // fork 혹은 cluster, 어떤 모드인지는 공식 문서 참조
        interpreter: "bash", // next.js와 pm2 사용시 interpreter 설정
        watch: "true", // 파일 변경 감지
        ignore_watch: ["node_modules"] // node_modules는 변경 감지 하지 않음
      }
    ],
  // 배포에 관한 설정
  deploy: {
  	// env
    production: {
    	user: "ec2-user", // ec2 instance에 접근할 user
        host: ["000.000.000.000"], // ec2 ip
        ref: "origin/main", //  clone할 branch (= 대상 브랜치)
		repo: "git@production:myname/myrepo.git", // 아까전 ssh 설정 한 대로 입력
        path: "/home/ec2-user", // git clone 위치
        "post-deploy": "yarn install && yarn build && pm2 reload ecosystem.config.js --env production", // 패키지 설치 & 빌드 & reload
        key: "~/.ssh/ec2_pem_key.pem", // ec2 pem
    }
  }
}

해당 설정 파일을 통해 배포를 진행하므로 로컬과, ec2상에 있어야 하는데 간단하게 repo의 main branch에 올려두면 된다.

deploy 하기

설정 파일까지 작성하였으니, 이제 deploy를 할 차례라고 할 수 있다.
하지만 deploy 전에 setup을 통해 프로비저닝을 진행 하여야 한다.
로컬 환경에서 다음 명령어를 입력해 setup을 진행하여 준다 (deploy설정에 적어둔 ec2로 접속하여 git clone후 post-deploy의 스크립트를 실행하기 때문에 로컬 상에서 진행 해준다)

$ pm2 deploy production setup 혹은 $ pm2 deploy ecosystem.config.js production setup

setup 과정이 끝난다면 이제 배포가 가능하다

$ pm2 deploy production

이후 과정이 끝나면 ec2에 접속하여 pm2 list를 통해 정상적으로 배포 되고 있는지 확인한다

소소한 트러블 슈팅

setup 까지 되었는데 deploy 실행시 git clone후 에러가 발생 할 수 있다. 이럴 경우 commit 혹은 stash 후에 진행하면 정상적으로 작동한다

참고자료

https://github.com/realizeme/elasticbeanstalk-with-docker/tree/master/pm2
https://pm2.keymetrics.io/docs/usage/deployment/
https://pm2.keymetrics.io/docs/usage/application-declaration/

profile
성장하고 싶은 긍정 개구리

0개의 댓글