개요
보통 '나만의 넷플릭스 구축기'라고 하면 Plex가 유명합니다. 그러나 Plex는 Plex Pass가 없다면 하드웨어 트랜스코딩 기능을 사용할 수 없어 트랜스코딩 시 CPU사용률이 치솟는다는 점과 모바일에서 시청할 때 별도로 어플을 구매해야 된다는 단점이 있습니다.
Jellyfin은 오픈소스로서 모든 기능을 무료로 사용할 수 있다는 장점이 있습니다. Plex만큼 UI가 미려하진 않지만, 부담없이 사용할 수 있다는 점에서 장점이 있다고 생각합니다.
이 글에서는, 바로 이전에 오라클 A1에 구축했던 teldrive를 함께 사용하겠습니다.
2025.01.23 - [Apps] - 오라클 클라우드와 Teldrive로 서버 없이 무제한 클라우드 사용하기
오라클 클라우드와 Teldrive로 서버 없이 무제한 클라우드 사용하기
2024-09-02 변경 내용 : teldrive 도커 허브 레지스트리 변경 반영(divyam234/teldrive → tgdrive/teldrive)개요구드 무제한이 사라지고 Dropbox에서 팀을 꾸려 사용하는 무제한 클라우드들도 일정 사용량이 넘어
worklazy.net
Docker compose 작성하기
공식 docker compose
Jellyfin 공식 문서에서 docker-compose 구문을 확인할 수 있습니다.
services:
jellyfin:
image: jellyfin/jellyfin
container_name: jellyfin
user: uid:gid
network_mode: 'host'
volumes:
- /path/to/config:/config
- /path/to/cache:/cache
- type: bind
source: /path/to/media
target: /media
- type: bind
source: /path/to/media2
target: /media2
read_only: true
restart: 'unless-stopped'
# Optional - alternative address used for autodiscovery
environment:
- JELLYFIN_PublishedServerUrl=http://example.com
# Optional - may be necessary for docker healthcheck to pass if running in host network mode
extra_hosts:
- 'host.docker.internal:host-gateway'
마운트 경로 준비
먼저, /config와 /cache용도로 사용할 폴더를 생성하겠습니다.
제 경우 /docker/jellyfin 하위에 생성했습니다.
root@instance-20220708-1441:/docker/jellyfin# ls -lah
total 16K
drwxr-xr-x 4 root root 4.0K Aug 30 21:17 .
drwxr-xr-x 11 root root 4.0K Aug 30 21:14 ..
drwxr-xr-x 2 root root 4.0K Aug 30 21:17 cache
drwxr-xr-x 2 root root 4.0K Aug 30 21:17 config
미디어 라이브러리로 사용할 폴더는 /mnt/media에 있습니다.
도메인 연결(선택)
오라클 클라우드에 올려놓은 서비스를 매번 공인IP:port 조합으로 사용할 순 없습니다. 저는 오라클 클라우드에 클플 터널을 연결해 사용중이고, 여기에 서브 도메인을 하나 연결했습니다.
어차피 젤리핀 모바일 어플도 접속URL을 요구하기 때문에 지금 미리 생성해 두겠습니다.
최종 docker compose
이 경로들을 반영한 docker-compose는 아래와 같이 됩니다.
Rclone으로 마운트한 teldrive 라이브러리는 root로 마운트했기 때문에, 파일 접근 권한을 위해 user: uid:gid 구문을 제거하여 root로 실행되도록 했습니다.
services:
jellyfin:
image: jellyfin/jellyfin:latest
container_name: jellyfin
network_mode: 'host'
volumes:
- /docker/jellyfin/config:/config
- /docker/jellyfin/cache:/cache
- type: bind
source: /mnt/media
target: /media
read_only: true
restart: 'unless-stopped'
# Optional - alternative address used for autodiscovery
environment:
- JELLYFIN_PublishedServerUrl=http://jellysample.fenta.cc
devices:
- /dev/dri:/dev/dri
# Optional - may be necessary for docker healthcheck to pass if running in host network mode
extra_hosts:
- 'host.docker.internal:host-gateway'
저는 오라클 위에 올려둔 portainer에서 Stack으로 실행시켰습니다.
Jellyfin 초기 설정
방화벽 열어주기
오라클 클라우드를 사용하고 있으므로 해당 포트를 열어주어야 합니다.
Jellyfin에서 사용하는 포트는 공식 문서에서 확인할 수 있습니다.
해당 포트 4개를 열어주시면 됩니다.
오라클 클라우드 방화벽 설정
별도의 방화벽 없이 운용하고 계시다면, 이 과정은 생략해도 됩니다.
여타 방화벽이 없는 환경이라면 곧바로 IP:8096으로 Jellyfin에 접근할 수 있습니다.
포트포워딩
오라클 클라우드가 아닌, 홈서버 등에서 사용하고 있다면, 사용중인 공유기에서 위 4개의 포트를 Jellyfin 컨테이너가 있는 IP로 포트포워딩 해주셔야 합니다.
Jellyfin 접속
내부IP:8096 혹은 위에서 연결한 도메인으로 접속하면 아래처럼 초기 설정 화면을 만나실 수 있습니다.
관리자 계정을 생성하고 넘어가 줍니다.
미디어 라이브러리를 추가하라고 합니다.
경로에서 /media로 이동해 가진 파일들을 추가해 줍니다.
라이브러리를 추가했다면 아래처럼 UI상으로 추가되었음을 확인할 수 있습니다.
선호하는 메타데이터 언어는 개별 환경에 맞게 사용하시면 됩니다.
주로 시청하는 것이 미드, 영드라면 영어로, 애니메이션을 시청한다면 일본어로 해두면 편합니다. 어차피 라이브러리 별로 개별 설정이 가능하기 때문에 잘못 설정한다고 해도 문제 없으며 설정에서 변경 가능합니다.
원격 접속을 허용하지 않을 시 외부에서는 접근할 수 없게 됩니다. 이에 따라, 내부망에서만 사용할 수 있게 됩니다.
자동 포트 맵핑 사용은 비활성화 해 줍니다.
끝내기를 클릭해 초기 설정을 마무리 합니다.
로그인 화면으로 리다이렉트 됩니다.
위에서 설정했던 관리자 계정을 사용해 로그인을 진행하면 됩니다.
Jellyfin 추가 설정
일반 설정
우측 상단의 사람 모양 아이콘을 누르면 아래와 같은 메뉴를 볼 수 있습니다.
대시보드를 클릭합니다.
그러면 아래와 같은 대시보드에 접근할 수 있습니다.
일반 탭에서 서버 이름을 수정할 수 있고,
사용자 탭에서 추가적인 사용자를 생성하여 사용할 수 있습니다.
재생 - 트랜스코딩 탭에서 하드웨어 가속을 설정할 수 있습니다.
QSV(인텔 내장), AMD, NVENC, VAAPI 등은 일반적으로 /dev/dri를 추가하면 원활하게 작동되지만, 그 외의 것들은 아래에 해당하는 장치가 있는지 확인하고 추가적으로 마운트해야 할 수도 있습니다.
devices:
- /dev/vcsm:/dev/vcsm #optional
- /dev/vchiq:/dev/vchiq #optional
- /dev/video10:/dev/video10 #optional
- /dev/video11:/dev/video11 #optional
- /dev/video12:/dev/video12 #optional
OIDC 연동
Open ID Connect를 이용해 외부 로그인 활성화 및 SSO(Single Sign-on)기능을 구현 할 수 있습니다. 본문에서 IdP(Identify Provider)는 Authentik을 사용하겠습니다.
Authentik 설정
OAuth2/OpenID Provider를 생성합니다.
- 이름 : 식별 가능한 선에서 자유롭게
- 리디렉션 URI : https://{도메인}/sso/OID/redirect/authentik
Application도 생성해 줍니다.
- 이름 : 식별 가능한 선에서 자유롭게
- 슬러그 : 상동
- 시작 URL : https://{도메인}/sso/OID/start/authentik
여기까지 생성 후 공급자에서 Jellyfin을 확인하면 아래처럼 OIDC연동에 필요한 주소가 모두 생성된 것을 확인할 수 있습니다.
Jellyfin 설정
- SSO-Auth 설정
Jellyfin은 자체 기능이 아니고 외부 라이브러리를 이용해야 하기 때문에 레파지토리부터 등록해야 합니다.
플러그인 - 저장소 탭에서 아래 URL을 추가해 줍니다. 저장소 이름은 자유롭게 기입하시면 됩니다.
https://raw.githubusercontent.com/9p4/jellyfin-plugin-sso/manifest-release/manifest.json
다시 플러그인 - 카탈로그 탭에서 SSO Authenticaion을 클릭해 설치합니다.
설치가 완료되었다면 컨테이너를 재시작 해 줍니다.
재시작 후 플러그인 - 내 플러그인 탭에서 SSO-Auth를 클릭합니다.
아래처럼, SSO 연동을 위한 설정창이 나타납니다.
필수적이거나 주로 사용할만한 부분만 기입하겠습니다.
- Name of OID Provider : authentik
- OID Endpoint : Jellyfin공급자의 OpenID 구성 URL
- Open ID Client ID : Jellyfin공급자의 클라이언트 ID
- OID Secret : Jellyfin공급자의 클라이언트 비밀
- Enabled : 체크
- Enable Authorization by Plugin : 체크
- Enable All Folders : SSO로그인한 사용자에게 모든 라이브러리 접근 권한을 주려는 경우 체크(아닐 경우 그 아래에 Enabled Folders에서 라이브러리 개별로 체크)
- Roles : 그룹을 사용하려 하고, 특정 그룹만 허용하려 할 경우 이 곳에 그룹명 기입
- Enable Role-Based Folder Access : SSO로그인한 사용자의 Roles에 따라 접근 가능한 라이브러리를 따로 지정하려는 경우 체크(이 경우 아래 Folder Role Mapping을 통해 지정)
- Role Claim : 그룹을 사용하려 할 경우 'groups' 입력
- Set default Provider : Jellyfin 자체 로그인과 SSO로그인을 병행하려는 경우 공란, SSO로그인만 사용하려는 경우 authentik입력
- Set default username Claim : preferred_username을 넘겨받아 사용하려면 공란, 그 외의 경우 해당 scope입력(nickname, sub 등)
- SSO로그인 버튼 달아주기
일반 탭에서 브랜딩 항목으로 이동합니다.
로그인 고지사항에 아래와 같은 코드를 복사 붙여넣기 합니다({도메인}부분은 각자 수정 필요).
<form action="https://{도메인}/sso/OID/start/authentik">
<button class="raised block emby-button button-submit">
Sign in with SSO
</button>
</form>
사용자 지정 CSS에도 아래와 같은 코드를 복사 붙여넣기 합니다.
a.raised.emby-button {
padding:0.9em 1em;
color: inherit !important;
}
.disclaimerContainer{
display: block;
}
최하단 '저장'버튼을 클릭합니다.
로그아웃 후 로그인 페이지로 이동하면 아래와 같이 SSO 로그인 버튼을 확인할 수 있고, 기능도 잘 작동하는 것을 확인할 수 있습니다.
심지어 모바일APP에서도 SSO로그인 버튼이 생성된 것을 확인할 수 있습니다.
마무리
Plex는 SSO로그인 기능을 지원하지 않습니다. 그래서 Plex Pass없는 지인들에게 라이브러리를 공유해주기 까다롭죠. 모바일 앱이 인앱 결제를 요구하니까요.
그렇다고 공유해주는 지인마다 제 아이디를 알려주기도 그렇고, 그걸 위한 비밀번호를 별도로 생성해서 관리하는 것도 까다롭고... 아이디 안에 프로필 덕지덕지 만들어놓는 것도 내키지 않죠.
Jellyfin은 이러한 부분때문에 설치해보게 되었습니다.
생각보다 더 직관적이고, SSO기능도 잘 작동하니까, 이제 주변 공유는 Jellyfin을 이용하는 게 낫겠네요.
관련 글
2025.01.23 - [Apps] - Authentik으로 홈서버 SSO 구현하기 (3) – OAuth/OpenID
Authentik으로 홈서버 SSO 구현하기 (3) – OAuth/OpenID
개요LDAP는 있으면 좋지만, 이것만으로는 번거로운 로그인 과정을 전부 해결할 수는 없습니다.이번 글에서는 OAuth / OpenID Provider를 설정하는 방법을 적어 보겠습니다.LDAP가 조직 내부 네트워크 인
worklazy.net
출처
1. https://jellyfin.org/docs/general/installation/container
Container | Jellyfin
Install as a container using Docker, Podman and others.
jellyfin.org
2. https://jellyfin.org/docs/general/networking/
Networking | Jellyfin
This section describes how to get basic connectivity to a Jellyfin server, and also some more advanced networking scenarios.
jellyfin.org
3. https://docs.goauthentik.io/integrations/services/jellyfin/
Integrate with Jellyfin | authentik
Support level: Community
docs.goauthentik.io