在 Google Cloud Run 上部署和运行 n8n

1. 简介

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

此 Codelab 基于 n8n 文档指南,其中说明了如何在 Google Cloud Run 上托管 n8n。我们将安装和配置一个版本的 n8n,该版本是 Cloud Run 上更持久耐用的生产级 n8n 部署。它包括用于持久性的数据库和用于敏感数据的 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 Console 的项目选择器页面上,选择或创建一个 Google Cloud 项目
  2. 确保您的 Cloud 项目已启用结算功能。了解如何检查项目是否已启用结算功能
  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 管理器密钥。

我们开始吧。以下所有命令都必须在 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,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,并通过示例工作流验证了设置。

参考文档