[SeSAC X 코딩온] 웹개발자 풀스택 과정 1차 프로젝트 회고 | NCP 서버에 무중단 배포하기 (pm2)

옹잉·2024년 3월 24일
0

💡 NCP 서버에 무중단 배포하기

Naver Cloud Platform 서버로 1차 프로젝트를 배포했다.
100000크레딧을 줘서 약 3개월간 무료로 사용 가능하다. 하지만 기간이 지나면 과금이 되니 주의!

시작!

1. PuTTY를 이용해 NCP 서버에 접속한다.

(IP address를 적고 Save를 누르면 다시 IP를 적지 않아도 접속 가능하다.)




2. NCP 서버에 웹 서버인 아파치와 node.js를 설치한다.

$ apt-get update // 패키지 리스트 업데이트
$ apt-get install apache2
$ apt-get install nodejs
$ apt-get install npm

node -v : 노드 버전 확인으로 설치 됐는지 확인




3. NCP 서버에는 낮은 버전의 Node.js가 설치돼서 nvm으로 업그레이드 해줘야한다.

(긁어서 복붙해도 명령어 실행 된다. 앞에 $ 있으면 지우고 사용)

curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.0/install.sh | bash
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"

nvm --version 으로 nvm 설치됐는지 확인한다.

$ nvm ls // 사용 가능한 Node.js 버전 목록 확인
$ nvm ls-remote // 설치할 수 있는 버전 확인
$ nvm install 17 / nvm install --lts // ubuntu 18/16에서는 아직 node 18 이후 버전을 지원하지 않음
$ nvm ls
$ nvm use 17

node -v : 버전 업 되었는지 확인




4. Clone github repo & 모듈 설치

프로젝트 repo를 ncp 서버에 클론한다.

$ git clone [클론할 repo https url]
$ cd [repo name]
$ npm i 

이후 merge 된 프로젝트를 배포에 가져올 경우 로컬과 같이 git pull origin ~를 해주면 된다.
만약 적용이 안됐다면 pm2 kill 하고 다시 서버 실행하기!




5. mysql-sever 설치

$ apt-get update 
$ apt-get install mysql-server

mysql --version 으로 확인하면 5.xx 설치되어있는데, 할 수 있는게 없다. -> 업그레이드 필요

$ wget https://dev.mysql.com/get/mysql-apt-config_0.8.24-1_all.deb
$ sudo dpkg -i mysql-apt-config_0.8.24-1_all.deb // 버전 선택하는 GUI 뜸

주의!!!!

맨 위의

  1. MySQL Server & Cluster (Currently selected: mysql-5.7) 선택되어 있는부분에서 꼭!!!!! 엔터 누르기
  2. 그럼 8.0을 선택할 수 있는 창으로 바뀐다 그리고 8.0 선택된 상태에서 엔터 누르면 다시 저 창으로 전환된다.
  3. 마지막으로 네 번 째 Ok에서 엔터!

이후에 캡쳐는 못했지만 긴글이 나오면 아래 방향키로 내려서 ok 엔터키 누르면 아래 화면이 나온다

찐 최종 Ok 엔터 누르고 mysql --version 확인하면 버전 업그레이드 된다




6. MySQL에 DB와 USER 생성

mysql 입력 후

DB 생성

$ create database mydatabase character set utf8mb4 default collate utf8mb4_unicode_ci;
$ SHOW DATABASES;

문자열 셋으로 utf8mb4를, 콜레이션으로 utf8mb4_unicode_ci를 사용!

utf8mb4 : uft8 보다 더 많은 문자를 저장할 수 있음. 이모지까지 저장하고 싶으면 utf8mb4 char set 사용

USER 생성

################### [ DCL ] #####################
-- USER 생성과 함께 설정 
CREATE USER '유저이름'@'%' IDENTIFIED WITH mysql_native_password BY '비밀번호'; # 클라이언트 접근할 수 있도록 비밀번호 방식 변경

GRANT All PRIVILEGES ON *.* TO '유저이름'@'%' WITH GRANT OPTION; # 새로운 사용자에게 권한 부여
-- 모든 DB에 접근 가능하도록, "유저이름" 계정에 DB접근 권한을 부여

FLUSH PRIVILEGES; 
-- 현재 사용중인 MySQL 캐시를 지우고, 새로운 설정 적용

SELECT host, user FROM mysql.user;
-- 생성한 유저 확인



7. .env 파일 생성

$ vi .env
1. i 누르고 내용 입력
2. esc 눌러서 :wq 로 저장 후 종료
3. ls -a (숨김 파일 리스트 확인)



8. 무중단 배포를 위한 PM2 설치

$ npm install pm2 -g // 무중단 배포 모듈 전역 설치

$ pm2 start app.js // 무중단 배포 시작!

$ pm2 log // 로그 확인

$ pm2 kill // 무중단 배포 종료

만약 아래와 같은 오류가 난다면 다시 nvm 설치 후 node 버전 업그레이드 후 실행




9. 만약! cross-env 가 설치되어있지 않다면

npm i cross-env 로 설치 후 아래의 세 파일에 설정해준다.

(cross-envnpm startnpm dev일 때 config를 다르게 설정할 수 있다.)

// package.json

 "scripts": {
        "test": "echo \"Error: no test specified\" && exit 1",

       // config.js의 prod 실행하고 싶을 때, npm start
        "start": "cross-env NODE_ENV=prod pm2 start app.js",
        "start:watch": "cross-evn NODE_ENV=prod pm2 start app.js --watch",

       //  config.js의 development를 실행하고 싶을 때, npm dev
		"dev": "cross-env NODE_ENV=development nodemon app.js"
    },
// config > config.js

require("dotenv").config();

const development = {
    username: process.env.DB_USERNAME,
    password: process.env.DB_PASSWORD,
    database: "sesac",
    host: "127.0.0.1",
    dialect: "mysql",
};

const prod = {
    username: process.env.DB_USERNAME,
    password: process.env.DB_PASSWORD,
    database: "sesac",
    host: "118.67.132.32",
    dialect: "mysql",
};

module.exports = { development, prod }; // 두 모듈 내보내기!
// models > index.js

console.log("corssenv: ", process.env.NODE_ENV); // prod or development
// const config = require(__dirname + "/../config/config.js")["prod"];
let config;
if (process.env.NODE_ENV) {
    // npm run dev, npm start 실행 명령어에 따라 NODE_ENV 값 달라짐
    config = require(__dirname + "/../config/config.js")[process.env.NODE_ENV];
} else {
    config = require(__dirname + "/../config/config.js")["development"];
}

config.js 의 prod 모듈에 NCP 서버의 DB 정보와 host 정보를 입력해 두었기 때문에

NCP 서버에서는 npm start로 서버 실행!

profile
틀리더라도 🌸🌈🌷예쁘게 지적해주세요💕❣️

0개의 댓글