搭建RSS信息聚合体系

Entropy Tree Lv4

记录搭建 Miniflux + RSSHub + Wallabag + Fluent Reader 组合构成的一个较为完整的聚合信息管理和阅读体系

Miniflux 和 RSSHub 为服务端提供内容聚合和RSS源生成,Wallabag 允许保存和稍后阅读网页内容,而 Fluent Reader 作为本地客户端,提供丰富的阅读体验。这个体系涵盖了从内容获取、管理到阅读的全过程,为 RSS 阅读用户提供了一套全面的解决方案。

基础环境

本文使用 docker-compose 搭建所有环境,为了避免一些版本不兼容问题,使用以下方式安装 docker-compose

下载最新 release 版本

1
sudo curl -L https://github.com/docker/compose/releases/download/v2.24.6/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose

其中的2.24.6是截至本文更新时间的 docker-compose 最新的 release,后续可以视情况访问 docker compose 官方仓库 获取最新 release 的信息。

赋予可执行权限

1
sudo chmod +x /usr/local/bin/docker-compose

添加环境变量(如果之前没有添加过)

1
echo 'PATH=$PATH:/usr/local/bin/docker-compose' >> ~/.bashrc && source ~/.bashrc

检查 docker-compose 版本

1
docker-compose -v

注意:本文的搭建操作均在 docker-compose 2.24.6 版本下完成,低版本会有兼容性问题,无法直接使用本文的 docker-compose.yaml

RSSHub 订阅源生成

RSSHub 是一个生成订阅源的平台,借助爬虫或类似的技术为那些不提供 RSS 服务的网站生成 RSS 订阅源。

官方示例

可参考官方部署文档,编写以下 docker-compose.yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
version: '3.9'

services:
rsshub:
image: diygod/rsshub:chromium-bundled
restart: always
ports:
- '1200:1200'
environment:
NODE_ENV: production
CACHE_TYPE: redis
REDIS_URL: 'redis://redis:6379/'
PROXY_URI: 'socks5h://warp-socks:9091'
depends_on:
- redis

redis:
image: redis:alpine
restart: always
volumes:
- redis-data:/data

warp-socks:
image: monius/docker-warp-socks:latest
privileged: true
restart: always
volumes:
- /lib/modules:/lib/modules
cap_add:
- NET_ADMIN
- SYS_MODULE
sysctls:
net.ipv6.conf.all.disable_ipv6: 0
net.ipv4.conf.all.src_valid_mark: 1
healthcheck:
test: ["CMD", "curl", "-f", "https://www.cloudflare.com/cdn-cgi/trace"]
interval: 30s
timeout: 10s
retries: 5

volumes:
redis-data:

在对应目录下执行docker-compose up -d运行。启动完成之后可以访问127.0.0.1:1200或服务器 IP + 1200 端口观察能否访问。

精简版

去除了 WARP 服务及相关配置,可能导致无法访问严格反爬的订阅源。该版本的目的是为了尊重目标网站的反爬政策以及遵守相关的互联网规则等。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
version: '3.9'

services:
rsshub:
image: diygod/rsshub:chromium-bundled
restart: always
ports:
- '1200:1200'
environment:
NODE_ENV: production
CACHE_TYPE: redis
REDIS_URL: 'redis://redis:6379/'
depends_on:
- redis

redis:
image: redis:alpine
restart: always
volumes:
- redis-data:/data

volumes:
redis-data:

如果自建的 rsshub 仅供个人使用也可以不对外开放端口,在 miniflux 中直接使用容器的 ip + port 即可,例如172.17.0.1:1200

Miniflux 内容聚合

Miniflux 是一个 RSS 订阅管理的服务端,可以方便地添加、管理各种 RSS 订阅,同时也可以作为一个网页版的 RSS 阅读器使用。此外,Miniflux 还提供了跨平台客户端软件订阅同步的服务。

官方示例

官方文档的基础示例如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
services:
miniflux:
image: miniflux/miniflux:latest
ports:
- "80:8080"
depends_on:
db:
condition: service_healthy
environment:
- DATABASE_URL=postgres://miniflux:secret@db/miniflux?sslmode=disable
- RUN_MIGRATIONS=1
- CREATE_ADMIN=1
- ADMIN_USERNAME=admin
- ADMIN_PASSWORD=test123
db:
image: postgres:15
environment:
- POSTGRES_USER=miniflux
- POSTGRES_PASSWORD=secret
- POSTGRES_DB=miniflux
volumes:
- miniflux-db:/var/lib/postgresql/data
healthcheck:
test: ["CMD", "pg_isready", "-U", "miniflux"]
interval: 10s
start_period: 30s
volumes:
miniflux-db:

配置完成后,在对应目录下执行docker-compose up -d运行。

修改版

以下是笔者使用的参考自完整的 RSS 解决方案:自建 RSSHub 与 Miniflux 一文的 docker-compose.yaml 配置,修改了映射端口和增加了一些可选配置,其中的默认用户名和密码由自己设定,最好在第一次登录后立即修改

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
version: '3.9'

services:
miniflux:
image: miniflux/miniflux:latest
restart: always
ports:
- "8080:8080"
depends_on:
db:
condition: service_healthy
environment:
- DATABASE_URL=postgres://miniflux:secret@db/miniflux?sslmode=disable
- RUN_MIGRATIONS=1
- FETCH_YOUTUBE_WATCH_TIME=1
- CREATE_ADMIN=1
- ADMIN_USERNAME=admin
- ADMIN_PASSWORD=test123
- BASE_URL=http://127.0.0.1:8080 # miniflux 的域名
- POLLING_FREQUENCY=60 # 每个 feed 的刷新间隔
- POLLING_PARSING_ERROR_LIMIT=0 # 拉取出错后不会停止拉去,还是会按计划继续拉
- BATCH_SIZE=100 # 每次拉取的 feed 数量
- POLLING_SCHEDULER=entry_frequency # 拉取类型,根据上周的平均更新周期来拉取
- SCHEDULER_ENTRY_FREQUENCY_MAX_INTERVAL=30
- PROXY_OPTION=all # 图片代理功能,Miniflux 先把源端的图片缓存到服务器上来,后续就不用客户端去源服务器拉了
- PROXY_PRIVATE_KEY=password # 使用客户端缓存过文章,然后某个时间重启了 docker 实例,那么会导致图片无法显示的情况,这是因为每次重启会随机生成 PROXY_PRIVATE_KEY,所以可以增加参数 PROXY_PRIVATE_KEY 固化 key ,便于解决更新、重启等场景下的图片显示问题。
- DATABASE_MAX_CONNS=50 # 增加数据库连接数,对于多图片的 feed 非常有效,可以大幅提升加载和访问速度
- DATABASE_MIN_CONNS=5 # 同上
- WORKER_POOL_SIZE=10 # 默认,或适当加大
db:
image: postgres:15
restart: always
environment:
- POSTGRES_USER=miniflux
- POSTGRES_PASSWORD=secret
- POSTGRES_DB=miniflux
volumes:
- miniflux-db:/var/lib/postgresql/data
healthcheck:
test: ["CMD", "pg_isready", "-U", "miniflux"]
interval: 10s
start_period: 30s
volumes:
miniflux-db:

更多配置参数可以参考官方文档 。启动完成之后可以访问127.0.0.1:8080或服务器 IP + 8080 端口,也可以使用反向代理服务配置一个域名访问。

注意:如果后续需要在多个客户端使用 miniflux 的服务进行同步,则BASE_URL项一定要配置一个互联网可访问的地址。除非你所有的客户端与服务端都处于同一个局域网中,则可以配置一个局域网的地址。

基本操作

登录之后,Miniflux 的默认页面是这样的

先修改用户名和密码,在 Settings 中设置即可。

添加订阅源,例如 RSSHub 文档中提供了 Bing Daily Wallpaper 的路由为/bing,假设本地自建的 RSSHub 地址为172.17.0.1:1200,则订阅源为http://172.17.0.1:1200/bing

添加完成后就能在主页看到订阅信息

这样就完成了基本的订阅,可以查看订阅信息。更多的操作可以自行探索。

补充

除了 Miniflux 以外还有Tiny Tiny RSS (ttrss) FreshRSS 等 RSS 订阅管理服务端,Miniflux 是极简风格,如果想尝试更多增强配置,可以考虑使用其它的服务端。以下是一些相关的参考资料:

Wallabag 稍后阅读

Wallabag 作为一个辅助工具可以和 Miniflux 集成使用,提供更好的使用体验。

官方示例

参考官方仓库 的文档,一份示例的 docker-compose.yaml 配置如下,关于每个配置项的说明可以参考docker hub 仓库 的文档。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
version: '3'
services:
wallabag:
image: wallabag/wallabag
environment:
- MYSQL_ROOT_PASSWORD=wallaroot
- SYMFONY__ENV__DATABASE_DRIVER=pdo_mysql
- SYMFONY__ENV__DATABASE_HOST=db
- SYMFONY__ENV__DATABASE_PORT=3306
- SYMFONY__ENV__DATABASE_NAME=wallabag
- SYMFONY__ENV__DATABASE_USER=wallabag
- SYMFONY__ENV__DATABASE_PASSWORD=wallapass
- SYMFONY__ENV__DATABASE_CHARSET=utf8mb4
- SYMFONY__ENV__DATABASE_TABLE_PREFIX="wallabag_"
- SYMFONY__ENV__MAILER_DSN=smtp://127.0.0.1
- SYMFONY__ENV__FROM_EMAIL=wallabag@example.com
- SYMFONY__ENV__DOMAIN_NAME=https://your-wallabag-instance.wallabag.org
- SYMFONY__ENV__SERVER_NAME="Your wallabag instance"
ports:
- "80"
volumes:
- /opt/wallabag/images:/var/www/wallabag/web/assets/images
healthcheck:
test: ["CMD", "wget" ,"--no-verbose", "--tries=1", "--spider", "http://localhost"]
interval: 1m
timeout: 3s
depends_on:
- db
- redis
db:
image: mariadb
environment:
- MYSQL_ROOT_PASSWORD=wallaroot
volumes:
- /opt/wallabag/data:/var/lib/mysql
healthcheck:
test: ["CMD", "mysqladmin" ,"ping", "-h", "localhost"]
interval: 20s
timeout: 3s
redis:
image: redis:alpine
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 20s
timeout: 3s

配置完成后,在对应目录下执行docker-compose up -d运行。

修改版

以下是参考自Docker系列 Wallabag助力个性化网页RSS化 的配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
version: '3'
services:
wallabag:
image: wallabag/wallabag
restart: always
environment:
- MYSQL_ROOT_PASSWORD=wallaroot # 自行设置密码
- SYMFONY__ENV__DATABASE_DRIVER=pdo_mysql
- SYMFONY__ENV__DATABASE_HOST=db
- SYMFONY__ENV__DATABASE_PORT=3306
- SYMFONY__ENV__DATABASE_NAME=wallabag
- SYMFONY__ENV__DATABASE_USER=wallabag
- SYMFONY__ENV__DATABASE_PASSWORD=wallapass # 自行设置密码
- SYMFONY__ENV__DATABASE_CHARSET=utf8mb4
- SYMFONY__ENV__DATABASE_TABLE_PREFIX="wallabag_"
- SYMFONY__ENV__MAILER_DSN=smtp://127.0.0.1
- SYMFONY__ENV__FROM_EMAIL=example@example.com # 自行设置邮箱
- SYMFONY__ENV__DOMAIN_NAME=http://127.0.0.1:8888 # 自定义域名
- SYMFONY__ENV__SERVER_NAME="wallabag service" # 服务名称
ports:
- "8888:80"
volumes:
- ./images:/var/www/wallabag/web/assets/images
healthcheck:
test: ["CMD", "wget" ,"--no-verbose", "--tries=1", "--spider", "http://localhost"]
interval: 1m
timeout: 3s
depends_on:
- db
- redis
db:
image: mariadb
restart: always
environment:
- MYSQL_ROOT_PASSWORD=wallaroot # 这里对应前面同名环境变量的密码
volumes:
- ./data:/var/lib/mysql
healthcheck:
test: ["CMD", "mysqladmin" ,"ping", "-h", "localhost"]
interval: 20s
timeout: 3s
redis:
image: redis:alpine
restart: always
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 20s
timeout: 3s

配置完成后,在对应目录下执行docker-compose up -d运行。启动完成之后可以访问127.0.0.1:8888或服务器 IP + 8888 端口,也可以使用反向代理服务配置一个域名访问。

注意:wallabag 服务的启动需要一些时间,一开始可能还不能直接访问成功,建议等待几分钟后再尝试访问。

postgres 版本

这里额外提供一份以postgresql作为数据库的配置,用于替换mariadb以支持一些mariadb不支持的系统架构,例如linux/arm/v7架构。如果遇到架构不支持的问题,请尝试以下配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
version: '3'
services:
wallabag:
image: wallabag/wallabag
restart: always
environment:
- POSTGRES_PASSWORD=wallaroot # 自行设置密码
- POSTGRES_USER=wallabag_admin # 自行设置用户名
- SYMFONY__ENV__DATABASE_DRIVER=pdo_pgsql # 适用于 pgsql 的驱动
- SYMFONY__ENV__DATABASE_HOST=db
- SYMFONY__ENV__DATABASE_PORT=5432 # pgsql 的默认端口
- SYMFONY__ENV__DATABASE_NAME=wallabag
- SYMFONY__ENV__DATABASE_USER=wallabag
- SYMFONY__ENV__DATABASE_PASSWORD=wallapass # 自行设置密码
- SYMFONY__ENV__DATABASE_TABLE_PREFIX="wallabag_"
- SYMFONY__ENV__MAILER_DSN=smtp://127.0.0.1
- SYMFONY__ENV__FROM_EMAIL=example@example.com # 自行设置邮箱
- SYMFONY__ENV__DOMAIN_NAME=http://127.0.0.1:8888 # 自定义域名
- SYMFONY__ENV__SERVER_NAME="wallabag service" # 服务名称
ports:
- "8888:80"
volumes:
- ./images:/var/www/wallabag/web/assets/images
healthcheck:
test: ["CMD", "wget" ,"--no-verbose", "--tries=1", "--spider", "http://localhost"]
interval: 1m
timeout: 3s
depends_on:
- db
- redis
db:
image: postgres:9.6
restart: always
environment:
- POSTGRES_PASSWORD=wallaroot # 这里对应前面同名环境变量的密码
- POSTGRES_USER=wallabag_admin # 这里对应前面同名环境变量的用户名
volumes:
- ./data:/var/lib/mysql
healthcheck:
test: ["CMD", "mysqladmin" ,"ping", "-h", "localhost"]
interval: 20s
timeout: 3s
redis:
image: redis:alpine
restart: always
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 20s
timeout: 3s

基础服务配置

默认的用户名和密码都是wallabag(这个在 docker hub 文档中有说明)

登录之后,先去 Config 中修改 PASSWORD,修改完成后再进行 API 服务的配置。

创建 API 服务

创建一个新的客户端,取一个名称,然后创建即可。

image-20240302185856950

创建完客户端之后就会提供客户端 ID 和密钥,此时不要直接刷新网页避免重置 ID 和密钥。

配置插件

访问对应浏览器的插件商店,下载同名的 wallabag 插件进行配置,配置说明如下

image-20240302191015666

填写完成后获取 token 即可使用。

基础使用

在任意的网页上右键,可以看到 wallabag 的选项,点击之后就会保存当前网页到 wallabage 后台。

如果浏览器隐藏了插件图标,建议将 wallabag 插件图标显示在浏览器上,方便观察状态。

另外,有些网站无法使用 wallabag 保存,可能是采取了严格的反爬手段。

Miniflux 集成 Wallabag

在 Wallabag 后台 Config 的 FEEDS 里面进行设置

image-20240302192701866

生成完 token 后,下面会提供 4 个订阅链接,初始的选项是未读、收藏、归档、全部,按需选择其中几个订阅导入 Miniflux 即可。后面的订阅包含最大项目数按需配置即可。

配置完成后保存。

后续对于需要稍后阅读的网页,可以采取 wallabag 保存到后台并生成 RSS 订阅源,由 miniflux 同步 wallabag RSS 订阅源的方式来阅读网页信息。不需要在后台持续挂着网页,并且能很方便地跨平台同步。

补充

关于 miniflux 和 wallabag 的集成其实有两种方式:一种就是使用自建的 wallabag 服务和浏览器插件,然后将订阅源导入 miniflux (也就是前面介绍的方式);另一种方式是在 miniflux 中直接配置 wallabag,这种配置主要用于实现 miniflux 的离线保存,不过这种方式可能使用得相对较少,大部分用户基本不需要考虑这种方式,简单了解即可。有离线阅读需求的用户可以考虑另一种方案

根据笔者的个人使用体验,wallabag 的导出功能对于某些格式存在乱码的问题,目前也没有解决方案,参考了网上的一些教程似乎也没有提到这一点,因此可以推断 wallabag 的导出功能几乎没什么使用需求。

下面这部分内容感兴趣的可以看看,不感兴趣的可以直接转到另一种方案

使用 Wallabag 服务和浏览器插件,然后将订阅源导入 Miniflux

这种方法涉及到在 wallabag 和 miniflux 之间手动创建一个连接,具体步骤如下:

  1. wallabag 服务和浏览器插件:通过 wallabag 的浏览器插件,用户可以快速保存他们想要稍后阅读的网页到 wallabag 服务中。
  2. 生成订阅源:wallabag 允许用户生成一个 RSS 订阅源,这个源包含了所有保存在 wallabag 中的文章。
  3. 导入 miniflux:将 wallabag 生成的 RSS 订阅源导入到 miniflux 中,这样就可以在 miniflux 中阅读通过 wallabag 保存的文章了。

优点:这种方式允许用户在 miniflux 中阅读通过 wallabag 保存的文章,同时保持了两个应用的独立性。用户可以利用 wallabag 强大的保存和离线阅读功能,以及 miniflux 高效的 RSS 订阅管理能力。

缺点:需要手动设置和维护两个应用之间的连接,这可能对一些用户来说稍显复杂。

在 Miniflux 中直接配置 Wallabag

miniflux 提供了一个内置的功能,允许用户直接在 miniflux 的设置中配置 wallabag,具体步骤如下:

  1. 配置 wallabag:在 miniflux 的设置中填写 wallabag 的服务地址和用户认证信息。

    这一步填写的信息其实和在浏览器插件配置时填写的信息基本一致。不过这里不需要使用浏览器插件。

  2. 一键保存:阅读 RSS 订阅时,用户可以通过一键操作将感兴趣的文章保存到 wallabag 中,无需离开 miniflux。

优点:这种方式提供了一个更为紧密的集成,使用户在使用 miniflux 阅读 RSS 订阅的同时,轻松地将文章保存到 wallabag。操作更为便捷,用户体验更佳。

缺点:这种方式主要是将文章从 miniflux 保存到 wallabag,而不是在 miniflux 中阅读 wallabag 的内容。如果用户想要在 miniflux 中阅读通过 wallabag 保存的文章,这种方式不适用。

总结

选择哪种方式取决于你的具体需求:

  • 如果你希望在 miniflux 中阅读通过 wallabag 保存的文章,可以考虑第一种方法。
  • 如果你主要使用 miniflux 阅读 RSS 订阅,并希望有一个快速方便的方式将文章保存到 wallabag 以供离线阅读,那么直接在 miniflux 中配置 wallabag 可能是更好的选择。

当然其实也可以考虑同时使用这两种方式,但是需要明确需求以达成最佳的工具组合,让每一个工具专一地负责某一个具体需求,否则会有功能重叠以及增加不必要的管理工作量。以下是一些参考的思路和做法:

wallabag 的最主要的功能是可以快速地保存当前网页内容(如果网页不限制 wallabag )并且能在离线模式下阅读网页。因此,wallabag 可以负责以下几个需求:

  • 专门保存一些你感兴趣的但是并没有专门提供 RSS 订阅的网页或者是没有收录在 RSSHub 的小众网页,然后提供订阅源给 miniflux 使用。
  • 导出你需要进一步阅读或者是需要供以后参考的内容。

miniflux 的目的很简单,主要就是管理订阅源以及多平台同步。

关于 miniflux 中的订阅信息如果需要离线阅读,可以考虑以下几种方案:

  • 配置 miniflux 内置的 wallabag 集成,之后可以将感兴趣的订阅信息保存到 wallabag 中 (如果配置了 wallabag,会在订阅的位置显示“保存”的选项)。
  • 使用本地客户端,本地客户端提供了一定的离线阅读功能。

关于大量订阅信息内容的整理和分类,可以由 miniflux 集中管理,wallabag 负责快速生成一个“稍后阅读”的 RSS 源,然后在 miniflux 中对这个 RSS 源再进行具体的整理和分类。如果遇到希望离线保存的信息,则在 wallabag 中进行导出。

另一种方案

使用simpread (一个浏览器插件)提供的网页导出功能来实现离线阅读的需求,不过这个插件本身需要一定学习成本,可以根据需求专门学习其中的几个功能。

这样就有一套明确的工作流:使用 RSSHub 生成一些知名网站的 RSS 源,借助 Wallabag 收藏一些没有 RSS 源提供的网页,两者组合提供较为丰富的 RSS 订阅源;使用 Miniflux 集中管理来自 RSSHub 和 Wallabag 的 RSS 订阅源,借助 simpread 插件保存 Miniflux 中的一些网页到本地以供离线阅读。

Fluent Reader 本地客户端

fluent-reader 是一个跨平台的 PC 客户端,可以使用 miniflux 的服务提供更好的客户端阅读体验。

对于移动设备,可以使用同样是由 fluent-reader 开发团队开发的fluent-reader-lite

Miniflux 配置 API

先确保前面的BASE_URL项配置的是一个互联网可访问的地址,否则无法使用 miniflux 服务,除非 miniflux 和客户端处于同一个局域网中。

在 miniflux 的 Settings 里面配置 API 密钥,在 API 密钥管理页面中已经包含了所有 fluent-reader 需要配置的信息。

Fluent Reader 启用 Miniflux 服务

在 fluent-reader 的“设置”——”服务“中可以看到 miniflux 服务的选项,选择后会进入 miniflux 服务的配置,对照前面 miniflux 的 API 密钥管理页面中的信息,将配置项填写完后确认即可。

更新订阅源可能需要一定的时间,建议在使用 miniflux 服务更新订阅之前,先将 fluent-reader 中原来的订阅导出一份备份文件到本地。

参考资料

部署 | RSSHub

Miniflux 官网

2023 年,我为什么选择 Miniflux 作为 RSS 主力工具

完整的 RSS 解决方案:自建 RSSHub 与 Miniflux

Docker系列 Wallabag助力个性化网页RSS化

Docker系列 安装个人RSS服务TTRSS 手机完美适配

重新捡起 RSS:RSSHub + FreshRSS 建立我的信息流

  • 标题: 搭建RSS信息聚合体系
  • 作者: Entropy Tree
  • 创建于 : 2024-03-02 20:21:46
  • 更新于 : 2024-03-03 19:31:59
  • 链接: https://www.entropy-tree.top/2024/03/02/rss-workflow/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论