본문 바로가기
IT/HomeLabs

[HomeLab] 4일 차: 아빠표 넷플릭스 만들기 - Jellyfin과 하드웨어 트랜스코딩의 세계

by 수누다 2026. 2. 15.

부제: 4남매를 위한 완벽한 미디어 센터, 그리고 GPU를 갈구다

들어가며

안녕하세요, 시스템 엔지니어이자 4남매 아빠 수누다입니다.

파일 서버(File Browser)로 데이터 고속도로를 뚫었던 3일 차에 이어, 4일 차인 오늘은 드디어 홈랩의 '꽃'이라 불리는 미디어 서버(Media Server)를 구축했습니다.

목표는 단순하지만 명확합니다.

  1. "아빠, 볼 거 없어?"라는 아이들의 질문을 잠재우는 것.
  2. 내가 좋아하는 '건담(Gundam)' 시리즈와 '워킹 데드(The Walking Dead)' 전 시즌을 출퇴근길 언제 어디서나 끊김 없이 감상하는 것.

이를 위해 선택한 솔루션은 Jellyfin입니다. (Plex는 유료 기능이 많고, Emby는 폐쇄적이라 100% 오픈소스인 Jellyfin을 택했습니다.)


1. 아키텍처 설계: 또 하나의 컨테이너 (ID 103)

파일 서버(ID 100)에 다 때려 넣을까 잠시 고민했지만, 어제 뼈저리게 배웠던 '역할 분리(Separation of Concerns)' 원칙을 고수하기로 했습니다.

미디어 서버는 실시간 트랜스코딩(영상 변환)이라는 아주 무거운 작업을 수행하므로, 별도의 리소스를 할당받은 LXC 컨테이너(ID 103)를 신설했습니다.

  • ID 100: 파일 저장 및 공유 (SMB/NFS)
  • ID 102: Immich (사진 AI 분석)
  • ID 103: Jellyfin (영상 스트리밍) 👈 New!

2. 난관: 11TB 데이터를 어떻게 103번으로 가져올까?

103번 컨테이너는 갓 생성된 빈 깡통입니다. 100번이 관리하는 11TB 하드디스크의 영화 폴더를 읽을 수 있어야 하죠.
네트워크 공유(SMB)로 마운트 할 수도 있지만, 같은 물리 서버 안에서 네트워크를 타는 건 낭비입니다. Proxmox 호스트(pve)에서 바인드 마운트(Bind Mount) 기술을 사용해 직통 터널을 뚫었습니다.

# /etc/pve/lxc/103.conf (Jellyfin 컨테이너 설정 파일)
# 호스트의 /nas-data/media 경로를 컨테이너의 /mnt/media로 투영
mp0: /nas-data/media,mp=/mnt/media

이렇게 하면 컨테이너 내부에서도 호스트의 데이터를 로컬 디스크처럼 씁니다. 속도는 빠르고, 오버헤드는 제로(0)에 가깝죠.


3. 핵심 기술: 하드웨어 트랜스코딩 (HW Acceleration)

오늘의 하이라이트입니다.
그냥 설치하면 고화질 영상을 모바일로 볼 때 CPU가 100%를 찍으며 서버가 비명을 지릅니다. 실시간으로 압축을 풀어주는 연산 때문인데, 이걸 CPU가 다 하려면 벅찹니다.

여기서 Intel iGPU(내장 그래픽)의 힘을 빌려야 합니다.

1) 권한 부여 (LXC 설정)
LXC 컨테이너가 호스트의 그래픽 카드(/dev/dri/renderD128)를 쓸 수 있게 허가증을 발급해 줬습니다.

# /etc/pve/lxc/103.conf 추가
lxc.cgroup2.devices.allow: c 226:0 rwm
lxc.cgroup2.devices.allow: c 226:128 rwm
lxc.mount.entry: /dev/dri/renderD128 dev/dri/renderD128 none bind,optional,create=file

2) Docker 설정 (docker-compose.yml)
Jellyfin 컨테이너에게도 "너, 그래픽 카드 써도 돼"라고 알려줍니다.

services:
  jellyfin:
    image: jellyfin/jellyfin
    devices:
      - /dev/dri/renderD128:/dev/dri/renderD128 # 핵심!
    volumes:
      - /mnt/media:/media

이 설정을 마치고 영상을 재생했을 때, 대시보드에 'Transcode (Hardware)'라는 문구가 뜨는 순간의 희열이란! CPU 점유율은 거짓말처럼 5% 미만으로 뚝 떨어졌습니다. 이것이 엔지니어링의 맛이죠.


4. 결과물: 우리 집만의 OTT 완성

설치를 마치고 라이브러리를 스캔하니, 밋밋했던 파일명들이 영화 포스터, 줄거리, 출연진 정보와 함께 화려한 넷플릭스 스타일로 변신했습니다.

  • 12살 첫째 & 10살 둘째: 자기들 방 태블릿으로 애니메이션 정주행 시작.
  • 나: 출퇴근길 지하철에서 '워킹 데드' 시즌 1부터 다시보기 준비 완료.
  • 외부 접속: 어제 뚫어둔 Cloudflare Tunneltv.example.com을 추가하여, 포트 포워딩 없이 LTE 환경에서도 집처럼 접속되게 만들었습니다.

5. 4일 차 회고

가족들이 가장 피부로 느끼는 변화는 역시 '눈에 보이는 서비스'입니다.
터미널에서 검은 화면과 씨름하던 아빠가 "자, 이제 이거 봐" 하며 태블릿을 건네주니 아이들 눈이 휘둥그레집니다. (이 맛에 서버 돌립니다.)

이제 데이터(File), 사진(Immich), 영상(Jellyfin)까지 홈랩의 3대장이 완성됐습니다.
다음은 이 소중한 데이터들을 안전하게 지키기 위한 '백업 자동화'와 서버 상태를 한눈에 보는 '대시보드(Dashy)'를 꾸며볼까 합니다.