PassNAT LogoPassNAT

有声书放 NAS 上走哪听哪:飞牛 NAS 用一个容器装 Audiobookshelf,自动认章节记进度,播客订阅自动下载,配内网穿透手机上接着听

作者

小编

发布时间

Curving abstract shapes with an orange and blue gradient

项目介绍

Audiobookshelf 是一个自己搭的有声书和播客服务器。有声书丢进去,它按音频文件自动认出章节、记住每个人听到了哪里;播客贴一个 RSS 地址就能订阅,出了新一集它自己下载。网页版在手机浏览器里也能直接用,官方也做了手机 App。

装在 NAS 上的好处是书和节目都在自己手里:家里电脑上听一段,出门在手机上接着听,进度跟着账号走,不用来回找位置。

项目地址:advplyr/audiobookshelf

本文所有步骤都是在 2.36.1 上实测的。演示用的有声书是 LibriVox 志愿者朗读的公有领域录音:鲁迅《朝花夕拾》。

部署安装

装好之后它默认只有家里的网络能打开。可「出门在路上接着听」恰恰是这东西最有用的场景,只能在家用就少了一大半意义。家里没有公网 IP 的话,可以用 帕斯内网穿透 把它开放到公网,飞牛的应用中心里就能直接装到插件。具体操作可以参考 这份全平台上手指南。下面这套流程在飞牛 NAS 上从头到尾走一遍。

第一步:准备编排文件

下面这份编排可以直接用,镜像就是官方文档里写的那个 latest。

1services:
2 audiobookshelf:
3 image: ghcr.io/advplyr/audiobookshelf:latest
4 container_name: audiobookshelf
5 restart: unless-stopped
6 ports:
7 # 左边 13378 是浏览器里敲的端口,右边 80 是容器里的,别动
8 - "13378:80"
9 volumes:
10 # 有声书放这里:一本书一个文件夹(作者 / 书名 / 音频文件)
11 - ./audiobooks:/audiobooks
12 # 订阅的播客,下载下来的节目存这里
13 - ./podcasts:/podcasts
14 # 账号、收听进度、设置都在这,整个文件夹拷走就是备份
15 - ./config:/config
16 # 封面、缓存、日志
17 - ./metadata:/metadata
18 environment:
19 # 不填的话时间按 UTC 算,跟本地差八小时
20 TZ: Asia/Shanghai
21 # 我家网络会把外网域名解析成 198.18 开头的地址,它自带的防护会当成内网拦掉,
22 # 订阅播客就报「RSS 源请求失败」,所以加了这一行;你那边订阅正常可以不要
23 DISABLE_SSRF_REQUEST_FILTER: "1"
24

端口:冒号左边的 13378 是待会儿在浏览器里输的宿主端口,也是建隧道时要填的那个(官方示例用的就是它);右边的 80 是容器内部的端口,不要动。13378 被别的容器占了的话,换一个没用过的即可。

有声书目录:./audiobooks 放有声书,一本书一个文件夹,推荐按「作者 / 书名 / 音频文件」来放,比如 鲁迅/朝花夕拾/。一本书拆成多个音频文件的,它会按顺序把每个文件认成一章,章节名取自音频文件标签里的标题;文件夹里放一张 cover.jpg 就是封面。

播客目录:./podcasts 是订阅的播客下载下来的节目存放的地方。

配置目录:./config 里是账号、收听进度和设置(它的数据库就在这里),整个文件夹拷走就是一份完整备份;./metadata 里是封面缓存、日志和它自己做的备份。这里特意用路径挂载而不是存储卷,因为飞牛的 Docker 界面里没有管理存储卷的地方,以后想清掉重来会很麻烦。

时区:TZ 填 Asia/Shanghai,不填的话它记的时间按 UTC 算,跟本地差八小时。

最后那一行:订阅播客报「RSS 源请求失败」时才需要

Audiobookshelf 自带一道防护:它拒绝替你去请求内网或保留地址,免得有人拿「订阅播客」这个功能去探你家里的内网。

问题在于有些家庭网络会把外网域名解析成 198.18 开头的地址(路由器上开了某些 DNS 分流功能的,常常是这样)。这种地址在它眼里就是保留地址,于是一律拦下,表现是贴了播客的 RSS 地址之后报「RSS 源请求失败」,容器日志里是一行 Call to 198.18.x.x is blocked。我家的网络就是这样,所以编排里加了 DISABLE_SSRF_REQUEST_FILTER 这一行。

你那边订阅播客一切正常的话,这一行可以不要。另外说清楚它关掉的是什么:它关的是「不许服务器去请求内网地址」这道防护。只有你自己一个账号时影响不大;要是打算开账号给别人用,别随手关,可以改用 SSRF_REQUEST_FILTER_WHITELIST 只放行具体的几个域名。

第二步:在飞牛上建 Compose 项目

打开飞牛的 Docker 应用,切到 Compose,点右上角的新增项目。项目名称填 audiobookshelf。

路径这一栏点开,在「我的文件」下面挑一个文件夹选中 —— 这个文件夹以后就是这个项目的家,上面编排里的 ./audiobooks 这些目录都会建在它下面。

来源选「创建 docker-compose.yml」,把上面那份编排整段贴进去。

下面「创建项目后立即启动」勾上,点确认。镜像三百来兆,第一次要拉一会儿,拉完就跑起来了。

第三步:用内网穿透开放到公网(先别通电)

在飞牛的应用中心里搜 PassNAT,装上,账号登一次。打开插件点创建隧道:名字随便起;传输协议选 HTTP;本地 IP 留空就好,默认就是 127.0.0.1,不用去查 NAS 的局域网地址;本地端口填上面那个 13378。

选 HTTP 是因为选了它之后表单上会多出「子域名」和一个顶级域名的下拉 —— 填一个没人用过的子域名、在下拉里挑一个顶级域名,拿到的公网地址就是一个网址,而不是一串 IP 加随机端口。子域名是全平台唯一的,填一个太常见的词多半会提示已存在,换一个就行。

表单里「网页访问用户名 / 密码」那两格请留空:Audiobookshelf 自己的接口用 Authorization 这个请求头传登录令牌,隧道那一层的网页访问密码也用这个头,两边会撞在一起。口令交给 Audiobookshelf 自己管就好。

填完提交,隧道就出现在列表里了 —— 这时候先别按电源,理由看下一步。

🔴 第四步:通电之前,先把管理员建好

Audiobookshelf 第一次打开是一个「Initial Server Setup」页面,让你给 root 这个管理员账号设密码。这一页谁先打开,谁就是这台服务器的管理员。

所以顺序是:隧道建好先别通电,在家里的网络上打开 http://你的NAS地址:13378,把 root 的密码设好;然后再回插件,点开这条隧道按一下电源,等它转成运行中,详情里那个网址就是在外面用的地址。

怎么用

界面换成中文

用公网地址打开,root 登进去。点「Settings」,把「Default Server Language」改成「简体中文」,界面立刻就全是中文了。

建有声书的媒体库

第一次登录它会让你先建媒体库:点「添加第一个媒体库」,名字随便起,类型保持「图书」,文件夹点「浏览文件夹」选到 /audiobooks(容器里看到的路径),点创建。

🔴 建完它不会自己去扫。要在媒体库列表里点那一行的「扫描」,书才会出来。之后再往这个文件夹里放书,它会自己发现(设置里「自动检测媒体库变化」默认是开着的)。

扫完点进书的详情页,封面、作者、章节表都认好了。点播放,页面底部就是播放器,播放器右边那个列表按钮能看到所有章节,点哪一章就从哪一章开始放。

订阅播客

播客要单独建一个库:同一个对话框,类型选「播客」,文件夹选 /podcasts。

进这个库之后点左边的「添加」,把播客的 RSS 地址贴进去点提交,弹出来的详情里勾上「自动下载剧集」再提交,就订上了。注意「自动下载」只管以后出的新集;想听以前的,在播客页点放大镜「查找剧集」,挑一集下载就行。

在外面接着听

出门在手机浏览器里打开同一个公网网址,登进去,首页「继续收听」里就是刚才那本,点一下就从上次停的地方接着往下放。进度是跟着账号记在服务器上的:连续播放十几秒会同步一次,暂停的时候也会同步。

官方的手机 App 填同一个公网地址也能连上。

几件用之前值得知道的事

它默认不会去网上给你的书找封面和简介(设置里「查找封面」默认关着),书的信息来自文件夹名、音频标签和文件夹里的 cover.jpg、desc.txt 这类文件。

家里多个人用的话,设置里可以给每个人建账号,每个人的收听进度各记各的。

最后提醒一句:root 是这台服务器的管理员,开到公网之前一定先把它的密码设好,而且别用你在别处用过的密码。