Total Pageviews

Friday, 19 August 2016

Miniflux -基于php的极简News Reader

Minimalist web RSS reader 

Build Status
Miniflux is a minimalist and web-based RSS reader.

Features

  • Host almost anywhere
  • Readability (CSS optimized for readability, responsive design, compatible with mobile and tablet devices)
  • Easy setup => copy and paste the source code and you are done!
  • Use a lightweight Sqlite database instead of Mysql or Postgresql
  • Remove Feedburner Ads and analytic trackers (1x1 pixels)
  • Open external links inside a new tab with a rel="noreferrer" attribute
  • Use secure HTTP headers (only external images and Youtube/Vimeo/Dailymotion videos are allowed)
  • Article content is filtered before being displayed
  • Translated in Arabic, English, French, German, Italian, Japanese, Czech, Spanish, Turkish, Portuguese, Russian, Serbian and Simplified Chinese
  • RTL languages support
  • Keyboard shortcuts
  • Full article download for feeds that display only a summary
  • Bookmarks
  • Groups for categorization of feeds (like folders or tags)
  • Send your favorite articles to Pinboard and Instapaper
  • Enclosure support (videos and podcasts)
  • Feed updates via a cronjob or with the user interface with one click
  • Keeps history of read items
  • Import/Export of OPML feeds
  • Themes
  • Auto-update from the user interface
  • Multiple databases (each user has his own database)
  • Image proxy to avoid mixed content warnings with HTTPS

Requirements

  • Recent version of libxml2 >= 2.7.x (version 2.6.32 on Debian Lenny is not supported anymore)
  • PHP >= 5.3.3
  • PHP XML extensions (SimpleXML and DOM)
  • PHP Sqlite extension
  • cURL extension for PHP or Stream Context with allow_url_fopen=On
  • Iconv and mbstring extensions

Documentation

Related projects

External projects build around Miniflux:

from https://github.com/miniflux/miniflux
-------

用 Miniflux 自建轻便好用的 RSS 服务

自从 Google Reader 下线以来,RSS 似乎再也没有一家独大的服务商了。InoreaderFeedly 可以称得上是其中的明星产品。一些高级功能如关键词高亮、自定义过滤规则等,也一应俱全。只不过,都需要不菲的订阅费用,而且免费用户的订阅文章里,会带上「狗皮膏药」式的广告,有碍观瞻。
自建服务除了能实现 RSS 服务商的付费功能外,还有隐私与安全方面的优势。何况,上述这些不受监管的境外 RSS 服务,指不定哪天就 404 了。

1 为什么推荐 Miniflux

从成熟服务商迁移的前提,自然是自建服务能覆盖或超出前者所提供的能力。除了订阅和阅读功能以外,个人对 RSS 服务的基本需求有如下几点:
  • 界面简洁,设计符合直觉
  • 订阅源同步及时
  • 服务稳定,能持续更新迭代
  • 支持全文搜索订阅文章
  • 自定义规则过滤订阅源
  • 对只输出摘要的订阅源,能抓取全文
  • 移动 / 桌面客户端支持全面
  • 支持保存文章到稍后读应用

1.1 TTRSS/ FreshRSS/ Miniflux

在一番调研后,我从目前成熟且轻量的开源解决方案中,选择了三个: Tiny Tiny RSSFreshRSSMiniflux。为了找到最优解,我把三者都安装试用了遍,并就上面提出的基本需求,做了下横向比较。
rssvs
结论是,FreshRSS 不太能满足我的需求,没有吸引力;Miniflux 很优秀,但缺少自定义规则过滤功能;而 TTRSS 则是功能最齐全的。
由此来看,似乎 TTRSS 才是最优解,那为什么最终要转而推荐 Miniflux 呢?因为由 PHP 写成的 TTRSS,实在是太「重」了。我在安装和使用的过程中,遇到不少疑难问题。而整个项目似乎也「岌岌可危」——最近一个稳定版本是 1 年前。

1.2 极致优雅的 Miniflux

与 TTRSS 相对,Miniflux 不仅有活跃的开发者、近乎每月一更的稳定版本,而且功能不依赖任何插件,使用起来令人非常安心。
至于为什么会没有插件呢?作者在 文档 中回答说,因为 Miniflux 是一种极简的解决方案。插件一方面会增加其复杂度,另一方面,人们通常不会长期去维护插件。
Miniflux 的界面可以说是做到了极致简洁,与著名的稍后读应用 Pinboard 在设计理念上可以说是异曲同工。没有多余的元素,不加载多余的 JS,追求轻量和快速,打开就能直接阅读。同时使用响应式的设计,能适配各种屏幕(移动端还支持滑动标记已读)。
而它目前最大的缺点——「不支持自定义规则过滤订阅源」,也有一种另辟蹊径的解决办法,具体可参考下文「使用指南」部分。

2 安装使用 Miniflux

这里主要介绍如何在 Docker 上安装使用 Miniflux,因为使用这种方式,安装和卸载对本身 Linux 系统影响都较小。当然,你也可以参考 官方文档 安装使用。

2.1 配置环境

首先,利用 ssh 连接 VPS。
根据自己所使用的 Linux 系统,使用以下命令安装相关环境。
#Debian/Ubuntu系统
apt-get -y install git make nano curl

#CentOS/RHEL系统
yum -y install git make nano curl
输入下方第一条命令安装 Docker,这里需要耐心等待一会。等安装完成后,再输入第二条命令启动服务。
curl -sSL https://get.docker.com/ | sh
service docker start
下一步是安装 Docker Compose,一个可以一次安装多个 Docker 容器的工具。
curl -L https://github.com/docker/compose/releases/download/1.17.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose && chmod +x /usr/local/bin/docker-compose

2.2 程序安装

首先将用于 docker 环境的 miniflux 代码克隆到 VPS 上。
git clone https://github.com/miniflux/docker.git
然后进入 docker 文件夹,并开始下载二进制文件。注意下面命令链接里的 2.0.10 是当前的最新版本,如果后期有更新,你可以去Miniflux 的 发布页面 确认最新的版本并替换。
cd docker && wget -O miniflux https://github.com/miniflux/miniflux/releases/download/2.0.10/miniflux-linux-amd64
使程序可执行。
chmod +x miniflux
之后开始制作镜像,这里的 2.0.10 也可以替换为最新的版本号。
make image version=2.0.10
然后你可以用 nano 编辑器打开 docker-compose.yml 配置文件,来调整 Miniflux 对外的端口。如果无需修改端口,可跳过这一步。
nano docker-compose.yml
默认是 80 端口,也就是说输入 VPS 的 IP 地址即可使用和访问 Miniflux。如果改成了其他端口,则需要用 http://<ip地址>:<端口号> 来访问。这里改成 9090 作为示范。另外,你可以把 latest替换为最新的版本号。
Snipaste_2018-08-27_22-13-45
最后一步,用 docker-compose 按照配置运行 docker 镜像。另外,后续更新时,也仅需要将上一步配置文件中的版本号 latest 替代为最新的版本号,并执行该命令即可。
docker-compose up -d

2.3 开始使用

安装完成后,只需设置好管理员账号,就可以正常使用了。首先,查看 dokcer 正在运行的容器。
docker ps -a
container_id
确认 miniflux 的 container-id,并用下方命令运行该容器。注意将命令中的 <container-id> 替换为 miniflux 的 id。
docker start <container-id>
然后,设置管理员账号(注意也要将命令中的 <container-id> 替换为 miniflux 的 id)。
docker exec -ti <container-id> /usr/local/bin/miniflux -migrate
docker exec -ti <container-id> /usr/local/bin/miniflux -create-admin
这里需要输入管理员的用户名和密码。
Snipaste_2018-08-27_22-32-23
打开浏览器,通过访问 http://<ip地址>:<端口号> 就可以进入界面,使用账号密码登陆了。

2.4 域名和 HTTPS 支持

完成上述步骤后,已经可以正常使用了。如果你有域名的话,解析到该地址后就可以直接通过域名访问了。当然,这并非必要步骤。
域名的购买和解析这里就不再赘述了。如果只是自用的话,推荐去 Namecheap 买 .win 域名,40-50 元 5 年,很划算。
有了域名怎么添加 SSL 使其支持 HTTPS 呢?这里推荐使用 Caddy 服务,安装和使用都很省心。首先,安装 Caddy。
wget -N --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubi/doubi/master/caddy_install.sh && chmod +x caddy_install.sh && bash caddy_install.sh install http.filemanager
然后新建配置文件。
nano /usr/local/caddy/Caddyfile
将配置内容粘贴进去,注意替换尖括号中的项目。
https://<解析到该ip的域名> {
 tls <你的邮箱>
 proxy / <ip地址:miniflux对外端口> {
    header_upstream Host {host}
    header_upstream X-Real-IP {remote}
    header_upstream X-Forwarded-For {remote}
    header_upstream X-Forwarded-Proto {scheme}
  }
 log /var/log/caddy.log
 gzip
保存退出后,重启 Caddy 就可以用 https 访问域名了。
/etc/init.d/caddy restart

3 使用指南

现在,你已经可以毫无障碍地使用 Miniflux 了。不过,「客户端支持」与「自定义过滤」这两项,还需要一些额外的工作。

3.1 客户端支持

虽然网页版的 Miniflux 足够轻便快速,但是习惯了原生应用的体验后,很难再回到「简陋」的网页了。好在 Miniflux 本身就支持与 Fever 集成,可以通过它的 API 在 Reeder、Unread 等客户端中使用。
这里以 Reeder 为例。首先,在 Miniflux 界面上设置好 Fever 的用户名和密码。
然后打开 Reeder 添加账户,类别选择 Fever。在 Server 栏填入 http://<ip地址或域名>:<端口号>/fever,用户名和密码填写上面配置好的,打开信任证书选项,点击登录即可。

3.2 过滤神器 SiftRSS

对我而言,Miniflux 目前最大的短板,就是不支持自定义规则过滤订阅源。而 SiftRSS 就是为了解决这一需求而生的工具。
SiftRSS 支持根据订阅文章标题或描述中的关键词,对订阅源进行过滤,然后重新生成订阅地址。你可以选择包含或排除关键词,另外它也支持正则表达式过滤。利用正则表达式,你可以模糊匹配或者屏蔽多个关键词。这里列了几个可用于过滤的实用运算符,以供参考。

3.3 RSSHub 获取订阅源

RSSHub 是 @DIYgod 同学主导的开源项目,口号是「万物皆可 RSS」。目前已支持将 Bilibili、微博、即刻、公众号、知乎、简书等内容更新,作为 RSS 订阅源输出。如果你已经在用 RSS 却不知道 RSSHub 的话,强烈推荐关注使用。
你可以自行将其部署到服务器上,也可以使用项目所提供的 rsshub.app 域名直接订阅 RSS 源。目前这个项目的开发很活跃,如果有任何想新增的源,也可以去他们的 GitHub issue 中提需求。

4 One More Thing

最后,一个忠告:RSS 虽好,精简的订阅源 和 日清的行动才是关键。
另外,FOMO (Fear of Missing out) 始终是种病态。-----

优秀的开源RSS阅读器工具:Miniflux

Miniflux使用PHP语言编写,支持Sqlite/MySQL数据库,支持中文等多国语言,无需要安装直接上传到服务器就可以使用。而Tiny Tiny RSS很多功能和Google Reader差不多,在使用习惯上都非常地接近Google Reader,最重要的是Tiny Tiny RSS有免费Android 客户端和第三方ios客户端。

一、Miniflux安装与使用

Miniflux官网:
  1. https://miniflux.net/
Miniflux安装要求是:
PHP >= 5.3.3 (推荐PHP 7.x )
PHP 扩展: ctype, dom, hash, iconv, json, xml, mbstring, pdq_sqlite/pdo_pgsql, pcre, session, SimpleXML (推荐使用curl 或者设置allow_url_fopen=On)
Sqlite 3 or Postgres >= 9.3
libxml2 >= 2.7.x

1.1  Miniflux安装使用

官网下载Miniflux安装包,解压并上传到服务器上,确保data 文件夹可读写,打开浏览器,使用账号和密码:admin/admin 登录进去。
这个就是Miniflux的操作界面,非常地简洁,只有添加订阅、收藏、历史、导入等几个功能。
这是Miniflux的设置选项,你可以开启图片代#理,这样就可以完整地将网页图片下载到RSS中,根据自己的习惯设置文章列表数目、排序、全文摘要等等。
Miniflux也是一个多用户系统,在“用户”管理中可以添加新的用户。
这是Miniflux添加订阅源。
这是Miniflux的阅读界面,有标记已读、收藏等。
你还可以将别的RSS阅读器的Feed导入到Miniflux中。

1.2  Miniflux更新RSS

使用定时任务。利用Crontab定时执行cronjob.php.代码如下:
crontab -e

# 每4个小时更新一次
0 */4 * * *  cd /path/to/miniflux && php cronjob.php >/dev/null 2>&1

# 每次更新10个RSS源
0 */4 * * *  cd /path/to/miniflux && php cronjob.php --limit=10 >/dev/null 2>&1

# 每60分钟更新一次 (每次更新8个RSS源 with a total of 120 feeds).
* */4 * * *  cd /path/to/miniflux && php cronjob.php --call-interval=4 --update-interval=60 >/dev/null 2>&1
Web 调用 。定时脚本也可以直接通过Web访问来调用。
例如: http://wzfou.com/miniflux/cronjob.php?call-interval=4&update-interval=60&token=XXX
  • 其中cronjob URL可在在 preferences > about 中找到。
  • The access is protected by a private token.
  • 如果你想禁用web cronjob,可以 修改配置文件中 ENABLE_CRONJOB_HTTP_ACCESSto false.

1.3  Miniflux相关配置

你可以将Miniflux配置文件config.default.php 重命名为 config.php,你可以根据自己需要来修改。默认的Miniflux使用Sqlite,但是Postgres 和 MySQL 也是支持的。
Sqlite 配置
你可以通过以下值来修改 Sqlite file的路径:
define('DB_DRIVER', 'sqlite');
define('DB_FILENAME', DATA_DIRECTORY.'/db.sqlite');
Postgres 配置
Miniflux 会自动创建 schema 但是还需要指定创建 database:
CREATE DATABASE miniflux;
同时你需要将 config.php 调整为:
define('DB_DRIVER', 'postgres');

// Replace these values:
define('DB_HOSTNAME', 'localhost');
define('DB_NAME', 'miniflux');
define('DB_USERNAME', 'my postgres user');
define('DB_PASSWORD', 'my secret password');
MySQL配置
Miniflux 指定 database :
CREATE DATABASE miniflux;
然后在 config.php 修改为:

define('DB_DRIVER', 'mysql');

// Replace these values:
define('DB_HOSTNAME', 'localhost');
define('DB_NAME', 'miniflux');
define('DB_USERNAME', 'my mysql user');
define('DB_PASSWORD', 'my secret password');

-------------------------------

用miniflux搭建一个自己的RSS服务

自从Google Reader挂掉后就一直使用Feedbin提供的RSS订阅服务,期间也想过开源解决方案搭建一个但无奈仅有的几款成熟度比较合格的方案都是PHP的产物,我不是一个喜欢在自己的服务器上配置PHP环境的人.

前段时间了解到miniflux这样一个用GO编写的可以自己托管的RSS订阅服务,恰恰我是一个很喜欢使用Go编写程序和使用Go编写的程序的人,于是在 https://miniflux.app/ 上看了下手册后就很简单的将miniflux配置好了.

配置的过程很简单,拜Go只依赖glibc的巨大优点所赐,只需要一个二进制可执行文件就可以在几乎所有操作系统上跑起来,除了主程序外只需要按照手册自己配置好Postgresql就行.

miniflux可以在控制台开启fever api支持,这样就可以用Reeder和Unread这种第三方APP里进行阅读了.只是有些小缺点,因为fever确实太陈旧而且小众所以某些功能缺失了,比如Unread上没有向上/向下设定已读.

搭建好以后就当作主力RSS阅读器使用,期间唯一遇到的问题是miniflux程序目前还处于密集开发状态,所以每个版本甚至每个commit都可能带来不可预知的改动,特别是对我这种每天都会拉取最新代码然后自己编译更新的人来说.
遇到过一次自己编译更洗后提示entries表中缺少一个键,当时很简单的自己给这张表添加了缺少的键.
当时表面上没什么问题了,但后来随着miniflux更多修改的提交问题就出来了,那就是一旦你自己修改过表结构,那么很可能以后的修改都需要自己来维护了.而正常情况下是需要按照upgrade中的流程来执行的(当然自己拉取代码手动编译的话很可能升级工具并没有相应的更新).

此后我就老老实实选择下载release版本的二进制文件来升级了.

而使用以来最大的优点有以下几项:

  • 可以自己设定刷新间隔

    某些公共服务也能设定,但一般是需要收费的比如inoreader.但即便将刷新间隔设定在15分钟我发现仍然有几小时才刷新的情况.

  • 可以清晰的看到哪些feed拉取出现了异常

    其实很多服务都有这项功能,但Feedbin很遗憾没有.只能看到源最后更新时间,这算是Feedbin最大的硬伤吧.

  • 可以直接修改feed的URL

    某些时候feed链接会有变更,比如从blog.xxx.com变成了xxx.blog,相应的feed链接也会变更,而这个时候如果不能修改feed的URL就只能创建一个新的订阅.而miniflux却可以很方便的更改,甚至因为有操作数据库权限所以很多控制台中无法修改的项也可以修改.

  • 免费

    当然如果本来就有服务器的话.