在 Google Cloud Run 上部署和运行 n8n

1. 简介

在此 Codelab 中,您将在 Google Cloud Run 上设置 n8n。n8n 是一款开源工作流自动化工具,用户可以使用它连接不同的应用和服务,以自动执行重复性任务。

此 Codelab 基于 n8n 文档指南,该指南介绍了如何在 Google Cloud Run 上托管 n8n。我们将安装和配置一个版本的 n8n,该版本是 n8n 在 Cloud Run 上的更持久、生产级部署。它包含数据库(用于持久性)和 Secret Manager(用于敏感数据)等资源。

实践内容

  • Google Cloud Run 上部署 n8n,这是一个全托管式无服务器计算平台,可在 Google 的基础设施上运行无状态容器。

学习内容

  • 预配和填充 Cloud SQL for PostgreSQL 数据库,该数据库将作为 n8n 安装的持久且耐用的版本。
  • 将 n8n 容器映像预配到 Google Cloud Run。
  • 测试在 Google Cloud Run 上安装 n8n。

所需条件

  • Chrome 网络浏览器
  • Gmail 账号
  • 启用了结算功能的 Cloud 项目

2. 准备工作

创建项目

  1. Google Cloud 控制台的项目选择器页面上,选择或创建一个 Google Cloud 项目
  2. 确保您的云项目已启用结算功能。了解如何 检查项目是否已启用结算功能
  3. 您将使用 Cloud Shell,这是一个在 Google Cloud 中运行的命令行环境,它预加载了 bq。点击 Google Cloud 控制台顶部的“激活 Cloud Shell”图标。

“激活 Cloud Shell”按钮图片

  1. 连接到 Cloud Shell 后,您可以使用以下命令检查自己是否已通过身份验证,以及项目是否已设置为您的项目 ID:
gcloud auth list
  1. 在 Cloud Shell 中运行以下命令,以确认 gcloud 命令了解您的项目。
gcloud config list project
  1. 如果项目未设置,请使用以下命令进行设置:
gcloud config set project <YOUR_PROJECT_ID>
  1. 通过以下命令启用所需的 API。这可能需要几分钟时间,请耐心等待。
gcloud services enable run.googleapis.com \
                       sqladmin.googleapis.com \
                       secretmanager.googleapis.com 

成功执行该命令后,您应该会看到类似于以下内容的消息:

Operation "operations/..." finished successfully.

如果缺少任何 API,您始终可以在实现过程中启用它。如需了解 gcloud 命令和用法,请参阅 文档

最后,我们将设置几个环境变量,这些变量将在我们将在接下来的几个步骤中运行的脚本中使用。在 Cloud Shell 终端中,执行以下两个命令(请务必将 GCP_PROJECT_IDGCP_REGION 替换为您的项目 ID 和您希望完成此部署的区域(例如 us-central1)的相应值。我们将使用 us-central1 进行部署。

export PROJECT_ID=GCP_PROJECT_ID
export REGION=us-central1

3. 创建 Cloud SQL 实例

我们将使用 Google Cloud SQL for PostgreSQL 实例,该实例将作为我们的持久层来存储 n8n 实例和执行数据。这是必需的,这样我们的设置才是持久的。

Cloud SQL for PostgreSQL 是一项全托管式数据库服务,可帮助您在 Google Cloud Platform 上设置、维护、管理和控制 PostgreSQL 关系型数据库。

在 Cloud Shell 中运行以下命令以创建实例:

gcloud sql instances create n8n-db \
--database-version=POSTGRES_15 \
--tier db-g1-small \
--region=us-central1 \
--edition=ENTERPRISE \
--root-password=postgres

此命令大约需要 5 分钟 才能执行完毕。成功执行该命令后,您应该会看到一条输出,表明该命令已完成,以及您的 Cloud SQL 实例信息,例如 NAME、DATABASE_VERSION、LOCATION 等。

请注意,我们已将 root-password 值用作 postgres。如果您将其更改为其他值,请妥善保管。

4. 设置 n8n 数据库和数据库用户凭据

现在,我们已准备好 Cloud SQL for PostgreSQL 实例,可以在其中创建 n8n 数据库,并将数据库密码和加密密钥存储在 Google Cloud Secrets Manager 中。

首先,让我们在创建的 Cloud SQL 实例 (n8n-db) 中创建一个名为 n8n 的数据库。以下所有命令都将在 Google Cloud Shell 终端中运行。

gcloud sql databases create n8n --instance=n8n-db

成功创建后,您应该会看到如下消息:

Creating Cloud SQL database...done.                                                                                                                                                                                                           
Created database [n8n].
instance: n8n-db
name: n8n
project: YOUR_GCP_PROJECT_ID

现在数据库已创建,让我们为该数据库创建一个用户账号。我们将使用以下凭据:

  • 用户 ID:n8n-user
  • 密码:n8n

注意:如果您想使用更安全的密码(建议用于生产环境),则应使用该密码,而不是我们在此处选择的密码(即 n8n),但请确保在接下来的几个命令中也使用该密码。

用于创建数据库用户的命令如下所示:

gcloud sql users create n8n-user \
    --instance=n8n-db \
    --password="n8n"

此时,最好将用户数据库密码和加密密钥的凭据存储到 Google Cloud Secret Manager 中,这是一个安全便捷的存储系统,用于存储 API 密钥、密码、证书和其他敏感数据。

我们首先使用以下命令,该命令会获取我们使用的密码 (n8n) 并将其通过管道传递到 gcloud secrets create 命令。我们的密钥将是 n8n-db-password

printf "n8n" | gcloud secrets create n8n-db-password --replication-policy="automatic" --data-file=-        

同样,我们将使用下一组命令生成加密密钥,然后创建一个 Secret 变量 n8n-encryption-key,该变量将保存该值。

openssl rand -base64 -out my-encryption-key 42

gcloud secrets create n8n-encryption-key \
    --data-file=my-encryption-key \
    --replication-policy="automatic"        

5. 为 Google Cloud Run 创建服务账号

我们将在下一步中在 Google Cloud Run 上部署 n8n。为此,我们将创建一个服务账号,Cloud Run 将使用该账号执行 n8n 工作流。为此,我们希望确保我们创建的服务账号在 Google Cloud 上仅具有最低要求的角色/权限。

根据我们当前的要求,我们需要为创建的服务账号分配以下角色:

  • roles/cloudsql.client:服务账号需要此角色才能访问我们的 Cloud SQL 数据库
  • roles/secretAccessor:我们需要提供此角色才能访问 n8n-db-passwordn8n-encryption-key 的 Secret Manager 密钥。

我们开始吧。以下所有命令都必须在 Google Cloud Shell 中执行。第一个命令会创建服务账号,然后我们提供所需的角色(如上所述)。依次运行每个命令。如果您被要求为以下任何命令指定条件,请选择 "None"

gcloud iam service-accounts create n8n-service-account \
    --display-name="n8n Service Account"

export SA_NAME=n8n-service-account@$PROJECT_ID.iam.gserviceaccount.com

gcloud secrets add-iam-policy-binding n8n-db-password \
    --member="serviceAccount:$SA_NAME" \
    --role="roles/secretmanager.secretAccessor"

gcloud secrets add-iam-policy-binding n8n-encryption-key \
    --member="serviceAccount:$SA_NAME" \
    --role="roles/secretmanager.secretAccessor"

gcloud projects add-iam-policy-binding $PROJECT_ID \
    --member="serviceAccount:$SA_NAME" \
    --role="roles/cloudsql.client"

我们现在已准备好将 n8n 容器映像部署到 Google Cloud Run。

6. 将 n8n 部署到 Google Cloud Run

在 Google Cloud Shell 中运行以下命令:

gcloud run deploy n8n \
    --image=n8nio/n8n:latest \
    --command="/bin/sh" \
    --args="-c,sleep 5;n8n start" \
    --region=$REGION \
    --allow-unauthenticated \
    --port=5678 \
    --memory=2Gi \
    --no-cpu-throttling \--set-env-vars="N8N_PORT=5678,N8N_PROTOCOL=https,N8N_ENDPOINT_HEALTH=health,DB_TYPE=postgresdb,DB_POSTGRESDB_DATABASE=n8n,DB_POSTGRESDB_USER=n8n-user,DB_POSTGRESDB_HOST=/cloudsql/$PROJECT_ID:$REGION:n8n-db,DB_POSTGRESDB_PORT=5432,DB_POSTGRESDB_SCHEMA=public,GENERIC_TIMEZONE=UTC,QUEUE_HEALTH_CHECK_ACTIVE=true" \
    --set-secrets="DB_POSTGRESDB_PASSWORD=n8n-db-password:latest,N8N_ENCRYPTION_KEY=n8n-encryption-key:latest" \
    --add-cloudsql-instances=$PROJECT_ID:$REGION:n8n-db \
    --service-account=$SA_NAME

部署可能需要大约一分钟。成功部署后,您应该会看到类似于以下内容的消息:

Deploying container to Cloud Run service [n8n] in project [YOUR_PROJECT_ID] region [us-central1]
Deploying new service...                                                                                                                                                                                                                      
  Setting IAM Policy...done                                                                                                                                                                                                                   
  Creating Revision...done                                                                                                                                                                                                                    
  Routing traffic...done                                                                                                                                                                                                                      
Done.                                                                                                                                                                                                                                         
Service [n8n] revision [n8n-00001-8nh] has been deployed and is serving 100 percent of traffic.
Service URL: https://n8n-<SOME_ID>.us-central1.run.app

记下上述输出中的服务网址,因为您将在下一步中使用该网址启动 n8n 控制台。

7. 运行 n8n 工作流

启动浏览器并访问您在上一步中获得的服务网址。您还可以从 Cloud Run 首页获取服务网址,您将在该页面上看到 n8n 列为其中一项服务。

注意:如果您收到错误消息,指出 Cannot GET / 屏幕或 n8n is starting up,这通常表示 n8n 仍在启动。您可以刷新页面,它最终应该会加载。

最终,您将看到如下所示的屏幕,您可以在其中设置所有者账号:

5a3b1d60d02b13ec.png

填写所需详细信息,记下密码并完成设置。您可以跳过一些步骤,包括要求发送许可密钥的步骤。

如果一切顺利,您应该会看到 n8n 的首页,如下所示:

3e072e9189ff9464.png

如果您熟悉 n8n,您将能够完成此实验。

如果您想对 n8n 进行小规模测试,可以尝试以下工作流:

  1. 点击“凭据”,然后点击添加第一个凭据

14a1f3d2098a266c.png

  1. 我们将设置 Gemini API 密钥凭据。输入 gemini 以显示 Google Gemini (PaLM) Api 选项,然后点击继续

7f48bfe35e5d9e98.png

  1. 您可以从 https://aistudio.google.com/app/api-keys 获取 Gemini API 密钥。
  2. 获得密钥后,请粘贴该密钥。n8n 将验证该密钥,并且凭据现已设置完毕。

3f31cbfc5072f113.png 5. 现在,转到“工作流”选项,然后点击“从头开始”或“创建新工作流”。这将显示一个空白画布,您可以在其中构建以下两个节点:一个是触发器(简单聊天),另一个是代理,我们将在其中设置创建的凭据,以便代理模型为 Google Gemini。您最终应该会得到如下所示的工作流:

8f394e456ae7d1a.png

  1. 您可以通过聊天窗格运行此工作流,如果一切顺利,您将收到对提示的回复。执行屏幕示例如下所示:

aec85c84f65d0da1.png

这样就完成了对 Google Cloud Run 上的 n8n 部署的验证。

8. 清理

如果您选择使用此 Codelab 了解如何在 Google Cloud Run 上安装和运行 n8n,而不是用于生产 / 永久性要求,则可以避免 Google Cloud 账号产生持续费用,因此务必删除我们在本次研讨会期间创建的资源。

我们将删除 Cloud SQL 实例并删除已部署的 Cloud Run 服务。

确保根据您的项目和区域正确设置以下环境变量:

export PROJECT_ID="YOUR_PROJECT_ID"
export REGION="YOUR_REGION"

以下两个命令会删除我们已部署的 Cloud Run 服务:

gcloud run services delete n8n --platform=managed --region=${REGION} --project=${PROJECT_ID} --quiet

以下命令会删除 Cloud SQL 实例:

gcloud sql instances delete n8n-db

以下两个命令会删除我们创建的 Secret Manager 密钥:

gcloud secrets delete n8n-db-password

gcloud secrets delete n8n-encryption-key

9. 恭喜

恭喜!您已在 Google Cloud Run 上成功部署 n8n,并使用示例工作流验证了设置。

参考文档