Paylaşımlı Hosting ve Render Üzerinde Full-Stack Bir LMS Yayına Almak

Bir VPS kullanmadan, prodüksiyon aşamasında bir Node.js, React ve PostgreSQL uygulaması yayına aldık.

G3HUB için tam kapsamlı bir Öğrenme Yönetim Sistemi (LMS) inşa ettik. Teknoloji yığını şunları içeriyordu: • Frontend: React 18, Vite ve TailwindCSS • Backend: Node.js 20 ve Express 5 • Database: Supabase aracılığıyla PostgreSQL 15 • ORM: Drizzle ORM

Bulut tabanlı bir sanal makinemiz (VM) veya VPS'imiz yoktu. Sadece halihazırda bir WordPress sitesi çalıştıran bir cPanel paylaşımlı hosting hesabımız vardı. İşte bunu nasıl başardığımız:

Altyapı Ayrımı Node.js ve PostgreSQL'i aynı sunucuda çalıştıramadık. Uygulamayı üç farklı servise böldük: • Frontend: cPanel paylaşımlı hosting (Statik dosyalar) • API: Render (Ücretsiz katman) • Database: Supabase (Ücretsiz katman)

En Büyük Engeller

1. Veritabanı Engeli Node.js API'sini doğrudan cPanel üzerinde çalıştırmayı denedik. Hemen hata verdi. Paylaşımlı hosting sağlayıcıları genellikle 5432 portu üzerinden dışa giden bağlantıları engeller. Bu, uygulamanızın harici bir veritabanıyla iletişim kuramayacağı anlamına gelir. Bunu çözmek için API'yi Render'a taşıdık.

2. Monorepo Sıkıntısı Kod tabanımızda pnpm workspaces kullanıyorduk. Render'a gönderdiğimizde (push), Render yerel workspace bağımlılıklarımızı tanımadığı için derleme (build) başarısız oldu. Çözüm: Her şeyi tek bir 6.4MB'lık dosyada paketlemek için esbuild kullandık. Karmaşık package.json dosyasını, yalnızca harici bağımlılıkları içeren minimal bir sürümle değiştirdik.

3. CORS ve Proxy Savaşı API çağrılarını alanımızdan (domain) Render'a yönlendirmek için Apache mod_proxy kullanmayı denedik. Zaman aşımına uğradı (timeout). Paylaşımlı hostingler genellikle bu modülü kısıtlar. Çözüm: Bir PHP cURL proxy kullandık. Frontend ve PHP betiği aynı domain üzerinde çalıştığı için tüm CORS sorunlarından kaçınmış olduk. PHP betiği, istekleri sessizce Render'a yönlendiriyor.

Dağıtım İpuçları • Git Bash yerine PowerShell kullanarak derleme yapın. Windows, Git Bash'te ortam değişkenlerini (environment variables) farklı işler. • Özel karakter içermeyen bir veritabanı şifresi kullanın. @ veya ! gibi karakterler URL kodlaması gerektirir ve bağlantı hatalarına neden olur. • UptimeRobot kullanın. Render'ın ücretsiz katmanı 15 dakika sonra uyku moduna geçer. Uygulamayı uyanık tutmak için health check uç noktanıza (endpoint) bir ping ayarlayın.

Toplam Altyapı Maliyeti: 0 $/ay.

Bütçeniz varsa bir VPS kullanın. Bu, tüm bu engelleri ortadan kaldırır. Ancak bütçeniz sıfırsa, yaratıcı yönlendirmeler (routing) prodüksiyona hazır uygulamaları mümkün kılar.

Kaynak: https://dev.to/oyohedmond/deploying-a-full-stack-lms-on-shared-hosting-render-free-the-hard-way-4ke0