跳到主要内容

在亚马逊云服务上部署n8n#

本部署指南将展示如何使用亚马逊云服务(AWS)自托管n8n。方案采用Kubernetes管理必要资源和反向代理,并使用Postgres作为n8n的数据库后端。

部署选项#

AWS提供多种适用于部署n8n的方式,包括EC2(虚拟机)和EKS(基于Kubernetes的容器)。

本指南选用EKS作为部署方案。虽然使用Kubernetes会带来额外的复杂性和配置要求,但这是根据需求变化扩展n8n的最佳方法。

前置要求#

本指南中的步骤将混合使用AWS管理控制台和EKS专用eksctl命令行工具

虽然eksctl文档未明确提及,但您仍需安装AWS CLI工具完成工具的身份验证配置

自托管技术基础要求

自托管n8n需要具备以下技术知识:

  • 服务器与容器的设置配置
  • 应用资源管理与扩缩容
  • 服务器与应用安全防护
  • n8n配置管理

n8n建议仅由专业用户进行自托管操作。配置失误可能导致数据丢失、安全隐患及服务中断。若缺乏服务器管理经验,推荐使用n8n云托管服务

最新版与预览版说明

n8n每周会发布新的次要版本。latest版本适用于生产环境,next则是最新发布的预览版本。请将next视作测试版本:可能存在不稳定情况。问题反馈请使用官方论坛

当前latest版本:1.119.2
当前next版本:1.119.3

创建集群#

使用eksctl工具创建集群,通过以下命令指定集群名称和区域:

eksctl create cluster --name n8n --region <your-aws-region>

创建集群可能需要一些时间。

集群创建完成后,eksctl 会自动将 kubectl 上下文切换至该集群。

克隆配置仓库#

Kubernetes 和 n8n 需要一系列配置文件。您可以从该代码库中克隆这些文件。以下步骤将说明每个文件的作用以及需要修改的配置项。

使用以下命令克隆代码库:

git clone https://github.com/n8n-io/n8n-hosting.git

并更改目录:

cd n8n-hosting/kubernetes

配置 Postgres#

对于大规模 n8n 部署,Postgres 提供了比 SQLite 更强大的数据库后端。

配置持久化存储卷#

为确保 Pod 重启时数据不丢失,Postgres 部署需要持久化存储卷。默认的 AWS 存储类型 gp3 适用于此场景,相关配置定义在 postgres-claim0-persistentvolumeclaim.yaml 配置清单中。

… spec:
storageClassName: gp3
accessModes:
- ReadWriteOnce …

Postgres 环境变量#

Postgres 需要设置若干环境变量以传递给容器内运行的应用程序。

示例文件 postgres-secret.yaml 包含需替换的占位符,您应将其更改为实际的用户信息和所用数据库的值。

随后,postgres-deployment.yaml 清单文件将使用该清单文件中的值传递给应用 Pod。

配置 n8n#

创建文件存储卷#

虽然并非运行 n8n 所必需,但使用持久化卷有助于保留使用 n8n 时上传的文件。若希望在重启时保持手动设置的 n8n 加密密钥持续有效,此配置尤为重要——系统会在启动时将包含密钥的文件保存至文件存储中。

n8n-claim0-persistentvolumeclaim.yaml 清单文件负责创建此存储卷,而 n8n 部署则通过 n8n-deployment.yaml 清单文件的 volumes 章节挂载该声明。


volumes:
- name: n8n-claim0
persistentVolumeClaim:
claimName: n8n-claim0

Pod 资源#

Kubernetes 允许您指定应用容器所需的最小资源及其运行上限。上文克隆的示例 YAML 文件在 n8n-deployment.yamlresources 配置段中包含以下内容:


resources:
requests:
memory: "250Mi"
limits:
memory: "500Mi"

此配置为每个容器定义了最低250MB、最高500MB的内存限制,并允许Kubernetes自动管理CPU资源。您可以根据实际需求调整这些数值。以下提供n8n云服务的资源配置作为参考:

  • 入门版:320MB内存,10毫核可突增CPU
  • 专业版(1万次执行):640MB内存,20毫核可突增CPU
  • 专业版(5万次执行):1280MB内存,80毫核可突增CPU

可选:环境变量#

您可以通过环境变量配置n8n的各项参数和行为。

创建n8n-secret.yaml文件,具体环境变量说明请参阅环境变量文档。

部署配置#

两个部署清单文件(n8n-deployment.yamlpostgres-deployment.yaml)向Kubernetes定义了n8n和Postgres应用的部署规范。

清单文件具体定义了:

  • 向每个应用Pod传递已配置的环境变量
  • 指定使用的容器镜像
  • 设置资源消耗限制
  • 使用先前定义的volumesvolumeMounts来配置容器内的存储卷挂载路径
  • 扩缩容与重启策略。示例清单中每个Pod仅定义单个实例,请根据实际需求进行调整

服务配置#

两个服务清单文件(postgres-service.yamln8n-service.yaml)通过Kubernetes负载均衡器默认分别使用5432和5678端口向外部暴露服务。

部署至Kubernetes集群#

kubectl apply -f .

命名空间错误

您可能会看到关于找不到“n8n”命名空间的错误提示,这是因为相关资源尚未准备就绪。您可以重新执行相同命令,或先通过以下命令应用命名空间清单:

kubectl apply -f namespace.yaml

配置DNS#

n8n通常在子域名上运行。请通过您的DNS服务商为子域名创建一条DNS记录,并将其指向实例的静态地址。

要查找实例上运行的n8n服务地址:

  1. 在AWS控制台中打开Amazon Elastic Kubernetes Service页面的集群版块
  2. 选择集群名称以打开其配置页面
  3. 选择资源标签页,然后进入服务与网络 > 服务
  4. 选择n8n服务并复制负载均衡器URL值。将此值加上n8n服务端口号(5678)作为DNS配置依据

使用HTTP协议

本指南对其定义的服务使用HTTP连接(例如在n8n-deployment.yaml中)。但若点击负载均衡器URL值,EKS会将您导向返回错误的"HTTPS"地址。解决方案是:访问n8n子域名时请确保使用HTTP协议。

删除资源#

如需删除该部署,可通过以下命令移除清单文件创建的资源:

kubectl delete -f .

后续步骤#