从想法到落地:搭建自己的 RSS 订阅聚合服务
目录
最近萌生了一个想法:做一个全平台订阅聚合软件。从市场调研到最终部署,整个过程让我重新认识了 RSS 的价值。
🎯 起因:时间被压缩了
打开手机,刷一会儿抖音、看一会儿 YouTube、翻一会儿今日头条……一个小时过去了,什么都没看到。
算法推荐一堆“可能感兴趣”的内容,其实大部分都是无意义的噪音。加上多个平台频繁切换,时间被切得更碎。真正想关注的东西,反而没时间看。
我想要的很简单:只看我真正关心的,其他的一概不要。
📊 市场调研:RSS 还活着吗?
带着这个想法做了一些调研,结果挺出乎意料:
RSS 阅读器市场现状
- 全球 RSS 阅读器市场 2023 年估值约 50 亿美元,预计以 7% CAGR 增长
- RSS 阅读器采用率同比增长 34%,隐私意识用户正在逃离算法推荐
- Feedly 拥有超过 1500 万用户
主流竞品
| 产品 | 类型 | 价格 |
|---|---|---|
| Feedly | 商业托管 | 免费/Pro $6/月 |
| Inoreader | 商业托管 | $1.67/月起 |
| NewsBlur | 开源 | $1/月 |
| FreshRSS | 开源自托管 | 免费 |
| Miniflux | 开源自托管 | 免费 |
为什么不做"账号绑定聚合"?
最初的想法是绑定用户在各平台(YouTube、今日头条等)的账号,自动同步订阅列表。技术上能做,但以我的角度看,这种产品的 ROI 非常低。
先满足我自己的需求再说。现有的 RSS 已经够用了:
- YouTube 有 RSS
- 播客有 RSS
- 博客有 RSS
- 抖音/今日头条?真正想订阅的内容……仔细想想,一个都没有 😂
既然 RSS 能覆盖我 90% 的需求,何必折腾那剩下的 10%?
🔧 技术选型:FreshRSS vs Miniflux
既然决定自托管,就得选一个靠谱的开源方案。主要对比了 FreshRSS 和 Miniflux:
| 维度 | FreshRSS | Miniflux |
|---|---|---|
| 后端语言 | PHP | Go |
| 数据库 | SQLite/MySQL/PostgreSQL | PostgreSQL only |
| API | Google Reader API + Fever API | 原生 REST API |
| 插件系统 | ✅ 丰富 | ❌ 无 |
| 网页抓取 | ✅ XPath 原生支持 | ⚠️ 需配合 RSS-Bridge |
| 许可证 | AGPL-3.0 | Apache 2.0 |
| 适合场景 | 功能丰富,多用户 | 极简主义,个人使用 |
最终选择 FreshRSS,因为:
- 功能更丰富,支持网页抓取
- 客户端生态更好
- 多用户支持完善(以后可以给家人用)
🚀 部署过程
服务器环境
手上有一台 Oracle Cloud 的免费 VPS:
- Ubuntu 20.04
- 1GB 内存
- 45GB 磁盘
安装 Docker
sudo apt-get update
sudo apt-get install -y docker.io docker-compose
sudo systemctl enable docker
sudo systemctl start docker
部署 FreshRSS
一行命令搞定:
docker run -d \
--name freshrss \
-p 8081:80 \
-v freshrss_data:/var/www/FreshRSS/data \
-v freshrss_extensions:/var/www/FreshRSS/extensions \
--restart unless-stopped \
freshrss/freshrss
配置 Nginx 反向代理
server {
listen 80;
server_name rss.yourdomain.com;
location / {
proxy_pass http://127.0.0.1:8081;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
配置 Cloudflare
- DNS 添加 A 记录:
rss→ 服务器 IP - 开启代理(橙色云朵)
- SSL/TLS 模式设为 灵活 (Flexible)
🔥 踩坑记录
坑 1:Oracle Cloud 防火墙
服务跑起来了,但外网访问不了。原来 Oracle Cloud 有两层防火墙:
- iptables(系统层):需要开放端口
- 安全组(云平台层):也需要开放端口
解决方案:
# iptables 开放端口
sudo iptables -I INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -I INPUT -p tcp --dport 8081 -j ACCEPT
同时在 Oracle Cloud 控制台的安全列表里添加入站规则。
坑 2:Cloudflare 523 错误
配置好 Cloudflare 后,访问域名报 523 (Origin is unreachable)。
原因:SSL 模式设成了 完全 (Full),Cloudflare 尝试用 HTTPS 连接源服务器,但服务器没有 SSL 证书。
解决方案:SSL 模式改成 灵活 (Flexible)。
坑 3:本地代理劫持 DNS
最诡异的问题:服务器一切正常,但浏览器就是打不开。
排查后发现是本地代理软件(Shadowrocket)劫持了 DNS,把域名解析到了假 IP。
解决方案:在代理规则里添加直连:
DOMAIN-SUFFIX,yourdomain.com,DIRECT
坑 4:订阅不自动刷新
部署完发现订阅源不会自动更新,必须手动刷新。
原因:FreshRSS 官方 Docker 镜像默认不启用自动刷新,需要通过环境变量 CRON_MIN 来配置。
解决方案:重新创建容器,加上 CRON_MIN 参数:
docker run -d \
--name freshrss \
-p 8081:80 \
-e CRON_MIN='*/15' \
-v freshrss_data:/var/www/FreshRSS/data \
-v freshrss_extensions:/var/www/FreshRSS/extensions \
--restart unless-stopped \
freshrss/freshrss
*/15 表示每 15 分钟自动刷新一次。数据存在 volume 里,重建容器不会丢失。
📱 客户端配置
FreshRSS 支持多种客户端通过 API 连接:
| 平台 | 客户端 |
|---|---|
| iOS/macOS | NetNewsWire |
| Android | Read You / FeedMe |
| Windows | Fluent Reader |
| Linux | NewsFlash |
NetNewsWire 配置
- 添加账户 → 选择 FreshRSS
URL:
https://rss.yourdomain.com - 用户名:FreshRSS 用户名
- 密码:API 密码(在 FreshRSS 设置 → 认证 里设置)
💡 RSS 源推荐
配置好后,开始添加订阅源。这里分享一些高质量的 RSS:
YouTube 频道
YouTube 频道的 RSS 格式:
https://www.youtube.com/feeds/videos.xml?channel_id=频道ID
找频道 ID:打开频道页面 → 右键查看源代码 → 搜索 channel_id
科技/AI
# Hacker News
https://hnrss.org/frontpage
# OpenAI
https://openai.com/blog/rss/
# Anthropic
https://www.anthropic.com/rss.xml
财经
# Bloomberg
https://feeds.bloomberg.com/markets/news.rss
# 36氪
https://36kr.com/feed
🎯 最大的收获
部署完成后,我把 YouTube 订阅导入了 FreshRSS。
100+ 订阅 → 筛选出真正想看的 → 只剩十几个
再看抖音关注列表,发现竟然一个都不想加到 RSS 里。
这就是 RSS 的价值:帮你认清什么才是真正重要的内容。
算法喂给你的,和你主动想追的,完全是两回事。
📝 总结
| 阶段 | 内容 |
|---|---|
| 调研 | RSS 市场活跃,自托管方案成熟 |
| 选型 | FreshRSS(功能丰富)> Miniflux(极简) |
| 部署 | Docker 一行命令,Nginx 反向代理,Cloudflare CDN |
| 踩坑 | 防火墙、SSL 模式、代理劫持 |
| 收获 | 信息过载 → 精简订阅 → 专注阅读 |
搭完之后,终于可以把时间花在真正想看的内容上了,而不是被算法牧着走。
优化人生,all in one 😄