nextculture.github.io

 

 

서버를 어디서 어떻게 구동할 것인가... 이게 관건이었습니다.

토이프로젝트나 간단한 서비스를 위한 서버 구동을 위해 AWS나 Google Could를 사용하자니 돈벌이도 없는데 좀 그렇더군요. ㅠ.,ㅜ;

 

아래 블로그를 보다가 Freehosting 서비스로 무료 플랜도 괜찮아 보여 진행하려 하다가,...

 

토이프로젝트에 시용하기 좋은 무료 웹호스팅 및 서비스

들어가며 간단하게 도메인 1개, API 서버, Database, Github action CI/CD 구성, SSL, DNS, 통계만 하면 되는 작은 토이 프로젝트를 만들일이 생겼다. 일단 웹페이지는 추후에 SEO도 붙일까 해서 nextjs로 만들었

uznam8x.tistory.com

 

결국 여기저기를 보던와중  Synology NAS 로 설정하는 걸 보았고.. 나도 있는데!?

 DS918+  Docker가 지원되는 모델!!!! 와우.. 그래서 밤샘하여 설정 테스트를 완료!! ㅎㅎ 기쁘네요.

 

시놀로지 Docker로 Nodejs 웹서버 설치하고 띄우기는 아래 블로그를 보고 차근히 따라 하면 됩니다.

 

 

시놀로지 Docker로 Nodejs 웹서버 설치하고 띄우기

도커에서 Nodejs웹서버를 설치하고 띄우는 일은 간단하면서도 매우 유용한 작업입니다. 시놀로지 도커(Docker)은 주로 GUI로 설치를 진행하게되어 있어서 편리하기는 하나 아직 참고할 만한 자료들

ux.stories.pe.kr

시놀로지 Docker로 Nodejs 웹서버 설치하고 띄우기.mhtml
4.09MB

 

위의 글대로 하면 nodejs로 서버 구동은 잘 되는데..

cmd나 bash 명령 처리 과정의 복잡성, 그리고 nodemon을 사용할 수 없다는 문제점이 있어서 밤샘 ㅠ.,ㅜ;

 

혹시 nodemon 되는 것을 누가 만들었을까 싶어 레지스트리를 봤더니 역시나 nodemon이 있어서 깔아보기도 했지만 오래되고 불안정하고 업데이트 안되고 있어서 삭제..

 

 

여튼 최종적으로 실제 서비스를 위한 Nodejs Docker와 개발을 위한 Nodejs Test Docker를 만들어서 Test 서버에서는 nodemon으로 구동할 수 있도록 환경구축 완료!!!!!

 

 

최종 모습 (node8000, nodemon9000)

 

 

 

Synology.Docker 가장 골치아팠던 컨테이너  실행 명령 

아니.. 왜?? Why?? 컨테이너로 만들어진 이후에는 실행 명령을 수정할 수 없습니다!!!! 그래서 초반에 경로나 파일 내용이 잘못되거나 하면 Docker의 Nodejs가 실행자체가 안되기 때문에 어떠한 조작도 할수가 없습니다.

 

수십번을 컨테이너 지우고 만들기를 반복.. ㅋㅎ..

일단 좀더 쉽게 설정하도록 준비하여 처리하겠습니다.

 

이미 생성되어 있는 Nodejs 컨테이너 하나를 선택하고 "설정 - 내보내기"

 

"컨테이너 콘텐츠 및 설정 내보내기"는 Nodejs Docker를 전체 내보내기하여 txz 파일로 만들어줍니다. 나중에 실서버 백업을 한다거나 할 때 사용할 수 있겠네요.

한번 전체 내보내기 해보았는데 시간도 오래걸리고 용량도 꽤 큽니다. 200MB가 넘네요. 실제로 사용할 일은 적을 것 같고, 실서버에서라도 NAS의 폴더를 /home/node/app 으로 마운팅하여 사용하기 때문에 /home/node/app 폴더 내에서만 자료를 유지한다면 NAS에 알아서 보관이 되니 전체를 백업할 일이 없는 것이지요.

 

위의 설정으로 [내보내기]를 완료하면, /docker 폴더 안에 nodejsApp.syno.json과 같은 파일이 만들어져 있을겁니다.

 

 

 

폴더 구성 (node8000, nodemon9000)

일단 저는 실서버 구동을 위해 node8000 Nodejs 서버와 테스트 개발을 위한 nodemon9000 Nodejs 서버를 돌릴 예정입니다. 따라서 nodejsApp.syno.json 파일을  node8000.syno.json 으로 이름 변경하고,  nodemon9000.syno.json 으로 복사하여 한 개 더 만들어줍니다.

 

Visual Studio Code로 /docker를 열어서 node8000.syno.json을 열고 다음과 같이 수정합니다.

 

 node8000.syno.json 
- 수정이 필요한 부분은 "cmd"와 "port_bindings", "volume_bindings'입니다.
{
   "cap_add" : [],
   "cap_drop" : [],
   "cmd" : "node /home/node/app/index.js",
   "cpu_priority" : 50,
   "devices" : null,
   "enable_publish_all_ports" : false,
   "enable_restart_policy" : false,
   "enabled" : true,
   "entrypoint_default" : "docker-entrypoint.sh",
   "env_variables" : [
      {
         "key" : "PATH",
         "value" : "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
      },
      {
         "key" : "NODE_VERSION",
         "value" : "18.0.0"
      },
      {
         "key" : "YARN_VERSION",
         "value" : "1.22.18"
      }
   ],
   "exporting" : false,
   "id" : "a29fb23a7b9f43b7645b72301a24ecb6f1265c99a78167d31ad2aa9efab198bd",
   "image" : "node:latest",
   "is_ddsm" : false,
   "is_package" : false,
   "links" : [],
   "memory_limit" : 0,
   "name" : "node",
   "network" : [
      {
         "driver" : "bridge",
         "name" : "bridge"
      }
   ],
   "network_mode" : "bridge",
   "port_bindings" : [
      {
         "container_port" : 8000,
         "host_port" : 8000,
         "type" : "tcp"
      }
   ],
   "privileged" : false,
   "shortcut" : {
      "enable_shortcut" : false
   },
   "use_host_network" : false,
   "volume_bindings" : [
      {
         "host_volume_file" : "/docker/node8000",
         "mount_point" : "/home/node/app",
         "type" : "rw"
      }
   ]
}

 "cmd" : "node /home/node/app/index.js" 

즉 Nodejs Docker가 실행되자마자 NAS의 /docker/node8000 폴더를 /home/node/app으로 마운팅시키고,

/home/node/app/index.js 파일을 node로 실행하도록 됩니다. 따라서 경로가 틀리거나 index.js 파일 내 에러가 존재한다면 해당 nodejs docker는 실행되지 않습니다.

 

상관없습니다. 왜냐면 해당 index.js는 일단 테스트 서버에서 돌려보고 업로드해주면 되니까요.

 

그럼 더 중요한 node9000.syno.jon을 다음과 같이 작성합니다.

 

 node9000.syno.json 
{
   "cap_add" : [],
   "cap_drop" : [],
   "cmd" : "node",
   "cpu_priority" : 50,
   "devices" : null,
   "enable_publish_all_ports" : false,
   "enable_restart_policy" : false,
   "enabled" : true,
   "entrypoint_default" : "docker-entrypoint.sh",
   "env_variables" : [
      {
         "key" : "PATH",
         "value" : "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
      },
      {
         "key" : "NODE_VERSION",
         "value" : "18.0.0"
      },
      {
         "key" : "YARN_VERSION",
         "value" : "1.22.18"
      }
   ],
   "exporting" : false,
   "id" : "4335cbd6c4d99a72d5112dd374ffa21ae29c3f208d7c0259593d19d983a03be7",
   "image" : "node:latest",
   "is_ddsm" : false,
   "is_package" : false,
   "links" : [],
   "memory_limit" : 0,
   "name" : "nodemon8080",
   "network" : [
      {
         "driver" : "bridge",
         "name" : "bridge"
      }
   ],
   "network_mode" : "bridge",
   "port_bindings" : [
      {
         "container_port" : 9000,
         "host_port" : 9000,
         "type" : "tcp"
      }
   ],
   "privileged" : false,
   "shortcut" : {
      "enable_shortcut" : false
   },
   "use_host_network" : false,
   "volume_bindings" : [
      {
         "host_volume_file" : "/docker/nodemon9000",
         "mount_point" : "/home/node/app",
         "type" : "rw"
      }
   ]
}

NAS이 마운팅 폴더가 /docker/nodemon9000이며,

"cmd" : "node"로 원래 처음 Nodejs를 생성했을 때의 코드를 사용합니다. 그렇기에 실행이 안될일은 없는 것이지요.

 

/docker 폴더안에

 /docker/node8000, /docker/nodemon9000  폴더도 생성합니다.

 

이제 불필요한 컨테이너를 삭제합니다. 왜냐면 컨테이너는 실행하지 않더라도 포트가 동일하면 컨테이너로서 만들어지지도 않습니다. (사실 이건좀 애매 -_-; 시놀로지에서 그렇게 관리되도록 한듯한데.. 실행되지 않으면 상관없잖우?? 실행할 때 체크하도록 허지..)

 

그리고 "설정 - 가져오기"를 클릭하여,

/docker에서 node8000.syno.json과 node9000.syno.json을 각각 가져오기 합니다. (한번에 안되요)

 

node8000은 실행해도 바로 정지됩니다. /home/node/app/index.js 가 없기 때문입니다.

 

node8000을 더블클릭하여 세부사항을 보면 내용을 확인할 수 있습니다.

 

네 index.js 모듈을 찾을 수 없다고 하네요.. (근데 시간이 왜 안맞을까요 -_-; NAS 시스템 시간은 맞음.)

 

일단 무시해주고요.. nodemon9000을 실행합니다.

 

 

 nodemon9000 실행

그러면 잘 실행됩니다. 단지 nodemon이 아니라 node라는 것.

nodemon9000 더블클릭하여 여기서  터미널  탭을 클릭합니다.

nodemon9000이 있고 터미널창이 떠 있지만 이건 무시하고, [생성] 버튼을 클릭합니다.

그르면 "bash"가 생성되는데 이걸 클릭합니다.

 

아래와 같이,

 cd /home/node/app  으로 이동하여,

 npm install -g nodemon  실행합니다. (-g는 전역으로 설정하는 옵션입니다.)

 

추가적으로 express 프레임워크를 돌릴 것이라 미리 설치해줍니다.

(추가적인 module을 PC에서 설정하여 설치하는 것은 맨아래에 추가)

 

이제 Visual Studio Code에서 /docker/nodemon9000/index.js 파일을 생성하고 다음을 작성합니다.

 

 /docker/nodemon9000/index.js 
const express = require('express')
const app = express()
const HOST = '0.0.0.0'
const PORT = 9000

app.use(express.static('static'))

// URL 라우팅
app.get('/', (req, res) => {
	res.json({
		message: "This is TEST Nodemon Server.",
		port: PORT,
        success: true,
    });
	console.log('Hello World Sent.')
})

app.listen(PORT, () => {
	console.log(`TEST Server running at http://${HOST}:${PORT}`);
})

 

이제 터미널 화면에서  nodemon index.js 로 서버를 실행합니다.

 

잘 실행되었습니다!!!!!

 

로컬주소 http://192.168.0.4:9000 이나

DDNS 설정되어 있다면 해당 주소로 접근하면 다음과 같이 웹브라우저로 볼 수 있습니다.

콘솔창에도 잘 출력됩니다.

 

이렇게 실행된 상태로 두면, nodemon으로 구동되는 테스트 서버를 실행시켜둘 수 있습니다.

 

이제 index.js 파일을 수정하면 nodemon이 알아서 node를 재실행해주기 때문에 테스트 서버는 놔두고 개발에만 전념할 수 있게 됩니다.

 

이제 터미널을 닫아도 프로세스로 nodemon이 실행되고 있게 됩니다.

=> 터미널을 닫았을 때 nodemon이 실행은 되고 있지만 index.js 코드를 수정했을 때 프로세스가 죽어버리고 마네요 ㅠ.,ㅜ;;; 결국 터미널을 개발하는 동안 지속 켜놓아야 하니 역시 불편하네요. 다른 해결방법을 찾기 전까지는 켜놓아야 할 상황이네요.

 

그래서 또 이걸보고 처음부터 "node /usr/loca/bin/nodemon index.js"로 시작하면 되잖아!?!? 싶지만..

다시 syno.json 설정파일을 변경하고 새로 컨테이너를 만들면, 해당 컨테이너에는 nodemon이 설치되어 있지 않기 때문에 Error!!! 결국 방법이 없네요. 아시는 분 답변 좀 주세요 ㅠ.,ㅜ;

 

 

 

Node8000 실서버 돌리기

 

이제 해당 index.js 파일을 /docker/node8000 폴더에 복사하고 다음과 같이 수정해줍니다.

 

 /docker/node8000/index.js 
const express = require('express')
const app = express()
const HOST = '0.0.0.0'
const PORT = 8000

app.use(express.static('static'))

// URL 라우팅
app.get('/', (req, res) => {
	res.json({
		message: "This is REAL Node Server.",
		port: PORT,
        success: true,
    });
	console.log('Hello World Sent.')
})

app.listen(PORT, () => {
	console.log(`REAL Server running at http://${HOST}:${PORT}`);
})

 

그리고 node8000 도커 컨테이너를 실행하면 또 정지되어 버립니다. 왜냐면 express를 설치하지 않아 없는 모듈이기 때문입니다.

그렇다면 실행도 되지 않는 컨테이너에 어떻게 express를 설치할 수 있을까요?? 터미널 bash도 컨테이너가 켜져서 돌아야 npm 명령이라도 입력할텐데 말입니다.

 

이제 필요한 것이 PC에서 해당 폴더에 npm 설치하기입니다.

 

 

 

PC cmd 창에서 npm 패키지 설치하는 방법

cmd를 실행하고 해당 폴더로 이동하여 작업을 하면 될 것 같지만,

 

UNC 경로를 지원하지 않아 네트워크 드라이브 접속이 안됩니다. UNC로 접근하는 방법을 써도 되겠지만..

좀더 간편하고 작업하기도 편한 네트워크 드라이브 할당으로 연결하여 작업하였습니다.

 

Z:로 Nas의 docker 폴더를 연결해줍니다.

cmd에서 Z:로 이동하여 보면 /docker 폴더로 연결된 것을 볼 수 있습니다.

 

node8000에 express를 설치할 것이므로,

이렇게 하면 해당 프로젝트 폴더에 node_modules 폴더를 가지게 되고, 해당 프로젝트에서는 해당 module을 사용할 수 있게 됩니다. 즉 현재 node8000 폴더에 한해서 index.js에서 express를 사용할 수 있게 된다는 것이지요.

 

이제 다시 node8000을 실행시켜 봅니다. 오~오~ 죽지않고 살아있습니다.

잘 설정되었다는 것이지요.

 

더블클릭해서 보면

로그도 잘 남았고..

 

프로세스도 잘 실행되고 있습니다.

 

브라우저 접속해 봅니다.

 

실서버는 index.js 파일이 수정되었다면, 컨테이너를 반드시 재시작해주어야 정상 동작합니다.

 

 

 

  1. ㅇㅇ 2022.06.22 11:48

    안녕하세요 게시글 도움이 많이 되었습니다!

    저도 node 프로젝트를 도커에 올려서 사용 중인데 터미널로(ssh가 아닌 시놀로지 ui 에서의 터미널) node 프로젝트를 실행시키고 도커 창을 끌 때 '터미널을 종료하시겠습니까?'라는 알람창에 아니오를 누르면 터미널 창이 계속 켜져있어서

    이후에도 웹 호출이 잘 되는데, 그로부터 한 5분 뒤에 다시 호출해보면 서버가 응답하지 않더라구요

    그래서 다시 도커 접속해서보면 터미널이 종료가 되어있더라구요.. 혹시 이와 같은 현상에 대해서는 어떻게 조치해야할지 질문드려도 될까요?? ㅜㅜ

+ Recent posts