什么是n8n
n8n 是一个免费开源的工作流自动化工具,你可以把它想象成一个数字世界的“乐高积木”或“IFTTT 的强大替代品”。
它的核心理念是:通过拖拽节点和连接线,将不同的应用和服务连接起来,自动完成重复性任务,而无需编写任何代码。
Info
🦄 名字的由来:n8n 是 “nodemation” 的缩写,意为 “Node Automation”。
特点:
- 低代码/无代码
- 灵活
- 多种触发器:手动、定时、webhook触发
竞品比对
| 特性 | n8n | Dify | Coze (扣子) |
|---|---|---|---|
| 核心定位 | 通用工作流自动化 | AI 应用开发平台 | AI Bot 开发与分发平台 |
| 技术焦点 | API 集成、数据处理、任务调度 | LLM (大语言模型) 编排 | Agent (智能体) 构建 |
| 主要用户 | 开发者、运维、业务流程分析师 | AI 应用开发者、产品经理 | Bot 创建者、运营人员、内容创作者 |
| 核心功能 | 连接数百个 App,定时任务,Webhook | RAG、知识库、Prompt 工程、Agent | 多模态 Bot、插件商店、一键发布到各大平台 |
| AI 角色 | 作为众多节点中的一个(如 OpenAI 节点) | 平台的核心和基础 | 平台的核心和基础 |
| 部署方式 | 可自托管 (Docker, 云) | 可自托管 (Docker, 云) | 主要云端服务 |
| 数据隐私 | 高 (可完全本地化) | 高 (可完全本地化) | 低 (依赖平台) |
| 商业模式 | 开源免费 (有付费云版) | 开源免费 (有付费云版) | 开源免费 (有付费云版) |
我喜欢n8n的理由是,纯粹是来开发工作流的,而其他两个由于想做的东西太多,失去了纯粹性,单纯个人观点。
部署
部署有两种方法,一种是部署在本地,另一种是使用docker部署,当然如果你想体验一下,他们官网提供免费14天的体验。
我是用第二种方法 - docker部署,这是官方教程,n8n+postgressql的方式,postgressql的作用是相当于n8n的系统后台数据库,如果你不配置它,n8n默认使用SQLite,主要存储工作流、执行历史、凭证、用户数据。
值得注意的一点是,建议使用docker 的volumes来持久化。
方式一:使用docker compose
管理多容器应用的标准方式,只需一个 docker-compose.yml 文件即可定义所有服务,方便简单
步骤 1: 创建 docker-compose.yml 文件
在你的项目目录下,创建一个名为 docker-compose.yml 的文件,并填入以下内容:
version: '3.8'
services:
postgres:
image: postgres:14-alpine
container_name: n8n-postgres
restart: always
environment:
- POSTGRES_USER=n8n
- POSTGRES_PASSWORD=n8n
- POSTGRES_DB=n8n
volumes:
- postgres_data:/var/lib/postgresql/data
ports:
# 暴露端口是为了方便你从主机用数据库工具连接调试,生产环境可移除
- "5433:5432"
healthcheck:
test: ['CMD-SHELL', 'pg_isready -U n8n']
interval: 5s
timeout: 5s
retries: 10
n8n:
image: n8nio/n8n
container_name: n8n
restart: always
ports:
- "5678:5678"
environment:
# 关键部分:告诉 n8n 使用 PostgreSQL
- DB_TYPE=postgresdb
- DB_POSTGRESDB_HOST=postgres
- DB_POSTGRESDB_PORT=5432
- DB_POSTGRESDB_DATABASE=n8n
- DB_POSTGRESDB_USER=n8n
- DB_POSTGRESDB_PASSWORD=n8n
# N8N_BASIC_AUTH_ACTIVE 和 N8N_BASIC_AUTH_USER/PASSWORD 是可选的,用于为 n8n 界面增加一层基础认证
- N8N_BASIC_AUTH_ACTIVE=true
- N8N_BASIC_AUTH_USER=admin
- N8N_BASIC_AUTH_PASSWORD=your_very_strong_password
volumes:
- n8n_data:/home/node/.n8n
depends_on:
postgres:
condition: service_healthy
volumes:
postgres_data:
n8n_data:
- 文件解析:
services: 定义了两个服务:postgres和n8n。postgres服务:environment: 设置了 PostgreSQL 的数据库、用户和密码。请确保这些值与n8n服务中的连接信息完全一致。volumes: 使用了 Docker 数据卷postgres_data来持久化数据库数据。healthcheck: 这是一个健康检查,确保 PostgreSQL 数据库完全启动并可接受连接后,n8n服务才启动。这可以有效避免因数据库未就绪而导致的连接失败。
n8n服务:environment: 这是连接的关键!我们通过环境变量告诉 n8n 数据库的类型和连接信息。DB_TYPE=postgresdb: 指定使用 PostgreSQL。DB_POSTGRESDB_HOST=postgres: 这是最重要的部分。postgres是我们在同一个docker-compose.yml文件中定义的 PostgreSQL 服务的名称。Docker Compose 会自动将服务名解析到容器的 IP 地址。- 其他
DB_POSTGRESDB_*变量提供了连接数据库所需的端口、数据库名、用户和密码。
depends_on: 确保在postgres服务健康检查通过后,n8n服务才启动。volumes: 使用 Docker 数据卷n8n_data来持久化 n8n 的配置、凭据等信息。
volumes: 在文件顶部定义了两个数据卷postgres_data和n8n_data,用于数据持久化。
步骤2:启动服务
在 docker-compose.yml 文件所在的目录中,打开终端并运行:
docker-compose up -dDocker Compose 会自动拉取镜像、创建网络、启动容器。n8n 会自动连接到 PostgreSQL 实例并完成初始化。
步骤 3: 验证连接
- 访问 n8n: 在浏览器中打开
http://localhost:5678。你应该能看到 n8n 的登录界面。 - 检查日志: 如果遇到问题,可以查看 n8n 容器的日志来诊断。
docker logs n8n应该能看到类似 Database connection successfully initialized. 的日志信息。就代表成功了
方式二:分别构建n8n和postgresql服务
步骤1:创建共同网络
这是两个独立的服务,首先要建立一个互通的网络
# 先创建网络
docker network create n8n-network步骤2:拉取镜像
docker pull n8nio/n8n
docker pull postgres:14-alpine
步骤3:创建volumes
其中先创建两个volumes,即postgres_data和n8n-data,是为了持久化。
docker volume create n8n-data
docker volume create postgres_data步骤4:创建容器
# 启动 PostgreSQL 容器
docker run --name n8n-postgres \
--network n8n-network \
-e POSTGRES_PASSWORD=your_password \
-e POSTGRES_USER=n8n \
-e POSTGRES_DB=n8n \
-v postgres_data:/var/lib/postgresql/data \
-d postgres:latest
# 启动 n8n 容器
docker run --name n8n \
--network n8n-network \
-p 5678:5678 \
-e DB_TYPE=postgresdb \
-e DB_POSTGRESDB_HOST=youthful_mayer \
-e DB_POSTGRESDB_DATABASE=n8n \
-e DB_POSTGRESDB_USER=n8n \
-e DB_POSTGRESDB_PASSWORD=your_password \
-v n8n-data:/home/node/.n8n
-d n8nio/n8n:latest
步骤5:测试
# 查看 n8n 容器的网络信息
docker inspect nostalgic_cerf | grep "NetworkMode" -A 20
# 查看 PostgreSQL 容器的网络信息
docker inspect my-postgres | grep "NetworkMode" -A 20如果网络名称都一样,这就是互通的。
这是n8n环境的初步搭建。让我们动手搭起来吧。