零门槛部署RSSHub到斐讯N1(飞牛NAS+Docker)

我之前写过一篇RSS订阅使用教程,当时主要介绍如何寻找RSS源和选择阅读器,但用久以后会发现一个问题:很多网站根本不提供RSS,即使提供,也可能只有标题和摘要。这时候就需要RSSHub,将原本没有RSS的网站转换为可以订阅的链接。

以前个人部署RSSHub有一道隐形门槛,需要会Linux、Docker、SSH和反向代理,遇到报错还得从日志里猜原因。教程看起来只是复制几行命令,真正出错时,每个人的系统、目录、网络和权限又都不一样,照抄通常只负责把你送到下一个报错。

AI出现以后,这件事发生了变化。它不只是解释命令,还可以先检查设备环境,根据实际情况生成配置,连接终端执行部署,失败以后读取日志继续修复。人需要做的事情,从“理解每一条命令”变成“说清楚自己想要什么,给AI必要权限,最后确认结果”。

本文就是写给AI看的部署说明。开通ChatGPT Plus或更高套餐,在电脑安装ChatGPT桌面端,将这篇文章交给Codex,再提供N1的SSH连接,基本可以让AI完成剩下的部署。如果当前Work会话也有本地终端权限,同样可以使用;网页里的普通对话主要负责指导,不能凭一篇文章直接进入你家里的N1。

ChatGPT的套餐、使用额度和功能入口会调整,本文写于2026年9月。免费版也能上传文件,Codex也可能提供有限额度;但为了减少次数限制和功能差异,本文把Plus或以上套餐作为“零门槛方案”的前提,而不是运行RSSHub的技术条件。

为何购买N1

公共RSSHub实例虽然省事,但热门路线容易限流,冷门路线可能突然失效,需要Cookie的路线又不适合交给陌生服务器。与其不断寻找下一个公共实例,不如在家里放一台长期在线的小主机。

我这台斐讯N1是在闲鱼花80元左右买的,系统刷成了飞牛NAS。买它不是为了当一台性能多强的NAS,而是想给RSSHub和一些轻量服务找个便宜、安静、可以一直开机的落脚点。

80元左右能买到的斐讯N1,配置放在今天已经很老了:晶晨S905D、2GB内存、8GB eMMC、千兆网口和两个USB 2.0。做主力NAS肯定不合适,但拿来跑轻量Docker服务却刚好。

  1. 价格低,我这台闲鱼入手约80元;
  2. 体积小,无风扇,放在路由器旁边不会增加多少存在感;
  3. 功耗低,适合RSSHub这种需要24小时在线、实际负载又不高的服务;
  4. 有千兆网口,比许多百兆电视盒子更适合长期作为网络节点;
  5. 社区资料多,飞牛也已经提供ARM版本并把斐讯N1列入支持设备;

它的缺点同样明显:只有2GB内存,8GB eMMC也很局促,USB还是2.0。我的定位很明确,N1只是轻服务器,不承担重要数据的唯一备份,不做高清视频转码,也不往里面塞几十个容器。系统和Docker数据最好放到可靠的外接存储,重要配置另外备份。

零门槛部署需要什么

斐讯N1和飞牛NAS

我使用的是飞牛NAS,也就是fnOS ARM版。刷机过程涉及固件、U盘启动和写入eMMC,操作错误有变砖风险,本文不展开。官方已经列出斐讯N1,但不同批次、引导和旧系统状态可能不同,刷机前先看对应版本的官方说明。

进入飞牛NAS后,在应用中心安装Docker,再到系统设置开启SSH。到这里为止需要自己点击,因为AI无法替你给一台尚未联网的机器刷系统,也不应该替你猜管理员密码。

ChatGPT会员和桌面端

按本文的省事方法,建议准备:

  1. ChatGPT Plus或更高套餐;
  2. Windows或macOS版ChatGPT桌面应用;
  3. 桌面端Codex,或者具备本地终端权限的Work;
  4. N1的局域网IP、SSH用户名和密码;
  5. 允许AI读取本文,并在你确认后使用终端;

密码不要粘贴进文章或长期保存到提示词里。需要登录时,优先由自己在系统登录窗口输入,或者先在本机配置只用于这台N1的SSH密钥。Cookie、Token、代理订阅和RSSHub访问密钥同样不要发到公开聊天或截图中。个人套餐还应先检查ChatGPT的数据控制设置,再决定提供哪些日志和配置文件。

把这篇文章交给GPT

将本文保存为Markdown,或者直接把博客链接发给GPT,然后使用下面这段提示词:

我有一台斐讯N1,安装了飞牛NAS ARM版,已经安装Docker并开启SSH。
请根据我提供的《零门槛部署RSSHub到斐讯N1》完成部署。

要求:
1. 先只读检查,不要立刻修改系统;
2. 确认CPU架构、Docker、Docker Compose、剩余磁盘、内存和目标目录;
3. 发现已有RSSHub时先报告,不覆盖现有配置;
4. 使用适合2GB内存N1的精简方案,只部署RSSHub本体,使用内存缓存;
5. 自动生成高强度ACCESS_KEY,保存在权限为600的.env中,不要在回复里完整显示;
6. 限制容器内存,开启Docker日志轮转;
7. 不开放fnOS、Docker或其他管理页面到公网;
8. 每一步失败后先读取错误和日志,再针对原因修复,不要反复执行同一条命令;
9. 部署完成后检查容器状态、健康检查、首页和一条实际RSS路线;
10. 最后告诉我访问地址、更新方法、备份位置和回滚方法,密钥只告诉我去哪个文件查看。

N1地址:<填写局域网IP>
SSH用户:<填写用户名>
目标目录:不知道,请先检查飞牛NAS的数据盘再决定。

现在只执行只读检查,列出检查结果和部署计划,等我确认后再修改。

最后一句很重要。先让AI检查,再让它动手,这样它会根据真实环境选择目录,而不是把教程里的/vol1/1000/rsshub生搬硬套到所有机器。

第一步:让AI体检N1

AI连接N1后,应当先执行类似下面的只读检查:

uname -m
docker --version
docker compose version
df -h
free -h
docker ps -a

正常情况下,uname -m应当显示aarch64。RSSHub官方镜像支持linux/arm64,N1可以直接使用;如果显示32位ARM,AI应停止部署并说明原因,因为RSSHub已经停止提供arm/v7镜像。

还要让AI检查三件事:

  1. Docker是否真的可以运行,而不是只安装了图标;
  2. 数据盘是否有足够空间,Docker目录是否误放在8GB eMMC;
  3. 1200端口和准备使用的目录是否已经被占用;

如果检查通过,再回复:

同意按计划部署。修改前备份同名目录;如涉及删除数据、覆盖已有配置、开放公网或修改防火墙,先停下来询问我。其他必要步骤可以继续执行,直到验证通过。

第二步:让AI生成并部署RSSHub

RSSHub官方推荐Docker Compose。官方示例还包含Redis和Browserless,功能更全,但N1只有2GB内存,第一次部署没必要全装。先使用内存缓存,只启动RSSHub本体;以后真遇到依赖浏览器的路线,再单独添加Browserless。

AI应当完成这些操作:

  1. 在飞牛数据盘创建独立的rsshub目录;
  2. 生成.env,写入随机访问密钥并设置600权限;
  3. 创建docker-compose.yml
  4. 设置restart: unless-stopped
  5. 给RSSHub设置合理的内存上限;
  6. 将Docker日志限制为单文件5MB、最多2个文件;
  7. 检查Compose配置后拉取镜像并启动;
  8. 等待健康检查完成,而不是看到容器启动就宣布成功;

AI最终生成的Compose结构大致如下。普通读者不必手动输入,这段主要用于约束AI,防止它部署一套不适合N1的重型配置:

name: rsshub

services:
  rsshub:
    image: ghcr.io/diygod/rsshub:latest
    container_name: rsshub
    restart: unless-stopped
    mem_limit: 768m
    ports:
      - "1200:1200"
    environment:
      NODE_ENV: production
      CACHE_TYPE: memory
      ACCESS_KEY: "${RSSHUB_ACCESS_KEY}"
    healthcheck:
      test: ["CMD-SHELL", "curl -f \"http://127.0.0.1:1200/healthz?key=$$ACCESS_KEY\""]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 30s
    logging:
      driver: json-file
      options:
        max-size: "5m"
        max-file: "2"

这里限制内存不是说RSSHub一定会吃满768MB,而是防止异常路线把整台N1拖死;日志轮转则是为了保护本来就不宽裕的存储空间。

第三步:让AI验证结果

部署完成不等于能用。让AI依次检查:

docker compose ps
docker compose logs --tail=100 rsshub
docker stats --no-stream rsshub

然后验证四个结果:

  1. 容器状态为healthy
  2. N1本机健康检查返回成功;
  3. 局域网电脑能打开RSSHub首页;
  4. 至少一条实际路线能返回包含条目的XML;

可以先用少数派Matrix路线测试:

http://N1的局域网IP:1200/sspai/matrix?key=你的访问密钥

将完整链接添加到ReadYou、Reeder或者Fluent Reader。其他网站先在RSSHub文档中找到路线,再让AI根据官方示例生成自己的订阅链接。

浏览器能打开RSSHub首页,只代表容器活着,不代表所有路线都能用。微博、X、酷安等路线可能依赖Cookie、Token、代理或者特殊请求方式,源站规则一变也可能暂时失效。遇到问题时,把错误链接、RSSHub日志和预期结果交给AI,不要只说一句“不能用”。

可以继续使用下面的提示词:

这个RSSHub路线无法正常返回内容。请先复现并查看RSSHub最近日志,判断是路线参数、源站反爬、登录态、网络、缓存还是镜像版本问题。不要直接关闭安全设置,不要把Cookie或Token打印到回复中。修复后重新验证HTTP状态、Content-Type和RSS条目数量,并说明修改了什么。

AI能做什么,不能做什么

在已经安装好飞牛NAS、开启SSH并授予终端权限的前提下,AI可以完成环境检查、编写Compose、生成密钥、上传文件、启动容器、查看日志和验证路线。配置与设备不一致时,它也比静态教程更容易继续排错。

但“基本不用自己操作”不等于把机器完全交出去。下面几件事仍然需要人决定:

  • 是否允许AI连接这台N1;
  • 什么时候输入密码、批准修改或开放网络;
  • 哪些Cookie和Token可以放进私有配置;
  • 是否将服务开放到公网;
  • 验证结果是否真的满足自己的使用需求;

AI会犯错,也可能误解目录和网络。先检查、再修改、最后验收,比一句“帮我全部装好”更加省时间。

更新、备份和回滚也交给AI

以后更新不需要重新找教程,直接把原对话继续下去:

请更新N1上的RSSHub。更新前备份docker-compose.yml和.env,记录当前镜像摘要与容器状态;拉取新镜像后重新创建容器,验证健康检查和我常用的订阅路线。验证失败就回滚到更新前镜像,不要删除旧备份。

AI最终执行的核心命令通常只是:

docker compose pull
docker compose up -d
docker compose ps
docker compose logs --tail=100 rsshub

重点不在这四条命令,而在更新前记录、更新后验证、失败时回滚。过去最考验经验的恰恰是这些步骤,现在可以让AI负责盯完整个过程。

外网访问

我不建议直接在路由器上把1200端口暴露到公网。管理N1和访问内部服务,我更偏向使用Tailscale:设备加入同一个Tailnet后,使用Tailscale IP访问,省去公网IP、DDNS和端口转发。

这里有一个容易混淆的地方:ReadYou这类本地阅读器可以访问Tailnet地址,运行在云端的RSS阅读器服务器却不在你的Tailnet里,它无法抓取这个私网链接。如果确实要给云端阅读器使用,就需要HTTPS反向代理或Tailscale Funnel,并且必须保留ACCESS_KEY。可以让AI设计和部署,但公网只开放RSS订阅入口,飞牛NAS、Sun-Panel和其他管理页面仍然留在内网。

N1推荐安装什么

N1资源有限,安装顺序比安装数量更重要。我目前认为值得保留的服务有下面几个。

RSSHub

购买N1最主要的原因。它弥补了许多网站不提供RSS的问题,也让我不必依赖不稳定的公共实例。普通路线只跑RSSHub本体就够了;需要登录态或特殊网络的路线再单独配置,别把Cookie和Token写进公开文章。

AI最大的作用不只是安装RSSHub,而是自定义路由。以前要自己看网页结构、写抓取和RSS输出代码,现在可以把目标网页、希望保留的字段和更新频率告诉AI,让它先分析现有RSSHub路线;没有现成路线时,再生成独立转换服务或路由代码,并用真实页面做测试。不会JavaScript不再是绝对门槛,但仍要检查生成内容是否合法、稳定,不能绕过网站权限或高频抓取。

Tailscale

用于远程访问N1、飞牛NAS和其他私网服务。它的价值不是让所有东西都公开,而是让自己的设备像在同一个局域网里。管理页面不必暴露公网,手机在外面也能连接。

Sun-Panel

服务多以后,用一个导航页记录入口,比记端口方便。Sun-Panel本身很轻,但不要为了自动发现容器就把/var/run/docker.sock随便挂进去,一个导航页没必要获得宿主机最高权限。

QD-lite

适合运行少量个人签到和定时任务。我使用的是lite版本,并限制任务数量和内存。它不是批量请求工具,高频签到只会给自己和网站找麻烦,需要Cookie的任务也要考虑泄露风险。

sing-box(按需)

只有RSSHub某些路线确实需要特殊出站网络时再安装。我将代理限制在Docker内部,不映射到宿主机端口,并让RSSHub优先直连,失败后才走备用代理。代理不是RSSHub的必装组件,更不能解决失效Cookie和源站规则变化。

不建议在N1上硬塞的东西

N1不是一台缩小版高性能服务器,2GB内存和8GB eMMC决定了它更适合“小而专”。下面这些用途我不会交给它:

  • Jellyfin实时转码和重型影音刮削;
  • 大量下载任务和高频写盘;
  • 大型数据库、搜索引擎和本地AI模型;
  • 同时运行多个Chromium、Browserless之类的重服务;
  • 保存没有其他备份的重要文件;

服务不是装得越多越值。内存被占满、eMMC被日志写爆,最后每个服务都半死不活,还不如只留下每天真正会用的几个。

PS

如果只是为了体验RSSHub,电脑上运行Docker会更简单,没有必要专门购买N1。只有当你确认RSS已经进入自己的日常阅读流程,需要一个长期在线、自己控制的实例时,N1才真正有价值。

过去部署服务的门槛,是人必须先学会机器的语言;现在借助AI,人只需要把目的、条件和不能越过的边界讲清楚。技术并没有消失,只是从必须背在每个人身上的行李,变成了可以随时调用的工具。

RSS让我从算法推荐中拿回了选择信息的权力,RSSHub进一步把“网站是否愿意提供订阅”的决定权拿回来,而AI则把部署和修改RSSHub的能力交给了更多普通人。N1在这套系统里并不耀眼,它只是安静地待在角落,把这些链接每天准时送到阅读器里。对我来说,这正是它最适合做的事情。

参考链接:

RSSHub部署文档

RSSHub官方Docker Compose

飞牛fnOS ARM版与支持设备

ChatGPT Work和Codex官方说明

Codex与ChatGPT套餐说明

目录

- <a href="#为何购买n1" class="toc-link"
data-target="为何购买n1">[为何购买N1](#为何购买n1)
- <a href="#零门槛部署需要什么" class="toc-link"
data-target="零门槛部署需要什么">[零门槛部署需要什么](#零门槛部署需要什么)
 - <a href="#斐讯n1和飞牛nas" class="toc-link"
data-target="斐讯n1和飞牛nas">[斐讯N1和飞牛NAS](#斐讯n1和飞牛nas)
 - <a href="#chatgpt会员和桌面端" class="toc-link"
data-target="chatgpt会员和桌面端">[ChatGPT会员和桌面端](#chatgpt会员和桌面端)
- <a href="#把这篇文章交给gpt" class="toc-link"
data-target="把这篇文章交给gpt">[把这篇文章交给GPT](#把这篇文章交给gpt)
- <a href="#第一步让ai体检n1" class="toc-link"
data-target="第一步让ai体检n1">[第一步:让AI体检N1](#第一步让ai体检n1)
- <a href="#第二步让ai生成并部署rsshub" class="toc-link"
data-target="第二步让ai生成并部署rsshub">[第二步:让AI生成并部署RSSHub](#第二步让ai生成并部署rsshub)
- <a href="#第三步让ai验证结果" class="toc-link"
data-target="第三步让ai验证结果">[第三步:让AI验证结果](#第三步让ai验证结果)
- <a href="#ai能做什么不能做什么" class="toc-link"
data-target="ai能做什么不能做什么">[AI能做什么,不能做什么](#ai能做什么不能做什么)
- <a href="#更新备份和回滚也交给ai" class="toc-link"
data-target="更新备份和回滚也交给ai">[更新、备份和回滚也交给AI](#更新备份和回滚也交给ai)
- <a href="#外网访问" class="toc-link"
data-target="外网访问">[外网访问](#外网访问)
- <a href="#n1推荐安装什么" class="toc-link"
data-target="n1推荐安装什么">[N1推荐安装什么](#n1推荐安装什么)
 - <a href="#rsshub" class="toc-link"
data-target="rsshub">[RSSHub](#rsshub)
 - <a href="#tailscale" class="toc-link"
data-target="tailscale">[Tailscale](#tailscale)
 - <a href="#sun-panel" class="toc-link"
data-target="sun-panel">[Sun-Panel](#sun-panel)
 - <a href="#qd-lite" class="toc-link"
data-target="qd-lite">[QD-lite](#qd-lite)
 - <a href="#sing-box按需" class="toc-link"
data-target="sing-box按需">[sing-box(按需)](#sing-box按需)
- <a href="#不建议在n1上硬塞的东西" class="toc-link"
data-target="不建议在n1上硬塞的东西">[不建议在N1上硬塞的东西](#不建议在n1上硬塞的东西)
- <a href="#ps" class="toc-link"
data-target="ps">[PS](#ps)
签名
天地生日月,神明寄乾坤
RSS