公众号、App 信息流越刷越杂,真正想追的博客、技术周刊、开源项目更新却经常被算法淹没。开源项目 FreshRSS 是一款老牌的自托管 RSS 阅读器 / 聚合器:把想看的站点订阅进来,按分类集中阅读,没有推荐算法、没有广告,Docker 一条命令就能跑起来,自带简体中文界面,还兼容 Google Reader / Fever API,手机上用 Reeder、FeedMe、Fluent Reader 等客户端同步阅读。
协议为 AGPL-3.0,个人自用完全免费。项目持续活跃(GitHub 16000+ Star),本文实测版本 1.30.4(2026-10 发布)。默认用 SQLite 存储,单用户几十 MB 内存即可,小内存 VPS、NAS、树莓派都能轻松跑;多人使用也可以换成 PostgreSQL / MySQL。
技术栈:PHP 8 · Apache · SQLite / PostgreSQL / MySQL · Cron 定时抓取 · Docker 一键部署
你将得到什么
- 三种阅读视图:普通列表、全局总览(按分类分块)、沉浸式阅读视图,支持键盘快捷键
- 订阅源按分类管理,支持 RSS / Atom / JSON Feed,也能用 XPath / CSS 选择器把没有 RSS 的网页「做成」订阅源
- OPML 导入导出,从 Feedly、Inoreader、Tiny Tiny RSS 等迁移很方便
- 收藏、标签、自定义查询、全文搜索、按关键字自动标记已读 / 过滤
- 统计页:已读 / 未读、每日文章数、分类占比、「长时间未更新」与「空闲订阅源」检查
- Google Reader / Fever API,配合手机 / 桌面客户端同步阅读进度
- 多用户、主题切换、社区扩展(AI 摘要、全文抓取、自动刷新等)
- 演示只监听
127.0.0.1,不直接暴露公网
环境要求
- 已安装 Docker(含 Compose 插件)的 Linux / macOS / Windows,镜像同时提供 x86 与 ARM
- 单用户 SQLite 模式内存占用很小;订阅较多、多人共用时建议外接 PostgreSQL
- 容器内 Web 端口为
80,示例映射到本机8383
官方仓库:github.com/FreshRSS/FreshRSS,文档:freshrss.github.io/FreshRSS。本文实机镜像为 freshrss/freshrss:latest(1.30.4)。
第一步:Docker Compose 启动
新建目录写入 docker-compose.yml。端口只绑定本机,对外由反向代理(Nginx/Caddy/1Panel 的 OpenResty)提供 HTTPS。CRON_MIN 表示每小时第几分钟自动抓取订阅;FRESHRSS_INSTALL / FRESHRSS_USER 两个变量可以在首次启动时自动完成安装并创建管理员,省去网页安装向导(不想写在文件里也可以删掉,首次打开网页按向导走):
mkdir -p ~/freshrss && cd ~/freshrss
# docker-compose.yml
services:
freshrss:
image: freshrss/freshrss:latest
container_name: freshrss
restart: unless-stopped
ports:
- "127.0.0.1:8383:80"
environment:
TZ: Asia/Shanghai
CRON_MIN: "3,33" # 每小时 03 分、33 分各抓取一次
FRESHRSS_INSTALL: |-
--api-enabled
--base-url https://rss.example.com
--default-user admin
--language zh-CN
FRESHRSS_USER: |-
--user admin
--password 改成你的强密码
--api-password 改成单独的API密码
--email you@example.com
--language zh-CN
volumes:
- ./data:/var/www/FreshRSS/data
- ./extensions:/var/www/FreshRSS/extensions
docker compose up -d
docker logs -f freshrss # 看到 “FreshRSS successfully installed” 和 Apache 启动即可
不用 Compose 的话,一条 docker run 也行(首次打开网页走安装向导):
docker run -d --name freshrss --restart unless-stopped \
-p 127.0.0.1:8383:80 -e TZ=Asia/Shanghai -e CRON_MIN=3,33 \
-v ./data:/var/www/FreshRSS/data \
-v ./extensions:/var/www/FreshRSS/extensions \
freshrss/freshrss:latest
第二步:登录
打开 http://127.0.0.1:8383(或你的域名)进入登录页,用上面创建的账号登录。界面语言已经是简体中文,后续也可以在「设置 → 显示」里随时切换:

第三步:导入订阅源
新装好的 FreshRSS 只有一个官方 Releases 订阅。点左上角「订阅管理 → 添加订阅源或分类」,粘贴站点地址或 RSS 地址即可添加,FreshRSS 会自动发现网页里的 Feed;也能先建好「科技资讯」「技术博客」「开源动态」这样的分类再归档:

如果之前在别的阅读器里有订阅,直接到「导入 / 导出」上传 OPML 文件,一次性搬过来;导出时还能连同收藏、标签文章一起打包备份:

「订阅管理」页按分类展示所有订阅源,可以拖拽调整分类,点小齿轮单独设置每个源的抓取频率、保留策略和过滤规则:

第四步:日常阅读
首页是最常用的「普通视图」:左侧是首页、重要的订阅、收藏和各分类(带未读数),右侧按时间倒序列出文章,未读标红、星标为收藏,顶部可以切换只看未读、标记已读、切换视图:

点开标题会在列表里就地展开全文,读完自动标为已读,按 j / k 就能上下翻篇:

「全局视图」把每个分类做成一个卡片,适合订阅多的时候先扫一眼哪里有更新:

「阅读视图」去掉侧栏和列表,只留正文,长文读起来更舒服:

第五步:统计与订阅体检
「主要统计数据」会列出总文章数、已读 / 未读 / 收藏数量,以及文章最多的前十个订阅源;往下是近 30 天每日文章数、各分类订阅源数和文章数占比,方便判断哪些源太吵、哪些可以退订:


第六步:显示设置与扩展
「设置 → 显示」可以切换语言、时区、主题(内置 Origine、Nord、暗色等多套)、内容宽度和图标显示;「阅读」里可以设置默认视图、每页文章数、滚动自动标记已读等:

「扩展」页内置社区扩展列表,像 AI 摘要、Readability 全文抓取、自动刷新、YouTube 嵌入等都能一键安装;也可以直接写 User CSS / User JS 微调界面:

配置说明:手机 / 桌面客户端同步
- 在「设置 → 认证」中允许 API 访问(本文的
--api-enabled已开启),再到「账户」页设置一个单独的 API 密码(不要与登录密码相同)。 - Google Reader API 地址:
https://你的域名/api/greader.php,适用于 Reeder、FeedMe、FocusReader、Fluent Reader、NetNewsWire 等;Fever API 地址:https://你的域名/api/fever.php。 - 没有 RSS 的网站:添加订阅时「订阅源类型」选「HTML + XPath」或「JSON + 点号」,按页面结构写规则即可生成订阅。
- 抓取频率由
CRON_MIN控制,也可以在每个订阅源里单独设置「刷新间隔」,避免对小站点请求过于频繁。
安全与运维建议
- 端口不要直接映射到 0.0.0.0。教程用的是
127.0.0.1:8383,对外走带证书的反向代理,并把--base-url改成 https 域名;只自己用的话放在内网 / Tailscale / WireGuard 里更省心。 - 单人使用时到「管理 → 系统配置」把「最大注册用户数」保持为 1,不要开放注册。
- 备份:定期打包
./data(包含配置和每个用户的db.sqlite),或者在「导入 / 导出」里导出 OPML + 收藏。 - 反向代理在子路径或启用了 HTTPS 时,记得设置
TRUSTED_PROXY环境变量,让 FreshRSS 正确识别客户端 IP 与协议。 - 升级:
docker compose pull && docker compose up -d,升级前先备份./data。 - 演示用完可删:
docker compose down && rm -rf ./data ./extensions。
小结
FreshRSS 把「自己决定看什么」这件事还给了读者:订阅、分类、已读同步、统计和扩展都齐全,中文界面完整,资源占用极低,一个容器就能长期稳定运行。想摆脱信息流算法、集中追踪博客和开源项目动态的话,自托管一套 FreshRSS 再配上手机客户端,体验非常顺手。
项目地址:https://github.com/FreshRSS/FreshRSS(AGPL-3.0)














暂无评论内容