使用 Miniflux 搭建自己的 RSS 服务

前言

一直使用 Inoreader 作为自己的 RSS 服务,但是最近发现 Inoreader 访问不是很稳定,有些 RSS 源的内容无法正常显示,正好看到 使用 Docker 和 Traefik v2 搭建 RSS 服务 - 苏洋博客用 Docker 和 Miniflux 搭建了自己的 RSS 服务,正好手上有一台闲置的白嫖云(甲骨文云)服务器,于是便动手实践了起来。

一些相关的工具和服务:

Miniflux: Frédéric Guillot 开发用 Go 语言开发维护的一个的开源极简风格的 RSS 服务,支持浏览器访问,支持 Telegram 推送,可以通过 Fever API 和与 Reeder(macOS)、FeedMe(Android) 等客户端同步订阅。

RSSHub: DIYGod 开发维护的一个 RSS 生成器,可以将一些网站的内容转换成 RSS 订阅源,配合 Miniflux 食用更佳。

RSSHub Radar: 同样由 DIYGod 开发维护。是一款 Chrome 插件,作为 RSSHub 的补充,可以将检测当前页面的 RSS 订阅源并一键添加到 Miniflux 中。

Telegram Bot: Telegram 的机器人服务,可以通过 Telegram Bot API 来与 Telegram 交互。

中文独立博客列表: 由 timqian 维护的一个 Github 仓库,收集了一些优质的中文独立博客的 RSS 订阅源。

Kill the Newsletter: 可以将 Email Newsletter 转换成 RSS 订阅源的服务。

FeedMe - Android: Android RSS App

Reeder - macOS: macOS RSS App

准备工作

  • 一个域名 (用于支持 HTTPS 访问,可使用二级域名)
  • 一台服务器 (本文用的甲骨文 x86 VPS,配置 1C1G)

系统环境

  • Ubuntu Server 20.04 LTS (x86_64)

安装 Docker & Docker Compose

为了方便管理,我们使用 Docker & Docker Compose 来部署 Miniflux 和 RSSHub 服务。

首先,我们需要安装 Docker 和 Docker Compose.

更新软件源

sudo apt update && sudo apt full-upgrade -y

安装 Docker

curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh

安装 Docker-Compose

sudo apt install docker-compose -y

测试是否安装成功

# 查看 Docker 版本
docker --version
# - 输出
Docker version 23.0.0, build e92dd87

# 查看 Docker Compose 版本
docker-compose --version
# - 输出
docker-compose version 1.29.2, build 5becea4c

将当前用户加入 docker 用户组 (省去 sudo 前缀)

# 将当前用户加入 docker 用户组
sudo usermod -aG docker $USER

# 修改守护进程绑定的套接字的权限,使其能够被 docker 分组访问
sudo chmod a+rw /var/run/docker.sock

# 重启 Docker 服务
sudo systemctl restart docker

# 测试是否成功
docker info

# 如果没有提示权限不足,说明成功

设置 Docker 开机启动

sudo systemctl enable docker

在安装 Docker & Docker Compose 之后,我们就可以开始安装 Miniflux 了。

安装 Miniflux

在安装 Miniflux 之前,我们需要在同目录下创建 .env 文件,用于存放环境变量。 例如: MiniFlux 的用户名、密码、数据库用户名、数据库密码等。

# - 创建目录
mkdir -p ~/docker/miniflux

# - 创建 env 文件
vim ~/docker/miniflux/.env
# Esc + :wq 退出 vim 并保存

注意: 请将下面的配置信息替换成你自己的配置信息。

# .env
# 数据库用户名
POSTGRES_USER=erica
# 数据库密码
POSTGRES_PASSWORD=erica1234
# Miniflux 用户名
MINIFLUX_USERNAME=erica
# Miniflux 密码
MINIFLUX_PASSWORD=rss1234
# Miniflux 访问地址
MINIFLUX_BASE_URL=https://miniflux.domain.com

在创建完 .env 文件之后,我们需要创建 docker-compose.yml 文件,用于启动 Miniflux。

# 创建配置文件
vim ~/docker/miniflux/docker-compose.yml
# docker-compose.yml
version: '3.4'
services:
  miniflux:
    image: miniflux/miniflux:latest
    container_name: miniflux
    restart: always
    ports:
      - "17025:8080"
    depends_on:
      - db
    environment:
      - POLLING_FREQUENCY=15
      - DATABASE_URL=postgres://${POSTGRES_USER}:${POSTGRES_PASSWORD}@db/$miniflux?sslmode=disable
      - BASE_URL=${MINIFLUX_BASE_URL}
      - RUN_MIGRATIONS=1
      - CREATE_ADMIN=1
      - ADMIN_USERNAME=${MINIFLUX_USERNAME}
      - ADMIN_PASSWORD=${MINIFLUX_PASSWORD}
    healthcheck:
      test: ["CMD", "/usr/bin/miniflux", "-healthcheck", "auto"]
  db:
    image: postgres:latest
    container_name: postgres
    restart: always
    environment:
      - POSTGRES_USER=${POSTGRES_USER}
      - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
    volumes:
      - miniflux-db:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD", "pg_isready", "-U", "miniflux"]
      interval: 10s
      start_period: 30s
volumes:
  miniflux-db:

# Esc + :wq 退出 vim 并保存

其中,我们需要注意的是:

  • ports:17025 端口是容器外部的端口,8080 则是容器内部的端口,可以根据自己的需要进行修改。
  • POLLING_FREQUENCY=15 :Miniflux 的轮询频率,这里我们设置为 15 分钟。

如果使用自己的数据库,可以将 db 服务注释掉,然后将 DATABASE_URL 的值修改为自己的数据库地址。

启动 Miniflux 容器

docker-compose up -d

测试是否安装成功 浏览器访问 Miniflux 的地址,如果能够正常访问,说明 Miniflux 已经安装成功。

# - 服务器中查看 IP 地址
curl -s https://icanhazip.com

在浏览器中输入 http://<IP>:17025,如果能够正常访问,说明 Miniflux 已经安装成功。

如果服务无法正常访问,请检查防火墙设置和云主机安全组设置。

参考资料:甲骨文网络安全组设置 - EN

安装 RRSHub

然后我们继续安装 RSSHub,最后再用 Nginx 来反向代理 RSSHub 和 Miniflux 服务。

# 创建目录
mkdir -p ~/docker/rsshub && cd ~/docker/rsshub
# 下载 docker-compose.yml 文件
wget https://raw.githubusercontent.com/DIYgod/RSSHub/master/docker-compose.yml
# 检查有无需要修改的配置
vim docker-compose.yml
# 创建 volume 持久化 Redis 缓存
docker volume create redis-data
# 启动 RSSHub,不带 -d 参数则会在前台输出日志方便检查
docker-compose up -d
# 查看 RSSHub 日志
docker-compose logs -f

测试是否安装成功 浏览器访问 RSSHub 的地址,如果能够正常访问,说明 RSSHub 已经安装成功。

# - 获取 IP 地址
curl -s https://icanhazip.com

在浏览器中输入 http://<IP>:1200,如果能够正常访问,说明 RSSHub 已经安装成功。

安装 Nginx Proxy Manager (NPM)

在安装启动 MiniFlux 和 RSSHub 之后,我们需要用 Nginx 来反向代理这两个服务,这样我们就可以通过域名来访问这两个服务了同时对服务进行 SSL 加密。

# 创建目录
mkdir -p ~/docker/npm && cd ~/docker/npm

# 创建配置文件
vim ~/docker/npm/docker-compose.yml

编辑 docker-compose.yml 文件

# docker-compose.yml
version: '3'
services:
  app:
    image: 'jc21/nginx-proxy-manager:latest'
    restart: unless-stopped
    ports:
      - '80:80'
      - '81:81'
      - '443:443'
    volumes:
      - ./data:/data
      - ./letsencrypt:/etc/letsencrypt

启动 Nginx Proxy Manager 容器

docker-compose up -d

测试是否安装成功 浏览器访问 NPM 的地址,如果能够正常访问,说明 NPM 已经安装成功。

# - 获取 IP 地址
curl -s https://icanhazip.com

在浏览器中输入 http://<IP>:81,如果能够正常访问,说明 NPM 已经安装成功。

设置 NPM 反向代理

登录 http://<IP>:81,默认的用户名 [email protected] 密码 changeme

登录后请务必修改默认邮箱和密码,邮箱将用于接收安全证书更新通知。

获取 Docker 容器的 IP

在我们设置反向代理之前,我们需要先获取 Docker 容器的 IP。

在终端中输入以下命令,获取 Docker 容器的 IP:

# 输入以下命令
ip addr show docker0
# 输出结果如下
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
    link/ether 02:42:a6:c8:15:72 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever

上面的 172.17.0.1 就是 Docker 容器的 IP。

接下来我们接着上面的步骤,设置 NPM 的反向代理。

添加 Miniflux 反向代理

  1. 在 Dashboard 页面中,点击 0 Proxy Host 卡片,添加反向代理。
  2. Proxy Host 页面中,点击 Add Proxy Host 按钮,弹出 New Proxy Host 窗口。
  3. New Proxy Host 窗口中,填写以下内容:
    • Domain Names:填写你的域名,例如 miniflux.domain.com
    • Scheme:默认选择 HTTP
    • Forward Hostname / IP:填写 Docker 容器的 IP,例如 172.17.0.1
    • Forward Port:填写 17025
  4. 切换到 SSL 选项卡,在 SSL Certificate 选项中,选择 Request a new SSL Certificate with Let's Encrypt
    • 打开 Force SSL 选项。
    • 打开 HTTP/2 Support 选项。
    • 同意 Let's Encrypt Terms of Service
  5. 点击 Save 按钮,保存设置。(这里可能需要等待一段时间,等待证书生成)
  6. 最后,点击自己刚刚添加的 miniflux.domain.com 链接,如果能够正常访问,说明 NPM 反向代理设置成功。

添加 RSSHub 反向代理

重复上面的步骤,添加 RSSHub 反向代理,填写以下内容:

  • Domain Names:填写你的域名,例如 rsshub.domain.com
  • Scheme:默认选择 HTTP
  • Forward Hostname / IP:填写 ‘Docker 容器的 IP’。
  • Forward Port:填写 1200
  • 切换到 SSL 选项卡,在 SSL Certificate 选项中,选择 Request a new SSL Certificate with Let's Encrypt
    • 打开 Force SSL 选项。
    • 打开 HTTP/2 Support 选项。
    • Email Address for Let's Encrypt:填写你的邮箱地址。
    • 同意 Let's Encrypt Terms of Service
  • 点击 Save 按钮,保存设置。(这里可能需要等待一段时间,等待证书生成)
  • 最后,点击自己刚刚添加的 rsshub.domain.com 链接,如果能够正常访问,说明 NPM 反向代理设置成功。

验证反向代理设置是否成功

✅ 通过 https://miniflux.domain.com 访问 Miniflux,如果能够正常访问,说明 NPM 反向代理设置成功。

✅ 通过 https://rsshub.domain.com 访问 RSSHub,如果能够正常访问,说明 NPM 反向代理设置成功。

✅ 设置 NPM 反向代理后建议在云主机安全组中关闭对应端口的访问权限,以防止被恶意访问。

(可选) 使用 Caddy 反向代理

如果你不想使用 NPM 来反向代理,也可以使用 Caddy 来反向代理。

配置文件如下:

vim caddyfile
miniflux.example.org
reverse_proxy miniflux:17025
version: '3.4'
services:
  caddy:
    image: caddy:2
    container_name: caddy
    depends_on:
      - miniflux
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - $PWD/Caddyfile:/etc/caddy/Caddyfile
      - caddy_data:/data
      - caddy_config:/config
  miniflux:
    image: ${MINIFLUX_IMAGE:-miniflux/miniflux:latest}
    container_name: miniflux
    depends_on:
      - db
    environment:
      - DATABASE_URL=postgres://miniflux:secret@db/miniflux?sslmode=disable
      - RUN_MIGRATIONS=1
      - CREATE_ADMIN=1
      - ADMIN_USERNAME=admin
      - ADMIN_PASSWORD=test123
      - BASE_URL=https://miniflux.example.org
  db:
    image: postgres:15
    container_name: postgres
    environment:
      - POSTGRES_USER=miniflux
      - POSTGRES_PASSWORD=secret
    volumes:
      - miniflux-db:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD", "pg_isready", "-U", "miniflux"]
      interval: 10s
      start_period: 30s
volumes:
  miniflux-db:
  caddy_data:
  caddy_config:

Source: caddy.yml - github

(可选) 使用 traefik 反向代理

如果你不想使用 NPM 来反向代理,traefik 也是一个不错的选择。

配置文件如下:

version: '3.4'
services:
  traefik:
    image: "traefik:v2.3"
    container_name: traefik
    command:
      - "--providers.docker=true"
      - "--providers.docker.exposedbydefault=false"
      - "--entrypoints.websecure.address=:443"
      - "--certificatesresolvers.myresolver.acme.tlschallenge=true"
      - "--certificatesresolvers.myresolver.acme.email=postmaster@example.com"
      - "--certificatesresolvers.myresolver.acme.storage=/letsencrypt/acme.json"
    depends_on:
      - miniflux
    ports:
      - "443:443"
    volumes:
      - "./letsencrypt:/letsencrypt"
      - "/var/run/docker.sock:/var/run/docker.sock:ro"
  miniflux:
    image: ${MINIFLUX_IMAGE:-miniflux/miniflux:latest}
    container_name: miniflux
    depends_on:
      - db
    expose:
      - "8080"
    environment:
      - DATABASE_URL=postgres://miniflux:secret@db/miniflux?sslmode=disable
      - RUN_MIGRATIONS=1
      - CREATE_ADMIN=1
      - ADMIN_USERNAME=admin
      - ADMIN_PASSWORD=test123
      - BASE_URL=https://miniflux.example.org
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.miniflux.rule=Host(`miniflux.example.org`)"
      - "traefik.http.routers.miniflux.entrypoints=websecure"
      - "traefik.http.routers.miniflux.tls.certresolver=myresolver"
  db:
    image: postgres:15
    container_name: postgres
    environment:
      - POSTGRES_USER=miniflux
      - POSTGRES_PASSWORD=secret
    volumes:
      - miniflux-db:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD", "pg_isready", "-U", "miniflux"]
      interval: 10s
      start_period: 30s
volumes:
  miniflux-db:

Source: traefik.yml - github

使用 Miniflux 订阅 RSS

语言设置:登录 Miniflux 后,点击 Settings,在 Language 选项中,选择 简体中文,点击页面最底的 Save 按钮,保存设置。

文章排序:在同一个页面,在 文章排序 标签下,选择 新->旧,点击页面最底的 Save 按钮,保存设置。

添加新源:在网页上方,找到 源(+) 标签后,点击 + 标签,输入 https://pinw.ca/zhs/index.xml, 点击蓝色 查找源 按钮,稍等片刻,Miniflux 会自动获取该 RSS 的信息并添加到订阅列表中。

注意:上面的 https://pinw.ca/zhs/index.xml本人博客 的 RSS 地址,欢迎订阅。

使用 RSSHub 订阅 RSS

虽然 Miniflux 的体验很好,但是它只能订阅 RSS 源,无法订阅其他类型的内容,例如 Bilibili、YouTube 等。这时候,我们就需要 RSSHub 来帮助我们订阅其他类型的内容。

订阅 Bilibili 打开 RSSHub,在搜索框中输入 bilibili,点击 Bilibili->UP主动态

订阅 YouTube 打开 RSSHub,在搜索框中输入 youtube,点击 YouTube->用户

记得将 rsshub.domain.com 替换成刚刚为刚刚设置的反向代理域名

使用 RSSHub Radar 订阅 RSS

虽然 RSSHub 提供了很多路由规则,但是每次都要打开 RSSHub 来搜索查找对应的路由很不方便。这时候,我们就需要一个工具来帮助我们发现 RSSHub 提供的路由。

RSSHub Radar 是RSSHub 作者 DIYgod 开发的一个 Chrome 插件,可以帮助我们快速发现当前网站的 RSS 路由规则。

  • 点击 RSSHub Radar - Chrome Extension 下载安装 RSSHub Radar 插件。
  • 点击 RSSHub Radar 插件图标,点击 设置 按钮,进入设置页面。
  • 常规设置中,填写自定义 RSSHub 域名rsshub.domain.com
  • 一键订阅设置中,勾选开启填写自定义 Miniflux 域名miniflux.domain.com

接下来,我们就可以在任意网站中使用 RSSHub Radar 插件了。

使用 Fever API 同步 RSS

Fever API 是一个 RSS 同步协议,可以通过 Fever API 同步 (只读不写) RSS 到其他 RSS 阅读器,比如 FeedMe 等。

  • 点击 设置 按钮,进入设置页面。
  • 点击 集成 按钮,进入集成页面。
  • 勾选 启用 Fever API 选项并填写 Fever 用户名Fever 密码
  • 点击 更新 按钮,保存设置。

在 Android 平台阅读

FeedMe 是一款 Android 平台的 RSS 阅读器,可以使用 Fever API 同步 Miniflux 的 RSS。

Telegram Bot 推送设置

  1. 在 Telegram 中搜索 @BotFather,并发送 /start 按钮,进入 BotFather。
  2. 发送 /newbot 按钮,进入创建 Bot。
  3. 输入 Bot 的名称,例如 RSS Notification
  4. 输入 Bot 的用户名,例如 123wasdRSSPushbot
  5. 复制 Bot 的 Token (机器人令牌),例如 123456789:ABCDEF1234567890ABCDEF1234567890ABC 之后会用到。
  6. 在 Telegram 中搜索 @getidsbot,并发送 /start 按钮,获取 Chat ID。
  7. 复制 Chat ID (聊天 ID),例如 1234567890 之后会用到。
  8. 打开登录 Miniflux,点击 设置 标签,进入设置页面。
  9. 点击 集成 标签,进入集成页面。
  10. 将页面滚动到最下面,找到勾选 将新文章推送到 Telegram 选项并填写刚刚复制的 机器人令牌Chat ID
  11. 点击 更新 按钮,保存设置。

之后,每当 Miniflux 有新文章时,都会通过 Telegram Bot 推送到你的 Telegram 账号。

注意:如果需要推送到群组或者频道, 需要将机器人添加到群组或者频道中,然后在群组或者频道中发送 /start ,获取当前 Chat ID。

总结

经过愉快的一番折腾,我们终于把可以畅快的使用自己的 RSS 服务了。

enjoy it!

参考


最后修改于 2023-02-03


感谢您的支持 :D