Teknoloji

Laravel ve Node.js İçin Staging Ortamı Kurulumu: Veritabanı Senkronizasyonu, .env ve CI/CD

İçindekiler

Laravel ve Node.js Projelerinde Neden Staging Ortamı Şart Hale Geldi?

Laravel veya Node.js ile ciddi bir proje geliştiriyorsanız, geliştirme ortamından doğrudan canlıya deploy yapmak bir noktadan sonra kumar oynamakla aynı şey oluyor. Ekip büyüdükçe, feature sayısı arttıkça, veritabanı şeması sık sık değiştikçe ve özellikle ödeme, entegrasyon, kimlik doğrulama gibi kritik akışlar devreye girdikçe araya mutlaka tutarlı bir staging ortamı koymanız gerekiyor.

Biz DCHost tarafında onlarca Laravel, Node.js ve karma yapılarda aynı sorunu görüyoruz: Canlıya çıkan her küçük değişiklik, loglara ve destek taleplerine bakıldığında aslında staging ortamında yakalanabilecek türden hatalardan kaynaklanıyor. Bu yüzden geliştirme–test–canlı hattını mimari olarak doğru kurmak, sadece kod kalitesi değil, müşteri deneyimi ve gelir kaybı açısından da kritik. Bu hattın genel resmini görmek istiyorsanız, önce geliştirme, test ve canlı ortamlar için hosting mimarisi rehberimize göz atmanız faydalı olur.

Bu yazıda odağımız çok net: Laravel ve Node.js uygulamaları için staging ortamını doğru kurmak. Özellikle üç konuyu derinlemesine ele alacağız:

  • Canlı ve staging veritabanı arasındaki sağlıklı ve güvenli senkronizasyon stratejileri,
  • .env ve diğer ortam değişkenlerinin staging’e özel, güvenli şekilde yönetimi,
  • Git tabanlı CI/CD hatlarıyla staging ortamına otomatik deploy ve isteğe bağlı canlıya geçiş (blue-green benzeri yaklaşımlar dahil).

Hedefimiz, DCHost üzerinde kullandığınız VPS, dedicated veya colocation altyapınızda tekrarlanabilir, dokümante ve otomasyona uygun bir staging mimarisi kurabilmeniz.

Staging Ortamının Temel Mimarisi: Laravel ve Node.js Açısından Farklar

Önce mimariyi netleştirelim. Staging ortamı, canlıya mümkün olduğunca benzeyen ama risk alabileceğiniz, aynı zamanda SEO, güvenlik ve veri gizliliği açısından izole tutulmuş bir ortamdır.

Tek Sunucu mu Ayrı VPS mi?

DCHost’ta pratikte üç ana yaklaşım görüyoruz:

  • Aynı VPS/Dedicated üzerinde ayrı vhost + ayrı veritabanı: Küçük–orta ölçekli projelerde sık kullanılır. Maliyet düşük, yönetim kolaydır; ama kaynak paylaşımı ve güvenlik tarafında daha dikkatli olmanız gerekir.
  • Ayrı, küçük bir staging VPS’i: Canlı üretim VPS’iniz güçlü, staging ise daha düşük kaynaklı olabilir. İzolasyon ve güvenlik açısından daha temizdir, özellikle Laravel queue, Node.js worker, WebSocket gibi ek bileşenler varsa tavsiye edilir.
  • Kurumsal yapılar için ayrılmış staging cluster’ları: Çoklu mikroservis, ayrı veritabanı sunucusu, cache cluster’ı olan yapılarda staging de aynı şekilde katmanlı kurulur. Bu senaryoda genelde dedicated + DCHost colocation gibi karma mimariler devreye girer.

Laravel Staging Ortamının Tipik Bileşenleri

Laravel için staging ortamında genelde şu bileşenler bulunur:

  • Web sunucusu (Nginx veya Apache),
  • PHP-FPM havuzu (genellikle production’a yakın versiyon ve ayarlarla),
  • MySQL/MariaDB veya PostgreSQL veritabanı,
  • Queue ve cache için Redis veya Memcached,
  • İsteğe bağlı olarak Laravel Horizon, Scheduler (cron) ve ek arka plan işler.

Bu bileşenlerin staging’deki ayarlarının production’a mümkün olduğunca yakın olması, “sadece staging’de çalışan ama canlıda patlayan” veya tam tersi durumların önüne geçer. Detaylı PHP-FPM, OPcache ve queue optimizasyonları için Laravel prod ortam optimizasyonu rehberimizi referans alabilirsiniz; staging ile canlı arasındaki farkları oradaki ayarları baz alarak minimize etmek iyi bir stratejidir.

Node.js Staging Ortamının Tipik Bileşenleri

Node.js tarafında ise tablo biraz farklı:

  • Node.js runtime (genellikle LTS sürüm),
  • Uygulamayı ayakta tutan PM2 veya systemd servisleri,
  • Ön tarafta reverse proxy (Nginx),
  • Veritabanı (MySQL, PostgreSQL, MongoDB vb.),
  • Gerçek zamanlı ihtiyaç varsa WebSocket veya Socket.IO endpoint’leri.

Node.js’i staging ve production’da aynı kalıpla yönetmek için, Node.js’i canlıya alırken PM2, systemd ve Nginx ile nasıl yönetmeniz gerektiğini anlattığımız rehberdeki yapıların birebir staging’e uyarlanmasını öneriyoruz. Versiyon farkları, farklı build komutları, farklı Nginx kuralları staging/canlı arasında ne kadar az olursa, sürpriz o kadar az olur.

Veritabanı Senkronizasyonu: Canlı Veriyi Staging’e Taşırken Yapılması ve Yapılmaması Gerekenler

Laravel ve Node.js projelerinde staging ortamı kurmanın en kritik kısmı veritabanıdır. İki uç hata çok yaygındır:

  • Staging ve canlı aynı veritabanını kullanıyor: Bu, staging ortamını neredeyse anlamsız hale getirir ve canlı veriyi riske atar.
  • Staging veritabanı haftalarca güncellenmiyor: Bu sefer de staging’de çalışan her şey canlıda bambaşka davranabilir, çünkü veri yapısı (schema + data) eskimiştir.

Öncelik: Ayrı Veritabanı ve Ayrı Kullanıcı

Her şeyden önce staging için ayrı bir veritabanı ve ayrı bir veritabanı kullanıcısı tanımlamanız gerekir. Örneğin:

  • Canlı: project_prod, kullanıcı: project_prod_user
  • Staging: project_staging, kullanıcı: project_staging_user

Bu hem güvenlik hem de yanlışlıkla staging’den canlı veriyi silmeyi engellemek için temel bir önlemdir.

Senaryo Analizi: Ne Tür Senkronizasyona İhtiyacınız Var?

Veritabanı senkronizasyonu için tek bir doğru yok; senaryoya göre strateji değişir:

  • Fonksiyonel testler: Yeni özelliklerin gerçekçi veride nasıl davrandığını görmek istiyorsunuz. Burada canlı verinin anonimleştirilmiş ve zaman zaman staging’e aktarıldığı bir düzen gerekir.
  • Yıkıcı testler (delete, migration, büyük refactor): Veri kaybı yaşanabilir. Burada staging verisi tek yönlü olarak canlıdan çekilmeli, staging’den canlıya hiçbir zaman yazılmamalı.
  • Performans ve ölçek testleri: Büyük veri setleriyle, indeks ve sorgu optimizasyonu yapmak için canlıya mümkün olduğunca yakın hacimde veri gerekir.

MySQL/MariaDB ve PostgreSQL İçin Temel Senkronizasyon Yöntemi

En yaygın ve güvenli senaryo, canlıdan staging’e periyodik olarak tam yedek + geri yükleme yaklaşımıdır:

  1. Canlı veritabanından dump alın:
    • MySQL/MariaDB için: mysqldump --single-transaction project_prod > prod.sql
    • PostgreSQL için: pg_dump -Fc -d project_prod -f prod.dump
  2. Dump dosyasında anonimleştirme/maskeleme uygulayın (aşağıdaki başlıkta).
  3. Staging veritabanını drop + recreate veya truncate edip tekrar oluşturun.
  4. Maskelenmiş dump’ı staging veritabanına geri yükleyin.

MySQL tarafında yedek alma/geri yükleme için daha gelişmiş seçenekler ve Point-in-Time Recovery senaryoları için MySQL/MariaDB yedekleme stratejileri rehberimizden strateji seçebilirsiniz. Staging senkronizasyonu da aslında o yedekleme rutinlerinin kontrollü bir kullanım şekli.

Kişisel Veriler ve KVKK/GDPR: Maskeleme Zorunluluğu

Canlı veriyi staging’e taşırken, özellikle Avrupa veya Türkiye merkezli projelerde KVKK/GDPR gereği kişisel verileri maskelemek neredeyse zorunlu hale geliyor. Önerilen yaklaşım:

  • E-posta adresleri: [email protected] yerine [email protected] gibi dummy adresler üretin.
  • Telefon numaraları: Son birkaç haneyi sabit veya 0 ile değiştirin.
  • İsim, soyisim: Rastgele ama tutarlı isimler kullanın; anonimlaştırma kütüphaneleri iş görebilir.
  • TC kimlik no, adres vb.: Mümkünse staging’e hiç taşımayın; gerekiyorsa rastgeleleştirin.

Bu maskeleme işlemini SQL scriptleriyle veya ayrı bir “sanitize” aracıyla otomatikleştirip CI/CD hattına bağlayabilirsiniz. KVKK ve veri yerelleştirme yükümlülüklerini daha bütünsel görmek isterseniz, KVKK ve GDPR uyumlu hosting seçimi rehberimize de bakmanızı öneririz.

Laravel Özelinde: Migration ve Seeder Stratejisi

Laravel’de staging veritabanını yönetirken şu prensipler çok işinizi kolaylaştırır:

  • Tüm şema değişiklikleri migration üzerinden gitmeli: Staging’de manuel tablo/kolon eklemeyin. php artisan migrate staging ve canlıda aynı sonucu üretmeli.
  • Seed’leri ayırın: DatabaseSeeder içinde “sadece demo data” üreten kısmı ayrı bir seeder sınıfına taşıyın ve staging’de manuel çağırın. Canlıda sadece zorunlu sistem verilerini seed edin.
  • .env tabanlı kontrol: Bazı seed’lerin sadece APP_ENV=staging iken çalışmasını sağlayabilirsiniz.

Node.js Özelinde: ORM Migration Araçlarını Disiplinli Kullanmak

Node.js tarafında genellikle Sequelize, TypeORM, Prisma, Knex gibi ORM/migration araçları kullanılıyor. Burada da aynı prensip geçerli:

  • Tüm tablo/kolon değişiklikleri migration dosyaları üzerinden ilerlemeli.
  • Staging ve canlıda aynı migration komutu çalışmalı (örneğin npm run migrate).
  • Seed veya fixture datayı, ortam bazlı koşullarla sadece staging’de çalıştırmalısınız (örneğin NODE_ENV=staging kontrolü).

.env, Ortam Değişkenleri ve Secret Yönetimi: Staging ile Canlıyı Ayırmanın İncelikleri

Staging ortamı kurarken en sık yapılan hatalardan biri, canlıdaki .env dosyasını kopyalayıp birkaç satırını değiştirmek. Bu yaklaşım kısa vadede hızlı görünse de, orta vadede gerçek müşterilere staging’den mail atma veya test ödemesini gerçek POS’a düşürme gibi tatsız senaryolara yol açıyor.

.env Kopyalama Hataları: En Riskli Alanlar

Canlı .env dosyasını staging’e kopyalarken özellikle şu alanları asla birebir taşımayın:

  • Mail ayarları: SMTP host, kullanıcı adı, şifre, gönderici adresi. Staging için ayrı bir test kutusu kullanın veya mail’i tamamen devre dışı bırakın.
  • Ödeme altyapısı: API key, secret, webhook URL’leri. Staging’de mutlaka sandbox/TEST ortam anahtarlarını kullanın.
  • 3. parti entegrasyonlar: SMS servisleri, CRM, ERP, muhasebe yazılımları, kargo entegrasyonları vb. için staging hesabı kullanın.
  • Log ve hata izleme: Sentry, Rollbar vb. araçlarda staging’i ayrı bir proje olarak tanımlayın; production ile logları karıştırmayın.

Staging İçin Örnek Laravel .env Yapısı

Laravel tarafında staging için tipik bir yapı şöyle olabilir:

  • APP_ENV=staging
  • APP_DEBUG=true (ama herkese açık hata sayfaları yerine, loglamayı zenginleştirip kullanıcıya genel bir hata gösterin)
  • APP_URL=https://staging.example.com
  • DB_DATABASE=project_staging
  • MAIL_* değişkenleri staging’e özel test sunucusuna işaret etmeli
  • PAYMENT_* değişkenleri sandbox ortamı kullanmalı

Debug’u tamamen açmak yerine, üretimdekine benzer ama daha konuşkan bir log seviyesi belirlemek genelde daha sağlıklı. Böylece staging’de görülen hata mesajları loglarda detaylı, kullanıcı tarafında ise sade kalır.

VPS Üzerinde Güvenli Secret Yönetimi

.env dosyalarını Git deposuna hiç koymamak, staging ve production için ayrı .env dosyalarını sadece sunucuda saklamak artık endüstri standardı. VPS tarafında gizli anahtarların güvenli yönetimi için:

  • .env dosyalarını sadece uygulama kullanıcısının okuyabileceği izinlerle saklayın.
  • CI/CD hattınızda SSH key ve production secret’larını CI gizli değişkenleri (secret store) içinde tutun.
  • Mümkünse .env yerine systemd unit veya container ortam değişkenleri kullanarak merkezi bir secrets yönetimi kurun.

Bu konuda daha derin ve uygulamalı bir rehbere ihtiyacınız varsa, VPS’te .env ve gizli anahtar yönetimi yazımız staging/canlı ayrımını güvenli kurmanız için iyi bir referans noktasıdır.

Laravel İçin Adım Adım Staging Ortamı Kurulumu

Şimdi teoriyi pratiğe çevirelim ve tipik bir DCHost VPS üzerinde Laravel staging ortamını adım adım kuralım.

1. Domain, DNS ve SSL Kurulumu

  • Staging için genellikle staging.example.com gibi bir alt alan adı kullanın.
  • DNS kaydını staging sunucusuna (veya aynı sunucuysa ilgili IP’ye) yönlendirin.
  • Let’s Encrypt veya kurumsal SSL sertifikası ile HTTPS’i staging’de de zorunlu hale getirin.
  • Staging alan adını mutlaka noindex etiketleriyle ve/veya parola korumasıyla arama motorlarından izole edin. Bunun için staging ve test ortamları için noindex, parola ve IP kısıtlama stratejileri rehberimizdeki örnekleri uygulayabilirsiniz.

2. Ayrı Veritabanı ve Kullanıcı Oluşturma

MySQL/MariaDB için basitçe:

  • Yeni bir veritabanı oluşturun: project_staging
  • Sadece bu veritabanına yetkili yeni bir kullanıcı tanımlayın.
  • Gerekirse IP kısıtlamalarıyla sadece staging sunucusundan bağlantıya izin verin.

3. Uygulama Kodunu Çekmek

Staging için genellikle develop veya staging dalı kullanılır:

  • Sunucuda uygulama kullanıcısına geçin.
  • Git deposunu /var/www/project-staging gibi bir dizine klonlayın.
  • İlgili dalı (git checkout staging gibi) çekin.

4. Bağımlılıkların Kurulumu

Production’a yakın bir staging için:

  • composer install --no-dev --optimize-autoloader
  • Ön yüz derlemesi varsa: npm ci ardından npm run build

Burada hedef, staging’de de canlıya mümkün olduğunca benzeyen build çıktıları üretmek.

5. .env.staging Oluşturma ve Laravel Ayarları

Canlı .env dosyasını referans alıp, staging için .env.staging hazırlayın ve staging sunucusunda .env adıyla kaydedin. Ardından:

  • php artisan key:generate
  • php artisan config:clear ve php artisan config:cache
  • php artisan route:cache ve gerekiyorsa php artisan view:cache

Staging’de debug seviyesini daha yüksek ama kullanıcıya yansımayacak şekilde ayarlamak, log analizi için büyük rahatlık sağlar.

6. Migration, Seeder ve Storage Ayarları

  • php artisan migrate --force (CI/CD üzerinden otomatik tetiklenecek şekilde de kurabilirsiniz).
  • Gerekiyorsa staging’e özel seed’leri manuel çalıştırın.
  • php artisan storage:link ile dosya linklerini oluşturun.
  • Storage ve cache dizinlerinin izinlerini doğru ayarlayın.

7. Queue, Scheduler ve Horizon

Laravel projelerinde staging ortamında da queue ve scheduler’ı mümkün olduğunca production’a benzer çalıştırmak iyi bir pratiktir:

  • Supervisor veya systemd ile php artisan queue:work süreçlerini staging’de de ayağa kaldırın.
  • Cron ile php artisan schedule:run tetikleyin.
  • Horizon kullanıyorsanız, dashboard erişimini IP veya parola ile sınırlayın.

Queue ve Horizon’un VPS kaynak kullanımı üzerindeki etkisini anlamak için, Laravel Horizon ve queue işleri için VPS kaynak planlama rehberimiz staging ve canlı kaynaklarını hesaplarken elinizi güçlendirecektir.

Node.js İçin Adım Adım Staging Ortamı Kurulumu

Node.js tarafında da benzer mantığı takip ediyoruz, fakat runtime ve process yönetimi farklı olduğu için adımlar biraz değişiyor.

1. Node.js Runtime ve Kullanıcı Yapısı

  • Sunucuda LTS sürüm bir Node.js kurun (nvm veya paket yöneticisiyle).
  • Uygulama için ayrı bir sistem kullanıcısı (örneğin nodeapp) oluşturun.
  • Staging kodlarını bu kullanıcının home veya proje dizininde tutun.

2. Kodun Çekilmesi ve Bağımlılıkların Kurulumu

  • Git deposunu /var/www/node-staging gibi bir dizine klonlayın.
  • git checkout staging veya ilgili dalı seçin.
  • npm ci --only=production ile sadece production bağımlılıklarını kurun (staging’i de production’a çok yakın tutmak için).

3. .env.staging ve Konfigürasyon

Laravel’de olduğu gibi, Node.js tarafında da staging’e özel bir .env kullanın:

  • NODE_ENV=staging (bazı framework’ler sadece production ve development tanır; yine de staging için ayrı env değişkenleri ekleyebilirsiniz).
  • Veritabanı, cache, mail, ödeme ve entegrasyon ayarlarının staging’e özel olduğundan emin olun.
  • Staging URL’lerini (Örn. API base URL, frontend URL) net şekilde ayırın.

4. PM2 veya systemd ile Süreç Yönetimi

Node.js uygulamasını staging’de ayağa kaldırmak için:

  • PM2 kullanıyorsanız ecosystem.config.js içinde staging ortamı tanımı yapın.
  • systemd kullanıyorsanız, ayrı bir service dosyasıyla (örneğin nodeapp-staging.service) staging portunu ve çalışma dizinini belirtin.
  • Logları staging için ayrı bir dizinde veya ayrı bir log index’inde tutun.

PM2/systemd, Nginx ve sıfır kesinti deploy mimarisi için adım adım örnek kurulum istiyorsanız, Node.js’i canlıya alırken panik yapma rehberimizde anlatılan üretim kalıbını staging’e birebir uygulayabilirsiniz.

5. Nginx Reverse Proxy ve SSL

Laravel’de olduğu gibi, Node.js staging ortamında da:

  • Nginx’te staging.example.com için ayrı bir server bloğu oluşturun.
  • Upstream olarak Node.js uygulamanızın portunu işaret edin.
  • Let’s Encrypt sertifikası ve HTTPS > HTTP yönlendirmelerini staging için de kurun.
  • Gerekirse HTTP basic auth veya IP kısıtlamasıyla staging’i dış dünyaya kapatın.

CI/CD ile Laravel ve Node.js Staging Ortamını Otomatikleştirmek

Staging ortamını bir kere kurmak yeterli değil; asıl değer, her commit’te veya belirli dallara push ettiğinizde otomatik güncellenmesi ile ortaya çıkıyor. Burada devreye CI/CD hatları giriyor.

Branch Stratejisi ve Deploy Tetikleyicileri

Laravel ve Node.js projelerinde sık gördüğümüz basit ama etkili akış şöyle:

  • feature/* dalları: Geliştiriciye özel; PR açılınca CI testleri çalışır.
  • develop veya staging dalı: Bu dala merge edildiğinde staging ortamına otomatik deploy.
  • main/master: Tag veya belirli koşullarda production’a deploy.

Böylece staging ortamı, canlıya çıkmadan önce tüm feature’ların toplandığı ve müşteri/ürün ekibi tarafından da test edildiği bir ara durak haline gelir.

Pipeline Aşamaları: Build, Test, Deploy

Basitleştirilmiş bir CI pipeline’ı şu adımlardan oluşabilir:

  1. Build:
    • Laravel için: composer install, npm ci, npm run build
    • Node.js için: npm ci, npm test (varsa), npm run build
  2. Test:
    • Unit test, integration test, lint işlemleri.
    • Başarısız olursa deploy aşaması hiç çalışmaz.
  3. Deploy:
    • SSH ile staging sunucusuna bağlanma,
    • Kodu git pull veya rsync ile güncelleme,
    • Migration, cache, build komutlarını çalıştırma,
    • Laravel için queue worker’ları, Node.js için PM2/systemd süreçlerini reload/restart etme.

Bu mantığı Git tabanlı tüm CI sistemlerinde kurabilirsiniz. Özellikle GitHub kullanıyorsanız, GitHub Actions ile VPS’e otomatik deploy ve zero‑downtime yayın rehberimizde örnek workflow dosyaları ve rsync + sembolik sürüm stratejilerini detaylı anlattık. Oradaki örnekleri Laravel ve Node.js staging ortamınıza direkt uyarlayabilirsiniz.

Zero-Downtime ve Blue-Green Yaklaşımları

Staging ortamında bile sıfır kesinti hedeflemek, canlıya geçiş mimarisini de çok kolaylaştırır. Örneğin:

  • Blue-Green: Aynı sunucuda iki farklı dizinde (blue/green) uygulamayı tutup, Nginx’teki symlink’i değiştirerek hızlı switch yapmak.
  • Canary: Trafiğin küçük bir yüzdesini yeni sürüme yönlendirmek, sorun yoksa yavaş yavaş artırmak.

Laravel tarafında bu yaklaşımların canlı WooCommerce ve Laravel projelerinde nasıl kullanıldığını görmek isterseniz, blue-green deployment ile Laravel uygulamalarını sıfır kesintiyle güncelleme rehberimizde uygulamalı örnekler bulabilirsiniz. Aynı prensipleri Node.js tarafında da birebir uygulamak mümkün.

Staging Ortamında Güvenlik, Performans ve SEO Detayları

Staging ortamı çoğu zaman “nasıl olsa test sistemi” diye biraz salınan bir alan oluyor; fakat yanlış yapılandırılmış bir staging, hem güvenlik hem SEO hem de performans tarafında başınızı ağrıtabilir.

Güvenlik: Staging de Üretim Kadar Ciddi Olmalı

  • Staging alan adını mutlaka parola veya IP kısıtlaması ile koruyun.
  • Admin panel ve API endpoint’lerinde canlıdaki WAF/Rate limiting kurallarının benzerini kullanın.
  • Veritabanı erişimlerini IP veya private network ile sınırlayın.
  • Hassas verileri staging’e maskelemeden taşımayın.

SEO: Staging’in Arama Motorlarına Sızmasını Engellemek

  • <meta name="robots" content="noindex, nofollow" /> kullanın.
  • robots.txt içinde staging alan adını engelleyin.
  • Sitemap üretimini staging’de devre dışı bırakın veya ayrı bir path’e alın.
  • Staging URL’lerinin production URL’lerine canonical vermemesine dikkat edin.

Bu konuyu daha operasyonel seviyede görmek için, tekrar staging ve test ortamları için noindex ve parola koruma yazımızdaki .htaccess/Nginx örneklerine bakabilirsiniz.

Performans: “Nasıl Olsa Test” Demeyin

Staging ortamı canlı kadar güçlü olmak zorunda değil, ama performans karakteristiği benzer olmalı:

  • PHP-FPM, Node.js worker, veritabanı ve cache için benzer sürüm ve benzer konfig kullanın.
  • Yük testlerini staging’de yaparken CPU, RAM, I/O ve veritabanı metriklerini canlıdakiyle kıyaslayın.
  • CDN, cache ve HTTP/2/3 gibi optimizasyonları staging’de de aktif tutun; canlıya geçerken sürpriz yaşamayın.

DCHost Üzerinde Örnek Staging Mimarileri

DCHost altyapısında Laravel ve Node.js projeleri için sık kullandığımız iki temel staging senaryosunu özetleyelim.

Senaryo 1: Tek VPS’te Canlı + Staging (Küçük/Orta Projeler)

  • 1 adet NVMe VPS (örneğin 2–4 vCPU, 4–8 GB RAM)
  • İki ayrı vhost: example.com (canlı) ve staging.example.com
  • İki ayrı veritabanı ve kullanıcı.
  • Laravel ve/veya Node.js için ayrı process/pool tanımları.
  • CDN ve e-posta gibi entegrasyonlar canlı/staging olarak ayrı anahtarlarla yönetilir.

Maliyet avantajlıdır ve tek sunucu yönetimi isteyen ekipler için idealdir. Kaynak planlaması yaparken canlı trafiğin tepe noktalarını ve staging’de yapılacak yük testlerini birlikte hesaplamak gerekir.

Senaryo 2: Ayrı VPS’te Staging (Büyüyen ve Kritik Projeler)

  • 1 adet production VPS veya dedicated sunucu,
  • 1 adet daha küçük kaynaklı staging VPS,
  • Veritabanı ya her VPS’te ayrı, ya da paylaşılan ama ayrı instance olarak kurulmuş olabilir.
  • CI/CD hattı staging ve production için ayrı deploy job’ları çalıştırır.

Bu mimari, özellikle e-ticaret, SaaS veya yüksek trafikli Node.js API’lerinde canlı kaynağını staging testlerinden tamamen yalıtmak için idealdir. Trafik patlamaları, kampanya dönemleri veya büyük schema değişiklikleri öncesinde staging’e ekstra kaynak geçici olarak tanımlayıp test yapmak da çok kolaylaşır.

Özet ve Sonraki Adımlar

Laravel ve Node.js projelerinde staging ortamı kurmak, ilk bakışta “ekstra iş” gibi görünse de, doğru kurgulandığında aslında canlı ortamı sakinleştiren ve geliştirici ekibin özgüvenini artıran bir güvenlik katmanı haline geliyor. Ayrı veritabanı, tutarlı migration/seed stratejisi, dikkatle hazırlanmış .env dosyaları ve otomatik çalışan CI/CD hatları sayesinde “canlıya çıkarken tedirgin olmak” yerini, ölçülebilir ve tekrarlanabilir bir süreç deneyimine bırakıyor.

DCHost olarak amacımız, Laravel ve Node.js projelerinizi sadece barındırmak değil; geliştirme–staging–canlı hattınızı birlikte tasarlayarak operasyonel yükünüzü azaltmak. Staging ortamınızı kurarken:

  • Önce mimariyi ve veri senkronizasyon stratejinizi kâğıt üzerinde netleştirin.
  • Sonra .env ve secret yönetimini güvenli hale getirin.
  • Son olarak da Git tabanlı CI/CD hattıyla staging ve production deploy’larını otomatikleştirin.

Eğer mevcut Laravel veya Node.js projeniz için DCHost üzerinde staging ortamı kurgulamak istiyorsanız, altyapınızı ve kod tabanınızı birlikte inceleyerek size özel bir yol haritası çıkarabiliriz. İsterseniz önce yukarıda link verdiğimiz rehberleri okuyup kendi taslağınızı oluşturun, ardından destek ekibimizle beraber bunu DCHost VPS, dedicated veya colocation altyapınız üzerinde adım adım hayata geçirelim.

Sıkça Sorulan Sorular

Bu tamamen proje tipinize ve veri değişim hızınıza bağlı, ancak çoğu Laravel ve Node.js projesinde haftalık veya iki haftada bir tam senkronizasyon yeterli oluyor. Çok hareketli e‑ticaret ve yoğun SaaS uygulamalarında, büyük schema değişiklikleri veya performans testleri öncesinde ek bir senkronizasyon yapmak mantıklı. Önemli nokta, senkronizasyonun daima canlıdan staging’e tek yönlü olması ve kişisel verilerin KVKK/GDPR gereği maskeleme işleminden geçmesi. Ayrıca staging veritabanına manuel müdahaleleri en aza indirip tüm değişiklikleri migration’lar üzerinden yapmak, staging ile canlı arasında sürpriz farkların oluşmasını engeller.

Canlı .env dosyasını staging’e aynen kopyalamak, özellikle mail, ödeme ve üçüncü parti entegrasyonlar açısından ciddi riskler doğurur. Örneğin staging ortamında yaptığınız test siparişleri gerçek POS’a gidebilir, test amaçlı gönderdiğiniz mailler gerçek müşterilere ulaşabilir veya CRM/ERP sistemlerini hatalı test verisiyle doldurabilirsiniz. Bunun yerine staging için ayrı veritabanı, ayrı SMTP hesabı, ödeme sağlayıcıların sandbox anahtarları ve mümkünse ayrı log/hata izleme projeleri tanımlamak gerekir. Ayrıca APP_ENV/NODE_ENV gibi ortam değişkenleriyle staging’i kod içinde de ayırt ederek, sadece staging’e özgü davranışlar ve güvenlik önlemleri ekleyebilirsiniz.

Aslında temel adımları doğru kurguladığınızda zor değil. Önce Git deposunda branch stratejinizi belirleyin; genellikle develop veya staging dalına yapılan merge’ler staging deploy’unu tetikler. Ardından CI tarafında üç aşamalı bir pipeline tasarlayın: build (composer/npm install, asset build), test (unit/integration test ve lint), deploy (SSH veya rsync ile sunucuya geçiş, migration, cache ve servis restart). SSH anahtarlarını ve .env’de yer alan gizli bilgileri CI tarafında güvenli secret değişkenleri olarak saklamanız önemli. GitHub kullanıyorsanız, DCHost blogdaki GitHub Actions ile VPS’e otomatik deploy rehberindeki hazır workflow örneklerini Laravel ve Node.js projelerinize uyarlayarak başlamanız süreci oldukça hızlandırır.

Küçük ve orta ölçekli projelerde maliyet avantajı nedeniyle aynı VPS üzerinde ayrı vhost + ayrı veritabanı ile staging kurmak genellikle yeterli. Ancak yüksek trafikli e‑ticaret siteleri, kritik API’ler veya çok sayıda arka plan işi (Laravel queue, Node.js worker) olan yapılarda staging’i ayrı bir VPS’e taşımak daha sağlıklı. Böylece staging’de yaptığınız yük testleri, ağır migration’lar veya hatalı kod dağıtımları canlı trafiği doğrudan etkilemez. DCHost tarafında sık uyguladığımız model, production için daha güçlü bir VPS veya dedicated, staging için ise daha düşük kaynaklı ama mimarisi benzer ayrı bir VPS kullanmak ve CI/CD hattıyla ikisini de yönetmek.

Öncelikle staging alan adında daima HTTPS kullanın ve ardından iki katmanlı bir koruma uygulayın. Birincisi, HTML’de meta robots etiketini noindex, nofollow olacak şekilde ayarlayın ve robots.txt içinde taramayı engelleyin. İkincisi, mümkünse HTTP basic auth veya IP kısıtlaması ile staging’i sadece ekibin erişebileceği şekilde sınırlandırın. Böylece hem rastgele ziyaretçileri hem de arama motoru botlarını uzak tutarsınız. DCHost blogda yer alan “Staging ve test ortamları için noindex, parola ve IP kısıtlama stratejileri” rehberindeki Nginx ve .htaccess örnekleri, bu ayarları birkaç dakikada hayata geçirmenize yardımcı olur.