From a5d37ef94d17c519c8b2e5cec2ad592865bf6418 Mon Sep 17 00:00:00 2001 From: okxlin <61420215+okxlin@users.noreply.github.com> Date: Fri, 26 Jun 2026 01:09:25 +0800 Subject: [PATCH] Add Jellyfin LinuxServer app --- .../jellyfin-linuxserver/10.11.11/.env.sample | 8 ++ apps/jellyfin-linuxserver/10.11.11/data.yml | 100 ++++++++++++++++++ .../10.11.11/docker-compose.yml | 24 +++++ .../10.11.11/scripts/init.sh | 16 +++ .../10.11.11/scripts/uninstall.sh | 3 + .../10.11.11/scripts/upgrade.sh | 5 + apps/jellyfin-linuxserver/README.md | 61 +++++++++++ apps/jellyfin-linuxserver/data.yml | 31 ++++++ apps/jellyfin-linuxserver/latest/.env.sample | 8 ++ apps/jellyfin-linuxserver/latest/data.yml | 100 ++++++++++++++++++ .../latest/docker-compose.yml | 24 +++++ .../latest/scripts/init.sh | 16 +++ .../latest/scripts/uninstall.sh | 3 + .../latest/scripts/upgrade.sh | 5 + apps/jellyfin-linuxserver/logo.png | Bin 0 -> 3440 bytes 15 files changed, 404 insertions(+) create mode 100644 apps/jellyfin-linuxserver/10.11.11/.env.sample create mode 100644 apps/jellyfin-linuxserver/10.11.11/data.yml create mode 100644 apps/jellyfin-linuxserver/10.11.11/docker-compose.yml create mode 100755 apps/jellyfin-linuxserver/10.11.11/scripts/init.sh create mode 100755 apps/jellyfin-linuxserver/10.11.11/scripts/uninstall.sh create mode 100755 apps/jellyfin-linuxserver/10.11.11/scripts/upgrade.sh create mode 100644 apps/jellyfin-linuxserver/README.md create mode 100644 apps/jellyfin-linuxserver/data.yml create mode 100644 apps/jellyfin-linuxserver/latest/.env.sample create mode 100644 apps/jellyfin-linuxserver/latest/data.yml create mode 100644 apps/jellyfin-linuxserver/latest/docker-compose.yml create mode 100755 apps/jellyfin-linuxserver/latest/scripts/init.sh create mode 100755 apps/jellyfin-linuxserver/latest/scripts/uninstall.sh create mode 100755 apps/jellyfin-linuxserver/latest/scripts/upgrade.sh create mode 100644 apps/jellyfin-linuxserver/logo.png diff --git a/apps/jellyfin-linuxserver/10.11.11/.env.sample b/apps/jellyfin-linuxserver/10.11.11/.env.sample new file mode 100644 index 000000000..e73fe0be4 --- /dev/null +++ b/apps/jellyfin-linuxserver/10.11.11/.env.sample @@ -0,0 +1,8 @@ +CONTAINER_NAME= +PANEL_APP_PORT_HTTP=8096 +CONFIG_PATH=./data/config +TVSHOWS_PATH=./data/tvshows +MOVIES_PATH=./data/movies +TIME_ZONE=Asia/Shanghai +PUBLISHED_SERVER_URL= + diff --git a/apps/jellyfin-linuxserver/10.11.11/data.yml b/apps/jellyfin-linuxserver/10.11.11/data.yml new file mode 100644 index 000000000..4a9a53a23 --- /dev/null +++ b/apps/jellyfin-linuxserver/10.11.11/data.yml @@ -0,0 +1,100 @@ +additionalProperties: + formFields: + - default: 8096 + edit: true + envKey: PANEL_APP_PORT_HTTP + labelEn: HTTP Port + labelZh: HTTP 端口 + label: + en: HTTP Port + zh: HTTP 端口 + zh-Hant: HTTP 連接埠 + ja: HTTP ポート + ko: HTTP 포트 + ru: HTTP-порт + ms: Port HTTP + pt-br: Porta HTTP + required: true + type: number + rule: paramPort + - default: ./data/config + edit: true + envKey: CONFIG_PATH + labelEn: Config folder path + labelZh: 配置文件路径 + label: + en: Config folder path + zh: 配置文件路径 + zh-Hant: 設定檔資料夾路徑 + ja: 設定フォルダーのパス + ko: 설정 폴더 경로 + ru: Путь к папке конфигурации + ms: Laluan folder konfigurasi + pt-br: Caminho da pasta de configuração + required: true + type: text + - default: ./data/tvshows + edit: true + envKey: TVSHOWS_PATH + labelEn: TV shows folder path + labelZh: 电视剧媒体目录路径 + label: + en: TV shows folder path + zh: 电视剧媒体目录路径 + zh-Hant: 電視劇媒體資料夾路徑 + ja: テレビ番組フォルダーのパス + ko: TV 프로그램 폴더 경로 + ru: Путь к папке сериалов + ms: Laluan folder rancangan TV + pt-br: Caminho da pasta de series + required: true + type: text + - default: ./data/movies + edit: true + envKey: MOVIES_PATH + labelEn: Movies folder path + labelZh: 电影媒体目录路径 + label: + en: Movies folder path + zh: 电影媒体目录路径 + zh-Hant: 電影媒體資料夾路徑 + ja: 映画フォルダーのパス + ko: 영화 폴더 경로 + ru: Путь к папке фильмов + ms: Laluan folder filem + pt-br: Caminho da pasta de filmes + required: true + type: text + - default: Asia/Shanghai + edit: true + envKey: TIME_ZONE + labelEn: Time zone + labelZh: 时区 + label: + en: Time zone + zh: 时区 + zh-Hant: 時區 + ja: タイムゾーン + ko: 시간대 + ru: Часовой пояс + ms: Zon waktu + pt-br: Fuso horário + required: true + type: text + - default: "" + edit: true + envKey: PUBLISHED_SERVER_URL + labelEn: Published server URL + labelZh: 对外服务地址 + label: + en: Published server URL + zh: 对外服务地址 + zh-Hant: 對外服務位址 + ja: 公開サーバー URL + ko: 공개 서버 URL + ru: Публичный URL сервера + ms: URL pelayan diterbitkan + pt-br: URL publica do servidor + required: false + type: text + diff --git a/apps/jellyfin-linuxserver/10.11.11/docker-compose.yml b/apps/jellyfin-linuxserver/10.11.11/docker-compose.yml new file mode 100644 index 000000000..61a525e56 --- /dev/null +++ b/apps/jellyfin-linuxserver/10.11.11/docker-compose.yml @@ -0,0 +1,24 @@ +networks: + 1panel-network: + external: true +services: + jellyfin: + image: "linuxserver/jellyfin:10.11.11" + container_name: ${CONTAINER_NAME} + restart: always + networks: + - 1panel-network + ports: + - "${PANEL_APP_PORT_HTTP}:8096" + volumes: + - "${CONFIG_PATH}:/config" + - "${TVSHOWS_PATH}:/data/tvshows" + - "${MOVIES_PATH}:/data/movies" + environment: + - PUID=1000 + - PGID=1000 + - TZ=${TIME_ZONE} + - JELLYFIN_PublishedServerUrl=${PUBLISHED_SERVER_URL:-} + labels: + createdBy: "Apps" + diff --git a/apps/jellyfin-linuxserver/10.11.11/scripts/init.sh b/apps/jellyfin-linuxserver/10.11.11/scripts/init.sh new file mode 100755 index 000000000..c57a92f8d --- /dev/null +++ b/apps/jellyfin-linuxserver/10.11.11/scripts/init.sh @@ -0,0 +1,16 @@ +#!/usr/bin/env bash +set -euo pipefail + +paths=( + "${CONFIG_PATH:-./data/config}" + "${TVSHOWS_PATH:-./data/tvshows}" + "${MOVIES_PATH:-./data/movies}" +) + +mkdir -p "${paths[@]}" +for path in "${paths[@]}"; do + case "$path" in + ./*|../*) chown -R 1000:1000 "$path" 2>/dev/null || true ;; + esac +done + diff --git a/apps/jellyfin-linuxserver/10.11.11/scripts/uninstall.sh b/apps/jellyfin-linuxserver/10.11.11/scripts/uninstall.sh new file mode 100755 index 000000000..accdccd70 --- /dev/null +++ b/apps/jellyfin-linuxserver/10.11.11/scripts/uninstall.sh @@ -0,0 +1,3 @@ +#!/bin/bash +docker-compose down --volumes + diff --git a/apps/jellyfin-linuxserver/10.11.11/scripts/upgrade.sh b/apps/jellyfin-linuxserver/10.11.11/scripts/upgrade.sh new file mode 100755 index 000000000..a6eb46bac --- /dev/null +++ b/apps/jellyfin-linuxserver/10.11.11/scripts/upgrade.sh @@ -0,0 +1,5 @@ +#!/usr/bin/env bash +set -euo pipefail + +: + diff --git a/apps/jellyfin-linuxserver/README.md b/apps/jellyfin-linuxserver/README.md new file mode 100644 index 000000000..ffc6dd327 --- /dev/null +++ b/apps/jellyfin-linuxserver/README.md @@ -0,0 +1,61 @@ +# Jellyfin + +## 产品介绍 +Jellyfin 是一个自托管媒体服务器,本应用使用 LinuxServer.io 镜像部署。 + +## 主要功能 +- 通过浏览器和 Jellyfin 客户端管理、播放媒体库。 +- 使用 `/config` 持久化服务器配置和元数据。 +- 默认映射电视剧和电影两个媒体目录。 + +## 访问说明 +安装完成后,通过应用表单中的 HTTP 端口访问 Web UI,并按 Jellyfin 初始化向导完成配置。 + +## Introduction +Jellyfin is a self-hosted media server. This app deploys the LinuxServer.io image. + +## Features +- Manage and stream media libraries from browsers and Jellyfin clients. +- Persist server settings and metadata under `/config`. +- Map separate TV shows and movies media folders by default. + +## 应用简介 +Jellyfin 媒体服务器。 + +英文说明:Media server maintained by LinuxServer.io. + +## 部署说明 +- 本应用使用 Docker Compose 在 1Panel 中部署。 +- 应用分类:多媒体。 +- 支持架构:amd64、arm64。 +- 可选版本:`latest`、`10.11.11`。 + +## 端口 +| 变量 | 说明 | 默认值 | 必填 | +| --- | --- | --- | --- | +| PANEL_APP_PORT_HTTP | HTTP 端口 | 8096 | 是 | + +## 数据持久化 +| 变量 | 说明 | 默认值 | 必填 | +| --- | --- | --- | --- | +| CONFIG_PATH | 配置文件路径 | ./data/config | 是 | +| TVSHOWS_PATH | 电视剧媒体目录 | ./data/tvshows | 是 | +| MOVIES_PATH | 电影媒体目录 | ./data/movies | 是 | + +升级或迁移前,请在 1Panel 中备份上述数据目录。 + +## 配置项 +| 变量 | 说明 | 默认值 | 必填 | +| --- | --- | --- | --- | +| TIME_ZONE | 时区 | Asia/Shanghai | 是 | +| PUBLISHED_SERVER_URL | 自动发现返回地址 | 空 | 否 | + +## 使用说明 +- 默认仅开放 HTTP Web 端口;HTTPS、DLNA/发现 UDP 端口和硬件加速设备未默认映射。 +- 如需对外开放访问,请同步检查防火墙、安全组和反向代理配置。 + +## 参考资料 +- 官网: +- 文档: +- 源码: + diff --git a/apps/jellyfin-linuxserver/data.yml b/apps/jellyfin-linuxserver/data.yml new file mode 100644 index 000000000..7bb4a8905 --- /dev/null +++ b/apps/jellyfin-linuxserver/data.yml @@ -0,0 +1,31 @@ +name: Jellyfin +tags: +- Media +title: Jellyfin 媒体服务器 +description: Jellyfin 媒体服务器 +additionalProperties: + key: jellyfin-linuxserver + name: Jellyfin + tags: + - Media + shortDescZh: Jellyfin 媒体服务器 + shortDescEn: Media server maintained by LinuxServer.io + description: + en: Media server maintained by LinuxServer.io + zh: Jellyfin 媒体服务器 + zh-Hant: Jellyfin 媒體伺服器 + ja: LinuxServer.io が保守するメディアサーバー + ko: LinuxServer.io에서 유지 관리하는 미디어 서버 + ru: Медиасервер, поддерживаемый LinuxServer.io + ms: Pelayan media yang diselenggara oleh LinuxServer.io + pt-br: Servidor de midia mantido pela LinuxServer.io + type: tool + crossVersionUpdate: true + limit: 0 + website: https://jellyfin.org/ + github: https://github.com/linuxserver/docker-jellyfin + document: https://docs.linuxserver.io/images/docker-jellyfin/ + architectures: + - amd64 + - arm64 + diff --git a/apps/jellyfin-linuxserver/latest/.env.sample b/apps/jellyfin-linuxserver/latest/.env.sample new file mode 100644 index 000000000..e73fe0be4 --- /dev/null +++ b/apps/jellyfin-linuxserver/latest/.env.sample @@ -0,0 +1,8 @@ +CONTAINER_NAME= +PANEL_APP_PORT_HTTP=8096 +CONFIG_PATH=./data/config +TVSHOWS_PATH=./data/tvshows +MOVIES_PATH=./data/movies +TIME_ZONE=Asia/Shanghai +PUBLISHED_SERVER_URL= + diff --git a/apps/jellyfin-linuxserver/latest/data.yml b/apps/jellyfin-linuxserver/latest/data.yml new file mode 100644 index 000000000..4a9a53a23 --- /dev/null +++ b/apps/jellyfin-linuxserver/latest/data.yml @@ -0,0 +1,100 @@ +additionalProperties: + formFields: + - default: 8096 + edit: true + envKey: PANEL_APP_PORT_HTTP + labelEn: HTTP Port + labelZh: HTTP 端口 + label: + en: HTTP Port + zh: HTTP 端口 + zh-Hant: HTTP 連接埠 + ja: HTTP ポート + ko: HTTP 포트 + ru: HTTP-порт + ms: Port HTTP + pt-br: Porta HTTP + required: true + type: number + rule: paramPort + - default: ./data/config + edit: true + envKey: CONFIG_PATH + labelEn: Config folder path + labelZh: 配置文件路径 + label: + en: Config folder path + zh: 配置文件路径 + zh-Hant: 設定檔資料夾路徑 + ja: 設定フォルダーのパス + ko: 설정 폴더 경로 + ru: Путь к папке конфигурации + ms: Laluan folder konfigurasi + pt-br: Caminho da pasta de configuração + required: true + type: text + - default: ./data/tvshows + edit: true + envKey: TVSHOWS_PATH + labelEn: TV shows folder path + labelZh: 电视剧媒体目录路径 + label: + en: TV shows folder path + zh: 电视剧媒体目录路径 + zh-Hant: 電視劇媒體資料夾路徑 + ja: テレビ番組フォルダーのパス + ko: TV 프로그램 폴더 경로 + ru: Путь к папке сериалов + ms: Laluan folder rancangan TV + pt-br: Caminho da pasta de series + required: true + type: text + - default: ./data/movies + edit: true + envKey: MOVIES_PATH + labelEn: Movies folder path + labelZh: 电影媒体目录路径 + label: + en: Movies folder path + zh: 电影媒体目录路径 + zh-Hant: 電影媒體資料夾路徑 + ja: 映画フォルダーのパス + ko: 영화 폴더 경로 + ru: Путь к папке фильмов + ms: Laluan folder filem + pt-br: Caminho da pasta de filmes + required: true + type: text + - default: Asia/Shanghai + edit: true + envKey: TIME_ZONE + labelEn: Time zone + labelZh: 时区 + label: + en: Time zone + zh: 时区 + zh-Hant: 時區 + ja: タイムゾーン + ko: 시간대 + ru: Часовой пояс + ms: Zon waktu + pt-br: Fuso horário + required: true + type: text + - default: "" + edit: true + envKey: PUBLISHED_SERVER_URL + labelEn: Published server URL + labelZh: 对外服务地址 + label: + en: Published server URL + zh: 对外服务地址 + zh-Hant: 對外服務位址 + ja: 公開サーバー URL + ko: 공개 서버 URL + ru: Публичный URL сервера + ms: URL pelayan diterbitkan + pt-br: URL publica do servidor + required: false + type: text + diff --git a/apps/jellyfin-linuxserver/latest/docker-compose.yml b/apps/jellyfin-linuxserver/latest/docker-compose.yml new file mode 100644 index 000000000..60428e628 --- /dev/null +++ b/apps/jellyfin-linuxserver/latest/docker-compose.yml @@ -0,0 +1,24 @@ +networks: + 1panel-network: + external: true +services: + jellyfin: + image: "linuxserver/jellyfin:latest" + container_name: ${CONTAINER_NAME} + restart: always + networks: + - 1panel-network + ports: + - "${PANEL_APP_PORT_HTTP}:8096" + volumes: + - "${CONFIG_PATH}:/config" + - "${TVSHOWS_PATH}:/data/tvshows" + - "${MOVIES_PATH}:/data/movies" + environment: + - PUID=1000 + - PGID=1000 + - TZ=${TIME_ZONE} + - JELLYFIN_PublishedServerUrl=${PUBLISHED_SERVER_URL:-} + labels: + createdBy: "Apps" + diff --git a/apps/jellyfin-linuxserver/latest/scripts/init.sh b/apps/jellyfin-linuxserver/latest/scripts/init.sh new file mode 100755 index 000000000..c57a92f8d --- /dev/null +++ b/apps/jellyfin-linuxserver/latest/scripts/init.sh @@ -0,0 +1,16 @@ +#!/usr/bin/env bash +set -euo pipefail + +paths=( + "${CONFIG_PATH:-./data/config}" + "${TVSHOWS_PATH:-./data/tvshows}" + "${MOVIES_PATH:-./data/movies}" +) + +mkdir -p "${paths[@]}" +for path in "${paths[@]}"; do + case "$path" in + ./*|../*) chown -R 1000:1000 "$path" 2>/dev/null || true ;; + esac +done + diff --git a/apps/jellyfin-linuxserver/latest/scripts/uninstall.sh b/apps/jellyfin-linuxserver/latest/scripts/uninstall.sh new file mode 100755 index 000000000..accdccd70 --- /dev/null +++ b/apps/jellyfin-linuxserver/latest/scripts/uninstall.sh @@ -0,0 +1,3 @@ +#!/bin/bash +docker-compose down --volumes + diff --git a/apps/jellyfin-linuxserver/latest/scripts/upgrade.sh b/apps/jellyfin-linuxserver/latest/scripts/upgrade.sh new file mode 100755 index 000000000..a6eb46bac --- /dev/null +++ b/apps/jellyfin-linuxserver/latest/scripts/upgrade.sh @@ -0,0 +1,5 @@ +#!/usr/bin/env bash +set -euo pipefail + +: + diff --git a/apps/jellyfin-linuxserver/logo.png b/apps/jellyfin-linuxserver/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..1cbd0c3e5dd769852f99d16e8bc331beced8b610 GIT binary patch literal 3440 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 SGb^M30000