Golden Net Emlak
Multi-tenant SaaS emlak yönetim platformu. Express + PostgreSQL backend, Next.js 16 vitrin sitesi ve ayrı bir super admin dashboard'undan oluşan üç katmanlı mimari. Supabase + Render + Vercel free tier'larında canlı demo.
Proje Hakkında
Golden Net, emlak firmalarının kendi vitrin sitelerini ve admin panellerini tek bir backend üzerinden çalıştırabildiği multi-tenant SaaS platformudur. Her firma (tenant) için ayrı bir subdomain, ayrı admin kullanıcıları ve izole veri saklama sağlanır. Sistem üç ayrı uygulamadan oluşur: vitrin + tenant admin panelini barındıran Next.js frontend, tüm tenant'ları yöneten ayrı Next.js super-admin dashboard'u ve her iki uygulamaya hizmet veren Express + PostgreSQL backend. Tenant izolasyonu hem application-level (X-Tenant-Id header + middleware) hem de database-level (her sorguda tenant_id filtresi) olarak iki katmanda uygulanır. Demo Supabase + Render + Vercel ücretsiz katmanlarında çalışır, kredi kartı gerektirmez.
Zorluklar
En büyük zorluk, multi-tenant'lı bir SaaS'ı kredi kartı gerektirmeyen ücretsiz servislerle production-grade biçimde yayına almaktı. Render free tier ephemeral filesystem kullandığı için multer ile yapılan lokal disk yüklemeleri her restart'ta siliniyordu. Vercel'in middleware/auth bypass advisory'leri eski Next.js 15 build'lerini bloklamaktaydı. Ayrıca Render'da NODE_ENV=production set edildiğinde npm install devDependencies'i atladığı için @types/node bulunamıyor ve tsc build sırasında 'Cannot find name process/console/Buffer' hatalarıyla patlıyordu. Multi-tenant tarafında ise X-Tenant-Id header eksik olduğunda backend host'tan tenant çıkarmaya çalışıyor ve 'golden-net-backend.onrender.com'u tenant subdomain'i sanıp 404 dönüyordu.
Çözümler
Multer'ın disk storage'ı memoryStorage + @supabase/supabase-js ile değiştirilerek yüklenen görseller Supabase Storage'a aktarıldı; lokal disk yalnızca SUPABASE_URL yokken devre dışı kaldı. Next.js 16.2.9'a major bump yapılarak Vercel güvenlik kapısı geçildi. Build için gerekli @types/* paketleri ve typescript dependencies'e taşınarak NODE_ENV=production altında bile yüklenir hâle getirildi. Tenant detection middleware'ine PaaS host suffix'leri (.onrender.com / .vercel.app / .fly.dev) için skip mantığı ve DEFAULT_TENANT_SUBDOMAIN env-var fallback'i eklendi. Postgres connection string Supabase pooler'a SSL ile bağlanacak şekilde refactor edildi. CORS regex tabanlı whitelist ile *.vercel.app ve custom domain destekledi.
Sonuçlar
Platform Supabase Postgres + Storage, Render web service ve iki Vercel projesi üzerinde toplam 0 ₺ aylık maliyetle canlıya alındı. Custom domain (goldennet.atmacamustafa.site) Hostinger DNS üzerinden Vercel'e bağlandı, SSL Let's Encrypt ile otomatik üretildi. UptimeRobot her 5 dakikada bir backend'i ping atarak Render servisinin uyumasını engelliyor. Demo seed verisi (1 super admin + 1 demo tenant + 6 emlak ilanı + 3 blog yazısı) idempotent SQL ile yüklendi. Süper admin ve tenant admin login'leri, ilan/blog CRUD akışları, Supabase Storage'a görsel yükleme ve multi-tenant izolasyon end-to-end test edildi.
Ekran örüntüleri

Ana Sayfa
Vitrin ana sayfası — hero arama formu ve istatistik kartları

İlan Listesi
Sol panelde tip/durum/fiyat filtreleri, sağda kart görünümlü ilan grid'i

İlan Detay
Galeri, fiyat, lokasyon ve danışman iletişim kartı

Tenant Admin Paneli
Yönetim paneli ana sayfası — hızlı eylem kartları ve istatistik özeti (toplam ilan, ortalama fiyat, blog sayısı)

Tenant Admin – Analitik
Son eklenen ilanlar, en çok görüntülenenler, emlak tipi dağılımı ve satılık/kiralık donut grafiği

Super Admin Dashboard
Tüm tenant'ları listeleyen merkezi panel — sağlık skoru, plan ve property sayıları

Yeni Tenant Oluştur
Super admin'in subdomain + admin kullanıcı + plan seçimiyle multi-tenant kayıt formu
Projeyi Canli Olarak Goruntule
Bu projeyi gercek ortamda deneyimlemek icin canli siteyi ziyaret edin.
Canlı Siteyi Ziyaret Et