Production SaaS Starter
Production SaaS Starter
Workspace tabanlı çok kiracılık, Stripe faturalama, platform admin, RBAC ve i18n içeren production odaklı B2B SaaS temeli. Bu rehber sizi klonlamadan yerel çalıştırmaya bir saatten kısa sürede götürür.
Genel bakış
Production SaaS Starter, workspace tabanlı çok kiracılı bir platformdur — minimal bir demo değil. Gerçek kalıplar içerir: PostgreSQL RLS, SECURITY DEFINER RPC'ler, Stripe webhook idempotency, çift katmanlı RBAC ve servis sağlayıcı soyutlaması.
- Üyelikler, davetler ve slug kapsamlı URL'lerle workspace'ler
- Stripe abonelikleri, kullanım ölçümü, promosyon kodları ve kurumsal anlaşmalar
- Denetim günlükleri ve kullanıcı/workspace moderasyonu ile platform admin konsolu
- E-posta/şifre + OAuth, 2FA, Resend ile şifre sıfırlama
Stack: Next.js 16, React 19, Supabase, Stripe, Resend, 4 dil ile next-intl.
Bağımlılıkları yükle
Ortam değişkenlerini yapılandırmadan önce proje kökünden npm paketlerini yükleyin.
Depoyu klonladıktan sonra bir kez çalıştırın:
npm installOrtam kurulumu
Uygulamayı çalıştırmadan önce .env.local dosyasını yapılandırın. Önce dosyayı oluşturun, ardından aşağıdaki kurulumu tamamladıkça bölüm bölüm değer ekleyin.
Yerel env dosyası oluştur
Devam etmeden önce proje kökünde .env.example → .env.local kopyalayın. Stripe ve Resend değerlerini aşağıdaki bölümlerde ekleyin. Supabase değişkenleri Supabase kurulum bölümünde yapılandırılır.
cp .env.example .env.localWindows: copy .env.example .env.local
Uygulama
ZorunluDağıtılmış uygulama URL'niz — ödeme yönlendirmeleri, e-posta bağlantıları ve OAuth callback'leri için kullanılır.
Adımlar
- 1Yerel geliştirme için NEXT_PUBLIC_APP_URL=http://localhost:3000 ayarlayın
- 2Production için Vercel dağıtım URL'nizi veya özel alan adınızı kullanın
- 3Değişkeni Vercel → Proje → Ayarlar → Ortam Değişkenleri bölümüne ekleyin
Ortam değişkenleri
NEXT_PUBLIC_APP_URLZorunluSaaS uygulamanızın genel URL'si (sonunda / olmadan).
Nerede bulunur
Yerel: http://localhost:3000 · Production: Vercel proje alan adı veya özel domain
Örnek: https://app.alanadiniz.com
NEXT_PUBLIC_APP_NAMEİşlemsel e-postalarda gösterilen marka adı.
Nerede bulunur
Herhangi bir görünen ad seçin — harici servis gerekmez
Örnek: Acme SaaS
İzin verilen origin'ler
CSRF doğrulaması ve server action'lar için çapraz origin erişimini yapılandırın.
ALLOWED_ORIGINSAPI'lere erişmesine izin verilen frontend alan adlarının virgülle ayrılmış listesi.
ALLOWED_ORIGINS=ALLOWED_ORIGINS=http://localhost:3000ALLOWED_ORIGINS=http://localhost:3000,https://example.comSupabase kurulumu
Bu Supabase adımlarını sırayla tamamlayın — projenizi oluşturun, ardından ortam değişkenlerini ekleyin.
Bu Supabase adımlarını sırayla tamamlayın — projenizi oluşturun, ardından ortam değişkenlerini ekleyin.
2 adım — sırayla tamamlayın
Supabase kurulumu
~5 dkProjenizi oluşturun ve Project ID'nizi kopyalayın
Supabase projesi oluştur
supabase.com'da oturum açın, New project'e tıklayın, ad ve bölge seçin, veritabanı parolası belirleyin ve sağlanmayı bekleyin.
Supabase Panelini açProject ID'nizi kopyalayın
API URL'nizi oluştururken ve uygulamayı yapılandırırken bunu kullanacaksınız.
Supabase ortam değişkenleri
Supabase projenizi oluşturduktan sonra bunları .env.local dosyasına ekleyin.
Her iki anahtar da aynı sayfada bulunur.
NEXT_PUBLIC_SUPABASE_URLProje API URL'niz.
Henüz proje oluşturmadıysanız:
- https://supabase.com/dashboard/org adresine gidin
- Organizasyonunuzu açın, bir proje oluşturun, ardından Project URL'yi kopyalayın.
- Supabase Panel → Projenizi açın → Settings → API → Project URL
NEXT_PUBLIC_SUPABASE_URL=https://YOURPROJECTID.supabase.coNerede bulunur
Supabase Panel → Projenizi açın → Settings → API → Project URL
NEXT_PUBLIC_SUPABASE_ANON_KEYİstemci tarafı Supabase Auth ve sorgular için genel anon anahtarı.
Nerede bulunur
Supabase Panel → Project Settings → API Keys → Legacy API Keys → anon public
SUPABASE_SERVICE_ROLE_KEYYalnızca sunucu tarafı service role anahtarı — istemciye asla açmayın.
Nerede bulunur
Supabase Panel → Project Settings → API Keys → Legacy API Keys → service_role
Super admin e-postası
Supabase kimlik bilgileri yapılandırıldıktan sonra ekleyin.
SUPER_ADMIN_EMAILSuper admin izinleri alması gereken e-posta adresi.
SUPER_ADMIN_EMAIL=SUPER_ADMIN_EMAIL=admin@example.comStripe kurulumu
Stripe CLI
Geliştirme sırasında yerel kimlik doğrulama ve webhook yönlendirme için Stripe CLI kullanın.
- 1Resmi Stripe dokümantasyonundaki talimatlara göre Stripe CLI'yi yükleyin
- 2Platforma özel kurulum adımlarını tamamlayın
- 3Stripe kimlik doğrulama/giriş işlemini çalıştırın
- 4Kimlik doğrulamadan sonra yerel Stripe geliştirmesine devam edin
CLI'yi doğrula
login çalıştırın — Stripe hesabınızı bağlamak için bir tarayıcı penceresi açılır:
stripe loginWebhook'ları yerelde yönlendir
Önce şunu çalıştırın:
stripe listen --forward-to localhost:3000/api/stripe/webhookArdından terminal çıktısındaki oluşturulan imza secret'ını (whsec_...) kopyalayın:
whsec_xxxxx.env.local dosyasına yapıştırın:
STRIPE_WEBHOOK_SECRET=whsec_xxxxxAPI anahtarları
Stripe Dashboard'u açın ve anahtarlarınızı .env.local dosyasına kopyalayın — depoda veya dokümantasyonda asla hardcode etmeyin.
Stripe Dashboard'u aç- NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY — Publishable key'i kopyalayın
- STRIPE_SECRET_KEY — Secret key'i kopyalayın
Resend kurulumu
Resend
Zorunluİşlemsel e-posta — davetler, 2FA OTP, şifre sıfırlama. Supabase yerleşik e-postası kullanılmaz.
Adımlar
- 1resend.com'da kayıt olun
- 2Gönderim alan adınızı ekleyin ve doğrulayın (DNS kayıtları)
- 3Bir API anahtarı oluşturun
- 4RESEND_FROM_DOMAIN değerini doğrulanmış gönderim alan adınıza ayarlayın (aşağıdaki Resend kurulumuna bakın)
Ortam değişkenleri
RESEND_API_KEYZorunluE-posta göndermek için API anahtarı.
Nerede bulunur
Resend Panel → API Keys → Create API Key
RESEND_FROM_DOMAINDoğrulanmış Resend alan adınızı içermelidir. Yalnızca kök/origin alan adını kullanın — alt alan adı değil.
RESEND_FROM_DOMAIN=RESEND_FROM_DOMAIN=shipy.liveHızlı başlangıç
Yukarıdaki ortam, Supabase, Stripe ve Resend kurulumunu tamamladıktan sonra şunu çalıştırın:
Seed planlarını Stripe ile senkronize et — ağırlıklı olarak test ve Stripe planlarını veritabanıyla eşitlemek için
npm run sync:plans🎉 Tebrikler!
Her şey yapılandırıldı. Uygulamayı başlatın:
npm run devHazırsınız!
Geliştirme ve production
Günlük geliştirme ile production derlemesini yerelde önizleme için farklı komutlar kullanın.
Geliştirme
Hot reload ile geliştirme sunucusunu başlatın:
npm run devProduction önizlemesi
Production ortamını yerelde önizleyin — uygulamayı derleyin, ardından production sunucusunu başlatın:
npm run buildnpm run startKomut referansı
| Komut | Açıklama |
|---|---|
| npm run sync:plans | Seed planlarını Stripe ürün/fiyatlarıyla senkronize et |
| npm run dev | Geliştirme sunucusunu başlat |
| npm run build | Production derlemesi |
| npm run start | Production sunucusunu başlat (build sonrası) |
| npm run test | Jest birim testlerini çalıştır (yalnızca servisler) |
Mimari
Katı çağrı sırası olan dört katman — agent'lar ve geliştiriciler aynı yolu izler:
UI → Server Actions / API → Services → Repositories → PostgreSQL (RLS/RPC)Temel konumlar:
Katman 1
Sunum — src/app/, src/components/
Katman 2
Uygulama — server action'lar, createRequestContext(), RBAC guard'ları
Katman 3
Domain — src/modules/*/ *.service.ts (iş kuralları)
Katman 4
Veri — repository'ler + src/services/ üzerinden PostgreSQL RLS/RPC'ler
Çok kiracılık
Workspace kiracıdır — ayrı bir organizasyon tablosu yoktur.
- Kiracı anahtarı: workspaces.id (UUID); URL'ler benzersiz slug kullanır
- Üyelikler kullanıcıları owner, admin veya member rolleriyle workspace'lere bağlar
- RLS politikaları workspace_id IN (kullanıcının üyelikleri) kuralını uygular
Platform admin'ler platform_admins tablosu üzerinden /admin'e erişir — super_admin, platform_admin veya platform_viewer rolleri.
Kimlik doğrulama ve yetkilendirme
Auth akışı: giriş → isteğe bağlı 2FA → onboarding (workspace yok) veya workspace paneli. Platform admin davetleri platform-onboarding'e yönlendirir.
- Supabase Auth ile e-posta/şifre ve OAuth
- E-posta OTP ile 2FA (Resend) — Supabase yerleşik e-postası değil
- Token tabanlı akış ve hız sınırlama ile şifre sıfırlama
Workspace rolleri ve izinleri:
ownerfaturalama, workspace silme, tam üye yönetimiadminüye davet etme/çıkarma, workspace ayarlarını güncellemememberokuma ve katılım — admin işlemi yok
Faturalama ve abonelikler
Workspace başına bir aktif abonelik, Stripe müşteri ve abonelik ID'lerine bağlı.
- Yeni abonelikler için checkout; self-servis yönetim için portal
- Orantılı yükseltmeler; dönem sonunda planlanan düşürmeler
- Seed planlar: Starter ($29/ay), Pro ($39/ay), Enterprise (özel)
- /api/stripe/webhook, idempotent stripe_events tablosu ile durumu senkronize eder
Dağıtım
Önerilen stack: Vercel (Next.js) + Supabase Cloud + Stripe webhook'ları.
- 1Tüm env değişkenlerini Vercel'de ayarlayın — yukarıdaki Ortam kurulumu bölümünü kullanın
- 2Next.js uygulamasını dağıtın
- 3Stripe webhook kaydedin → https://YOUR_APP_URL/api/stripe/webhook
- 4Super admin oluşturun ve production'da sync:plans çalıştırın

