FreshRSS 是一套以 PHP 撰寫、AGPL-3.0 授權的自架 RSS 閱讀器:它把散落各站的 RSS/Atom 摘要集中到自己的伺服器上,支援多使用者、手機 App 同步(Google Reader API 與 Fever API)、內建 XPath 網頁抓取,官方 Docker 映像一行指令就能啟動,GitHub 上約 1.6 萬顆星、專案從 2012 年活躍至今。
為什麼 2026 年還要重新學 RSS?
RSS 這個 1999 年誕生的協定,這幾年反而變成「反演算法」的實用工具:它不排序、不推薦、不插入廣告,只是把你有訂閱的內容按時間排好。電子前哨基金會(EFF)在 2026 年就寫過專文,主張 RSS 是拿回資訊主導權最便宜的手段之一。
但同時,平台也在關門。Reddit 在 2026 年 9 月 30 日宣布,站上 RSS 摘要將於 11 月 13 日終止、公開 API 於 2027 年 3 月全面關閉(完整時間表與社群反應可看這篇:Reddit 終止 RSS 與公開 API 全解析)。這件事的關鍵啟示是:RSS 協定不會死,但你依賴的「別人家的 feed」隨時會消失。
把閱讀器拿回自己手上,就變成一件很划算的事——來源清單、閱讀紀錄、未讀狀態全部在自家伺服器,平台改政策時你只需要改一個來源設定,而不是整套工作流重寫。
FreshRSS 是什麼?核心規格一次看
| 項目 | 內容 |
|---|---|
| 專案 | FreshRSS/FreshRSS |
| GitHub 星數 | 約 16,187 顆(2026-09-30 查詢) |
| 授權 | AGPL-3.0(自由軟體,可自架、可商用) |
| 最新穩定版 | 1.30.0(2026-09-09 發布,約每 2~3 個月一版) |
| 語言/技術 | PHP 8.1+(官方也提供 Docker 映像,免自己裝 PHP) |
| 資料庫 | SQLite/PostgreSQL 10+/MariaDB 10.6+/MySQL 8.0+ |
| 網頁伺服器 | Apache 2.4+(官方推薦)、nginx、lighttpd |
| 介面語言 | 20+ 種,繁體中文(zh-TW)翻譯進度 97% |
| 多使用者 | 支援,含匿名閱讀模式、OpenID Connect 登入 |
| 手機同步 | Google Reader API(功能最完整)/Fever API(相容性廣但較受限) |
| 特殊能力 | 內建 XPath 網頁抓取、JSON 來源、WebSub 即時推播、CLI |
| 硬體需求 | 極低:官方稱連 Raspberry Pi 1 都能跑 150 個來源、22,000 篇文章,回應時間低於 1 秒 |
如果你是從 Feedly、Inoreader 這類商業服務搬過來,FreshRSS 的功能覆蓋率其實很高;比較表放在下一節。
FreshRSS vs Miniflux vs Inoreader
自架派與 SaaS 派最大的差別不在功能,而在「誰持有你的訂閱清單」。以下是 2026-09-30 查證的現況:
| 比較項目 | FreshRSS | Miniflux | Inoreader(商業 SaaS) |
|---|---|---|---|
| 授權 | AGPL-3.0 | Apache-2.0 | 專有 |
| GitHub 星數 | 約 16,187 | 約 9,761 | — |
| 技術棧 | PHP 8.1+ | Go(單一執行檔) | 雲端服務 |
| 最新版 | 1.30.0(2026-09) | 2.3.3(2026-07) | 持續更新 |
| 自架 | 可(Docker/手動/YunoHost) | 可(Docker/二進位) | 不可 |
| 多使用者 | 支援 | 支援 | 帳號制 |
| 手機 App 生態 | Google Reader API/Fever,App 選擇多 | Google Reader API/Fever | 官方 App |
| 網頁抓取(無 RSS 網站) | 內建 XPath + JSON 來源 | 需搭配第三方(如 RSSHub) | Pro 方案內建 Web feeds |
| 費用 | 自架成本(一台 VPS 或 NAS) | 自架成本 | 免費版 150 個來源;Pro $7.50/月(年繳,月繳 $9.99) |
| 中文介面 | zh-TW 97% | 社群翻譯 | 有 |
簡單的選型原則:
- 要功能最完整、擴充套件最多、介面可玩性高 → FreshRSS
- 要極簡、省資源、只要一個執行檔 → Miniflux
- 完全不想維運、願意付月費 → Inoreader(或 Feedly 等同類服務)
FreshRSS 與 Miniflux 都支援同一組 API,所以手機 App 是可以沿用的,未來想換後端也不必換 App。
Docker Compose 部署(推薦做法)
FreshRSS 官方提供 Docker 映像 freshrss/freshrss(Docker Hub)與 ghcr.io/freshrss/freshrss(GitHub Container Registry),標籤分 :latest(最新穩定版)、:edge(滾動更新)與 :x.y.z(指定版本)。
官方檔案 Docker/freshrss/docker-compose.yml 的骨架如下(這裡把時區換成 Asia/Taipei、補上對外埠與環境變數):
volumes:
data:
extensions:
services:
freshrss:
image: freshrss/freshrss:latest
container_name: freshrss
hostname: freshrss
restart: unless-stopped
logging:
options:
max-size: 10m
ports:
- "8080:80"
volumes:
- data:/var/www/FreshRSS/data
- extensions:/var/www/FreshRSS/extensions
environment:
TZ: Asia/Taipei # 伺服器時區,預設 UTC
CRON_MIN: '3,33' # 每小時的第 3、33 分鐘自動抓取來源
TRUSTED_PROXY: 172.16.0.0/12 192.168.0.0/16
啟動:
docker compose up -d
docker compose logs -f freshrss
幾個關鍵環境變數的意義:
TZ:影響文章時間顯示與 cron 判斷,台灣請設Asia/TaipeiCRON_MIN:容器內建排程,'3,33'代表每小時抓兩次;尖峰時段抓太兇會被來源站擋,想更保守可設'17'(每小時一次)TRUSTED_PROXY:放在反向代理後面時,讓 FreshRSS 正確讀到訪客真實 IP(否則 log 只會看到代理的 IP)INTERNAL_HOST_ALLOWLIST:預設會擋掉容器對內網的請求,若你要讓 FreshRSS 去抓同一台主機上的 RSS-Bridge 或 RSSHub(例如rsshub:1200),要明確加入白名單
如果你只想先試跑,官方也提供 docker run 一行版:
docker run -d --restart unless-stopped --log-opt max-size=10m \
-p 8080:80 \
-e TZ=Asia/Taipei \
-e CRON_MIN=1,31 \
-v freshrss_data:/var/www/FreshRSS/data \
-v freshrss_extensions:/var/www/FreshRSS/extensions \
--name freshrss \
freshrss/freshrss
啟動後打開 http://你的主機:8080,就會進入安裝精靈,選擇資料庫(單人自用建議 SQLite,省一個容器)並建立管理員帳號。
用 CLI 安裝(無瀏覽器環境)
不想開瀏覽器,也可以用容器內的 CLI 完成安裝與建帳號:
docker exec --user www-data freshrss cli/do-install.php --default-user freshrss
docker exec --user www-data freshrss cli/create-user.php --user freshrss --password 'YOUR_STRONG_PASSWORD'
docker exec --user www-data freshrss cli/list-users.php
注意:若使用以 Alpine 為基礎的映像標籤,
--user www-data要換成--user apache。另外官方 compose 內建的 healthcheck 用的也是 CLI:cli/health.php。
首次設定:介面中文化與來源匯入
- 登入後到 Settings → Display,把語言切成「正體中文(zh-TW)」,介面翻譯覆蓋率約 97%。
- 到 訂閱管理 新增來源:直接貼上網站首頁或 feed 網址,FreshRSS 會自動偵測。
- 從舊服務搬家:在 Feedly/Inoreader/其他閱讀器匯出 OPML 檔,FreshRSS 支援整批匯入與匯出,來源清單不會被鎖死。
台灣中文來源實測可用(2026-09-30 以 curl 驗證回應 200 且為 XML):
- iThome:
https://www.ithome.com.tw/rss - 科技新報:
https://technews.tw/feed - 泛科學:
https://pansci.asia/feed - INSIDE(FeedBurner 代管):
https://feeds.feedburner.com/inside
其餘媒體的 feed 路徑時有變動,建議以各站公告為準;找不到 RSS 的網站,就看下一節的網頁抓取。
手機同步:Google Reader API 與 App 選擇
FreshRSS 支援兩套 API:Google Reader API(功能最完整,官方建議)與 Fever API(相容舊 App,功能與效率較受限)。啟用步驟:
- 到 設定 → 認證,勾選「允許 API 存取(手機 App 需要)」
- 到 設定 → 個人資料,設定 API 密碼(與登入密碼分開,萬一洩漏影響範圍較小)
- 點 API 密碼旁的
/api/連結測試設定;若出現Bad Request!通常是伺服器不接受%2F,Apache 要開AllowEncodedSlashes On,nginx 則檢查fastcgi_split_path_info
官方維護的 App 相容清單裡,常用的幾套:
| App | 平台 | 授權 | API | 特色 |
|---|---|---|---|---|
| Capy Reader | Android | 開源 | GReader | 同步快、支援 Podcast 與資料夾管理 |
| Read You | Android | 開源 | GReader | Material You 介面,輕巧 |
| FeedMe | Android | 免費 | GReader | 老牌、穩定、支援 Podcast |
| RSS Guard | Windows/Linux/macOS | 開源 | GReader | 跨平台桌面版,功能齊全 |
| Newsboat | Linux/macOS | 開源 | GReader | 終端機派,鍵盤操作最快 |
| Reeder Classic | iOS/macOS | 商業 | GReader | Apple 生態圈體驗最佳之一 |
| NetNewsWire | iOS/macOS | 開源 | GReader | 免費、原生感強 |
| Unread / Fiery Feeds | iOS | 商業 | Fever | 支援 Fever API 的閱讀體驗派 |
若手機要從外網連回自架服務,記得搭配 HTTPS 與反向代理,站上既有的 Caddy 完整教學 2026(自動 HTTPS)與 Cloudflare Tunnel 完整教學 2026(不開 port 也能對外)都是現成做法。
進階功能一:XPath 抓沒有 RSS 的網站
FreshRSS 內建網頁抓取引擎,可在「訂閱管理」把來源類型改成:
- HTML + XPath(Web scraping):自己指定標題、連結、內容的 XPath
- JSON Feed:符合 jsonfeed.org 規格的來源
- JSON(Dotted paths):用
data.items、meta.title、links[1]這種點號路徑取值,語法近似 JavaScript 的物件存取
這代表沒有官方 RSS 的網站,也能變成 feed,而且是在你自己的伺服器上轉換,不必把來源交給第三方服務。社群也整理了可共用的 XPath 設定範例集,可直接匯入使用。
進階功能二:WebSub 即時推播
一般 RSS 閱讀器靠「定時去抓」更新,延遲等於抓取間隔。WebSub(舊稱 PubSubHubbub)則是推播式:來源站有新內容時,透過 hub 主動通知你的 FreshRSS,幾乎即時收到。FreshRSS 原生支援,條件是:
- 實例必須有公開可達的網址(
base_url設定正確),且./p/api/需對外開放 data/config.php內應出現'pubsubhubbub_enabled' => true- 支援 WebSub 的來源包含 WordPress(含外掛)、Blogger、Medium、Friendica 等
想自架的部落格也能反過來受益:在 CMS 掛上 WebSub 外掛,讀者的閱讀器就能在你發文當下收到通知,不必等下一次抓取。
進階功能三:擴充套件
FreshRSS 的擴充套件放在安裝目錄的 ./extensions(Docker 版對應 freshrss_extensions volume),官方社群整理了相當完整的清單,幾個實用的:
| 擴充套件 | 功能 |
|---|---|
| Readable / Article Full Text | 用 Mozilla Readability 抓回全文,解決「只給摘要」的來源 |
| Image Cache | 把來源圖片快取到自家或 Cloudflare,避免原站關圖或追蹤 |
| Youtube / Invidious | 在閱讀器內直接看 YouTube 影片,Invidious 版本還可去追蹤 |
| ArticleSummary / Feed Digest | 串接 OpenAI 相容的 LLM API,自動產生文章摘要 |
| Rate limiter | 限制對同一網站的抓取頻率,避免被來源站封鎖 |
| RSS-Bridge | 透過 RSS-Bridge 偵測並轉換沒有 feed 的網址 |
| Copy 2 Clipboard | 一鍵複製目前可見文章的所有連結 |
| Share To Linkwarden | 把文章直接送到自架的 Linkwarden 書籤服務 |
| TranslateTitlesCN | 用 DeepLX 或 Google 翻譯把外語標題轉成中文 |
要注意的是擴充套件多半由社群維護,升級 FreshRSS 主版本前建議先看相容性;官方另有一支 check.translation.php 之類的 CLI 可用來檢查環境。
安全性、備份與更新
安全設定:
- 手動安裝時只暴露
./p/目錄,./data/內含所有個人資料(訂閱、閱讀紀錄、密碼雜湊),絕不可公開 - 一律走 HTTPS;放在反向代理後面時設定
TRUSTED_PROXY,並確認 proxy 有傳X-Forwarded-* - 預設的 SSRF 防護(不要在
INTERNAL_HOST_ALLOWLIST填*)能避免 FreshRSS 被拿來探測內網 - API 密碼與主密碼分開設定,並啟用失敗登入延遲
備份:Docker 版只要備份 data volume(內含 SQLite 資料庫、每位使用者的 config.php 與 log*.txt)與 extensions volume;再用介面的 OPML 匯出留一份來源清單當人肉保險。
# 匯出資料 volume 內容(同時保留權限)
docker run --rm -v freshrss_data:/src -v $(pwd):/backup alpine \
tar czf /backup/freshrss-data-$(date +%F).tar.gz -C /src .
更新:
docker compose pull && docker compose up -d
FreshRSS 每 2~3 個月發一版,重大版本升級前先備份;若要嘗鮮功能可用 :edge 標籤,但正式環境建議留在 :latest。
常見問題
| 症狀 | 原因與解法 |
|---|---|
手機 App 連不上,回 Bad Request! | Apache 未開 AllowEncodedSlashes On;nginx 檢查 fastcgi_split_path_info |
一直顯示 FAIL getallheaders! | Apache 缺 mod_setenvif 或 mod_rewrite(Debian/Ubuntu:a2enmod rewrite) |
| 來源時間排序怪怪的 | 右側時間是來源宣告的發佈時間,不是 FreshRSS 收到文章的時間,也不作為排序依據 |
| 想抓內網的 RSS-Bridge / RSSHub | 需在 INTERNAL_HOST_ALLOWLIST 加入主機名稱或 CIDR |
| 資源佔用如何? | 極低:官方稱 Raspberry Pi 1 跑 150 個來源、2.2 萬篇文章,回應時間低於 1 秒 |
同場加映:自架服務的整合劇本
FreshRSS 放進既有的自架架構後,常見的組合是:
- 用 Cloudflare Tunnel 或 Caddy 提供 HTTPS 對外入口
- 用 Uptime Kuma 監控 FreshRSS 的可用性,掛掉時收 Telegram 通知
- 用 Coolify 或 Proxmox VE 統一管理容器與主機
- 帳號密碼交給 Vaultwarden 保管,來源清單用 Nextcloud 存放 OPML 備份
- 想把「抓到的文章」再餵給 AI 處理,可參考 n8n 完整教學 2026 串接自動化流程
結語
FreshRSS 的價值不在功能清單有多長,而在它把「資訊入口」的主導權還給你:來源自己加、資料自己存、App 自己選、政策變動時不用求平台。在平台紛紛收緊 RSS 與 API 的 2026 年,這種「自帶基礎設施」的選擇,比任何單一功能都更值得投資。
