1. Fork GitHub repo
| 步驟 | 操作 | 推薦 |
|---|---|---|
| 1 | Fork 這個 repo 到自己的 GitHub | 用要部署的 GitHub 帳號 |
| 2 | 確認 repo 有 main / dev 分支 | 之後 push 會觸發 GitHub Actions |
| 3 | 先不要急著 deploy | 先把 Firebase、GCP、IAM、Secrets 設好 |
2. 建 Firebase / Google Cloud project
| 步驟 | 操作 | 推薦 |
|---|---|---|
| 1 | 在 Google Cloud Console 建 project | Project ID 用正式、短、好辨識的名字 |
| 2 | 綁定 Billing | Functions / Cloud Build / Artifact Registry 會需要 |
| 3 | 到 Firebase Console,把 Firebase 加到同一個 project | 不要另開不同 project |
| 4 | 建立 Firebase Web App | 之後要複製 config 到 GitHub Secrets |
3. Firebase Console 要自己建立或啟用的項目
| 項目 | 操作 | 推薦 |
|---|---|---|
| Authentication | 啟用 Google provider | Authorized domains 加上正式 Hosting 網域 |
| Firestore Database | 建 Native mode database | 台灣使用者建議 asia\-east1 |
| Cloud Storage for Firebase | 建預設 bucket | 要 Always Free 選 us\-central1、us\-east1、us\-west1;要台灣延遲才選亞洲 |
| Hosting | 啟用 Firebase Hosting | 用 default site 即可 |
| Functions | 啟用 Cloud Functions for Firebase | 跟同一個 Firebase project 綁定 |
4. Google Cloud Console 要啟用的 API
API
Firebase Management API
Firebase Hosting API
Firebase Rules API
Identity Toolkit API
Cloud Firestore API
Cloud Storage API
Cloud Functions API
Cloud Build API
Artifact Registry API
Cloud Run Admin API
Eventarc API
Pub/Sub API
Cloud Scheduler API
Cloud Tasks API
Secret Manager API
IAM Credentials API
Service Usage API
5. GitHub Actions deploy account
Firebase Hosting GitHub integration 會建立 GitHub Actions 用的 service account,也可以自己手動建一個。這個專案建議直接用同一個 deploy account,然後補下面權限。
| 權限 | 角色 |
|---|---|
| Firebase 管理 | roles/firebase\.admin |
| Hosting | roles/firebasehosting\.admin |
| Firestore rules | roles/firebaserules\.admin |
| Firestore indexes | roles/datastore\.indexAdmin |
| Storage | roles/storage\.admin |
| Functions | roles/cloudfunctions\.admin |
| Cloud Run | roles/run\.admin |
| Cloud Build | roles/cloudbuild\.builds\.editor |
| Artifact Registry | roles/artifactregistry\.admin |
| Eventarc | roles/eventarc\.admin |
| Pub/Sub | roles/pubsub\.admin |
| Scheduler | roles/cloudscheduler\.admin |
| Tasks | roles/cloudtasks\.admin |
| Secret Manager | roles/secretmanager\.admin |
| 使用 runtime service account | roles/iam\.serviceAccountUser |
6. Functions runtime account
到 Cloud Functions 或 Cloud Run 詳情頁確認 runtime service account,然後給它下面權限。
| 權限 | 角色 |
|---|---|
| Firestore | roles/datastore\.user |
| Storage object | roles/storage\.objectAdmin |
| Secret 讀取 | roles/secretmanager\.secretAccessor |
| Cloud Tasks enqueue | roles/cloudtasks\.enqueuer |
| 清舊 Secret versions | roles/secretmanager\.admin |
7. GitHub Secrets
到 GitHub repo 的 Settings -> Secrets and variables -> Actions 新增:
| Secret | 值 |
|---|---|
FIREBASE\_PROJECT\_ID | Firebase / GCP project id |
FIREBASE\_SERVICE\_ACCOUNT | GitHub Actions deploy service account JSON |
VITE\_APP\_TITLE | App 標題 |
VITE\_ALLOWED\_DOMAIN | 校內 email 網域 |
VITE\_ADMIN\_EMAILS | 管理員 email,逗號分隔 |
VITE\_FIREBASE\_API\_KEY | Firebase Web App config |
VITE\_FIREBASE\_AUTH\_DOMAIN | Firebase Web App config |
VITE\_FIREBASE\_PROJECT\_ID | Firebase Web App config |
VITE\_FIREBASE\_APP\_ID | Firebase Web App config |
VITE\_FIREBASE\_STORAGE\_BUCKET | Firebase Web App config |
VITE\_FIREBASE\_MESSAGING\_SENDER\_ID | Firebase Web App config |
NOTION\_DATABASE\_ID | Notion database id |
NOTION\_TOKEN | Notion integration token |
8. 部署順序
| 順序 | 操作 |
|---|---|
| 1 | Fork repo |
| 2 | 建 Google Cloud project 並綁 Billing |
| 3 | 加 Firebase project |
| 4 | 建 Firebase Web App |
| 5 | 啟用 Auth、Firestore、Storage、Hosting、Functions |
| 6 | 啟用 Google Cloud API |
| 7 | 建或確認 GitHub Actions deploy service account |
| 8 | 設 IAM |
| 9 | 設 GitHub Secrets |
| 10 | push 到 dev 或 main,讓 GitHub Actions 部署 |
官方參考
| 主題 | 連結 |
|---|---|
| Firebase CLI | firebase.google.com/docs/cli |
| Hosting GitHub integration | firebase.google.com/docs/hosting/github-integration |
| Cloud Storage Always Free | cloud.google.com/free/docs/free-cloud-features#cloud-storage |
| Cloud Functions IAM | cloud.google.com/functions/docs/concepts/iam |
| GitHub Actions Secrets | docs.github.com/…/use-secrets-in-github-actions |