自托管服务
FreshRSS/FreshRSS avatar
FreshRSS/FreshRSS

FreshRSS 1.29 实测指南:自托管 RSS 聚合器的 XPath 抓取与多用户边界

一个免费的、自我托管的新闻聚合器…… FreshRSS 本身支持基于 XPath 的基本 Web 抓取,适用于不提供任何 RSS/Atom 提要的网站。

16,025 个 Star1,279 个 ForkPHPAGPL-3.0

秒懂

它是什么?
FreshRSS 是一个轻量级自托管 RSS 聚合器,原生支持 XPath 网页抓取和 JSON 文档。本文基于官方文档与仓库信息,分析其架构、安装方式、抓取机制的真实限制,并给出适用与不适用的判断。
适合谁用?
FreshRSS 适合已经具备 PHP 运行环境、希望完全掌控订阅数据和阅读界面的个人或小团队,尤其是需要抓取无 RSS 网站且愿意为每个站点手写 XPath 表达式的用户。不适合对抓取稳定性要求极高、不想维护规则、或需要复杂登录态抓取的用户,因为 XPath 规则脆弱且文档明确说明只支持基础抓取。
能商用吗?
可以,但条件严格。AGPL-3.0 是网络 copyleft 许可证:如果别人通过网络使用你修改过的版本(例如作为托管服务),你必须以同一许可证向他们提供源代码。
还在维护吗?
在维护。仓库最近一次提交在 1 天前。
用什么语言写的?
主要是 PHP(依据 GitHub 的语言统计)。

以上回答依据项目的 GitHub 数据(最近同步于 2026年9月15日)和我们的分析,不构成法律意见。

开源项目深度解析

它解决什么问题,谁该用它

FreshRSS 解决的是自托管 RSS 阅读的完整需求:你拥有自己的订阅数据、阅读历史和界面,不依赖任何第三方云服务。它面向两类人。第一类是技术爱好者,愿意自己维护一台服务器,甚至是一台树莓派,官方文档声称在树莓派 1 上测试过 150 个 feed、2.2 万篇文章,响应时间低于一秒。第二类是需要抓取没有 RSS 的网站的人。许多新闻网站、博客或电商页面不提供 Atom 或 RSS,FreshRSS 原生支持基于 XPath 的网页抓取,这让它比纯 RSS 阅读器多了一个关键能力。但要注意,这个抓取是基础级别,不是通用爬虫,它的定位是补充,而不是替代专业抓取工具。

抓取机制:XPath 规则与 JSON 支持的真实边界

FreshRSS 的网页抓取基于 XPath 1.0,这是官方文档明确指出的。用户需要为每个目标网站写 XPath 表达式,指定文章链接、标题和内容的提取路径。这意味着每个站点都要单独配置,而且规则是静态的。如果网站改版,HTML 结构变化,规则就会失效,你需要手动更新。这不算 bug,而是 XPath 抓取的本质。文档没有提到 JavaScript 渲染的页面,所以可以推断它只处理服务器返回的原始 HTML。对于单页应用或动态加载内容的网站,FreshRSS 抓不到。另外,它支持 JSON 文档,这扩展了数据源类型,但同样需要你理解 JSON 结构并写下正确的路径。如果你不想写 XPath,或者目标网站经常变,这个功能可能让你头疼。

运行架构:PHP、数据库和 Web 服务器的配合

FreshRSS 是 PHP 应用,要求 PHP 8.1 以上,依赖 cURL、DOM、JSON、XML 等扩展。数据库支持 PostgreSQL 10+、SQLite、MariaDB 10.6+ 或 MySQL 8.0+。这意味着你可以在低配 VPS 上运行,也可以用 Docker 一键部署,官方提供了 Docker 镜像和 docker-compose 文件。多用户是它的核心特性,支持匿名阅读模式,适合小团队或家庭共享。WebSub 支持让它可以接收来自 WordPress、Medium 等平台的即时推送通知,这比定时轮询更及时。架构上,FreshRSS 将公共文件放在 p/ 目录,数据存在 data/ 目录,官方建议只暴露 p/ 目录,这提高了安全性,因为 data/ 包含所有个人数据。这种分层清晰,但要求你理解 Web 服务器配置,否则容易误暴露。

安装与配置:从下载到第一个订阅

手动安装流程很直接。从 GitHub 下载最新稳定版压缩包,或克隆 edge 分支。将应用放到服务器,只暴露 p/ 目录,给 data/ 目录写权限,然后浏览器访问安装向导。你也可以用命令行接口完成安装,适合自动化部署。高级配置在 config.default.php 中,修改 data/config.php 覆盖默认值。如果你用 Apache,官方建议启用 AllowEncodedSlashes 以兼容移动客户端。Docker 用户可以直接用官方镜像,docker-compose.yml 在 Docker 目录下。整个流程不复杂,但要求你熟悉 PHP 环境和 Web 服务器配置。如果你不想碰 PHP,可以试试 Yunohost 或 Cloudron 的一键安装,官方列出了这些选项。安装后,你可以通过 API 连接移动客户端,比如 FeedMe 或 Reeder,这需要启用 API 并配置访问令牌。

多用户与访问控制:匿名模式与登录方式的取舍

FreshRSS 支持多用户,每个人有自己的订阅和阅读状态。登录方式有三种:Web 表单(可启用匿名模式)、HTTP 认证(兼容代理委托)、OpenID Connect。匿名模式适合公开实例,但会失去个性化推荐和未读跟踪。HTTP 认证适合已经用反向代理做统一认证的场景,比如通过 Authelia 或 LDAP 代理。OpenID Connect 适合企业或团队,但需要额外配置身份提供商。多用户也带来管理负担:你需要考虑用户配额、数据库连接数、以及防止滥用。文档没有详细说明用户数量上限,但可以推断,PostgreSQL 比 SQLite 更适合多用户高并发场景。如果你只是单人使用,SQLite 足够,但记得启用 PDO_SQLite 扩展,否则导入导出功能会有限制。

扩展与定制:API、扩展和命令行接口

FreshRSS 提供 API,兼容 Google Reader API 风格,所以很多移动客户端可以直接连接。命令行接口(CLI)在 cli/README.md 中有文档,可以执行更新、导入导出、用户管理等操作,适合 cron 定时任务。扩展系统允许你添加自定义功能,但需要 PHP 知识。官方还支持按 HTML、RSS、OPML 格式重新分享文章选集,这是一个实用的协作功能。不过,扩展生态的深度和活跃度取决于社区,文档没有列出官方扩展列表,所以你需要自己搜索或测试。如果你需要深度定制,可能要写 PHP 代码,这比配置型工具门槛高。

维护与升级成本:边缘分支与稳定版的权衡

官方每两到三个月发布一个新版本,保持节奏。如果你想要最新功能,可以使用 edge 分支,但它是滚动发布,可能不稳定。稳定版适合生产环境,但功能滞后。升级通常简单,下载新版本覆盖旧文件,但要注意数据库迁移。文档提到配置在 config.default.php 中,升级时如果改了默认值,需要对比差异。data/ 目录包含所有数据,升级时不要覆盖。日志可以在界面或 data/ 目录查看,帮助排查问题。整体维护成本中等,比商业 SaaS 高,但比从零开发低。如果你不习惯 PHP 环境,维护可能是个负担。

替代方案:Miniflux 与 Tiny Tiny RSS 的差异

同类自托管 RSS 阅读器有 Miniflux 和 Tiny Tiny RSS。Miniflux 用 Go 编写,单二进制文件部署,内存占用低,但它是单用户,不支持多用户和网页抓取。Tiny Tiny RSS 支持多用户,但需要 PostgreSQL 或 MySQL,且抓取功能需要额外插件。FreshRSS 的差异化在于原生 XPath 抓取和 JSON 支持,这是它的独特卖点。如果你不需要抓取,Miniflux 可能更简单,因为它没有 PHP 依赖。如果你需要多用户,Tiny Tiny RSS 是另一个选择,但它的抓取插件可能不如 FreshRSS 原生集成。选择取决于你对抓取的需求和对 PHP 的容忍度。

编辑结论

FreshRSS 适合已经具备 PHP 运行环境、希望完全掌控订阅数据和阅读界面的个人或小团队,尤其是需要抓取无 RSS 网站且愿意为每个站点手写 XPath 表达式的用户。不适合对抓取稳定性要求极高、不想维护规则、或需要复杂登录态抓取的用户,因为 XPath 规则脆弱且文档明确说明只支持基础抓取。首次部署前,应确认服务器 PHP 版本至少 8.1,并决定数据库选型(SQLite 最简单,PostgreSQL 适合多用户高并发)。同时检查目标网站是否允许抓取,以及是否遵守 robots.txt 和网站服务条款。最后,AGPL-3.0 许可证意味着如果你修改代码并提供网络服务,可能需要开源你的修改版本,这一点在商业部署前需要法律确认。

官方来源

  1. Official documentation
  2. Official README
  3. Project repository
  4. Release notes
社区笔记

社区笔记