[Docker for a NAS] Jellyfin 개인 미디어 서버
나스를 구축하는 분들 상당수는 엄청난 양의 데이터를 가지고 있습니다. 그리고 그 용량의 상당수는 보통 영상일 거예요. 이 파일을 FTP나 SMB로 열람하는 것도 좋지만, 이왕이면 좀 있어 보이게 정리하고 싶은 마음도 있겠죠. 그러기 위해 설치하는 것이 개인 미디어 서버입니다.
원래 이쪽으로는 Plex가 더 유명한데요. 모바일 기능 지원 등 일부 기능이 유료인 플렉스에 비해 젤리핀은 오픈 소스로써 모든 기능이 무료이기 때문에 이쪽으로 준비해 봤습니다. 물론 플렉스의 설치도 어렵지는 않은 편이고, 사용자가 많아 부가기능이나 정보도 쉽게 구할 수 있습니다.
젤리핀 얘기를 좀 더 해 봅시다.
Jellyfin
Jellyfin은 Emby에서 포크 된 미디어 서버 시스템입니다. 무슨 이유로 포크 되었는지는 짧은 검색 실력 시간으로는 알 수가 없네요.
옛날에는 기능이 다소 부족한 편이었는데요. 요즘은 안드로이드 앱도 있고, 아이폰 앱은 물론 안드로이드 TV용 앱도 있는 것 같습니다. 이제는 정말 사용하기 편해진 것 같네요. 태그만 잘 단다면…
사전 작업
젤리핀 다운로드 페이지에서 도커 설치법을 안내해 주고 있습니다. 이 내용을 기반으로 만들어봅시다.
설정 및 캐시 폴더 생성
젤리핀 계정 등 설정 정보를 저장할 폴더와 영상 재생 중 임시 생성 파일을 저장하는 캐시 폴더를 생성합니다. 캐시 폴더는 SSD에 지정해주면 매우 좋을 것 같네요.
$ mkdir -p /docker/jellyfin/{config,cache}
{config,cache}
처럼 쓰면 동시에 폴더 여러 개를 만들 수 있는 것 같습니다. 저도 이번에 리눅스 명령 하나를 새로 알아가네요.
영상 폴더 지정
영상을 저장할 폴더를 지정합니다. 기존에 영상을 관리하던 폴더의 경로를 pwd
명령으로 확인해 두세요. 저는 이참에 폴더를 하나 만들도록 하겠습니다. /data
경로 아래 video
라는 이름으로 만들었어요.
$ mkdir -p /data/video
도커 컨테이너 생성
아래의 docker-compose 파일 내용을 포테이너의 Add Stack > Web editor 아래의 공간에 복사하여 붙여넣습니다.
사실 다운로드 페이지의 명령어를 도커 컴포즈 형식으로 옮겨온 것에 가깝습니다. 사실, 이 시리즈의 대부분이 공식 문서의 내용을 그대로 가져온 수준에 지나지 않긴 해요.
version: "3"
services:
jellyfin:
image: jellyfin/jellyfin:latest
volumes:
- /docker/jellyfin/config:/config
- /docker/jellyfin/cache:/cache
- /data/video:/media
network_mode: host
하지만 설명과 상황에 따른 변형을 해 드릴 수 있으니 도움은 될 것 같네요. 예를 들면, 이 시리즈에서 network_mode: host
는 처음 보죠?
network_mode: host
이건 무슨 뜻이냐면요, 도커 컨테이너의 네트워크 설정을 어떻게 하냐는 건데요. 이 설정의 기본값은 network_mode: bridge
입니다.
자세한 원리는 구구절절 설명할 것이 좀 되지만, 사실 저도 잘 몰라서 저희는 사용하기 위한 최소 이해만을 필요로 하므로 결과적으로 어떤 차이가 있냐면요. host
로 두면 이 컨테이너가 사용하는 모든 포트가 개방됩니다.
그러니까 젤리핀 공식 설명서는 모든 포트의 오픈을 요구하고 있는 셈이죠. 다른 서비스와 충돌이 날 것 같거나 할 때는 기존처럼 브릿지 모드로 설정하면서, 젤리핀에서 사용될 포트를 지정해주면 됩니다.
위의 컴포즈 내용에서 network_mode
를 아래와 같이 바꾸고, 포트 매핑 정보를 추가해 주세요.
network_mode: bridge
ports:
- 8096:8096
- 8920:8920
8096번 포트는 젤리핀 HTTP 서비스의 포트이고, 8920번 포트는 젤리핀 HTTPS 서비스의 포트입니다. 이 외의 포트는 기본 설정 아래에서는 지정할 필요가 없는 것 같아요. DNLA나 다른 목적의 포트가 있을 수도 있겠지만 아직 발견하지는 못했습니다.
후술하겠지만, HTTPS 서비스를 역방향 프록시로 설정할 때는 8920 포트를 매핑할 필요도 없습니다. 역방향 프록시 설정에서 HTTPS 접속을 HTTP 8096 포트로 프록시해주면 되거든요.
여러 미디어 폴더를 바인딩하기
/data/video
한 개의 폴더에만 영상이 있지는 않을 수도 있잖아요? 그럴 땐 어떻게 할까요? 호스트의 전체 폴더를 바인딩할 수도 있습니다. 이렇게요.
- /:/media # DO NOT BIND a directory like this!
되기는 할 테지만, 좋은 방법은 아닙니다. 대신에 이렇게 해 보세요. /data/drama
폴더와 /data/movie
폴더 두 개를 바인딩해야 한다고 생각해 봅시다.
- /data/drama:/media/drama
- /data/movie:/media/movie
이렇게 컨테이너 쪽 바인딩 경로도 세분화하며 지정하면 여러 폴더를 지정할 수 있습니다. 이렇게 하면 젤리핀에서는 /media/drama
, /media/movie
폴더에서 이 내용을 확인할 수 있게 돼요.
서비스 동작 확인
이제 http://나스_IP:8096에 접속해 봅시다.
역시 영어로 반겨주는 건 반갑지 않네요. Korean이 있으니 선택해 줍시다. 어, 근데 한국어가 아니고 Korean?
그렇습니다. 언어 설정은 페이크였어요. (사실, 설정 후의 대시보드 언어 설정을 의미하는 것 같아요)
하지만 이 정도 영어는 읽을 수 있으니, 초기 계정 설정을 해줍시다.
그러면 이처럼 라이브러리 설정을 시작할 수 있어요. 바인딩한 media
폴더들을 분류에 맞게 등록해 주면 됩니다. 저는 arm
테스트용으로 임시 설치했기 때문에 여기까지만 안내하도록 하겠습니다.
그리고 남은 이야기
스마트폰 앱을 통해서 외부에서도 접속하려면 Nginx Proxy Manager에서 프록시 호스트 설정을 해 줘야 합니다. HTTPS 설정도 여기서 같이 하는 게 더 편할 거예요.
지금 설치법으로는 그래픽카드의 자원을 활용하여 영상의 화질을 실시간 조정하는 하드웨어 트랜스코딩이라는 기능을 사용할 수가 없습니다. 트랜스코딩에 대한 설명도 필요하고, 기기마다 지원 여부가 상이하므로 본문에는 넣을 수가 없었어요. 혹시 사용하려는 분은 본인 장비의 트랜스코딩 지원 여부를 확인하고, 아래 내용을 추가하여 컨테이너를 생성하면 됩니다.
devices:
- /dev/dri:/dev/dri
물론, 기기마다 저 위치가 상이할 수도 있으므로 동작을 보증할 수는 없습니다.
댓글남기기