VPS에 Jellyfin 설치 및 Docker 구축 가이드
Docker를 사용하여 VPS에 Jellyfin 미디어 서버를 구축하는 방법을 설명합니다. Block storage 설정과 file permissions 오류 해결법, 그리고 GPU 없는 환경에서의 CPU transcoding 이슈를 방지하는 전략을 다룹니다.
구축 목표
VPS에 Jellyfin 미디어 서버를 구축합니다. 하나의 container, 세 개의 volume, 그리고 영화와 TV 프로그램을 저장할 block-storage disk를 사용합니다. 모든 브라우저나 Jellyfin app에서 접속할 수 있습니다. 설치는 15줄의 compose file로 완료됩니다. 이후 발생하는 문제는 두 가지 원인 중 하나입니다. container가 읽을 수 없는 file permissions 문제, 또는 GPU가 없는 VPS에 무리한 video transcoding을 요청하는 문제입니다. 이 가이드는 가장 빈번하게 발생하는 이 두 가지 문제에 집중합니다.
Jellyfin은 완전한 open source이며 무료입니다. 계정 생성, 유료 기능, telemetry가 없습니다. 이러한 특징 덕분에 2026년에 self-hosting할 가치가 있는 것 목록에 항상 포함됩니다. Jellyfin은 사용자가 소유한 media를 재생합니다. 자체 콘텐츠를 제공하지 않으며, 이 가이드는 콘텐츠를 획득하는 방법을 다루지 않습니다.
대여 전 확인해야 할 트랜스코딩의 실상
구매 결정에 영향을 미치므로 이 내용을 먼저 읽으십시오. 미디어 서버는 재생 버튼을 누르면 두 가지 방식 중 하나로 동작합니다. Direct play는 파일을 있는 그대로 스트리밍합니다. VPS가 디스크에서 바이트를 읽어 네트워크로 전송하며, CPU 사용량이 거의 없습니다. Transcoding은 비디오를 실시간으로 재인코딩합니다. 해상도, 코덱을 변경하거나 자막을 영상에 입히는 작업이며, 이는 순수하게 CPU 자원을 소모합니다.
일반적인 VPS에는 GPU가 없습니다. 따라서 모든 트랜스코딩은 libx264/libx265를 사용하는 CPU로 수행되며, 소프트웨어 인코딩은 비용이 많이 듭니다. 단일 1080p H.264 트랜스코딩만으로도 여러 개의 공유 vCPU가 포화 상태가 될 수 있습니다. 4K 또는 HEVC 트랜스코딩은 실시간 재생 속도를 따라가지 못하는 경우가 많으며, 이로 인해 재생이 멈추고 버퍼링이 지속됩니다. Intel iGPU나 Nvidia 카드가 장착된 홈 서버에서는 하드웨어 트랜스코딩을 통해 비용을 낮출 수 있지만, VPS 제공업체가 GPU 인스턴스를 제공하지 않는 한 이를 사용할 수 없습니다.
따라서 VPS 운영 전략은 다음과 같습니다: 트랜스코딩을 피하십시오. 라이브러리를 클라이언트가 네이티브로 재생할 수 있는 코덱(H.264 비디오, AAC 또는 AC3 오디오, MP4 또는 MKV 컨테이너)으로 유지하십시오. 또한 Direct play를 지원하는 클라이언트 앱을 선택하십시오. Android TV, iOS, Roku용 Jellyfin 네이티브 앱과 Infuse, Kodi, 데스크톱용 Jellyfin Media Player가 있습니다. 이 방식을 사용하면 VPS가 ffmpeg를 실행할 일이 없으며, 사양이 낮은 2 vCPU 서버로도 여러 명에게 동시에 스트리밍할 수 있습니다. 트랜스코딩을 고려한다면 훨씬 크고 비싼 서버가 필요하며, 그 경우에도 4K 재생은 권장하지 않습니다.
대역폭 계산도 필요합니다. 이는 또 다른 주의 사항입니다. Direct play는 파일의 원래 비트레이트대로 전송합니다. 압축된 1080p 파일은 8-12 Mbps를 사용하며, 1080p Blu-ray remux는 20-30 Mbps, 4K HDR은 40-80 Mbps를 사용합니다. 10 Mbps 파일을 사용하는 3명이 동시에 Direct play를 하면 VPS에서 지속적으로 30 Mbps의 업로드가 발생합니다. 요금제의 두 가지 수치를 확인하십시오: 포트 속도(30 Mbps 업스트림 전송이 가능한가?)와 월간 전송량 제한입니다. 10 Mbps 비트레이트의 2시간 분량 영화 한 편은 약 9 GB를 소모합니다. 월 1 TB 제한 요금제라면 한 달에 약 100편(하루 3~4편) 정도를 볼 수 있습니다. 4K 영상을 시청하는 가구는 비트레이트가 4~8배 더 높으므로 훨씬 빠르게 용량을 소모합니다.
Prerequisites
- root 또는 sudo 권한이 있고, Docker와 Compose plugin이 설치된 신규 Ubuntu 24.04 KVM VPS가 필요합니다.
- 미디어 저장용 블록 스토리지 볼륨이 필요합니다. 라이브러리 크기에 맞춰 용량을 설정하십시오(아래 용량 산정 방식 참조). VPS에 기본 제공되는 작은 root 디스크에는 영화를 저장하지 마십시오.
- 외부 HTTPS 접속이 필요한 경우 도메인 이름이 필요합니다. 전체 시스템을 비공개로 유지하려면 동일 VPS에 WireGuard VPN 설치를 사용하십시오.
- 법적으로 스트리밍 권한이 있는 미디어(직접 리핑한 파일, 직접 녹화한 파일, 소유한 파일)만 사용하십시오.
먼저 block storage를 마운트하십시오
제공업체의 패널에서 volume을 연결한 후, 해당 장치를 찾아 마운트하십시오. 장치 이름은 lsblk에서 확인하십시오. 장치 이름은 /dev/sdb 또는 /dev/vdb와 같은 형태이며, root disk가 아닙니다.
lsblk
sudo mkfs.ext4 /dev/sdb # ONLY on a new, empty volume — this ERASES it
sudo mkdir -p /mnt/media
sudo blkid /dev/sdb # copy the UUID shown for this device/dev/sdb 대신 UUID를 사용하여 마운트하십시오. 재부팅 시 장치 문자가 변경될 수 있으며, 이로 인해 잘못된 디스크를 포맷하거나 마운트할 위험이 있기 때문입니다. /etc/fstab에 다음 한 줄을 추가하십시오:
UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx /mnt/media ext4 defaults,nofail 0 2sudo mount -a
df -h /mnt/medianofail 설정이 중요합니다. 이 설정이 없으면 block volume이 분리될 경우 시스템 부팅이 실패하고 emergency shell로 진입합니다. 가장 흔한 실수는 데이터가 이미 있는 volume에 mkfs.ext4를 실행하는 것입니다. 이 명령은 데이터를 모두 삭제합니다. 새 volume에만 포맷을 수행하십시오. 디스크에 이미 라이브러리가 있다면 fstab 설정 단계로 바로 넘어가십시오.
Jellyfin 요구 사항에 맞게 미디어 배치하기
Jellyfin은 폴더와 파일 이름을 기준으로 메타데이터를 매칭합니다. 배치가 잘못되면 영화가 포스터 없는 무제한 파일로 나타나거나, 에피소드가 잘못된 시리즈와 매칭될 수 있습니다. 규칙은 정확히 세 가지입니다. 각 영화는 파일 이름과 일치하는 고유의 Name (Year) 폴더에 있어야 합니다. 시즌 폴더 이름은 S01가 아닌 Season 01이어야 합니다. 에피소드 파일은 S01E01 형식을 사용해야 하며, 스페셜 에피소드는 Season 00 폴더에 넣어야 합니다.
/mnt/media
├── Movies
│ ├── Blade Runner (1982)
│ │ └── Blade Runner (1982).mkv
│ └── Arrival (2016)
│ └── Arrival (2016).mkv
└── Shows
└── Severance (2022)
├── Season 01
│ ├── Severance - S01E01.mkv
│ └── Severance - S01E02.mkv
└── Season 00
└── Severance - The Lexington Letter.mkv영화에 적용하는 (Year)는 단순한 장식이 아닙니다. 이는 리메이크 작품을 구분하여 매처가 올바른 타이틀을 가져오도록 돕습니다. Movies과 Shows은 각각 별도의 최상위 폴더로 유지하십시오. 각 폴더는 특정 콘텐츠 유형을 위한 Jellyfin 라이브러리가 되며, 두 폴더를 섞으면 메타데이터 제공자에 혼란을 줍니다.
Permissions: 라이브러리가 비어 있는 가장 주요한 원인
사용자가 시간을 낭비하게 만드는 오해가 있습니다. 공식 jellyfin/jellyfin 이미지는 PUID/PGID 환경 변수를 지원하지 않습니다. 해당 변수들은 LinuxServer.io 이미지(lscr.io/linuxserver/jellyfin) 전용입니다. 공식 이미지에서는 compose의 user: 키로 사용자를 제어합니다. 이 설정을 생략하면 컨테이너는 root 권한으로 실행됩니다. 어떤 이미지를 사용하든 규칙은 동일합니다. 컨테이너가 실행되는 uid/gid는 모든 미디어 디렉토리를 읽고 탐색할 수 있어야 합니다.
표준 Ubuntu 시스템의 첫 번째 비-root 사용자인 uid/gid 1000으로 실행하겠습니다. 본인의 설정을 확인하고 소유권을 설정하십시오:
id # confirm your user is uid=1000 gid=1000
sudo chown -R 1000:1000 /mnt/media
sudo find /mnt/media -type d -exec chmod 755 {} \;
sudo find /mnt/media -type f -exec chmod 644 {} \;
mkdir -p ~/jellyfin/config ~/jellyfin/cache
sudo chown -R 1000:1000 ~/jellyfin디렉토리는 단순히 읽기 권한뿐만 아니라 execute 비트(755의 x)가 필요합니다. 이 권한이 없으면 컨테이너는 파일 목록을 볼 수는 있어도 폴더 내부로 진입할 수 없습니다. 라이브러리 전체가 비어 있게 되는 원인은 상위 디렉토리입니다. 컨테이너의 uid가 마운트 지점 자체를 탐색할 수 없으면 /media/Movies 또는 /media/Shows에 도달할 수 없습니다. 이 경우 로그에 Access to the path ... is denied이 발생하며 모든 라이브러리가 즉시 비어 있게 됩니다. 읽을 수 없는 개별 미디어 폴더는 로그에 기록된 후 건너뜁니다. 따라서 root 권한으로 복사된 파일 묶음은 라이브러리에서 조용히 사라집니다. 이것이 하나의 폴더만 수정하는 대신 모든 디렉토리에 대해 재귀적으로 chown을 실행하고 execute 비트를 설정해야 하는 이유입니다.
The docker-compose file
services:
jellyfin:
image: jellyfin/jellyfin:10
container_name: jellyfin
user: "1000:1000"
restart: unless-stopped
ports:
- "127.0.0.1:8096:8096"
volumes:
- ./config:/config
- ./cache:/cache
- /mnt/media:/media:ro
environment:
- JELLYFIN_PublishedServerUrl=https://jellyfin.example.comLine by line: user: "1000:1000"은 상단의 소유권 설정과 일치하도록 파일 권한을 실제로 설정합니다. /config은 계정, 라이브러리, 메타데이터, watch state를 포함하는 전체 서버 데이터입니다. 따라서 이 디렉토리는 쓰기 권한이 있어야 하며 백업 대상입니다. /cache은 임시 작업 공간입니다. 미디어 마운트는 의도적으로 :ro (read-only)로 설정되었습니다. Jellyfin은 기본적으로 /config 아래에 artwork와 metadata를 저장하므로 라이브러리에 쓸 필요가 없습니다. read-only 설정은 실수로 파일을 삭제하거나 잘못된 plugin으로 인해 파일이 손상되는 것을 방지합니다. 포트는 의도적으로 127.0.0.1에 바인딩되었습니다. Jellyfin의 웹 로그인은 plain HTTP를 사용하므로 8096 포트를 공용 인터넷에 공개하지 않습니다. JELLYFIN_PublishedServerUrl은 로컬 자동 검색을 위해 서버가 알리는 주소입니다. LAN UDP broadcast를 사용하므로 인터넷 너머의 클라이언트는 이를 볼 수 없으며 앱에 직접 입력한 URL을 사용해야 합니다. 클라이언트에게 알려줄 주소로 설정하십시오. 원격 장치에서는 해당 URL을 수동으로 입력해야 합니다.
compose 디렉토리에서 실행하십시오:
docker compose up -d
docker logs -f jellyfinFirst run: the setup wizard and your libraries
포트가 localhost에 바인딩되어 있으므로, 방화벽 포트를 개방하는 대신 노트북에서 SSH 터널을 통해 위저드에 접속하십시오:
ssh -L 8096:127.0.0.1:8096 you@your-vps-ip이제 http://localhost:8096로 접속하십시오. 위저드가 언어 설정과 강력한 비밀번호를 가진 admin user 생성을 안내합니다. 이 계정은 서버 권한을 가지므로 일회용 비밀번호를 사용하지 마십시오. 첫 번째 라이브러리를 추가하십시오. 콘텐츠 유형으로 Movies를 선택하고 /media/Movies(호스트 경로가 아닌 컨테이너 내부 경로)를 지정하십시오. Shows를 /media/Shows에 지정하여 이 과정을 반복하십시오. 완료하면 Jellyfin이 스캔을 시작합니다. 라이브러리 규모가 작다면 1~2분 내에 포스터와 제목이 채워지며, 이것이 정상적인 결과입니다. 라이브러리 추가 또는 편집은 나중에 Dashboard → Libraries에서 수행하며, Scan All Libraries를 통해 재스캔을 강제할 수 있습니다.
트랜스코딩을 사용하는 경우, Dashboard → Playback → Transcoding으로 이동하여 transcode temp path를 /cache/transcodes로 설정하십시오. 이렇게 하면 트랜스코딩 데이터가 /config를 점유하는 대신 캐시 볼륨에 저장됩니다. 하드웨어 가속은 None으로 설정하십시오. 가속을 위한 GPU가 없습니다.
원격 접속: TLS reverse proxy를 사용하거나 VPN을 유지하십시오
외부에서 Jellyfin에 접속하는 안전한 방법은 두 가지이며, 피해야 할 안전하지 않은 방법이 한 가지 있습니다. 안전하지 않은 방법은 8096 포트를 인터넷에 직접 공개하는 것입니다. 이 경우 로그인 정보가 평문으로 전송되며, 몇 시간 내에 포트 무차별 대입 공격(brute-force)을 받게 됩니다.
Option A — TLS reverse proxy. Jellyfin을 Docker 앱용 자동 TLS를 지원하는 Traefik 또는 Certbot으로 발급된 Let's Encrypt 인증서를 사용하는 nginx 뒤의 서브도메인에 배치하십시오. Jellyfin은 실시간 업데이트를 위해 WebSockets를 사용하므로, 프록시가 upgrade 헤더를 전달해야 합니다. Traefik은 이를 자동으로 수행합니다. nginx는 헤더를 명시해야 하며, 업스트림에 HTTP/1.1을 사용해야 upgrade가 정상적으로 수행됩니다.
location / {
proxy_pass http://127.0.0.1:8096;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}로컬 자동 검색(autodiscovery)이 올바른 URL을 광고하도록 JELLYFIN_PublishedServerUrl을 https:// 주소로 설정하십시오. 원격 앱은 지정된 주소를 사용합니다. 또한 로그인에 대한 무차별 대입 공격 방지를 위한 fail2ban을 추가하십시오. 서버가 공개되면 Uptime Kuma를 해당 URL로 지정하여 시청자보다 먼저 서비스 중단 여부를 확인하십시오.
Option B — VPN을 통해 비공개로 유지하십시오. 8096 포트를 전혀 공개하지 마십시오. 동일한 서버에서 종료되는 WireGuard 터널을 통해서만 Jellyfin에 접속하십시오. 가정용 환경에서는 이것이 가장 간단하고 안전한 선택입니다. 인증서가 필요 없고, 외부 노출이 없으며, 무차별 대입 공격 대상이 되지 않습니다. 컨테이너를 터널 주소 또는 localhost에 바인딩하고 VPN을 통해 연결하십시오. 터널 설정에 대해서는 개인 VPS를 위한 WireGuard VPN 설정을 참조하십시오.
Storage sizing and backups
파일 개수가 아닌 용량을 기준으로 예산을 책정하십시오. 압축된 1080p 영화는 개당 4-15 GB이며, 1080p remux는 20-40 GB입니다. 1080p TV 시즌 하나는 15-40 GB이며, 4K 콘텐츠는 영화 한 편당 40-100 GB입니다. 수백 편의 영화와 일부 TV 시리즈가 포함된 라이브러리에는 2-4 TB 용량이 필요합니다. 나중에 데이터를 이전하는 것보다 처음부터 block volume을 넉넉하게 할당하는 것이 더 경제적입니다.
/config는 서버의 전체 상태를 포함하므로 반드시 백업해야 하는 유일한 항목입니다. Snapshot을 생성하거나 stop-and-tar 방식으로 백업한 뒤, 복사본을 서버 외부에 보관하십시오.
docker compose down
sudo tar czf jellyfin-config-$(date +%F).tgz -C ~/jellyfin config
docker compose up -d/cache와 transcode 폴더는 삭제해도 무방합니다. /mnt/media에 있는 미디어는 별도로 백업하거나 다시 리핑(re-rippable)하는 것을 전제로 관리하십시오. 용량 문제로 인해 대부분의 사용자는 후자를 선택합니다. 업그레이드는 docker compose pull && docker compose up -d 방식입니다. 위의 :10 태그는 10.x major 버전 내에서 유지되므로, 다음 major 버전으로 이동하려면 의도적으로 태그를 수정해야 합니다. major 버전 변경 시 라이브러리 스키마 마이그레이션이 발생하므로, 작업을 수행하기 전에 Jellyfin release notes를 확인하십시오.
Failure modes, with the strings you will see
Library is empty after a scan. Dashboard → Logs (또는 ~/jellyfin/config/log/log_*.log)의 로그에 다음 내용이 표시됩니다:
System.UnauthorizedAccessException: Access to the path '/media/Movies' is denied.컨테이너의 uid가 해당 경로를 읽을 수 없습니다. 원인: 미디어 소유자가 root이거나 user: 값과 다른 uid인 경우, 디렉토리에 execute bit가 없는 경우, 또는 상위 마운트 지점을 해당 uid가 탐색할 수 없는 경우입니다. 해결 방법: chown -R 1000:1000 /mnt/media, 디렉토리는 755, 파일은 644로 설정한 후 다시 스캔하십시오.
Playback pins the CPU and buffers. docker stats jellyfin에서 CPU 사용률이 코어 수의 100%에 근접하게 나타나며, Dashboard → Playback의 세션 상태가 1.0x 미만의 속도로 Transcode으로 표시됩니다. 클라이언트가 direct-play를 수행하지 않으므로, VPS가 실시간보다 느리게 CPU-transcoding을 수행하여 버퍼링이 발생합니다. 원인: 지원되지 않는 codec 또는 container, subtitle burn-in, 또는 HDR tone-mapping입니다. 해결 방법: direct-play를 지원하는 클라이언트를 사용하십시오. 소스 미디어를 H.264/AAC로 유지하십시오. burn-in을 유발하는 image subtitle (PGS/VOBSUB) 대신 text subtitle (SRT)을 사용하십시오. CPU 전용 장비에서는 4K HDR 사용을 완전히 피하십시오.
"No compatible streams are available." 전체 메시지는 보통 "This client isn't compatible with the media and the server isn't sending a compatible media format."입니다. 클라이언트가 소스를 거부했으며 fallback transcode 또한 시작되지 않았습니다. 원인: 잘못된 ffmpeg 명령, 읽을 수 없는 파일, 또는 사용자의 profile이 비디오 변환을 차단하는 경우입니다. 해결 방법: Dashboard → Logs에서 ffmpeg 라인을 확인하십시오. 파일이 재생 가능한지 확인하십시오. transcoding이 필요한 경우 사용자의 playback permissions를 확인하십시오. 브라우저 codec 문제를 배제하기 위해 다른 클라이언트로 테스트하십시오.
Films have no poster or the wrong one. 메타데이터가 일치하지 않습니다. 원인: 영화가 전용 Name (Year) 폴더에 있지 않음, season 폴더 이름이 Season 01 대신 S01임, 에피소드가 S01E01 형식이 아님, 또는 연도 정보가 누락됨입니다. 해결 방법: 위 레이아웃에 맞춰 이름을 변경한 후, Refresh metadata → Replace all을 실행하십시오. 또는 개별 항목에 Identify를 사용하여 올바른 TMDB/TVDB 항목을 지정하십시오.
FAQ
GPU 없이 VPS에서 비디오 트랜스코딩이 가능한가요?
가능하지만 CPU만 사용하므로 비용이 많이 발생합니다. 단일 1080p 소프트웨어 트랜스코딩 작업은 여러 vCPU를 점유할 수 있습니다. 4K 또는 HEVC는 실시간 처리가 불가능하여 재생 버퍼링이 발생할 수 있습니다. 가장 좋은 방법은 트랜스코딩을 피하는 것입니다. 라이브러리를 H.264/AAC 형식으로 유지하고 direct-play를 지원하는 클라이언트 앱을 사용하십시오. 그러면 VPS는 데이터 스트리밍만 수행합니다. 실시간 트랜스코딩이 반드시 필요한 경우에만 GPU 인스턴스를 대여하십시오.
스캔 후 Jellyfin 라이브러리가 비어 있는 이유는 무엇인가요?
대부분 권한 문제입니다. 공식 jellyfin/jellyfin 이미지는 설정된 user:(또는 root) 권한으로 실행됩니다. 해당 uid가 파일을 읽을 수 없으면 스캔 로그 Access to the path ... is denied에 기록되고 파일은 건너뜁니다. chown -R 1000:1000 /mnt/media를 사용하여 소유권을 수정하고, 디렉토리에 실행 권한(755)을 부여한 뒤 다시 스캔하십시오. 또한 상위 디렉토리도 확인해야 합니다. 컨테이너의 uid가 /mnt/media 자체를 탐색할 수 없으면 라이브러리 폴더에 도달하지 못해 모든 항목이 빈 상태로 나타납니다. 두 번째로 흔한 원인은 Jellyfin의 예상 구조와 다른 폴더 레이아웃입니다.
Jellyfin에 원격으로 안전하게 접속하는 방법은 무엇인가요?
두 가지 방법이 있습니다. 서브도메인에 TLS reverse proxy를 설정하여 로그인과 스트리밍을 암호화하고, fail2ban을 추가하십시오. 비밀번호가 평문으로 전송되는 8096 포트를 직접 노출해서는 안 됩니다. 또는 완전히 비공개로 유지하며 VPN을 통해서만 접속하십시오. 가정용으로는 이것이 가장 간단하고 안전한 선택입니다. 앱에는 공용 주소를 직접 입력하십시오. autodiscovery는 로컬 네트워크 브로드캐스트 방식이므로 인터넷을 통해 접속하는 클라이언트에는 도달하지 않습니다.
Jellyfin VPS에 필요한 디스크 용량과 대역폭은 얼마인가요?
디스크 용량은 화질에 따라 다릅니다. 압축된 1080p 영화는 개당 4-15 GB, remux는 20-40 GB, 4K는 40-100 GB를 예상하십시오. 따라서 대부분의 라이브러리에는 2-4 TB 크기의 block volume이 필요합니다. 대역폭은 direct-play 비트레이트에 의해 결정됩니다. 1080p 스트림은 개당 8-12 Mbps가 필요하며, 4K는 이보다 훨씬 더 많은 대역폭이 필요합니다. 포트 속도가 동시 시청자 수를 감당할 수 있는지 확인하고 월간 전송량 제한을 확인하십시오. 트랜스코딩을 계획한다면 CPU 여유 자원을 추가하십시오. direct-play가 목적이라면 코어 수보다 대역폭을 우선시하십시오.
VPS에서 Jellyfin을 실행하는 것이 합법인가요?
Jellyfin 자체는 무료 오픈 소스 소프트웨어이며 실행하는 것은 완전히 합법입니다. 중요한 것은 콘텐츠입니다. 본인이 소유하거나 라이선스를 보유한 미디어만 스트리밍하십시오. 즉, 본인의 디스크 리핑, 녹화물 또는 권한이 있는 파일이어야 합니다. Jellyfin은 미디어를 제공하지 않으며 미디어를 획득하는 방법도 제공하지 않습니다. Jellyfin은 사용자가 이미 소유한 라이브러리를 위한 플레이어입니다.