夺回信息流:FreshRSS 自托管 + 手机同步,告别算法与限流
2026-08-16 · DevCraft Studio
在 1 GB 小内存 VPS 上用 Docker Compose 部署 FreshRSS,开 Google Reader API 接手机阅读器,配全文抓取扩展,建一个无广告无算法的信息中枢。中文圈少见的"小机实测 + 手机配置"完整教程。
延伸阅读
更多相关攻略推荐:2026 独立站 PCI-DSS 自查清单:SAQ A 还是 A-E、2026 只选月付 VPS:不锁年付、随时退的试错策略、2026 海外仓/ERP 系统自建部署:独立服务器还是云 VPS?、2026 实测:VPS 上自托管 AI 编程助手——Continue、【知识库自托管 02】2026 实测:VPS 自托管 Anythin。
为什么 2026 年还要自建 RSS
社媒的信息流早就不是"时间顺序"了,算法决定你看到什么,热门平台还动不动限流、改版、封号。RSS 这个老东西在 2026 年反而回潮,原因很简单:它把"看什么"的控制权还给你。你自己决定订阅哪些博客、频道、播客和 GitHub 发布,没有广告,没有推荐位,也没有"猜你喜欢"。
但 RSS 的痛点是工具。Google Reader 关了之后,市面上能用的托管服务要么收费、要么限源数、要么同步慢。FreshRSS 是目前最活跃的自托管阅读器,开源、AGPL 协议、更新频繁,关键是它内存占用只有 50–100 MB,在一台几十块钱一年的便宜 VPS 上就能跑得很欢。再加上它原生兼容 Google Reader API 和 Fever API,手机端各类阅读器直接连上来同步已读状态,体验跟商业产品没差。
选一台够用的便宜 VPS
FreshRSS 对硬件极其宽容,官方推荐的底线是 1 核 CPU、256 MB 内存,但 SQLite 方案稳定跑起来建议留 512 MB 以上可用内存,PostgreSQL 方案再多吃一两百 MB。所以一台 1 GB 内存的机器就完全够个人甚至小团队用了,配 10 GB 以上硬盘(主要是 SQLite 数据库和抓取的全文内容会慢慢长大)。
- RackNerd 的常规年付特价机经常是 1 GB 内存、年付十来美金,做这种轻量服务性价比很高。
- Cloudcone 按小时计费、可随时升级,适合先开最小机型试水,后面不够再扩容。
- Contabo 的入门款给的内存和硬盘都大,想顺手在同一台机上再跑点别的也很宽裕。
- Vultr 节点多、网络稳,如果你人在海外或想就近选机房,注册后按量开一台 1 GB 实例最省心。
系统选 Ubuntu 22.04 / 24.04 或 Debian 12 都行,只要能装 Docker 和 Docker Compose。装好后记得用 ufw allow 22,80,443 留好管理口,后面接反代再开 80/443。如果 VPS 商家给的是 IPv6 优先的机房,域名解析和证书申请都要保证 IPv4 也通,否则 Caddy 自动签证书会卡在验证这一步。
方案一:SQLite 轻量部署(个人首选)
个人使用、订阅源在几百个以内,直接用官方镜像的 SQLite 就够了,连数据库容器都不用起,最省心。先在 VPS 上建目录:
mkdir -p /opt/freshrss/data && cd /opt/freshrss写一份最简 docker-compose.yml:
services: freshrss: image: freshrss/freshrss:latest container_name: freshrss restart: unless-stopped ports: - "8080:80" environment: TZ: Asia/Shanghai CRON_MIN: 13,43 volumes: - ./data:/var/www/FreshRSS/data启动:docker compose up -d。等十几秒容器健康后,浏览器打开 http://你的IP:8080 走安装向导,数据库类型选 SQLite,设好管理员账号即可。这种方案我在一台 1 GB 的 RackNerd 上实测,空闲内存占用常驻 60 MB 出头,稳。
方案二:PostgreSQL 双容器(多人/多设备)
如果你要开多个账号,或者订阅源上千、抓全文后数据库涨得快,换 PostgreSQL 更稳。官方镜像支持,但建议用带 healthcheck 的方式等数据库真正就绪再起应用,避免首启连不上库的经典报错:
services: freshrss: image: freshrss/freshrss:latest container_name: freshrss restart: unless-stopped ports: - "8080:80" environment: TZ: Asia/Shanghai CRON_MIN: 13,43 volumes: - ./data:/var/www/FreshRSS/data depends_on: freshrss-db: condition: service_healthy freshrss-db: image: postgres:16-alpine container_name: freshrss-db restart: unless-stopped environment: POSTGRES_DB: freshrss POSTGRES_USER: freshrss POSTGRES_PASSWORD: 换成openssl rand -hex 32生成的强密码 volumes: - ./db:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U freshrss"] interval: 10s timeout: 5s retries: 5避坑点:POSTGRES_PASSWORD 只在数据库目录为空、首次初始化时才读取。如果你第一次忘了设、后来想改,必须清空 ./db 卷重来,直接改 compose 是没用的。所以一开始就生成强密码写死最省事。安装向导里数据库类型选 PostgreSQL,主机填 freshrss-db。
初始化配置与自动刷新踩坑
装好进后台第一件事:把时区、界面语言设好。然后关注"自动刷新"——FreshRSS 靠 CRON_MIN 这个环境变量驱动容器内 cron 去拉源。上面写 13,43 表示每小时第 13 和 43 分钟各拉一次,你也可以写 */15 每 15 分钟。验证它真在跑:
docker compose logs --tail=200 freshrss应该能看到周期性的刷新记录。避坑点:官方给了三种刷新方式(容器内 cron、宿主机 cron 调脚本、独立 cron 容器),只开一种,别三种一起上,重复刷新不会更快,只会让日志和排查变乱。想立刻强制刷新一批源,可执行:
docker exec --user www-data freshrss php /var/www/FreshRSS/app/actualize.php --feeds 20权限问题也是中文圈教程常漏的坑:bind mount 的 data 目录要属于容器内 www-data 用户(UID 33)。若安装向导报权限错,在宿主机执行 sudo chown -R 33:33 /opt/freshrss/data 再刷新页面即可。
开启 Google Reader API,手机同步
这是 FreshRSS 最香的卖点。它在 /api/greader.php 暴露了 Google Reader 兼容 API,手机 App 连上来就能双向同步已读、加星、分类。后台这样开:
- 设置 → 认证,勾选"允许 API 访问"。
- 设置 → 用户资料 → API 管理,单独设一个 API 密码(和登录密码分开,当 app token 用)。
- 到"API 检查"页面确认配置通过。
手机端推荐支持 Google Reader API 的客户端:iOS/macOS 上 Reeder 和 NetNewsWire 体验最好,后者免费开源;Android 上 FeedMe、Read You 都很顺手。添加账户时填三项:服务器地址 https://你的域名/api/greader.php、用户名、刚才的 API 密码。填完后你在手机上标记已读,网页端和别的设备立刻同步,体验完全不像"自己搭的"。
避坑点:不同 App 填法不同,有的只填根域名、有的要填完整 API 路径。登录失败先去后台"API 检查"页,它会直接告诉你服务器这侧哪里不对。另外 Fever API 在 /api/fever.php,老客户端才需要,能用 Google Reader API 就优先用它。
全文抓取与实用扩展
很多站点 RSS 只给摘要、逼你点进去,配个全文抓取扩展就解决了。FreshRSS 扩展放在 /var/www/FreshRSS/extensions(Docker 里就是挂出来的 extensions 目录)。最省事的办法是后台设置 → 扩展,直接浏览安装列表点装,再启用:
- Full-Text RSS / fulltextrss:抓取正文全文,摘要变完整文章,手机上不用再跳出去。
- Custom CSS:注入自己的样式,调字号、隐藏多余元素。
- Reddit Image / YouTube Embed:订阅 Reddit 和 YouTube 源时把图或视频内联显示。
- Reading Time:给每篇估算阅读时长。
扩展目录要随数据一起备份,不然重装后得重装扩展。列表里没有的扩展也能手动 git clone 进目录,目录名须是 xExtension-名字 且内含 metadata.json 和 extension.php。
迁移旧源、备份与更新
从别的阅读器搬家很简单:旧服务导出 OPML 文件,FreshRSS 后台"订阅 → 导入/导出 → 导入 OPML"一键导入,分类会自动保留。避坑点:别一次灌几千个源,旧 OPML 里常混着失效网站,首批先小批量测试,等一轮刷新确认没大问题再补全。
备份只要打包 data 目录(SQLite 数据库、订阅、已读状态全在里面),FreshRSS 用 WAL 模式,容器运行时直接 tar 也安全:
tar -czf /backup/freshrss-$(date +%Y%m%d).tar.gz /opt/freshrss/data用 cron 每天跑一次、保留两周即可;想更稳就 rclone 同步到另一台机器或对象存储。更新同样简单:docker compose pull && docker compose up -d,启动时会自动跑数据库迁移,更新前先打个备份最稳。
上 HTTPS:用反代把 8080 藏起来
直连 IP:8080 虽然能跑,但手机在外网同步、密码明文过网都不安心。最省事的是前面挡一层 Caddy,自动申请 Let's Encrypt 证书。一份最简 Caddyfile:
rss.example.com { reverse_proxy localhost:8080 }把域名 A 记录指向 VPS,caddy run 起来就会自动签证书、强制跳 HTTPS。Nginx 同理,加一段 proxy_pass http://127.0.0.1:8080 并配 proxy_set_header 即可。这样手机端填的服务器地址就变成 https://rss.example.com/api/greader.php,全程加密。避坑点:反代后 FreshRSS 若报"检测到不安全的 URL",要在后台设置里把站点地址改成 https 域名,否则生成的链接还会指向 http,手机端会反复跳转失败。
资源规划再细说
很多人纠结"1 GB 到底够不够"。实测数据是:FreshRSS 进程常驻 50–80 MB,PHP-FPM 加 nginx 容器内再吃几十 MB;SQLite 方案整机空闲常驻 120 MB 上下,PostgreSQL 方案多 150–250 MB。也就是说 1 GB 机型开完 FreshRSS 还剩大把内存,甚至能顺手跑个 Vaultwarden 或 Uptime Kuma。真正要盯的是 磁盘:开了全文抓取后,几千个源每天灌全文,数据库半年能涨到几百 MB甚至上 GB,所以定期清理旧文章(后台"配置 → 文章保留"设 3–6 个月)很关键,既省空间又让查询更快。
- 订阅源 500 个以内、单人:SQLite + 1 GB 内存,最省心。
- 订阅源 1000+ 或多人共用:PostgreSQL + 1–2 GB 内存,写入不再受单写锁限制。
- 全文抓取全开:磁盘预留 10 GB 以上,并设文章自动保留期。
- 只想自己用、怕被扫:可不上公网,用 Tailscale/WireGuard 组网约,手机走 VPN 同步,攻击面直接清零。