Cara Deploy Laravel ke Shared Hosting Tanpa VPS dan Tanpa SSH (untuk Demo Cepat)

Artikel ini merangkum pengalaman saya upload aplikasi Laravel ke shared hosting untuk keperluan demo. Tujuannya bukan production-ready, tapi cepat online dulu. Semoga membantu siapa saja yang punya kebutuhan serupa.


Struktur Folder di Hosting

Karena tujuannya demo dan mau cepat, saya pakai Opsi Taruh Semua di public_html — semua file Laravel termasuk folder public/ di-upload ke dalam domain/subdomain folder di hosting.

Struktur akhirnya jadi seperti ini:

/home/username/demo.domain.web.id/
├── app/
├── bootstrap/
├── config/
├── database/
├── resources/
├── routes/
├── storage/
├── vendor/
├── .env
└── public/          ← ini yang jadi web root
    ├── index.php
    ├── .htaccess
    └── storage_link.php  (sementara)

Lalu di panel hosting (cPanel/DirectAdmin), set web root domain/subdomain-nya ke folder public/ tersebut.

Tambahkan juga .htaccess di root folder (sejajar dengan public/) kalau diperlukan, atau pastikan .htaccess di dalam public/ sudah ada bawaan Laravel.


Checklist Sebelum Upload

  • File .env — wajib ada dan sudah dikonfigurasi. Minimal set APP_KEY, APP_ENV=production, APP_DEBUG=false, dan koneksi database.
  • Folder vendor/ — harus ikut di-upload. Jalankan composer install di lokal dulu, lalu upload hasilnya.
  • APP_KEY — kalau belum ada, generate dulu di lokal: php artisan key:generate, lalu copy nilainya ke .env di server.
  • PHP Version — pastikan versi PHP di hosting kompatibel dengan versi Laravel yang dipakai.
  • Permission — folder storage/ dan bootstrap/cache/ harus writable (chmod 775).

Masalah Symlink Storage

Kalau aplikasi punya fitur upload file atau menampilkan file dari storage/, Laravel butuh symlink dari public/storage ke storage/app/public. Normalnya ini dijalankan lewat perintah:

php artisan storage:link

Tapi di shared hosting tanpa SSH, perintah itu tidak bisa dijalankan langsung.

Jangan Upload Symlink dari Lokal

Satu hal yang perlu diperhatikan: jangan ikut upload symlink yang ada di folder public/storage dari komputer lokal. Symlink lokal berisi path yang mengarah ke komputer kamu sendiri (misal /Users/nama/project/storage/app/public), sehingga tidak akan valid di server. FTP client kadang mengupload symlink sebagai folder kosong atau broken link.

Solusinya: hapus dulu folder/symlink storage yang ada di dalam public/ di server, lalu buat ulang symlink yang valid menggunakan script PHP berikut.

Script storage_link.php

Buat file storage_link.php, taruh di dalam folder public/, lalu akses sekali via browser:

<?php
// Sesuaikan path $target dengan struktur folder hosting kamu
// Cek dulu dengan check.php di bawah kalau tidak yakin
 
$target = __DIR__ . '/../storage/app/public';
$link   = __DIR__ . '/storage';
 
if (symlink($target, $link)) {
    echo 'Storage linked successfully!';
} else {
    echo 'Failed. Coba cek permission atau path.';
}
Setelah berhasil, langsung hapus file ini dari server.

Cara Cek Path Kalau Masih Gagal

Kalau muncul error No such file or directory, berarti path $target tidak tepat. Buat file check.php sementara untuk melihat isi folder di atas public/:

<?php
$parent = __DIR__ . '/..';
print_r(scandir($parent));

Akses via browser, pastikan ada folder storage di hasilnya. Kalau ada, berarti path /../storage/app/public sudah benar. Kalau tidak ada, cari tahu di mana folder storage Laravel kamu berada dan sesuaikan pathnya.

Hapus Folder storage Lama Sebelum Bikin Symlink

Kalau di public/storage sudah ada folder (misalnya sisa upload dari lokal), symlink tidak akan bisa dibuat — PHP tidak akan menimpa folder yang sudah ada. Hapus dulu lewat File Manager hosting, atau pakai script ini:

<?php
// delete_storage.php — akses sekali, lalu hapus!
function deleteDir($dir) {
    if (!is_dir($dir)) return;
    $items = array_diff(scandir($dir), ['.', '..']);
    foreach ($items as $item) {
        $path = "$dir/$item";
        is_dir($path) ? deleteDir($path) : unlink($path);
    }
    rmdir($dir);
}
 
$target = __DIR__ . '/storage';
deleteDir($target);
echo 'Deleted.';

Setelah folder terhapus, jalankan lagi storage_link.php.


Ringkasan Langkah-Langkah

  1. Jalankan composer install di lokal (pastikan folder vendor/ ada).
  2. Set .env — isi APP_KEY, database, dan konfigurasi lainnya.
  3. Upload semua file Laravel ke folder domain/subdomain di hosting.
  4. Set web root domain ke subfolder public/ lewat panel hosting.
  5. Set permission folder storage/ dan bootstrap/cache/ ke 775.
  6. Kalau ada fitur upload file: hapus folder storage lama di public/, lalu jalankan storage_link.php via browser.
  7. Hapus semua script PHP sementara (storage_link.php, check.php, delete_storage.php) setelah selesai digunakan.

Catatan: Cara ini cocok untuk keperluan demo atau testing cepat. Untuk production, disarankan pakai VPS dengan akses SSH penuh agar bisa menggunakan perintah Artisan, konfigurasi server yang proper, dan keamanan yang lebih terjamin.
TerlamaLebih baru

Posting Komentar