n8n 自托管指南:在 Ubuntu 上使用 Docker Compose 搭建自动化工作流平台

本指南详细介绍了如何在 Ubuntu 服务器上使用 Docker Compose 自托管开源工作流自动化平台 n8n。内容涵盖从基础环境准备、Docker Compose 配置 PostgreSQL 数据库和 n8n 服务,到使用 Nginx 与 Let's Encrypt 配置 HTTPS 实现安全访问,并逐步演示如何创建您的第一个自动化工作流,同时提供常见问题解答和错误排查建议。旨在帮助开发者完全掌控数据隐私、提高工作流的可扩展性与灵活性。

阅读时长: 11 分钟
共 5395字
作者: eimoon.com

n8n(意为“node everywhere node”)是一款强大的开源工作流自动化平台,赋予开发者对集成与数据流的完全掌控能力。与 Zapier 等 SaaS 解决方案不同,n8n 支持在您自己的基础设施上进行自托管(Self-hosted),从而提供无与伦比的灵活性、数据隐私保障和可扩展性。

本教程旨在为初学者提供一个友好的指南,详细介绍如何在 Ubuntu 服务器上使用 Docker Compose 安装和配置 n8n。您还将学习如何解决常见的设置错误、使用 HTTPS 保护您的实例,以及避免生产环境部署中的常见陷阱。

核心要点概览

  • 推荐自托管(Self-hosting):n8n 特别适合寻求完全控制、数据隐私和工作流自动化各个方面定制能力的开发者和小型团队。
  • 基于 Docker Compose 部署在 Ubuntu:这是一种强大且适用于生产环境的 n8n 部署方式,它简化了多服务管理,易于升级,并提供了内置的重启策略。
  • 初始设置:涵盖配置 PostgreSQL 数据库以持久化存储工作流和凭证,为 n8n 及其支持服务配置 Docker 容器,使用 Nginx 和 Let’s Encrypt 设置 HTTPS 以确保安全的 Web 访问,以及创建所有者账户。
  • 保护 n8n 实例:通过启用 HTTPS 加密所有流量,设置强凭证,并配置环境变量以避免不安全的 Cookie 和开放端口。生产环境部署需要限制访问、使用防火墙并定期更新容器。
  • 免费许可证激活:激活免费许可证可以解锁高级工作流触发器、额外集成以及社区用户的优先支持等高级功能。
  • 可视化工作流构建:使用 n8n 直观的拖放编辑器构建工作流,轻松添加触发器(Triggers)、设置条件逻辑、执行 Shell 命令,并连接到数百个第三方服务,无需编写代码。
  • 示例用例:例如,使用 UptimeRobot 监控服务器正常运行时间,n8n 可自动运行 Shell 命令尝试恢复,并通过 Slack、WhatsApp 或 Discord 等渠道向团队发送实时通知。
  • 可扩展设计:n8n 可与 AWS、GCP、Azure 等云平台、Jira、Zendesk 等票务系统,甚至智能 AI 框架集成,实现更高级的智能自动化。

什么是 n8n 以及为何选择它?

n8n 允许您通过可视化界面连接各种服务并自动化工作流。您可以集成 API、数据库、云应用程序,甚至使用 JavaScript 实现自定义逻辑。

n8n 作为一款灵活、对开发者友好的自动化平台,凭借其丰富的功能集,在集成和工作流管理方面表现出色:

  • 可视化工作流编辑器(Visual Workflow Editor):通过拖放设计器构建、可视化和配置复杂自动化流程,无需编写代码。
  • 300+ 预置集成(Integrations):无缝连接到 GitHub、Google Sheets、Slack、MySQL、AWS、Discord、Trello 等大量主流服务和应用程序。
  • 自托管(Self-hosting)支持:支持使用 Docker、Docker Compose 或直接在裸机服务器上部署 n8n,提供对数据、安全性、扩展性和自定义配置的完全控制。
  • 原生 JavaScript 功能:使用内置的 Function 节点,直接在工作流中插入自定义 JavaScript 代码,用于数据转换、实现业务逻辑或与 API 交互。
  • 事件驱动执行(Event-driven Execution):根据传入的 Webhook、计划的 Cron Job、连接应用程序中的更改或手动调用等事件触发工作流。
  • 模块化和可扩展架构:支持添加自定义节点,创建可重用子工作流,并通过社区插件或您自己的代码扩展 n8n 的功能。
  • 强大的安全和访问控制:支持启用身份验证(Authentication)、HTTPS 和细粒度的用户权限,以保护工作流和敏感数据。

n8n 具有极高的灵活性和可扩展性,既能处理简单的自动化任务,也能胜任复杂的企业级工作流需求。

选择合适的部署方式:云端 vs. 自托管

选项 优点 缺点 推荐用户
n8n 云服务 无需设置,由官方托管基础设施,可扩展 付费订阅,对后端控制有限 非技术用户,追求快速启动
通过 Docker 自托管 完全控制,成本效益高,数据安全有保障 需要自行设置和服务器维护 开发者,拥有基础设施的团队
裸机(Node.js) 最大灵活性,适用于特定边缘用例 需要手动配置和更新,维护成本高 高级用户,或有特殊环境需求者

对于大多数开发者和小型团队而言,在 Ubuntu 上基于 Docker 自托管 n8n 提供了控制与简便性的最佳平衡。

前提条件

在开始安装之前,请确保您已准备好以下条件:

  • 运行 Ubuntu 22.04(或更高版本)的服务器。
  • 一个指向您服务器 IP 地址的注册域名。
  • Root 访问权限或 sudo 权限。
  • 已安装 Docker 和 Docker Compose。
  • 可选:用于 Let’s Encrypt SSL 证书的电子邮件账户。

您可以使用以下命令安装 Docker 和 Docker Compose:

sudo apt update
sudo apt install docker.io docker-compose -y

步骤1:创建 Docker Compose 配置

为您的 n8n 栈设置一个专门的目录,并进入该目录:

mkdir ~/n8n && cd ~/n8n
nano docker-compose.yml

将以下最小化配置(包含 PostgreSQL 数据库和 n8n 服务)粘贴到 docker-compose.yml 文件中:

version: '3.7'

services:
  db:
    image: postgres:14
    environment:
      - POSTGRES_USER=n8n
      - POSTGRES_PASSWORD=n8npass
      - POSTGRES_DB=n8n
    volumes:
      - postgres_data:/var/lib/postgresql/data

  n8n:
    image: n8nio/n8n
    ports:
      - "5678:5678"
    environment:
      - DB_TYPE=postgresdb
      - DB_POSTGRESDB_HOST=db
      - DB_POSTGRESDB_DATABASE=n8n
      - DB_POSTGRESDB_USER=n8n
      - DB_POSTGRESDB_PASSWORD=n8npass
      - N8N_BASIC_AUTH_ACTIVE=true
      - N8N_BASIC_AUTH_USER=admin
      - N8N_BASIC_AUTH_PASSWORD=strongpass
      - N8N_HOST=n8n.yourdomain.com
      - WEBHOOK_TUNNEL_URL=https://n8n.yourdomain.com
    depends_on:
      - db
    volumes:
      - n8n_data:/home/node/.n8n

volumes:
  postgres_data:
  n8n_data:

重要提示:

  • 请务必将 POSTGRES_PASSWORDN8N_BASIC_AUTH_PASSWORD 的值替换为您的强密码。
  • N8N_HOSTWEBHOOK_TUNNEL_URL 中的 n8n.yourdomain.com 替换为您自己的域名。

步骤2:启动 n8n 并验证安装

~/n8n 目录下,运行以下命令启动 Docker 容器:

docker-compose up -d

访问 n8n Web 界面

  • 在浏览器中访问您的服务器 IP 地址和 n8n 端口:
    http://your_server_ip:5678
    
  • 或者,在设置好 DNS 解析和反向代理后,使用您的域名访问。

重要提示: 如果您通过 IP 地址或未使用 HTTPS 的域名访问 n8n,可能会遇到浏览器安全警告。这是因为 n8n 默认使用安全的 Cookie,这些 Cookie 需要 HTTPS 环境。

解决方案:

  • 推荐(生产环境):配置有效的 TLS 证书以启用 HTTPS。
  • 仅用于本地开发:设置环境变量 N8N_SECURE_COOKIE=false(请注意,这在生产环境中是不安全的)。

步骤3:使用 HTTPS 保护 n8n

我们将使用 Nginx 作为反向代理,并结合 Let’s Encrypt 颁发的 SSL 证书,通过 HTTPS 为 n8n 提供安全访问。

安装 Nginx 和 Certbot

sudo apt install nginx certbot python3-certbot-nginx -y

注意: 如果您仅想使用 HTTP(不建议用于生产环境),可以使用以下 Nginx 配置作为 n8n 的反向代理:

选项1:仅 HTTP 代理(用于本地或不安全设置)

创建一个 Nginx 配置文件,例如 /etc/nginx/sites-available/n8n

server {
  listen 80;
  server_name n8n.yourdomain.com;

  location / {
    proxy_pass http://localhost:5678;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
  }
}

选项2:HTTPS 代理(推荐用于生产环境)

此配置用于启用 HTTPS,并等待您通过 Certbot 获取 SSL 证书。同样创建 Nginx 配置文件 /etc/nginx/sites-available/n8n

server {
  listen 443 ssl;
  server_name n8n.yourdomain.com;

  ssl_certificate /etc/letsencrypt/live/n8n.yourdomain.com/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/n8n.yourdomain.com/privkey.pem;

  location / {
    proxy_pass http://localhost:5678;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
  }
}

保存文件后,创建软链接并测试 Nginx 配置,然后重新加载 Nginx 服务:

sudo ln -s /etc/nginx/sites-available/n8n /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx

颁发 SSL 证书

现在使用 Certbot 为您的域名颁发 Let’s Encrypt SSL 证书:

sudo certbot --nginx -d n8n.yourdomain.com

Certbot 将引导您完成证书颁发过程,并自动修改 Nginx 配置以使用新证书。

n8n Web 界面初始设置

一旦 n8n 成功运行在 https://n8n.yourdomain.com,您将看到一系列设置屏幕,然后才能进入主工作流仪表板。

1. 设置所有者账户

第一个屏幕会提示您创建所有者账户,需要输入电子邮件地址、名字、姓氏和密码(密码长度至少8个字符,包含1个数字和1个大写字母)。

2. 定制您的实例

账户创建后,n8n 会提出一些可选问题来个性化您的设置,这些问题并非强制,但有助于优化您的使用体验。

3. 免费功能注册

您可以选择通过注册社区实例来免费解锁部分付费功能(如执行历史、高级调试和文件夹结构)。您需要输入电子邮件地址以接收免费许可证密钥。

4. 许可证密钥激活

输入电子邮件后,请检查您的收件箱以获取许可证密钥。您将收到一个唯一的激活码,可以按照以下步骤输入:

导航至:设置 → 用法和计划 → 输入激活密钥。

提交密钥后,您的实例将显示为“已注册”,从而解锁高级功能以供终身使用。这些初始步骤完成了 n8n 界面的设置,并解锁了生产使用所需的功能。

步骤4:创建您的第一个工作流

一旦您的 n8n 实例在 https://n8n.yourdomain.com 上运行,您就可以在几分钟内创建并测试您的第一个自动化工作流。以下是如何通过 Web 界面完成此操作:

步骤1:注册/登录

访问您的域名后,系统会提示您注册并创建您的所有者账户。这将取代 Docker Compose 中硬编码凭证的需要。

步骤2:创建新工作流

登录 n8n 仪表板后,点击顶部栏的“新工作流(New Workflow)”。这将打开可视化编辑器,您将在此构建自动化流程。

步骤3:添加 Webhook 触发器

  1. 从左侧边栏拖入一个 Webhook 节点。
  2. HTTP 方法(HTTP Method) 设置为 POST
  3. 路径(Path) 设置为 test-webhook
  4. 点击 保存(Save)

步骤4:添加响应节点

  1. 拖入一个 Set 节点并将其连接到 Webhook 节点。
  2. Set 节点中,点击“添加值(Add Value)”→“字符串(String)”。
  3. 将名称输入为 message,值输入为 "Hello from n8n!"

步骤5:激活工作流

切换右上角的**“Active”**开关以启用工作流。

步骤6:触发工作流

使用以下 curl 命令触发工作流:

curl -X POST https://n8n.yourdomain.com/webhook/test-webhook

如果成功,您将在响应中看到消息 "Hello from n8n!",并且执行日志将出现在 n8n 仪表板中。

恭喜,您已成功在 n8n 中构建了您的第一个自动化工作流!

示例工作流:服务器停机恢复与通知

为了演示 n8n 在实际自动化中的应用,这里有一个使用 UptimeRobot 监控并处理服务器或域名停机的工作流。此设置能检测到故障,触发 Shell 命令重启服务,必要时更新 Cloudflare 上的 DNS 或 SSL 设置,并发送实时警报。

用例场景

  • 使用 UptimeRobot 监控您的域名/服务器的运行状态。
  • 当检测到停机故障时,通过 Shell 命令重启 Nginx 或其他相关服务。
  • 在必要时连接 Cloudflare API,执行高级域名管理任务,例如切换 SSL 设置、更新 DNS 记录或清除 CDN 缓存。
  • 通过 Slack 和 WhatsApp 等并行渠道向所有相关团队成员发送实时通知。
  • 通过 Discord 设置审批步骤,暂停工作流,等待管理员手动批准或确认。
  • 循环监控器以持续进行健康检查。

工作流分解

  1. 计划触发器(Schedule Trigger):自动在预设间隔(例如,每5或10分钟)启动工作流,确保持续的健康检查。
  2. 获取监控器 (UptimeRobot):连接到 UptimeRobot API,获取所有配置监控器的实时状态。
  3. 执行命令(Execute Command):当检测到故障时,在服务器上运行 Shell 命令,以重启 Nginx 或其他服务。
  4. Cloudflare 集成:连接 Cloudflare API,执行高级域名管理任务,如切换 SSL 设置、更新 DNS 记录或清除缓存。
  5. 发送通知:使用并行节点通过 Slack 和 WhatsApp 向所有相关团队成员发送实时通知。
  6. 审批步骤 (Discord):暂停工作流,向指定的 Discord 频道发送消息,请求管理员手动批准。
  7. 遍历项(Iterate Items):循环遍历所有受监控的端点或服务,为每个项重复健康检查和修复过程。

这个示例突出了 n8n 如何在无需人工干预的情况下实现主动事件恢复和警报,除非需要人工审批。其模块化设计还允许您扩展此逻辑,以包括日志记录、升级工作流或与外部票务系统集成。

常见错误排除

错误 原因 解决方案
401 Unauthorized 未授权 缺少或不正确的基本认证(Basic Auth) 仔细检查 N8N_BASIC_AUTH_ACTIVEN8N_BASIC_AUTH_USERN8N_BASIC_AUTH_PASSWORD 等环境变量设置。
Webhook 未触发 域名/DNS 配置错误 验证 WEBHOOK_TUNNEL_URL 环境变量是否正确配置为可访问的 URL,并检查 DNS 解析是否生效。
JavaScript 堆内存不足 Node.js 进程内存不足 在 n8n 服务的环境变量中添加 NODE_OPTIONS=--max-old-space-size=2048 来增加 Node.js 进程可用的内存大小(单位 MB)。
卷权限被拒绝(Permission Denied on Volume) 文件系统所有权问题 执行 sudo chown -R 1000:1000 ./n8n_data 命令,确保 Docker 容器内的用户有权限访问挂载卷。
SSL 不工作 证书缺失或 DNS 未完全传播 等待 DNS 传播完成,重新尝试 certbot 命令获取证书,并确保您的域名 DNS 记录指向正确的服务器 IP。

常见问题 (FAQs)

Q1: 在 Ubuntu 上安装 n8n 的前提条件是什么? A1: 需要 Ubuntu 22.04+ 服务器(具备 root/sudo 权限),一个指向服务器 IP 的注册域名,以及已安装 Docker 和 Docker Compose。建议提供一个用于 SSL 证书(Let’s Encrypt)的电子邮件地址。

Q2: 在 Ubuntu 上为生产环境安装 n8n 的最佳方式是什么? A2: 推荐使用 Docker Compose。此方法将 n8n 及其依赖项(如 PostgreSQL)隔离在容器中,便于升级、扩展和备份,并可通过环境变量定义持久化存储和重启策略。

Q3: 如何使用 HTTPS 保护 Ubuntu 上的 n8n 实例? A3: 在 n8n Docker 容器前设置反向代理(如 Nginx),使用 Let’s Encrypt 获取免费 SSL 证书,并配置 Nginx 将 HTTPS 流量转发到 n8n 容器。

Q4: 在 Ubuntu 上,n8n 是否需要独立的数据库? A4: 是的,对于生产部署,强烈建议使用 PostgreSQL 等外部数据库,而非默认的 SQLite,以确保数据持久性、可靠性和易于扩展。

Q5: 如何备份 n8n 实例? A5: 定期备份 n8n_datapostgres_data Docker 卷。对于数据库级别的备份,可以使用 PostgreSQL 命令(如 pg_dump)导出数据。

Q6: n8n 能与 Git 进行版本控制吗? A6: 可以。虽然 n8n 不提供工作流的原生 Git 集成,但您可以将工作流导出为 JSON 文件并提交到 Git 仓库进行版本控制。

Q7: 如何安全地升级 n8n 实例? A7: 使用 Docker Compose 时,只需使用 docker-compose pull 拉取最新镜像,然后使用 docker-compose up -d 重启容器。在升级前务必备份 Docker 卷,以防万一。

Q8: n8n 中“活跃(Active)”和“手动(Manual)”执行有什么区别? A8: “活跃”执行由真实世界事件(如 Webhook 请求、计划触发器)触发;“手动”执行则在开发过程中通过点击“执行工作流(Execute Workflow)”按钮发生。

Q9: n8n 能扩展以处理高并发工作流吗? A9: 可以,n8n 支持使用队列模式(Queue Mode)进行扩展。在此设置中,中央队列(如 Redis)将作业分发到多个 n8n 工作实例,适用于高并发场景。

Q10: n8n 是否支持并行运行多个工作流? A10: 是的,只要服务器资源充足,n8n 就支持并行执行多个工作流。每个工作流执行都是独立的,互不干扰。

延伸阅读

总结

n8n 为开发者提供了一个强大、可扩展的平台,用于自动化从简单电子邮件警报到完整后端编排的各种工作流。通过在 Ubuntu 上使用 Docker 自托管 n8n,您可以同时实现完全控制和成本节约。

一次设置,您将发现 n8n 在项目中的众多用例,从触发 CI/CD 任务到监控 Webhook 或集成 AI 服务。您还可以通过访问我们的使用 Agentic AI 构建自主系统指南,探索代理工作流如何驱动自主系统。

关于

关注我获取更多资讯

公众号
📢 公众号
个人号
💬 个人号
使用 Hugo 构建
主题 StackJimmy 设计