NAS 웹서버에 어울리는 배포
🚀

NAS 웹서버에 어울리는 배포

Tags
WebDev
Node.js
Projects
NAS
CI/CD
Thought Experiments
Published
2021년 11월 9일
 
이 이야기는 개인용 NAS를 이용하여 웹 운영환경을 구성한 후 적절한 배포 방법을 실험합니다.

NAS 운영 환경에 어울리는 배포방법 찾기

이전 포스트에서 개인용 NAS 장비를 웹서버로 운영하기 위한 방법을 다루었습니다. 이제 신나게 가지고 놀 일만 남았습니다.
NAS 특성상 파일을 동기화하는 과정이 너무 빠르고 쉽습니다. 예를 들면 드롭박스나 구글 드라이브와 유사한 방식으로 파일의 클라우드 백업이 이루어 지는 것인데, 이 속도가 거의 로컬에 파일을 복사하는 수준입니다. 이 로직을 웹 서비스를 배포하는 목적으로도 적합한지 실험을 해 보도록 하겠습니다.

시나리오 #1

GitHub WebHook을 사용하는 방법입니다. 깃헙에 의존적이며 main 브랜치에 변동이 발생하면 웹훅에 의해 NAS에 위치한 웹훅 리시버로 신호를 주게 되며, 신호를 받은 리시버는 소스 갱신 > Node.js 모듈 설치 > 프러덕션 빌드의 과정을 거쳐 서비스를 재시작합니다. 네... 아쉽게도 테스트 과정은 전혀 고려되지 않았습니다. 이후 시나리오도 마찬가지일 거예요.
  1. main 브랜치가 갱신되면 firejune.io로 트리거
  1. Node.js로 작성된 웹훅 리시버가 다음 과정을 수행
    1. git pull origin main 최신 소스로 갱신
    2. npm ci —no-optional Node.js 모듈 설치
    3. npm run build 프로덕션 빌드
    4. pm2 restart ./main.js --name "MySite" 돌고있는 프로세스 재시작

결과

이것은 일반적인 배포 시나리오로 볼 수 있겠습니다. 그만큼 안정적인 운영이 가능할 것 같습니다. 하지만 속도는 도커를 사용하는 만큼은 아니지만 느려 터진 건 마찬가지입니다. git push origin main 입력 후 서버에 반영되기까지 대략 4~5분정도 걸립니다. 그리고 NAS의 특성을 전혀 살리지 못한 구성이라서 바로 다음 실험으로 진행해 보겠습니다.

시나리오 #2

프로젝트 폴더를 통째로 서버의 구동 위치에 동기화하는 방법입니다. 그리고 서버에서 프로세스를 개발 모드로 실행했습니다. 아시다시피 개발 모드는 미리 컴파일하지 않고 페이지 접근 시점에 컴파일이 이루어지며 코드를 수정하는 족족 운영 서버는 항상 최신 상태를 유지합니다. node_moduls동기화를 중지하는 이유는 두 OS간 CPU타입이 다를 수 있기 때문입니다.
  1. 로컬 구성
    1. mkdir ~/www/web/ 웹 서버를 구동할 폴더 생성하고 NAS에 실시간 동기화 설정
    2. git clone [email protected]:yourid/web.git 동기화 되고 있는 위치에 프로젝트 클론
    3. npm install Node.js 모듈 설치
    4. node_moduls, .git, .next 폴더는 동기화 중지
  1. 서버 구성
    1. ssh [email protected] 서버 SSH 접속
    2. cd ~/www/web/ 동기화 설정된 위치로 이동
    3. npm install —no-optional Node.js 모듈 설치
    4. pm2 start npm --name "MySite" -- run dev -p 80 개발 모드로 실행

결과

별도로 손 배포를 진행하지 않아도 괜찮습니다. 그리고 잘 동작합니다. 그런데 뭔가 답답합니다. 페이지 접근마다 API 콜이 발생하고 정적인 페이지들 조차도 캐시효과를 기대하기 어렵습니다.

시나리오 #3

로컬에서 빌드하면 결과물만 동기화하도록 구성해 보았습니다. deploy.js에 간단한 파일 복사 스크립트를 작성했습니다. 이 스크립트는 로컬에서 빌드 후 서버 구동에 필요한 최소한의 구성을 동기화 폴더로 복사합니다. 시나리오 #2와 다른 점은 프로젝트 클론 위치가 다른 곳이라는 점과 watch 옵션이 사용된다는 점 외에는 모두 동일합니다.
  1. 로컬 구성
    1. ecosystem.config.json 파일을 추가하고 PM2에 전달할 env 값과 watch 옵션을 적용
    2. npm run build 프로덕션 빌드
    3. npm run deploy 빌드된 파일과 구성을 동기화 위치로 복사
    4. 동기화된 위치에서 node_moduls 폴더 동기화 중지
  1. 서버 구성
    1. ssh [email protected] 서버 SSH 접속
    2. cd ~/www/web/ 동기화 설정된 위치로 이동
    3. npm install —no-optional Node.js 모듈 설치
    4. pm2 start pm2.config.js --update-env 서버 구동

결과

지금까지의 시도중 가장 만족스러운 결과를 얻은 것 같습니다. PM2의 watch 옵션을 이용하여 조건에 해당하는 파일이 변경되면 자동으로 서버가 재시작 되도록 구성했는데요. 로컬에서 빌드하고 배포하는 명령을 입력해야 하는 불편함이 있지만 서버의 성능이 대폭 개선되었습니다.
다음 시간에는 현재 구동되고 있는 사이트 구현에 대해 다루어 보도록 하겠습니다.

리소스