# Setup Supabase SQL, Secrets Và Firebase

> Chuẩn bị backend tables, auth configuration và Firebase Android project cần thiết trước lần chạy app nghiêm túc đầu tiên.

- URL: https://dantech.academy/courses/kotlin-accelerator/engineer-builder/00-setup-app-running/lesson-04-configure-local-files-secrets
- Khóa học: [Mobile Action Pro](https://dantech.academy/courses/kotlin-accelerator.md)
- Module: Setup App Chạy Được
- Thời lượng: 18 phút
- Độ khó: beginner
- Truy cập: Miễn phí, đọc toàn bài
- English: https://dantech.academy/en/courses/kotlin-accelerator/engineer-builder/00-setup-app-running/lesson-04-configure-local-files-secrets.md

## Mục tiêu

- Tạo Supabase dev project và chạy setup SQL để tạo sẵn các table
- Điền Supabase và Google OAuth values vào local.properties thay vì hardcode secrets
- Register Android app trong Firebase và giữ google-services.json ngoài Git

---

## Mục Tiêu Bài Học

Bạn sẽ chuẩn bị phần backend setup tối thiểu mà app cần trước lần build nghiêm túc đầu tiên: Supabase, Google OAuth values, file `local.properties` và Firebase Android project.

Bài này chưa build feature. Mục tiêu là dọn các lỗi setup mơ hồ trước khi bạn đọc kiến trúc.

## Phần 1: Tạo Supabase Dev Project

Mở [Supabase dashboard](https://supabase.com/dashboard) và tạo dev project:

```text
kotlin-accelerator-dev
```

| Value                            | Android có cần không? | Ghi chú                               |
| -------------------------------- | --------------------- | ------------------------------------- |
| Project URL                      | Có                    | Client gọi Supabase qua URL này       |
| Publishable key (`sb_publishable_...`) | Có              | Client-safe, nhưng định danh project  |
| Service role hoặc secret key     | **Không**             | Backend-only; không paste vào Android |
| Database password                | **Không**             | Chỉ dùng cho admin/server             |

## Phần 2: Chạy Supabase SQL Tối Thiểu

### Cách 1: Chạy manual

Mở Supabase `SQL Editor`, rồi mở file `scripts/sql/setup.sql` trong repo `kotlin-accelerator-ai` và copy nội dung. Repo cũng có `scripts/sql/setup.vi.sql`, cùng nội dung SQL nhưng chú thích bằng tiếng Việt. Chỉ chạy một trong hai file.

Paste vào SQL Editor và chạy. Sau đó mở tab **Database**, bạn sẽ thấy các table đã được tạo.

### Cách 2: Thông qua Supabase MCP

Vào Supabase Project của bạn, chọn **Connect** > **MCP** > chọn AI Client > không tick Read-only > Copy Prompt > paste vào AI Client > Run. AI Client sẽ tự cài MCP server.

Sau đó restart AI Client, gọi @scripts/sql/mcp-bootstrap-prompt.md để MCP tự chạy cài đặt, rồi gọi @scripts/sql/mcp-seed-prompt.md để seed dữ liệu mẫu.

## Phần 3: Cấu Hình Auth Secrets

Repo không kèm key nào. Bạn dùng Supabase project của chính mình, project đã tạo ở Phần 1.

Mở Terminal, `cd` vào root của repo `kotlin-accelerator-ai` và tạo `local.properties` từ file mẫu:

```bash
cp local.properties.example local.properties
```

Trên Command Prompt của Windows, dùng `copy local.properties.example local.properties`.

`local.properties` đã nằm trong `.gitignore`. File mẫu `local.properties.example` được commit vào repo. Ngoài các dòng comment, file có các key sau, value nào cũng là giá trị giữ chỗ:

```properties
supabase.url=https://YOUR-PROJECT.supabase.co
supabase.publishable.key=sb_publishable_YOUR_KEY
google.server.clientId=YOUR_WEB_CLIENT_ID.apps.googleusercontent.com
revenuecat.api.key=goog_YOUR_KEY
premium.gate.enabled=false
daily.challenge.enabled=false
```

Trên Supabase dashboard, bấm **Connect** của project để lấy Project URL và publishable key. Publishable key cũng có trong **Project Settings > API Keys**, là chuỗi ngắn bắt đầu bằng `sb_publishable_`. Paste hai giá trị này vào `supabase.url` và `supabase.publishable.key`, thay cho giá trị giữ chỗ.

App chỉ đọc `supabase.publishable.key`, không đọc tên cũ `supabase.anon.key`. Build Android sẽ dừng nếu key này trống, nếu bạn copy nhầm key dài bắt đầu bằng `eyJ` (anon key cũ mà Supabase sẽ deprecate vào cuối năm 2026), hoặc nếu đó là secret key bắt đầu bằng `sb_secret_`. Thông báo lỗi ghi rõ property cần sửa và không in value ra. Giá trị giữ chỗ `sb_publishable_YOUR_KEY` vẫn qua được bước kiểm tra này, nên nếu quên thay, app vẫn build được nhưng không gọi được Supabase.

`app/build.gradle.kts` đọc các key này và đưa vào `BuildConfig` lúc build, nên giá trị không nằm trong source code. Chỉ `supabase.publishable.key` là bắt buộc để build, key nào thiếu thì thành chuỗi rỗng. Ba dòng `revenuecat.api.key`, `premium.gate.enabled` và `daily.challenge.enabled` là tùy chọn. Khi `premium.gate.enabled=false`, app không khởi tạo RevenueCat, nên bạn chưa cần đụng tới ba dòng này.

File mẫu không có `sdk.dir`, vì đường dẫn Android SDK khác nhau trên mỗi máy. Khi Android Studio sync Gradle, nó tự ghi `sdk.dir` vào `local.properties` nếu file chưa có dòng này, và giữ nguyên các key khác. Nếu build bằng dòng lệnh mà file chưa có `sdk.dir`, đặt biến môi trường `ANDROID_HOME` trỏ tới thư mục Android SDK, tức thư mục mà SDK Manager trong Android Studio hiển thị (Settings, Languages & Frameworks, Android SDK). Nếu tự viết `sdk.dir` trên Windows, dấu `\` và `:` trong đường dẫn phải escape, ví dụ `sdk.dir=C\:\\Users\\<tên>\\AppData\\Local\\Android\\Sdk`.

Với URL và publishable key của project mình, app dùng được Supabase để thực hành Login by Email. Bạn vẫn cần `app/google-services.json` ở Phần 4 thì app mới build được. Đăng nhập bằng Google cần thêm một OAuth web client trong Google Cloud.

Bạn vào [Google Cloud Console](https://console.cloud.google.com/apis/credentials), sau đó làm theo các bước sau.

- Tạo project với tên tùy ý, ví dụ `kotlin-accelerator-dev`.
- Tạo Credentials theo video:

[YouTube](https://www.youtube.com/watch?v=2pvAm5-dy_A)

Client ID trong video là web client. Paste nó vào `google.server.clientId` trong `local.properties`. iOS cần thêm một iOS OAuth client riêng, chỉ khi bạn chạy bản iOS trên Mac.

## Phần 4: Tạo Firebase Android Project

Mở [Firebase Console](https://console.firebase.google.com/), tạo `kotlin-accelerator-dev`, rồi add Android app:

1. Tìm Android package name thật trong project: `applicationId` trong `app/build.gradle.kts`, hiện là `com.creative.kta`.
2. Register đúng package name đó trong Firebase.
3. Thêm debug SHA-1 nếu app dùng Google sign-in hoặc Firebase Auth.
4. Download `google-services.json`.
5. Đặt file ở `app/google-services.json`.

Để lấy debug SHA-1 (debug):

```bash
./scripts/get-sha1-fingerprint.sh
```

Trên Windows (Command Prompt hoặc PowerShell), chạy `scripts\get-sha1-fingerprint.bat`.

Đừng commit `google-services.json` vào Git. File này không chứa nhiều thông tin nhạy cảm, nhưng nó định danh Firebase project của bạn. Repo đã có dòng `app/google-services.json` trong `.gitignore`, đừng xoá nó.

Firebase chỉ được nối vào phía Android. Trên iOS, app dùng implementation thay thế cho Analytics và Remote Config, nên bạn không cần tạo iOS app trong Firebase cho khóa học này.

## Phần 5: Điền Local Config, Không Hardcode

Giờ bạn đã có đủ value cho `local.properties`. Dán vào đúng key, không hardcode vào file Kotlin nào. iOS đọc cùng các value này từ một file riêng, `iosApp/Configuration/Config.xcconfig`, cũng được Git ignore. File đó chỉ cần khi bạn chạy bản iOS trên Mac.

## Pass Kiểm Tra

- Launch app trên Device hoặc Emulator
- Đi qua Splash và Onboarding tới Menu
- Chọn Login bằng Email -> Kiểm tra login, logout, register, reset password
- Chọn Đăng nhập bằng Google. Nếu chưa setup Google auth thì bước này sẽ fail. Setup theo video rồi kiểm tra lại

## Checkpoint

Bạn hoàn tất khi Supabase SQL đã apply, Auth đã config, Firebase có Android app, `app/google-services.json` được ignore, `local.properties` chỉ chứa client-safe values, và các luồng đăng nhập chạy đúng.

---

- Bài trước: [Checklist Tài Khoản Dịch Vụ](https://dantech.academy/courses/kotlin-accelerator/engineer-builder/00-setup-app-running/lesson-03-service-account-checklist.md)
- Bài tiếp theo: [Build, Test và Commit Đầu Tiên](https://dantech.academy/courses/kotlin-accelerator/engineer-builder/00-setup-app-running/lesson-05-first-build-test-commit.md)
