RSS阅读器在信息过载时代重新获得了关注。它不依赖平台算法,不插入信息流广告,也不要求用户把阅读数据交给第三方。对于希望完全掌控订阅源、阅读进度和归档策略的人来说,自托管一个开源RSS服务是相对稳妥的选择。不过开源项目之间的差异很大,有的追求功能全面,有的坚守极简,有的强调API可扩展性。选错方向容易在后期迁移时浪费精力,所以有必要先理清几款主流方案的定位。

选型时最容易忽略的三个维度
很多人在比较开源RSS项目时只关心界面好不好看,这其实不够。长期使用下来,资源占用、更新频率和迁移成本才是决定体验的关键。以资源占用为例,FreshRSS用PHP编写,配合SQLite可以跑在512MB内存的VPS上,而Tiny Tiny RSS虽然功能更强,但依赖PostgreSQL和常驻进程,对低配机器不太友好。如果只是个人使用,优先看单用户场景下的内存曲线,而不是官方推荐配置。
更新频率同样重要。有些项目功能丰富但维护节奏不稳定,遇到安全漏洞时可能迟迟没有修复。FreshRSS和Miniflux都保持较高的发布频率,社区响应也较快。Tiny Tiny RSS的开发历史很长,但版本管理方式偏传统,更依赖管理员手动跟进。NewsBlur虽然开源,但核心代码与托管服务绑定较深,自建部署时可能需要额外处理队列和缓存组件。迁移成本则体现在订阅源导出、已读状态同步和过滤规则迁移,如果项目本身支持OPML导入导出以及API,后期切换会轻松很多。
五款值得部署的开源RSS项目解析
以下五个项目覆盖了不同使用风格。个人用户不必全部尝试,先根据自己是否需要多用户、是否依赖键盘操作、是否希望有社区功能来做减法。
FreshRSS:资源友好的全能选手
FreshRSS是自托管RSS领域使用最广的方案之一。它基于PHP开发,支持MySQL、PostgreSQL和SQLite,部署门槛很低。对个人用户来说,SQLite模式几乎不需要额外维护数据库,备份时只要拷贝数据目录即可。FreshRSS的界面可以切换为传统三栏、两栏或适合移动端的响应式布局,也支持暗色主题和自定义CSS。
FreshRSS的过滤功能比较完善,可以按关键词、标签、来源进行自动标记、隐藏或加星。它还内置了WebSub支持,订阅支持该协议的源时能获得接近实时的更新。对于喜欢在手机上阅读的用户,FreshRSS提供了Google Reader API和Fever API兼容层,可以配合Reeder、NetNewsWire等客户端使用。
version: '3'
services:
freshrss:
image: freshrss/freshrss:latest
container_name: freshrss
ports:
- "8080:80"
volumes:
- ./data:/var/www/FreshRSS/data
environment:
- TZ=Asia/Shanghai
- CRON_MIN=*/20
restart: unless-stopped
上面的compose文件适合快速验证,生产环境建议放在反向代理后面并启用HTTPS。如果使用SQLite,不需要额外数据库容器,数据会保存在挂载目录中。FreshRSS还支持扩展插件,社区提供的插件可以抓取全文、过滤广告、推送到Telegram等。
Miniflux:极简主义与API优先
Miniflux用Go语言编写,以单二进制文件形式发布,资源占用极低。它的界面刻意保持简单,没有复杂的分组和社交功能,但提供了完整的REST API,适合喜欢用脚本处理订阅数据的用户。Miniflux只支持PostgreSQL,如果你不想维护数据库,可以使用官方提供的Docker Compose一键启动。
Miniflux的阅读体验偏向键盘操作,常用快捷键包括j和k切换条目,m标记已读,s保存,f收藏。虽然界面朴素,但可读性很好,在手机浏览器上也能获得不错的表现。它还支持自定义抓取规则,可以针对特定网站补充正文提取逻辑。与FreshRSS不同,Miniflux没有插件系统,设计思路是保持核心稳定,把扩展能力交给外部工具。
docker run -d \ --name miniflux \ -p 8080:8080 \ -e DATABASE_URL=postgres://miniflux:secret@db/miniflux?sslmode=disable \ -e RUN_MIGRATIONS=1 \ miniflux/miniflux:latest
这个命令演示了单容器启动方式,实际使用时需要先准备好PostgreSQL数据库。Miniflux支持Fever API,也能通过第三方客户端同步阅读。它的更新日志非常清晰,升级前可以在GitHub上查看兼容性说明。
Tiny Tiny RSS:插件生态的老牌劲旅
Tiny Tiny RSS通常简称为TTRSS,是一个历史很长的开源RSS项目。它的功能覆盖面很广,除了基本的订阅管理,还支持标签、评分、已读同步、全文搜索和多用户。TTRSS的插件体系比较丰富,例如可以用插件过滤标题中的广告词、自动标记重复文章、生成摘要等。不过它的部署相对复杂,需要PostgreSQL和PHP环境,官方推荐使用Docker组合。
TTRSS的界面默认比较传统,但可以通过主题插件调整。它的一大优势是支持多用户共享实例,适合给家人或小团队搭建内部阅读服务。需要注意TTRSS的部分功能依赖计划任务,比如更新订阅源和清理历史数据,部署时要确保cron任务正常运行。由于项目历史悠久,文档和教程较多,遇到问题容易找到解决方案。
对人数不多但希望功能完整的场景,TTRSS仍然是一个可靠选择。只是在资源占用方面它不如FreshRSS和Miniflux克制,建议至少准备1GB内存。
NewsBlur:社区化阅读的代表
NewsBlur同时提供官方托管服务和开源版本,架构上包含Web、数据库、任务队列等多个组件,自建部署工作量较大。它的特色在于训练式过滤,你可以对文章点选喜欢或不喜欢,NewsBlur会根据反馈调整排序。它还支持分享、评论和关注其他用户,在开源RSS阅读器中属于社交属性较强的方案。
如果你需要多用户且希望有社区互动,NewsBlur是少数能满足需求的项目。普通个人用户如果只是自己订阅几个博客,部署NewsBlur的成本偏高。它依赖PostgreSQL、Redis、Elasticsearch等组件,对服务器配置要求不低。推荐使用官方提供的Docker镜像和编排文件,尽量不要手动逐项安装,否则容易在队列和搜索索引上出问题。
Stringer:单用户极简方案
Stringer是一个面向单用户的开源RSS阅读器,使用Ruby on Rails开发。它的功能非常克制,只提供基本的订阅、已读和收藏,没有分类和复杂的过滤规则。Stringer的设计哲学是把RSS阅读这件事简化到极致,适合那些被TTRSS和NewsBlur复杂配置劝退的用户。
Stringer的部署过程相对简单,官方提供了Docker镜像和Heroku一键按钮。数据存储默认使用PostgreSQL,也可以通过环境变量切换其他数据库。由于功能较少,它的维护成本低,但同样意味着扩展能力有限。如果你喜欢用API或插件做二次开发,Stringer可能不是最佳选择。它更适合纯阅读、不想折腾的人。
备份、迁移与常见问题处理
自建RSS阅读器之后,备份和迁移是绕不开的话题。无论使用哪个项目,都建议定期导出OPML文件。OPML记录了订阅源列表,但不包含已读状态和收藏内容。FreshRSS和Miniflux都支持通过API获取完整数据,TTRSS则可以在偏好设置中导出数据库。对于使用SQLite的FreshRSS,直接复制数据目录即可完成备份。
迁移项目时最容易踩的坑是已读状态不同步。部分旧项目的API只提供未读计数,不返回每篇文章的状态,这会让你在新阅读器里看到大量未读内容。解决办法是在旧系统中先标记全部为已读,再导入OPML,然后手动恢复近期未读。如果对已读历史有强需求,建议选择支持Google Reader API的项目,因为客户端同步生态更完整。
还有一个常见问题是订阅源解析失败。有些网站会屏蔽默认抓取器,需要在阅读器中配置自定义User-Agent或抓取规则。FreshRSS和Miniflux都支持设置抓取超时和代理。抓取频率也不宜过高,个人使用建议控制在15分钟到30分钟一次,这样既能及时获取更新,也不会给源站造成压力。