FreshRSS 是一个轻量级的自托管 RSS 聚合阅读器。它可以把你常看的独立博客、技术资讯、新闻网站甚至是视频频道更新汇到一页,体验很像当年的 Google Reader。如果你平时关注的信息源比较杂,又不想每天被各大平台的推荐算法牵着鼻子走,搭一个属于自己的阅读器是最省心、干净的选择。
本篇教程基于 FreshRSS 1.30.4 官方镜像(freshrss/freshrss)实测编写(验证于 2026-11-03)。全程采用网页安装向导搭配内置的 SQLite 数据库,不需要额外起 MySQL 或 PostgreSQL 容器,轻量省事,单机几分钟就能搞定。
成品长这样
部署完成后,你就可以在浏览器里随时翻看订阅源的抓取更新,支持按分类整理与多种阅读视图:

准备工作
在动手前,请确认你的服务器环境准备好以下几项:
- Linux 服务器:FreshRSS 是纯 PHP 应用,内存开销极小,哪怕只有 512MB 内存的小机器也能流畅运行。
- Docker 与 Docker Compose:已在主机上装好 Docker 引擎及 Compose 插件。
- 放行 8080 端口:服务器安全组和系统防火墙需放行 TCP
8080端口用于网页访问。 - 出网连接正常:订阅抓取全靠服务器主动请求各个站点的 RSS 源,确保服务器出网访问正常。
第一步:Docker Compose 部署
-
在服务器上新建项目目录并进入:
mkdir -p ~/freshrss && cd ~/freshrss
-
创建
docker-compose.yml文件并写入以下配置:services: freshrss: image: freshrss/freshrss:1.30.4 container_name: freshrss restart: unless-stopped environment: - TZ=Asia/Shanghai - CRON_MIN=13,43 volumes: - ./data:/var/www/FreshRSS/data - ./extensions:/var/www/FreshRSS/extensions ports: - "8080:80"这里的
CRON_MIN=13,43是容器内定时自动抓取订阅的分钟点,代表每小时的第 13 分和第 43 分执行抓取,避免固定整点并发扎堆。 -
在终端里启动容器:
docker compose up -d
-
打开本地浏览器,直接访问
http://你的服务器IP:8080。如果页面自动跳转到 FreshRSS 的安装向导语言选择页,就说明容器部署成功了。
./data 目录里(包括全局配置文件 config.php 和每个用户独立的 db.sqlite 数据库文件)。日后备份或整机迁移时,你只需要打个包存走 data 目录即可,非常干净。
第二步:走完网页安装向导
容器启动成功后,你在浏览器打开 http://<你的服务器IP>:8080(如果修改过映射端口就换成对应的端口),就能看到 FreshRSS 的初始安装向导。整个流程一共 5 步,跟着下面走很快就能搞定:
-
选择界面语言
第一步先在下拉菜单里选择「简体中文」,然后点击提交。整个界面就会切换成熟悉的中文环境,后续配置起来没有任何理解门槛。
-
环境与权限自检
第二步页面会自动检测系统环境。因为我们用的是官方预构建镜像,PHP 核心组件、所需扩展以及目录读写权限理论上都会显示为绿色的「正常」。你扫一眼确认没有红字报警,直接点击底部的「下一步」。
-
数据库配置(推荐 SQLite)
在数据库类型中,下拉选择「SQLite」。对于个人自用或家庭几个人使用,SQLite 的性能完全够用,还能省去额外挂载 MySQL 或 PostgreSQL 容器的内存开销。选择后保持默认文件路径,直接提交即可。

图 2:向导第三步选数据库,个人部署直接选 SQLite -
设置管理员与常规配置
在常规配置页输入你要设置的默认用户名和密码,这组账号将拥有全站管理员权限。认证方式保持默认的「网页表单」,其余项保留默认值,点击提交。

图 3:向导第一步,先选语言 -
确认并完成安装
提交后界面会弹出「恭喜!FreshRSS 安装成功」的提示。请务必注意:看到这行字不代表安装已结束!你必须继续点击界面正下方的「完成安装」按钮,整套向导才算真正执行完毕。
别急着关网页!看到恭喜后一定要亲手点击「完成安装」。如果不点这一步,后台就不会写入完成安装的标志位,之后每次刷新页面都会重新把你踢回向导第一步。
第三步:登录并添加第一个订阅
点完「完成安装」后,浏览器会自动跳转到登录界面。输入刚才创建的管理员账号密码登录,你就可以看到 FreshRSS 清爽的阅读主界面了。
系统默认在「未分类」分组里为你订阅了官方的 FreshRSS releases 源,方便你第一时间收到版本更新动态,同时也证明你的阅读器抓取与渲染模块都在正常工作。
现在我们来添加你自己的第一个订阅源:
-
进入添加面板
看左侧边栏,在「订阅管理」这一栏的最右侧有一个小小的 + 号图标,点击它进入添加页面。
-
提交订阅链接
把你要订阅的博客或资讯站的 RSS/Atom 链接粘贴进输入框,选择好归类目录,点击保存。系统会自动检测并验证该源的有效性。
-
立即拉取内容
刚加好的订阅源默认还没有历史缓存,你可以直接点击网页右上角带有双箭头的「刷新」图标,后台会立即向目标服务器发起抓取并把文章呈现在列表中。
docker-compose.yml 中配置了 CRON_MIN=13,43,容器内的定时器会固定在每小时的 13 分和 43 分自动去抓取全部订阅源,日常使用完全不需要你手动点刷新。如果你手动刷新后文章列表依然空空如也,通常不是设置问题,而是服务器网络或 DNS 存在异常,可以参考下面的踩坑排查。
踩坑实录
1. "恭喜"不等于装完:切记点击最后一步的完成安装
很多新手看到「恭喜!FreshRSS 安装成功」后就以为完工了,直接关闭标签页或手动输入根路径访问,结果发现又跳回向导第一步。原因在于只有点击最后的「完成安装」按钮,系统才会在挂载目录下写下 data/applied_migrations.txt 标记文件。缺少该文件时,程序会判定为未初始化状态,每次访问都会重新引导你做一次配置。
2. 向导是会话制的:中途切环境会重来,但别慌
安装向导的进度是依赖当前浏览器的 Session Cookie 维系的。如果你中途开了隐身窗口、清理了 Cookie 或者换了一台电脑打开,页面会强制你重新从第一步语言选择开始。不过别担心,前面填入的数据已经在服务端落盘了,你只需要顺着向导重新点几下「下一步」,系统就会自动识别已有数据并安全衔接回去。
3. 1.30.4 Release 没有现成 zip 资产:普通人直接用官方镜像
如果你尝试脱离 Docker 走源码安装,翻看 GitHub 上 1.30.4 的 Release 页面时会发现官方并未上传预打包好依赖的 zip 压缩包,只提供了源码归档。源码包需要自己用 Composer 处理依赖,稍有不慎就卡在缺少组件上。对于绝大多数普通用户,直接运行官方 Docker 镜像 freshrss/freshrss:1.30.4 是最省心、也是最不容易出玄学故障的选择。
4. 文章列表为空先查服务器出网:别在界面里瞎猜
订阅源明明添加成功、连站点标题都读出来了,但无论怎么刷新文章数始终是 0。很多人会误以为是阅读器规则写错了,其实大概率是宿主机或容器的 DNS 解析不通,导致容器无法访问外网服务器。最直接的排查方法是进入服务器终端跑一行 curl 命令测试连通性:
curl -I -m 10 "https://你的目标订阅地址"
如果返回超时或者 Could not resolve host,说明你的服务器网络层根本抓不到外部数据。检查服务器的 /etc/resolv.conf 或者给容器配置公共 DNS,出口网络打通后文章自然就刷出来了。
升级与备份
得益于 Docker 卷挂载的架构设计,FreshRSS 的日常维护和版本迭代非常轻量,整个过程可以在一两分钟内搞定。
版本升级:
未来如果需要升级版本,你只需要修改 docker-compose.yml 里的镜像版本号(比如从 1.30.4 改成更高的版本),然后切到对应目录下执行更新:
docker compose pull && docker compose up -d新容器启动时会自动读取原有数据卷,并自动执行数据库结构迁移(Migration),你的所有订阅分组、已读状态及个人配置都会丝滑保留,完全不需要手动干预。
数据备份与恢复:
FreshRSS 的全量资产都在我们挂载的本地目录中。备份前建议先停止容器以避免 SQLite 写入时产生锁冲突:
docker compose down
tar -czvf freshrss_backup_$(date +%F).tar.gz data/ extensions/
docker compose up -d导出的压缩包里包含了主配置文件(data/config.php)、每个用户独立的 SQLite 数据库(data/users/*/db.sqlite)以及你安装的主题或扩展插件(extensions/)。未来即使服务器重装或迁移换机,只要把解压出来的 data/ 和 extensions/ 丢回新机器并重新跑起 Compose 文件,整个阅读器就能立刻满血复活。