Synology Nas에 Docker로 Node.js 서버 구축하기

nowcow·2024년 10월 8일

내친김에 진행했던 Spring 프로젝트들을 배포해보고 싶어서 찾아보다가 Synology로 배포가 가능하다는 것을 발견... 완전 만능이다. Synology 자체가 Linux 기반이라 그런지 확장성이 무궁무진하다.

어쨌든, React + Node.js로 토이 프로젝트를 진행 중이었는데 지난번에 구축했던 데이터 서버도 성공적으로 적용해 보았고, Node.js 서버도 구축해보면 좋겠다 싶어서 시도해보았다.


개발환경

https://www.youtube.com/playlist?list=PLRx0vPvlEmdD1pSqKZiTihy5rplxecNpz

React 복습도 할 겸, Node.js도 간단하게 배워볼 겸 해서 이 강의를 모두 듣고 토이 프로젝트를 완성했다. 24년 9월 기준, 영상에 나오는 React와 Node.js의 버전에서는 현재 지원되지 않는 라이브러리들이 있어서 React 최신 안정화 버전 18.3.1, Node.js는 22.9.0 버전으로 진행했다.

Node.js에 대한 이해가 전혀 없었는데, 강의를 수강하면서 조금은 이해가 됐기 때문에 서버를 구축할 수 있었다.

Node.js 설치하기

  • 우선 Synology Nas 패키지 센터에서 Docker를 설치한다. Docker의 활용도가 정말 무궁무진하다.

  • 그리고 node를 관리할 폴더 하나를 만들어야 한다. docker라는 최상위 디렉토리 안에 node 폴더를 생성해주었고, 현재 진행 중인 프로젝트 이름인 management 폴더를 하나 더 만들어 주었다. 폴더 안에 있어야 할 파일들은 이따가 자세히 설명할 것이기 때문에 일단 빈 폴더들만 만들어주면 된다.

  • Dokcer 설치가 완료되었으면 Docker를 열고, 레지스트리에서 node를 검색하고 자신의 개발환경에 맞는 node 버전을 설치하면 된다. (cmd창에서 node -v 입력하고 node 버전 확인.)

  • 나는 22.9.0 버전에서 개발을 진행했기 때문에 같은 버전으로 설치해주었다. 최신버전이 필요하다면 latest로 설치.

  • 설정페이지가 열리면 일반 설정에서는 딱히 건드릴 것은 없는 것 같고, 포트설정도... 어차피 ssh로 Node.js를 빌드하는 과정에서 포트를 지정해주면 되기 때문에 그냥 빈 포트 1111로 막 설정해주었다. 볼륨설정이 가장 중요하다.

  • 폴더추가에서 아까 만든 디렉토리를 설정한다. 나는 /docker/node/management 였다. 그리고 마운트 경로에 Node.js와 매핑되는 /home/node/app 이라는 경로를 입력해주면 설치 단계는 끝난다.

Node.js 서버 Build를 위한 준비

이제 /docker/node/management 디렉토리 안에 Build를 위해 필요한 파일들을 넣고 Build를 진행하면 서버가 구축된다.
어떤 파일들이 필요한지 알아볼 것이다.

  • 우선 Dockerfile 이라는 파일이 필요하다.
    • IntelliJ 기준, 프로젝트 제일 상위 디렉토리에 Dokcerfile 이라는 파일을 만들어줘야 한다.
    • 우클릭 - New - file에서 확장자는 따로 지정하지 않고 Dockerfile 이라는 이름의 파일을 만들어 준다.
    • Dockerfile 안에 docker 명령어들을 입력해준다. 아래는 예시
# Node.js 이미지 설정
FROM node:22.9.0

# 작업 디렉토리 생성
WORKDIR /usr/src/app

# 패키지 파일을 복사
COPY package*.json ./

# 의존성 설치
RUN yarn install
RUN npm install
RUN npm install -g nodemon

# 애플리케이션 소스 복사
COPY . .

# 포트 노출
EXPOSE 6000

# 애플리케이션 시작
CMD ["yarn", "run", "server"]

여기서 확인할 것은 본인 환경과 맞는 Node.js 버전을 맞춰주는 것, yarn / npm 등, 프로젝트의 서버에서 필요한 의존성을 설치해 주는 것(동영상 강의에서 yarn을 사용해서 여기에도 yarn을 설치해주었다.), 사용할 포트를 지정하는 것, 세가지다.
Synology Nas에서 기본적으로 5000포트를 사용하기 때문에 나는 편의상 6000번 포트를 Node.js 서버에 사용하려고 6000번 포트를 지정해서 Dockerfile을 성공적으로 생성했다.

  • 다음으로 필요한 파일은 package.json 파일이다. 아마 프로젝트를 만들면서 작성했기 때문에 파일만 복사해서 가져오면 될 것 같다. 스크립트에 "server": "nodemon server.js" 라고 작성해 두었기 때문에 CMD ["yarn", "run", "server"] 명령어를 통해 server.js라는 파일을 실행하게 된다.
{
  "name": "management",
  "version": "1.0.0",
  "scripts": {
    "client": "cd client && yarn start",
    "server": "nodemon server.js",
    "dev": "concurrently --kill-others-on-fail \"yarn server\" \"yarn client\"",
    "start": "node server.js"
  },
  "dependencies": {
    "@mui/icons-material": "^6.1.1",
    "basic-ftp": "^5.0.5",
    "body-parser": "1.18.3",
    "express": "^4.21.0",
    "http-proxy-middleware": "^3.0.2",
    "mariadb": "^3.3.2",
    "multer": "^1.4.5-lts.1",
    "mysql": "^2.18.1",
    "path": "^0.12.7"
  },
  "devDependencies": {
    "concurrently": "^4.0.1"
  },
  "description": "React와 node.js로 만든 고객 관리 시스템 입니다.",
  "main": "server.js",
  "keywords": [],
  "author": "",
  "license": "ISC"
}
  • 그리고 database.json 파일도 필요하다. 로컬에서 Node.js 서버를 DataBase와 연결할 때 작성했던 파일을 그대로 가져오면 된다.
{
  "host": "시놀로지id.synology.me",
  "user": "id",
  "password": "pw",
  "port": "3306",
  "database": "management"
}
  • yarn.lock 혹은 package-lock.json 파일도 필요하다. 두 파일을 혼용해서 사용하면 충돌이 일어날 수 있기 때문에 npm대신 yarn을 썼으면 yarn.lock 파일을, npm을 사용한다면 package-lock.json 파일을 가져오도록 한다.

  • 마지막은 제일 중요한 server.js 파일이다.

const fs = require('fs');
const express = require('express');
const bodyParser = require('body-parser');
const app = express();
const port = process.env.PORT || 6000;
const ftp = require('basic-ftp');

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true}));

const data = fs.readFileSync('./database.json');
const conf = JSON.parse(data);
const mysql = require('mysql');

const connection = mysql.createConnection({
    host: conf.host,
    user: conf.user,
    password: conf.password,
    port: conf.port,
    database: conf.database
});
connection.connect();

이런식으로 쭉 작성된 server.js파일인데, Dockerfile에서 지정해준 6000번 포트를 잘 확인해주면 된다.
const port = process.env.PORT || 6000;
database.json 파일을 이용해 DataBase에도 성공적으로 연결 해주었다면 이제 Build를 위한 준비는 끝났다.
아래는 최종 파일 목록이다.

여기까지 준비가 끝났으면 ssh에 접속해서, node 이미지를 만들고, build를 해보자.

Node.js 서버 Build 후 Run하기

cmdssh 명령어를 통해 Synology Nas 내부에 접근해야 한다.

  • 우선 제어판 - 터미널 및 SNMP - 터미널 - SSH 서비스 활성화 체크 - 포트 : 22 이렇게 설정해준다.

  • 이제 명령프롬프트(cmd)를 켜고, Synology에 접속한다.

    • 명령어는 ssh 시놀로지id@192.168.x.x (시놀로지 내부ip)
    • 시놀로지 내부ip 확인하는 방법은 https://nowcow.tistory.com/1 이 포스트에 있다.
    • 패스워드까지 입력하고 나면 시놀로지id@시놀로지id : ~$ 이렇게 접속된걸 확인할 수 있다.
    • 패스워드 입력할때는 화면에 아무런 반응이 없지만 그냥 입력후 엔터를 치면 된다.
  • 접속이 완료됐다면 /dokcer/node/management/ 라는 디렉토리로 찾아가보자.
    - 바로 cd /docker/~~ 입력하면 안되고 최상단에 /volume1/ 이라는 디렉토리를 거쳐야 한다.
    - cd /volume1/docker/node/management/

  • 명령어를 입력해서 ~~/management/ 디렉토리 안에 있는 파일들을 Build 해보자.

  • 원래는 docker ~~ 명령어를 통해서 진행하지만, ssh 접속할 때 admin계정으로 접속하지 않아서 권한이 없다. docker 명령어 앞에 sudo를 붙여 해결한다.
    - sudo docker build -t 식별가능한이름 . ex) sudo doceker build -t management-server .

Dockerfile을 읽어서 안에 설정해둔 값으로 Build가 잘 된것을 확인할 수 있다. 나는 여러가지 의존성을 더 추가해주었기 때문에 약간의 시간도 소모되었고, Build 과정은 각자 다를 수 있다.

  • 이제 Build된 이미지를 Run 해줄 차례이다.
    • sudo docker run -d -p 6000:6000 이름 ex) sudo docker run -d -p 6000:6000 management-server
    • 6000:6000의 뜻은 외부 6000번 포트로 들어온 요청을 내부 컨테이너 6000번 포트로 매핑한다는 뜻이다.
    • (외부6000):(내부6000) 이렇게 이해하면 된다.

이제 Docker - 컨테이너 에서 방금 Run 한 management-server가 실행되고 있다면 성공!!

management-server를 더블클릭해서 로그탭을 보면 제대로 실행되었는지 로그 확인도 가능하다.

서버가 잘 돌아가는지 조금 더 시각적으로 확인해 볼 필요가 있다.

  • 나는 server.js 파일에 테스트를 위한 api를 하나 만들어두었다.
// test용 get요청
app.get('/api/test', (req, res) => {
    res.send('Hello World! Welcome to the API!');
});
  • curl http://시놀로지id.synology.me:6000/api/test명령어를 입력했을 때 정상적으로 출력되는 것을 볼 수 있다.

이렇게 Synology Nas에 24시간 구동되는 Node.js 서버를 구축했다.
컨테이너를 실행하는 동안은 서버가 계속 구동되기 때문에 yarn server 등의 실행 명령어가 필요없어진다.
이제 client 단에서 proxy 설정을 통해 우리가 만든 서버와 매핑해주면 정상적으로 데이터를 불러올 수 있게 된다.

profile
백엔드 개발자

0개의 댓글