Paylaşımlı hosting üzerinde SSH olmadan bir Laravel uygulamasını dağıtmanın mümkün olup olmadığını hiç merak ettiniz mi?
Cevap EVET. İlk freelance deneyimlerim sırasında, sıkı bir bütçeye sahip bir müşterinin Laravel web sitesinin ilk versiyonunu çevrimiçi görmesi gerektiği bir durumla karşılaştım. Hosting ortamında SSH, Composer, Artisan veya NPM yoktu.
Bu nedenle güvenli ve güvenilir bir alternatif bulmam gerekti.
Bu yazıda, Laravel uygulamalarını SSH erişimi olmadan paylaşımlı hosting üzerinde dağıtmak için kullandığım işlemleri paylaşacağım.
Paylaşımlı Hosting Üzerinde Laravel Dağıtımının Farklı Olmasının Nedenleri
Paylaşımlı Hosting Üzerinde Laravel Dağıtımının Farklı Olmasının Nedenleri
1. Proje Dosya Yapısı
1. Proje Dosya Yapısı
Tipik bir Laravel proje dosya yapısı şu şekildedir:
project/
├── app/
├── bootstrap/
├── config/
├── public/
├── storage/
├── vendor/
└── artisan
Ancak, paylaşımlı hosting genellikle sadece bir genel dizini açar:
├── public_html/
2. SSH Yok, Komut Yok
2. SSH Yok, Komut Yok
Eğer SSH erişimi olsaydı, açıkça şunlar yapılabilirdi:
- Composer bağımlılıkları yüklenemez
- Asset oluşturulamaz çünkü “npm run” çalışmaz
- Migration’lar çalıştırılamaz
- Önbellek temizleme veya optimizasyon yapılamaz
Durumu Adım Adım Nasıl Çözebiliriz
Durumu Adım Adım Nasıl Çözebiliriz
Adım 1: Uygulamanızı Yerel Olarak Hazırlayın
Adım 1: Uygulamanızı Yerel Olarak Hazırlayın
Öncelikle, geliştirme ortamımı etkilememek için Laravel projemin bir kopyasını üretim için hazır bir kopya olarak klonluyorum:
├── laravel_app/
├── laravel_app_prod/
laravel_app_prod klasörünün içine uygulamayı üretim için hazırlıyorum.
// önbellek temizleme
php artisan config:clear
php artisan cache:clear
php artisan route:clear
php artisan view:clear
// üretim bağımlılıklarını yükleme ve optimize etme
composer install --no-dev --optimize-autoloader
// ön uç varlıkları oluşturma
npm run build
Adım 2 — Proje Dosya Yapısını Yeniden Düzenleme
Adım 2 — Proje Dosya Yapısını Yeniden Düzenleme
Paylaşımlı hosting dosya yapısına uyacak şekilde, yalnızca public/ klasörünün içeriğini yeni public_html/ klasörüne taşıyorum:
public_html/
Adım 3 — index.php’de Laravel Yollarını Düzeltme
Adım 3 — index.php’de Laravel Yollarını Düzeltme
Şimdi, uygulamanın doğru bir şekilde çalışabilmesi için önemli bir adım atmalıyız; public/index.php dosyasındaki yolları güncelleyelim:
if (file_exists(
$maintenance = __DIR__ . '/../laravel_app_prod/storage/framework/maintenance.php'
)) {
require $maintenance;
}
require __DIR__ . '/../laravel_app_prod/vendor/autoload.php';
(require_once __DIR__ . '/../laravel_app_prod/bootstrap/app.php')
->handleRequest(Request::capture());
Bu kritik bir adım; hatalı yollar 500 hatasına neden olur.
Adım 4 — cPanel Üzerinden Veritabanını Ayarlama
Adım 4 — cPanel Üzerinden Veritabanını Ayarlama
cPanel’den:
- MySQL Database Wizard açın
- Bir veritabanı oluşturun
- Bir veritabanı kullanıcısı oluşturun
- Kullanıcıya TÜM AYRICALIKLARI atayın
Sonra, laravel_app_prod içindeki .env dosyasını güncelleyin:
APP_NAME=MyApp
APP_ENV=production
APP_DEBUG=false // çok önemli (güvenlik)
APP_URL=https://your-app-domain
DB_DATABASE=database_name
DB_USERNAME=database_user
DB_PASSWORD=database_password // (zaten kaydettiniz)
⚠️ Asla üretimde APP_DEBUG=true olarak ayarlamayın.
Adım 5 — Geçici Dağıtım Yolu (Token ile Korunaklı)
Adım 5 — Geçici Dağıtım Yolu (Token ile Korunaklı)
Önemli bir kısma geliyoruz, SSH yok, sorun değil. Artisan komutlarını geçici olarak korunaklı bir web yolu aracılığıyla çalıştırabiliriz.
⚠️ Bu yol dağıtımdan hemen sonra kaldırılmalıdır.
Dosyanıza bir gizli token ekleyin:
DEPLOY_TOKEN=verySecretRandomToken123
Yolu routes/web.php dosyasına ekleyin:
use Illuminate\Support\Facades\Artisan;
use Illuminate\Support\Facades\Route;
Route::get('/deploy/{token}', function ($token) {
abort_unless($token === env('DEPLOY_TOKEN'), 403);
// 1. Migration'ları çalıştır ve önbelleği temizle
Artisan::call('migrate', ['--force' => true]);
Artisan::call('optimize:clear');
// 2. Depolama Bağlantısını Düzelt (Özelleştirilmiş Düzeltme)
// 'public_html' klasörüne $_SERVER['DOCUMENT_ROOT'] ile işaret ediyoruz
$targetFolder = storage_path('app/public');
$linkFolder = $_SERVER['DOCUMENT_ROOT'] . '/storage';
if (!file_exists($linkFolder)) {
symlink($targetFolder, $linkFolder);
$storageStatus = 'Storage link created successfully.';
} else {
$storageStatus = 'Storage link already exists.';
}
return "Deployment completed.
" .
"Migrations run.
" .
"Cache cleared.
" .
$storageStatus;
});
Bu, yalnızca doğru token’e sahip olan birinin dağıtımı tetiklemesini sağlar.
Adım 6 — Dosyaları Sunucuya Yükleyin
Adım 6 — Dosyaları Sunucuya Yükleyin
cPanel Dosya Yöneticisi kullanarak:
laravel_app_prod/dosyasını zipleyinpublic/klasörünün içeriğini zipleyin- Yükleyin:
laravel_app_prod‘ı public_html dışına yerleştirin- Halka açık dosyaları public_html‘ın içine koyun
Sonra her iki dosyayı da çıkarın.
Neden laravel_app_prod‘ı public_html‘ın dışına koyduk?
Bu kritik bir güvenlik uygulamasıdır. Uygulama mantığınızı ve en önemlisi .env dosyanızı boş dizinin bir seviyesinin üstünde tutarak, tarayıcı aracılığıyla bunlara fiziksel olarak erişim sağlanamaz.
Sunucunuz yanlış yapılandırılır ve PHP dosyalarını metin olarak sunmaya başlarsa (bu sık olur!), kimlik bilgilerinizi gizli tutarak, bunlar herkesin erişimine kapalıdır.
Adım 7 — Kritik İzinleri Ayarlama
Adım 7 — Kritik İzinleri Ayarlama
Laravel, belirli klasörlere yazma erişimi gerektirir. Bu izinler ayarlanmazsa, günlükler yazılmaz ve oturumlar kaydedilmez.
- cPanel Dosya Yöneticisinde
laravel_app_prod/storageklasörüne gidin. - Sağ tıklayın → İzinleri Değiştir.
- 775 olarak ayarlayın (Kullanıcı: Oku/Yaz/Çalıştır, Grup: Oku/Yaz/Çalıştır, Dünya: Oku/Çalıştır).
- Aynı şeyi
laravel_app_prod/bootstrap/cacheiçin de yapın.
🛑 Not: Asla klasörleri 777 olarak ayarlamayın. Bu, paylaşımlı hosting üzerinde büyük bir güvenlik riski taşır.
Adım 8 — Migration’ları Çalıştır ve Dağıtım Yolunu Kaldır
Adım 8 — Migration’ları Çalıştır ve Dağıtım Yolunu Kaldır
Tarayıcıda açın:
https://your-domain.com/deploy/verySecretRandomToken123
Her şey doğruysa, şu mesajı görmelisiniz:
Deployment completed successfully
Hemen ardından:
❗ Dağıtım yolunu silin
❗ DEPLOY_TOKEN‘ı .env‘dan kaldırın
Bu güvenlik açısından kritiktir.
Karşılaşılan Yaygın Sorunlar
Karşılaşılan Yaygın Sorunlar
500 Dahili Sunucu Hatası
500 Dahili Sunucu Hatası
- index.php’deki yanlış dosya yolları
- Yanlış PHP sürümü (cPanel’deki MultiPHP Manager kullanın)
- Yanlış klasör izinleri (
storage 775,bootstrap/cache 775)
403 Yetkisiz
403 Yetkisiz
- Yol tokeni ile
DEPLOY_TOKENuyuşmuyor
Son Düşünceler
Son Düşünceler
Paylaşımlı hosting, Laravel için ideal değildir, ancak şunlar için hala oldukça yaygındır:
- Müşteri projeleri
- MVP’ler
- Bütçe kısıtlamalı dağıtımlar
Doğru hazırlık ve güvenli bir işlemle, Laravel uygulamaları SSH erişimi olmadan bile güvenilir bir şekilde çalışabilir.
💡 İpucu: Daha Güvenli Veritabanı Alternatifi
Web yolunda migration çalıştırmakta rahatsızsanız (bu güvenlik riskleri taşır), Export/Import yöntemini kullanabilirsiniz:
- Migration’ları lokal makinenizde çalıştırın.
- Yerel aracınızı kullanarak veritabanınızı
.sqldosyası olarak dışarı aktarın. - Sunucuda cPanel > phpMyAdmin gidin.
.sqldosyasını doğrudan içe aktarın.
Bu, üretim yollarında yürütülebilir mantık gerektirmediği için daha güvenlidir.
🔗 Bağlantıda Kalın
🔗 Bağlantıda Kalın
Laravel eğitimleri, geliştirme ipuçları, dağıtım işlemleri ve gerçek dünya üretim sorunlarının çözümü için beni takip edin.
Bu yazıyı faydalı buldunuz mu?
🙏 Destek vermek için alkışlayın 👏, abone olun 🔔, sosyal ağlarda paylaşın
Kaynak: Orijinal Makale
- Paylaşımlı Hosting Üzerinde Laravel Dağıtımının Farklı Olmasının Nedenleri
- Durumu Adım Adım Nasıl Çözebiliriz
- Adım 1: Uygulamanızı Yerel Olarak Hazırlayın
- Adım 2 — Proje Dosya Yapısını Yeniden Düzenleme
- Adım 3 — index.php’de Laravel Yollarını Düzeltme
- Adım 4 — cPanel Üzerinden Veritabanını Ayarlama
- Adım 5 — Geçici Dağıtım Yolu (Token ile Korunaklı)
- Adım 6 — Dosyaları Sunucuya Yükleyin
- Adım 7 — Kritik İzinleri Ayarlama
- Adım 8 — Migration’ları Çalıştır ve Dağıtım Yolunu Kaldır
- Karşılaşılan Yaygın Sorunlar
- Son Düşünceler
- 🔗 Bağlantıda Kalın


