Miniflux 自托管 RSS 阅读器:双容器部署、全文抓取与 FreshRSS 取舍

开源项目6分钟前发布 一方
0 00

Miniflux 2 是一个用 Go 写的自托管RSS 阅读器,由一份静态编译的二进制加一个 PostgreSQL 数据库组成,只负责抓订阅、列未读、读全文三件事。它没有插件市场,没有主题商店,也没有官方手机 App。

下面按实际部署顺序拆开:依赖清单、要改的环境变量、抓取与清理策略、移动端与 API,最后是和 FreshRSS 的取舍以及几条容易被忽略的局限。文中版本号与默认值均取自 2026-11-10 当天的官方文档。

部署前要认的两件依赖

Miniflux 的可执行文件是静态编译的,模板、样式和图标都用 Go 的 embed 包打进同一个二进制,所以目标机器上不需要 PHP、Node 或 Python 运行时。运行时的外部依赖只有一个:PostgreSQL 11 及以上版本。文档里写得很直白,只支持 PostgreSQL 11 以上,SQLite 和 MySQL 都不在范围内。

为什么不支持别的数据库,官方设计说明给的理由不复杂:多后端会放大测试与维护成本,而它依赖 jsonb 类型、窗口函数、全文检索和用户时区处理,这些在 PostgreSQL 上现成可用。对部署者来说,这句话翻译过来就是:机器上要多跑一个数据库容器,备份也得连库一起备。

Docker 省掉了自己编译和装依赖的麻烦。镜像同时发在 Docker Hub、GitHub Container Registry 和 Quay.io 三处,tag 分 latest、2.3.5 这类版本号、nightly 三种,架构覆盖 amd64、arm64、armv7、armv6。文档建议锁定版本号,避免 latest 带来意外升级;Docker 安装页给出了完整命令。

官方 compose 示例是两个服务,miniflux 监听容器内 8080 端口,db 用 postgres:18。三件事必须配齐:

  • DATABASE_URL:连接串,形如 postgres://miniflux:密码@db/miniflux?sslmode=disable。
  • RUN_MIGRATIONS=1:初次启动自动执行 SQL 迁移。
  • CREATE_ADMIN=1 配合 ADMIN_USERNAME 与 ADMIN_PASSWORD:建初始管理员,建完这三项可以删掉。

有个坑值得提前记:Postgres 18 起数据目录默认是 /var/lib/postgresql,17 及以下才是 /var/lib/postgresql/data。挂错路径,容器照样起来,但数据落在匿名卷里,重建即丢。资源占用想长期看,可以配 Beszel 这类轻量监控盯容器内存与 CPU。

Miniflux 项目在 GitHub 上的仓库首页,可见项目简介、文件列表与右侧的版本与许可信息
截图来源:miniflux.app(2026-11-10)

环境变量:默认值看一遍再改

Miniflux 的配置几乎全走环境变量,没有网页安装向导。官方配置页列了完整清单,下面这张表是部署后大概率会动的几项,默认值照抄原文档。

变量默认值说明
DATABASE_URLuser=postgres password=postgres dbname=miniflux2 sslmode=disable数据库连接串
BASE_URLhttp://localhost生成页面链接与 Cookie 路径,scheme 只能是 http 或 https
LISTEN_ADDR127.0.0.1:8080监听地址,可逗号分隔多个,也可写 Unix socket
POLLING_FREQUENCY60 分钟后台调度器间隔
BATCH_SIZE100 个 feed每个间隔送入队列的数量
WORKER_POOL_SIZE16后台 worker 数
DATABASE_MAX_CONNS20数据库连接池上限
CLEANUP_FREQUENCY_HOURS24 小时清理任务间隔

几条通用规则值得先记住:

  • 布尔值可以用 1/0、yes/no、true/false、on/off,不区分大小写。
  • 以 _FILE 结尾的变量读的是文件路径,适合把密码交给 Docker secret。
  • 环境变量优先级高于配置文件,同名项会被覆盖。
  • Debian 与 RPM 包默认读 /etc/miniflux.conf,systemd 会把它当环境变量加载。

BASE_URL 和 LISTEN_ADDR 是回头率高的两项。前者写错,页面里的链接和分享地址会指向 localhost;后者留默认只监听回环地址,容器外访问不到,一般改成 0.0.0.0:8080 再交给反向代理。改完要重启进程,环境变量不会热加载。

抓取、全文开关与清理

默认每 60 分钟跑一轮调度,每轮往队列里放 100 个 feed,由 16 个 worker 并发抓取。请求会带 Last-Modified、If-None-Match、ETag、Cache-Control,源站没更新时能省掉一次完整传输。调度策略可选 round_robin(默认)与 entry_frequency,后者按更新频率调整节奏,适合订阅了少数高频源的场景。

连续失败不会无限重试。一个 feed 累计的解析错误达到 POLLING_PARSING_ERROR_LIMIT(默认 3 次)后会被停止轮询,需要到后台手动恢复。手动刷新也有下限,FORCE_REFRESH_INTERVAL 默认 30 分钟,避免误点刷屏。

全文开关是按 feed 走的

不少站点只给摘要,正文要跳转。Miniflux 的做法是在单个 feed 的编辑页打开「Fetch original content」,服务端下载原页面后用本地 Readability 解析正文。解析猜错时,再用 Scraper Rules 写 CSS 选择器指定正文容器;Rewrite Rules 可以按名字套用一组改写规则。这两项都是 feed 级设置,文档也提示该开关会消耗更多资源,只对需要的源打开更稳妥。

条目进库前还有一道正则过滤,可以按标题或 URL 剔除。对更新频繁的聚合源,这比事后一条条标已读省事。订阅里若带播客源,Miniflux 只能列出附件,播放还是交给 AntennaPod 这类播客客户端。

清理不等于删除

清理任务默认每 24 小时跑一次。已读条目默认 60 天后归档,未读条目 180 天,会话 30 天,每个间隔归档 10000 条。归档是把条目移出常规列表,并没有从库里抹掉;想保留全部历史,把天数设成 -1 就关闭归档。

移动端与 API:没有官方 App 怎么办

Miniflux 不做原生客户端,理由写在设计说明里:前端是渐进式 Web 应用,响应式布局,可加到主屏,横滑能改条目状态,浏览器沙箱还省掉了 App 的数据权限问题。安卓和 iOS 走同一套页面。

想要原生客户端就走 API。它同时兼容 Google Reader API 与 Fever API,社区里多数 RSS 客户端能直连;另有自带的 REST API,认证头是 X-Auth-Token,建一个 API key 就能用 curl 调。两类凭据是分开的,改网页密码不会让 API key 与 Reader/Fever 凭据失效,这一点 2.3.5 起写进了接口文档。

按需抓全文也有接口:GET /v1/entries/{entryID}/fetch-content?update_content=true,从 2.0.36 起可用。只在手机上看长文的话,这比在桌面端预先把所有源都抓一遍省流量。

输出侧有 25 个以上第三方集成,包括 Wallabag、Linkding、Linkwarden、Readeck、Shiori、Telegram、Discord、webhook 等;推送可以接 ntfy,站内也写过自建 ntfy 的部署步骤。界面提供 20 种语言,含简体与繁体中文。

和 FreshRSS 怎么选,以及它的局限

自托管 RSS 的另一主流是 FreshRSS。两者都支持 OPML 导入导出,都讲 Google Reader API 与 Fever API,迁移订阅不难,难迁的是已读状态、标签和每个 feed 的单独设置。

维度Miniflux 2FreshRSS
语言与运行方式Go 静态二进制PHP 8.2+ 加 Web 服务器
数据库仅 PostgreSQL 11+SQLite、MySQL 8.0+、MariaDB 10.6+、PostgreSQL 10+
许可Apache-2.0AGPL-3.0
多用户支持,由管理员建号支持,另有匿名阅读模式
扩展与主题不提供,按设计如此扩展体系与多套主题
实时推送无 WebSub,靠轮询支持 WebSub
客户端协议Google Reader、Fever、RESTGoogle Reader、Fever

这张表可以压成一句话:要单容器、要 SQLite、要多用户加匿名阅读、要主题和扩展、要 WebSub 推送,选 FreshRSS;要一份二进制加一个库、要请求量少、要键盘操作、要把保存和通知接进现成服务,选 Miniflux。

六条要提前接受的局限

  1. 数据库没得选。只支持 PostgreSQL 11 以上,想要 SQLite 单容器的方案直接出局。
  2. 没有插件与主题。界面按 Hacker News、Lobsters、Pinboard 的信息密度路子做,想改观感只能注入自定义 CSS 与 JS。
  3. 没有 WebSub。更新节奏由 POLLING_FREQUENCY 决定,对秒级推送有要求的场景不合适。
  4. 全文抓取受限于匿名访问。付费墙、登录墙、封数据中心 IP 的站点抓不到正文;对所有 feed 全局开启还会放大对源站的请求。
  5. 移动端体验依赖第三方客户端或 PWA。官方不出 App,客户端与 API 的兼容性得自己试。
  6. 维护集中。GitHub 接口显示 9907 star、965 fork、288 个未结 issue,主要维护者是作者本人,功能取舍由他定。

这些局限不算缺陷,是同一个取舍的六个面:功能面收窄,可维护面就小,出问题的位置也少。它的内存占用确实低,但官方文档只笼统说「几 MB」,没给可复现的压测数字,别拿社区里的单点测量当基准。

适合谁,以及上手顺序

适合:手上有一台常开的 Linux 主机或 NAS,能接受多跑一个 PostgreSQL 容器,订阅数在几十到几百之间,读的时候更在意列表密度和键盘操作,而不是换主题。不太适合:想零运维、想用 SQLite 单文件、需要多人共享加匿名浏览、或者依赖实时推送的人。

上手建议按这个顺序走。先用官方 compose 起两个容器,把 BASE_URL 写成最终域名,CREATE_ADMIN 建好账号后立刻删掉那三项环境变量;导入 OPML 后保持 60 分钟轮询跑一天,看数据库体积与 CPU 占用,再决定是否调 BATCH_SIZE。

全文开关只对确实需要的源打开,抓错正文时再补 Scraper Rules 的 CSS 选择器。备份只备 PostgreSQL 一个卷就够,二进制本身不存状态;升级前先看版本要求页有没有抬 PostgreSQL 下限。


相关地址

以下为文中项目的官方入口,版本号、部署参数与文档以这些页面为准。

  • Miniflux(GitHub 仓库):https://github.com/miniflux/v2
  • Miniflux(官网):https://miniflux.app/
  • Miniflux(Docker 安装文档):https://miniflux.app/docs/docker.html
  • Miniflux(配置参数):https://miniflux.app/docs/configuration.html
  • FreshRSS(GitHub 仓库):https://github.com/FreshRSS/FreshRSS
© 版权声明

相关文章