Jellyfin 家庭影音库不只在家看:NAS 媒体服务器外网访问实操

Jellyfin 家庭影音库外网访问封面

摘要:家里有 NAS、小主机或闲置 Linux 服务器时,可以用 Jellyfin 整理个人合法媒体库。下面从 Docker Compose 部署开始,把媒体目录挂载、本地初始化、cpolar 映射 8096、手机外网访问和安全检查串起来,目标是让你在外面也能访问自己的家庭影音库,同时不把 NAS 管理后台暴露出去。

说明:下面只讨论个人合法媒体库的管理和访问,不涉及任何盗版资源获取、传播或规避版权的内容。自己的影音库自己看,边界一定要清楚。

1 为什么我会把 Jellyfin 放到 NAS 上

家里攒了一堆纪录片、家庭录像、课程回放、自己购买或合法备份的影片后,直接按文件夹翻找很快就乱了。电视端、平板、手机、电脑各有各的播放习惯,文件名、字幕、封面也经常对不上。

Jellyfin 适合做家庭影音库,原因很简单:它是开源媒体服务器,服务端负责整理媒体库,客户端负责播放。你在 NAS 或小主机上部署一次,局域网里的电视、手机、平板、浏览器都能连上同一个库。

我更喜欢它的一点是,Jellyfin 不把核心功能绑在订阅里。家庭自用场景下,账号、媒体库、播放记录、字幕、封面刮削、转码配置都在自己机器上管理,排错时也比较直观。

不过有个现实问题:人在家时访问 http://NAS-IP:8096 很舒服,出门后就连不上了。直接把路由器端口转发到公网不适合大多数家庭网络,也容易把不该暴露的后台顺手带出去。这里用 cpolar 只映射 Jellyfin Web 的 8096,拿一个 HTTPS 地址给手机和平板用,边界更清楚。

2 环境准备:先把目录和权限理顺

Jellyfin NAS cpolar 外网访问架构图

本次示例使用 Linux 服务器或 NAS 的 Docker 环境,Jellyfin 跑在容器里,媒体文件放在宿主机目录中。Jellyfin 默认 Web 端口是 8096,Docker Compose 里把宿主机 8096 映射到容器 8096

准备 3 类目录:

sudo mkdir -p /opt/jellyfin/config
sudo mkdir -p /opt/jellyfin/cache
sudo mkdir -p /data/media/movies
sudo mkdir -p /data/media/tv

目录用途别搞混:

  • /opt/jellyfin/config:Jellyfin 配置、账号、媒体库信息。
  • /opt/jellyfin/cache:缓存和临时文件。
  • /data/media:你的个人合法媒体文件目录。

如果你的媒体已经在 NAS 共享盘里,比如 /volume1/video,后面 Compose 里的 /data/media 换成真实路径即可。这里别填错,容器只能看到你挂进去的目录,宿主机上存在不代表 Jellyfin 容器里也能直接看到。

为了减少权限问题,先确认当前用户的 UID 和 GID:

id

输出里会看到类似 uid=1000(admin) gid=1000(admin)。后面 Compose 示例用 1000:1000,你的机器不是这个值就替换成自己的。媒体目录建议给读取权限,Jellyfin 不需要对影片目录拥有写入权。

sudo chown -R 1000:1000 /opt/jellyfin
sudo chmod -R 755 /data/media

3 用 Docker Compose 部署 Jellyfin

进入部署目录,新建 Compose 文件:

mkdir -p /opt/jellyfin
cd /opt/jellyfin
nano docker-compose.yml

写入下面配置:

services:
  jellyfin:
    image: jellyfin/jellyfin:latest
    container_name: jellyfin
    user: "1000:1000"
    ports:
      - "8096:8096/tcp"
      - "7359:7359/udp"
    volumes:
      - /opt/jellyfin/config:/config
      - /opt/jellyfin/cache:/cache
      - type: bind
        source: /data/media
        target: /media
        read_only: true
    restart: unless-stopped

Jellyfin Docker Compose 配置示意图

这里有几个点要看清楚:

  • 8096:8096/tcp 是 Jellyfin Web 页面和 API 的默认端口,本地浏览器访问也靠它。
  • 7359:7359/udp 用于局域网发现,电视端或手机端在同一网络里更容易找到服务。
  • /data/media:/media 代表宿主机媒体目录挂到容器内 /media,初始化媒体库时选择 /media
  • read_only: true 是刻意加的,Jellyfin 只读媒体文件,降低误删风险。

启动服务:

docker compose up -d

看容器状态:

docker compose ps

查看日志:

docker logs -f jellyfin

看到服务正常监听后,在同一局域网打开:

http://服务器IP:8096

如果页面打不开,先查三件事:容器是否在运行、服务器防火墙是否放行 8096/tcp、Compose 文件里的端口是否写成了别的值。别急着改一堆配置,先把本地访问跑通。

4 首次初始化:只创建自己的账号和媒体库

打开 Jellyfin 页面后,会进入初始化向导。语言选中文,管理员账号设置一个强密码,不要用生日、手机号、简单英文单词。

媒体库这一步选择内容类型,例如“电影”或“节目”,文件夹路径选择容器里的 /media/movies/media/tv。注意,这里不是宿主机路径 /data/media,因为 Jellyfin 运行在容器里,它看到的是挂载后的 /media

刮削语言建议按你的媒体内容选择中文或英文。刚开始别一次性挂太多目录,先放 1~2 个文件夹做测试,看到封面、标题、播放都正常后,再把完整媒体库加进去。这样排错更轻松。

安全设置也要在初始化后马上处理:

  • 只创建自己和家人需要的账号。
  • 不开放公开注册。
  • 普通账号只分配需要看的媒体库。
  • 管理员账号不要给电视盒子长期登录。

这一步不是为了“仪式感”,而是确认媒体库、账号、权限都在你手里。外网访问打通后,弱密码和过宽权限都会被放大。

5 安装 cpolar,并映射 Jellyfin 的 8096

本地 Jellyfin 能打开后,再做外网访问。顺序不要反,cpolar 负责把本地 Web 服务映射出去,不负责修复 Jellyfin 本身的问题。

Linux 上安装 cpolar 使用官方脚本:

curl -L https://www.cpolar.com/static/downloads/install-release-cpolar.sh | sudo bash

安装后启动服务,并确认本地 Web UI:

sudo systemctl start cpolar
sudo systemctl enable cpolar
curl -s http://127.0.0.1:9200 || echo "cpolar 服务未启动"

浏览器打开:

http://服务器IP:9200

登录 cpolar 账号。能打开 Web UI 的环境,登录后通常会自动写入账号绑定信息;纯命令行环境也可以用 cpolar authtoken 手动绑定。

临时验证时,直接开 HTTP 隧道映射 Jellyfin:

cpolar http 8096

命令输出里会出现 https:// 开头的公网地址。也可以在 cpolar Web UI 的“状态 → 在线隧道列表”里查看当前地址。

免费随机地址适合测试,24 小时内会变化。长期给手机、平板、电视端使用,建议用固定二级子域名;固定二级子域名需要基础套餐或以上。这里不要把 NAS 管理后台、SSH、数据库端口顺手映射出去,只映射 Jellyfin 的 8096

6 手机外网访问验证

手机外网访问 Jellyfin 验证图

拿手机切到非家庭 Wi-Fi,比如移动网络,打开 cpolar 生成的 HTTPS 地址。能看到 Jellyfin 登录页,就说明外网链路已经打通。

登录自己的 Jellyfin 账号后,找一个体积不大的视频播放。测试重点不是一次把 4K 片源拉满,而是确认这几件事:

  • 登录页能打开。
  • 媒体库能加载。
  • 视频能播放。
  • 字幕能显示。
  • 退出登录后再次访问仍需要账号密码。

如果手机端卡顿,先在 Jellyfin 播放器里把码率调低,再看服务器 CPU 占用和家庭宽带上行。外网播放慢,常见原因是上行带宽不足、视频码率太高、服务器正在软件转码。硬件转码是单独的优化项,不建议和首次部署混在一起折腾。

7 安全检查清单:别把影音库变成裸奔服务

Jellyfin 外网访问安全边界检查图

外网访问做好后,安全检查要立刻做。家庭媒体服务器不是企业系统,但也不能裸奔。

  • Jellyfin 管理员账号使用强密码,普通账号单独创建。
  • 关闭公开注册,只给家人创建需要的账号。
  • 媒体库权限按账号分配,儿童账号不要给全库权限。
  • cpolar 只映射 8096,不要映射 NAS 管理后台、路由器后台、数据库、SSH。
  • 隧道不用时关闭;长期使用固定域名时,配合更严格的访问控制。
  • 定期更新 Jellyfin 镜像和系统补丁。

更新 Jellyfin 容器可以这样做:

cd /opt/jellyfin
docker compose pull
docker compose up -d

更新前保留 /opt/jellyfin/config,这是配置和账号数据所在目录。不要为了“重装干净”直接删配置目录,删掉后媒体库和用户信息也会跟着丢。

8 常见问题:按链路一段段排

8.1 Jellyfin 里看不到媒体目录

优先检查 Compose 里的挂载路径。宿主机目录是 /data/media,容器里选择的是 /media。如果初始化时填了 /data/media,Jellyfin 在容器内找不到这个路径。

再检查宿主机权限:

ls -ld /data/media /data/media/movies /data/media/tv

容器用户需要读取权限。为了安全,不建议直接给媒体目录 777,读权限够用就别放大。

8.2 8096 端口打不开

先看容器:

docker compose ps
docker logs --tail=100 jellyfin

容器正常后,再查本机监听:

ss -lntp | grep 8096

如果服务器启用了防火墙,放行 8096/tcp。只在局域网访问时,路由器不需要做公网端口转发。

8.3 cpolar 地址能打开,但播放很慢

先降低 Jellyfin 播放码率,再测试一个 720p 或 1080p 文件。高码率原盘、跨网络播放、软件转码叠在一起,会让小主机压力很大。

还要看家庭宽带上行。很多家庭宽带下载很快,上行并不高。外网看视频吃的是家里上传能力,不是你手机当前的下载速度。

8.4 忘记密码或账号权限配错

还能登录管理员账号时,在 Jellyfin 后台直接重置用户密码和媒体库权限。管理员账号也无法登录时,不要急着删容器,先保留 /opt/jellyfin/config,再按 Jellyfin 官方重置流程处理。

权限配错时,建议新建一个测试账号,只给一个媒体库权限,用手机外网登录验证。确认没问题后,再调整家人账号。

9 总结

现在这套链路已经搭起来了:Jellyfin 负责整理和播放个人合法媒体库,Docker Compose 负责把服务稳定跑起来,cpolar 只把 Jellyfin Web 的 8096 映射成 HTTPS 地址,手机和平板在外面也能访问自己的影音库。

关键步骤可以记成三件事:

  • 先在本地跑通 Jellyfin,媒体目录挂到容器内 /media
  • 再用 cpolar 映射 8096,只暴露 Jellyfin,不暴露 NAS 管理后台。
  • 外网访问后立刻检查账号、密码、注册、媒体库权限和隧道状态。

后面想继续优化,可以从字幕刮削、硬件转码、电视端播放、多用户权限这几个方向选一个深入。你更想看哪一块?评论区告诉我,我优先写实操坑最多的那个。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐