# SaaS kurulumu (Supabase + Lemon Squeezy)

Bu adımlar hesap ve anahtar gerektirdiği için senin tarafından yapılır; kod tarafı hazır. Sırayla:

## 1. Supabase projesi (auth + veritabanı + depolama)
1. https://supabase.com → New project (bölge: Frankfurt). Proje adı `kalip-uretici`.
2. **SQL Editor** → `supabase/migrations/0001_init.sql` içeriğini yapıştır → Run. (Tablolar, RLS, fonksiyonlar, `models` kovası oluşur.)
3. Aynı SQL dosyasının sonundaki satırı kendi e-postanla çalıştır: `update public.profiles set role='admin' where email='...'` (önce uygulamadan bir kez kayıt olmuş olmalısın; profil satırı kayıtta oluşur).
4. **Authentication → Providers**: Email açık (Confirm email: açık önerilir). İstersen Google: OAuth client id/secret gir.
5. **Authentication → URL Configuration**: Site URL = `https://<alan-adın>`; Redirect URLs: `https://<alan-adın>/app/`, `http://localhost:8791/app/`.
6. **Project Settings → API**: `Project URL` ve `anon public` anahtarını `config.js` içine yaz (SUPABASE_URL, SUPABASE_ANON_KEY). Service role anahtarı asla istemciye koyma.

## 2. Webhook fonksiyonu (Edge Function)
```bash
npm i -g supabase            # bir kez
supabase login
supabase link --project-ref aaqixwenzpkpovycvuho
S=$(openssl rand -hex 20); echo "$S" | pbcopy; supabase secrets set LS_WEBHOOK_SECRET="$S"   # 40 karakter (Lemon Squeezy sınırı); panoya kopyalanır, Lemon Squeezy'ye yapıştır
supabase functions deploy ls-webhook --no-verify-jwt
```
Fonksiyon adresi: `https://aaqixwenzpkpovycvuho.supabase.co/functions/v1/ls-webhook` (7 Eylül 2026: üç fonksiyon `--use-api` ile dağıtıldı, şema yüklendi)

Yönetici işlemleri (iptal/iade/duraklat) için ikinci fonksiyon; Lemon Squeezy API anahtarı yalnızca burada durur:
```bash
supabase secrets set LS_API_KEY=<lemon squeezy → Settings → API → yeni anahtar>
supabase functions deploy ls-admin
```
Kullanıcı oluşturma/düzenleme/silme (panelden) için üçüncü fonksiyon:
```bash
supabase functions deploy admin-users
```
SQL (sırayla, her biri idempotent): `0001_init.sql` sonrası `0002_admin_ls.sql` (yönetici görünümüne LS kimlikleri) ve `0003_library.sql` (model kütüphanesi, `library` kovası, yeni ücretsiz plan kuralı) dosyalarını da çalıştır.

## 3. Lemon Squeezy (ödeme + abonelik)
1. https://app.lemonsqueezy.com → mağaza oluştur (alt ad `config.js` → LS_STORE).
2. **Products** → "Kalıp Üretici Pro" ürünü; iki varyant: Aylık (subscription, monthly) ve Yıllık (subscription, yearly). Fiyatları USD belirle (öneri: 9.90 / 99). Aynı USD fiyatları Yönetim → Ayarlar'a gir; ₺/€ kuru otomatik çekilir (ECB), düzeltip kaydet; site bunları gösterir, tahsilat Lemon Squeezy'dedir.
3. Her varyantın "Share" bağlantısındaki `checkout/buy/<uuid>` kısmındaki uuid'leri `config.js` → LS_VARIANT_MONTHLY / LS_VARIANT_YEARLY alanlarına yaz.
4. **Settings → Webhooks** → Add endpoint: URL = fonksiyon adresi; Signing secret = güçlü bir rastgele dize (aynısını adım 2'de `LS_WEBHOOK_SECRET` olarak verdin); Events: `subscription_created, subscription_updated, subscription_cancelled, subscription_resumed, subscription_expired, subscription_paused, subscription_unpaused, subscription_payment_success, order_created`.
5. **Settings → General**: Test mode açıkken test kartıyla (4242 4242 4242 4242) deneyip webhook'un `subscriptions` tablosuna yazdığını gör; sonra mağazayı canlıya al (Lemon Squeezy onayı gerekir: vergi/ödeme bilgileri).

## 4. Yayın (Cloudflare Pages) — canlı: https://kalip-uretici.pages.dev (9 Eylül 2026)
Proje `kalip-uretici` doğrudan yükleme ile kuruldu (wrangler v3, `npx wrangler login` bir kez). Her yayın için:
```bash
./yayinla.sh
```
Betik yalnızca git'teki dosyaları yükler (sunucu kodu, test ve büyük örnekler hariç). Push otomatik yayınlamaz; istersen Cloudflare panelinden depoyu bağlayıp (Workers & Pages → kalip-uretici → Settings → Builds) Git tetiklemesine geçilebilir: build komutu boş, çıktı dizini `/`.

Not: Pages `.html` uzantılı adresleri uzantısız adrese yönlendirir (`/docs/kullanim.html` → `/docs/kullanim`); bağlantılar çalışır.

### Yayın sonrası panel ayarları
- Supabase → Authentication → URL Configuration: Site URL = `https://kalip-uretici.pages.dev`; Redirect URLs listesine `https://kalip-uretici.pages.dev/app/` ekle (e-posta doğrulama ve şifresiz bağlantı bu adrese döner).
- Lemon Squeezy: success URL uygulama tarafından `location.origin + '/app/?odeme=ok'` olarak gönderilir, ayar gerekmez.
- Alan adı: Pages projesi → Custom domains → alan adını ekle; DNS Cloudflare'deyse kayıt otomatik, değilse verilen CNAME'i sağlayıcına gir. Sonra Supabase Site URL/Redirect'e yeni alan adını da ekle.

### Eski plan (Git bağlantısıyla kurulum)
Proje tamamen statik + Supabase; build yok. Depoda hazır olanlar: `_headers` (güvenlik ve önbellek başlıkları: HTML/JS `must-revalidate`, `vendor/` bir yıl immutable). Adımlar:
1. https://dash.cloudflare.com → Workers & Pages → Create → Pages → **Connect to Git** → GitHub hesabını bağla → `enesdigital/kalip-uretici` (özel depo) → Begin setup.
2. Build settings: Framework preset **None**, Build command **boş**, Build output directory **`/`** (kök). Production branch `master`. Save and Deploy.
3. İlk dağıtım `kalip-uretici.pages.dev` gibi bir adres verir. Bundan sonra `master`'a her push otomatik dağıtır (1-2 dk).
4. **Alan adı:** Pages projesi → Custom domains → Set up a domain → alan adını yaz. Alan adı Cloudflare'de değilse verilen CNAME kaydını mevcut DNS sağlayıcına ekle; Cloudflare'deyse kayıt otomatik açılır. SSL otomatik.
5. Yayın sonrası bağlantı ayarları (panelden, her ikisi de yeni adresle):
   - Supabase → Authentication → URL Configuration: Site URL = `https://<alan-adı>`; Redirect URLs listesine `https://<alan-adı>/app/` ekle (localhost satırları kalabilir).
   - Lemon Squeezy: success URL uygulama tarafından `location.origin + '/app/?odeme=ok'` olarak gönderilir, ayrı ayar gerekmez. Mağaza → Settings → General'deki mağaza adresi/alan adı bilgisini istersen güncelle.
6. Canlı adreste kontrol: `/admin/` → Sistem → Kontrolleri çalıştır; `/app/` → giriş → kütüphane indirme → test ödemesi; dil ve para birimi algılama (`?lang=`, `?cur=` ile zorlanabilir).
7. Test modundan canlıya: Lemon Squeezy mağaza onayı → Test mode kapalıyken yeni API anahtarı ve yeni webhook (aynı URL, yeni signing secret) → `supabase secrets set LS_API_KEY=… LS_WEBHOOK_SECRET=…`.

Netlify (`netlify.toml`) ve Vercel (`vercel.json`) için de eşdeğer yapılandırma depoda duruyor.

## 4b. Eski not (statik barındırma, genel)
Proje tamamen statik + Supabase. Seçenekler:
- **Cloudflare Pages / Netlify / Vercel**: depoyu bağla, build komutu yok, çıktı dizini `/` (kök). `netlify.toml` ve `vercel.json` hazır.
- Özel alan adı → Supabase Site URL ve Lemon Squeezy success URL'yi güncelle.
- `config.js` gerçek değerlerle depoda olabilir (anon key herkese açık olmak için tasarlanmıştır; güvenlik RLS'tedir).

## 5. Kontrol listesi
- [ ] Kayıt ol → e-posta doğrula → `profiles` satırı oluştu
- [ ] Yönetim → Model kütüphanesi: STL yükle → önizleme görseli üretildi (Storage `library/thumbs/`), aktif/pasif, sil
- [ ] Free kullanıcı kütüphane modelinin kalıbını indirebiliyor; kendi modelinde "Pro'ya geç" görüyor (`record_download`)
- [ ] Checkout → test ödeme → webhook → `subscriptions.status='active'` → uygulamada PRO rozeti
- [ ] Aboneliği yönet bağlantısı (customer_portal_url) açılıyor
- [ ] İptal → webhook `cancelled` → dönem sonunda `expired` → plan free
- [ ] Yönetim paneli → Sistem → "Kontrolleri çalıştır": tüm satırlar yeşil
- [ ] Yönetim paneli: genel bakış, kullanıcı çekmecesi, toplu işlem, abonelikler, indirmeler, olaylar, ayarlar (duyuru çubuğu uygulamada görünüyor)
- [ ] Yönetim paneli → Yeni kullanıcı (şifreli / davetli), Düzenle (e-posta, ad, şifre, plan, rol, yasak, not), şifre sıfırlama, Sil
- [ ] Yönetim paneli → İptal / Duraklat / Sürdür / İade / ⟳ düğmeleri Lemon Squeezy'de etki ediyor (test modunda)
- [ ] Proje kaydet/aç (Storage `models/<uid>/…`)
- [ ] Yönetim → Ayarlar: USD fiyat + kur kaydet → açılış sayfası ve Pro penceresinde $/₺/€ doğru görünüyor; dil seçici tr/en/de
- [ ] Gizlilik ve koşullar sayfaları, iletişim e-postası

## Şema testi (yerel Postgres)
Supabase'e yüklemeden önce şema yerel bir Postgres'te denenebilir: `auth`/`storage` şemaları için küçük bir taklit (auth.users, auth.uid(), storage.buckets/objects, storage.foldername) oluşturup üç migration'ı sırayla çalıştır; `record_download` / `current_plan` / RLS davranışı 6 Eylül 2026'da bu yöntemle doğrulandı.

## Yerel test (sunucusuz)
`/app/?mock=free`, `/app/?mock=pro`, `/app/?mock=admin` ve `/admin/?mock=1` sahte oturumla tüm akışları (kota, yükseltme, projeler, panel) gösterir.
