Miniflux Docker 部署:搭建个人 RSS 阅读器

部署 Miniflux 与 PostgreSQL 18,验证订阅抓取和跨设备已读状态,区分 OPML 迁移与完整数据库恢复。

·7 minDocker
BRNCHost:Bursa土耳其游戏服务器,1Gbps端口,DDoS防护
云服务器,积分可续期|雨云 · 国内外节点 · 积分兑换权益
RackNerd:海外VPS21.99美元每年起
晚安云:香港云服务器2核2G15元每月
野草云:香港200Mbps峰值带宽,不限月流量,30元每月起
大陆访问,精品线路|搬瓦工 · CN2 GIA / CTGNet 套餐
WorkBuddy:交代任务,交付文件
腾讯云:锐驰型200Mbps峰值带宽,中国内地2核2G50元每月
DMIT:Premium中国大陆优化线路CN2GIA
LisaHost:原生与住宅IP产品,按套餐选择
Evoxt:最高6.0GHz CPU,2.99美元每月起
京东云:AI进入真实业务

经常看的项目博客和更新说明散落在不同网站,逐个打开会把阅读变成反复检查。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 文档,抓取和账号初始化参数见 配置文档。