Featured image of post 使用 Docker 安裝線上影音 Jellyfin

使用 Docker 安裝線上影音 Jellyfin

說明如何用 Docker Compose 安裝 Jellyfin,包含 Nginx Proxy Manager 反代設定、AMD VAAPI 硬解、字幕燒錄及 metatube 整合。最終因繁體中文字幕體驗太差而改用 Emby 免費版。

原本一直用 KODI 走 SMB 內網觀看,但有些影片會一頓一頓,甚至完全無法播放,加上遠端存取不方便,決定試用 Jellyfin。遠端播放確實方便許多,但字幕問題實在令人頭痛——不設定的話字幕要等 3~5 分鐘才出現,設定燒錄後又變成點播後需要等一段時間才開始播放。對於繁體中文用戶來說,整體體驗不算友好,最終仍決定改用 Emby 免費版收場。

以下是安裝與設定的完整過程,供有需要的人參考。

1. 前置作業

  1. 安裝 Docker
  2. 安裝 Docker Compose
  3. 申請網域(供反向代理使用)

2. Nginx Proxy Manager 設定

  1. 內網地址填入 $IP:8096,例如 192.168.6.7:8096;8096 為預設埠口,若有更改需同步調整。
  2. 為網域申請 SSL 憑證後,在「進階」頁籤貼入以下設定:
  3. 將 HSTS 等安全選項全部啟用。
proxy_buffering off;

# Proxy main Jellyfin traffic
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Protocol $scheme;
proxy_set_header X-Forwarded-Host $http_host;
proxy_headers_hash_max_size 2048;
proxy_headers_hash_bucket_size 128;

add_header X-Frame-Options "SAMEORIGIN";
add_header X-XSS-Protection "0";
add_header X-Content-Type-Options "nosniff";

3. Docker Compose 設定

可透過 Portainer 建立 Stack,或直接手動建立 docker-compose.yml

---
services:
  jellyfin:
    image: lscr.io/linuxserver/jellyfin:latest
    container_name: jellyfin
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Asia/Taipei
      - JELLYFIN_PublishedServerUrl=公網網址
      - DOCKER_MODS=linuxserver/mods:jellyfin-amd  # AMD 硬解 MOD
    volumes:
      - /mnt/cloud1/dockerData/jellyfin/library:/config
      - /mnt/cloud1/dockerData/jellyfin/tvseries:/data/tvshows
      - /mnt/cloud1/zongboa/movie:/data/movies
      - /mnt/cloud1/playlists:/data/playlists
      # 掛載中文字型,解決字幕亂碼問題
      - /mnt/cloud1/dockerData/jellyfin/fonts/NotoSansCJK-Bold.otf:/usr/share/fonts/NotoSansCJK-Bold.otf
    ports:
      - 8096:8096
    #  - 8920:8920   # HTTPS(選用)
    #  - 7359:7359/udp  # 自動探索(選用)
    #  - 1900:1900/udp  # DLNA(選用)
    restart: unless-stopped
    devices:
      - /dev/dri:/dev/dri  # AMD 硬解
      - /dev/kfd:/dev/kfd  # AMD 硬解
    networks:
      - metatube-net

注意:安裝含有 MODS 的映像檔,首次啟動需等待 2~5 分鐘才能連線,期間出現 502 Bad Gateway 屬正常現象,耐心等待即可。

4. 啟用硬解功能

使用管理者帳號登入,前往 控制台 → 播放 → 轉檔

  1. 硬體加速:選擇 Video Acceleration API (VAAPI)(適用 AMD GPU,如 AMD 5600G)
  2. VA-API 裝置:通常自動帶入 /dev/dri/renderD128
  3. 啟用硬體解碼的項目:維持預設勾選(H264、HEVC、MPEG2、VC1、VP8、VP9、AV1 等)
  4. 點擊儲存

5. 字幕問題

Jellyfin 的字幕支援對繁體中文用戶相當不友好,主要問題有:

  • 預設不顯示字幕:若不額外設定,字幕可能需要等待 3~5 分鐘才出現,或根本不出現
  • 字型渲染問題:未掛載中文字型時,繁體中文字幕可能顯示亂碼或方塊
  • 燒錄延遲:啟用強制燒錄字幕後,播放前需先等候轉檔完成

暫時解決方式

  1. 點擊右上角個人圖示 → 字幕
  2. 字幕載入:選擇「總是顯示字幕」
  3. 燒錄字幕:選擇「全部」
  4. 儲存

這樣設定後,字幕會在播放前強制燒錄,不會再出現播了幾分鐘才出現字幕的情況,但代價是點播後需要等一段時間才會開始播放。魚與熊掌不可兼得……

6. 遭遇問題

  1. 無法從外網修改使用者:安裝後發現從外網網址進入無法修改使用者設定,需改用內網 IP(192.168.x.x)連入才能正常操作
  2. 硬解確認困難:硬解是否正常運作不易確認,但影片播放本身沒有問題

metatube 插件

有成人影片封面抓取需求的話,可加入 metatube 容器。初始設定如下:

version: "3"
services:
  metatube-server:
    ports:
      - 8081:8080
    volumes:
      - /mnt/cloud1/dockerData/jellyfin/plugin/metatube/config:/config
    container_name: metatube
    image: metatube/metatube-server:latest
    command: -dsn /config/metatube.db

7. Jellyfin + metatube 整合版

使用一段時間後,決定將 Jellyfin 與 metatube 合併為單一 Stack,並搭配 .env 檔管理敏感資訊。metatube 不需對外暴露埠口,改以容器內網方式(http://metatube:8080)與 Jellyfin 通訊,減少不必要的埠口開放。

docker-compose.yml

version: '3.8'

services:
  jellyfin:
    image: lscr.io/linuxserver/jellyfin:latest
    container_name: jellyfin
    environment:
      - PUID=${PUID:-1000}
      - PGID=${PGID:-1000}
      - TZ=${TZ:-Asia/Taipei}
      - JELLYFIN_PublishedServerUrl=${JELLYFIN_URL}
      - DOCKER_MODS=linuxserver/mods:jellyfin-amd  # AMD 硬解 MOD
    volumes:
      - /mnt/cloud1/dockerData/jellyfin/library:/config
      - /mnt/cloud1/dockerData/jellyfin/tvseries:/data/tvshows
      - /mnt/cloud1/playlists:/data/playlists
      # 掛載中文字型
      - /mnt/cloud1/dockerData/jellyfin/fonts/NotoSansCJK-Bold.otf:/usr/share/fonts/NotoSansCJK-Bold.otf
    ports:
      - 8096:8096
    restart: unless-stopped
    devices:
      - /dev/dri:/dev/dri  # AMD 硬解
      - /dev/kfd:/dev/kfd  # AMD 硬解
    networks:
      - metatube-net

  metatube-server:
    # 刪除對外埠口,以容器內網 http://metatube:8080 連線即可
    # ports:
    #   - 8080:8080
    volumes:
      - /mnt/cloud1/dockerData/jellyfin/plugin/metatube/config:/config
    container_name: metatube
    image: ghcr.io/metatube-community/metatube-server:latest
    command: -dsn /config/metatube.db
    networks:
      - metatube-net

networks:
  metatube-net:
    driver: bridge
    name: metatube-net

.env 檔內容:

# 使用者與時區
PUID=1000
PGID=1000
TZ=Asia/Taipei

# 網域
JELLYFIN_URL=自定義網址

8. 結論:最終改用 Emby 免費版

用了一段時間之後,還是決定放棄 Jellyfin,轉向 Emby 免費版

Jellyfin 對繁體中文用戶的痛點太多:

  • 字幕顯示問題根深柢固:不論是載入延遲、字型渲染還是強制燒錄的等待,每個解法都製造新問題,始終無法像 KODI 那樣開箱即用
  • 繁體中文介面翻譯品質參差:部分功能標示混亂,設定邏輯也不直覺
  • 用戶管理限制:外網無法修改使用者等小問題,累積下來令人疲憊

相比之下,Emby 免費版雖然不是完全開源,但對繁體中文字幕的處理明顯更成熟,整體體驗比 Jellyfin 順很多,對一般家用影音需求而言已經相當足夠。

9. 參考資料

  1. Linuxserver Container Mods
  2. GitHub – linuxserver/docker-mods at jellyfin-amd
  3. Nginx | Jellyfin
  4. AMD GPU | Jellyfin