# Deploy Runbook — Premium ETL เฟส 3 (Cloud Run)

> มัดเฟส 1 (ingestion) + เฟส 2 (warehouse) เป็นบริการเดียวบน Cloud Run · Scheduler ยิงทุก 4 ชม.

## เตรียม
- `gcloud` CLI + ล็อกอิน · GCP project ของลูกค้า (เป็นเจ้าของ 100%)
- bundle ไฟล์: phase1 (connectors/models/extract_all) + phase2 (quality/loader/schema.sql) + phase3 (main/utils/Dockerfile/requirements) รวมโฟลเดอร์เดียว

## ขั้นตอน (หรือรัน `deploy.sh` ทีละบล็อก)

### 1) เปิด API
run · cloudscheduler · sqladmin · secretmanager · cloudbuild

### 2) Cloud SQL (Postgres)
สร้าง instance + database `warehouse` → `psql "$DATABASE_URL" -f ../phase2/schema.sql` (ลงตาราง+views เฟส 2)

### 3) Secret Manager (⚠️ ไม่ hardcode)
สร้าง secret: `DATABASE_URL`, token ของ 5 แพลตฟอร์ม, `TG_TOKEN`, `TG_CHAT` แล้ว add version ค่าจริง

### 4) Deploy Cloud Run (build จาก source)
```bash
gcloud run deploy premium-etl --source . --region asia-southeast1 \
  --no-allow-unauthenticated --add-cloudsql-instances <PROJECT:REGION:INSTANCE> \
  --set-secrets "DATABASE_URL=DATABASE_URL:latest,TG_TOKEN=TG_TOKEN:latest,..."
```

### 5) Cloud Scheduler (ทุก 4 ชม. · OIDC)
```bash
gcloud scheduler jobs create http premium-etl-4h \
  --schedule "0 */4 * * *" --time-zone Asia/Bangkok \
  --uri <RUN_URL> --http-method GET --oidc-service-account-email <SA>
```

## เช็คสำเร็จ
- Force run scheduler → Cloud Run log ขึ้น `status=200` (หรือ 207 ถ้าบางแพลตฟอร์มล้ม)
- Postgres มีแถวใหม่ · Telegram ได้ daily summary
- ก่อน deploy: `python orchestrate_dryrun.py` ต้องขึ้น `200` + `207` (พิสูจน์ orchestration)

## ⚠️ จุดสำคัญ
- secret อยู่ใน Secret Manager เท่านั้น · service account สิทธิ์ต่ำสุดที่จำเป็น
- Cloud Run `--no-allow-unauthenticated` (เรียกได้เฉพาะ Scheduler ผ่าน OIDC)
