订阅解决了文章从哪里来的问题,但从收到条目到真正开始阅读,中间还有判断正文范围、翻译、搬运和整理状态的工作。

这个项目基于 FreshRSS 和 n8n,把已订阅的文章整理到一个中文阅读入口,再交付到飞书。FreshRSS 是已有的开源阅读器;我的工作是围绕个人阅读需求完成流程集成与调整。

在自己的电脑上用 Docker 安装 FreshRSS

下面以 Windows 和 Docker Desktop 为例,先建一个独立阅读器。安装完成后可以自己订阅和阅读;翻译、飞书发送属于后续 n8n 集成,不会随着 FreshRSS 自动出现。这个示例使用独立的项目名、数据卷和 18080 端口,不复用案例中的现有实例。

1 安装并启动 Docker Desktop

按照 Docker 官方 Windows 安装指南 安装 Docker Desktop,使用 WSL 2 后端及 Linux 容器。启动 Docker Desktop 后,在 PowerShell 中检查:

docker version
docker compose version

第一条需要显示 Server 信息;只有 Client 或提示无法连接时,先确认 Docker Desktop 已启动。安装过程中要求重启时,完成重启后再继续。

2 建立一个单独的目录

在你准备保存配置的位置新建目录,进入目录后创建名为 compose.yaml 的文件:

mkdir freshrss-demo
cd freshrss-demo
notepad compose.yaml

把下面的内容保存进文件,确认文件名没有变成 compose.yaml.txt:

name: lens78-freshrss-demo
services:
  freshrss:
    image: freshrss/freshrss:latest
    restart: unless-stopped
    ports:
      - "127.0.0.1:18080:80"
    environment:
      TZ: Asia/Shanghai
      CRON_MIN: "*/20"
    volumes:
      - freshrss_data:/var/www/FreshRSS/data
      - freshrss_extensions:/var/www/FreshRSS/extensions
volumes:
  freshrss_data:
  freshrss_extensions:

latest 是官方最新版本化发布镜像,首次运行后可固定为选定版本号。命名卷保存阅读器数据和扩展;端口只绑定本机,电脑浏览器通过 http://127.0.0.1:18080 访问。18080 已占用时,改冒号中间的宿主端口。以上参数依据 FreshRSS 官方 Docker 文档。

3 启动并完成网页安装

在同一目录执行:

docker compose up -d
docker compose ps
docker compose logs --tail 50 freshrss

打开 http://127.0.0.1:18080,按安装向导选择语言与 SQLite 数据库,设置自己的管理员账号和密码。不要把密码写进公开的配置或截图。登录后添加一个 RSS 地址,手动刷新,检查能否看到条目并打开原文。

CRON_MIN 配置为每二十分钟刷新一次。电脑休眠、关机或 Docker Desktop 停止时,计划不会运行。容器启动成功也不代表所有订阅源都可访问,先用一个可访问的订阅验证。

4 日常停止与数据保留

docker compose stop
docker compose start

这些命令保留数据。docker compose down 通常也保留命名卷,但不要使用 docker compose down -v 来做日常停止,它会删除本项目的数据卷。重要资料仍需另做备份;OPML 只保存订阅列表,不能替代完整数据备份。后续升级镜像前,先备份数据并查看目标版本说明。

5 再考虑接入 n8n

需要 API 时,按 FreshRSS 的 API 设置启用访问并设置独立 API 密码。n8n 运行在容器里时,localhost 指向 n8n 自己。两个服务加入同一个 Docker 网络后,可使用服务名 http://freshrss:80;host.docker.internal 指向宿主机,不是 FreshRSS 服务名,也不能据此假定只绑定本机回环的端口对其他容器可达。先验证实际网络,再接翻译和发送。

本节是安装指导,未在本轮另建或替换 FreshRSS 实例。

它怎样处理一篇文章

历史已验证版本每天按北京时间 19:00 的计划,从 FreshRSS 中选择最多五篇未读文章。它尝试取得正文并判断语言:中文正文直接交付,英文按段落分块翻译,再组装发送。

FreshRSS 阅读交付流程示意

图为流程示意,不是运行截图。“已读”在这个流程里表示已完成交付并同步标记,不证明我已经认真读完文章。

只有摘要、公开正文取不到、语言无法确认,或处理量超过设定上限时,流程留下待处理状态。播客节目介绍也只按节目介绍交付,不把它称为音频逐字稿。

构建中改变过的三个决定

从摘要改为正文交付。 初版发送摘要后,需求被进一步明确为中文保留正文、英文翻译正文。摘要已经发出,并不代表满足了新的阅读需求。

按完整词句和段落分块。 英文样本曾出现长列表硬切单词的问题,后来修正分段边界,并保留已经正确完成的译文,只处理发生变化的部分。

把长任务拆成独立步骤。 后续版本将翻译、发送、同步状态和清理分开持久保存。执行中断后先检查原回执,不盲目重做收费调用或重复发送。成功交付并确认已读标记后,再清理临时内容。

已经发生的结果

2026 年 9 月 26 日的一次自然定时批次处理了四篇文章。记录包含四篇的飞书发送成功回执及 FreshRSS 已读确认回执,共十一组翻译回执;批次结束后临时文章内容已清空。用户反馈确认收到了四篇文章。

这说明当次交付链实际完成。该批译文没有逐篇审校,也没有记录可用于比较的阅读时间基线,因此这里不把它换算为“节省多少小时”或长期阅读效果。案例描述的是这一历史版本,不代表今天的运行状态已经重新检查。

适合借鉴的情境

如果你已经使用 RSS,需要把部分英文文字材料带到常用的中文阅读环境,可以参考这个流程。文章可访问性、提取质量、翻译成本和接收平台限制,都需要在自己的来源与环境中核对。

本页提供构建案例。现阶段没有公开在线体验、通用安装包或托管服务;已有验证来自本机环境,不能据此声称 VPS 部署已经完成。

我想继续观察的事

交付文章之后,我是否更愿意阅读?每天最多五篇是否仍然过多?翻译和维护的成本是否值得?只有这些问题得到实际反馈,才能判断这个流程对阅读有多大帮助。