昨天我們成功把 n8n 跑在 Cloud Run,但遇到一個大問題:Cloud Run 是無狀態的,只要容器重啟,所有 Workflow 和 Credentials 都會消失。這也是為什麼 n8n 官方建議:正式環境請搭配 Postgres,盡量就不要用 SQLite 囉。
今天,我們就來把 Cloud SQL for Postgres 串接進 Cloud Run 的 n8n,並且透過 Private IP 讓兩者走內網,避免流量 expose 到 internet 上。
gcloud sql instances create n8n-postgres \
--database-version=POSTGRES_15 \
--tier=db-custom-1-3840 \
--region=asia-east1 \
--network=default \
--no-assign-ip \
--storage-size=20GB
這裡使用 --no-assign-ip
即 Private IP,確保只允許 VPC 內部服務存取。
gcloud sql databases create n8ndb --instance=n8n-postgres
gcloud sql users create n8nuser --instance=n8n-postgres --password=n8npass
Cloud Run 要能連上 Cloud SQL(Private IP),必須透過 Serverless VPC Connector:
gcloud compute networks vpc-access connectors create n8n-connector \
--region=asia-east1 \
--network=default \
--range=10.8.0.0/28
在部署時加入環境變數:
gcloud run deploy n8n \
--image gcr.io/<PROJECT_ID>/n8n \
--region=asia-east1 \
--platform=managed \
--vpc-connector=n8n-connector \
--set-env-vars DB_TYPE=postgresdb \
--set-env-vars DB_POSTGRESDB_HOST=<CLOUD_SQL_PRIVATE_IP> \
--set-env-vars DB_POSTGRESDB_DATABASE=n8ndb \
--set-env-vars DB_POSTGRESDB_USER=n8nuser \
--set-env-vars DB_POSTGRESDB_PASSWORD=n8npass \
--allow-unauthenticated
完成後,n8n 的 Workflow 與 Credentials 都會寫進 Cloud SQL,解決了資料不持久的問題。
我們已經完成 Cloud Run + Cloud SQL Private IP 的最佳實踐。這個架構適合小型團隊或企業內部 PoC,既安全又幾乎免維運。接下來會介紹如何把 Cloud Storage 接進 n8n,實作簡單的檔案上傳功能。