去年11 月我介绍了 如何使用 Airsonic 来实现打造基于私有云的跨平台播客订阅服务,但在近大半年的持续使用过程中我逐步发现了这个方案的不足之处:

  • AirSonic 不支持同步播客进度:AirSonic 并不支持将不同端的播客播放进度进行同步,他更多的像是一个媒体服务器,通过订阅规则将播客节目下载下来,然后各个客户端登录服务器再下载到本地。
  • 相对播客这个需求,AirSonic 并不完善:一个比较明显的痛点就是 AirSonic 只支持导入订阅不支持导出订阅,管理播客订阅也非常繁琐,所以严格来说它并非是一个「泛用性的播客客户端」。
  • AirSonic 占用系统资源:虽然 AirSonic 可以通过 Tomcat 运行,但是群晖并不支持,因此运行必须基于 Docker,经常会占用至少 1GB 的运存,这对于一个播客订阅服务而言显然有些「过重」了。

综上所述,我开始寻找新的支持自部署的跨平台同步播客服务,最后进入我视野的是国人开发的 MoonFM——一款跨平台的「泛用性播客客户端」,相比 AirSonic 中播客只是「附带功能」,MoonFM 非常纯粹(听播客),支持添加单个的 RSS 地址以及订阅源导入,当然也支持订阅源的批量导出,更重要的是支持「自建同步」功能:同步的数据主要是播放的历史记录、订阅源列表、播放列表以及收藏,这基本上完美的解决了我的同步需求,因为我之所以希望将播客服务部署在私有云中,就是希望这些有关个人播客订阅数据是可以自己掌握的。

此前少数派作者 Lifesign 就在其 使用 IBM Cloudant 多端同步 MoonFM 数据 介绍了如何部署公有云服务来实现 MoonFM 的多端播客数据同步,但由于采用了免费的 IBM 云服务套餐使得同步上存在比较大的限制,那么有没有办法可以通过家中的 NAS 来实现 MoonFM 的多端播客数据同步呢?

使用群晖 Docker 安装同步数据库 Apache Couchdb

依据 MoonFM 帮助支持文档的描述,其同步服务需要使用的是 Apache Couchdb 这一款 NoSQL 文档数据库,而在群晖的套件中心并没有对应的套件可以直接安装,因此这里就只能使用 Docker 来进行部署。

首先打开群晖的 Docker,然后在注册表中搜索「Couchdb」并选择第一个镜像「Couchdb」,点击右键下载镜像,这里 Couchdb 版本选择 latest 即可。

下载完成之后,在「映像」中找到刚刚下载好的「Couchdb」镜像,双击制作对应的容器,名称其实随便填写,然后打开「高级设置」。

在「高级设置」里面切换到「端口设置」选项卡,这里「本地端口」需要更改和「容器端口」一致。

最后是最为关键的「环境」,Apache Couchdb 3.0 以后针对数据库服务启动有一定的要求,必须使用数据库管理员账户才能正常启动,所以我们需要添加对应账户才行,这里点击新增,添加分别添加两个可变量,一个是数据库管理员账户名:COUCHDB_USER,对应的值就是admin;另一个是数据库管理密码COUCHDB_PASSWORD,这里我图省事,还是用admin,你也可以根据你的需要设置复杂密码,设置完成之后一路下一步直接运行容器。这样 Apache Couchdb 就基本上算是在群晖上跑起来了。

配置 Apache Couchdb

容器运行起来之后,我们需要做的就是访问数据库,Apache Couchdb 提供了一个 Web GUI 方便我们访问。比如你局域网中的群晖的 IP 地址是:

http://192.168.1.2

那么 Apache Couchdb 数据库的 web 端访问路径就是:

http://192.168.1.2:5984/_utils.

使用之前设置的数据库管理员的用户名和密码登录数据库,之后在 Couchdb 的网页管理端找到左边的侧边栏的第二个项目「Setup」来完成数据库基本设置,系统会在这里首先询问是设置成集群还是配置单个节点,这里选择右边的单个节点。

后面的操作就非常简单了,最上面的用户名和密码都和刚才设置保持一致,最后点击下面的「Configure Node」完成设置。

接下来我们需要改动一个配置,在侧边栏的「Configuration」中的「Main Config」中找到 Sectioncouch_peruser 的项目,然后将 enable 后面的 false 改成 true,这里鼠标单击对应值就可以进行编辑并点击确认。至此在 Couchdb 的网页端操作的内容就结束了。

在 Apache Couchdb 中创建 _users 数据库

下面我们只需要打开电脑上的终端,输入下面命令来创建一个用户数据库 _users

curl -X PUT http://admin:admin@192.168.1.2:5984/_users \
     -H "Accept: application/json" \
     -H "Content-Type: application/json" \

这时候你回到网页端打开 Couchdb 的网页管理端,在第一项「Databases」里面会看到第一个 Name 为 _users的数据库,那么刚才的操作就已经成功。

接下来我们需要创建一个用来同步数据的用户账户,这里我创建一个名为 liuxf 密码为 bba 的用户(你可以根据自己的需求自行定义,对应的需要替换下面配置命令中对应的值),同样还是通过终端来创建:

curl -X PUT http://admin:admin@192.168.1.2:5984/_users/org.couchdb.user:liuxf \
     -H "Accept: application/json" \
     -H "Content-Type: application/json" \
     -d '{"name": "liuxf", "password": "bba", "roles": [], "type": "user"}'

同样的操作再回到 Couchdb 的网页管理端,这时你会发现 Databases 里面会多出来一个前缀为 userdb- xxxxx 的新数据库(xxxxx为用户名的 hex 字符串),至此我们已经完成了数据库以及同步账户的创建,这个同步的地址就是:

http://liuxf:bba@192.168.1.2:5984/userdb-xxxxxx

通过 DDNS 或者 内网穿透暴露数据库地址

生成的同步地址只能在局域网中使用,显然我们还需要将这个地址暴露到公网中,这里可以使用的方法包括 DDNS 以及内网穿透,我这里使用比较便捷的 FRP 内网穿透来实现。

首先在群晖里将当前正在运行的 FRP 容器停掉,然后在文件管理器中找到并编辑 frpc.ini,在下面添加一段 TCP 穿透配置:

[moonfm] type = tcp 
local_ip = 127.0.0.1 
local_port = 5984 
remote_port = 5984

保存文件后,重新启动 Frpc 容器。这里需要在对应的公网服务器上做对应的防火墙端口放行,同时我们需要将此前同步的地址中内网的群晖 IP 修改为对应的公网 IP 地址,假设公网的 IP 是 1.2.3.4,那么新的同步地址就是:

http://liuxf:bba@1.2.3.4:5984/userdb-xxxxxx

在 MoonFM 中设置同步服务

接下来我们打开 MoonFM 的桌面端,为了避免出现订阅源同步错误,建议先只在一个端来导入和管理订阅源再通过同步的形式同步到其他端。

 

在桌面端完成订阅源管理之后,打开「设置」-「同步设置」,将刚才我们设置好的同步地址http://liuxf:bba@1.2.3.4:5984/userdb-xxxxxx 复制到文本框中并点击好保存,如果一切设置正常,当前桌面端的相关播客订阅源、历史记录等数据都会被记录到群晖上部署的数据库中了。

这时再打开移动端的 MoonFM,在「我的」-「同步设置」里面将同步的地址也复制过去,点击 Auto Sync 完成同步。

同步完成之后,再移动端首页的「历史记录」里面就会出现之前在桌面端的播放记录,这样我们就成功实现了使用 NAS 多端同步 MoonFM 播客订阅数据,如果你也有类似的需求不妨一试。

参考: