適合誰
- Zeabur 上從 GitHub 部署的後端:Node.js、Python、Go 的 API,或是 LINE Bot、Discord Bot
- 流量不大,希望沒人使用時不收運算費(Cloud Run 會自動縮到 0)
- 想要台灣機房:
asia-east1就在台灣
不適合:需要永久硬碟的服務(例如把上傳檔案存在本機資料夾)。Cloud Run 的檔案系統是暫時的,重新部署或縮到 0 之後,寫進去的檔案就不見了。這類服務請把檔案改存到 Cloud Storage 或 R2,或改用 VPS(見 n8n 篇)。
第 0 步:新專案的準備(依官方文件)
- 安裝 gcloud CLI,執行
gcloud init登入並選擇專案。專案必須綁定帳單帳戶 - 啟用 API:
gcloud services enable run.googleapis.com cloudbuild.googleapis.com
- 從原始碼部署時,Cloud Build 預設使用 Compute Engine 的預設服務帳號,官方文件要求授予它 Cloud Run Builder 角色:
gcloud projects add-iam-policy-binding 你的專案ID \
--member=serviceAccount:專案編號[email protected] \
--role=roles/run.builder
文件提到,這個授權需要幾分鐘才會生效。
一定要確認目前用的是哪個專案。 每個
gcloud指令都加上--project=你的專案ID,或先執行gcloud config get-value project確認。我們自己的電腦上就有好幾個專案,預設專案常常不是要部署的那一個。
第 1 步:確認程式監聽 PORT
Zeabur 和 Cloud Run 都用 PORT 環境變數告訴程式要監聽哪個 port。如果你在 Zeabur 上已經照文件用 $PORT,這一步不用改。如果程式寫死 3000,要改成:
app.listen(process.env.PORT || 3000);
第 2 步:部署
在專案根目錄執行(不需要 Dockerfile,Google 的 buildpacks 會自動偵測語言):
gcloud run deploy my-api --source . --region asia-east1 \
--allow-unauthenticated \
--set-env-vars "NODE_ENV=production" \
--project=你的專案ID
完成後會顯示 Service URL: https://my-api-xxxx.asia-east1.run.app。我們實測時,一個沒有 Dockerfile 的 Node 服務,第一次部署就成功回應。
如果專案根目錄有 Dockerfile,Cloud Run 會優先使用它。
第 3 步:金鑰用 Secret Manager,不要寫在環境變數
--set-env-vars 的值任何能看服務設定的人都看得到。資料庫密碼、API key 請放進 Secret Manager:
# 建立 secret(printf 不會在結尾多加換行)
printf '%s' 'postgresql://...' | gcloud secrets create database-url --data-file=- --project=你的專案ID
# 掛到服務上,程式一樣用 process.env.DATABASE_URL 讀取
gcloud run services update my-api --region asia-east1 \
--set-secrets "DATABASE_URL=database-url:latest" --project=你的專案ID
實測會遇到的錯誤
服務帳號沒有讀取 Secret 的權限時,部署會失敗:
ERROR: (gcloud.run.deploy) ... Permission denied on secret: projects/.../secrets/database-url/versions/latest
for Revision service account [email protected]. The service account used must be granted
the 'Secret Manager Secret Accessor' role (roles/secretmanager.secretAccessor) at the secret, project or higher level.
修法是只針對這個 secret 授權(範圍最小),然後重新部署:
gcloud secrets add-iam-policy-binding database-url \
--member="serviceAccount:錯誤訊息裡的服務帳號" \
--role="roles/secretmanager.secretAccessor" --project=你的專案ID
我們實測:授權後重新部署,立刻成功。
第 4 步:資料庫
Cloud Run 不提供資料庫。PostgreSQL 可以搬到 Neon、Supabase 這類代管服務,或使用 Google 的 Cloud SQL。搬法見資料庫篇。
第 5 步:LINE Bot 要改 Webhook 網址
- 到 LINE Developers,選擇你的 Channel
- 「Messaging API」分頁 → Webhook URL,換成新的 Cloud Run 網址(加上你程式的路徑,例如
/webhook) - 按「Verify」確認成功
Channel Secret 和 Access Token 也建議趁這次一起換新,見資安篇。
第 6 步:綁自己的網域
Cloud Run 綁自訂網域有好幾種方式(Cloud Run 網域對應、負載平衡器、Firebase Hosting),各有支援地區與費用上的差異,請依 Google 官方文件選擇。這一步我們這次沒有實測。 切換 DNS 的注意事項見網域與 DNS 篇。