home server 篇七:多媒体服务器 jellyfin
我知道jellyfin是多媒体服务器,但是这篇的关注点是视频播放,还有安全。
吐槽
关于jellyfin我就不用介绍了吧, 毕竟站里已经推了很多次了。我相信有一堆人只是看了站内的推文,然后根本没去官网看过, 因为我也这样。但是在虚拟机的docker里jellyfin没法硬解,迫使我不得不去官网看一堆英文, 然后看完后我并没有找到答案,去gayhub倒是找到了:硬解必须得调用真的显卡,要不然在物理机上调用,要不然在虚拟机里就要直通给它,没其它方法了。但是我的ubuntu在win11的vmware里, 显然我没法在这台电脑上让ubuntu的docker里的jellyfin硬解了。所以我在笔记本里直装ubuntu进行了试验,然后成功的在物理机的ubuntu的docker里让jellyfin硬解了,好拗口啊。所以为什么不在win11上直接装jellyfin,问得好,因为等我买了新硬盘再把数据拷进去后,这台电脑将会直接装linux,至于要用哪个分行我还没决定,现在把硬解问题解决了以后就方便了,要不然等我装好linux后不能硬解就尴尬了,还有win11每周都要打补丁再重启实在太烦了。
硬件要求
先说说硬件要求,很简单,只要能支持h265就行,毕竟网上载的资源要不然是h264(avc)要不然就是h265(hevc),所以如果用酷睿至少要7代。要到11代才支持av1。
所以你们懂在jellyfin里为什么这样选了吧。
软件要求
然后是软件要求, 我知道大家喜欢用浏览器直接播放的。Jellyfin支持4种转码,分别是:
抱歉啊, 我懒的翻译 。看这图就知道了,Direct Play对服务器的要求最小,所以视频点开就立即播放,感觉不到延迟。Transcode对服务器的要求最大,所以视频点开会感觉到延迟,不过延迟可以靠cpu性能降低。如果没有硬解那是真的慢,我试过。至于h264 10bit的视频,就不要载了,没人支持。
我试过播放h265 10bit的视频,就算服务器端支持硬解,但是在浏览器端播放时还是转码了。所以为了最好的用浏览器在线观看体验,我推荐大家载h264 8bit的视频。
关于储存也是有要求的。不能把硬盘全塞满了。我知道大佬们一个视频五六十G的。
安装
现在开始安装。在traefik那篇好多人吐槽yaml啊,为了让你们不在这篇吐槽,我决定写个超长的docker-compose。记得把!换成空格。
version: "3"
networks:
!!traefik_proxy:
!!!!external: true
services:
!!jellyfin:
!!!!image: nyanmisaka/jellyfin:latest
!!!!container_name: jellyfin
!!!!volumes:
!!!!!!- /home/用户名/docker/jellyfin/config:/config
!!!!!!- /home/用户名/docker/jellyfin/cache:/cache
!!!!!!- /home/用户名/docker/jellyfin/log:/var/log/jellyfin
!!!!!!- $PWD/media:/media
!!!!networks:
!!!!!!- traefik_proxy:
!!!!!!!!!!ipv4_address: 172.20.0.6
!!!!ports:
!!!!!!- 8096:8096 #Http webUI
!!!! # - 7359:7359/udp #Allows clients to discover Jellyfin on the local network
!!!! # - 1900:1900/udp #Service discovery used by DNLA and clients
!!!!group_add: #see /etc/group
!!!!!!- 107 #render
!!!!!!- 44 #video
!!!!!!- 109 #input
!!!!devices:
!!!!!!- /dev/dri/renderD128:/dev/dri/renderD128
!!!!!!- /dev/dri/card0:/dev/dri/card0
!!!!restart: unless-stopped
!!!!environment:
!!!!!!- TZ=Asia/Shanghai
!!!!!!- PUID=1000
!!!!!!- PGID=1000
!!!!!!- JELLYFIN_LOG_DIR=/var/log/jellyfin
!!!!# - JELLYFIN_PublishedServerUrl=192.168.0.130 #Set the autodiscovery response domain or IP address
!!!!labels:
!!!!!!- traefik.enable=true
!!!!!!- traefik.http.routers.jellyfin-http.entrypoints=web
!!!!!!- traefik.http.routers.jellyfin-http.rule=Host(`jellyfin.子域名.duckdns.org`)
!!!!!!- traefik.http.routers.jellyfin-http.middlewares=https-redirectscheme@file
!!!!!!- traefik.http.routers.jellyfin-https.entrypoints=websecure, public
!!!!!!- traefik.http.routers.jellyfin-https.rule=Host(`jellyfin.子域名.duckdns.org`)
!!!!!!- traefik.http.routers.jellyfin-https.tls=true
!!!!!!- traefik.http.services.jellyfin-https.loadbalancer.server.port=8096
!!!!!!- traefik.http.services.jellyfin-https.loadBalancer.passHostHeader=true
!!!!!!- traefik.http.routers.jellyfin-https.middlewares=secured
!!!!!!- traefik.http.middlewares.secured.chain.middlewares=crowdsec-bouncer@file,jellyfin-mw
!!!!!!- traefik.http.middlewares.jellyfin-mw.headers.customResponseHeaders.X-Robots-Tag=noindex,nofollow,nosnippet,noarchive,notranslate,noimageindex
!!!!!!- traefik.http.middlewares.jellyfin-mw.headers.SSLRedirect=true
!!!!!!- traefik.http.middlewares.jellyfin-mw.headers.SSLForceHost=true
!!!!!!- traefik.http.middlewares.jellyfin-mw.headers.STSSeconds=315360000
!!!!!!- traefik.http.middlewares.jellyfin-mw.headers.STSIncludeSubdomains=true
!!!!!!- traefik.http.middlewares.jellyfin-mw.headers.STSPreload=true
!!!!!!- traefik.http.middlewares.jellyfin-mw.headers.forceSTSHeader=true
!!!!!!- traefik.http.middlewares.jellyfin-mw.headers.frameDeny=true
!!!!!!- traefik.http.middlewares.jellyfin-mw.headers.contentTypeNosniff=true
!!!!!!- traefik.http.middlewares.jellyfin-mw.headers.browserXSSFilter=true
!!!!!!- traefik.http.middlewares.jellyfin-mw.headers.customFrameOptionsValue=SAMEORIGIN
壮观吧,为了够长,连header都补上了。
安全
关于Fail2ban,官网写的很清楚,我改了改就搬运过来了,/var/log/jellyfin是放日志的地方。
jail.d/jellyfin.local
[jellyfin]
enabled = true
banaction = nftables-forward
bantime = 86400
findtime = 43200
port = 80,443,666
filter = jellyfin
logpath = /var/log/jellyfin/*.log
maxretry = 5
backend = auto
protocol = tcp
filter.d/jellyfin.conf
[Definition]
failregex = ^.*Authentication request for ".*" has been denied (IP: "<ADDR>")
然后在fail2ban的docker-compose的volume里加这行:
- /home/用户名/docker/jellyfin/log:/var/log/jellyfin:ro
然后我故意输错密码,把我自己给ban了,在内网被ban没什么鸟用,所以我在外网把自己ban了,然后我真的无法访问服务器了。这只是内网的,我没兴趣暴露我的公网ip。
嗯,我还没看过crowdsec官网,所以不会写,我也不知道什么时候会去看,一想到要看一堆英语就头疼。 在外网测试时忘记把crowdsec的mw关了,但是它没起作用,应该是没设置好的原因,不过我应该被加进crowdsec黑名单了。
其它
关于硬解,devices是必须的,ubuntu还需要render group,我试过什么都不加,硬解不了hevc,加个video,可以硬解hevc但是没声音,再加render,一切正常。然后我确认了,这些id不是固定的,需要看/etc/group。
关于DNLA,这东西挺危险的,在win里,不用密码都能在网络里直接访问所有文件,还是关了的好,所以有关配置前我都加了#。而且在docker里,广播只能传到172.20.0.0,要用的话还得用host模式,或者macvlan。
关于文件的放置,具体上官网看:
剩下的在这里看吧,他写的挺详细的:
作者声明本文无利益相关,欢迎值友理性交流,和谐讨论~
炽羽
校验提示文案
焱炎火
双核cpu就这样运行了2年多,等志强1268L再便宜点考虑升级吧
现在jellyfin搜刮已经够用了,只要网络不受限基本片名改成原版名称照样自动匹配海报简介演员。
校验提示文案
值友7148046813
校验提示文案
值友7148046813
校验提示文案
焱炎火
双核cpu就这样运行了2年多,等志强1268L再便宜点考虑升级吧
现在jellyfin搜刮已经够用了,只要网络不受限基本片名改成原版名称照样自动匹配海报简介演员。
校验提示文案
炽羽
校验提示文案