原创 王晓亮 2025-06-24 22:29 浙江
Datawhale干货
作者:王晓亮,Datawhale成员
目录
作为一个程序员,我一直期望可以追踪 GitHub 的 Trending 项目,但是每次都要去 GitHub 上手动查看并挨个浏览 GitHub 仓库内容,非常麻烦。
在接触到 n8n 之后,我萌生一个想法,利用 n8n 自动化进行 GitHub Trending 项目的追踪, 并生成邮件通知,甚至自动化发布到我的博客站点中。通过周末两天时间完成该工作流的搭建,并成功运行。以下是 n8n 相关介绍及工作流搭建过程,分享给大家。
n8n 初识:一个自动化超级英雄
n8n 是 nodemation 的简称,是一个开源的、高度可扩展的工作流自动化工具。GitHub 仓库为 https://github.com/n8n-io/n8n ,当前 Star 数已经达到 108K。它允许你通过一个直观的可视化界面,将不同的应用、服务和数据连接起来,创建复杂的自动化流程,从而提升效率、减少重复性工作。
核心特点:
可视化工作流编辑器:n8n 提供一个直观的拖拽式界面,让你可以轻松地构建和管理复杂的自动化流程,即使是没有任何编程背景的用户也能快速上手。
丰富的节点库:拥有庞大的预构建节点库,支持连接几乎所有主流的应用和服务,包括各种 API、数据库(如 Supabase)、SaaS 平台(如 GitHub、Slack)、以及自定义 Webhooks 等。这使得数据流转和任务协同变得异常简单。
高度灵活性:支持各种复杂的逻辑控制,如条件分支(if/else)、循环(loop)、并行执行等, 你可以根据业务需求构建出高度定制化的自动化流程。
自托管/云服务选项:n8n 提供极大的部署灵活性。你可以选择将其私有部署在自己的服务器上, 完全掌控数据安全和隐私;同时,n8n 也提供云服务选项,方便快速启动和管理。
低代码/无代码特性:n8n 巧妙地平衡了易用性和功能性。对于非技术人员,它提供无代码的拖拽操作,实现快速自动化;而对于开发者,它允许在工作流中嵌入自定义代码(如 JavaScript),实现更高级、更个性化的功能扩展。
相较于市面上其他自动化工具,n8n 的核心优势在于其开源的本质和卓越的可扩展性。开源意味着透明、社区驱动的快速发展,并且可以根据你的具体需求进行深度定制。而其强大的节点系统和灵活的编程能力, 使得它不仅能满足日常的简单自动化需求,更能应对复杂的企业级工作流挑战,真正成为“自动化超级英雄”。
部署 n8n 环境:开启自动化之旅
n8n 提供多种自托管部署方式,且官方提供参考仓库 https://github.com/n8n-io/n8n-hosting 。
这里我使用 docker compose 部署,同时为了后期 OAuth 相关认证支持,还需要准备一个子域名用作 n8n 服务的域名。需提前将域名解析指向 n8n 服务的公网地址。
mkdir n8n-compose && cd n8n-compose
docker-compose.yml
与init-data.sh
.env
(更改下列配置项为实际值)POSTGRES_USER=changeUser
POSTGRES_PASSWORD=changePassword
POSTGRES_DB=n8n
POSTGRES_NON_ROOT_USER=changeUser
POSTGRES_NON_ROOT_PASSWORD=changePassword
ENCRYPTION_KEY=changeEncryptionKey
N8N_EDITOR_BASE_URL=https://n8n.example.com
WEBHOOK_URL=https://n8n.example.com
4. 在容器配置文件中加上环境变量配置
diff --git a/docker-compose/withPostgresAndWorker/docker-compose.yml b/docker-compose/withPostgresAndWorker/docker-compose.yml
index b5b2de6..2d8cdfc 100644
--- a/docker-compose/withPostgresAndWorker/docker-compose.yml
+++ b/docker-compose/withPostgresAndWorker/docker-compose.yml
@@ -19,6 +19,8 @@ x-shared: &shared
- QUEUE_BULL_REDIS_HOST=redis
- QUEUE_HEALTH_CHECK_ACTIVE=true
- N8N_ENCRYPTION_KEY=${ENCRYPTION_KEY}
+ - N8N_EDITOR_BASE_URL=${N8N_EDITOR_BASE_URL}
+ - WEBHOOK_URL=${WEBHOOK_URL}
links:
- postgres
- redis
docker-compose up -d
docker-compose ps
,可以得到如下输出NAME COMMAND SERVICE STATUS PORTS
n8n-compose-n8n-1 "tini -- /docker-ent…" n8n running 0.0.0.0:5678->5678/tcp, :::5678->5678/tcp
n8n-compose-n8n-worker-1 "tini -- /docker-ent…" n8n-worker running 5678/tcp
n8n-compose-postgres-1 "docker-entrypoint.s…" postgres running (healthy) 5432/tcp
n8n-compose-redis-1 "docker-entrypoint.s…" redis running (healthy) 6379/tcpn8n.example.com
7. 配置反向代理服务,如 Caddyserver 可以添加如下配置至 /etc/caddy/Caddyfile
n8n.example.com {
reverse_proxy localhost:5678
}
实现 GitHub Trending 每日追踪
接下来到了工作流搭建过程。先规划整体工作流运转流程:
定时获取 GitHub Trending 项目列表并存储
基于存储的项目列表,选择合适的项目进行 git 仓库信息获取,主要为项目 README 内容等
使用 LLM 对获取的信息进行文本总结,输出 Markdown 格式内容
将输出内容进行邮件发送或者存储至博客系统中
数据存储我使用 Supabase 的数据库,博客系统为我个人博客主站,使用 hugo 搭建并由 GitHub Actions 自动部署。整个过程中使用的核心 node 有
HTTP Request(https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.httprequest/)
GitHub(https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.github/)
Supabase(https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.supabase/)
Code(https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.code/)
Basic LLM Chain(https://docs.n8n.io/integrations/builtin/cluster-nodes/root-nodes/n8n-nodes-langchain.chainllm/)
获取 GitHub Trending 项目列表与信息总结、内容发布有不同的时间周期,我将其分为两个不同的工作流。
工作流 1 - 获取 GitHub Trending 项目列表并存储
由于 GitHub Trending 项目列表是动态的,且 GitHub 官方不提供 API。为此我写了一个 Python 脚本获取 GitHub Trending 项目列表,并包装成本地服务提供 API 供工作流使用,当然绝大部分代码由 LLM 生成。该服务已经开源,地址为https://github.com/tomowang/github-trending 。
n8n-compose_default
为 n8n 所在的 docker-compose 的网络名称):docker run -d \ -p 18000:8000 \ --name github-trending \ --restart always \ --network n8n-compose_default \ ghcr.io/tomowang/github-trending:latest
HTTP Request
节点访问本地服务,配置如下(注意其中的URL
部分,使用 docker 网络中的 service 作为域名):后续 Code 节点填充额外的时间、当前列表排名等信息,最后数据使用 Supabase 节点进行存储。Supabase 表结构如下:
create table public.trending_repos (
id bigint generated by default as identity not null,
name character varying not null default ''::character varying,
description text null default ''::text,
language character varying null default ''::charactervarying,
stars integer null,
forks integer null,
today_stars integer null,
built_by text[] null,
date timestamp without time zone null,
rank smallint null,
constraint trending_repos_pkey primarykey(id)
)TABLESPACEpg_default;
使用 Supabase 需要我们添加 Supabase 的认证信息
- 获取 Supabase Project URL 信息:Project Settings -> Data API -> Project URL