# 🔗 Setup Koneksi Supabase untuk Python API Python API sekarang bisa menyimpan hasil prediksi langsung ke Supabase database. ## 📋 Yang Dibutuhkan Anda perlu 2 environment variables: 1. `SUPABASE_URL` - URL project Supabase Anda 2. `SUPABASE_ANON_KEY` - Anonymous key dari Supabase ## 🔑 Cara Mendapatkan Credentials ### Dari File .env Project Credentials sudah ada di file `.env` project Anda: ``` SUPABASE_URL=https://xyddxrfiacdcnipdclas.supabase.co SUPABASE_ANON_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... ``` ### Atau dari Supabase Dashboard 1. Login ke https://supabase.com 2. Pilih project Anda 3. Sidebar → Settings → API 4. Copy: - **Project URL** → `SUPABASE_URL` - **anon public** key → `SUPABASE_ANON_KEY` ## 🚀 Setup per Platform Deployment ### Hugging Face Spaces 1. **Via Web Interface:** - Buka Space Settings - Tab "Variables and secrets" - Klik "New secret" - Tambahkan 2 secrets: ``` Name: SUPABASE_URL Value: https://xyddxrfiacdcnipdclas.supabase.co Name: SUPABASE_ANON_KEY Value: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... ``` 2. **Restart Space** untuk apply changes ### Railway ```bash # Set secrets via CLI railway variables set SUPABASE_URL=https://xyddxrfiacdcnipdclas.supabase.co railway variables set SUPABASE_ANON_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... # Atau via Dashboard: # Project → Variables → Add Variable ``` ### Google Cloud Run ```bash gcloud run services update palm-classifier \ --set-env-vars SUPABASE_URL=https://xyddxrfiacdcnipdclas.supabase.co,SUPABASE_ANON_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... ``` ### Local Testing Buat file `.env` di folder `python-api/`: ```env PORT=5000 SUPABASE_URL=https://xyddxrfiacdcnipdclas.supabase.co SUPABASE_ANON_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... ``` Lalu jalankan dengan: ```bash cd python-api pip install python-dotenv python -c "from dotenv import load_dotenv; load_dotenv(); import app" # Atau install dan gunakan python-dotenv di app.py ``` ## ✅ Verifikasi Setup ### 1. Check Logs saat Startup Setelah deploy/restart, cek logs. Anda harus melihat: ``` ✓ Supabase client initialized ✓ SVM model loaded successfully ✓ Metadata loaded: ['3 Bulan', '6 Bulan', '9 Bulan'] ``` Jika **TIDAK** melihat "✓ Supabase client initialized", berarti credentials belum diset dengan benar. ### 2. Test API Endpoint ```bash # Health check curl https://your-api-url.com/health # Response harus include supabase status { "status": "healthy", "model_loaded": true, "device": "cpu", "classes": ["3 Bulan", "6 Bulan", "9 Bulan"] } ``` ### 3. Test Classification & Save ```bash # Classify image (dengan base64 image) curl -X POST https://your-api-url.com/classify \ -H "Content-Type: application/json" \ -d '{"image": "data:image/jpeg;base64,..."}' # Response harus include: { "predicted_class": "6 Bulan", "confidence": 0.8543, "probabilities": {...}, "mode": "real", "saved_to_db": true, ← Ini yang penting! "id": "uuid-here" ← ID dari database } ``` Jika `saved_to_db: false`, berarti ada masalah dengan koneksi Supabase. ### 4. Check Database 1. Login Supabase Dashboard 2. Table Editor → predictions 3. Anda harus melihat record baru setiap kali classify ## 📊 Data yang Disimpan Setiap prediction menyimpan: ```json { "id": "uuid", "predicted_class": "6 Bulan", "confidence": 0.8543, "probabilities": { "3 Bulan": 0.0812, "6 Bulan": 0.8543, "9 Bulan": 0.0645 }, "mode": "real", "image_data": "data:image/...", // First 1000 chars "created_at": "2024-01-01T12:00:00Z" } ``` ## ⚠️ Troubleshooting ### "Supabase credentials not found" **Problem:** Environment variables tidak diset **Solution:** - Cek apakah sudah set `SUPABASE_URL` dan `SUPABASE_ANON_KEY` - Restart service setelah set env vars - Verifikasi nilai env vars tidak ada typo ### "Failed to initialize Supabase" **Problem:** Credentials salah atau URL tidak valid **Solution:** - Double check URL dan key dari Supabase Dashboard - Pastikan URL format: `https://xxx.supabase.co` - Pastikan key adalah anon key (public), bukan service role key ### "saved_to_db: false" **Problem:** API tidak bisa save ke database **Solution:** - Cek RLS policies di table `predictions` - Pastikan anon role punya permission INSERT - Cek logs untuk error message detail ### RLS Policy Error Jika ada error "new row violates row-level security policy": ```sql -- Tambahkan policy di Supabase SQL Editor: CREATE POLICY "Allow anon insert" ON predictions FOR INSERT TO anon WITH CHECK (true); ``` ## 🔐 Security Notes 1. **NEVER commit credentials** ke git (sudah di .gitignore) 2. **Use environment variables** untuk semua secrets 3. **Anon key is safe** untuk public API karena dilindungi RLS 4. **Monitor usage** via Supabase Dashboard ## 💡 Optional: Disable Database Saving Jika Anda tidak ingin save ke database, cukup **jangan set** environment variables. API akan tetap berjalan normal, tapi tidak save predictions ke database. Response akan include: `"saved_to_db": false` ## 📚 Reference - [Supabase Python Client Docs](https://supabase.com/docs/reference/python/introduction) - [Environment Variables Best Practices](https://12factor.net/config) - [RLS Policies Guide](https://supabase.com/docs/guides/auth/row-level-security)