Debian 13 LXC - Jellyfin + 트랜스코딩 (Transcoding)

mimic·2026년 8월 31일

나만의 OTT Jellyfin을 위해서는 CPU 내장 그래픽 Radeon 780M을 어떤 환경으로 만들어서 붙일지 결정해야 합니다.


  • 방식 별 장단점
방식iGPU 트랜스코딩
LXCiGPU 공유 쉬움 (여러 LXC가 나눠씀)
VMGPU 패스스루 필요(까다롭고 독점됨)
시놀로지 Docker시놀로지가 iGPU 잡고 있어야 함

아무래도 추후 LLM 구축까지 염두에 두고 있어 LXC 방식이 유연하게 활용하기 좋을 것 같습니다.


LXC 생성 옵션

패키지 설정

apt update && apt upgrade -y
apt install -y curl gnupg vim wget net-tools

Jellyfin 설치

curl -s https://repo.jellyfin.org/install-debuntu.sh | bash

설치가 완료되면 연결 가능한 도메인이 출력됩니다.

You should see the service as 'active (running)' above. If not, use https://jellyfin.org/contact to find us for troubleshooting.
You can access your new instance now at http://172.30.1.102:8096 in your web browser to finish setting up Jellyfin.
Thank you for installing Jellyfin, and happy watching!

도메인 연결 (NginxProxyGuard 프록시 호스트 등록)

프록시 호스트로 등록하고 SSL 인증서까지 설치합니다.

중요한 포인트는 실제 호스트에 연결 시에는 http://로 해야 한다는 것입니다. 아니면 302나 503 에러가 발생할 수 있습니다.

Jellyfin 초기 설정

브라우저에 초기 접근 시 아래와 같이 설정 화면이 출력됩니다.

Jellyfin 스킨 변경

Skin Manager를 설치하여 스킨을 변경할 수 있습니다.
우선 과정은 [플러그인 Repo 추가 → File Transformaion 플러그인 설치 → SkinManager 플러그인 설치] 순입니다.

플러그인 Repo 추가

[대시보드 → 플러그인 → Manage Repositories]


[https://raw.githubusercontent.com/Jellyfin-PG/Repository/refs/heads/main/manifest.json 추가]

[File Transformaion 플러그인 설치]

설치 후에는 반드시 Enabled를 별도로 해줘야 합니다.

[SkinManager 플러그인 설치]

이제 Jellyfin 서비스를 다시 시작하면 대시보드 하단에 SkinManager가 생성되어 있습니다.

트랜스코딩(Transcoding) 설정

1) Proxmox: LXC에 iGPU 장치를 넘겨줘야 함 (컨테이너 밖 설정)
2) LXC: 드라이버 깔고 Jellyfin에서 VAAPI 켜기 (컨테이너 안 설정)

Proxmox 설정

① iGPU 장치 확인 (Proxmox 호스트 셸)

ls -l /dev/dri

iGPU 장치 번호 획득

ls -l /dev/dri/renderD128

iGPU 장치 그룹 번호 획득
그룹이 render, 장치 번호 226, 128 (major 226, minor 128)

확실한 확인을 위해 아래와 같이 그룹 번호를 한 번 더 확인합니다.

getent group render
===
render:x:993:
===

getent group video
===
video:x:44:
===

ls -al /dev/dri
===
total 0
drwxr-xr-x  3 root root        100 Aug 28 08:23 .
drwxr-xr-x 22 root root       5360 Sep  2 11:26 ..
drwxr-xr-x  2 root root         80 Aug 28 08:23 by-path
crw-rw----  1 root video  226,   1 Aug 28 09:48 card1
crw-rw----  1 root render 226, 128 Aug 28 08:23 renderD128
===

최종 확인 내역

video 그룹 = 44, render 그룹 = 993
장치: card1 (226,1 · video 그룹), renderD128 (226,128 · render 그룹)

② LXC에 장치 넘기기 (Proxmox 호스트)
※ LXC 컨테이너 전원이 종료(Off) 상태여야 합니다.

# Proxmox Shell
# vi /etc/pve/lxc/$VM_ID.conf
vi /etc/pve/lxc/102.conf
===
dev0: /dev/dri/renderD128,gid=993
dev1: /dev/dri/card1,gid=44
===

gid=44는 보통 video/render 그룹인데, 위에서 확인한 iGPU 장치 그룹 번호에 맞춰야 합니다.
설정이 완료되었다면 LXC 전원을 켭니다.

연결되었는지 LXC 리소스 내역과 컨테이너 내부에서 콘솔 명령어로 확인합니다.


LXC 내 드라이버 설치

AMD VAAPI 드라이버 설치가 필요합니다.

apt install -y mesa-va-drivers vainfo

iGPU가 인식되는지 확인합니다.

vainfo

vainfo --display drm --device /dev/dri/renderD128

코덱 목록(H264, HEVC 등)이 주르륵 출력되어야 합니다. 출력 데이터는 제가 넣은 iGPU가 다룰 수 있는 코덱을 의미합니다. 정리하면 아래 표와 같습니다.

코덱디코딩(VLD)인코딩(Enc)
H.264✅✅
HEVC (H.265) Main✅✅
HEVC 10bit✅✅
VP9✅—
AV1✅✅

4K 영상은 대부분 HEVC 코덱을 사용하기 때문에, HEVC 10bit 디코딩+인코딩이 전부 하드웨어 처리가 가능한 점이 중요합니다.

이제 서버 단에서 설정은 모두 되었습니다. 웹 UI에서 Jellyfin 설정을 변경해야 합니다.


Jellyfin에서 VAAPI 켜기

Jellyfin 웹 UI에서 진행

[우측 상단 관리자 → 대시보드 → 재생(Playback) → 하드웨어 가속(Hardware acceleration): VAAPI 선택 → VA-API 장치: /dev/dri/renderD128 입력 → 트랜스코딩할 코덱들 체크 (H264, HEVC 등) → 저장]


시놀로지(Synology) 데이터 디렉터리 연결

계정 및 권한 설정 정리

가족 구성원 별로 접근 가능한 경로를 제한하려고 할 때, 두 시스템이 별개이기 때문에 아래처럼 Jellyfin으로 영상 감상 시 Jellyfin 내부 계정으로 권한을 분류해야 합니다.

👉 시놀로지 계정 분류: 시놀로지 로그인하는 계정으로 데이터 폴더에 접근할 수 있는 물리적 권한
👉 Jellyfin 계정 분류: Jellyfin 로그인하는 계정으로 Jellyfin으로 재생 가능한 권한


🔐 최종 권한 설정
[Jellyfin --- 전용계정 하나로 마운트 ---> 시놀로지 shared DataDir]
│
└── 가족들은 Jellyfin WEB 안에서 각자 로그인 (Jellyfin 계정)

Jellyfin 미디어와 시놀로지 연결

  • 시놀로지 그룹 Jellyfin 생성
공유 폴더 권한그룹 명응용 프로그램 권한
읽기JellyfinSMB 하나만 허용 후 나머지 전부 거부

  • 시놀로지 계정 Jellyfin-svc 생성
    계정 로그인 정보와 그룹 설정만 해주고 나머지는 그룹 권한을 상속받아 쓰도록 아무것도 설정하지 않습니다.

이렇게 해야 똑같은 작업(권한 변경)을 두 번 할 일이 없습니다.

Jellyfin LXC에 시놀로지 SMB 연결

Jellyfin은 unprivileged 컨테이너라서 안에서 직접 마운트(mount) 시 커널이 거부하여 permission denied가 발생합니다. 이를 해결하기 위해서는 두 가지 방법이 있습니다.

방법 ① 설정에서 컨테이너에 권한 부여

vi /etc/pve/lxc/102.conf
===
lxc.apparmor.profile: unconfined
lxc.cap.drop:
===

설정 변경 후 LXC 재부팅이 필요합니다. 또한 이 옵션은 사실상 컨테이너에게 마운트 권한 뿐 아니라 모든 권한을 부여하는 설정이라고 보아야 합니다.

방법 ② Proxmox 관리 인프라 단에서 SMB 경로 연결해주기
Proxmox 서버에서 mount한 뒤 해당 경로를 Jellyfin LXC에 붙여주는 작업입니다.

✅ 채택: ② Proxmox 관리 인프라 단에서 SMB 경로 연결해주기

unprivileged 컨테이너는 host 서버의 root 계정이 인프라 시스템의 root와 별개로 동작하며, 자원은 공유하지만 컨테이너 내 root 계정은 인프라 시스템(클러스터 노드)에서는 일반 계정으로 분류된다는 특징이 있습니다.
Jellyfin 웹을 외부에 공개해두기 때문에 보안 상 문제가 발생하더라도 피해 규모를 최소화하기 위해 번거롭지만 Proxmox 관리 인프라 단에서 시놀로지 폴더를 SMB 연결해주기로 하였습니다.

  • Proxmox 호스트 Shell에서
    1단계: SMB 마운트 준비
apt install -y cifs-utils
mkdir -p /mnt/$마운트_경로_명
vi /root/.smbcred
===
# 시놀로지 연결 할 Jellyfin 계정 정보 입력
username=jellyfin-svc
password=$password
===
chmod 600 /root/.smbcred

2단계: 마운트 테스트

mount -t cifs "//172.30.1.100/$마운트_경로_명" /mnt/$마운트_경로_명 -o credentials=/root/.smbcred,ro,uid=100000,gid=100000,iocharset=utf8

# 성공 시 마운트 해제
umount /mnt/$마운트_경로_명

마운트 경로 명을 정확하게 확인하려면 smbclient -L //172.30.1.100 -U jellyfin-svc 명령어를 사용하면 됩니다.

3단계: 자동 마운트 등록 (fstab)

vi /etc/fstab
===
//172.30.1.100/$마운트_경로_명  /mnt/$마운트_경로_명  cifs  credentials=/root/.smbcred,ro,uid=100000,gid=100000,iocharset=utf8,_netdev,nofail  0  0
===

mount -a
df -TH

4단계: Jellyfin 컨테이너 설정에 마운트 경로 추가 및 컨테이너 리부팅

vi /etc/pve/lxc/102.conf
===
mp0: /mnt/syno/$마운트_경로_명,mp=/mnt/media/$마운트_경로_명,ro=1
# 여러 개일 경우 아래 처럼 추가
# mp1: /mnt/syno/$마운트_경로_명,mp=/mnt/media/$마운트_경로_명,ro=1
===
pct stop 102
pct start 102
  • Jellyfin 컨테이너 안에서 확인
    5단계: Jeyllyfin 컨테이너 안에서 마운트 경로 연결 확인
ls -al /mnt/media/$마운트_경로_명

이스케이프 되더라도 파일이 제대로 출력되고 있는지가 중요합니다.

6단계: Jellyfin 웹에서 라이브러리 추가
관리자 → 라이브러리 → 라이브러리 추가

트랜스코딩 여부 확인 방법

가족 4K 영상 하나 재생해보고:

Jellyfin 대시보드에서 재생 중인 세션 확인
"트랜스코딩 (하드웨어)"라고 뜨면 성공 🎉
"트랜스코딩 (소프트웨어)"면 CPU 쓰는 중 → VAAPI 설정 다시 봐야 함

profile
Raiju Hantu Goryo Obake

0개의 댓글