前言
一直使用 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 24.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-plugin -y
測試是否安裝成功
# 查看 Docker 版本
docker --version
# - 輸出
Docker version 27.0.0, build e92dd87
# 查看 Docker Compose 版本
docker compose --version
# - 輸出
Docker Compose version v2.27.0
將當前用戶加入 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 檔案之後,我們需要建立 compose.yml 檔案,用於啟動 Miniflux。
# 建立配置檔案
vim ~/docker/miniflux/compose.yml
# compose.yml
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
# 下載 compose.yml 檔案
wget https://raw.githubusercontent.com/DIYgod/RSSHub/master/compose.yml
# 檢查有無需要修改的配置
vim 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/compose.yml
編輯 compose.yml 檔案
# compose.yml
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,預設的用戶名 admin@example.com 密碼 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 反向代理
- 在 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 反向代理設定成功。
添加 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
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 也是一個不錯的選擇。
配置檔案如下:
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 推送設定
- 在 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。
總結
經過愉快的一番折騰,我們終於把可以暢快的使用自己的 RSS 服務了。
enjoy it!