웹사이트 검색

Rocky Linux 9에 Jellyfin Media Server를 설치하는 방법


이 페이지에서

  1. 전제 조건
  2. 1단계 - 방화벽 구성\n
  3. 2단계 - Docker 및 Docker Compose 설치
  4. 3단계 - Docker Compose 구성 만들기
  5. 4단계 - 젤리핀 시작\n
  6. 5단계 - Nginx 설치
  7. 6단계 - SSL 설치
  8. 7단계 - Nginx 구성
  9. 8단계 - Jellyfin 액세스 및 구성
  10. 9단계 - 젤리핀 업그레이드\n
  11. 결론

Jellyfin은 어디서나 액세스할 수 있는 콘텐츠를 스트리밍할 수 있는 무료 오픈 소스 미디어 서버입니다. 영화, TV 쇼, 음악 및 라이브 TV/DVR을 지원합니다. Jellyfin 서버는 Windows, Linux 또는 macOS에 설정할 수 있으며 해당 콘텐츠는 공개 URL을 사용하는 브라우저 및 모바일 앱을 사용하여 다양한 장치에서 즉시 액세스할 수 있습니다. 이러한 미디어 장치가 인터넷이나 동일한 네트워크에 연결되어 있는 한 다른 PC, TV 또는 전화에서 이러한 파일을 스트리밍할 수도 있습니다. DLNA 지원, 재생 제한 없음, TheTVDB, TheMovieDB 및 Rotten Tomatoes에서 자동으로 메타데이터 가져오기, 자동 녹화, 하드웨어 가속 지원 등 여러 기능을 제공합니다.

Jellyfin은 Emby가 독점 라이선스 모델로 전환한 후 Emby Media 서버의 포크입니다.

이 튜토리얼에서는 Rocky Linux 9 서버에서 Docker를 사용하여 Jellyfin Media Server를 설치하는 방법을 배웁니다.

전제 조건

  • A server running Rocky Linux 9 with a minimum of 2 CPU cores and 4GB of memory. You will need to upgrade the server as per requirements.

  • A non-root user with sudo privileges.

  • A fully qualified domain name (FQDN) pointing to your server. For our purposes, we will use jellyfin.example.com as the domain name.

  • Make sure everything is updated.

    $ sudo dnf update
    
  • Install basic utility packages. Some of them may already be installed.

    $ sudo dnf install wget curl nano unzip yum-utils -y
    

1단계 - 방화벽 구성

첫 번째 단계는 방화벽을 구성하는 것입니다. Rocky Linux는 Firewalld Firewall을 사용합니다. 방화벽 상태를 확인하십시오.

$ sudo firewall-cmd --state
running

방화벽은 다른 영역에서 작동하며 공개 영역은 우리가 사용할 기본 영역입니다. 방화벽에서 활성화된 모든 서비스와 포트를 나열합니다.

$ sudo firewall-cmd --permanent --list-services

다음 출력이 표시되어야 합니다.

cockpit dhcpv6-client ssh

Jellyfin이 작동하려면 HTTP 및 HTTPS 포트가 필요합니다. 열어보세요.

$ sudo firewall-cmd --permanent --add-service=http
$ sudo firewall-cmd --permanent --add-service=https

응용 프로그램이 다른 인스턴스에 연결하므로 마스커레이드를 추가합니다.

$ sudo firewall-cmd --permanent --add-masquerade

변경 사항을 적용하려면 방화벽을 다시 로드하십시오.

$ sudo firewall-cmd --reload

2단계 - Docker 및 Docker Compose 설치

Rocky Linux는 이전 버전의 Docker와 함께 제공됩니다. 최신 버전을 설치하려면 먼저 공식 Docker 리포지토리를 설치합니다.

$ sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo

최신 버전의 Docker를 설치합니다.

$ sudo dnf install docker-ce docker-ce-cli containerd.io

Docker를 설치하는 동안 다음 오류가 발생할 수 있습니다.

ror: 
 Problem: problem with installed package buildah-1:1.26.2-1.el9_0.x86_64
  - package buildah-1:1.26.2-1.el9_0.x86_64 requires runc >= 1.0.0-26, but none of the providers can be installed
  - package containerd.io-1.6.9-3.1.el9.x86_64 conflicts with runc provided by runc-4:1.1.3-2.el9_0.x86_64
  - package containerd.io-1.6.9-3.1.el9.x86_64 obsoletes runc provided by runc-4:1.1.3-2.el9_0.x86_64
  - cannot install the best candidate for the job

위의 오류가 발생하면 다음 명령을 사용하십시오.

$ sudo dnf install docker-ce docker-ce-cli containerd.io docker-compose-plugin --allowerasing

Docker 데몬을 활성화하고 실행합니다.

$ sudo systemctl enable docker --now

실행 중인지 확인합니다.

? docker.service - Docker Application Container Engine
     Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
     Active: active (running) since Sat 2022-11-12 00:19:44 UTC; 6s ago
TriggeredBy: ? docker.socket
       Docs: https://docs.docker.com
   Main PID: 99263 (dockerd)
      Tasks: 8
     Memory: 28.1M
        CPU: 210ms
     CGroup: /system.slice/docker.service
             ??99263 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

기본적으로 Docker에는 루트 권한이 필요합니다. sudo 명령을 실행할 때마다 sudo를 사용하지 않으려면 docker 명령에 사용자 이름을 추가하세요. > 그룹.

$ sudo usermod -aG docker $(whoami)

이 변경 사항을 활성화하려면 서버에서 로그아웃하고 동일한 사용자로 다시 로그인하거나 다음 명령을 사용해야 합니다.

$ su - ${USER}

사용자가 Docker 그룹에 추가되었는지 확인합니다.

$ groups
navjot wheel docker

3단계 - Docker Compose 구성 생성

Jellyfin Docker 구성을 위한 디렉터리를 만듭니다.

$ mkdir ~/jellyfin

디렉터리로 전환합니다.

$ cd ~/jellyfin

편집을 위해 Docker 작성 파일을 만들고 엽니다.

$ nano docker-compose.yml

다음 코드를 붙여넣습니다.

version: '3.8'
services:
  jellyfin:
    image: jellyfin/jellyfin
    container_name: jellyfin
    user: 1000:1000
    volumes:
      - ./config:/config
      - ./cache:/cache
      - ./media:/media
      - ./media2:/media2:ro
    restart: 'unless-stopped'
    ports:
      - 8096:8096
    # Optional - alternative address used for autodiscovery
    environment:
      - JELLYFIN_PublishedServerUrl=http://jellyfin.example.com

Ctrl + X를 누르고 메시지가 표시되면 Y를 입력하여 파일을 저장합니다.

위의 docker 파일은 Docker Hub 레지스트리에서 최신 버전의 Jellyfin 서버를 가져옵니다. 이미지의 사용자 및 그룹 ID는 1000으로 설정됩니다. 올바른 권한을 위해 시스템 사용자 ID에 따라 변경할 수 있습니다. 캐시, 구성 및 미디어 파일용 디렉토리를 마운트했습니다. 컨테이너 다시 시작 정책은 unless-stopped로 설정됩니다. 즉, 수동으로 중지하지 않는 한 계속 실행됩니다. Jellyfin은 기본적으로 Nginx가 나중에 사용할 수 있도록 호스트에 노출한 포트 8096에서 실행됩니다. 또한 Jellyfins 공개 URL을 지정하는 환경 변수를 설정했습니다.

캐시 및 구성 디렉토리에 대한 디렉토리를 작성하십시오. 그런 다음 작성 파일에 영구 볼륨으로 마운트합니다. 또한 파일에 두 개의 미디어 파일을 마운트했습니다. 원하는 만큼 많은 미디어 디렉토리를 정리할 수 있습니다. media2 디렉토리는 읽기 전용으로 마운트됩니다.

4단계 - 젤리핀 시작

다음 명령을 사용하여 Docker Compose 구성의 유효성을 검사합니다.

$ docker compose config

유효성을 확인하는 유사한 출력을 받게 됩니다.

name: jellyfin
services:
  jellyfin:
    container_name: jellyfin
    environment:
      JELLYFIN_PublishedServerUrl: http://jellyfin.nspeaks.xyz
    image: jellyfin/jellyfin
    network_mode: host
    restart: unless-stopped
    user: 1000:1000
    volumes:
    - type: bind
      source: /home/navjot/jellyfin/config
      target: /config
      bind:
        create_host_path: true
    - type: bind
      source: /home/navjot/jellyfin/cache
      target: /cache
      bind:
        create_host_path: true
    - type: bind
      source: /home/navjot/jellyfin/media
      target: /media
      bind:
        create_host_path: true
    - type: bind
      source: /home/navjot/jellyfin/media2
      target: /media2
      read_only: true
      bind:
        create_host_path: true

젤리핀 컨테이너를 시작합니다.

$ docker compose up -d

5단계 - Nginx 설치

Rocky Linux는 이전 버전의 Nginx와 함께 제공됩니다. 최신 버전을 설치하려면 공식 Nginx 저장소를 다운로드해야 합니다.

공식 Nginx 리포지토리를 만들기 위한 /etc/yum.repos.d/nginx.repo 파일을 만들고 엽니다.

$ sudo nano /etc/yum.repos.d/nginx.repo

다음 코드를 붙여넣습니다.

[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

Ctrl + X를 누르고 메시지가 표시되면 Y를 입력하여 파일을 저장합니다.

Nginx 서버를 설치합니다.

$ sudo dnf install nginx

설치를 확인하십시오.

$ nginx -v
nginx version: nginx/1.22.1

Nginx 서버를 활성화하고 시작합니다.

$ sudo systemctl enable nginx --now

서버의 상태를 확인하십시오.

$ sudo systemctl status nginx
? nginx.service - nginx - high performance web server
     Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; vendor preset: disabled)
     Active: active (running) since Sun 2022-11-13 13:49:55 UTC; 1s ago
       Docs: http://nginx.org/en/docs/
    Process: 230797 ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf (code=exited, status=0/SUCCESS)
   Main PID: 230798 (nginx)
      Tasks: 3 (limit: 12355)
     Memory: 2.8M
        CPU: 13ms
     CGroup: /system.slice/nginx.service
             ??230798 "nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf"
             ??230799 "nginx: worker process"
             ??230800 "nginx: worker process"

6단계 - SSL 설치

Certbot 도구는 Lets Encrypt API를 사용하여 SSL 인증서를 생성합니다. 작동하려면 EPEL 저장소가 필요합니다.

$ sudo dnf install epel-release

Snapd를 사용하여 Certbot을 설치합니다. 스냅드를 설치합니다.

$ sudo dnf install snapd

Snap 서비스를 활성화하고 시작합니다.

$ sudo systemctl enable snapd --now

Snap 코어 패키지를 설치합니다.

$ sudo snap install core
$ sudo snap refresh core

Snapd가 작동하는 데 필요한 링크를 만듭니다.

$ sudo ln -s /var/lib/snapd/snap /snap
$ echo 'export PATH=$PATH:/var/lib/snapd/snap/bin' | sudo tee -a /etc/profile.d/snapd.sh

다음 명령을 실행하여 Certbot을 설치합니다.

$ sudo snap install --classic certbot

실행 파일에 대한 symlink를 생성하여 Certbot을 활성화합니다.

$ sudo ln -s /snap/bin/certbot /usr/bin/certbot

SSL 인증서를 생성합니다.

$ sudo certbot certonly --nginx --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m  -d jellyfin.example.com

위의 명령은 서버의 /etc/letsencrypt/live/jellyfin.example.com 디렉토리에 인증서를 다운로드합니다.

Diffie-Hellman 그룹 인증서를 생성합니다.

$ sudo openssl dhparam -dsaparam -out /etc/ssl/certs/dhparam.pem 4096

SSL 갱신이 제대로 작동하는지 확인하려면 프로세스를 시험 실행하십시오.

$ sudo certbot renew --dry-run

오류가 표시되지 않으면 모든 설정이 완료된 것입니다. 인증서가 자동으로 갱신됩니다.

7단계 - Nginx 구성

편집을 위해 /etc/nginx/nginx.conf 파일을 엽니다.

$ sudo nano /etc/nginx/nginx.conf

include /etc/nginx/conf.d/*.conf; 줄 앞에 다음 줄을 추가합니다.

server_names_hash_bucket_size  64;

Ctrl + X를 누르고 메시지가 표시되면 Y를 입력하여 파일을 저장합니다.

편집을 위해 /etc/nginx/conf.d/jellyfin.conf 파일을 만들고 엽니다.

$ sudo nano /etc/nginx/conf.d/jellyfin.conf

다음 코드를 붙여넣습니다.

## Censor sensitive information in logs
log_format stripsecrets '$remote_addr $host - $remote_user [$time_local] '
                    '"$secretfilter" $status $body_bytes_sent '
                    '$request_length $request_time $upstream_response_time '
                    '"$http_referer" "$http_user_agent"';

map $request $secretfilter {
    ~*^(?<prefix1>.*[\?&]api_key=)([^&]*)(?<suffix1>.*)$  "${prefix1}***$suffix1";
    default                                               $request;
}

# Cache video streams
# Set in-memory cache-metadata size in keys_zone, size of video caching and how many days a cached object should persist
proxy_cache_path  /var/cache/nginx/jellyfin-videos levels=1:2 keys_zone=jellyfin-videos:100m inactive=90d max_size=35000m;
map $request_uri $h264Level { ~(h264-level=)(.+?)& $2; }
map $request_uri $h264Profile { ~(h264-profile=)(.+?)& $2; }

# Cache images
proxy_cache_path /var/cache/nginx/jellyfin levels=1:2 keys_zone=jellyfin:100m max_size=15g inactive=30d use_temp_path=off;

limit_conn_zone $binary_remote_addr zone=addr:10m;

server {
  listen 80;
  listen [::]:80;
  server_name jellyfin.example.com;
  location / { return 301 https://$host$request_uri; }
}

server {
   listen 443 ssl http2;
   listen [::]:443 ssl http2;
   server_name jellyfin.example.com;

   ## The default `client_max_body_size` is 1M, this might not be enough for some posters, etc.
   client_max_body_size 20M;

   # use a variable to store the upstream proxy
   # in this example we are using a hostname which is resolved via DNS
   # (if you aren't using DNS remove the resolver line and change the variable to point to an IP address e.g `set $jellyfin 127.0.0.1`)
   set $jellyfin jellyfin;
   resolver 127.0.0.1 valid=30;

   access_log  /var/log/nginx/jellyfin.access.log stripsecrets;
   error_log   /var/log/nginx/jellyfin.error.log;

   http2_push_preload on; # Enable HTTP/2 Server Push

   ssl_certificate /etc/letsencrypt/live/jellyfin.example.com/fullchain.pem;
   ssl_certificate_key /etc/letsencrypt/live/jellyfin.example.com/privkey.pem;
   ssl_trusted_certificate /etc/letsencrypt/live/jellyfin.example.com/chain.pem;
   ssl_session_timeout 1d;

   # Enable TLS versions (TLSv1.3 is required upcoming HTTP/3 QUIC).
   ssl_protocols TLSv1.2 TLSv1.3;

   # Enable TLSv1.3's 0-RTT. Use $ssl_early_data when reverse proxying to
   # prevent replay attacks.
   #
   # @see: https://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_early_data
   ssl_early_data on;

   ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384';
   ssl_prefer_server_ciphers on;
   ssl_session_cache shared:SSL:10m;
   ssl_session_tickets off;

   keepalive_timeout    70;
   sendfile             on;
   client_max_body_size 80m;

   # OCSP Stapling ---
   # fetch OCSP records from URL in ssl_certificate and cache them
   ssl_stapling on;
   ssl_stapling_verify on;
   ssl_dhparam /etc/ssl/certs/dhparam.pem;

   # Content Security Policy
   # See: https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP
   # Enforces https content and restricts JS/CSS to origin
   # External Javascript (such as cast_sender.js for Chromecast) must be whitelisted.
   # NOTE: The default CSP headers may cause issues with the webOS app
   add_header Content-Security-Policy "default-src https: data: blob: http://image.tmdb.org; style-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-inline' https://www.gstatic.com/cv/js/sender/v1/cast_sender.js https://www.gstatic.com/eureka/clank/95/cast_sender.js https://www.gstatic.com/eureka/clank/96/cast_sender.js https://www.gstatic.com/eureka/clank/97/cast_sender.js https://www.youtube.com blob:; worker-src 'self' blob:; connect-src 'self'; object-src 'none'; frame-ancestors 'self'";

   # Security / XSS Mitigation Headers
   # NOTE: X-Frame-Options may cause issues with the webOS app
   add_header X-Frame-Options "SAMEORIGIN";
   add_header X-XSS-Protection "1; mode=block";
   add_header X-Content-Type-Options "nosniff";
   add_header X-Early-Data $tls1_3_early_data;

   location = / {
       return 302 http://$host/web/;
       return 302 https://$host/web/;
   }

   location / {
       # Proxy main Jellyfin traffic
       proxy_pass http://$jellyfin:8096;
       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 X-Forwarded-Protocol $scheme;
       proxy_set_header X-Forwarded-Host $http_host;
       proxy_buffering off;
  }

  # location block for /web - This is purely for aesthetics so /web/#!/ works instead of having to go to /web/index.html/#!/
   location = /web/ {
       # Proxy main Jellyfin traffic
       proxy_pass http://$jellyfin:8096/web/index.html;
       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 X-Forwarded-Protocol $scheme;
       proxy_set_header X-Forwarded-Host $http_host;
   }

   location /socket {
       # Proxy Jellyfin Websockets traffic
       proxy_pass http://$jellyfin:8096;
       proxy_http_version 1.1;
       proxy_set_header Upgrade $http_upgrade;
       proxy_set_header Connection "upgrade";
       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 X-Forwarded-Protocol $scheme;
       proxy_set_header X-Forwarded-Host $http_host;
   }

   # Cache video streams
   location ~* ^/Videos/(.*)/(?!live)
   {
       # Set size of a slice (this amount will be always requested from the backend by nginx)
       # Higher value means more latency, lower more overhead
       # This size is independent of the size clients/browsers can request
       slice 2m;

       proxy_cache jellyfin-videos;
       proxy_cache_valid 200 206 301 302 30d;
       proxy_ignore_headers Expires Cache-Control Set-Cookie X-Accel-Expires;
       proxy_cache_use_stale error timeout invalid_header updating http_500 http_502 http_503 http_504;
       proxy_connect_timeout 15s;
       proxy_http_version 1.1;
       proxy_set_header Connection "";
       # Transmit slice range to the backend
       proxy_set_header Range $slice_range;

       # This saves bandwidth between the proxy and jellyfin, as a file is only downloaded one time instead of multiple times when multiple clients want to at the same time
       # The first client will trigger the download, the other clients will have to wait until the slice is cached
       # Esp. practical during SyncPlay
       proxy_cache_lock on;
       proxy_cache_lock_age 60s;

       proxy_pass http://$jellyfin:8096;
       proxy_cache_key "jellyvideo$uri?MediaSourceId=$arg_MediaSourceId&VideoCodec=$arg_VideoCodec&AudioCodec=$arg_AudioCodec&AudioStreamIndex=$arg_AudioStreamIndex&VideoBitrate=$arg_VideoBitrate&AudioBitrate=$arg_AudioBitrate&SubtitleMethod=$arg_SubtitleMethod&TranscodingMaxAudioChannels=$arg_TranscodingMaxAudioChannels&RequireAvc=$arg_RequireAvc&SegmentContainer=$arg_SegmentContainer&MinSegments=$arg_MinSegments&BreakOnNonKeyFrames=$arg_BreakOnNonKeyFrames&h264-profile=$h264Profile&h264-level=$h264Level&slicerange=$slice_range";

       # add_header X-Cache-Status $upstream_cache_status; # This is only for debugging cache
   }

   # Cache images
   location ~ /Items/(.*)/Images {
       proxy_pass http://127.0.0.1:8096;
       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 X-Forwarded-Protocol $scheme;
       proxy_set_header X-Forwarded-Host $http_host;

       proxy_cache jellyfin;
       proxy_cache_revalidate on;
       proxy_cache_lock on;
       # add_header X-Cache-Status $upstream_cache_status; # This is only to check if cache is working
   }

   # Downloads limit (inside server block)
   location ~ /Items/(.*)/Download$ {
       proxy_pass http://127.0.0.1:8096;
       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 X-Forwarded-Protocol $scheme;
       proxy_set_header X-Forwarded-Host $http_host;

       limit_rate 1700k; # Speed limit (here is on kb/s)
       limit_conn addr 3; # Number of simultaneous downloads per IP
       limit_conn_status 460; # Custom error handling
       # proxy_buffering on; # Be sure buffering is on (it is by default on nginx), otherwise limits won't work
   }

}

# This block is useful for debugging TLS v1.3. Please feel free to remove this
# and use the `$ssl_early_data` variable exposed by NGINX directly should you
# wish to do so.
map $ssl_early_data $tls1_3_early_data {
  "~." $ssl_early_data;
  default "";
}

완료되면 Ctrl + X를 누르고 메시지가 표시되면 Y를 입력하여 파일을 저장합니다.

Nginx 구성 파일 구문을 확인합니다.

$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

네트워크 연결을 허용하도록 SELinux를 구성합니다.

$ sudo setsebool -P httpd_can_network_connect 1

Nginx 서버를 다시 시작합니다.

$ sudo systemctl restart nginx

다음 오류가 발생하면 SELinux 제한 때문일 가능성이 큽니다.

nginx: [emerg] open() "/var/run/nginx.pid" failed (13: Permission denied)

오류를 수정하려면 다음 명령을 실행하십시오.

$ sudo ausearch -c 'nginx' --raw | audit2allow -M my-nginx
$ sudo semodule -X 300 -i my-nginx.pp

Nginx 서비스를 다시 시작하십시오.

$ sudo systemctl start nginx

8단계 - Jellyfin 액세스 및 구성

URL https://jellyfin.example.com에 접속하면 아래와 같은 화면이 나옵니다.

표시 언어를 선택하고 다음 버튼을 클릭하여 계속 진행합니다.

사용자 세부 정보를 입력하고 다음 버튼을 클릭하여 계속 진행합니다. 미디어 라이브러리 추가를 클릭하여 미디어 라이브러리를 추가합니다. 우리는 영화를 위해 하나를 추가하고 있습니다.

모든 옵션을 입력하고 폴더 옵션에 대해 더하기 기호를 클릭하여 라이브러리의 폴더를 선택합니다. 아래로 스크롤하여 필요한 옵션을 입력합니다. 확인 버튼을 클릭하여 라이브러리 추가를 완료합니다. 라이브러리 설정 페이지로 되돌아갑니다.

계속하려면 다음 버튼을 클릭하십시오.

미디어 메타데이터의 언어와 국가를 선택하고 다음 버튼을 클릭하여 계속 진행합니다.

원격 연결 허용 옵션이 선택되어 있는지 확인하십시오. 포트 매핑을 사용하려면 활성화하십시오. 완료되면 다음 버튼을 클릭합니다.

설정이 완료되었습니다. 완료 버튼을 클릭하면 젤리핀 로그인 페이지로 이동합니다.

앞서 생성한 사용자 정보를 입력하고 로그인 버튼을 클릭하면 대시보드로 이동합니다.

Jellyfin을 사용하여 콘텐츠를 재생할 수 있습니다.

9단계 - 젤리핀 업그레이드

Jellyfin 업그레이드는 쉽고 몇 단계가 필요합니다. 먼저 디렉터리로 전환합니다.

$ cd ~/jellyfin

젤리핀 컨테이너를 중지합니다.

$ docker compose down --remove-orphans

Jellyfin의 최신 컨테이너 이미지를 가져옵니다.

$ docker compose pull

원하는 경우 docker-compose.yml을 변경합니다.

젤리핀 컨테이너를 시작합니다.

$ docker compose up -d

결론

이것으로 Rocky Linux 9 서버에서 Docker를 사용하여 Jellyfin Media Server를 설치하는 방법에 대한 자습서를 마칩니다. 질문이 있으시면 아래 의견에 게시하십시오.