시그놀로지(Synology) NAS에 Docker로 Node 서버 띄우기 (feat. Puppeteer)

최봉수·2023년 12월 14일
0

시그놀로지 나스에 웹서버를 띄우는 법을 알아보자.
그냥 검색을 통해서 봤을때는 쉬워보였는데 막상 해보니 처음이라 여기저기 막혔어서 기록을 남긴다.

과정

기록용이니 처음부터 엄청 자세하게 남기지는 않겠다.

NAS DSM 접속에서 Docker 설치

  • DSM에 접속 > 패키지 센터 > Docker 검색 후 설치 및 실행

Node Image 생성 및 설정

  • 실행한 Docker에서 좌측 레지스트리 메뉴에서 node를 검색 후 다운로드한다.
  • 다운로드를 누르면 잠시 시간이 지난 후 태그(버전)을 선택하는 창이 나오는데 따로 원하는 버전이 없다면 latest를 선택한다.

  • 선택 후 약간의 시간이 지나면 좌측 이미지 메뉴에서 확인할 수 있다.
  • 여기서 이름 우측 아이콘을 눌러서 확인해야 할 정보가 있지만 어쩐 일인지 빈 화면만 나온다 그러니 여기에서 'If you prefer Docker Compose:'해당 부분으로 스크롤을 내려서 volumes값을 확인하자 - ./:/home/node/app 이렇게 되어있을거다.
  • 이제 해당 이미지를 선택하고 상단 실행을 누른다.

  • 원하는 컨테이너 이름 설정
  • 그 외 설정은 딱히 필요가 없다면 건들지 말자. (리소스 제한은 아직 모르겠는데 높은 권한은 컨테이너를 sudo로 실행시킴)
  • 다음을 누르기 전에 고급 설정을 눌러준다.

  • 선 작업으로 Docker를 설치했다면 생겼을 File Station/docker에 서버 파일이 들어갈 폴더를 만들어 넣어주자. (index.js, package.json 등)
  • 마운트 경로에는 아까 링크에서 봤던/home/node/app를 입력해주자.

    로컬에서 터미널로 해당 docker 폴더에 접속이 가능하면 npm i로 미리 모듈을 설치해주자.

  • 포트는 입맛대로 지정해준다
  • 로컬 포트는 장치에 연결된 사용자나 관리자가 해당 디바이스에 접속하기 위한 포트이다.
  • 컨테이너 포트는 외부에서 해당 웹 서버에 접속하기 위한 포트이다.
  • 다른 컨테이너 포트와 겹치면 안된다.

예를 하나 들자면 로컬 포트 5000, 컨테이너 포트 8080일 경우
http://localhost:5000 로 접속 시 해당 요청은 NAS 디바이스의 로컬 포트 5000으로 전달되어 로컬 포트 5000에 할당된 서비스 또는 웹 관리자 페이지(여기서는 웹서버)로 연결된다. (방화벽 설정 필요)
동시에, 컨테이너 내에서 실행 중인 서비스는 컨테이너 포트 8080에 바인딩 되어있다.
만약 외부에서 NAS의 컨테이너 포트 8080으로 접속하려면, http://NAS_IP:8080과 같이 접속해야한다. (포트포워딩 필요)

테스트 결과 server.js에서 설정했던 포트는 컨테이너 포트가 바인딩 되면서 무시되는 거 같다.

나도 이 부분은 많이 테스트 해보지 않았기에 아직 개념이 확실치 않다.
그저 내가 이해한 부분을 기록했지만 혹여나 Docker를 잘 아는 누군가 이 글을 봤을 때 정리가 틀리다면 정정을 부탁드리겠습니다.

  • 하단 명령에 node /home/node/app/index.js를 입력 후 적용
  • 해당 명령은 컨테이너가 띄워지면 무조건 한번 실행되는 명령어이다.

  • 생성 후 수동으로 컨테이너를 실행시키려면 마법사 완료 후 이 컨테이너 실행 체크를 해제한다.
  • 적용

  • 실행 중이라고 나오면 성공이다.
  • 만약 에러가 나오면 컨테이너 더블 클릭 후 로그에 들어가서 에러를 확인하자.

Puppeteer 실행 이슈

서버 세팅 후 우리는 기존 세팅이 있어서 따로 포트포워딩이나 방화벽 설정을 하지않았고 서버에 접속도 확인을 하였다.
하지만 계속 에러가 난다.


크롬이 없단다. 찾아보니 따로 Docker 이미지에 설치를 해줘야한다고 한다.
아니 Dockerfile 설정은 알겠는데 이미 나스 도커에 올려논 웹에서 어떻게 수정하는데?
수 많은 검색을해도 나오지 않는다.
난 컨테이너 실행까지 도커 이미지를 따로 빌드 한 적도 커밋 한 적도 실행 한 적도 없는데 어떻게 Dockerfile만들어서 어떻게 하라고?
Docker도 NAS도 이번에 처음 다루다보니 진짜 지랄똥을 싸가며 해결했다.

  • 컨테이너를 더블클릭 후 상단 터미널 탭으로 이동하자.
  • 생성을 눌러서 bash를 생성해준다.
  • 이 곳에 명령어를 입력하면 된다.
    - 검색해보면 Dockerfile에 RUN apt-get update \ 뭐 이런 명령어가 나오거나 ssh로 접속해서 수동으로 설치를 해야한다는 등 얘기가 나올텐데 그냥 저기 터미널에서 실행하면 된다...
    - 굳이 SSH 접속해야하나? 싶어서 똥고집 부리다보니 이렇게 됐다..
    apt-get update
    apt-get install -y --no-install-recommends udev chromium
    순서대로 입력하여 설치해준다.

    스크린샷을 못 찍었지만 설치가 끝나고 나면 chromium 설치 경로가 '/usr/bin/chromium' 이런식으로 나올 것이다. 메모해두자!

  • 그리고 컨테이너를 재실행 해준다.


이건 또 뭘까 launch가 실패했단다.
이것저것 찾아보니 puppeteer에 설치한 크롬 경로를 수동으로 알려줘야 한다고 나와있다.
그래서 위에서 chromium 경로를 메모해둬야 한거다.

const browser = await puppeteer.launch({
	headless: 'new',
	executablePath: '/usr/bin/chromium',
	args: ['--no-sandbox', '--disabled-setupid-sandbox'],
});

executablePath args를 추가해주자.

해당 이슈에 관한 정보는 여기에 자세하게 나와있으니 확인할 사람을 확인하면된다.

마무리

이제 정상적으로 출력이 된다!
서버에 배포하면서 코드도 조금은 변했지만 중요 로직이 바뀐건 아니니 이 부분은 따로 포스팅하지는 않을 예정이지만 속도가 정말 매우매우매우 느려졌다 2배 정도?
그래서 해당 작업을 리팩토링 하고 그 결과를 포스팅하는 것을 마지막으로 해당 프로젝트는 종료하겠다.

참고했던 정보 링크

도커나 시그놀로지 공식 문서 등의 기본적인 문서는 링크하지 않겠다.

profile
돈이 좋아

0개의 댓글