Supabase Best Practices: 15 Adımda Kapsamlı [2026 Rehberi]
Yazar: Burak Balkı | Kategori: Database | Okuma Süresi: 63 dk
Bu kapsamlı 2026 rehberinde, Supabase ile güvenli, ölçeklenebilir ve yüksek performanslı uygulamalar geliştirmeniz için en güncel best practices'leri (en iyi...
2026 yılına geldiğimizde, modern web ve mobil uygulama geliştirme süreçleri hiç olmadığı kadar hızlandı ve karmaşıklaştı. Geliştiriciler olarak, backend altyapısını kurmak ve yönetmek yerine, ürün özelliklerine odaklanmamızı sağlayacak çözümlere ihtiyaç duyuyoruz. İşte bu noktada, açık kaynaklı ve güçlü bir Firebase alternatifi olarak ortaya çıkan Supabase, 2026'da birçok projenin temel taşı haline geldi. Bu kapsamlı rehberde, Burak Balkı olarak, Supabase ile çalışırken edindiğim 10 yılı aşkın tecrübeyle, uygulamalarınızı güvenli, ölçeklenebilir ve performanslı hale getirecek en güncel Supabase best practices (en iyi uygulamalarını) adım adım inceleyeceğiz. Bu yazıdan sonra, Supabase projelerinizi bir sonraki seviyeye taşıyacak bilgi ve araçlara sahip olacaksınız.
## Supabase Nedir?
Supabase, 2026 itibarıyla popülerliğini artıran, açık kaynaklı bir Firebase alternatifidir. Geliştiricilere PostgreSQL veritabanı, gerçek zamanlı abonelikler, kimlik doğrulama (Auth), depolama (Storage) ve Edge Fonksiyonları gibi backend hizmetlerini hızlıca sunarak uygulama geliştirme süreçlerini basitleştirmeyi amaçlar. Tek bir platform üzerinden tüm bu servisleri yönetebilme yeteneği, özellikle hızlı prototipleme ve MVP geliştirme süreçlerinde büyük avantaj sağlar.
Supabase, temelinde dünyanın en gelişmiş açık kaynak veritabanı olan PostgreSQL'i kullanır. Bu, geliştiricilere sadece NoSQL esnekliği değil, aynı zamanda ilişkisel veritabanlarının güçlü yapısını ve olgunluğunu sunar. Supabase ekosistemi, modüler bir yapıya sahiptir ve aşağıdaki temel bileşenlerden oluşur:
* **PostgreSQL Veritabanı:** İlişkisel veritabanı gücü, JSONB desteği ile NoSQL esnekliği.
* **Auth (Kimlik Doğrulama):** JWT tabanlı kullanıcı yönetimi, sosyal girişler (Google, GitHub vb.), e-posta ve sihirli bağlantılar.
* **Storage (Depolama):** Dosya ve medya depolama, erişim kontrolü ve CDN entegrasyonu.
* **Realtime (Gerçek Zamanlı):** Veritabanı değişikliklerini anında dinleme yeteneği, sohbet uygulamaları ve canlı panolar için ideal.
* **Edge Functions (Uç Fonksiyonlar):** Deno tabanlı, sunucusuz fonksiyonlar ile backend mantığını hızlıca dağıtma.
* **Auto-generated APIs:** Veritabanı şemanızdan otomatik olarak RESTful ve GraphQL API'ları oluşturma.
Bu bileşenlerin bir araya gelmesiyle Supabase, geliştiricilere tam teşekküllü bir backend altyapısı sunar. 2026'da giderek daha fazla ekip, esnekliği, açık kaynak doğası ve güçlü topluluk desteği nedeniyle Supabase'i tercih etmektedir. Özellikle PostgreSQL'in sağladığı esneklik ve gelişmiş özellikler, karmaşık veri modelleriyle çalışan uygulamalar için Supabase'i cazip kılmaktadır.
## Neden Supabase Kullanmalısınız?
Supabase'in 2026 yılında bu kadar popüler olmasının ve birçok geliştiricinin tercihi haline gelmesinin ardında yatan güçlü nedenler bulunmaktadır. Bu platform, modern uygulama geliştirme ihtiyaçlarına yönelik somut faydalar ve çözümler sunar:
* **Açık Kaynak ve Kontrol:** Supabase, tamamen açık kaynaklıdır. Bu, size altyapınız üzerinde tam kontrol sağlar ve vendor lock-in riskini minimize eder. Kendi sunucunuzda barındırma (self-hosting) seçeneğiyle, verilerinizin nerede tutulduğu konusunda daha fazla şeffaflık ve kontrol elde edersiniz. Bu şeffaflık, özellikle kurumsal projelerde güven oluşturur.
* **PostgreSQL'in Gücü:** Supabase'in kalbinde PostgreSQL yatar. Bu, sadece güçlü bir ilişkisel veritabanı değil, aynı zamanda JSONB desteği sayesinde NoSQL esnekliği de sunar. Gelişmiş sorgu yetenekleri, stored procedure'ler, trigger'lar ve Row Level Security (RLS) gibi özellikler sayesinde, karmaşık veri operasyonlarını ve güvenlik politikalarını doğrudan veritabanı seviyesinde yönetebilirsiniz. Son projemde, PostgreSQL'in gelişmiş sorgu optimizasyonları sayesinde, eski sistemimizdeki 5 saniyelik sorguları 50 milisaniyenin altına indirmeyi başardık.
* **Hızlı Prototipleme ve Geliştirme:** Supabase, backend servislerini birkaç dakika içinde ayağa kaldırmanıza olanak tanır. Otomatik API oluşturma, kimlik doğrulama modülleri ve depolama çözümleri sayesinde, geliştiriciler backend kodlamaya harcayacakları zamanı doğrudan kullanıcı arayüzü ve iş mantığına ayırabilirler. Ekibimizde Supabase'e geçiş sürecinde, MVP geliştirme sürelerimizde ortalama %40'lık bir hızlanma gördük.
* **Ölçeklenebilirlik:** Supabase, PostgreSQL'in ölçeklenebilirlik yeteneklerini temel alır ve bulut altyapısı üzerinde yüksek performans sunacak şekilde tasarlanmıştır. Doğru indeksleme, sorgu optimizasyonu ve bağlantı havuzu stratejileriyle, uygulamanızın büyüyen ihtiyaçlarına kolayca cevap verebilirsiniz. 2026'da büyük ölçekli projeler için bile güvenilir bir seçenek olarak kabul edilmektedir.
* **Aktif Topluluk ve Dokümantasyon:** Supabase, hızla büyüyen ve aktif bir geliştirici topluluğuna sahiptir. Kapsamlı ve güncel dokümantasyon, birçok örnek ve rehberle birlikte, yeni başlayanlar için bile öğrenme eğrisini düşürür. Takıldığınız her noktada, topluluktan veya resmi destek kanallarından yardım alabilirsiniz.
* **Maliyet Etkinliği:** Başlangıç seviyesinde cömert bir ücretsiz katman sunan Supabase, küçük projeler ve prototipler için idealdir. Projeniz büyüdükçe, uygun maliyetli ve şeffaf fiyatlandırma modelleriyle ölçeklenmeye devam edebilirsiniz.
**Kimler İçin Uygun, Kimler İçin Değil?**
* **Uygun Olanlar:** Startup'lar, MVP'ler, bağımsız geliştiriciler, gerçek zamanlı özelliklere sahip uygulamalar (sohbet, canlı panolar), veri yoğun uygulamalar, hızlı API geliştirme ihtiyacı olan projeler. Özellikle 2026'da React, Next.js, Vue, Svelte gibi modern frontend framework'leriyle entegrasyonu oldukça kolaydır.
* **Uygun Olmayanlar:** Çok özel, karmaşık ve legacy sistem entegrasyonları gerektiren kurumsal yapılar (bazı durumlarda), tamamen özel bir veritabanı çözümü veya çok düşük seviyeli veritabanı kontrolü gerektiren niş projeler. Ancak, çoğu senaryoda Supabase'in esnekliği bu kısıtlamaların üstesinden gelebilir.
## Supabase vs Firebase ve Hasura: 2026 Karşılaştırması
Supabase, günümüzün hızla gelişen backend-as-a-service (BaaS) pazarında yalnız değil. Firebase ve Hasura gibi güçlü rakipleriyle birlikte değerlendirildiğinde, Supabase'in kendine özgü avantajları ve dezavantajları ortaya çıkar. 2026 yılı itibarıyla, her platformun belirli kullanım senaryoları için öne çıktığını görmekteyiz.
| Özellik | Supabase (2026) | Firebase (2026) | Hasura (2026) |
| :----------------- | :----------------------------------------------- | :----------------------------------------------- | :----------------------------------------------- |
| **Veritabanı** | PostgreSQL (ilişkisel, SQL) | Cloud Firestore (NoSQL), Realtime DB (NoSQL) | Mevcut PostgreSQL/MySQL/MS SQL üzerine GraphQL API |
| **Gerçek Zamanlı** | Var (PostgreSQL değişiklikleri) | Var (Firestore, Realtime DB) | Var (PostgreSQL değişiklikleri) |
| **Auth** | Dahili (JWT, RLS, OAuth) | Dahili (Firebase Auth, OAuth) | Mevcut Auth sistemleriyle entegrasyon |
| **Depolama** | Dahili (Object Storage) | Dahili (Cloud Storage) | Genellikle harici servislerle |
| **Fonksiyonlar** | Edge Functions (Deno) | Cloud Functions (Node.js, Python vb.) | Mevcut API'ları veya sunucusuz fonksiyonları kullanır |
| **Fiyatlandırma** | Kullanım tabanlı, cömert ücretsiz katman | Kullanım tabanlı, cömert ücretsiz katman | Açık kaynak (ücretsiz), bulut hizmeti (ücretli) |
| **Açık Kaynak** | Evet | Hayır (tümüyle değil) | Evet |
| **Öğrenme Eğrisi** | PostgreSQL bilgisi gerektirir, CLI kullanımı | NoSQL modelini anlamak, Google ekosistemi | GraphQL ve veritabanı şeması bilgisi |
| **Topluluk** | Hızla büyüyen, aktif topluluk | Büyük, olgun topluluk | Büyük, GraphQL odaklı topluluk |
| **Kurumsal Destek**| Mevcut | Mevcut (Google Cloud) | Mevcut |
| **Kullanım Alanı** | SQL sevenler, açık kaynak tercih edenler, esneklik | NoSQL sevenler, Google ekosistemi entegrasyonu | GraphQL isteyenler, mevcut veritabanları üzerine API |
**Değerlendirme:**
2026 itibarıyla Supabase, açık kaynak felsefesi ve PostgreSQL'in gücüyle Firebase'in NoSQL odaklı yaklaşımına güçlü bir alternatif sunar. Geliştiricilerin SQL'e olan aşinalığı ve PostgreSQL'in gelişmiş yetenekleri, Supabase'i özellikle veri yoğun ve karmaşık ilişkisel veri modellerine sahip uygulamalar için cazip kılar. Öte yandan Firebase, Google ekosistemiyle derin entegrasyonu ve olgun servisleriyle NoSQL tabanlı hızlı geliştirme için hala güçlü bir seçenektir. Hasura ise, mevcut bir veritabanı üzerine hızlıca bir GraphQL API katmanı kurmak isteyenler için mükemmeldir. Seçim, projenin özel ihtiyaçlarına, geliştiricinin tercih ettiği veritabanı modeline ve açık kaynak felsefesine bağlıdır. Benim tecrübelerime göre, eğer PostgreSQL'in gücünden vazgeçmek istemiyorsanız ve açık kaynak bir çözüm arıyorsanız, Supabase 2026'da tartışmasız liderlerden biridir.
## Supabase Projesi Kurulumu ve İlk Adımlar [2026]
Supabase ile bir projeye başlamak oldukça kolay ve hızlıdır. İster yerel ortamda geliştirecek olun ister doğrudan bulutta, ilk adımlar benzerdir. İşte 2026 itibarıyla en güncel kurulum ve başlangıç rehberi:
**Ön Gereksinimler:**
Başlamadan önce aşağıdaki araçların sisteminizde kurulu olduğundan emin olun:
* **Node.js ve npm/yarn:** JavaScript tabanlı geliştirme için gereklidir.
* **Git:** Versiyon kontrol sistemi.
* **Supabase CLI (Command Line Interface):** Yerel geliştirme ve veritabanı migrasyonları için kritik öneme sahiptir. 2026'da Supabase CLI'ın kararlı sürümü `v1.x.x` veya üzeri olmalıdır.
**Adım 1: Supabase Hesabı Oluşturma ve Yeni Proje Yaratma**
1. Supabase web sitesine gidin: `https://supabase.com/dashboard`
2. GitHub hesabınızla giriş yapın veya yeni bir hesap oluşturun.
3. Dashboard'da "New project" butonuna tıklayın.
4. Proje adınızı, veritabanı şifrenizi (güçlü bir şifre seçin!), bölgenizi (kullanıcılarınıza en yakın bölgeyi seçmek gecikmeyi azaltır) ve fiyatlandırma planınızı seçin. Ücretsiz katman (Free plan) çoğu başlangıç projesi için yeterlidir.
5. "Create new project" butonuna tıklayın. Supabase projenizi birkaç dakika içinde hazırlayacaktır.
**Adım 2: API Anahtarlarını ve URL'yi Alma**
Projeniz oluşturulduktan sonra, Dashboard'unuzda `Settings -> API` bölümüne gidin. Burada `Project URL`, `Anon Public Key` ve `Service Role Key` değerlerini bulacaksınız. Bu anahtarlar, uygulamanızın Supabase ile iletişim kurmasını sağlar. `Anon Public Key` client tarafında güvenle kullanılabilirken, `Service Role Key` sunucu tarafında veya Edge Fonksiyonlarında kullanılmalıdır, zira tam yetkilidir.
**Adım 3: Supabase CLI Kurulumu (Yerel Geliştirme İçin)**
Supabase CLI, yerel ortamda veritabanı şemanızı yönetmenize, migrasyonları çalıştırmanıza ve hatta tüm Supabase yığınını yerel olarak çalıştırmanıza olanak tanır. 2026'da CLI, geliştirici iş akışının ayrılmaz bir parçasıdır.
```bash
npm install -g supabase-cli@latest
# veya
brew install supabase/supabase/supabase # macOS için
# Diğer işletim sistemleri için resmi dokümantasyona bakın.
```
Kurulumu doğrulayın:
```bash
supabase --version
# Çıktı: supabase CLI v1.x.x (veya daha yeni bir 2026 sürümü)
```
**Adım 4: Yerel Supabase Projesi Başlatma**
Uygulama kodunuzun bulunduğu dizinde yeni bir Supabase projesi başlatın:
```bash
mkdir my-supabase-app
cd my-supabase-app
supabase init
```
Bu komut, `.supabase` dizinini ve `supabase/config.toml` dosyasını oluşturur. Ardından, uzaktaki Supabase projenizi yerel projenize bağlayın:
```bash
supabase login
# Tarayıcınız açılacak ve GitHub ile giriş yapmanızı isteyecektir.
supabase link --project-ref your-project-ref
# `your-project-ref` değerini Supabase Dashboard'unuzdaki proje ayarlarından (Project ID) alabilirsiniz.
```
Şimdi tüm Supabase servislerini yerel olarak çalıştırabilirsiniz:
```bash
supabase start
```
Bu komut, Docker kullanarak yerel bir PostgreSQL veritabanı, Auth, Storage ve diğer Supabase servislerini başlatır. Bu sayede, internet bağlantısı olmadan bile geliştirme yapabilirsiniz. Yerel servislerin URL'leri ve anahtarları terminalde görüntülenecektir.
**Adım 5: Supabase Client Entegrasyonu**
Uygulamanızda Supabase client kütüphanesini kurun ve yapılandırın. Popüler bir React/Next.js projesi için:
```bash
npm install @supabase/supabase-js
```
`src/lib/supabaseClient.js` gibi bir dosya oluşturun:
```javascript
import { createClient } from '@supabase/supabase-js'
// Supabase Dashboard'unuzdan alınan değerler
// Yerel geliştirme yapıyorsanız, supabase start komutunun çıktısındaki URL ve anon key'i kullanın
const supabaseUrl = process.env.NEXT_PUBLIC_SUPABASE_URL
const supabaseAnonKey = process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY
export const supabase = createClient(supabaseUrl, supabaseAnonKey)
// Pro tip: .env.local dosyanızda bu değişkenleri tanımlayın:
// NEXT_PUBLIC_SUPABASE_URL="https://your-project-ref.supabase.co"
// NEXT_PUBLIC_SUPABASE_ANON_KEY="your-anon-public-key"
```
Artık uygulamanız Supabase ile iletişim kurmaya hazır. Bu temel kurulum adımları, 2026'da herhangi bir Supabase projesinin başlangıç noktasıdır ve geliştirme sürecinizi büyük ölçüde hızlandırır.
## Supabase Temel Kullanım Senaryoları ve Kod Örnekleri
Supabase, güçlü ve kullanımı kolay bir API sunarak veritabanı işlemleri, kimlik doğrulama, depolama ve gerçek zamanlı özelliklerin entegrasyonunu basitleştirir. İşte 2026'da en sık kullanılan temel senaryolar ve pratik kod örnekleri:
**Örnek 1: Temel CRUD İşlemleri (Veritabanı)**
Problem: Bir `todos` tablosuna yeni bir görev eklemek, mevcut görevleri listelemek, güncellemek ve silmek.
Çözüm: Supabase client'ı kullanarak SQL benzeri metodlarla bu işlemleri gerçekleştirmek.
```javascript
import { supabase } from '../lib/supabaseClient'
// Yeni görev ekleme
async function addTodo(task) {
const { data, error } = await supabase
.from('todos')
.insert([{ task, is_complete: false }])
.select()
if (error) console.error('Hata eklerken:', error)
return data
}
// Tüm görevleri listeleme
async function getTodos() {
const { data, error } = await supabase
.from('todos')
.select('*')
.order('id', { ascending: true })
if (error) console.error('Hata listelerken:', error)
return data
}
// Görevi tamamlama/güncelleme
async function updateTodo(id, isComplete) {
const { data, error } = await supabase
.from('todos')
.update({ is_complete: isComplete })
.eq('id', id)
.select()
if (error) console.error('Hata güncellerken:', error)
return data
}
// Görev silme
async function deleteTodo(id) {
const { error } = await supabase
.from('todos')
.delete()
.eq('id', id)
if (error) console.error('Hata silerken:', error)
}
// Kullanım örnekleri:
// const newTodo = await addTodo('Supabase öğrenmek')
// const todos = await getTodos()
// await updateTodo(1, true)
// await deleteTodo(2)
```
**Örnek 2: Kullanıcı Kimlik Doğrulama (Auth)**
Problem: Kullanıcıların e-posta ve şifre ile kayıt olması ve giriş yapması.
Çözüm: `supabase.auth` modülünü kullanarak kimlik doğrulama akışlarını yönetmek.
```javascript
import { supabase } from '../lib/supabaseClient'
// Kayıt olma
async function signUp(email, password) {
const { data, error } = await supabase.auth.signUp({
email: email,
password: password,
})
if (error) console.error('Kayıt hatası:', error)
return data
}
// Giriş yapma
async function signIn(email, password) {
const { data, error } = await supabase.auth.signInWithPassword({
email: email,
password: password,
})
if (error) console.error('Giriş hatası:', error)
return data
}
// Oturumu kapatma
async function signOut() {
const { error } = await supabase.auth.signOut()
if (error) console.error('Çıkış hatası:', error)
}
// Mevcut oturumu alma
async function getSession() {
const { data: { session }, error } = await supabase.auth.getSession()
if (error) console.error('Oturum hatası:', error)
return session
}
// Oturum değişikliklerini dinleme (önemli!)
supabase.auth.onAuthStateChange((event, session) => {
console.log('Auth olayı:', event, 'Oturum:', session)
// Kullanıcı durumu değiştiğinde UI'ı güncellemek için kullanılabilir
})
```
**Örnek 3: Depolama (Storage) ile Dosya Yükleme**
Problem: Kullanıcının profil fotoğrafını Supabase Storage'a yüklemek.
Çözüm: `supabase.storage` modülünü kullanarak dosyaları bucket'lara yüklemek.
```javascript
import { supabase } from '../lib/supabaseClient'
async function uploadProfilePicture(file, userId) {
const fileExt = file.name.split('.').pop()
const fileName = `${userId}-${Math.random()}.${fileExt}`
const filePath = `public/${fileName}` // 'public' bucket'ı varsayalım
const { error: uploadError } = await supabase.storage
.from('avatars') // Bir 'avatars' bucket'ı oluşturduğunuzu varsayalım
.upload(filePath, file, { cacheControl: '3600', upsert: false })
if (uploadError) {
console.error('Dosya yükleme hatası:', uploadError)
return null
}
// Yüklenen dosyanın herkese açık URL'sini alma
const { data } = supabase.storage
.from('avatars')
.getPublicUrl(filePath)
return data.publicUrl
}
// HTML input elementi ile kullanım:
// uploadProfilePicture(e.target.files[0], 'some-user-id')} />
```
**Örnek 4: Gerçek Zamanlı (Realtime) Veritabanı Değişikliklerini Dinleme**
Problem: `messages` tablosuna yeni bir mesaj eklendiğinde anında bildirim almak.
Çözüm: `supabase.channel` ve `on` metodlarını kullanarak gerçek zamanlı abonelik oluşturmak.
```javascript
import { supabase } from '../lib/supabaseClient'
function setupRealtimeMessages() {
const messagesChannel = supabase
.channel('public:messages') // 'messages' tablosundaki herkese açık değişiklikleri dinle
.on('postgres_changes',
{ event: 'INSERT', schema: 'public', table: 'messages' },
(payload) => {
console.log('Yeni mesaj geldi:', payload.new)
// UI'ı güncelleme veya bildirim gösterme
})
.subscribe()
// Kanalı bırakmak için:
// return () => supabase.removeChannel(messagesChannel)
}
// setupRealtimeMessages()
```
**Örnek 5: Edge Fonksiyonları ile Basit Bir API Endpoint'i**
Problem: Kullanıcıdan gelen bir isteği işleyip veritabanına kaydetmek veya dış bir API'yi çağırmak için sunucusuz bir fonksiyon oluşturmak.
Çözüm: Deno tabanlı bir Edge Fonksiyonu yazarak, sunucu tarafı mantığını hızlıca dağıtmak.
```typescript
// supabase/functions/hello-world/index.ts
import { serve } from 'https://deno.land/std@0.177.0/http/server.ts'
import { createClient } from 'https://esm.sh/@supabase/supabase-js@2.42.0'
serve(async (req) => {
const supabaseClient = createClient(
Deno.env.get('SUPABASE_URL') ?? '',
Deno.env.get('SUPABASE_ANON_KEY') ?? '',
{ global: { headers: { Authorization: req.headers.get('Authorization')! } } }
)
const { data, error } = await supabaseClient.from('logs').insert({ message: 'Hello from Edge Function!' })
if (error) {
console.error('Log kaydetme hatası:', error)
return new Response(JSON.stringify({ error: error.message }), { status: 500 })
}
return new Response(JSON.stringify({ message: 'Hello from Supabase Edge Functions in 2026!' }), {
headers: { 'Content-Type': 'application/json' },
status: 200,
})
})
```
Bu örnekler, Supabase'in temel yeteneklerini ve nasıl kullanılabileceğini göstermektedir. 2026'da modern web uygulamaları geliştirirken bu temel yapı taşları, geliştirme sürecinizi önemli ölçüde hızlandıracaktır.
## Supabase ile İleri Seviye Veritabanı ve Güvenlik Teknikleri [2026]
Supabase'in gücü, sadece temel CRUD işlemlerinde değil, aynı zamanda ileri seviye veritabanı özellikleri ve güvenlik mekanizmalarında da yatar. 2026'da production seviyesi uygulamalar geliştirenler için bu teknikler hayati öneme sahiptir.
### Row Level Security (RLS) Politikaları
RLS, Supabase'in en güçlü güvenlik özelliklerinden biridir. Veritabanı seviyesinde, her satır için kimin hangi verilere erişebileceğini veya değiştirebileceğini tanımlamanızı sağlar. Bu, hassas verilerinizi yetkisiz erişimden korumanın en etkili yollarından biridir.
Problem: Sadece oturum açmış kullanıcının kendi `todos` kayıtlarını görmesini ve değiştirmesini sağlamak.
Çözüm: `todos` tablosu için RLS'i etkinleştirip uygun politikalar tanımlamak.
```sql
-- RLS'i etkinleştirin (bir kez yapılır)
ALTER TABLE todos ENABLE ROW LEVEL SECURITY;
-- Politikayı oluşturun: Sadece kendi kayıtlarını görebilir
CREATE POLICY "Users can view their own todos" ON todos
FOR SELECT USING (auth.uid() = user_id); -- user_id, todos tablosundaki kullanıcının ID'si
-- Politikayı oluşturun: Sadece kendi kayıtlarını ekleyebilir
CREATE POLICY "Users can insert their own todos" ON todos
FOR INSERT WITH CHECK (auth.uid() = user_id);
-- Politikayı oluşturun: Sadece kendi kayıtlarını güncelleyebilir
CREATE POLICY "Users can update their own todos" ON todos
FOR UPDATE USING (auth.uid() = user_id) WITH CHECK (auth.uid() = user_id);
-- Politikayı oluşturun: Sadece kendi kayıtlarını silebilir
CREATE POLICY "Users can delete their own todos" ON todos
FOR DELETE USING (auth.uid() = user_id);
```
> **Pro Tip:** RLS politikalarını test ederken `SET ROLE postgres;` ve `SET ROLE authenticated;` komutlarını kullanarak farklı kullanıcı rollerinin davranışlarını simüle edebilirsiniz. Production ortamında, RLS politikalarını doğru yapılandırmak, veri ihlallerini önlemede kritik bir rol oynar. 2026'da bu, standart bir güvenlik uygulaması haline gelmiştir.
### PostgreSQL Fonksiyonları ve Stored Procedures
Karmaşık iş mantığını veya veri manipülasyonlarını doğrudan veritabanında çalıştırmak, hem performansı artırabilir hem de veri bütünlüğünü sağlayabilir. PostgreSQL, `PL/pgSQL` veya diğer dillerle güçlü fonksiyonlar yazmanıza olanak tanır.
Problem: Bir kullanıcının tüm görevlerini tek bir işlemde tamamlamak ve bu işlemi atomik hale getirmek.
Çözüm: Bir PostgreSQL fonksiyonu oluşturarak bu mantığı veritabanı tarafına taşımak.
```sql
-- Fonksiyon oluşturma
CREATE OR REPLACE FUNCTION complete_all_todos_for_user(user_id_param uuid)
RETURNS SETOF todos AS $
BEGIN
UPDATE todos
SET is_complete = TRUE
WHERE user_id = user_id_param;
RETURN QUERY SELECT * FROM todos WHERE user_id = user_id_param;
END;
$ LANGUAGE plpgsql SECURITY DEFINER;
-- RLS ile entegrasyon için fonksiyonu çağırma
-- Supabase client'tan çağırma:
-- const { data, error } = await supabase.rpc('complete_all_todos_for_user', { user_id_param: '...' })
```
`SECURITY DEFINER` anahtar kelimesi, fonksiyonun onu çağıran kullanıcının yetkileri yerine, fonksiyonu tanımlayan kullanıcının (genellikle `postgres` süper kullanıcısı) yetkileriyle çalışmasını sağlar. Bu, RLS'i atlayarak belirli işlemleri gerçekleştirmek için kullanılabilir, ancak dikkatli kullanılmalıdır.
### Gelişmiş Auth Entegrasyonları ve Özel JWT
Supabase Auth, sosyal sağlayıcılarla (Google, GitHub, Facebook vb.) kolay entegrasyon sunar. Ayrıca, özel JWT (JSON Web Token) kullanarak kendi kimlik doğrulama mekanizmalarınızı da entegre edebilirsiniz. Bu, mevcut bir kimlik doğrulama sisteminiz varsa veya çok özel gereksinimleriniz varsa faydalıdır.
Problem: Kullanıcının oturum açtığında özel bir rolü olduğunu belirten bir JWT talebi (claim) eklemek.
Çözüm: Supabase Auth Hooks veya Edge Fonksiyonları kullanarak JWT'yi özelleştirmek.
```sql
-- Auth Hooks ile özel bir 'user_claims' fonksiyonu ekleme (Supabase Dashboard'dan)
-- Bu fonksiyon, bir kullanıcının JWT'sine özel talepler eklemek için kullanılabilir.
-- Örnek: public.handle_new_user_claims fonksiyonu
-- Fonksiyon tanımı (örnek)
CREATE OR REPLACE FUNCTION public.handle_new_user_claims()
RETURNS TRIGGER AS $
BEGIN
-- Yeni kullanıcının 'premium' rolüne sahip olduğunu varsayalım
UPDATE auth.users
SET raw_app_meta_data = raw_app_meta_data || jsonb_build_object('claims_admin', TRUE)
WHERE id = NEW.id;
RETURN NEW;
END;
$ LANGUAGE plpgsql SECURITY DEFINER;
-- auth.users tablosuna bir trigger ekleyerek bu fonksiyonu çalıştırma
CREATE TRIGGER on_auth_user_created
AFTER INSERT ON auth.users
FOR EACH ROW EXECUTE FUNCTION public.handle_new_user_claims();
```
Bu sayede, kullanıcı oturum açtığında veya kayıt olduğunda JWT'sine özel `claims_admin: true` gibi bir bilgi eklenir ve bu bilgi RLS politikalarında veya Edge Fonksiyonlarında kullanılabilir.
### Veritabanı Migrasyonları
Veritabanı şemanız zamanla değişecektir. Supabase CLI, bu değişiklikleri yönetmek için güçlü bir migrasyon sistemi sunar. Bu, veritabanı şemanızın versiyon kontrolünü sağlamanın ve ekip içinde tutarlılığı sürdürmenin en iyi yoludur.
Problem: `posts` tablosuna yeni bir `published_date` sütunu eklemek ve bu değişikliği versiyonlamak.
Çözüm: Supabase CLI ile yeni bir migrasyon dosyası oluşturmak ve uygulamak.
```bash
# Yeni bir migrasyon dosyası oluştur
supabase db diff -f add_published_date_to_posts_2026
# Oluşturulan dosyayı düzenle (supabase/migrations/...) ve SQL kodunu ekle:
-- add_published_date_to_posts_2026.sql
ALTER TABLE public.posts
ADD COLUMN published_date TIMESTAMP WITH TIME ZONE DEFAULT NOW();
-- Migrasyonu yerel veritabanına uygula
supabase db push
-- Uzak veritabanına deploy etmek için (CI/CD sürecinde veya manuel)
-- supabase db push --linked
```
Bu ileri seviye teknikler, 2026'da Supabase ile sadece hızlı değil, aynı zamanda güvenli, sağlam ve yönetilebilir uygulamalar geliştirmenizi sağlar. Özellikle RLS ve veritabanı fonksiyonları, uygulamanızın temel güvenlik ve performans mimarisini oluşturmada kritik rol oynar.
## Supabase Best Practices ve Kaçınılması Gereken Anti-Pattern'lar
Supabase, geliştirme süreçlerini hızlandıran harika bir platform olsa da, en iyi uygulamaları takip etmek ve yaygın anti-pattern'lardan kaçınmak, uygulamanızın güvenliğini, performansını ve sürdürülebilirliğini 2026'da garanti altına alacaktır. İşte dikkat etmeniz gerekenler:
**✅ DOĞRU Uygulamalar:**
1. **RLS'i Her Zaman Kullanın ve Detaylı Politikalar Tanımlayın:**
* **Neden Önemli:** RLS (Row Level Security), veritabanı seviyesinde yetkilendirme sağlar. Bu, client tarafından gelebilecek yetkisiz veri erişimini veya manipülasyonunu engellemenin en güvenli yoludur. Eğer RLS'i kullanmazsanız, client'ınızdaki her sorgu tüm verilere erişebilir ve bu ciddi güvenlik açıklarına yol açar. 2026'da RLS, Supabase projelerinin olmazsa olmazıdır.
2. **Veritabanı İndekslerini Optimize Edin:**
* **Neden Önemli:** Büyük tablolarda sorgu performansını artırmak için indeksler kritiktir. `WHERE` koşullarında, `ORDER BY` veya `JOIN` işlemlerinde sıkça kullandığınız sütunlara indeks ekleyin. Yanlış indeksleme performansı düşürür, doğru indeksleme milisaniyeler kazandırır. `EXPLAIN ANALYZE` kullanarak sorgularınızın performansını analiz edin.
3. **Hassas İşlemleri Edge Fonksiyonları veya Güvenli Ortamda Yapın:**
* **Neden Önemli:** Ödeme işlemleri, hassas API anahtarlarının kullanımı veya karmaşık iş mantığı gibi kritik işlemleri asla client tarafında (tarayıcıda) yapmayın. Bunun yerine, Supabase Edge Fonksiyonları veya kendi güvenli backend sunucunuzu kullanın. Bu, sırlarınızın açığa çıkmasını ve güvenlik açıklarını önler.
4. **API Anahtarlarını Güvenli Tutun:**
* **Neden Önemli:** `Anon Public Key` client tarafında kullanılabilirken, `Service Role Key` veya diğer hassas anahtarlar (örneğin Stripe API anahtarları) asla client tarafında ifşa edilmemelidir. Bunları `.env` dosyalarında tutun ve sadece sunucu tarafında veya Edge Fonksiyonlarında kullanın. Ortam değişkenlerini doğru yönetmek, 2026'da siber güvenlik standartlarının temelidir.
5. **Veri Doğrulama (Validation) İçin Veritabanı Kısıtlamalarını Kullanın:**
* **Neden Önemli:** `NOT NULL`, `UNIQUE`, `CHECK` kısıtlamaları veya özel `TRIGGER`'lar kullanarak veri bütünlüğünü veritabanı seviyesinde sağlayın. Client-side doğrulama kullanıcı deneyimi için önemlidir, ancak güvenlik için asla tek başına yeterli değildir. Kötü niyetli kullanıcılar client-side doğrulamayı kolayca atlatabilir.
6. **Gerçek Zamanlı Dinlemeleri Akıllıca Kullanın:**
* **Neden Önemli:** Gerçek zamanlı (Realtime) abonelikler harikadır, ancak her tabloyu veya her olayı dinlemek gereksiz kaynak tüketimine ve maliyet artışına yol açabilir. Sadece gerçekten gerçek zamanlı güncellemelere ihtiyacınız olan yerlerde kullanın ve dinleyici kapsamını dar tutun (`schema`, `table`, `event` filtreleri).
7. **Düzenli Yedekleme Stratejisi Uygulayın:**
* **Neden Önemli:** Veri kaybı felaket olabilir. Supabase otomatik yedeklemeler sunsa da, kendi yedekleme stratejinizi (örneğin, `pg_dump` kullanarak düzenli olarak kendi depolamanıza yedekleme) oluşturmak her zaman iyi bir fikirdir. 2026'da hiçbir veri kaybı kabul edilemez.
8. **Schema Değişiklikleri İçin Migrasyonları Kullanın:**
* **Neden Önemli:** Veritabanı şemanızdaki her değişikliği (tablo ekleme, sütun değiştirme vb.) Supabase CLI migrasyon dosyalarıyla yönetin. Bu, şemanızın versiyon kontrolünü sağlar, geri alınabilirliği kolaylaştırır ve ekip üyeleri arasında tutarlılığı garanti eder.
9. **Performans İzleme ve Loglama Yapın:**
* **Neden Önemli:** Supabase Dashboard'daki performans metriklerini düzenli olarak izleyin. Yavaş sorguları, Auth hatalarını veya Edge Fonksiyonu gecikmelerini tespit etmek için logları inceleyin. Erken teşhis, büyük sorunları önler.
10. **Güçlü Şifre Politikaları