로컬 장비를 활용한 배포를 위한 준비
Table of Content
NAS 파일 스토리지를 활용하기
•
NAS:
◦
역할: 대용량 스토리지로서 AWS S3의 스토리지 서비스 역할 대체
◦
Nginx:
▪
역할: NAS의 정적 파일을 서빙
▪
기능: AWS S3의 정적 파일 URL 제공 역할 대체
◦
NAS 내부 파일 서버 애플리케이션:
▪
역할: NestJS API로 파일 시스템 전용 서버
기능: 서비스 백엔드 서버의 파일 시스템(I/O) 기능이 독립화된 별도 서비스
▪
매개체 역할: NAS와 서비스 백엔드 서버 간의 파일 관련 매개체 역할 수행 (리버스 프록시)
•
서비스 백엔드 서버:
◦
역할: NestJS 기반의 서비스 관련 API 서버
◦
기능: 웹 애플리케이션의 기본적인 CRUD 기능 제공
◦
데이터 저장: 파일 경로를 데이터베이스에 URL Path 형태로 저장
•
서비스 프론트엔드 서버:
◦
역할: 웹 애플리케이션의 전체 뷰 페이지 렌더링 담당
◦
기능: 백엔드 API와 통신을 통한 동적 페이지 렌더링
파일 제공: 각종 파일은 백엔드로부터 전달받는 URL Path를 통해 제공
•
추가 고려 사항
◦
보안:
▪
외부 접근: 외부 접근을 허용하는 경우, 보안 설정 중요
▪
HTTPS: 암호화된 연결 제공 및 인증, 권한 관리 고려
◦
성능 최적화:
▪
Nginx 캐싱: 정적 파일의 성능 개선을 위해 Nginx의 캐싱 기능 활용
▪
비동기 처리: NAS 내부 파일 서버 애플리케이션에서 비동기 처리 및 큐 시스템 도입으로 파일 업로드 성능 향상
▪
모니터링 및 로깅:
•
로그 모니터링: 각 구성 요소의 로그를 주기적으로 모니터링하여 이슈 조기 발견 및 대응
•
개발 과정 중 문제 해결과 현재 상태
◦
NAS내 SSH 포트(22) 접근 권한을 열고 외부 접속으로 터미널에 접근
◦
FTP 및 자체 대시보드 클라이언트인 DSM으로도 접근이 가능하지만 node 기반의 커스텀된 서버 실행을 위해서는 내부 Linux OS에 접근이 필요, SSH 포트를 개방하고 접근
◦
인터넷이 연결된 스토리지라는 점을 활용해서 github의 원격 저장소에 로컬 파일 시스템에 접근하여 읽기, 쓰기 기능 모듈 프로젝트를 git clone을 통해 삽입 및 실행
▪
아래와 같이 간단히 업로드 경로에 파일을 업로드하는 기능을 작성
▪
해당 경로는 NAS의 시스템 root 계정이 생성한 폴더이므로 파일 읽기, 쓰기 기능 전에 접근 권한의 문제가 발생.
▪
폴더의 권한을 변경하여 현재 파일서버 모듈이 해당 폴더의 권한을 가지도록 변경
▪
이제 클론 받은 프로젝트를 빌드하여 실행시키면 {NAS_localhost}:3000 포트로 컨트롤러에 설정된 각 엔드포인트의 요청을 받을 수 있는 API 서버가 실행되는 상태
▪
이제 NAS에서는 3000번 포트가 작동하지만, 이곳에 파일 저장관련 요청을 보낼 백엔드 서버는 다른 위치에서 작동 할 수 있으므로 NAS는 외부에서 접근 가능해야 하며, 또한 특정 포트(3000 등)이 개방되어 있어야 함.
▪
따라서, NAS가 연결되어있는 네트워크의 구성은
•
외부IP(인터넷) → 라우터(공유기) → NAS(192.168.0.10)으로 내부IP로 고정하여 할당한 상태
•
따라서 외부IP:3000 이라는 요청은 내부NAS_IP:3000 요청으로 인식 될 수 있도록 설정하면 됨
•
이 과정을 통신하는 외부 IP 주소와 포트 번호를 내부 호스트에 다시 매핑하는 포트포워딩을 활용해 구성 할 수 있으며 이는 이미 SSH로 외부에서 NAS 터미널에 접근하도록 구성한 것과 동일하다는 것을 인지해야 함
•
이 부분은 이후 nginx등 웹서버가 정적 파일(HTML뿐만이 아닌 각종 파일도 정적 서빙의 대상임)들이 모이는 어떠한 폴더를 서빙하도록 구성할 것인데 이 또한 접근 할 수 있는 특정 내부 포트를 외부IP의 포트와 매핑하면서 파일에 접근 할 수 있도록 구성 될 것임
◦
간단하게 현재 AWS의 S3라는 스토리지 서비스에 파일을 업로드하면 해당 파일에 외부에서 접근 할 수 있는 URL을 제공받을 수 있는데, 이것을 NAS로 구현한 것이라 보면 됨.
▪
위와 같은 배경에 따라, 현재 파일을 업로드하는 NestJS 파일서버는 3000번 포트를 리스닝하고 있기 때문에 외부 3000번 포트로 맵핑하고 개방하면 해당 파일 서버에 요청을 보낼 수 있고 파일을 NAS 내부 스토리지에 저장 할 수 있도록 처리 할 수 있음
◦
NAS 내부의 파일서버를 실행시키고, 파일 업로드 기능이 외부에서 되는지 테스트하기 위해 POSTMAN으로 HTTP POST 요청에 영상과 같은 파일을 업로드하는 요청을 보냄
◦
NAS 내부에서 실행중인 파일서버는 해당 요청을 컨트롤러가 응답하여 서비스를 통해 NAS 내부의 volume2/video 라는 공유폴더까지 접근하여 해당 파일을 생성함.
◦
실제 NAS내부에 지정한 폴더에 해당 파일이 생성 되는 것을 확인 할 수 있음
▪
이 부분에서 특정 클라이언트(서버클라이언트)만이 해당 요청을 받을 수 있도록 CORS 교차 출처에서 해당 클라이언트만 허용 할 수 있도록 추가 설정이 필요하며 보안관련 설정을 추가해나갈 필요가 있음.
◦
NAS 자체는 다양한 방식으로 파일을 공유 할 수 있는 내부 애플리케이션을 제공하지만, 이는 DSM이라는 NAS 전용 OS에 종속되어 있고 이는 NAS에 등록된 유저를 확인하는 과정이 있음
▪
NAS는 단순히 스토리지 역할을 하면서 사용자들에게 영상 등 자료를 보여줄 수 있는 역할만 하도록 구성하고자 함에 각 사용자에게 영상을 보기 위해 해당 NAS 등 스트리밍 플랫폼의 추가 가입은 불필요한 상황
▪
이 문제가 발생하는 이유는 해당 파일 공유 시스템은 대부분 웹하드와 유사한 형태로 일부 폐쇄적 작동되기 때문
▪
이에 따라 NAS의 애플리케이션 중 웹서버로 홈페이지를 쉽게 배포해줄 수 있는 Web Station을 활용
•
특정 포트, 웹서버 활용, 루트 폴더 선택 기능으로 간단하게 정적 파일(폴더)를 서빙
•
특히 Nginx의 config를 통해 캐싱 등 부가적인 부분을 해결 할 수 있으므로 사용하게 되었음
◦
◦
특정 IP가 노출 되지 않도록 추후 커스텀 도메인으로 변경 할 필요가 있으며 현재는 Synology사가 제공해주는 무료 도메인으로도 Nginx 웹서버가 개방한 4000번 포트에 정상적으로 정적 파일이 접근 되는 것을 확인 할 수 있음
▪
이처럼 NAS에 파일 업로드 / NAS에 있는 파일 제공 두가지 문제의 기초 솔루션으로 활용하고 추가적인 보안 등 고려할 문제를 파악, 해결해야 함
▪
특히 NAS 자체가 제공해주는 무료 도메인, 무료 인증서를 통해서 보안적인 기초 문제를 해결 할 가능성이 높음
Related Posts
Search