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. Ada dua skenario yang dibahas: menggunakan subdomain (web root bisa diatur) dan main domain (web root terkunci di public_html/).


1. 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 dengan perintah 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).
Untuk kebutuhan demo, set APP_ENV=production dan APP_DEBUG=false agar pesan error dan konfigurasi sensitif tidak tampil di browser pengunjung.

2. Skenario 1: Subdomain (Web Root Bisa Diatur)

Kalau menggunakan subdomain, panel hosting seperti cPanel biasanya mengizinkan kita mengatur web root subdomain ke folder mana saja. Ini cara yang paling bersih dan tidak perlu edit file apapun.

Upload semua file Laravel ke folder subdomain, lalu set web root-nya ke subfolder public/ lewat panel hosting. Struktur akhirnya seperti ini:

/home/username/demo.domain.web.id/
├── app/
├── bootstrap/
├── config/
├── database/
├── resources/
├── routes/
├── storage/
├── vendor/
├── .env
└── public/          ← set ini sebagai web root di panel hosting
    ├── index.php
    └── .htaccess
File index.php bawaan Laravel tidak perlu diedit — strukturnya tidak berubah sehingga path sudah otomatis benar.

3. Skenario 2: Main Domain (Web Root Terkunci di public_html/)

Kalau menggunakan main domain, web root biasanya terkunci di public_html/ dan tidak bisa diubah lewat panel hosting. Solusinya adalah memisahkan file Laravel dari web root.

3.1 Struktur Folder

Upload semua file Laravel ke folder di luar public_html/, misalnya di /home/username/nama-project/. Kemudian pindahkan isi folder public/ Laravel (bukan foldernya, tapi isinya: index.php, .htaccess, favicon.ico, dll) ke public_html/. Folder public/ di dalam project Laravel setelah itu tidak perlu ada lagi.

/home/username/
├── nama-project/         ← semua file Laravel di sini
│   ├── app/
│   ├── bootstrap/
│   ├── config/
│   ├── storage/
│   ├── vendor/
│   └── .env
│   (tidak ada folder public/ lagi)
└── public_html/          ← web root main domain
    ├── index.php         ← dari Laravel/public/, diedit pathnya
    ├── .htaccess         ← dari Laravel/public/
    ├── favicon.ico
    └── robots.txt
Cara ini justru lebih aman — file sensitif seperti .env, config/, dan vendor/ berada di luar web root sehingga tidak bisa diakses langsung lewat browser.

3.2 Edit index.php

Setelah index.php dipindah ke public_html/, edit bagian path-nya agar mengarah ke folder Laravel yang berada di luar public_html/:

require __DIR__.'/../nama-project/vendor/autoload.php';
$app = require_once __DIR__.'/../nama-project/bootstrap/app.php';
Ganti nama-project dengan nama folder Laravel kamu yang sebenarnya. Semua kode yang mengandung __DIR__ sesuaikan path-nya dengan nama-project.

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

php artisan storage:link

Tapi di shared hosting tanpa SSH, perintah itu tidak bisa dijalankan langsung. Solusinya pakai script PHP sementara.

Satu hal penting: jangan ikut upload symlink yang ada di folder public/storage dari komputer lokal. Symlink lokal berisi path yang mengarah ke komputer sendiri, sehingga tidak valid di server. FTP client atau File Manager kadang mengupload symlink sebagai folder kosong atau broken link — ini harus dihapus dulu sebelum membuat symlink baru di server.

Buat file storage_link.php, upload ke web root lewat File Manager cPanel, lalu akses sekali via browser.

Untuk Skenario 1 (subdomain) — taruh di folder public/:

<?php
$target = __DIR__ . '/../storage/app/public';
$link   = __DIR__ . '/storage';

if (symlink($target, $link)) {
    echo 'Storage linked successfully!';
} else {
    echo 'Failed. Coba cek permission atau path.';
}

Untuk Skenario 2 (main domain) — taruh di public_html/, sesuaikan nama folder project:

<?php
$target = __DIR__ . '/../nama-project/storage/app/public';
$link   = __DIR__ . '/storage';

if (symlink($target, $link)) {
    echo 'Storage linked successfully!';
} else {
    echo 'Failed. Coba cek permission atau path.';
}
Setelah script berhasil dijalankan, langsung hapus file storage_link.php dari server lewat File Manager cPanel.

5. Troubleshooting

5.1 Muncul "Index of /" bukannya halaman Laravel

Ini berarti file .htaccess tidak terbaca atau belum terupload. File .htaccess adalah hidden file (diawali titik) yang sering tidak terlihat atau ter-skip saat upload.

Cara cek cepat: akses langsung https://domain.com/index.php — kalau halaman Laravel muncul, berarti index.php sudah ada tapi .htaccess-nya yang belum terupload.

Solusinya: buka File Manager di cPanel, masuk ke folder web root, lalu klik Upload dan upload ulang file .htaccess. Pastikan di File Manager aktifkan opsi Show Hidden Files agar file .htaccess terlihat setelah terupload.

Pastikan isi .htaccess-nya seperti ini (bawaan Laravel):

<IfModule mod_rewrite.c>
    <IfModule mod_ssl.c>
        SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1
    </IfModule>

    Options -Indexes
    RewriteEngine On
    RewriteRule ^(\.well-known/.*)$ $1 [L]
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]
</IfModule>
Options -Indexes di dalam .htaccess itulah yang mencegah tampilan "Index of /" muncul saat .htaccess sudah aktif.

5.2 Storage link gagal: "No such file or directory"

Berarti path $target di script tidak tepat — folder storage Laravel tidak ditemukan di lokasi yang dituju. Buat file check.php sementara untuk melihat isi folder induk:

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

Upload ke web root lewat File Manager cPanel, akses via browser, pastikan folder storage terlihat di hasilnya. Sesuaikan path $target di script storage_link.php berdasarkan hasil ini, lalu hapus check.php setelah selesai.

5.3 Storage link gagal karena folder storage sudah ada

Symlink tidak bisa dibuat kalau nama yang sama sudah ada sebagai folder — biasanya ini sisa symlink dari lokal yang ter-upload. Hapus dulu lewat File Manager cPanel, atau pakai script ini:

<?php
// delete_storage.php — akses sekali lewat browser, 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.';
Hati-hati menggunakan script ini kalau folder storage sudah berisi file upload dari user — backup dulu isinya sebelum dihapus.

Setelah folder terhapus, jalankan lagi storage_link.php.


6. Ringkasan Langkah-Langkah

Untuk Subdomain:

  1. Jalankan composer install di lokal.
  2. Set .env — isi APP_KEY, database, dan konfigurasi lainnya.
  3. Upload semua file Laravel ke folder subdomain di hosting via File Manager cPanel.
  4. Set web root subdomain 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/, upload dan jalankan storage_link.php via browser, lalu hapus scriptnya.

Untuk Main Domain:

  1. Jalankan composer install di lokal.
  2. Set .env — isi APP_KEY, database, dan konfigurasi lainnya.
  3. Upload semua file Laravel ke folder di luar public_html/ via File Manager cPanel.
  4. Pindahkan isi folder public/ Laravel (index.php, .htaccess, dll) ke public_html/.
  5. Edit public_html/index.php — sesuaikan path ke folder Laravel.
  6. Set permission folder storage/ dan bootstrap/cache/ ke 775.
  7. Kalau ada fitur upload file: hapus folder storage lama di public_html/, upload dan jalankan storage_link.php via browser, lalu hapus scriptnya.
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