Jellyfin 服务部署手册(转载)缩略图
内容纲要

记录部署 jellyfin 服务器步骤及填坑说明手册

部署

转为群晖的 UI 部署方案:Synology | Jellyfin

Docker 容器方案: Container | Jellyfin

我这个部署在群晖上,支持硬件解码 , 你需要根据自身情况调整挂载,详细见:

  1. Hardware Acceleration | Jellyfin
  2. Hardware Acceleration | Jellyfin
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 定义用户信息
USER_UID=1000
USER_GID=1000

# 定义目录信息
CONFIG=/path/to/config
CACHE=/path/to/cache
MEDIA=/path/to/media

docker run -d \
  --name jellyfin \
  --user $USER_UID:$USER_GID \
  --net=host \
  --volume $CONFIG:/config \
  --volume $CACHE:/cache \
  --device /dev/dri/renderD128:/dev/dri/renderD128 \
  --device /dev/dri/card0:/dev/dri/card0 \
  --mount type=bind,source=$MEDIA,target=/media \
  --restart=always \
  jellyfin/jellyfin

无法访问媒体信息

问题复现

从容器中尝试访问媒体信息报错: Permission denied

容器无法访问媒体文件

解决过程

检查权限

因为我直接使用群晖的 video 目录, 这个目录可以从 Console 上看到,权限并非 755

Video目录的权限是有一些问题的

在 WEB 界面,也可以看到该目录的权限比较复杂

Video目录本地用户部分可访问

因为我已经指定了容器运行的 UID 和 GID, 正常情况下服务会以指定的用户权限运行

服务以指定的用户运行

如果是 root 用户呢?会不会可以进入到媒体目录?测试一下 🆗

使用root用户可以访问媒体文件

尝试解决

问题找到了,权限问题,使用 root 可以,但是我指定的用户不可以, 那么问题来了,在群晖上我默认的用户能不能访问媒体文件呢?试一下🆗

群晖用户可以访问媒体文件

对比一下两个用户的信息, 群晖用户多了一个 groups 的属性!

查询了一下 Docker 官方对于 RUN 命令的详细说明, 其中有对于 USER 相关的说明

Docker run reference | Docker Documentation

1
2
3
4
-u="", --user="": Sets the username or UID used and optionally the groupname or GID for the specified command.

The followings examples are all valid:
--user=[ user | user:group | uid | uid:gid | user:gid | uid:group ]

仅支持A:B 形式, 只能指定一个用户和一个用户组,那么既然默认组没有权限, 尝试修改一下用户组🙂

最小权限原则,我在我的 LDAP 建了一个专用的用户, 并且创建了一个专用的用户组

创建一个专用的用户组

删除容器重新拉起,看看问题是否解决

可以正常显示媒体文件

🎉搞定啦~

错误猜测,仅记录

排查过程

Jellyfin 官方的手册,提示挂载目录的命令让我有些疑惑: docker run xxxx --mount type=bind,source=$MEDIA,target=/media, 指明需要使用 bind 挂载,这个是不是导致问题的元凶?

Container | Jellyfin

Bind Mounts are needed to pass folders from the host OS to the container OS whereas volumes are maintained by Docker and can be considered easier to backup and control by external programs. For a simple setup, it's considered easier to use Bind Mounts instead of volumes. Multiple media libraries can be bind mounted if needed:

译文:

需要绑定装载将文件夹从主机操作系统传递到容器操作系统,而卷由 Docker 维护,可以认为更容易由外部程序进行备份和控制。对于简单的设置,使用绑定装载而不是卷更容易。如果需要,可以绑定装载多个媒体库:

为此,查询了 Docker 官方对于 bind mount 的解释

Bind mounts | Docker Documentation

When you use a bind mount, a file or directory on the host machine is mounted into a container. The file or directory is referenced by its absolute path on the host machine. By contrast, when you use a volume, a new directory is created within Docker’s storage directory on the host machine, and Docker manages that directory’s contents.

译文

使用绑定装载时,主机上的文件或目录将装载到容器中。文件或目录由其在主机上的绝对路径引用。相反,当您使用卷时,主机上的 Docker 存储目录中会创建一个新目录,Docker 会管理该目录的内容。

以下这段内容,说明了区别

Differences between -v and --mount behavior🔗

Because the -v and --volume flags have been a part of Docker for a long time, their behavior cannot be changed. This means that there is one behavior that is different between -v and --mount.

If you use -v or --volume to bind-mount a file or directory that does not yet exist on the Docker host, -v creates the endpoint for you. It is always created as a directory.

If you use --mount to bind-mount a file or directory that does not yet exist on the Docker host, Docker does not automatically create it for you, but generates an error.

汇总一下 -v 和 --mount 的区别:

当 Docker 宿主机被挂载的路径不存在 , -v 会自动创建该目录的文件夹, --mount 会报错

结论

--mount 并不会导致权限问题, 只是在宿主机目录不存在情况下的行为不同而已.

TMDb (The Movie Database) 无法刮削

Video Station 搜刮器 TMDB 注册及一键修改 hosts - 我不是矿神

1
2
3
4
#手动筛选的ip,2022.11.1更新
curl http://code.imnks.com/hosts.sh | bash
#自动筛选的ip
curl http://code.imnks.com/hosts-auto.sh | bash

配置

美化

可以添加自定义 CSS 实现类似毛玻璃的特效

Jellyfin 添加自定 CSS 流程_NAS 存储_什么值得买

prayag17/JellySkin: Vibrante/minimal Jellyfin CSS using custom Icons and more!!, created for Jellyfin web , can be used by just one line.

以下操作基于版本:10.8.8

展开侧边栏控制台常规找到品牌设置, 填写自定义CSS

  1. 标准版本

     

    1
    @import url("https://cdn.jsdelivr.net/npm/jellyskin@latest/dist/main.css");

     

  2. 增加 LOGO 版本

     

    1
    @import url("https://cdn.jsdelivr.net/npm/jellyskin@latest/dist/logo.css");

     

  3. 提升性能版

     

    1
    @import url("https://cdn.jsdelivr.net/npm/jellyskin@12.2.0/dist/addons/improvePerformance.css")

     

    这个版本将从对话框中移除背景模糊,从登录页面中移除渐变滚动条和动画网格渐变(替换为普通渐变动画)

  4. 紧凑海报版

     

    1
    @import url("https://cdn.jsdelivr.net/npm/jellyskin@12.2.0/dist/addons/compactPosters.css");

     

增加 LDAP 认证

以下操作基于版本:10.8.8

安装

展开侧边栏控制台找到高级插件目录 , 找到 LDAP Authentication安装 🔂重启服务

配置

LDAP 服务设置

LDAP服务设置

LDAP 用户设置

LDAP用户设置

Jellyfin 用户设置

Jellyfin用户设置

用户名属性需要依据 LDAP 的属性决定,一般有以下几种:

  • uid
  • cn
  • displayName
  • sAMAccountName

如果不清楚,可以使用 Docker 部署一个 PHPLDAPAdmin 来查看

Github: osixia/docker-phpLDAPadmin: phpLDAPadmin container image 🐳🌴

DockerHub: osixia/phpldapadmin - Docker Image | Docker Hub

配置手册: LDAP server definitions - phpLDAPadmin

附快速启动命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 设置LDAP服务器信息
LDAP_HOST=10.1.0.2
# 设置使用端口
PORT=45678

# 更多详细说明
# https://github.com/osixia/docker-phpLDAPadmin#quick-start

docker run -d \
    -p $PORT:80 \
    -e PHPLDAPADMIN_HTTPS=false \
    -e PHPLDAPADMIN_LDAP_HOSTS=$LDAP_HOST \
    osixia/phpldapadmin:0.9.0
echo "请访问: http://localhost:$PORT"

启用硬件解码

群晖安装 jellyfin 版媒体服务器完全教程_NAS 存储_什么值得买

Jellyfin启用硬件解码

文件命名不规范导致无法正确刮削信息

手把手教您用 tMM 刮削影片信息,让 KODI、Jellyfin、PLEX、使用本地媒体电影墙!_软件应用_什么值得买

tinyMediaManager

参考上面链接里的说明, 使用 tMM (tinyMediaManager) 自动刮削信息并重命名电影

重要重命名规范

电影

速度与激情 9 为例,见下图:

速度与激情9-tMM刮削信息

详细说明: Movie Renamer - tinyMediaManager

因此,需要符合高清电影命名规范,参见: 如何看懂高清资源命名:常见命名规则及解释 - 知乎

设置值修改为:

1
2
3
4
5
6
7
8
9
# 文件夹名-默认重命名格式
${title} ${- ,edition,} (${year})

# 文件名-默认重命名格式
${title} ${- ,edition,} (${year}) ${videoFormat} ${audioCodec}

# 文件名-个人使用
${title}.${originalTitle}.${year}.${- ,edition,}.${videoFormat}.${videoCodec}.${audioCodec}
# 样例结果: 速度与激情9.F9.2021.1080p.h264.AAC

剧集

很类似电影,以海豹突击队为例

1
2
3
# 文件名-个人使用
${showOriginalTitle}.S${seasonNr2}.E${episodeNr2}.${videoCodec}.${videoFormat}.${audioCodec}
# 样例结果: SEAL Team.S01.E01.h264.720p.AC3.mp4

群晖使用 Docker 部署

群晖 Docker:小白安装 tmm 刮削保姆级教程,修改 host 解决刮削不全 ,建立完美电影墙!_NAS 存储_什么值得买

M 工开物 篇七:Jellyfin 刮削神器 TMM 小白使用指南,附演员头像不显示解决办法_NAS 存储_什么值得买

关于 Host 污染的问题,可以参见: Video Station 搜刮器 TMDB 注册及一键修改 hosts - 我不是矿神

官方 DockerImage

tinymediamanager/tinymediamanager - Docker Image | Docker Hub

简单启动 [官方]

1
2
3
4
5
6
7
8
docker run \
    --name=tinymediamanager \
    -p 4000:4000 \
    -v </path/to/local/data/>:/data \
    -v </path/to/movies>:/media/movies \
    -v </path/to/tvshows>:/media/tvshows \
    -v </path/to/addons/>:/app/addons \
    tinymediamanager/tinymediamanager:latest

优化版本

英文版

romancin/tinymediamanager - Docker Image | Docker Hub

中文优化版本

dzhuang/tinymediamanager - Docker Image | Docker Hub

dzhuang/tinymediamanager-docker: A repository for creating a docker container including TinyMediaManager with GUI interface.

Github 提供的简单启动命令

1
2
3
4
5
6
7
docker run -d --name=tinymediamanager \
-v /share/Container/tinymediamanager/config:/config \
-v /share/Container/tinymediamanager/media:/media \
-e GROUP_ID=1000 -e USER_ID=0 -e TZ=Asia/Hong_Kong \
-p 5800:5800 \
-p 5900:5900 \
dzhuang/tinymediamanager:latest

整合优化版启动命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# 定义用户信息
USER_UID=1000
USER_GID=1000

# 定义端口
PORT=5888

# 定义目录信息
CONFIG=/volume1/docker/tmm/config
MEDIA=/volume1/video

# 定义密码 最长8位
VNC_PASS="12345678"
# 或在 $CONFIG/.vncpass_clear 中定义
# 详见: https://github.com/dzhuang/tinymediamanager-docker#vnc-password

docker run -d \
  --name tmm \
  -e USER_ID:$USER_UID \
  -e GROUP_ID:$USER_GID \
  -e KEEP_APP_RUNNING=1 \
  -e ENABLE_CJK_FONT=1 \
  -e VNC_PASSWORD=$VNC_PASS \
  -p $PORT:5800 \
  -v $CONFIG:/config \
  -v $MEDIA:/media \
  -v /etc/localtime:/etc/localtime:ro \
  --restart=always \
  dzhuang/tinymediamanager:latest

容器拉取使用代理

Configure the daemon with systemd | Docker Documentation

参考上面的官方手册,在 DSM7.x 版本, 群晖也使用了 systemd 作为服务托管工具, 因此可以参考官方文档使用代理服务,不过需要注意

📢 群晖上 Docker 的名称有些变化,不叫 docker, 而是 pkg-Docker-dockerd, 可以通过如下命令验证

1
systemctl status pkg-Docker-dockerd
群晖的Docker服务

因此结合官方文档,需要预先创建文件

1
2
sudo mkdir -p /etc/systemd/system/pkg-Docker-dockerd.service.d
touch /etc/systemd/system/pkg-Docker-dockerd.service.d/http-proxy.conf

通过 vi/nano 或者其他随便什么工具, 修改 /etc/systemd/system/pkg-Docker-dockerd.service.d/http-proxy.conf 文件, 内容参见

1
2
3
4
[Service]
Environment="HTTP_PROXY=http://proxy.example.com:80"
Environment="HTTPS_PROXY=https://proxy.example.com:443"
Environment="NO_PROXY=localhost,127.0.0.1,docker-registry.example.com,.corp"

按照实际情况修改完成后,使用以下命令重启

1
2
sudo systemctl daemon-reload
sudo systemctl restart pkg-Docker-dockerd

如何验证呢?执行以下命令

1
sudo systemctl show --property=Environment pkg-Docker-dockerd

可以看到已生效

Docker配置已生效

通过代理服务器的日志也可以看到请求全部经过了代理

Docker pull 经过代理

容器及客户端使用代理

Configure Docker to use a proxy server | Docker Documentation

Configure Docker to use a proxy server | Docker Documentation

版本🆙 17.07, 可以直接写入以下到 ~/.docker/config.json

1
2
3
4
5
6
7
8
9
{
	"proxies": {
		"default": {
			"httpProxy": "http://192.168.1.12:3128",
			"httpsProxy": "http://192.168.1.12:3128",
			"noProxy": "*.test.example.com,.example2.com,127.0.0.0/8"
		}
	}
}

容器需要使用代理可以通过环境变量,传入

1
2
3
4
--env HTTP_PROXY="http://192.168.1.12:3128"
--env HTTP_PROXY="http://192.168.1.12:3128"
--env FTP_PROXY="ftp://192.168.1.12:3128"
--env NO_PROXY="*.test.example.com,.example2.com"

备用下载地址

阿里云下载

群晖共享 (备用)

有可能提示证书异常,忽略即可

客户端

官方地址: Clients | Jellyfin

IOS 用户请直接使用: App Store 或搜索 Jellyfin

阿里云下载

Rex Chow群晖共享 (备用)

有可能提示证书异常,忽略即可

特别声明:

发表回复