article_image

FreshRSS 默认情况下不提供自动刷新功能。因此,需要借一些助外部服务来实现定时刷新。

本文将介绍两种实现方法,并分别讲解如何在 DSM 和服务器环境中配置刷新任务。

两种实现方案

FreshRSS 的定时刷新可以通过以下两种方式实现,都出自 FreshRSS 的官方文档

方案一:本机定时任务刷新

你可以通过设置各种系统自带的 cron(定时任务工具)来执行 PHP 脚本实现刷新。

如果是 Linux ,你需要添加以下命令到 cron 配置文件里:

0 * * * * php /path/to/FreshRSS/app/actualize_script.php > /tmp/FreshRSS.log 2>&1

这条命令的意思是,每小时(0 * * * * 是 cron 写法)运行一次 /path/to/FreshRSS/app/ 目录下的 actualize_script.php PHP 脚本,并将刷新日志输出到 /tmp/FreshRSS.log

此方案的适用场景是,你在自己机器上部署了 FreshRSS,有权限在本机去触发 PHP 脚本文件。

NAS 场景、Docker 部署的场景,文章后半段会提到。我们先讲完 FreshRSS 官方的第二种定时刷新思路。

方案二:在线定时刷新

第二种方式是利用外部的定时任务 + curl 命令(发起网络请求命令),简单的说,就是向 FreshRSS 的特定地址发起一次请求,直接触发 FreshRSS 提供的 API 进行刷新。

此方案的适用场景是,

  • 你没有权限接触到 FreshRSS 的文件(比如是别人部署的 FreshRSS 而你只是使用者)。
  • 你认为方案一不方便实现 。
  • 你想从外部工具去触发自动刷新。

一般来说,推荐你带上一层校验,也就是采用用户名和 Token 的写法。

curl `https://freshrss.example.net/i/?c=feed&a=actualize&maxFeeds=10&ajax=1&user=someone&token=my-token`

其中的 https://freshrss.xxxxx.com 替换为你的 FreshRSS 服务地址,user=someone 替换为真实的用户名,my-token 替换为FreshRSS - 设置 - 账户中的 API 密码。


需要配置一个 API 密码
需要配置一个 API 密码

官方文档中还提到了一个方法,是将 FreshRSS - 设置 - 认证 中的“允许匿名刷新文章打开”,这样从外部刷新的时候,可以更简单一些,无需账号密码。


启用匿名刷新文章
启用匿名刷新文章

命令格式如下:

curl 'https://freshrss.example.net/i/?c=feed&a=actualize'

官方文档中还介绍了一些更细的情况,比如单独刷新特定的订阅源,如果有需要可以去了解一下原文。

方案三:使用 Docker 环境变量设置自动刷新

(2024-12-01-补充更新)

对于 Docker 部署的 FreshRSS,官方提供了一种便捷的方式来实现自动刷新功能,而不需要手动配置定时任务。你只需在部署 Docker 容器时,设置适当的环境变量即可。

docker-compose.yml 文件中,你可以通过设置环境变量 CRON_MIN 来指定自动刷新频率。

例如,如果你希望每 30 分钟自动刷新一次订阅源,可以在 docker-compose.yml 文件中的 FreshRSS 服务部分,加入如下配置:

version: '3.7'
services:
  freshrss:
    image: freshrss/freshrss:latest
    container_name: freshrss
    environment:
      - CRON_MIN=30
    ports:
      - "8080:80"
    volumes:
      - ./data:/var/www/FreshRSS/data
    restart: always

官方文档 中有对 CRON_MIN 函数的具体说明,具体可参考 Option 1) Cron inside the FreshRSS Docker image 这个段落。

更完整的 docker-compose.yml 可以参考此文:《如何通过 Docker 部署 FreshRSS 服务,实现 RSS 自由 | #UNTAG

实际操作

说完两种方案的思路,实际应该如何操作呢?我们这里介绍三种情况,分别是群晖 NAS 中、1Panel 运维面板中、Linux 中配置定时任务的方法。

利用 DSM 的定时任务实现定时刷新

DSM 中实现定时刷新,需要通过控制面板 - 任务计划,设置一个定时任务。

点击 新增 - 计划的任务 - 用户定义的脚本 来新建一个任务,在 计划 标签页中启用“每天执行”,启用“在同一天内继续运行”,设置为“每 2 小时”刷新一次。

周期你可以自由调整,但最短间隔不建议低于 20 分钟,FreshRSS 本身和订阅源都有频率限制,超出这个频率即使触发刷新任务也不会刷新。

任务设置 标签页,需要配置刷新脚本。这里的脚本内容就是上面提到的两种实现方案。

但你还需要分辨一下,你是 Docker 部署的还是 PHP 部署的,需要用不同的方式触发内部 PHP。

Docker 部署的情况

如果你是参考《如何通过 Docker 部署 FreshRSS 服务,实现 RSS 自由》进行部署的,那就需要用 root 身份和 docker exec 命令去触发这个脚本。

你需要先在 常规 标签页,运行者设置为 root (只有 root 才有权限执行 docker exec 命令)。

然后在 任务设置 标签页,配置 docker exec,也就是在容器内执行 php 命令:

docker exec -u www-data freshrss php /var/www/FreshRSS/app/actualize_script.php

注意,其中的 freshrss 是你的 Freshrss Docker 容器名称。比如在前文中,Docker Compose 中的容器名称就是 freshrss-app,如果有修改,则需要一并修改。

然后保存这个定时任务,由于用了 root 用户,DSM 会提示你输入密码,正常输入即可。

原生部署的情况

如果你是原生部署的 FreshRSS——比如通过应用市场内安装的 PHP、MariaDB、Web Station 等进行的安装,可以理解为是原生部署。

那么我更推荐你用方案二的 curl ,这样你不用考虑到底 PHP 的路径和脚本的路径了。

你可以像前面说的,将 FreshRSS - 设置 - 认证 中的“允许匿名刷新文章打开”。

然后回到任务计划中,点击 新增 - 计划的任务 - 用户定义的脚本 来新建一个任务,在 计划 标签页中启用“每天执行”,启用“在同一天内继续运行”,设置为“每 2 小时”刷新一次。

命令部分配置如下——

curl 'https://freshrss.example.net/i/?c=feed&a=actualize'

如果你不知道如何填写,也可以直接在 FreshRSS 中右键刷新按钮,复制链接地址。这个地址通常就是上述命令的地址。

保存即可正常使用。

如果你需要更高安全性,可以取消“匿名刷新”,改为添加 user 和 token 参数来触发刷新。

排错的方法

如果你配置完成后,发现还是没有正确触发。

你可以在 控制面板 - 任务计划 - 设置 中,启用“保存输出结果”,然后根据日志中的报错信息,查看是否正确刷新了订阅源。

也可以看看 FreshRSS - 设置 - 日志、Docker 容器中,是否有相关的报错信息,以便进一步排查。

在服务器中刷新

如果你运行 FreshRSS 的环境是常规服务器,也可以通过以下两种方式实现定时刷新。

利用 1Panel 的定时任务实现

1Panel 是一种图形化的服务器管理面板,可以方便地创建定时任务。

操作步骤很直观,你需要进行如下操作。

  1. 登录 1Panel - 打开任务计划管理页面。
  2. 创建计划任务 - 选择任务类型“访问 URL”。
  3. 配置执行周期和 URL 地址。
https://freshrss.example.net/i/?c=feed&a=actualize

此处的地址不需要带 curl,本身就已经是 curl 了。

利用 crontab 的定时任务

如果没有使用面板工具,可以直接利用 Linux 的 crontab 实现定时刷新。

  1. 编辑 crontab 文件:
crontab -e
  1. 添加以下任务:
0 * * * * curl 'https://freshrss.example.net/i/?c=feed&a=actualize'

此任务会每 1 小时刷新一次订阅。

FreshRSS 的自动刷新限制

FreshRSS 在设计上就故意设置了一些刷新频率的最低值,以避免资源浪费并保护 RSS 生态系统:

  • 全局默认值:每 20 分钟刷新一次。
  • 单个 Feed:可以在设置中将刷新频率缩短至 15 分钟。

所以有时候调试期间发现怎么配置都刷新不了 RSS,很可能是因为在这个周期内。这个信息会体现在日志内,需要具体情况具体分析。

小结

FreshRSS 的设计还是比较清晰的,提供了从内部触发 PHP 脚本和从外部触发 API 这两种方案,只是容易在不同的场景下出现一些混淆。其实掌握了思路和方法,再结合一些排错手段,就能解决这个问题了。


author_avatar

#UNTAG Developer