시놀로지 NAS를 웹서버로 운영하기

시놀로지 NAS를 웹서버로 운영하기

Tags
WebDev
Node.js
Projects
NAS
Published
2021년 11월 8일
이 이야기는 개인용 NAS를 웹서버로 구성하고 운영하는 내용을 다루고 있습니다.

소개

결혼 전에는 남아도는 시간을 삽질에 투자하는 잉여로운 생활을 영위하다가 문득 그 시절이 그리워 뭔가 방도를 마련해야 갰다는 생각이 들었습니다. 육아를 핑계로 수년간 글을 싸지르지 못하니 뭐가 욕구불만 같은 것이 축적되는 것 같은 느낌이랄까요.
어느 생각을 실행에 옮기리면 재원이 필요하기 마련인데 저 같은 경우는 개인용 NAS로 홈네트워크를 구축하면서 부터입니다. 진작에 구입해서 가지고 놀걸 그랬다는 아쉬움이 남네요. 애기 사진을 보관하고 애기가 좋아하는 동영상을 스트림하려는 소박한 목적으로 구입했는데요, 요녀석 아주 물건이더군요. 파일을 백업하는 다양한 방법 외에도 웹서버로 활용하거나 이메일, LDAP, DNS, Git, VPN, IoT등 다양한 웹 호스트를 아주 손쉽게 구성할 수 있습니다. 또한 PHP, Python, Node.js를 원클릭으로 설치할 수 있고 끝판왕이라고 할 수 있는 도커 허브가 제공되어 전 세계 개발자들이 개시한 컨테이너를 클릭 몇 번으로 내 시스템에 구동할 수 있습니다.
NAS 관련해서는 할말이 많지만 이즈음해서 접어두고, 요녀석을 본격적인 웹서버로 사용해 보기로 했습니다.

환경 구성

시놀로지 NAS에서 제공하는 웹기반 콘솔
시놀로지 NAS에서 제공하는 웹기반 콘솔
일단 Node.js와 WebSocket을 사용할 예정이어서 Node.js는 콘솔에서 제공하는 기능으로 설치하고 Redis는 도커로 설치했습니다. 그리고 외부 접근용 도메인으로 실험목적으로 운영중이었던 firejune.io를 사용합니다

도메인 연결

네트워크 환경을 먼저 구성해 봅시다. firejune.io 도메인 네임서버를 CloudFlare에 물리고 홈 네트워크를 바라보도록 구성했습니다. 클라우드플레어를 네임서버로 사용한 이유는 여러 장점들이 있지만 이번의 경우는 DDNS 때문입니다. 가정용 인터넷은 유동 IP이기 때문에 갱신되어도 정상적으로 연결될 수 있도록하는 장치가 필요한데요. 클라우드플레어는 IP를 갱신시켜주는 오픈API를 제공합니다.
import configparser
import urllib.request
import os, stat

url = 'https://raw.githubusercontent.com/namukcom/SynologyCloudflareDDNS/master/cloudflare.php'
target_file = '/usr/syno/bin/ddns/cloudflare.php'

config= configparser.ConfigParser()
config.read('/etc.defaults/ddns_provider.conf')

try:
        config['Cloudflare']
except KeyError:
        config['Cloudflare']= {}

config['Cloudflare']['modulepath'] = '/usr/syno/bin/ddns/cloudflare.php'
config['Cloudflare']['queryurl'] = 'https://www.cloudflare.com/'

with open('/etc.defaults/ddns_provider.conf', 'w') as configfile:
        config.write(configfile)

urllib.request.urlretrieve(url, target_file)
os.chmod(target_file, stat.S_IRUSR |  stat.S_IWUSR |  stat.S_IXUSR |  stat.S_IRGRP | stat.S_IXGRP | stat.S_IROTH | stat.S_IXOTH)

NAT 설정

설정된 도메인을 브라우저에 딱 치면, ISP에서 제공한 공유기 설정화면이 나타납니다. 외부에서 들어오는 트래픽을 NAS장비로 흘려보내기 위해서는 NAS 장비의 IP를 고정으로 하고, 공유기 설정에 진입하여 DMZ서버를 NAS 장비로 연결해 주어야 합니다.
LG U+ 공유기의 DMZ 서버 설정 화면
LG U+ 공유기의 DMZ 서버 설정 화면

80/443 포트 활성

이제 다시 도메인을 브라우저에 딱 치면, 시놀로지 웹 관리 콘솔로 연결됩니다. 그런데 이상합니다. 웹 관리 콘솔의 접근 포트에 80/443은 할당하지 못하도록 되어있는데 말이죠. 이유는 잘 모르겠지만 어찌되든 중요한 건 NAS에서 이미 80/443포트을 점유하고 있다는 것입니다. 이 값비싼 포트에서 서빙되고 있는 내용은 웹콘솔 서비스가 돌고있는 포트로 리다이랙트하는 내용의 자바스크립트만 달랑 있는 html 페이지 하나입니다. 아래와 같은 nginx 포트 설정을 변경하는 명령으로 80/443 포트를 확보해 주었습니다.
HTTP_PORT=81
HTTPS_PORT=444

sed -i "s/^\( *listen .*\)80/\1$HTTP_PORT/" /usr/syno/share/nginx/*.mustache
sed -i "s/^\( *listen .*\)443/\1$HTTPS_PORT/" /usr/syno/share/nginx/*.mustache

운영 준비 완료

이제 운영 준비는 끝났습니다. 기존에 돌리고 있던 몇몇 실험적 프로젝트를 올려주었더니 정상적으로 잘 동작하고 있습니다.(**24에서 호스팅 받던 가상서버 호스팅은 이제 이별할 시간입니다.)
요즘 다들 도커를 기반으로 배포환경을 구성하는데, 저는 더럽게 느려서 좀 그렇더라구요. 이 환경에서는 무엇보다도 빠르고 심플하게 배포되는 것을 컨셉으로 진행해 보려고 합니다.

리소스