Kylaan

Back

家庭影音中心搭建:Ubuntu+Jellyfin+公网穿透+自动化踩坑实录Blur image

1 背景与硬件

寒假在家闲的蛋疼,受女朋友安利想看番剧和电影,奈何网络流媒体画质基本都令人汗颜。于是萌生了将家里这台闲置的电脑10400F & RX550变成一个集NAS 存储、媒体中心、远程下载、网盘挂载于一体的全能家庭服务器

服务器配置

Home-Server

  • CPU: Intel i5-10400F (无核显)
  • GPU: AMD Radeon RX 550 (亮机卡)
  • OS: Ubuntu Server 24.04.3 + 1Panel 面板
  • Storage: 1TB HDD + 250GB SSD
  • Network: 双网口 (eno1/eno2)

主要服务

Docker Stack

Jellyfin

Samba

Nginx

AList

Aria2

本文将详细记录整个折腾过程中从物理连线到驱动安装,再到反向代理的报错问题和解决方案。

一些基础过程,比如 Windows 重装 Ubuntu-ServerJellyfin 的基础部署和使用,在前面的文章中已经记录过流程,网上也有大量详细教程,这里不再赘述。

以下仅按照流程顺序记录折腾过程中的问题与解决方案


2 网络与存储:Windows 直连 Ubuntu Samba

为了传输 TB 级的数据,我选择用网线直接连接 Windows 和 Ubuntu 服务器(因为路由器端口不够且速度受限)。

之后遇到IP配置和Samba权限的问题,经过Gemini的帮助,选择了直接挂载服务器储存盘到Windows的方式,实现稳定的高速传输的同时为后来直接使用夸克网盘(没有Docker版本,部署在服务器代价太大)下载到服务器做了铺垫。以下是直接用网线连接两台机器的过程:

遇到的问题:Ping 得通,连不上

刚开始,我给两边分别设置了静态 IP (192.168.50.1.2)。

  • 现象:Linux 端配置正确,ping Windows 通畅。但 Windows 端死活无法访问 Samba 共享。
  • 报错:Windows 提示 系统错误 1231网络路径不存在

解决方案

核心原因是 Windows 将直连网络识别为“公用网络”,防火墙拦截了 SMB 流量;且 Docker 版 Samba 默认权限配置导致 Windows 匿名登录失败。

  1. 物理连接:网线直连两机网口。

  2. IP 配置

    • Ubuntu: sudo ip addr add 192.168.50.1/24 dev eno1
    • Windows: 设置静态 IP 192.168.50.1,网关留空。

    设置静态 IP1

    设置静态 IP2

  3. Samba 部署 (Docker): 使用 Docker 部署比原生安装更干净。

    查看 Samba docker-compose.yml 配置

    services:
      samba:
        image: dperson/samba
        container_name: samba
        restart: always
        ports:
          - "139:139"
          - "445:445"
        environment:
          - TZ=Asia/Shanghai
          - USERID=1000
          - GROUPID=1000
          # 关键配置:用户名;密码
          - USER=kylaan;your_password
          # 共享名;路径;只读;允许来宾;用户列表
          - SHARE=media;/mount/media;no;no;kylaan
        volumes:
          - /mnt/media:/mount/media
    yaml
  4. 强制挂载: 为了绕过 Windows 的匿名登录限制,使用命令行强制挂载:

    # 先清除旧连接
    net use * /delete /y
    # 强制带用户认证挂载
    net use Z: \\192.168.50.1\media /user:kylaan your_password
    powershell

3 核心媒体库:Jellyfin 与显卡驱动问题

这是最耗时的一步。我的 CPU (10400F) 没核显,必须依靠 RX 550 独显进行转码。

第一回合:FFmpeg 退出代码 171 & 187

Docker 部署 Jellyfin 后,直接播放视频,日志疯狂报错:

MediaBrowser.Common.FfmpegException: FFmpeg exited with code 171
No VA display found for device /dev/dri/renderD128.
log

原因分析

  1. Code 171: 选择了 AMD AMF 硬件加速。RX 550 对 AMF 支持极差,且我不小心勾选了 AV1 编码(老显卡根本不支持)。
  2. No VA display: Docker 根本没加载显卡驱动!ls -l /dev/dri 输出为空。

第二回合:修复驱动与配置

1. 宿主机安装固件

Ubuntu Server 缺省没有 AMD 固件。

sudo apt update
sudo apt install linux-firmware mesa-va-drivers mesa-vdpau-drivers -y
sudo reboot
bash

2. 验证驱动

重启后检查设备,终于看到了 renderD128

ls -l /dev/dri
# 输出: card0 renderD128
bash

3. Docker 映射

修改 1Panel 编排,把显卡直通给容器。

devices:
  - /dev/dri/renderD128:/dev/dri/renderD128
  - /dev/dri/card0:/dev/dri/card0
yaml

4. Jellyfin 内部设置

这是最关键的一步,设置错一个就会黑屏。

  • 硬件加速: 选择 VAAPI (不要选 AMF)
  • VA-API 设备: /dev/dri/renderD128
  • 硬件解码: ✅ H264, ✅ HEVC, ✅ MPEG2
  • 硬件编码: ❌ 取消勾选 AV1 (RX 550 不支持),只保留 H264。

4 公网访问:Nginx 反代配置问题

为了在外网访问,我采用了 FRP (内网穿透) -> 阿里云服务器 -> Nginx 反代 的架构。

诡异现象

  • 使用 IP:端口 访问:一切正常。
  • 使用 https://movie.kylaan.top 访问:网页能打开,能看海报,但点击播放一直转圈,最后黑屏,且服务器显示有流量跑动

反代配置问题

根源与修复

这是一个经典的 Nginx 反代配置问题。原因有二:

  1. 混合内容:Jellyfin 以为自己在跑 HTTP,返回了 HTTP 的流地址,被浏览器拦截。
  2. 缓冲阻塞:Nginx 默认开启缓冲,试图下载完视频片段再发给客户端,导致流媒体卡死。

✅ 最终 Nginx 配置文件 (修复版)

server {
    listen 443 ssl;
    server_name movie.kylaan.top;

    # ... SSL 证书配置 ...

    location / {
        proxy_pass http://127.0.0.1:8096;  
        
        # 1. 告诉 Jellyfin 前端是 HTTPS
        proxy_set_header X-Forwarded-Proto https;
        proxy_set_header X-Forwarded-Protocol https;
        proxy_set_header X-Forwarded-Ssl on;

        # 2. 关键!禁用缓冲,允许流式传输
        proxy_buffering off;
        
        # 3. 支持 WebSocket (防止断连)
        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;
    }
}
nginx

5 资源获取:网盘自动化方案

服务器没有资源就是空壳。我配置了百度网盘和夸克网盘的自动化下载。

方案:使用 johngong/baidunetdisk 镜像,通过 VNC (Web 界面) 操作 Linux 版客户端。

操作重点

  1. 部署后访问 http://192.168.100.89:5800/
  2. 输入 VNC 密码。
  3. 最重要的设置:在百度网盘客户端设置里,将下载路径改为 /media/downloads(映射到物理硬盘的路径),否则下载的文件会在重启容器后丢失!

插入图片:浏览器中显示的百度网盘 Linux 客户端界面


6 完美主义:字幕、弹幕与导航页

为了提升观影体验,我还折腾了以下细节:

1. 中文字幕方框问题

Jellyfin 烧录字幕时,如果容器内没有中文字体,汉字会显示为方框。 字幕问题

  • 解决
  1. 宿主机安装 fonts-noto-cjk-extra
  2. Docker 映射 /usr/share/fonts:/usr/share/fonts
  3. Jellyfin 后台启用“备用字体”

2. Bilibili 弹幕

使用了 jellyfin-plugin-danmu 插件。

  • 安装插件仓库。
  • 配置 B 站 Cookie。
  • 刷新元数据,播放时选择 “Bilibili” 字幕轨道,弹幕就出来了!

3. 导航页 (Sun-Panel)

部署了 Sun-Panel,将 Jellyfin、1Panel和各个资源站等等全部聚合在一个页面,这是我的家庭云入口。

插入图片:Sun-Panel 导航页截图,展示了所有服务的图标

后续还有可能把阿里云上的服务也加进去,做到真正的一键直达。


7 总结

经过几天的通宵折腾,这台 10400F + RX 550 的机器已经脱胎换骨。

  • 看片:Jellyfin 硬解 4K 流畅,支持弹幕。
  • 管理:Samba 跑满千兆带宽。
  • 下载:百度/夸克自动搬运。
  • 访问:HTTPS 域名直达,无视内网限制。

希望这篇文章能帮助到有类似需求的朋友们。如果你也在折腾家庭服务器,欢迎留言交流经验!😊

家庭影音中心搭建:Ubuntu+Jellyfin+公网穿透+自动化踩坑实录
https://kylaan.top/blog/jellyfin/process
Author Kylaan
Published at 2026年1月23日
Comment seems to stuck. Try to refresh?✨