前言
您是否也曾面临NAS硬盘空间告急的窘境?是否希望将海量的影音收藏存放在容量几乎无限的云端,同时又能享受如本地般流畅、精美的Jellyfin海报墙和播放体验?本教程将带您走过一段经过实战检验的探索之旅,最终我们将搭建一套稳定、可靠、易于维护的全自动云端媒体中心。
此版本特别针对群晖ARM架构CPU(如采用Rockchip芯片的型号)进行了适配与排错,并全面采用 Docker Compose 进行部署,极大方便了后期的修改与维护。
方案架构
我们将使用三个核心的Docker容器协同工作,各司其职,完美配合:
Openlist (翻译官):负责连接您的云盘(本例中为天翼云盘),并将云盘文件统一转换为标准的WebDAV服务。
Rclone (搬运工):负责连接Openlist提供的WebDAV服务,并将云盘文件以高性能的VFS缓存模式,“搬运”并挂载到NAS的一个本地文件夹上。
Jellyfin (播放器):负责读取Rclone准备好的文件,整理成漂亮的海报墙,并为兼容的设备提供强大的硬解播放服务。
数据流: [云盘] -> [Openlist容器] -> [Rclone容器] -> [NAS本地文件夹] -> [Jellyfin容器]
准备工作
在开始之前,请确保您已具备:
一台可以正常运行Docker的群晖NAS(或其他Linux系统的NAS)。
在套件中心安装好 Container Manager (即Docker)。
已开启NAS的SSH功能,并能以管理员用户身份登录。
一个云盘账号(本教程以天翼云盘为例)。
一个GitHub账号(用于解决镜像拉取权限问题)。
第一阶段:基础环境准备
此阶段为所有容器准备好文件夹和系统环境。请通过SSH登录NAS执行。
步骤 1.1:创建所需文件夹
Bash
# 创建用于存放docker-compose文件的目录
sudo mkdir -p /volume1/docker/media_stack
# 创建Openlist配置文件目录
sudo mkdir -p /volume1/docker/openlist/data
# 创建Rclone配置文件及挂载点目录
sudo mkdir -p /volume1/docker/rclone/config
sudo mkdir -p /volume1/rclone_mount
# 创建Jellyfin配置文件和缓存目录
sudo mkdir -p /volume1/docker/jellyfin/config
sudo mkdir -p /volume1/docker/jellyfin/cache
# (可选) 创建一个NAS本地电影文件夹
sudo mkdir -p /volume1/Local_Movies
步骤 1.2:设置文件夹权限
Bash
sudo chmod -R 777 /volume1/docker
sudo chmod 777 /volume1/rclone_mount
sudo chmod 777 /volume1/Local_Movies
步骤 1.3:配置“共享挂载”(至关重要)
这是让Rclone容器能正常进行FUSE挂载的关键一步。
临时生效:在SSH中执行一次以下命令,让设置在当前立刻生效。
Bash
sudo mount –make-shared /volume1
永久生效:创建群晖开机任务。
进入群晖的 控制面板 -> 任务计划。
点击 新增 -> 触发的任务 -> 用户自定义的脚本。
常规 标签页:任务名称:Enable Shared Mount for Docker,用户账号:root,事件:开机。
任务设置 标签页:在脚本框内输入 mount –make-shared /volume1。
保存任务。
第二阶段:配置Rclone连接信息
此步骤通过交互式向导,生成rclone.conf配置文件。
步骤 2.1:运行Rclone交互式配置
Bash
sudo docker run –rm -it \
-v /volume1/docker/rclone/config:/config/rclone \
rclone/rclone \
config
步骤 2.2:按照向导输入
n) New remote -> 输入 n
name> -> 输入 tyyunpan
Storage> -> 输入 webdav
url> -> 输入 http://<您的NAS_IP>:5244/dav/ (请替换为您的NAS IP)
vendor> -> 直接回车
user> -> 输入您计划为Openlist设置的用户名 (例如 admin)
pass> -> 输入 y,然后输入并确认您计划为Openlist设置的密码
之后一路回车,直到最后主菜单,输入 q 退出。
第三阶段:编写并部署Docker Compose
这是本教程的核心,我们将所有服务定义在一个文件中,实现一键启停。
步骤 3.1:创建docker-compose.yml文件
Bash
# 进入我们第一步创建的专属目录
cd /volume1/docker/media_stack
# 创建并使用vi编辑器打开文件
sudo vi docker-compose.yml
步骤 3.2:粘贴最终配置
按 i 进入插入模式,将以下内容完整复制并粘贴进去。
注意:请根据注释,将 PUID 和 PGID 修改为您自己用户的ID。您可以在 SSH 中输入 id 您的群晖用户名 来查看。
YAML
# Docker Compose 版本号
version: “3.8”
# 定义所有服务
services:
# 服务1: Openlist (使用正确的Docker Hub镜像)
openlist:
image: openlistteam/openlist:latest
container_name: openlist
restart: unless-stopped
ports:
– “5244:5244”
volumes:
– /volume1/docker/openlist/data:/opt/openlist/data
environment:
# 请修改为您用户的ID,例如 admin 用户通常是 1024 和 100
– PUID=1026
– PGID=100
# 服务2: Rclone (搬运工)
rclone:
image: rclone/rclone
container_name: rclone-mount
restart: unless-stopped
privileged: true
cap_add:
– SYS_ADMIN
devices:
– /dev/fuse:/dev/fuse
volumes:
– /volume1/docker/rclone/config:/config/rclone
– /volume1/rclone_mount:/data:rshared
command: >
mount tyyunpan:/ /data
–allow-other
–allow-non-empty
–dir-cache-time 5m
–vfs-cache-mode minimal
–vfs-cache-max-size 20G
–buffer-size 32M
–vfs-read-chunk-size 16M
–vfs-read-chunk-size-limit 1G
# 服务3: Jellyfin (播放器)
jellyfin:
image: nyanmisaka/jellyfin:latest-rockchip
container_name: jellyfin
restart: unless-stopped
ports:
– “8096:8096”
volumes:
– /volume1/docker/jellyfin/config:/config
– /volume1/docker/jellyfin/cache:/cache
– /volume1/rclone_mount:/media/cloud:ro
– /volume1/Local_Movies:/media/local:ro
privileged: true
devices:
– /dev/dri:/dev/dri
– /dev/dma_heap:/dev/dma_heap
– /dev/mali0:/dev/mali0
– /dev/rga:/dev/rga
– /dev/mpp_service:/dev/mpp_service
– /dev/iep:/dev/iep
– /dev/mpp-service:/dev/mpp-service
– /dev/vpu_service:/dev/vpu_service
– /dev/vpu-service:/dev/vpu-service
– /dev/hevc_service:/dev/hevc_service
– /dev/hevc-service:/dev/hevc-service
– /dev/rkvdec:/dev/rkvdec
– /dev/rkvenc:/dev/rkvenc
– /dev/vepu:/dev/vepu
– /dev/h265e:/dev/h265e
depends_on:
– rclone
# 定义网络
networks:
default:
driver: bridge
粘贴后,按 Esc 键,输入 :wq 并回车保存退出。
步骤 3.3:启动服务
Bash
# (如果遇到拉取镜像权限问题,请参考文末的疑难解答)
sudo docker-compose up -d
首次启动会下载镜像,请耐心等待。完成后,可用 sudo docker-compose ps 查看所有容器状态应为 Up。
第四阶段:Web界面配置
步骤 4.1:配置Openlist
浏览器访问 http://<您的NAS_IP>:5244。
首次访问,设置管理员密码。此处的用户名(admin)和密码必须与2.2步中为Rclone设置的完全一致。
登录后,进入 存储 -> 添加。
驱动 选择 天翼云盘客户端,并根据提示完成登录授权。
挂载路径 填写 /天翼云盘。
保存。
步骤 4.2:验证Rclone挂载
在SSH中执行 ls -l /volume1/rclone_mount,您应该能看到一个名为 天翼云盘 的文件夹。
步骤 4.3:配置Jellyfin
浏览器访问 http://<您的NAS_IP>:8096,并完成初始化设置。
登录后,进入 控制台 -> 媒体库 -> 添加媒体库。
内容类型 选择 电影 或 剧集。
点击 文件夹 旁边的 + 号。
路径 处填写:/media/cloud/天翼云盘。
保存媒体库,Jellyfin将开始扫描并生成海报墙。
疑难解答 (Troubleshooting)
问题:docker-compose up 时提示 denied (拒绝访问)
原因:GitHub镜像仓库(ghcr.io)对匿名拉取有速率限制。
解决:登录Docker。首先去GitHub官网生成一个有read:packages权限的Personal Access Token (PAT),然后在NAS的SSH中执行 sudo docker login ghcr.io -u <你的GitHub用户名>,密码处粘贴PAT即可。
问题:提示 manifest unknown (清单未知)
原因:您NAS的CPU是ARM架构,而您尝试拉取的镜像(如旧版教程中的ghcr.io/openlistteam/openlist)没有提供适配ARM架构的版本。
解决:使用本教程docker-compose.yml中已修正的镜像地址 openlistteam/openlist:latest,它默认从Docker Hub拉取,该仓库提供了跨平台架构的支持。
结语
恭喜您!至此,您已经拥有了一个功能完整、性能可靠、开机自启且易于维护的自动化云端媒体中心。日常管理可通过以下命令进行:
停止所有服务: sudo docker-compose down
更新所有镜像: sudo docker-compose pull
查看服务日志: sudo docker-compose logs -f jellyfin
