AI 自动阅读:Docker 部署 n8n 搭建 RSS 同步工作流

如何使用Docker部署n8n并搭建RSS同步工作流。包括环境准备、安装命令、绑定域名、案例1将RSS源同步到Notion、案例2将Workflow做成API给外部调用以及一些常见问题的解决方法。

Jan 27, 2024
此篇为搭建 AI 自动阅读流程中的其中一篇,实现将全部 RSS 汇总后通过 n8n 自动同步到 Notion,然后使用 Notion AI 来总结,当然用其他模型的也可以。

环境

  • AWS ES2 服务区,Debian 系统
  • 宝塔国际版,docker 服务

安装命令

// 创建一个 docker 卷用来存档 n8n 数据,即使容器被删除,卷中的数据也不会丢失 docker volume create n8n_data
// 二选一:2.将宿主机的5679端口(默认5678被占用)映射到n8n容器内的 5678 端口,将上面创建的卷挂载到/home/node/.n8n docker run -it --name n8n -p 5679:5678 -v n8n_data:/home/node/.n8n docker.n8n.io/n8nio/n8n // 二选一(推荐):2.添加时区、webhook域名等环境变量 docker run -it --name n8n -p 5679:5678 -e VUE_APP_URL_BASE_API=https://n8n.domain.com/ -e WEBHOOK_URL=https://n8n.domain.com/ -e GENERIC_TIMEZONE=Asia/Shanghai -e TZ=Asia/Shanghai -e N8N_LOG_LEVEL=verbose -v n8n_data:/home/node/.n8n docker.n8n.io/n8nio/n8n
或者选择宝塔面板的 GUI 界面添加容器
notion image
环境变量说明:
  • VUE_APP_URL_BASE_APIWEBHOOK_TUNNEL_URL:在前端应用和Webhook中分别指定API的基础URL和Webhook的基本URL。注意使用方向代理需要设置为 http://ip:5679 (反代也生效)
    • 【一定要设置】如何没有指定域名的话,连接三方API时 OAuth 授权会失败
       
notion image
notion image
  • GENERIC_TIMEZONETZ:都用于设置容器的时区。
  • N8N_LOG_LEVEL:用于指定 N8n 日志输出的详细级别。
 
浏览器中打开 服务器ip:5679 即可打开 n8n 服务,设置管理员账号和密码

绑定域名

  1. 在域名服务商如 Cloudflare 中添加一条 DNS 记录,【A类型,名称 n8n,内容为服务器IP】
  1. 在宝塔-website 中点击 【add site】
  1. Domain name 中填写域名【n8n.domain.com】,勾选 SSLHTTPS
  1. 点进去添加 reverse proxy 反向代理,Target URL填写 http://ip:5679/ ,命名后提交
  1. 在浏览器中打开 https://n8n.domain.com 即可打开 n8n 服务
  1. 测试 webhook URL,显示可以通。
notion image

案例1:将 RSS 源同步到 Notion

设置 Workflow 时区

当环境变量中添加了时区为 +8 时,在右上角的【设置】中能看到 Timezone 为 GTM+8:00
notion image

Webhook 节点

Webhook 可以在外部服务中发生事件时启动 n8n 工作流程。
构建workflow时,请使用 Test Webhook URL。点击 Listen for test event,再将数据发送到 Test Webhook URL 注册 Webhook。Test Webhook 会保持活动状态 120 秒。
notion image
当 Test Webhook URL 接收到数据时,就会停止监听,然后在右侧 output 中看到数据
notion image
当 workflow 准备就绪时,save 保存 workflow,点击 Active 开启,然后在外部服务中将切换到Production Webhook URL。当外部服务调用 webhook URL 时,n8n 会自动运行它。
notion image
 

Edit Fields 提取/设置字段

该节点可以提取输入字段并运算,然后将值流转到下个节点。
支持 JSON 格式和表达式(输入. 添加),拖动左侧 input key 到输入框中可以引用,点击放大可以放大编辑器
notion image
表达式可以嵌套,如 {{ $json.link.replace('https://' + $json.link.extractDomain(), '') }} 获取链接并在开始时将 https:// 替换为空
 
表达式技巧:
【1】除了节点还可以在任何输入框中使用表达式,使用 JMESPath 库来查询JSON,从JSON数据结构中快速提取和转换数据。如 {{ $jmespath($json.body.people, "[*].first") }} ,如何有多个会输出数组
 
【2】使用表达式match替换文本 match(正则表达式, ‘替换的文本’)
notion image
 
【3】去掉数组中的空值并拼接成字符串 {{ $json.image.filter(item => item !== "null").join(',') }}
notion image
 
【4】判断 url 值是否不为存在,真时返回拼接值,否则返回空 {{ $if(($json.extendedEntities.media[0].video_info.variants[3].url || $json.quote.entities.media[0].video_info.variants[3].url) !== null, '<video src=\\"' + $jmespath($json, "extendedEntities.media[0].video_info.variants[3].url || quote.entities.media[0].video_info.variants[3].url")+'\\" controls=\\"controls\\"><\\/video>', '') }}
增加判断多个字段值或条件 {{ $if(($jmespath($json, "retweet.extendedEntities.media[0].video_info.variants[3].url || extendedEntities.media[0].video_info.variants[3].url || quote.entities.media[0].video_info.variants[3].url")) !== null, '<video src=\\"' + $jmespath($json, "retweet.extendedEntities.media[0].video_info.variants[3].url || extendedEntities.media[0].video_info.variants[3].url || quote.entities.media[0].video_info.variants[3].url")+'\\" controls=\\"controls\\"><\\/video>', '') }}
notion image

Code 代码节点

代码节点允许编写自定义 JavaScript 或 Python 并将其作为工作流程中的一个步骤运行。
注意:代码节点处理 Python 所需的时间更长,且不支持内部表达式
JavaScript(推荐使用) 可以在代码节点中导入和使用内置和外部 npm 模块。要了解如何启用外部模块,请参阅配置指南
notion image
语法说明:
  1. 获取输入值:只能读取 JSON 第一层的数据,所以需要使用 Edit Fields 节点来转换字段。input 从上个节点的输入JSON中获取 rssUrl label
  1. 输出结果:输出要使用 JSON,所以将变量放在 output 对象。
 

Date & Time 时间转换节点

日期和时间节点操作日期和时间数据并将其转换为不同的格式。支持 Luxon 支持的所有日期格式。
yyyy-MM-dd TTT 返回 带时区的 年-月-日 时分秒 ,方便在后面写入时间时候进行时区转换。
notion image
 
【方式2】除了使用节点还可以在任何输入框中使用表达式来写,支持 luxon 库,可以问 GPT 来写
如下:获取当前时间-增加5分钟-设置为上海的时区
{{ DateTime.now().plus({ minutes: 5 }).setZone('Asia/Shanghai') }}
notion image

Notion 节点

需前往 Notion integrations 中创建一个 key,然后新建一个 Credential
notion image
支持添加图片等 Blocks 到页面内容区,图片需要已 .jpg 等图片格式结尾,但微信图片无法加载(浏览器中可打开)
notion image
notion image

案例2:将Workflow 做成 API 给外部调用

notion image
  • Webhook 节点中的 URL 作为 API 请求的 Endpoint
  • Edit Fields 提取 URL 中的参数字段
  • 响应 Webhook,设置返回的数据
notion image
notion image
 

常见问题

网络相关问题,iptables 规则时遇到错误

错误代码
docker: Error response from daemon: driver failed programming external connectivity on endpoint n8n (de05ae91f5871f330c43db20a9a305d58ecd055be4c70142e92d4a37e12945c2): (iptables failed: iptables --wait -t filter -A DOCKER ! -i docker0 -o docker0 -p tcp -d 172.17.0.4 --dport 5678 -j ACCEPT: iptables: No chain/target/match by that name.
解决方法:重新启动 docker sudo systemctl restart docker
 

获取html字段中的值时,需要转换 英文引号 空格 换行

解决方法:使用表达式 replaceAll() 转换
notion image
 
参考文献