Docker 快速搭建 Miniflux + RssHub
- 实用技巧
- 2024-04-16
- 164热度
- 0评论
目录
相关工具和服务:
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
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 并保存
[参考][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 反向代理
- 在 Dashboard 页面中,点击
0 Proxy Host
卡片,添加反向代理。 - 在
Proxy Host
页面中,点击Add Proxy Host
按钮,弹出New Proxy Host
窗口。 - 在
New Proxy Host
窗口中,填写以下内容:Domain Names
:填写你的域名,例如miniflux.domain.com
。Scheme
:默认选择HTTP
。Forward Hostname / IP
:填写 Docker 容器的 IP,例如172.17.0.1
。Forward Port
:填写17025
。
- 切换到
SSL
选项卡,在SSL Certificate
选项中,选择Request a new SSL Certificate with Let's Encrypt
。- 打开
Force SSL
选项。 - 打开
HTTP/2 Support
选项。 - 同意
Let's Encrypt Terms of Service
。
- 打开
- 点击
Save
按钮,保存设置。(这里可能需要等待一段时间,等待证书生成) - 最后,点击自己刚刚添加的
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 推送设置
- 在 Telegram 中搜索
@BotFather
,并发送/start
按钮,进入 BotFather。 - 发送
/newbot
按钮,进入创建 Bot。 - 输入 Bot 的名称,例如
RSS Notification
。 - 输入 Bot 的用户名,例如
123wasdRSSPushbot
。 - 复制 Bot 的 Token (机器人令牌),例如
123456789:ABCDEF1234567890ABCDEF1234567890ABC
之后会用到。 - 在 Telegram 中搜索
@getidsbot
,并发送/start
按钮,获取 Chat ID。 - 复制 Chat ID (聊天 ID),例如
1234567890
之后会用到。 - 打开登录 Miniflux,点击
设置
标签,进入设置页面。 - 点击
集成
标签,进入集成页面。 - 将页面滚动到最下面,找到勾选
将新文章推送到 Telegram
选项并填写刚刚复制的机器人令牌
和Chat ID
。 - 点击
更新
按钮,保存设置。
之后,每当 Miniflux 有新文章时,都会通过 Telegram Bot 推送到你的 Telegram 账号。
注意:如果需要推送到群组或者频道, 需要将机器人添加到群组或者频道中,然后在群组或者频道中发送 /start
,获取当前 Chat ID。