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