跳到主要内容

在 Google Cloud Run 上托管 n8n#

本托管指南将展示如何在无服务器容器运行时 Google Cloud Run 上自托管 n8n。如果您是 n8n 新手且不需要生产级部署,可选用下方的"简易模式"进行部署。若计划大规模使用此 n8n 部署,请参考后续的"持久模式"说明。

您还可以通过 OAuth 启用对 Google Workspace(如 Gmail 和 Drive)的访问权限,从而将这些服务用作 n8n 工作流工具。授权 n8n 访问这些服务的操作说明位于本文档末尾。

如需部署到 Google Kubernetes Engine (GKE),请参阅相关说明

自托管知识前提

自托管 n8n 需要具备以下技术知识:

  • 服务器与容器的设置配置
  • 应用程序资源管理与扩缩容
  • 服务器与应用程序安全防护
  • n8n 配置

n8n 建议仅由专业用户进行自托管。操作失误可能导致数据丢失、安全问题和服务中断。若缺乏服务器管理经验,n8n 推荐使用 n8n Cloud

最新版与预览版

n8n 每周会发布新的次要版本。latest 版本适用于生产环境,next 则是最新发布版本。您应将 next 视为测试版:可能存在不稳定情况。问题反馈请使用社区论坛

当前 latest 版本:1.119.2
当前 next 版本:1.119.3

准备工作:创建 Google Cloud 项目#

若尚未创建 Google Cloud 项目,请先完成此步骤(并确保已启用项目结算功能;即使 Cloud Run 服务可免费运行,部署时仍需激活结算功能)。如已有项目,请导航至目标部署项目。

简易模式#

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

若尚未创建 Google Cloud 项目,请先完成此步骤(并确保已启用项目结算功能;即使 Cloud Run 服务可免费运行,部署时仍需激活结算功能)。如已有项目,请导航至目标部署项目。

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

会话启动后,可能需要先运行以下命令登录(并按照提示完成操作):

gcloud auth login

您也可以显式启用 Cloud Run API(即使不执行此操作,在部署时系统也会询问是否要启用该功能):

gcloud services enable run.googleapis.com

要部署 n8n:

gcloud run deploy n8n \
--image=n8nio/n8n \
--region=us-west1 \
--allow-unauthenticated \
--port=5678 \
--no-cpu-throttling \
--memory=2Gi

(您可指定任意偏好的区域,替代"us-west1")

部署完成后,请新开标签页访问服务网址。n8n可能仍在加载,您会看到"n8n正在启动,请稍候"的提示,但稍后即可看到n8n登录界面。

可选操作:若希望尽可能保持n8n服务持续运行以避免数据丢失,可将手动扩缩容数量设为1,防止自动缩容至0。

gcloud run deploy n8n \
--image=n8nio/n8n \
--region=us-west1 \
--allow-unauthenticated \
--port=5678 \
--no-cpu-throttling \
--memory=2Gi \
--scaling=1

这并不能完全防止数据丢失,例如当 Cloud Run 服务被重新部署/更新时。如果您需要真正持久化的数据,请参考以下关于如何连接数据库的说明。

持久化模式#

以下说明适用于在 Cloud Run 上实现更持久、生产级的 n8n 部署方案。该方案包含用于数据持久化的数据库资源,以及用于存储敏感信息的密钥管理器。

启用 API 并设置环境变量#

打开 Cloud Shell 终端(在 Google Cloud 控制台中,可输入"G"后接"S",或点击右上角的终端图标),在终端会话中运行以下命令:

 ## You may need to login first
gcloud auth login

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

您还需要为后续操作设置以下环境变量:

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

设置您的Postgres数据库#

运行以下命令创建Postgres数据库实例(此操作需要几分钟完成;同时请确保将root-password字段替换为您自己的密码):

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将使用的数据库:

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

为n8n创建数据库用户(请务必修改密码值):

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

您可以将为此n8n用户设置的密码保存至文件中,以便后续将其存储至密钥管理器。请务必在完成后删除该文件。

在密钥管理器中存储敏感数据#

虽然非强制要求,但强烈建议将敏感数据存储于密钥管理器。

请按以下步骤为数据库密码创建密钥(请将"/your/password/file"替换为上述步骤中为n8n用户密码创建的文件路径):

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

创建加密密钥(可使用自有密钥,本示例将生成随机密钥):

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

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

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

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

为 Cloud Run 创建服务账号#

您需要限制此 Cloud Run 服务仅访问其必需的资源。以下命令将创建服务账号,并添加访问密钥和数据库所需的权限:

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 服务:

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=n8n-service-account@$PROJECT_ID.iam.gserviceaccount.com

部署完成后,请在新标签页中访问服务URL,您将看到n8n的登录界面。

故障排除#

若出现“Cannot GET /”页面,通常表示n8n仍在启动过程中。刷新页面后最终会成功加载。

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

如需将Google Workspace服务(Gmail、日历、云端硬盘等)作为n8n工具使用,建议配置OAuth来访问这些服务。

首先请确保已启用所需的相关API:

## Enable whichever APIs you need
## Note: If you want Sheets/Docs, it's not enough to just enable Drive; these services each have their own 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 作为环境变量:

export SERVICE_URL="your-n8n-service-URL"
## e.g. 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. 如果显示"开始使用"按钮(当您尚未在此云项目中设置 OAuth 时),请点击该按钮。
  2. 在"应用信息"部分,输入您偏好的"应用名称"和"用户支持邮箱"。
  3. 在"受众群体"部分,如果仅允许同一 Google Workspace 内的用户访问,请选择"内部";否则可选择"外部"。
  4. 填写"联系信息"。
  5. 若选择"外部",需点击"受众群体"并添加需要授权访问的测试用户。
  6. 点击"客户端" > "创建客户端",在"应用类型"中选择"Web 应用",将您的 n8n 服务 URL 填入"已授权的 JavaScript 来源",并将 "/rest/oauth2-credential/callback" 填入"已授权的重定向 URI"(其中 YOUR-N8N-URL 同样为 n8n 服务 URL,例如 https://n8n-12345678.us-west1.run.app/rest/oauth2-credential/callback)。请务必下载已创建客户端的 JSON 文件,因为其中包含客户端密钥,后续在控制台将无法查看。
  7. 点击"数据访问"并添加需要授权 n8n 访问的范围(例如要访问 Google Sheets,需添加 https://googleapis.com/auth/drive.filehttps://googleapis.com/auth/spreadsheets)。
  8. 现在您应能使用这些工作区服务。可通过登录 n8n,为相应服务添加工具,并使用步骤 6 中 OAuth 客户端 JSON 文件的信息添加凭据来测试是否正常工作。