Yükleniyor...

Firebase En İyi Uygulamaları: 15 Detaylı Pratik [2026 Rehberi]

Yazar: Burak Balkı | Kategori: Database | Okuma Süresi: 58 dk

Bu kapsamlı rehber, 2026 yılı itibarıyla Firebase'in en iyi uygulamalarını detaylıca inceler. Güvenli veri modellemeden maliyet optimizasyonuna, ileri seviye...

# Firebase En İyi Uygulamaları: 15 Detaylı Pratik [2026 Rehberi] 2026 yılında modern uygulama geliştirmenin temel taşlarından biri haline gelen Firebase, hızla büyüyen projeler için eşsiz avantajlar sunar. Ancak bu güçlü platformun tüm potansiyelini açığa çıkarmak ve yaygın tuzaklardan kaçınmak için doğru stratejilere ihtiyacınız var. Bu kapsamlı rehberde, **Firebase en iyi uygulamalarını** derinlemesine inceleyerek projelerinizi 2026 standartlarında güvenli, ölçeklenebilir ve maliyet etkin bir şekilde nasıl geliştireceğinizi adım adım öğreneceksiniz. Bir Bilgisayar Mühendisi ve Full Stack Developer olarak, 10 yılı aşkın süredir edindiğim tecrübelerle, bu rehberin size gerçek dünya senaryolarında yol göstereceğine eminim. ## Firebase Nedir? (2026 Güncel Tanım) Firebase, Google tarafından geliştirilen, mobil ve web uygulamaları için kapsamlı bir geliştirme platformudur. Backend hizmetleri sunarak geliştiricilerin sunucu yönetimiyle uğraşmadan hızlıca uygulama oluşturmasını sağlar. Kimlik doğrulama, veritabanı, depolama, barındırma ve bulut fonksiyonları gibi birçok hizmeti 2026 itibarıyla tek bir çatı altında sunar. Firebase, geliştiricilere uygulama geliştirme sürecini hızlandırmak için tasarlanmış bir dizi araç ve hizmet sunan bir Backend-as-a-Service (BaaS) platformudur. Geleneksel backend geliştirmenin karmaşıklığını ortadan kaldırarak, geliştiricilerin kullanıcı arayüzüne ve iş mantığına odaklanmasına olanak tanır. 2026 yılı itibarıyla Firebase, özellikle gerçek zamanlı veri senkronizasyonu, sunucusuz mimariler ve kolay ölçeklenebilirlik arayan projeler için vazgeçilmez bir çözüm haline gelmiştir. Google Cloud Platform (GCP) altyapısı üzerinde çalıştığı için, GCP'nin güçlü ve global ağından faydalanır. ## Neden Firebase Kullanmalısınız? (2026 Değer Önerisi) Firebase, 2026'da uygulama geliştirme dünyasında neden bu kadar popüler? İşte somut faydaları ve çözdüğü problemler: * **Hızlı Geliştirme ve Dağıtım:** Sunucu kurulumu, veritabanı yönetimi veya API yazma gibi backend görevleriyle uğraşmak yerine, geliştiriciler doğrudan uygulama mantığına odaklanabilir. Bu, MVP'lerin (Minimum Viable Product) ve hızlı prototiplerin çok daha kısa sürede hayata geçirilmesini sağlar. Projelerimde Firebase kullanarak geliştirme sürelerini %30-50 oranında kısalttığımı gözlemledim. * **Otomatik Ölçeklenebilirlik:** Firebase hizmetleri, uygulamanızın kullanıcı sayısı arttıkça otomatik olarak ölçeklenir. Milyonlarca kullanıcıya hizmet veren uygulamaların backend altyapısını yönetme yükünü Firebase üstlenir. Bu, özellikle ani trafik artışlarına maruz kalan uygulamalar için kritik bir avantajdır. * **Gerçek Zamanlı Veritabanı:** Firestore ve Realtime Database, verileri gerçek zamanlı olarak senkronize ederek anlık etkileşim gerektiren uygulamalar (sohbet, canlı yayın, çok oyunculu oyunlar) için idealdir. Bu sayede, kullanıcılar her zaman en güncel verilere erişebilir. * **Kapsamlı Ekosistem:** Kimlik doğrulama (Authentication), depolama (Cloud Storage), barındırma (Hosting), bulut fonksiyonları (Cloud Functions), analitik (Analytics) ve makine öğrenimi (ML Kit) gibi birçok entegre hizmet sunar. Bu entegrasyon, farklı servisleri bir araya getirme karmaşasını ortadan kaldırır. * **Maliyet Etkinliği:** Başlangıçta cömert bir ücretsiz katman (Spark Plan) sunar ve kullandıkça öde modeliyle çalışır. Bu, özellikle başlangıç aşamasındaki veya düşük bütçeli projeler için büyük bir avantajdır. Ancak, doğru optimizasyon yapılmazsa maliyetler hızla artabilir, bu nedenle **Firebase en iyi uygulamaları** kritik öneme sahiptir. * **Geliştirici Dostu Araçlar:** Firebase CLI, emülatörler ve zengin SDK'lar (Web, Android, iOS, Unity, C++) geliştirme sürecini kolaylaştırır. Aktif ve büyük bir geliştirici topluluğu sayesinde, karşılaşılan sorunlara hızlıca çözüm bulunabilir. **Firebase Kimler İçin Uygundur?** * Hızlı prototipleme ve MVP geliştiren startup'lar. * Gerçek zamanlı veri senkronizasyonu gerektiren web ve mobil uygulamalar. * Sunucusuz mimarileri benimseyen geliştiriciler ve ekipler. * Backend altyapısı yönetimiyle uğraşmak istemeyenler. **Firebase Kimler İçin Uygun Değildir?** * Tamamen on-premise (şirket içi) veya belirli bir bulut sağlayıcısına bağlı kalması gereken projeler. * Karmaşık SQL ilişkisel veritabanı şemaları ve sorguları gerektiren uygulamalar (doğrudan çözüm sunmaz, ancak Cloud SQL entegrasyonu mevcuttur). * Veri egemenliği veya yasal nedenlerle verilerin belirli bir coğrafi bölgede kalmasını zorunlu kılan ve Firebase'in bölgesel seçeneklerinin yetersiz kaldığı durumlar. ## Firebase vs Alternatifler (2026 Karşılaştırması) Firebase, BaaS alanında güçlü bir oyuncu olsa da, 2026 itibarıyla pazarda farklı ihtiyaçlara hitap eden başka alternatifler de bulunmaktadır. İşte Firebase'i AWS Amplify ve Supabase ile karşılaştıran bir tablo: | Özellik | Firebase | AWS Amplify | Supabase | | :------------------ | :---------------------------------------------------- | :-------------------------------------------------- | :---------------------------------------------------- | | **Veritabanı** | Firestore (NoSQL), Realtime Database (NoSQL) | DynamoDB (NoSQL), Aurora (ilişkisel), PostgreSQL | PostgreSQL (ilişkisel) | | **Kimlik Doğrulama**| Firebase Authentication | AWS Cognito | Supabase Auth (PostgreSQL tabanlı) | | **Depolama** | Cloud Storage | S3 | Supabase Storage | | **Sunucusuz Fonk.** | Cloud Functions (Node.js, Python, Go, Java, Dart) | AWS Lambda (Çoklu dil desteği) | Supabase Edge Functions (Deno tabanlı JavaScript/TypeScript) | | **Barındırma** | Firebase Hosting (CDN entegrasyonlu) | AWS Amplify Hosting (CDN entegrasyonlu) | Vercel, Netlify gibi 3. parti entegrasyonlar | | **Öğrenme Eğrisi** | Orta - Hızlı başlangıç, detaylarda karmaşıklaşabilir | Yüksek - AWS ekosistemini anlamak zaman alır | Orta - PostgreSQL bilgisi avantaj sağlar | | **Ekosistem** | Google Cloud entegrasyonu, zengin ML/Analytics araçları | Geniş AWS servis entegrasyonu | Open-source, PostgreSQL odaklı, topluluk büyüyor | | **Topluluk** | Çok büyük ve aktif geliştirici topluluğu | Büyük ve kurumsal ağırlıklı topluluk | Hızla büyüyen, geliştirici odaklı topluluk | | **Kurumsal Destek** | Google Cloud desteği, Premium planlar | AWS Kurumsal Destek seviyeleri | Topluluk desteği, ücretli planlarda premium destek | | **Kullanım Alanı** | Hızlı MVP, gerçek zamanlı uygulamalar, mobil/web | AWS ekosistemine derinlemesine entegre projeler | PostgreSQL tabanlı, açık kaynak, SQL tercih edenler | **Yorum:** 2026 itibarıyla Firebase, özellikle hızlı başlangıç, gerçek zamanlı yetenekler ve kapsamlı bir entegre ekosistem arayan geliştiriciler için hala en popüler seçeneklerden biridir. AWS Amplify, AWS ekosistemine zaten yatırım yapmış veya daha fazla esneklik ve kontrol arayan büyük ölçekli kurumsal projeler için caziptir. Supabase ise açık kaynak felsefesini benimseyen, PostgreSQL'in gücünden faydalanmak isteyen ve SQL tabanlı çözümleri tercih eden geliştiriciler için güçlü bir alternatiftir. Seçim, projenizin özel gereksinimlerine, ekibinizin deneyimine ve mimari tercihlerinize bağlıdır. ## Kurulum ve İlk Adımlar (2026 Hızlı Başlangıç) Firebase projenize başlamak için temel kurulum adımları ve ilk yapılandırmalar oldukça basittir. 2026 yılı itibarıyla Firebase CLI ve SDK'lar sürekli güncellenmekte olup, bu adımlar size güncel bir başlangıç sağlayacaktır. **Ön Gereksinimler:** * Node.js (LTS sürümü, 2026 itibarıyla v20.x veya üzeri önerilir) * npm veya Yarn paket yöneticisi * Google hesabı (Firebase projesi oluşturmak için) **Adım 1: Firebase CLI Kurulumu** Firebase komut satırı arayüzü (CLI), Firebase projelerinizi yönetmenizi, dağıtmanızı ve test etmenizi sağlar. Global olarak kurmanız önerilir: ```bash npm install -g firebase-tools@latest ``` Bu komut, 2026'daki en güncel `firebase-tools` sürümünü global olarak kuracaktır. Kurulum sonrası `firebase --version` komutu ile CLI sürümünü kontrol edebilirsiniz. **Adım 2: Firebase Hesabına Giriş Yapma** CLI'yı kullanarak Firebase hesabınıza giriş yapmanız gerekir: ```bash firebase login ``` Bu komut sizi tarayıcınıza yönlendirecek ve Google hesabınızla oturum açmanızı isteyecektir. Başarılı bir oturum açmanın ardından CLI, kimlik doğrulama jetonunuzu kaydedecektir. **Adım 3: Yeni Bir Firebase Projesi Oluşturma** Firebase Console üzerinden yeni bir proje oluşturabilir veya mevcut bir Google Cloud projesini kullanabilirsiniz. Yeni bir proje oluşturmak için [Firebase Console](https://console.firebase.google.com/) adresine gidin ve 'Proje Ekle' butonuna tıklayın. **Adım 4: Projeyi Yerelde Başlatma** Uygulamanızın kök dizininde (örneğin, bir web projesi için `my-app` klasöründe) aşağıdaki komutu çalıştırarak Firebase'i başlatın: ```bash firebase init ``` Bu komut size hangi Firebase özelliklerini (Firestore, Functions, Hosting, Storage vb.) kurmak istediğinizi soracaktır. Genellikle bir web projesi için Hosting, Firestore ve Functions seçilir. Ayrıca mevcut Firebase projenizi seçmeniz istenir. Bu işlem, projenizin kök dizinine `firebase.json` ve `.firebaserc` gibi yapılandırma dosyalarını oluşturacaktır. **Adım 5: Firebase SDK'yı Uygulamanıza Entegre Etme (Web Örneği)** Web uygulamanızda Firebase SDK'sını kullanmak için, projenizin ana dosyasına (örneğin, `src/index.js` veya `src/main.js`) Firebase yapılandırmasını eklemeniz gerekir. İlk olarak SDK'yı yükleyin: ```bash npm install firebase@latest ``` Ardından, `firebase.js` adında bir dosya oluşturup Firebase yapılandırmanızı buraya ekleyin: ```javascript // src/firebase.js import { initializeApp } from 'firebase/app'; import { getFirestore } from 'firebase/firestore'; import { getAuth } from 'firebase/auth'; import { getStorage } from 'firebase/storage'; // Firebase Console'dan projenizin yapılandırma bilgilerini alın (Web uygulamanız için) const firebaseConfig = { apiKey: "YOUR_API_KEY", authDomain: "YOUR_AUTH_DOMAIN", projectId: "YOUR_PROJECT_ID", storageBucket: "YOUR_STORAGE_BUCKET", messagingSenderId: "YOUR_MESSAGING_SENDER_ID", appId: "YOUR_APP_ID", measurementId: "YOUR_MEASUREMENT_ID" // Opsiyonel }; // Firebase'i başlat const app = initializeApp(firebaseConfig); // Kullanacağınız Firebase servislerini dışa aktarın export const db = getFirestore(app); export const auth = getAuth(app); export const storage = getStorage(app); export default app; ``` Diğer dosyalarınızda bu servisleri içe aktararak kullanabilirsiniz: ```javascript // src/App.js import React, { useEffect, useState } from 'react'; import { db } from './firebase'; import { collection, getDocs } from 'firebase/firestore'; function App() { const [data, setData] = useState([]); useEffect(() => { const fetchData = async () => { const querySnapshot = await getDocs(collection(db, "myCollection")); const items = querySnapshot.docs.map(doc => ({ id: doc.id, ...doc.data() })); setData(items); }; fetchData(); }, []); return (

My Firebase App (2026)

    {data.map(item => (
  • {item.name}
  • ))}
); } export default App; ``` Bu ilk adımlar, Firebase'i projenize entegre etmeniz için yeterlidir. Artık **Firebase en iyi uygulamalarını** keşfetmeye hazırsınız. ## Temel Kullanım ve Örnekler (2026 Core Usage) Firebase'in temel servislerini gerçek dünya senaryolarında nasıl kullanacağınızı gösteren pratik örneklere geçelim. Bu örnekler, 2026'daki en güncel SDK yaklaşımlarını yansıtmaktadır. ### Örnek 1: Firestore CRUD İşlemleri (Görev Listesi) **Problem:** Bir web uygulamasında basit bir görev listesi oluşturmak, görevleri eklemek, okumak, güncellemek ve silmek. **Çözüm:** Firestore'u kullanarak görevleri bir koleksiyonda depolayacağız. ```javascript // src/components/TodoList.js import React, { useState, useEffect } from 'react'; import { db } from '../firebase'; import { collection, addDoc, getDocs, updateDoc, deleteDoc, doc, onSnapshot, query, orderBy } from 'firebase/firestore'; function TodoList() { const [todos, setTodos] = useState([]); const [newTodo, setNewTodo] = useState(''); // Verileri gerçek zamanlı dinle useEffect(() => { const q = query(collection(db, "todos"), orderBy("createdAt", "desc")); const unsubscribe = onSnapshot(q, (querySnapshot) => { const items = querySnapshot.docs.map(doc => ({ id: doc.id, ...doc.data() })); setTodos(items); }); return () => unsubscribe(); // Listener'ı temizle }, []); const addTodo = async () => { if (newTodo.trim() === '') return; try { await addDoc(collection(db, "todos"), { text: newTodo, completed: false, createdAt: new Date() }); setNewTodo(''); } catch (e) { console.error("Görev eklenirken hata oluştu: ", e); } }; const toggleComplete = async (id, completed) => { const todoRef = doc(db, "todos", id); await updateDoc(todoRef, { completed: !completed }); }; const deleteTodo = async (id) => { const todoRef = doc(db, "todos", id); await deleteDoc(todoRef); }; return (

2026 Görev Listesi

setNewTodo(e.target.value)} placeholder="Yeni görev ekle" />
    {todos.map((todo) => (
  • {todo.text}
  • ))}
); } export default TodoList; ``` ### Örnek 2: Firebase Authentication (Kullanıcı Kaydı ve Girişi) **Problem:** Kullanıcıların e-posta ve parola ile uygulamaya kaydolması ve giriş yapması. **Çözüm:** Firebase Authentication servisini kullanacağız. ```javascript // src/components/Auth.js import React, { useState } from 'react'; import { auth } from '../firebase'; import { createUserWithEmailAndPassword, signInWithEmailAndPassword, signOut } from 'firebase/auth'; function Auth() { const [email, setEmail] = useState(''); const [password, setPassword] = useState(''); const [error, setError] = useState(''); const handleSignUp = async () => { try { await createUserWithEmailAndPassword(auth, email, password); console.log('Kullanıcı başarıyla kaydedildi!'); setError(''); } catch (e) { setError(e.message); console.error('Kayıt hatası:', e.message); } }; const handleSignIn = async () => { try { await signInWithEmailAndPassword(auth, email, password); console.log('Kullanıcı başarıyla giriş yaptı!'); setError(''); } catch (e) { setError(e.message); console.error('Giriş hatası:', e.message); } }; const handleSignOut = async () => { try { await signOut(auth); console.log('Kullanıcı çıkış yaptı!'); setError(''); } catch (e) { setError(e.message); console.error('Çıkış hatası:', e.message); } }; return (

Firebase Auth (2026)

setEmail(e.target.value)} /> setPassword(e.target.value)} /> {error &&

{error}

}
); } export default Auth; ``` ### Örnek 3: Cloud Storage (Resim Yükleme) **Problem:** Kullanıcıların profil resmi veya dosya yüklemesi. **Çözüm:** Firebase Cloud Storage kullanarak dosyaları depolayacağız. ```javascript // src/components/ImageUploader.js import React, { useState } from 'react'; import { storage } from '../firebase'; import { ref, uploadBytes, getDownloadURL } from 'firebase/storage'; function ImageUploader() { const [imageUpload, setImageUpload] = useState(null); const [imageUrl, setImageUrl] = useState(''); const [uploading, setUploading] = useState(false); const uploadImage = async () => { if (imageUpload == null) return; setUploading(true); const imageRef = ref(storage, `images/${imageUpload.name + Date.now()}`); try { const snapshot = await uploadBytes(imageRef, imageUpload); const url = await getDownloadURL(snapshot.ref); setImageUrl(url); console.log('Resim yüklendi:', url); } catch (e) { console.error('Resim yükleme hatası:', e); } finally { setUploading(false); } }; return (

Resim Yükleyici (2026)

setImageUpload(event.target.files[0])} /> {imageUrl && (

Yüklenen Resim:

Yüklenen Resim
)}
); } export default ImageUploader; ``` ### Örnek 4: Cloud Functions (HTTP Trigger ile API Oluşturma) **Problem:** Basit bir API endpoint'i oluşturmak ve sunucu tarafında bir işlem yapmak. **Çözüm:** Firebase Cloud Functions kullanarak sunucusuz bir HTTP fonksiyonu oluşturacağız. ```javascript // functions/index.js (Firebase Functions projenizin içinde) const functions = require('firebase-functions'); // HTTP isteği ile tetiklenen basit bir fonksiyon exports.helloWorld = functions.https.onRequest((request, response) => { functions.logger.info("Hello logs!", {structuredData: true}); response.send("Hello from Firebase Functions in 2026!"); }); // POST isteği ile tetiklenen ve veri işleyen bir fonksiyon exports.processData = functions.https.onRequest((request, response) => { if (request.method !== 'POST') { return response.status(405).send('Method Not Allowed'); } const data = request.body; functions.logger.info('Alınan veri:', data); response.status(200).json({ message: 'Veri başarıyla işlendi!', receivedData: data }); }); ``` Bu fonksiyonları dağıtmak için `functions` dizininizde `firebase deploy --only functions` komutunu çalıştırmanız gerekir. ## İleri Seviye Teknikler (2026 Senior Geliştiriciler İçin) Firebase'i sadece temel servisleriyle kullanmak yerine, projelerinizi daha ölçeklenebilir, güvenli ve performanslı hale getirmek için ileri seviye tekniklere ve tasarım desenlerine ihtiyacınız olacaktır. 2026 itibarıyla büyük ölçekli Firebase projelerinde edindiğim tecrübeler, bu tekniklerin kritik olduğunu göstermiştir. ### 1. Gelişmiş Firestore Veri Modelleme ve Denormalizasyon Firestore, NoSQL bir veritabanı olduğu için ilişkisel veritabanlarından farklı bir veri modelleme yaklaşımı gerektirir. Joins (birleştirmeler) olmadığı için, sorgu performansını artırmak adına verileri denormalize etmek yaygın bir **Firebase en iyi uygulamasıdır**. **Problem:** Kullanıcıların gönderilerini ve bu gönderilere ait yorum sayılarını hızlıca göstermek. **Çözüm:** Gönderi dokümanına `commentCount` alanını ekleyerek denormalizasyon yapın ve Cloud Functions ile bu sayacı güncelleyin. ```javascript // Firestore data structure example // posts/post123 { // title: "Harika Bir Gün", // content: "Bugün çok güzeldi...", // authorId: "userABC", // commentCount: 5, // Denormalize edilmiş sayaç // createdAt: Timestamp // } // comments/comment456 { // postId: "post123", // userId: "userXYZ", // text: "Çok güzel bir yazı!", // createdAt: Timestamp // } // functions/index.js (Cloud Function ile sayaç güncelleme) const functions = require('firebase-functions'); const admin = require('firebase-admin'); admin.initializeApp(); const db = admin.firestore(); exports.updateCommentCount = functions.firestore .document('comments/{commentId}') .onCreate(async (snap, context) => { const comment = snap.data(); const postId = comment.postId; const postRef = db.collection('posts').doc(postId); // Gönderi dokümanındaki commentCount'u atomik olarak artır await postRef.update({ commentCount: admin.firestore.FieldValue.increment(1) }); functions.logger.info(`Gönderi ${postId} için yorum sayısı artırıldı.`); return null; }); exports.decrementCommentCount = functions.firestore .document('comments/{commentId}') .onDelete(async (snap, context) => { const comment = snap.data(); const postId = comment.postId; const postRef = db.collection('posts').doc(postId); // Gönderi dokümanındaki commentCount'u atomik olarak azalt await postRef.update({ commentCount: admin.firestore.FieldValue.increment(-1) }); functions.logger.info(`Gönderi ${postId} için yorum sayısı azaltıldı.`); return null; }); ``` ### 2. Gelişmiş Firebase Security Rules Güvenlik kuralları, uygulamanızın kalbidir. Yetersiz kurallar veri sızıntılarına veya yetkisiz erişime yol açabilir. 2026'da güvenlik, her zamankinden daha kritik. **Problem:** Sadece gönderinin yazarı ve yöneticiler gönderiyi güncelleyebilsin. **Çözüm:** Rol tabanlı erişim kontrolü ve yazar kimliği doğrulaması. ```firestore // firestore.rules rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { // Helper function to check if user is authenticated function isAuthenticated() { return request.auth != null; } // Helper function to check if user is an admin (via custom claims) function isAdmin() { return isAuthenticated() && request.auth.token.admin == true; } match /users/{userId} { allow read: if isAuthenticated(); // Kullanıcı sadece kendi profilini güncelleyebilir allow update, delete: if request.auth.uid == userId; } match /posts/{postId} { // Herkes gönderileri okuyabilir allow read: if true; // Sadece giriş yapmış kullanıcılar yeni gönderi oluşturabilir allow create: if isAuthenticated(); // Sadece gönderinin yazarı veya adminler güncelleyebilir/silebilir allow update, delete: if request.auth.uid == resource.data.authorId || isAdmin(); } match /comments/{commentId} { allow read: if true; allow create: if isAuthenticated(); // Yorumu sadece yazarı güncelleyebilir/silebilir allow update, delete: if request.auth.uid == resource.data.userId || isAdmin(); } } } ``` > **PRO TIP:** Güvenlik kurallarınızı yerel Firebase Emulator Suite ile test etmeyi asla ihmal etmeyin. Bu, yanlış yapılandırmaları production'a göndermeden önce yakalamanın en iyi yoludur. ### 3. Cloud Functions ile Ortam Değişkenleri ve Bölgesel Dağıtım **Problem:** Fonksiyonların farklı ortamlar (geliştirme, test, üretim) için farklı yapılandırmalara sahip olması ve cold start sürelerini optimize etmek. **Çözüm:** Firebase Functions ortam değişkenlerini kullanın ve fonksiyonları kullanıcılarınıza coğrafi olarak yakın bölgelere dağıtın. ```javascript // functions/index.js const functions = require('firebase-functions'); // Ortam değişkenlerine erişim const mySecretKey = functions.config().myconfig.secret_key; const environment = process.env.NODE_ENV || 'development'; exports.myConfiguredFunction = functions .region('europe-west3') // Fonksiyonu Avrupa bölgesine dağıt .https.onRequest((request, response) => { functions.logger.info(`Ortam: ${environment}, Gizli Anahtar: ${mySecretKey ? 'Mevcut' : 'Yok'}`); response.send(`Merhaba! Bu fonksiyon ${environment} ortamında çalışıyor.`); }); // Ortam değişkenini ayarlamak için: // firebase functions:config:set myconfig.secret_key="YOUR_SECRET_KEY" // firebase functions:config:set myconfig.another_var="another_value" ``` `firebase deploy --only functions` ile dağıtım yaparken, fonksiyonlarınız belirtilen bölgelerde çalışacaktır. Bu, özellikle Avrupa'daki kullanıcılar için gecikmeyi azaltarak cold start sürelerini dolaylı olarak iyileştirebilir. ### 4. Custom Claims ile Kullanıcı Rolleri Yönetimi **Problem:** Uygulamanızda yönetici, editör gibi farklı kullanıcı rolleri tanımlamak ve bu rollere göre yetkilendirme yapmak. **Çözüm:** Firebase Authentication Custom Claims özelliğini kullanarak kullanıcılara özel roller atayın. ```javascript // functions/index.js const functions = require('firebase-functions'); const admin = require('firebase-admin'); admin.initializeApp(); // Bir kullanıcıyı yönetici yapmak için çağrılabilir fonksiyon exports.makeAdmin = functions.https.onCall(async (data, context) => { // Sadece yetkili kullanıcılar (örneğin, mevcut bir admin) bu fonksiyonu çağırabilir if (!context.auth || !context.auth.token.admin) { throw new functions.https.HttpsError( 'permission-denied', 'Sadece yöneticiler bu işlemi yapabilir.' ); } const uid = data.uid; if (!uid) { throw new functions.https.HttpsError('invalid-argument', 'UID gerekli.'); } await admin.auth().setCustomUserClaims(uid, { admin: true }); return { message: `Kullanıcı ${uid} artık bir yönetici.` }; }); ``` Frontend'den bu fonksiyonu çağırarak bir kullanıcıya yönetici rolü atayabilirsiniz. Daha sonra Firebase Security Rules içinde `request.auth.token.admin == true` kontrolü ile bu rolü doğrulayabilirsiniz. ## Best Practices & Anti-Patterns (2026 Geliştirme Standartları) Firebase projelerinde yüksek performans, güvenlik ve maliyet etkinliği sağlamak için 2026 itibarıyla kabul görmüş **Firebase en iyi uygulamaları** ve kaçınılması gereken anti-pattern'lar aşağıdadır. Ekibimizde edindiğimiz tecrübelerle, bu pratiklerin projelerinizin uzun vadeli başarısı için kritik olduğunu gördük. ### Veritabanı (Firestore / Realtime Database) * **✅ Doğru: Verileri Denormalize Edin.** NoSQL veritabanlarında `JOIN` işlemleri yoktur. Sorgu performansını artırmak için verileri sık sık denormalize ederek tek sorguyla ihtiyaç duyulan tüm bilgileri alın. Örneğin, bir gönderiyle ilgili yazar bilgilerini gönderi dokümanında saklayın. * **Neden Önemli:** Okuma performansını artırır ve Firestore'daki okuma maliyetlerini azaltır. Daha az sorgu, daha az gecikme demektir. * **❌ Yanlış: Aşırı Derin İç İçe Koleksiyonlar Kullanmak.** Firestore'da iç içe koleksiyonlar desteklense de, çok derin seviyelerde (4-5 seviye ve üzeri) gitmek veri yönetimi ve sorgulama karmaşıklığını artırır. * **Neden Önemli:** Veri modelinizi anlaşılmaz hale getirebilir ve güvenlik kurallarının yönetimini zorlaştırabilir. * **✅ Doğru: Etkili İndeksleme Kullanın.** Firestore, çoğu sorgu için otomatik indeksleme yapar ancak karmaşık sorgular (birden fazla `where` clause, `orderBy`) için bileşik indeksler (composite indexes) oluşturmanız gerekebilir. Firebase Console, eksik indeksler için uyarılar sunar. * **Neden Önemli:** İndeksler olmadan yapılan sorgular ya çalışmaz ya da aşırı yavaş ve maliyetli olur. Doğru indeksleme, sorgu performansını dramatik şekilde artırır. * **❌ Yanlış: Her şeyi Tek Bir Koleksiyonda Tutmak.** Uygulamanızdaki tüm verileri tek bir büyük koleksiyonda tutmaya çalışmak, sorguları yavaşlatır ve maliyetleri artırır. * **Neden Önemli:** Koleksiyonlar, verilerinizi mantıksal olarak ayırmak ve daha verimli sorgular yapmak için tasarlanmıştır. `Collection Group Queries` gibi özellikler, farklı koleksiyonlardaki benzer verileri sorgulamak için kullanılır. ### Güvenlik Kuralları (Security Rules) * **✅ Doğru: En Az Ayrıcalık Prensibini Uygulayın.** Kullanıcılara ve rollere sadece ihtiyaç duydukları minimum yetkileri verin. Varsayılan olarak her şeye izin vermek yerine, her erişimi açıkça tanımlayın. * **Neden Önemli:** Yetkisiz veri erişimini ve manipülasyonunu engeller. Veri sızıntılarının ve güvenlik açıklarının önüne geçer. * **❌ Yanlış: Tüm Veritabanını Okuma/Yazmaya Açık Bırakmak.** Özellikle geliştirme aşamasında sıkça yapılan bir hata olan `allow read, write: if true;` kuralı, uygulamanızı ciddi güvenlik risklerine maruz bırakır. * **Neden Önemli:** Bu kural, uygulamanızdaki tüm verilerin herkese açık olduğu anlamına gelir ve kötü niyetli kullanıcıların verilerinizi okumasına, değiştirmesine veya silmesine olanak tanır. * **✅ Doğru: Kuralları Detaylıca Test Edin.** Firebase Emulator Suite ile güvenlik kurallarınızı yerel ortamda kapsamlı bir şekilde test edin. Farklı kullanıcı rolleri ve senaryoları için testler yazın. * **Neden Önemli:** Production ortamına geçmeden önce güvenlik açıklarını tespit etmenizi sağlar. Güvenlik kuralları karmaşık olabilir ve manuel testler yetersiz kalabilir. ### Cloud Functions * **✅ Doğru: Fonksiyonları İdempotent Yapın.** Bir fonksiyonun birden fazla kez çalıştırılması durumunda bile aynı sonucu vermesini sağlayın. Örneğin, bir ödeme işleme fonksiyonu, aynı ödemenin iki kez işlenmesini engellemeli. * **Neden Önemli:** Bulut fonksiyonları bazen yeniden denenebilir (retryable) veya birden fazla kez tetiklenebilir. İdempotency, veri tutarsızlıklarını önler. * **❌ Yanlış: Cold Start'ı Göz Ardı Etmek.** Öz