经常看的项目博客和更新说明散落在不同网站,逐个打开会把阅读变成反复检查。Miniflux 可以定期抓取 RSS 或 Atom,把新内容集中到一个阅读入口。它适合订阅阅读,也能保留自己的已读、收藏和分类状态。
订阅列表可以通过 OPML 导出,但阅读状态和账号数据需要数据库备份。部署时把这两种恢复方式区分清楚,换服务器时就不必重新从一堆未读文章开始。
PostgreSQL 18 的目录不要沿用旧版本写法
准备 Linux VPS、Docker Engine、Compose、一个域名以及宿主机 Caddy。本文采用当前 Miniflux 官方示例中的 PostgreSQL 18,数据卷挂载到 /var/lib/postgresql。PostgreSQL 17 及更早镜像的常用路径是 /var/lib/postgresql/data,两者不要混用。
Miniflux 的数据库会随着订阅数量、保留时间和内容抓取逐渐增长。需要独立阅读器时,可以查看雨云云服务器,优惠码 KuZhuJi,选择 Linux 实例并为数据库和导出文件留出磁盘空间。已有 VPS 可以先用少量订阅观察占用,再决定是否拆分服务;节点到订阅源的网络可用性要逐个检查。
mkdir -p ~/apps/miniflux
cd ~/apps/miniflux
umask 077
docker pull miniflux/miniflux:latest
printf 'MINIFLUX_IMAGE=%s\n' "$(docker image inspect --format '{{index .RepoDigests 0}}' miniflux/miniflux:latest)" > .env
printf 'POSTGRES_PASSWORD=%s\n' "$(openssl rand -hex 32)" >> .env
printf 'ADMIN_PASSWORD=%s\n' "$(openssl rand -hex 32)" >> .env
确认 .env 中的镜像摘要与密码,保存为 compose.yml:
services:
db:
image: postgres:18
restart: unless-stopped
environment:
POSTGRES_DB: miniflux
POSTGRES_USER: miniflux
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?请生成数据库密码}
volumes:
- ./data/postgres:/var/lib/postgresql
healthcheck:
test: ["CMD-SHELL", "pg_isready -U miniflux -d miniflux"]
interval: 10s
timeout: 5s
retries: 10
miniflux:
image: ${MINIFLUX_IMAGE:?请固定镜像摘要}
restart: unless-stopped
depends_on:
db:
condition: service_healthy
ports:
- "127.0.0.1:3019:8080"
environment:
DATABASE_URL: postgres://miniflux:${POSTGRES_PASSWORD}@db/miniflux?sslmode=disable
RUN_MIGRATIONS: "1"
CREATE_ADMIN: "1"
ADMIN_USERNAME: admin
ADMIN_PASSWORD: ${ADMIN_PASSWORD:?请设置初始管理员密码}
BASE_URL: https://rss.example.com
替换域名。数据库通信限制在该 Compose 网络内,示例不启用数据库公网端口。sslmode=disable 适用于这里的同机容器网络;远程数据库应按其 TLS 要求另行配置。
docker compose config --quiet
docker compose up -d
docker compose ps
docker compose logs --tail=100 miniflux db
Caddy 安装在宿主机时使用:
rss.example.com {
reverse_proxy 127.0.0.1:3019
}
核对 DNS、80 和 443 端口,验证配置后重载。代理如果也在容器中,应通过共同网络连接 miniflux:8080。正式使用前确认域名访问、登录和退出均正常。
不急着导入全部订阅,先看一次抓取过程
添加一个发布频繁的项目更新源,再添加一个普通博客源。手动刷新,检查条目标题、时间和原文链接;打开一条文章,标成已读,换设备登录同一账号,确认状态一致。
有些源只提供摘要。页面上文字短,不一定是抓取故障;需要全文时,可以针对该源尝试内容抓取,并查看正文是否准确。有的网站对访问频率、网络出口或页面结构有要求,不能把所有摘要源都假定为可稳定全文提取。
订阅失败时,先检查源地址是否仍返回 RSS 或 Atom,是否被重定向到登录页,以及 VPS 能否访问它。再看 Miniflux 抓取错误与应用日志。页面有历史条目,只说明过去抓取成功,并不说明最近仍在更新。
初始化账号只需要保留一次
确认管理员可以登录以后,从 Compose 中移除 CREATE_ADMIN、ADMIN_USERNAME、ADMIN_PASSWORD 三项初始账号变量,再执行 docker compose up -d。账号已经保存在数据库,后续不需要每次启动都尝试初始化。
多人使用应在应用里建立各自账号,避免共享一个阅读状态。API Token、第三方阅读客户端和登录密码要分别管理;不用的 Token 应及时撤销。个人阅读器默认保持登录访问,不必为了能分享几条订阅而开放整个账号环境。
OPML 导出适合保存订阅清单、迁往别的阅读器,但它不是完整数据库备份。收藏、已读状态、账号与服务设置要从服务器端恢复。
备份后,用一条已读文章做恢复验证
先在测试源中选择一条文章标记已读并收藏,记下标题,再导出数据库:
mkdir -p backups
umask 077
docker compose stop miniflux
docker compose exec -T db pg_dump -U miniflux -d miniflux -Fc > "backups/miniflux-$(date +%Y%m%d-%H%M%S).dump"
docker compose start miniflux
检查导出命令成功、文件非空并能列出归档目录。保存 .env、Compose、镜像摘要、代理配置和 OPML;备份副本移到独立存储。
恢复演练在另一个项目和域名进行,先用 PostgreSQL 18 和旧应用镜像恢复空库。登录后检查订阅数、分类、收藏及那条文章的已读状态。测试实例应避免与正式实例同时频繁抓取同一批源,完成验证后关闭演练实例。
应用升级前保留这份配套备份。PostgreSQL 主版本升级要通过逻辑备份恢复或官方迁移流程处理,不能直接改镜像标签继续使用原来的数据目录。
容器与数据目录见 Miniflux 官方 Docker 文档,抓取和账号初始化参数见 配置文档。











