在亚马逊云服务上托管 n8n#
本托管指南将向您展示如何使用亚马逊云服务(Amazon Web Services, AWS)自行托管 n8n。该方案采用 Kubernetes 来管理所需资源和反向代理,并以 Postgres 作为 n8n 的数据库后端。
托管选项#
AWS 提供了多种适合托管 n8n 的方式,包括 EC2(虚拟机)和 EKS(基于 Kubernetes 运行的容器)。
本指南选择 EKS 作为托管方案。尽管使用 Kubernetes 会增加一定的复杂性和配置步骤,但它是应对需求变化、实现 n8n 水平扩展的最佳方法。
前提条件#
本指南中的操作结合使用 AWS 管理控制台(UI)以及 EKS 的命令行工具 eksctl。
虽然 eksctl 的文档中未明确提及,但您还需要 安装 AWS CLI 工具,并配置该工具的身份验证。
自行托管的知识要求
自行托管 n8n 需要具备一定的技术知识,包括:
- 服务器与容器的搭建和配置
- 应用资源管理与扩展
- 服务器与应用的安全防护
- n8n 的配置
n8n 建议专家用户采用自托管(self-hosting)方式。操作失误可能导致数据丢失、安全问题和系统停机。如果您没有管理服务器的经验,n8n 推荐使用 n8n Cloud。
最新版本与下一个版本
n8n 每周通常会发布一个新的次要版本。latest 版本适用于生产环境。next 是最新的发布版本,应被视为测试版(beta):它可能不稳定。如需报告问题,请使用 论坛。
当前 latest:1.115.2
当前 next:1.116.1
创建集群#
使用 eksctl 工具创建集群,通过以下命令指定名称和区域:
1| ``` eksctl
---|---
创建集群可能需要一些时间。
集群创建完成后,eksctl 会自动将 kubectl 上下文设置为该集群。
## 克隆配置仓库#
Kubernetes 和 n8n 需要一系列配置文件。您可以从 此仓库 克隆这些文件。后续步骤将说明每个文件的作用以及需要修改的设置。
使用以下命令克隆仓库:1
| ```
git---|--- 然后切换目录:
1| ``` cd
---|---
## 配置 Postgres#
对于大规模的 n8n 部署,Postgres 相比 SQLite 提供了更稳健的数据库后端。
### 配置持久化存储卷#
为了在 Pod 重启之间保留数据,Postgres 部署需要一个持久化卷(persistent volume)。默认的 AWS 存储类 gp3 适合此用途。该配置定义在 `postgres-claim0-persistentvolumeclaim.yaml` 清单文件中。1 2 3 4 5 6
| ```
…
spec:
storageClassName: gp3
accessModes:
- ReadWriteOnce
…
---|---
### Postgres 环境变量#
Postgres 需要设置一些环境变量,以便传递给容器中运行的应用程序。
示例文件 `postgres-secret.yaml` 包含占位符,你需要用自己的用户信息和数据库名称替换这些值。
随后,`postgres-deployment.yaml` 清单文件会使用该清单中的值,将其传递给应用的 Pod。
## 配置 n8n#
### 创建用于文件存储的卷#
虽然对于运行 n8n 并非必需,但使用持久化卷(persistent volumes)有助于保留使用 n8n 期间上传的文件。此外,如果你希望在重启之间保留 手动配置的 n8n 加密密钥,也建议使用持久化卷,因为启动时会将包含密钥的文件保存到文件存储中。
`n8n-claim0-persistentvolumeclaim.yaml` 清单文件用于创建此卷,而 n8n 的 Deployment 在 `n8n-deployment.yaml` 清单的 `volumes` 部分挂载该声明。1 2 3 4 5 6
| ```
…
volumes:
- name: n8n-claim0
persistentVolumeClaim:
claimName: n8n-claim0
…---|---
Pod 资源#
Kubernetes 允许你指定应用容器所需的最小资源以及可使用的资源上限。上述克隆的示例 YAML 文件中,在 n8n-deployment.yaml 文件的 resources 部分包含如下内容:
1
2
3
4
5
6
7| ``` … resources: requests: memory: "250Mi" limits: memory: "500Mi" …
---|---
这定义了每个容器至少需要 250MB 内存,最多可使用 500MB 内存,CPU 资源则由 Kubernetes 自动管理。你可以根据自身需求调整这些值。作为参考,以下是 n8n 云服务各版本的资源配置:
* **Start(入门版)**:320MB RAM,10 millicore CPU(可突发)
* **Pro(10k 执行次数)**:640MB RAM,20 millicore CPU(可突发)
* **Pro(50k 执行次数)**:1280MB RAM,80 millicore CPU(可突发)可选:环境变量#
你可以使用环境变量来配置 n8n 的设置和行为。
创建一个 n8n-secret.yaml 文件。有关 n8n 环境变量的详细信息,请参考 环境变量。
部署#
两个部署清单文件(n8n-deployment.yaml 和 postgres-deployment.yaml)用于向 Kubernetes 定义 n8n 和 Postgres 应用程序。
这些清单定义了以下内容:
- 将之前定义的环境变量发送到每个应用 Pod
- 指定要使用的容器镜像
- 设置资源消耗限制
- 使用之前定义的
volumes和volumeMounts来指定容器内挂载卷的路径 - 扩展(scaling)和重启策略。示例清单中每种 Pod 各定义了一个实例,你应根据需要进行调整。
服务#
两个服务清单文件(postgres-service.yaml 和 n8n-service.yaml)默认通过 Kubernetes 负载均衡器分别使用端口 5432 和 5678 将服务暴露给外部网络。
发送到 Kubernetes 集群#
在 n8n-kubernetes-hosting 目录下运行以下命令,将所有清单文件发送到集群:
1| ``` kubectl
---|---
命名空间错误
你可能会看到关于找不到 "n8n" 命名空间的错误消息,这是因为相关资源尚未就绪。你可以再次运行相同命令,或先使用以下命令单独应用命名空间清单:1
| ```
kubectl---|---
配置 DNS#
n8n 通常在一个子域名下运行。请在你的 DNS 提供商处为该子域名创建一条记录,并将其指向实例的静态地址。
要查找运行在实例上的 n8n 服务的地址:
- 在 AWS 控制台中打开 Amazon Elastic Kubernetes Service 页面的 Clusters(集群)部分。
- 选择集群名称以打开其配置页面。
- 选择 Resources(资源)选项卡,然后选择 Service and networking > Services(服务与网络 > 服务)。
- 选择 n8n 服务,复制 Load balancer URLs(负载均衡器 URL)的值。将此值加上 n8n 服务端口(5678)作为 DNS 记录的目标地址使用。
使用 HTTP
本指南中定义的服务使用 HTTP 连接,例如在 n8n-deployment.yaml 文件中。然而,当你点击 Load balancer URLs(负载均衡器 URL)的值时,EKS 会将你导向一个 "HTTPS" URL,这会导致错误。要解决此问题,在打开 n8n 子域名时,请确保使用 HTTP。
删除资源#
如果需要删除该部署设置,可以使用以下命令删除由清单文件创建的资源:
1| ``` kubectl
---|---
## 下一步#
* 了解更多关于 配置 和 扩展 n8n 的内容。
* 或者开始探索使用 n8n:尝试 快速入门指南(Quickstarts)。