gdg-generator / n8n self-host

n8n Cloud Run 部署脚本生成器

把 n8n + Neon + Gmail SMTP 部署到 Google Cloud Run。填写 9 个配置变量(其中 7 项必填),脚本会自动生成, 点击即可复制整段内容粘贴到终端执行。

必填进度2 / 7

本次部署随机标识

脚本里 3 个 Secret 的名称都由这个标识决定。重新生成脚本会换一个标识, 因此不会覆盖上一套 Secret;重复执行同一份脚本也仍然安全(只新增版本)。

生成中…

1. GCP 配置

部署目标项目与区域
PROJECT_ID

gcloud config get-value project 可以查到当前项目 ID。

REGION

选择离你和 n8n 使用方最近的区域,Cloud Run 在该区域必须可用。

SERVICE_NAME

会同时决定 Cloud Run 服务名与默认域名前缀。

2. Neon 数据库

Postgres 连接信息
NEON_HOST

Neon 控制台的 Connection string 里复制 Host,务必带 -pooler。

NEON_DB

Neon 默认数据库名为 neondb。

NEON_USER

Neon 默认用户名为 neondb_owner。

NEON_PASS

只写入本机脚本,不会上传到任何服务器。

3. Gmail 邮件

SMTP 通知账号
GMAIL_USER

n8n 通过该邮箱发送通知邮件。

GMAIL_APP_PASS

在 Google 账号安全设置里生成,形如 abcd efgh ijkl mnop,去掉空格后填入。

生成器对原模板做了哪些处理?
  • 只替换「1. 请修改以下 7 个配置变量」这一段里的 9 个变量;新增「2. 本次部署随机标识」段(由生成器生成);脚本其余部分按原模板保留, 仅重写了运行时服务账号那一段(见下)。
  • 脚本共创建 3 个 Secret:n8n 加密密钥、数据库密码、SMTP 密码, 名称都带上「2. 本次部署随机标识」里的后缀,因此互不覆盖。
  • --set-secrets 对加密密钥做了显式绑定(绑定到 n8n 真正读取的加密密钥环境变量), 避免 n8n 读不到加密密钥、每次重启都要求重新初始化。
  • 运行时服务账号使用默认计算服务账号(形如 ${PROJECT_NUMBER}-compute@developer.gserviceaccount.com)。新版项目不再预置该账号,脚本会启用 Compute Engine API 并等待创建,仍不可用则创建专用服务账号 n8n-run并在部署时通过 --service-account 指定。
  • 输入值会做 shell 双引号转义($、反引号、"、\),密码含特殊字符也不会破坏脚本。
deploy-n8n.sh132 行
⏳ 还有 5 项必填未填写,脚本中仍是模板示例值。
■ 需你填写的配置■ 自动生成的随机标识■ 粘贴到终端执行
cat << 'EOF' > deploy-n8n.sh
#!/bin/bash
set -e
# ================= 1. 请修改以下 7 个配置变量 =================
export PROJECT_ID="你的-gcp-项目-id"
export REGION="asia-east1" # 台湾 彰化
export SERVICE_NAME="n8n"
# 填入第一步获取的 Neon 数据库连接信息 (务必带 -pooler)
export NEON_HOST="ep-xxx-pooler.ap-southeast-1.aws.neon.tech"
export NEON_DB="neondb"
export NEON_USER="neondb_owner"
export NEON_PASS="你的Neon数据库密码"
# 填入第二步获取的 Gmail 信息
export GMAIL_USER="你的邮箱@gmail.com"
export GMAIL_APP_PASS="你的16位应用专用密码(无空格)"
# ===============================================================
# ============ 2. 本次部署随机标识(每次生成都不同)============
# Secret 名称会带上这个后缀;重复执行同一份脚本仍然安全(只会新增版本)
export DEPLOY_ID="pending"
export SECRET_ENCRYPTION_KEY="n8n-encryption-key${DEPLOY_ID}"
export SECRET_DB_PASSWORD="n8n-db-password${DEPLOY_ID}"
export SECRET_SMTP_PASSWORD="n8n-smtp-password${DEPLOY_ID}"
# ⚠️ 加密密钥随标识变化:要沿用已有 n8n 数据(里面存着加密后的凭证),
# 请继续用同一份脚本,或把 SECRET_ENCRYPTION_KEY 改成上一套脚本用过的名字
# ===============================================================
echo "🚀 [1/4] 设置 GCP 项目并启用必要 API..."
gcloud config set project $PROJECT_ID
gcloud services enable run.googleapis.com secretmanager.googleapis.com
echo "🔐 [2/4] 创建并配置 Secret Manager 敏感密钥..."
# 生成固定的 n8n 凭证加密密钥(若已存在则跳过,切勿轻易覆盖)
if ! gcloud secrets describe $SECRET_ENCRYPTION_KEY >/dev/null 2>&1; then
openssl rand -base64 32 | gcloud secrets create $SECRET_ENCRYPTION_KEY --data-file=-
fi
# 写入或更新数据库密码
if ! gcloud secrets describe $SECRET_DB_PASSWORD >/dev/null 2>&1; then
echo -n "$NEON_PASS" | gcloud secrets create $SECRET_DB_PASSWORD --data-file=-
else
echo -n "$NEON_PASS" | gcloud secrets versions add $SECRET_DB_PASSWORD --data-file=-
fi
# 写入或更新 Gmail App Password
if ! gcloud secrets describe $SECRET_SMTP_PASSWORD >/dev/null 2>&1; then
echo -n "$GMAIL_APP_PASS" | gcloud secrets create $SECRET_SMTP_PASSWORD --data-file=-
else
echo -n "$GMAIL_APP_PASS" | gcloud secrets versions add $SECRET_SMTP_PASSWORD --data-file=-
fi
# 授予 Cloud Run 运行时服务账号读取 Secret 的权限
PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format="value(projectNumber)")
SA_EMAIL="${PROJECT_NUMBER}-compute@developer.gserviceaccount.com"
# 新版 GCP 项目不再预置默认计算服务账号:启用 Compute Engine API 会自动创建
if ! gcloud iam service-accounts describe "$SA_EMAIL" >/dev/null 2>&1; then
echo "⚠️ 未找到默认计算服务账号,启用 Compute Engine API 以自动创建..."
gcloud services enable compute.googleapis.com
fi
for _ in $(seq 1 12); do
if gcloud iam service-accounts describe "$SA_EMAIL" >/dev/null 2>&1; then
break
fi
sleep 5
done
# 等待后仍不存在时改用专用服务账号,并在部署时显式指定
DEPLOY_SA_FLAG=""
if ! gcloud iam service-accounts describe "$SA_EMAIL" >/dev/null 2>&1; then
SA_EMAIL="n8n-run@${PROJECT_ID}.iam.gserviceaccount.com"
DEPLOY_SA_FLAG="--service-account=${SA_EMAIL}"
echo "⚠️ 默认计算服务账号仍不可用,改用专用服务账号:$SA_EMAIL"
gcloud services enable iam.googleapis.com
gcloud iam service-accounts create n8n-run \
--display-name="n8n Cloud Run runtime" >/dev/null 2>&1 || true
fi
echo "🛡️ 运行时服务账号:$SA_EMAIL"
for SECRET in $SECRET_ENCRYPTION_KEY $SECRET_DB_PASSWORD $SECRET_SMTP_PASSWORD; do
gcloud secrets add-iam-policy-binding $SECRET \
--member="serviceAccount:${SA_EMAIL}" \
--role="roles/secretmanager.secretAccessor" >/dev/null
done
echo "📦 [3/4] 部署 n8n 容器到 Google Cloud Run..."
gcloud run deploy $SERVICE_NAME \
--image=n8nio/n8n:latest \
--region=$REGION \
$DEPLOY_SA_FLAG \
--allow-unauthenticated \
--port=5678 \
--memory=2Gi \
--cpu=1 \
--min-instances=0 \
--max-instances=2 \
--no-cpu-throttling \
--set-secrets="N8N_ENCRYPTION_KEY=${SECRET_ENCRYPTION_KEY}:latest,DB_POSTGRESDB_PASSWORD=${SECRET_DB_PASSWORD}:latest,N8N_SMTP_PASS=${SECRET_SMTP_PASSWORD}:latest" \
--set-env-vars="N8N_PORT=5678,N8N_PROTOCOL=https,NODE_ENV=production" \
--set-env-vars="GENERIC_TIMEZONE=Asia/Shanghai,TZ=Asia/Shanghai" \
--set-env-vars="N8N_ENDPOINT_HEALTH=health" \
--set-env-vars="DB_TYPE=postgresdb" \
--set-env-vars="DB_POSTGRESDB_HOST=${NEON_HOST}" \
--set-env-vars="DB_POSTGRESDB_PORT=5432" \
--set-env-vars="DB_POSTGRESDB_DATABASE=${NEON_DB}" \
--set-env-vars="DB_POSTGRESDB_USER=${NEON_USER}" \
--set-env-vars="DB_POSTGRESDB_SSL=true" \
--set-env-vars="DB_POSTGRESDB_SSL_REJECT_UNAUTHORIZED=false" \
--set-env-vars="N8N_EMAIL_MODE=smtp" \
--set-env-vars="N8N_SMTP_HOST=smtp.gmail.com" \
--set-env-vars="N8N_SMTP_PORT=465" \
--set-env-vars="N8N_SMTP_SSL=true" \
--set-env-vars="N8N_SMTP_USER=${GMAIL_USER}" \
--set-env-vars="N8N_SMTP_SENDER=${GMAIL_USER}"
echo "🔗 [4/4] 自动提取 Cloud Run 域名并回填 Webhook 环境变量..."
export SERVICE_URL=$(gcloud run services describe $SERVICE_NAME --region=$REGION --format='value(status.url)')
export SERVICE_HOST=${SERVICE_URL#https://}
gcloud run services update $SERVICE_NAME \
--region=$REGION \
--update-env-vars="WEBHOOK_URL=${SERVICE_URL}/,N8N_HOST=${SERVICE_HOST},N8N_EDITOR_BASE_URL=${SERVICE_URL}/"
echo "============================================================"
echo "🎉 部署大功告成!请点击以下链接访问并初始化你的 n8n:"
echo "$SERVICE_URL"
echo "============================================================"
EOF

使用步骤

  1. 1

    准备 Neon 数据库

    在 Neon 控制台创建项目,从 Connection string 复制 Host(必须带 -pooler)、数据库名、用户名和密码。

  2. 2

    准备 Gmail 应用专用密码

    Google 账号 → 安全性 → 两步验证 → 应用专用密码,生成后去掉空格,填入上面的 GMAIL_APP_PASS。

  3. 3

    填写并复制脚本

    左侧填写 9 个变量,右侧脚本实时更新;点击「复制脚本」把整段内容复制到剪贴板(也可以下载 .sh)。

  4. 4

    在执行环境粘贴运行

    本机需已安装 gcloud 并执行过 gcloud auth login。脚本会启用 API、创建 3 个 Secret、部署 Cloud Run 并回填 Webhook 地址。