Skip to content

在 Google Cloud Run 上托管 n8n#

本托管指南向您展示如何在 Google Cloud Run(一个无服务器容器运行时)上自托管 n8n。如果你刚开始使用 n8n 并且不需要生产级部署,你可以使用下面的"简易模式"选项进行部署。否则,如果你打算大规模使用此 n8n 部署,请参考下面的"持久模式"说明。

You can also enable access via OAuth to Google Workspace, such as Gmail and Drive, to use these services as n8n workflow tools. Instructions for granting n8n access to these services are at the end of this documentation.

如果你想部署到 Google Kubernetes Engine (GKE),可以参考这些说明

自托管知识先决条件

自托管 n8n 需要技术知识,包括:

  • 设置和配置服务器和容器
  • 管理应用程序资源和扩展
  • 保护服务器和应用程序
  • 配置 n8n

n8n 建议专业用户进行自托管。错误可能导致数据丢失、安全问题和停机。如果您在管理服务器方面缺乏经验,n8n 建议使用 n8n Cloud

Stable 和 Beta 版本

n8n 通常每周发布一个新的次要版本。stable 版本用于生产环境。beta 是最新版本。beta 版本可能不稳定。如需报告问题,请使用论坛

当前 stable:2.26.7 当前 beta:2.27.2

开始之前:获取 Google Cloud 项目#

如果你尚未创建 Google Cloud 项目,请先执行此操作(并确保已在项目上启用计费;即使你的 Cloud Run 服务免费运行,你也必须激活计费才能部署)。否则,导航到你想要部署 n8n 的项目。

简易模式#

这是在 Cloud Run 上部署 n8n 的最快方法。对于此部署,n8n 的数据在内存中,因此仅建议用于演示目的。每当此 Cloud Run 服务缩减至零或重新部署时,n8n 数据将丢失。 如果你需要生产级部署,请参考下面的持久模式说明。

如果你尚未创建 Google Cloud 项目,请先执行此操作(并确保已在项目上启用计费;即使你的 Cloud Run 服务免费运行,你也必须启用计费才能部署)。否则,导航到你想要部署 n8n 的项目。

打开 Cloud Shell Terminal(在 Google Cloud 控制台上,输入"G"然后"S",或单击右上角的终端图标)。

会话打开后,你可能需要首先运行此命令登录(并按照它要求你完成的步骤操作):

1
gcloud auth login

你还可以显式启用 Cloud Run API(即使你不这样做,它也会在你部署时询问是否要启用):

1
gcloud services enable run.googleapis.com

必需:自定义健康检查端点

Google Cloud Run 会保留 /healthz 作为自身健康检查路径。由于 n8n 默认也使用该路径,可能引发冲突并导致工作流画布出现连接问题。请将 N8N_ENDPOINT_HEALTH 环境变量设置为自定义路径(如下方部署命令所示)。

部署 n8n:

1
2
3
4
5
6
7
8
gcloud run deploy n8n \
    --image=n8nio/n8n \
    --region=us-west1 \
    --allow-unauthenticated \
    --port=5678 \
    --no-cpu-throttling \
    --memory=2Gi \
    --set-env-vars="N8N_ENDPOINT_HEALTH=health"

(你可以指定你喜欢的任何区域,而不是"us-west1")

部署完成后,打开另一个标签页导航到 Service URL。n8n 可能仍在加载,你会看到"n8n is starting up. Please wait"消息,但之后不久你应该会看到 n8n 登录屏幕。

可选:如果你想让此 n8n 服务尽可能长时间运行以避免数据丢失,你还可以将手动扩展设置为 1 以防止它自动缩减到 0。

1
2
3
4
5
6
7
8
9
gcloud run deploy n8n \
    --image=n8nio/n8n \
    --region=us-west1 \
    --allow-unauthenticated \
    --port=5678 \
    --no-cpu-throttling \
    --memory=2Gi \
    --scaling=1 \
    --set-env-vars="N8N_ENDPOINT_HEALTH=health"

This does not prevent data loss completely, such as whenever the Cloud Run service is re-deployed/updated. If you want truly persistent data, you should refer to the instructions below for how to attach a database.

持久模式#

以下说明旨在在 Cloud Run 上进行更持久的生产级 n8n 部署。它包括诸如用于持久化的数据库和用于敏感数据的密钥管理器等资源。

如果你想通过 Terraform 部署以下配置,请参考这个示例。它会部署与下文相同的配置(不包含 Google Workspace 工具的 OAuth 设置)。

启用 API 并设置环境变量#

打开 Cloud Shell Terminal(在 Google Cloud 控制台上,输入"G"然后"S",或单击右上角的终端图标)并在终端会话中运行这些命令:

1
2
3
4
5
6
## 你可能需要先登录
gcloud auth login

gcloud services enable run.googleapis.com
gcloud services enable sqladmin.googleapis.com
gcloud services enable secretmanager.googleapis.com

你还需要为这些说明的其余部分设置一些环境变量:

1
2
export PROJECT_ID=your-project
export REGION=region-where-you-want-this-deployed

设置你的 Postgres 数据库#

运行此命令创建 Postgres 数据库实例(需要几分钟才能完成;还要确保使用你自己期望的密码更新 root-password 字段):

1
2
3
4
5
6
7
8
9
gcloud sql instances create n8n-db \
    --database-version=POSTGRES_13 \
    --tier=db-f1-micro \
    --region=$REGION \
    --root-password="change-this-password" \
    --storage-size=10GB \
    --availability-type=ZONAL \
    --no-backup \
    --storage-type=HDD

完成后,你可以添加 n8n 将使用的数据库:

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

为 n8n 创建数据库用户(当然要更改密码值):

1
2
3
gcloud sql users create n8n-user \
    --instance=n8n-db \
    --password="change-this-password"

你可以将为此 n8n-user 设置的密码保存到文件中,以便在下一步将密码保存在 Secret Manager 中。请务必稍后删除此文件。

在 Secret Manager 中存储敏感数据#

虽然不是必需的,但强烈建议将敏感数据存储在 Secrets Manager 中。

为数据库密码创建密钥(将"/your/password/file"替换为你在上面为 n8n-user 密码创建的文件):

1
2
3
gcloud secrets create n8n-db-password \
    --data-file=/your/password/file \
    --replication-policy="automatic"

创建加密密钥(你可以使用自己的,此示例生成一个随机密钥):

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

为此加密密钥创建密钥(如果你提供自己的密钥,请替换"my-encryption-key"):

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

现在你可以删除你创建的 my-encryption-key 和数据库密码文件。这些值现在已安全存储在 Secret Manager 中。

为 Cloud Run 创建服务账户#

你希望此 Cloud Run 服务仅限于访问它需要的资源。以下命令创建服务账户并添加访问密钥和数据库所需的权限:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
gcloud iam service-accounts create n8n-service-account \
    --display-name="n8n Service Account"

gcloud secrets add-iam-policy-binding n8n-db-password \
    --member="serviceAccount:n8n-service-account@$PROJECT_ID.iam.gserviceaccount.com" \
    --role="roles/secretmanager.secretAccessor"

gcloud secrets add-iam-policy-binding n8n-encryption-key \
    --member="serviceAccount:n8n-service-account@$PROJECT_ID.iam.gserviceaccount.com" \
    --role="roles/secretmanager.secretAccessor"

gcloud projects add-iam-policy-binding $PROJECT_ID \
    --member="serviceAccount:n8n-service-account@$PROJECT_ID.iam.gserviceaccount.com" \
    --role="roles/cloudsql.client"

部署 Cloud Run 服务#

现在你可以部署你的 n8n 服务:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
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=n8n-service-account@$PROJECT_ID.iam.gserviceaccount.com

部署完成后,打开另一个标签页导航到 Service URL。你应该会看到 n8n 登录屏幕。

故障排除#

如果你看到"Cannot GET /"屏幕,这通常表示 n8n 仍在启动中。你可以刷新页面,它最终应该会加载。

(可选)启用 Google Workspace 服务作为 n8n 工具#

如果你想使用 Google Workspace 服务(Gmail、Calendar、Drive 等)作为 n8n 中的工具,建议设置 OAuth 来访问这些服务。

首先确保启用了你想要的相应 API:

1
2
3
4
5
6
7
## 启用你需要的任何 API
## 注意:如果你想要 Sheets/Docs,仅启用 Drive 是不够的;这些服务各有自己的 API
gcloud services enable gmail.googleapis.com
gcloud services enable drive.googleapis.com
gcloud services enable sheets.googleapis.com
gcloud services enable docs.googleapis.com
gcloud services enable calendar-json.googleapis.com

在 Cloud Run 上重新部署 n8n,并将必要的 OAuth 回调 URL 作为环境变量:

1
2
3
4
5
6
export SERVICE_URL="your-n8n-service-URL"
## 例如 https://n8n-12345678.us-west1.run.app

gcloud run services update n8n \
    --region=$REGION \
    --update-env-vars="N8N_HOST=$(echo $SERVICE_URL | sed 's/https:\/\///'),WEBHOOK_URL=$SERVICE_URL,N8N_EDITOR_BASE_URL=$SERVICE_URL"

最后,你必须为这些服务设置 OAuth。访问 https://console.cloud.google.com/auth 并按照以下步骤操作:

  1. 如果显示此按钮,请单击"Get Started"(当你尚未在此 Cloud 项目中设置 OAuth 时)。
  2. 对于"App Information",输入你喜欢的任何"App Name"和"User Support Email"。
  3. 对于"Audience",如果你打算仅在同一 Google Workspace 中启用对你的用户的访问,请选择"Internal"。否则,你可以选择"External"。
  4. 输入"Contact Information"。
  5. 如果你选择了"External",则单击"Audience"并添加你需要授予访问权限的任何测试用户。
  6. 单击"Clients" > "Create client",为"Application type"选择"Web application",将你的 n8n 服务 URL 输入"Authorized JavaScript origins",并将"/rest/oauth2-credential/callback"输入"Authorized redirect URIs",其中 YOUR-N8N-URL 也是 n8n 服务 URL(例如 https://n8n-12345678.us-west1.run.app/rest/oauth2-credential/callback)。确保下载创建的客户端的 JSON 文件,因为它包含客户端密钥,你以后将无法在控制台中看到它。
  7. 单击"Data Access"并添加你希望 n8n 访问的范围(例如,要访问 Google Sheets,你需要 https://googleapis.com/auth/drive.filehttps://googleapis.com/auth/spreadsheets
  8. 现在你应该能够使用这些工作区服务了。你可以通过登录 n8n 来测试它是否有效,为相应的服务添加工具并使用步骤 6 中 OAuth 客户端 JSON 文件中的信息添加其凭据。