抱歉,您的瀏覽器無法訪問本站
本頁面需要瀏覽器支持(啟用)JavaScript
了解詳情 >

本文件說明如何將 n8n 部署至 Google Cloud Run,並使用 Supabase PostgreSQL 作為資料庫,而非 Google Cloud SQL。架構圖如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
            User
|
| HTTPS
|
+----------------+
| Cloud Run |
| n8n |
+----------------+
|
|
PostgreSQL SSL Connection
(TLS over Internet)
|
|
+---------------------------+
| Supabase |
| |
| PostgreSQL Database |
| Session Pooler : 5432 |
+---------------------------+

1. 建立 Supabase 帳號與連線資訊

第 1/5 步:點擊 "New project" 按鈕

第 2/5 步:設定資料庫與伺服器區域資訊

小提示

  • Project name: 設定為 cloudrun-n8n
  • Database password: 可以透過 "Generate a password" 建立隨機密碼,並另存於記事本上。
  • Region: 設定為 "Northeast Asia (Tokyo)"

第 3/5 步: 點擊 Connect 按鈕

第 4/5 步: 依照下列選項找出對應的連線資訊

步驟

  1. 點擊 "Driect"
  2. Connection Method 選擇 "Session pooler"
  3. Type 選擇 "URI"

第 5/5 步: 依照下列選項找出對應的連線資訊

完成

完成建立會得到以下資訊,黃字為個人設定的機密字串。

選項
Hostaws-0-ap-northeast-1.pooler.supabase.com
Port5432
Databasepostgres
Usernamepostgres.islaugiwwefzbtmnhuty
Password********

上述資訊準備好,將會進到 Cloud Run 設定機密資訊,缺一不可!


2. Google Cloud 建立專案

第 1/5 步: 登入 GCP 後,點擊選擇專案按鈕

第 2/5 步: 點擊 "新增專案"

第 3/5 步: 輸入專案名稱

這邊使用 cloudrun-n8n 作為專案名稱。

第 4/ 5步: 開啟 Cloud Shell 終端機

第 5/5 步: 授權 Cloud Sell

完成

接下來的指令都會在 Cloud Shell 內完成。

3. 透過 Cloud Shell 進行設定 Cloud Run

第 1/5 步: 設定 GCP 資訊與環境變數

  1. 指定 GCP 區域

    1
    gcloud config set run/region asia-east1 # asia-northeast1
    實際執行結果展示
    1
    Updated property [run/region]

    提示
    其中 asia-east1 可以替換 asia-northeast1,讓 Cloud Run 的伺服器與 Supabase 伺服器在同一個區域。

  2. 設定環境變數

    1
    2
    3
    4
    5
    6
    7
    8
    9
    # 使用 gcloud 命令取得參數
    export PROJECT_ID=$(gcloud config get-value project)
    export REGION=$(gcloud config get-value run/region)

    # 設定環境變數
    export SUPABASE_HOST=<第一章節的 Host 參數>
    export SUPABASE_PORT=<第一章節的 Port 參數>
    export SUPABASE_DATABASE=<第一章節的 Database 參數>
    export SUPABASE_USER=<第一章節的 Username 參數>
    實際執行結果展示
    1
    待補充

    以下是範例 (替換後的程式碼):

    1
    2
    3
    4
    # export SUPABASE_HOST=aws-0-ap-northeast-1.pooler.supabase.com
    # export SUPABASE_USER=postgres.islaugiwwefzbtmnhuty
    # export SUPABASE_PORT=5432
    # export SUPABASE_DATABASE=postgres

    替換過程也要把 <> 取代掉。

第 2/5 步:啟用 GCP 中所需的服務

透過以下指令啟用 GCP 中安裝 n8n 所需要的服務。

1
2
3
4
5
gcloud services enable \
run.googleapis.com \
artifactregistry.googleapis.com \
cloudbuild.googleapis.com \
secretmanager.googleapis.com
實際執行結果展示
1
2
3
4
5
6
Regional Access Boundary HTTP request failed after retries: response_data={'error': {'code': 404, 'message': 'Not found; Gaia id not found for email keoinn@gmail.com', 'status': 'NOT_FOUND'}}, retryable_error=False
Regional Access Boundary HTTP request failed after retries: response_data={'error': {'code': 404, 'message': 'Not found; Gaia id not found for email keoinn@gmail.com', 'status': 'NOT_FOUND'}}, retryable_error=False
Regional Access Boundary HTTP request failed after retries: response_data={'error': {'code': 404, 'message': 'Not found; Gaia id not found for email keoinn@gmail.com', 'status': 'NOT_FOUND'}}, retryable_error=False
Regional Access Boundary HTTP request failed after retries: response_data={'error': {'code': 404, 'message': 'Not found; Gaia id not found for email keoinn@gmail.com', 'status': 'NOT_FOUND'}}, retryable_error=False
Regional Access Boundary HTTP request failed after retries: response_data={'error': {'code': 404, 'message': 'Not found; Gaia id not found for email keoinn@gmail.com', 'status': 'NOT_FOUND'}}, retryable_error=False
Operation "operations/acf.p2-420282546722-4b841b40-f492-4586-9fec-a3f1c18c0f26" finished successfully.

如果看到以下輸出,可以忽略不理會。

1
Regional Access Boundary HTTP request failed after retries: response_data={'error': {'code': 404, 'message': 'Not found; Gaia id not found for email keoinn@gmail.com', 'status': 'NOT_FOUND'}}, retryable_error=False

第 3/5 步: 讓 GCP 託管機密資訊

  1. 設定 Supabase 密碼

    1
    2
    3
    echo -n "<SUPABASE_PASSWORD>" | \
    gcloud secrets create supabase-db-password \
    --data-file=-
    實際執行結果展示
    1
    2
    3
    Regional Access Boundary HTTP request failed after retries: response_data={'error': {'code': 404, 'message': 'Not found; Gaia id not found for email keoinn@gmail.com', 'status': 'NOT_FOUND'}}, retryable_error=False
    Regional Access Boundary HTTP request failed after retries: response_data={'error': {'code': 404, 'message': 'Not found; Gaia id not found for email keoinn@gmail.com', 'status': 'NOT_FOUND'}}, retryable_error=False
    Created version [1] of the secret [supabase-db-password].

    <SUPABASE_PASSWORD> 替換來自第一章所記錄的 Supabase 密碼。
    替換包含 <> 符號。

    下述是我的範例:

    1
    2
    3
    echo -n "6hJ4hEUNh0k82DyV" | \
    gcloud secrets create supabase-db-password \
    --data-file=-
  2. 設定 Encryption Key

    1
    2
    3
    openssl rand -base64 32 | tee /dev/stderr | \
    gcloud secrets create n8n-encryption-key \
    --data-file=-
    實際執行結果展示
    1
    2
    3
    4
    uxXqw125g06ggXdNsIsaGZTBhuSaV5E4lg2RjdbTTaA=
    Regional Access Boundary HTTP request failed after retries: response_data={'error': {'code': 404, 'message': 'Not found; Gaia id not found for email keoinn@gmail.com', 'status': 'NOT_FOUND'}}, retryable_error=False
    Regional Access Boundary HTTP request failed after retries: response_data={'error': {'code': 404, 'message': 'Not found; Gaia id not found for email keoinn@gmail.com', 'status': 'NOT_FOUND'}}, retryable_error=False
    Created version [1] of the secret [n8n-encryption-key].

    預期輸出:

    1
    2
    3
    YOBw3TADF9v5NDaL4Nzb8XA1yZnMnxEKExB6g2WeafU=
    Regional Access Boundary HTTP request failed after retries: .... (忽略)
    Created version [1] of the secret [n8n-encryption-key].

    ⚠️ 請務必妥善保存 Encryption Key
    若遺失或更換,既有 Credentials 將無法解密。
    即,上述例子將 YOBw3TADF9v5NDaL4Nzb8XA1yZnMnxEKExB6g2WeafU= 另存起來。

第 4/5 步: 建立 Service Account

  1. 建立 Service Account n8n-service-account

    1
    2
    gcloud iam service-accounts create n8n-service-account \
    --display-name="n8n Service Account"
    實際執行結果展示
    1
    2
    Regional Access Boundary HTTP request failed after retries: response_data={'error': {'code': 404, 'message': 'Not found; Gaia id not found for email keoinn@gmail.com', 'status': 'NOT_FOUND'}}, retryable_error=False
    Created service account [n8n-service-account].
  2. 設定 SA_NAME 環境變數

    1
    export SA_NAME=n8n-service-account@$PROJECT_ID.iam.gserviceaccount.com

第 5/5 步: 設定 Service Account 可以存取 Secret

  1. 允許存取 supabase-db-password Secret

    1
    2
    3
    gcloud secrets add-iam-policy-binding supabase-db-password \
    --member="serviceAccount:$SA_NAME" \
    --role="roles/secretmanager.secretAccessor"
    實際執行結果展示
    1
    2
    3
    4
    5
    6
    7
    8
    Regional Access Boundary HTTP request failed after retries: response_data={'error': {'code': 404, 'message': 'Not found; Gaia id not found for email keoinn@gmail.com', 'status': 'NOT_FOUND'}}, retryable_error=False
    Updated IAM policy for secret [supabase-db-password].
    bindings:
    - members:
    - serviceAccount:n8n-service-account@cloudrun-n8n-502216.iam.gserviceaccount.com
    role: roles/secretmanager.secretAccessor
    etag: BwZWbLdRGMA=
    version: 1
  2. 允許存取 n8n-encryption-key Secret

    1
    2
    3
    gcloud secrets add-iam-policy-binding n8n-encryption-key \
    --member="serviceAccount:$SA_NAME" \
    --role="roles/secretmanager.secretAccessor"
    實際執行結果展示
    1
    2
    3
    4
    5
    6
    7
    8
    Regional Access Boundary HTTP request failed after retries: response_data={'error': {'code': 404, 'message': 'Not found; Gaia id not found for email keoinn@gmail.com', 'status': 'NOT_FOUND'}}, retryable_error=False
    Updated IAM policy for secret [n8n-encryption-key].
    bindings:
    - members:
    - serviceAccount:n8n-service-account@cloudrun-n8n-502216.iam.gserviceaccount.com
    role: roles/secretmanager.secretAccessor
    etag: BwZWbLm-Nw0=
    version: 1

4. 檢查環境與部署 n8n

請繼續使用 Cloud Shell 進行以下步驟

第 1/3 步: 透過 gist 程式碼測試環境設定狀態

1
curl -fsSL https://gist.githubusercontent.com/keoinn/9865693d69e2627fc82fc96fc2ff172f/raw/verify.sh | bash
執行結果
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
================================
n8n Cloud Run Environment Check
================================

========== GCP Environment ==========
✅ PROJECT_ID = cloudrun-n8n-502216
✅ REGION = asia-east1
✅ SA_NAME = n8n-service-account@cloudrun-n8n-502216.iam.gserviceaccount.com

========== Supabase Configuration ==========
✅ SUPABASE_HOST = aws-0-ap-northeast-1.pooler.supabase.com
✅ SUPABASE_USER = postgres.gyhehwnylhpdpymsgczl
✅ SUPABASE_PORT = 5432
✅ SUPABASE_DATABASE = postgres

========== Secret Manager ==========
✅ Secret exists: supabase-db-password
✅ Secret exists: n8n-encryption-key

========== GCloud Context ==========
✅ gcloud project matches: cloudrun-n8n-502216

========== Summary ==========
✅ Environment configuration OK

第 2/3 步: 執行 n8n 部署到 Cloud Run

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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 \
--service-account=$SA_NAME \
--set-env-vars="\
N8N_PORT=5678,\
N8N_PROTOCOL=https,\
N8N_ENDPOINT_HEALTH=health,\
GENERIC_TIMEZONE=Asia/Taipei,\
QUEUE_HEALTH_CHECK_ACTIVE=true,\
DB_TYPE=postgresdb,\
DB_POSTGRESDB_HOST=$SUPABASE_HOST,\
DB_POSTGRESDB_PORT=$SUPABASE_PORT,\
DB_POSTGRESDB_DATABASE=$SUPABASE_DATABASE,\
DB_POSTGRESDB_USER=$SUPABASE_USER,\
DB_POSTGRESDB_SCHEMA=public,\
DB_POSTGRESDB_SSL_ENABLED=true,\
DB_POSTGRESDB_SSL_REJECT_UNAUTHORIZED=false,\
DB_POSTGRESDB_CONNECTION_TIMEOUT=30000,\
DB_POSTGRESDB_POOL_SIZE=10" \
--set-secrets="\
DB_POSTGRESDB_PASSWORD=supabase-db-password:latest,\
N8N_ENCRYPTION_KEY=n8n-encryption-key:latest"
執行結果
1
2
3
4
5
6
7
8
9
10
11
Regional Access Boundary HTTP request failed after retries: response_data={'error': {'code': 404, 'message': 'Not found; Gaia id not found for email keoinn@gmail.com', 'status': 'NOT_FOUND'}}, retryable_error=False
Regional Access Boundary HTTP request failed after retries: response_data={'error': {'code': 404, 'message': 'Not found; Gaia id not found for email keoinn@gmail.com', 'status': 'NOT_FOUND'}}, retryable_error=False
Deploying container to Cloud Run service [n8n] in project [cloudrun-n8n-502216] region [asia-east1]
Deploying new service...
Setting IAM Policy...\Regional Access Boundary HTTP request failed after retries: response_data={'error': {'code': 404, 'message': 'Not found; Gaia id not found for email keoinn@gmail.com', 'status': 'NOT_FOUND'}}, retryable_error=False
Setting IAM Policy...done
Creating Revision...done
Routing traffic...done
Done.
Service [n8n] revision [n8n-00001-9qf] has been deployed and is serving 100 percent of traffic.
Service URL: https://n8n-420282546722.asia-east1.run.app

成功部署後會看到如下提示:

1
2
Service [n8n] revision [n8n-00001-9qf] has been deployed and is serving 100 percent of traffic.
Service URL: https://n8n-420282546722.asia-east1.run.app

其中,Service URL 表示服務完成後的外網網址,可以透過瀏覽器進行確認。
如果視窗已經關閉,或是終端機訊息已經被清除時,請參考下一步驟查詢外網伺服網址。

第 3/3 步: 查詢外部 n8n 網址

1
2
3
gcloud run services describe n8n \
--region=$REGION \
--format="value(metadata.annotations['run.googleapis.com/urls'])"
執行結果
1
2
Regional Access Boundary HTTP request failed after retries: response_data={'error': {'code': 404, 'message': 'Not found; Gaia id not found for email keoinn@gmail.com', 'status': 'NOT_FOUND'}}, retryable_error=False
["https://n8n-420282546722.asia-east1.run.app","https://n8n-tkk3bngzda-de.a.run.app"]

指令會回傳兩個網址,如下:

1
["https://n8n-420282546722.asia-east1.run.app","https://n8n-tkk3bngzda-de.a.run.app"]

請選擇 https://<專案ID>.<節點區域>.run.app 的網址,作為後續操作的連接入口。
因此上述案例,選擇 https://n8n-420282546722.asia-east1.run.app 作為測試 n8n 部署結果的網址入口。

完成

請繼續參考下一章節,完成 n8n 初始化設定。

5. 完成部署後的設定

第 1/6 步: 透過網址進入 n8n

透過上一章取得的 n8n 服務網址觸發 CloudRun 服務啟動

大約等待 30 秒至 2 分鐘後,對著瀏覽器按下 F5 重新整理。

第 2/6 步: 設定管理者帳號

依照欄位填寫資訊,並按下 "Next" 進行下一步

注意
Email 欄位請使用可以收信的信箱,後續需要透過此信箱接收 Licence Key

第 3/6 步: 填寫 n8n 官方的調查資訊

依照欄位填寫資訊,並按下 "Get started" 進行下一步

第 4/6 步: 填寫 License Key 接收信箱

確認收信信箱是否正確,後點擊 "Send me a free license key“\ 接收序號

第 5/6 步: 登入自己填寫的 Email 尋找 license key

  1. 看到以下資訊後表示 n8n 已經將 license key 寄送至信箱中
  2. 找出 license key 信件 (主旨:Your free n8n license key to unlock selected paid features)

第 6/6 步: 進入設定並登錄 License key

  1. 主畫面左下角 齒輪 icon ⮕ Usage and plan
  2. 點擊主畫面中 "Enter activation key"
  3. 輸入 License Key 並點擊 "Activate"
  4. 完成後,主畫面會顯示 "Registered" Label

完成

6. 刪除服務 (選用)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
export SA_NAME=n8n-service-account@$PROJECT_ID.iam.gserviceaccount.com

# 1. 刪除 Cloud Run Service
gcloud config set run/region asia-east1
gcloud run services delete n8n \
--region=$REGION

# 2. 刪除 Secret Manager Secrets
gcloud secrets delete supabase-db-password --quiet
gcloud secrets delete n8n-encryption-key --quiet

# 3.刪除 Service Account
gcloud iam service-accounts delete \
$SA_NAME

#gcloud iam service-accounts delete \
# n8n-service-account@$PROJECT_ID.iam.gserviceaccount.com

# 4. 移除 IAM Policy
gcloud projects remove-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:$SA_NAME" \
--role="roles/run.invoker"

gcloud projects remove-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:$SA_NAME" \
--role="roles/secretmanager.secretAccessor"

# 5. 如果曾經對 Secret 設定 IAM
gcloud secrets remove-iam-policy-binding supabase-db-password \
--member="serviceAccount:$SA_NAME" \
--role="roles/secretmanager.secretAccessor"

gcloud secrets remove-iam-policy-binding n8n-encryption-key \
--member="serviceAccount:$SA_NAME" \
--role="roles/secretmanager.secretAccessor"

# 6. 確認是否已清除
gcloud run services list --region=$REGION
gcloud iam service-accounts list
gcloud secrets list

留言