Docker 快速搭建 Miniflux + RssHub


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

RSSHubDIYGod 开发维护的一个 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

1 - 安装 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 了。

2 - 安装 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 并保存

image.png
[参考][https://v2ex.com/t/963837#reply7]

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

  • 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

3 - 安装 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 已经安装成功。

4 - 安装 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 已经安装成功。

5 - 设置 NPM 反向代理

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

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

5.1 - 获取 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 的反向代理。

5.2 - 添加 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 反向代理设置成功。

5.3 - 添加 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 反向代理设置成功。

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

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

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

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

5.5 - (可选) 使用 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

5.6 - (可选) 使用 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

6 - 使用 Miniflux 订阅 RSS

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

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

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

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

7 - 使用 RSSHub 订阅 RSS

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

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

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

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

8 - 使用 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 插件了。

9 - 使用 Fever API 同步 RSS

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

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

10 - 在 Android 平台阅读

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

11 - 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。

12 - 总结