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