当前各大内容平台的推荐算法可以根据我们的浏览历史贴心地推荐内容,怎一个爽字了得。但爽这件事最终还要靠自己,毕竟爽不爽只有自知。我们可以学习那些高级推荐算法的思想,本着“自己的信息茧房可以从砖块开始垒就不麻烦他人”的朴素思想,返璞归真,用 RSS 和人力一砖一瓦造起来。

RSS 由 RSS Advisory Board 发布,是一种聚合网页内容的格式,全称是“很简单的聚合”(Really Simple Syndication)。RSS 是 XML 的一种方言,所有 RSS 文件必须遵循 XML 1.0 规范。截至 2021 年 11 月 4 日,RSS 的最新版是 2.0.11,具体语法可以参考 RSS 规范RSS 2.0 样例文件

我们把感兴趣的的网站按照 RSS 格式逐个做成 RSS 订阅源,这样能确保每个网站都是自己主动添加的,为自己的选择负责,避免了本意是只取一瓢却被若水三千呼一脸的狼狈。

主流的 RSS 服务商我们是不会选的,而是要搭建一个自托管的 RSS 服务,由它负责自动去抓取我们的订阅源中更新的内容并推送过来,这样一来我们就可以在 RSS 客户端查看到这些内容了。

部署 Tiny Tiny RSS

搭建 RSS 服务需要有一台能方便地使用到且能联互联网的私人电脑。接下去的操作在一台 VPS(虚拟专用服务器)上执行,基于 Awesome TTRSS 开源项目进行搭建,以 Docker 容器的形式部署。
Tiny Tiny RSS 是一款免费开源的 RSS 聚合聚合器/阅读器,Awesome TTRSS 是对 Tiny Tiny RSS 的容器化封装。

准备条件

VPS 用的是 1 核、1G 内存的 云服务器

cat /etc/redhat-release
# CentOS Linux release 7.6.1810 (Core)
uname -a
# Linux VM-0-11-centos 4.14.129-bbrplus #1 SMP Tue Jun 25 12:23:41 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux

Docker( 安装 ):

docker version
# Client: Docker Engine - Community
#  Version:           20.10.10
#  API version:       1.41
#  OS/Arch:           linux/amd64

# Server: Docker Engine - Community
#  Engine:
#   Version:          20.10.10
#   API version:      1.41 (minimum version 1.12)
#   OS/Arch:          linux/amd64
#  containerd:
#   Version:          1.4.11
#  runc:
#   Version:          1.0.2
#  docker-init:
#   Version:          0.19.0

Docker Compose( 安装 ):

docker-compose --version
# docker-compose version 1.29.2, build 5becea4c

通过 docker-compose 部署

  1. 下载配置模板 docker-compose.yml 至 VPS 任意目录;

  2. 编辑配置;

    version: "3"
    services:
      service.rss:
        image: wangqiru/ttrss:latest
        container_name: ttrss
        ports:
          # 此处对外暴露的端口是 181,要和 `SELF_URL_PATH` 中的端口保持一致;
          # 注意 VPS 要开放 181 端口的入访流量;
          # VPS 上执行 `nc -l -p 181` 启动对 181 端口监听,其它机器执行 `nc -v your_public_ip 181` 快速验证 181 端口是否开放成功。
          - 181:80 
        environment:
          - SELF_URL_PATH=http://your_public_ip:181/ # 该变量值必须与你在浏览器中用于访问 TTRSS 的 URL 保持完全一致,否则 TTRSS 将无法启动
          - DB_PASS=set_database_password # 要和下面 `database.postgres` 服务中的 `POSTGRES_PASSWORD` 的值相同
          - PUID=1000
          - PGID=1000
        volumes:
          - feed-icons:/var/www/feed-icons/
        networks:
          - public_access
          - service_only
          - database_only
        stdin_open: true
        tty: true
        restart: always
    
      service.mercury: # set Mercury Parser API endpoint to `service.mercury:3000` on TTRSS plugin setting page
        image: wangqiru/mercury-parser-api:latest
        container_name: mercury
        networks:
          - public_access
          - service_only
        restart: always
    
      service.opencc: # set OpenCC API endpoint to `service.opencc:3000` on TTRSS plugin setting page
        image: wangqiru/opencc-api-server:latest
        container_name: opencc
        environment:
          - NODE_ENV=production
        networks:
          - service_only
        restart: always
    
      database.postgres:
        image: postgres:13-alpine
        container_name: postgres
        environment:
          - POSTGRES_PASSWORD=set_database_password
        volumes:
          - ~/postgres/data/:/var/lib/postgresql/data # 设置 postgres 数据库数据的持久化目录
        networks:
          - database_only
        restart: always
    
    volumes:
      feed-icons:
    
    networks:
      public_access: # Provide the access for ttrss UI
      service_only: # Provide the communication network between services only
        internal: true
      database_only: # Provide the communication between ttrss and database only
        internal: true
    
    • service.rss 是 RSS 服务的配置;
    • 因为 RSS 会分走主战流量,有些网站提供的 RSS 源并不会提供内容全文。 Mercury 就是用于获取全文的插件,service.mercury 的配置是该插件的配置;
    • service.opencc 是提供中文繁简体转换功能的插件的配置;
    • database.postgres 是支撑 RSS 服务的数据库的配置;
  3. docker-compose.yml 所在的目录执行 docker-compose up -d 启动 RSS 后台服务;

    • 这种方式启动的 TTRSS 容器提供 RSS 服务并未开启 TLS 通信。
  4. 通过配置的端口访问 TTRSS 前端页面(网址是 SELF_URL_PATH 里配置的地址,默认账户 admin、密码 password,及时更改),配置自己感兴趣的 RSS 源。

以上的部署步骤整理自 官方文档 ,插件、HTTPS 等其它配置请参考该文档。

经过以上步骤,我们就得到了一个可用的 RSS 服务,并且可以通过浏览器访问订阅的内容,信息茧房毛坯宣告建成。

使用

获取 RSS 源

部署完 RSS 服务后,对于提供 RSS 订阅源的网站可以直接将源地址复制过来进行配置,没有提供 RSS 源的网站可以借助 RSSHub 这一开源的 RSS 生成器生成 RSS 订阅源。

RSS 客户端

要让第三方 RSS 客户端才可以访问我们搭建的 RSS 服务,我们需要在 RSS 前端页面的配置里勾选 “Enable API: Allows accessing this account through the API”。

Awesome TTRSS 自带了插件 Fever,TTRSS 用它来模拟另一个 RSS 聚合器 Fever ,这样一来支持 TTRSS 服务的客户端就更多了。我们需要为 Fever 插件设置独立的密码,同时 Fever API 的地址也是独立的,格式是 http://${VPS_IP}:${PORT}/plugins/fever/
注意 Fever 插件配置里的给出的 API 地址的一级目录是 plugins.local,实测无法登陆成功,要把 .local 去掉。

iOS 上我选择的 RSS 客户端是 Reeder 5 ,初步打算主要用它来浏览资讯,硬核的文章收到推送后到电脑上阅读。

部署 FreshRSS

到最后配置手机的 RSS 客户端时,我才注意到 Reeder 5 提示不建议使用 Fever 作为自托管的服务。收拾情绪,又选了 FreshRSS 部署,选它的原因是因为它是 Reeder 5 自托管服务列表上的第一个。

一键 docker run 第二套毛坯就平地起了,访问地址是 http://${VPS_IP}:${EXPOSED_PORT}

docker run -d --restart unless-stopped --log-opt max-size=10m \
  -v freshrss-data:/var/www/FreshRSS/data \
  -v freshrss-extensions:/var/www/FreshRSS/extensions \
  -e 'CRON_MIN=4,34' \
  -e TZ=Asia/Shanghai \
  --net freshrss-network \
  -p 18181:80 \ # 暴露出端口 18181 供外部访问
  --name freshrss freshrss/freshrss

FreshRSS 的 API 密码在“配置-用户账户-API 管理”下,设置好后将用户名、密码和 API 地址配到 Reed 5 即可。

References