Cara Deploy Laravel ke cPanel Shared Hosting Tanpa VPS
Deploy Laravel ke cPanel shared hosting sebenarnya bisa dilakukan, walaupun tidak senyaman deploy ke VPS. Masalah yang sering muncul biasanya bukan karena Laravel tidak support shared hosting, tetapi karena struktur folder, versi PHP, permission, composer, atau konfigurasi .env belum sesuai.
Saya cukup sering menemukan kasus Laravel sudah berhasil di-upload ke hosting, tetapi saat domain dibuka hanya muncul error 500, halaman kosong, asset CSS tidak tampil, atau route Laravel menghasilkan 404. Setelah dicek, penyebabnya sering sederhana: domain belum diarahkan ke folder public, file .env belum benar, APP_KEY belum dibuat, atau folder storage tidak bisa ditulis.
Artikel ini membahas langkah deploy Laravel ke cPanel shared hosting dari awal sampai pengecekan error setelah deploy. Fokusnya bukan teori Laravel, tetapi alur praktis yang bisa langsung dicoba di hosting biasa, terutama untuk pengguna yang belum memakai VPS.
Persiapan Sebelum Deploy Laravel ke cPanel
Sebelum upload project Laravel ke cPanel, pastikan dulu environment hosting mendukung project yang akan dijalankan. Ini penting karena shared hosting biasanya punya batasan resource, akses SSH yang terbatas, dan versi PHP yang kadang berbeda dengan komputer lokal.
Beberapa hal yang perlu dicek:
- Versi PHP di cPanel
- Ekstensi PHP yang dibutuhkan Laravel
- Akses SSH
- Composer
- Database MySQL atau PostgreSQL
- File
.env - Domain atau subdomain yang akan dipakai
- Document root domain
- Kebutuhan build asset jika project menggunakan Vite
Untuk Laravel 10, 11, atau 12, biasanya dibutuhkan PHP versi modern seperti PHP 8.2, 8.3, atau 8.4. Cek di menu Select PHP Version, MultiPHP Manager, atau menu serupa di cPanel.
Ekstensi PHP yang umum dibutuhkan Laravel antara lain:
opensslpdopdo_mysqlataupdo_pgsqlmbstringtokenizerxmlctypejsonfileinfocurlzipbcmath
Jika salah satu ekstensi penting belum aktif, Laravel bisa menghasilkan error 500 atau error dependency saat menjalankan Composer.
Kalau hosting menyediakan SSH, proses deploy akan lebih mudah karena kita bisa menjalankan command seperti:
composer install --no-dev --optimize-autoloader
php artisan key:generate
php artisan migrate --force
php artisan optimizeJika tidak ada akses SSH, deploy tetap bisa dilakukan, tetapi beberapa proses seperti composer install, npm run build, dan generate file tertentu sebaiknya dilakukan di komputer lokal terlebih dahulu.
Struktur Folder Laravel yang Aman di cPanel
Struktur folder adalah bagian paling penting saat deploy Laravel ke shared hosting. Laravel memiliki folder public yang memang dirancang sebagai document root. Artinya, domain sebaiknya diarahkan ke folder public, bukan ke root project Laravel.
Struktur yang lebih aman biasanya seperti ini:
/home/username/
├── laravel-project/
│ ├── app/
│ ├── bootstrap/
│ ├── config/
│ ├── database/
│ ├── public/
│ ├── resources/
│ ├── routes/
│ ├── storage/
│ ├── vendor/
│ ├── .env
│ └── artisan
└── public_html/Jika cPanel mengizinkan perubahan document root, arahkan domain atau subdomain ke:
/home/username/laravel-project/publicDengan cara ini, file penting seperti .env, composer.json, folder app, storage, dan vendor tidak bisa diakses langsung dari browser.
Struktur yang direkomendasikan untuk domain utama atau subdomain:
/home/username/
├── apps/
│ └── nama-project-laravel/
│ ├── app/
│ ├── bootstrap/
│ ├── config/
│ ├── database/
│ ├── public/
│ ├── resources/
│ ├── routes/
│ ├── storage/
│ ├── vendor/
│ ├── .env
│ └── artisan
└── public_html/Lalu document root domain diarahkan ke:
/home/username/apps/nama-project-laravel/publicRisiko jika semua file Laravel diletakkan langsung di public_html adalah file sensitif berpotensi terbuka, terutama jika konfigurasi server salah. File seperti .env tidak boleh berada di folder yang bisa diakses publik.
Jika hosting tidak bisa mengubah document root, alternatifnya adalah memindahkan isi folder public ke public_html, lalu menyesuaikan path di file index.php. Cara ini bisa digunakan, tetapi lebih rawan salah konfigurasi dibandingkan mengarahkan domain langsung ke folder public.
Contoh perubahan di public_html/index.php jika project Laravel berada di luar public_html:
require __DIR__.'/../apps/nama-project-laravel/vendor/autoload.php';
$app = require_once __DIR__.'/../apps/nama-project-laravel/bootstrap/app.php';Pastikan path tersebut sesuai dengan lokasi project di hosting.
Cara Deploy Laravel ke cPanel Shared Hosting
Berikut alur deploy Laravel ke cPanel shared hosting yang paling umum saya gunakan. Sesuaikan dengan fitur yang tersedia di hosting masing-masing.
1. Upload Project Laravel ke Hosting
Ada beberapa cara upload project Laravel ke cPanel:
- Upload file ZIP melalui File Manager cPanel
- Upload via FTP/SFTP
- Clone repository Git jika cPanel menyediakan Git Version Control
- Push dari lokal ke repository yang terhubung ke cPanel
- Upload manual dari komputer lokal
Untuk shared hosting, cara paling sederhana adalah membuat file ZIP dari project Laravel, lalu upload melalui File Manager.
Sebelum membuat ZIP, pastikan file yang tidak perlu tidak ikut terupload, misalnya:
node_modules/
.git/
.env lokal yang berisi kredensial development
storage/logs/*.logJika hosting mendukung Composer dan SSH, folder vendor tidak wajib ikut diupload karena bisa dibuat ulang dengan command composer install.
Jika hosting tidak punya SSH atau Composer, folder vendor perlu disiapkan dari lokal lalu ikut diupload.
2. Extract Project di Folder yang Tepat
Setelah file ZIP diupload, extract project di folder yang aman, misalnya:
/home/username/apps/nama-project-laravelHindari extract semua file Laravel langsung ke:
/home/username/public_htmlkecuali memang tidak ada pilihan lain dan Anda sudah memahami risiko serta perubahan path yang perlu dilakukan.
Contoh struktur setelah extract:
/home/username/apps/nama-project-laravel/
├── app/
├── bootstrap/
├── config/
├── database/
├── public/
├── resources/
├── routes/
├── storage/
├── composer.json
├── composer.lock
└── artisanPastikan file artisan, composer.json, dan folder public berada di root project Laravel.
3. Arahkan Domain ke Folder public Laravel
Laravel harus diakses dari folder public. Jika memakai addon domain atau subdomain, biasanya document root bisa diatur dari cPanel.
Contoh document root yang benar:
/home/username/apps/nama-project-laravel/publicJika domain masih diarahkan ke public_html, kemungkinan Laravel tidak akan berjalan dengan benar. Gejalanya bisa berupa:
- Route menghasilkan 404
- File
.envberisiko terbuka - Asset tidak ditemukan
- Error 500
- Halaman hanya menampilkan daftar file
Jika cPanel tidak mengizinkan document root di luar public_html, gunakan alternatif berikut:
- Pindahkan isi folder
publicLaravel kepublic_html - Edit path di
public_html/index.php - Pastikan file
.htaccessdari folderpublicikut dipindahkan - Pastikan folder utama Laravel tetap berada di luar
public_html
Contoh isi penting file index.php yang perlu disesuaikan:
require __DIR__.'/../apps/nama-project-laravel/vendor/autoload.php';
$app = require_once __DIR__.'/../apps/nama-project-laravel/bootstrap/app.php';Jangan asal copy tanpa mengecek path, karena beda hosting bisa beda struktur folder.
4. Buat Database di cPanel
Jika aplikasi Laravel menggunakan database, buat database dari menu cPanel seperti MySQL Databases, PostgreSQL Databases, atau menu sejenis.
Untuk MySQL, biasanya langkahnya seperti ini:
- Buat database baru
- Buat user database
- Buat password yang kuat
- Assign user ke database
- Berikan privilege yang dibutuhkan
- Catat nama database, username, password, host, dan port
Di cPanel, nama database dan username sering memiliki prefix akun hosting.
Contoh:
Database: username_namadatabase
Username: username_userdatabase
Host: localhost
Port: 3306Jika memakai PostgreSQL, port default biasanya 5432, tetapi tetap cek informasi dari hosting karena beberapa provider memakai konfigurasi berbeda.
5. Buat dan Edit File .env
Laravel membutuhkan file .env untuk membaca konfigurasi aplikasi. Jika di project hanya ada .env.example, buat salinannya menjadi .env.
Jika punya SSH, jalankan:
cp .env.example .envJika tidak ada SSH, buat file .env manual melalui File Manager cPanel.
Contoh konfigurasi dasar:
APP_NAME="Nama Website"
APP_ENV=production
APP_KEY=
APP_DEBUG=false
APP_URL=https://domainanda.com
DB_CONNECTION=mysql
DB_HOST=localhost
DB_PORT=3306
DB_DATABASE=username_namadatabase
DB_USERNAME=username_userdatabase
DB_PASSWORD=password_databaseBeberapa catatan penting:
APP_ENVgunakanproductionAPP_DEBUGwajibfalseuntuk website liveAPP_URLisi dengan domain asliDB_DATABASE,DB_USERNAME, danDB_PASSWORDharus sesuai data dari cPanel- Jangan memakai konfigurasi database lokal seperti
roottanpa password
Jika menggunakan PostgreSQL, sesuaikan bagian database:
DB_CONNECTION=pgsql
DB_HOST=localhost
DB_PORT=5432
DB_DATABASE=username_namadatabase
DB_USERNAME=username_userdatabase
DB_PASSWORD=password_databasePada beberapa hosting, DB_HOST=localhost bisa saja tidak sesuai. Jika muncul error database connection, cek kembali host database dari cPanel atau tanyakan ke provider hosting.
6. Jalankan Composer Install
Jika hosting menyediakan SSH dan Composer, masuk ke folder project Laravel:
cd /home/username/apps/nama-project-laravelLalu jalankan:
composer install --no-dev --optimize-autoloaderCommand ini akan menginstall dependency Laravel untuk production tanpa package development.
Jika muncul error Composer, cek beberapa hal:
- Apakah Composer tersedia di hosting
- Apakah versi PHP CLI sesuai
- Apakah memory limit cukup
- Apakah ekstensi PHP yang dibutuhkan sudah aktif
- Apakah file
composer.lockikut terupload
Pada beberapa shared hosting, command php di terminal bisa menggunakan versi berbeda dari versi PHP domain. Cek dengan:
php -vJika hosting memakai path PHP khusus, command bisa jadi seperti ini:
/opt/alt/php83/usr/bin/php composer.phar install --no-dev --optimize-autoloaderPath PHP bisa berbeda di setiap hosting, jadi sesuaikan dengan dokumentasi provider.
7. Generate APP_KEY
Laravel membutuhkan APP_KEY. Jika belum dibuat, aplikasi bisa error atau fitur enkripsi/session tidak berjalan dengan benar.
Jalankan:
php artisan key:generateSetelah berhasil, file .env akan terisi seperti ini:
APP_KEY=base64:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxJika tidak ada SSH, Anda bisa generate APP_KEY di lokal dengan project yang sama, lalu copy nilainya ke file .env di hosting.
Contoh di lokal:
php artisan key:generate --showLalu salin hasilnya ke .env hosting:
APP_KEY=base64:hasil_key_dari_lokalJangan mengganti APP_KEY sembarangan setelah aplikasi berjalan, terutama jika aplikasi sudah memakai data terenkripsi, session, atau fitur remember token.
8. Jalankan Storage Link
Jika aplikasi memakai upload gambar, file publik, avatar, atau dokumen yang disimpan di storage/app/public, jalankan:
php artisan storage:linkCommand ini membuat symbolic link dari:
public/storageke:
storage/app/publicJika storage:link gagal di shared hosting, beberapa kemungkinan penyebabnya:
- Hosting tidak mengizinkan symlink
- Permission folder tidak cukup
- Folder
public/storagesudah ada - Path document root tidak sesuai
Jika folder public/storage sudah ada dan salah, hapus dulu dengan hati-hati lalu jalankan ulang command.
rm -rf public/storage
php artisan storage:linkPastikan tidak menghapus folder yang berisi file penting.
9. Jalankan Migration Jika Dibutuhkan
Jika database masih kosong dan project menggunakan migration Laravel, jalankan:
php artisan migrate --forceOpsi --force dibutuhkan karena environment production biasanya meminta konfirmasi sebelum migration dijalankan.
Sebelum menjalankan migration di production, pastikan:
- Database sudah dibackup jika sebelumnya sudah berisi data
- Konfigurasi
.envbenar - Migration sudah dites di lokal atau staging
- Tidak ada migration yang berisiko menghapus data
- User database punya privilege yang cukup
Jika migration gagal, cek pesan errornya. Beberapa error umum:
SQLSTATE[HY000] [1045] Access denied for userArtinya username atau password database salah.
SQLSTATE[HY000] [2002] Connection refusedArtinya host atau port database salah, atau database server tidak bisa diakses.
could not find driverArtinya ekstensi PHP database seperti pdo_mysql atau pdo_pgsql belum aktif.
10. Optimasi Laravel untuk Production
Setelah deploy selesai, jalankan cache dan optimasi Laravel:
php artisan config:cache
php artisan route:cache
php artisan view:cache
php artisan optimizeCommand ini membantu Laravel membaca konfigurasi dan route lebih cepat di production.
Namun, ada catatan penting. Jika setelah mengubah .env website masih membaca konfigurasi lama, jalankan:
php artisan optimize:clearLalu cache ulang:
php artisan config:cache
php artisan route:cache
php artisan view:cache
php artisan optimizeJangan lupa, setiap perubahan .env biasanya perlu diikuti dengan clear cache config.
Contoh Command Deploy Laravel di cPanel
Jika hosting menyediakan SSH, contoh alur command deploy sederhana bisa seperti ini:
cd /home/username/apps/nama-project-laravel
composer install --no-dev --optimize-autoloader
cp .env.example .env
php artisan key:generate
php artisan storage:link
php artisan migrate --force
php artisan config:cache
php artisan route:cache
php artisan view:cache
php artisan optimizeJika file .env sudah dibuat manual, command cp .env.example .env tidak perlu dijalankan lagi.
Untuk update setelah deploy pertama, biasanya alurnya seperti ini:
cd /home/username/apps/nama-project-laravel
composer install --no-dev --optimize-autoloader
php artisan optimize:clear
php artisan migrate --force
php artisan storage:link
php artisan config:cache
php artisan route:cache
php artisan view:cache
php artisan optimizeJika project menggunakan queue, tambahkan:
php artisan queue:restartJika project menggunakan Vite dan asset sudah dibuild di lokal, pastikan folder hasil build ikut terupload, biasanya:
public/buildContoh Konfigurasi .env Laravel di cPanel
Berikut contoh konfigurasi .env untuk Laravel di cPanel menggunakan MySQL:
APP_NAME="Nama Website"
APP_ENV=production
APP_KEY=
APP_DEBUG=false
APP_URL=https://domainanda.com
LOG_CHANNEL=stack
LOG_LEVEL=error
DB_CONNECTION=mysql
DB_HOST=localhost
DB_PORT=3306
DB_DATABASE=username_namadatabase
DB_USERNAME=username_userdatabase
DB_PASSWORD=password_database
SESSION_DRIVER=file
CACHE_STORE=file
QUEUE_CONNECTION=syncSetelah APP_KEY dibuat, bagian APP_KEY akan terisi:
APP_KEY=base64:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxUntuk PostgreSQL, bagian database bisa disesuaikan seperti ini:
DB_CONNECTION=pgsql
DB_HOST=localhost
DB_PORT=5432
DB_DATABASE=username_namadatabase
DB_USERNAME=username_userdatabase
DB_PASSWORD=password_databaseJika memakai Redis, queue, mail server, S3, atau service lain, sesuaikan juga konfigurasi terkait. Jangan biarkan konfigurasi lokal ikut terbawa ke production, misalnya APP_URL=http://localhost.
Setelah mengubah .env, jalankan:
php artisan optimize:clear
php artisan config:cacheJika tidak ada SSH, Anda perlu memastikan file .env sudah benar sebelum upload atau edit langsung melalui File Manager cPanel.
Cara Deploy Laravel Jika Tidak Ada Akses SSH
Tidak semua shared hosting menyediakan SSH. Jika hosting Anda tidak punya SSH, deploy Laravel masih bisa dilakukan, tetapi prosesnya harus lebih banyak disiapkan dari komputer lokal.
Alur yang bisa digunakan:
- Jalankan Composer di lokal
- Generate APP_KEY di lokal
- Build asset Vite di lokal
- Upload project beserta folder
vendor - Upload folder hasil build asset
- Buat file
.envmanual di hosting - Arahkan domain ke folder
public - Import database manual jika diperlukan
Di komputer lokal, jalankan:
composer install --no-dev --optimize-autoloader
php artisan key:generate --show
npm install
npm run buildJika project sudah pernah install dependency, Anda bisa menyesuaikan command sesuai kebutuhan.
Pastikan folder berikut ikut terupload:
vendor/
public/build/
bootstrap/cache/Namun untuk bootstrap/cache, jika isinya bermasalah, Anda bisa kosongkan dulu file cache lama sebelum upload.
Jika tidak ada SSH, migration tidak bisa dijalankan langsung dengan php artisan migrate. Alternatifnya:
- Jalankan migration di lokal pada database sementara, lalu export SQL
- Import file SQL ke database hosting melalui phpMyAdmin
- Gunakan fitur terminal jika cPanel menyediakan terminal terbatas
- Minta bantuan provider hosting jika command artisan tidak tersedia
Hindari menjalankan command berat seperti npm run build langsung di shared hosting kecil, terutama jika memory limit rendah. Build Vite cukup sering gagal di shared hosting karena proses Node.js membutuhkan memory lebih besar dibanding proses PHP biasa.
Cara Mengatasi Error Umum Setelah Deploy
Setelah deploy, error paling sering muncul karena konfigurasi hosting berbeda dengan lokal. Berikut beberapa error yang umum terjadi dan cara mengeceknya.
Error 500 Setelah Deploy
Error 500 adalah gejala umum. Penyebabnya bisa banyak, jadi jangan langsung menebak. Langkah pertama adalah cek log Laravel:
storage/logs/laravel.logJika ada SSH, bisa cek dengan:
tail -n 100 storage/logs/laravel.logPenyebab umum error 500:
- File
.envbelum ada APP_KEYkosong- Permission folder
storagebermasalah - Permission folder
bootstrap/cachebermasalah - Versi PHP tidak cocok
- Ekstensi PHP belum aktif
- Composer dependency belum terinstall
- Database tidak terkoneksi
- Cache config masih membaca setting lama
Solusi cepat yang biasanya saya coba:
php artisan optimize:clear
composer install --no-dev --optimize-autoloader
php artisan config:cache
php artisan optimizeCek juga permission folder:
chmod -R 775 storage bootstrap/cacheDi shared hosting tertentu, permission 775 bisa saja tidak cocok. Jika error tetap muncul, cek rekomendasi permission dari provider hosting.
APP_KEY Belum Dibuat
Jika APP_KEY belum dibuat, Laravel bisa menampilkan error seperti:
No application encryption key has been specified.Solusinya:
php artisan key:generateJika tidak ada SSH, generate dari lokal:
php artisan key:generate --showLalu copy hasilnya ke file .env hosting:
APP_KEY=base64:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxSetelah itu clear cache config jika memungkinkan:
php artisan optimize:clear
php artisan config:cacheDatabase Connection Error
Error database biasanya muncul karena konfigurasi .env tidak sesuai dengan database di cPanel.
Contoh error:
SQLSTATE[HY000] [1045] Access denied for userArtinya username atau password database salah.
Contoh lain:
SQLSTATE[HY000] [2002] Connection refusedArtinya host atau port database salah.
Cek kembali bagian ini:
DB_CONNECTION=mysql
DB_HOST=localhost
DB_PORT=3306
DB_DATABASE=username_namadatabase
DB_USERNAME=username_userdatabase
DB_PASSWORD=password_databasePastikan user database sudah di-assign ke database dan punya privilege yang cukup.
Jika memakai PostgreSQL:
DB_CONNECTION=pgsql
DB_HOST=localhost
DB_PORT=5432
DB_DATABASE=username_namadatabase
DB_USERNAME=username_userdatabase
DB_PASSWORD=password_databaseJika muncul error:
could not find driveraktifkan ekstensi pdo_mysql atau pdo_pgsql dari menu PHP Extensions di cPanel.
Setelah mengubah .env, jalankan:
php artisan optimize:clear
php artisan config:cacheRoute Laravel 404
Jika route Laravel menghasilkan 404, penyebab yang paling sering adalah document root salah atau file .htaccess tidak ikut terupload.
Pastikan domain diarahkan ke:
/home/username/apps/nama-project-laravel/publicBukan ke root project Laravel.
Cek juga apakah file berikut ada:
public/.htaccessIsi .htaccess Laravel biasanya menangani rewrite request ke index.php. Jika file ini hilang, route seperti /login, /dashboard, atau /produk/123 bisa menghasilkan 404.
Solusi:
- Upload ulang file
public/.htaccess - Pastikan Apache rewrite aktif
- Pastikan document root mengarah ke folder
public - Clear route cache jika route berubah
php artisan route:clear
php artisan route:cacheJika memakai route closure, hati-hati dengan route:cache karena pada beberapa versi Laravel atau struktur tertentu bisa bermasalah. Jika setelah route:cache route error, jalankan:
php artisan route:clearCSS atau JavaScript Tidak Muncul
Jika halaman Laravel tampil tanpa CSS atau JavaScript, biasanya masalah ada di asset.
Penyebab umum:
APP_URLsalah- Folder
public/buildtidak terupload - Belum menjalankan
npm run build - Path asset berbeda karena domain/subfolder
- Mixed content HTTP/HTTPS
- File permission asset bermasalah
Jika project menggunakan Vite, jalankan build di lokal atau server:
npm install
npm run buildPastikan folder ini ada di hosting:
public/buildCek juga konfigurasi:
APP_URL=https://domainanda.comJika website memakai HTTPS, jangan isi APP_URL dengan HTTP.
Setelah upload asset, hard refresh browser atau clear cache Cloudflare/browser jika digunakan.
Permission Storage dan Bootstrap Cache Bermasalah
Laravel perlu menulis file ke folder storage dan bootstrap/cache. Jika permission salah, biasanya muncul error 500 atau error seperti:
The stream or file could not be opened in append modeCoba set permission:
chmod -R 775 storage bootstrap/cacheJika masih gagal, cek owner file. Pada shared hosting, file yang diupload via FTP/File Manager kadang punya owner berbeda dari proses PHP.
Anda juga bisa menghapus file cache lama:
php artisan optimize:clearFolder yang harus bisa ditulis Laravel:
storage/
bootstrap/cache/Jangan memberi permission 777 kecuali benar-benar terpaksa dan memahami risikonya. Pada beberapa hosting, permission terlalu terbuka justru bisa ditolak oleh server.
Composer Tidak Tersedia di Hosting
Jika Composer tidak tersedia di hosting, ada beberapa pilihan:
- Jalankan
composer installdi komputer lokal - Upload folder
vendorke hosting - Gunakan
composer.pharjika hosting mengizinkan - Minta provider hosting mengaktifkan Composer
- Gunakan GitHub Actions untuk build lalu deploy hasilnya
Cara paling sederhana tanpa SSH:
composer install --no-dev --optimize-autoloaderJalankan command tersebut di lokal, lalu upload folder:
vendor/Pastikan composer.lock juga ikut terupload agar dependency konsisten.
Jika folder vendor tidak ada, Laravel biasanya akan error seperti:
Failed opening required vendor/autoload.phpArtinya dependency belum tersedia.
Cara Memastikan Deploy Laravel Sudah Berhasil
Gunakan checklist berikut setelah deploy:
- [ ] Website bisa diakses
- [ ] Tidak muncul error 500
- [ ] File
.envterbaca - [ ] Database terkoneksi
- [ ] Route Laravel berjalan
- [ ] Asset CSS dan JavaScript tampil
- [ ] Storage link berjalan
- [ ] Log Laravel tidak menunjukkan error baru
- [ ]
APP_DEBUGsudahfalsedi production - [ ] Domain mengarah ke folder
public - [ ] File
.envtidak bisa diakses dari browser - [ ] Folder
vendortersedia - [ ] Folder
storagedanbootstrap/cachebisa ditulis - [ ] Migration sudah berjalan jika diperlukan
- [ ] Form login, upload, dan fitur utama sudah dites
- [ ] HTTPS aktif dan tidak ada mixed content
Untuk mengecek log setelah testing:
tail -n 100 storage/logs/laravel.logJika tidak ada SSH, buka file log melalui File Manager cPanel:
storage/logs/laravel.logJika ada error baru setelah halaman diakses, baca pesan error paling bawah karena biasanya itu error terbaru.
Kesalahan yang Perlu Dihindari
Beberapa kesalahan ini sering membuat deploy Laravel ke cPanel bermasalah:
- Menaruh file
.envdi folder publik
File .env berisi data sensitif seperti password database, key aplikasi, konfigurasi mail, dan token service. Jangan letakkan file ini di folder yang bisa diakses langsung dari browser.
- Mengaktifkan
APP_DEBUG=truedi production
Di website live, gunakan:
APP_DEBUG=falseJika APP_DEBUG=true, detail error bisa terlihat oleh pengunjung, termasuk path server dan konfigurasi sensitif.
- Menjalankan migration tanpa backup
Command ini bisa mengubah struktur database:
php artisan migrate --forceSebelum menjalankan migration di production, backup database terlebih dahulu.
- Upload project tanpa mengecek versi PHP
Laravel versi baru membutuhkan PHP versi modern. Jika hosting masih memakai PHP lama, aplikasi bisa langsung error.
Cek versi PHP CLI:
php -vDan cek versi PHP domain dari cPanel.
- Menjalankan
npm run buildlangsung di shared hosting kecil
Build asset dengan Vite bisa memakan memory cukup besar. Jika hosting kecil, lebih aman build di lokal lalu upload folder public/build.
- Menghapus file penting tanpa backup
Saat memperbaiki error, jangan langsung menghapus folder seperti storage, vendor, atau file .env tanpa backup. Salah hapus bisa membuat website semakin rusak.
- Mengarahkan domain ke folder yang salah
Domain harus mengarah ke folder public Laravel. Jika diarahkan ke root project, route bisa error dan file sensitif lebih berisiko terbuka.
- Lupa clear cache setelah mengubah
.env
Jika Laravel sudah menjalankan config cache, perubahan .env tidak langsung terbaca sampai cache dibersihkan.
Gunakan:
php artisan optimize:clear
php artisan config:cache- Upload folder
node_modules
Folder node_modules biasanya besar dan tidak dibutuhkan di production jika asset sudah dibuild. Upload folder ini hanya membuat proses deploy lambat dan memakan storage hosting.
- Tidak mengecek log Laravel
Error 500 tanpa membaca log hanya akan membuat troubleshooting lama. Selalu cek:
storage/logs/laravel.logFAQ
Apakah Laravel bisa berjalan di shared hosting?
Bisa, selama hosting mendukung versi PHP dan ekstensi yang dibutuhkan Laravel. Yang paling penting adalah domain diarahkan ke folder public, file .env benar, dependency Composer tersedia, dan folder storage serta bootstrap/cache bisa ditulis.
Namun, shared hosting tetap punya batasan. Untuk aplikasi dengan queue berat, WebSocket, scheduler kompleks, atau traffic besar, VPS biasanya lebih fleksibel.
Apakah deploy Laravel ke cPanel wajib menggunakan SSH?
Tidak wajib, tetapi sangat disarankan. Dengan SSH, Anda bisa menjalankan command seperti:
composer install
php artisan migrate --force
php artisan optimizeJika tidak ada SSH, proses seperti Composer install, build asset, dan generate APP_KEY bisa dilakukan di lokal, lalu hasilnya diupload ke hosting.
Apakah folder vendor perlu diupload ke hosting?
Jika hosting menyediakan Composer dan SSH, folder vendor tidak wajib diupload karena bisa dibuat dengan:
composer install --no-dev --optimize-autoloaderJika hosting tidak menyediakan Composer atau SSH, folder vendor perlu diupload dari lokal. Tanpa folder vendor, Laravel tidak bisa berjalan karena file vendor/autoload.php tidak ditemukan.
Bagaimana jika cPanel tidak bisa mengubah document root?
Jika document root tidak bisa diarahkan ke folder public, alternatifnya adalah memindahkan isi folder public Laravel ke public_html, lalu menyesuaikan path di file index.php.
Contoh:
require __DIR__.'/../apps/nama-project-laravel/vendor/autoload.php';
$app = require_once __DIR__.'/../apps/nama-project-laravel/bootstrap/app.php';Pastikan folder utama Laravel tetap berada di luar public_html agar file seperti .env, app, config, dan vendor tidak terbuka ke publik.
Apakah aman menjalankan php artisan migrate di production?
Aman jika sudah dicek dan dibackup. Jangan menjalankan migration di production tanpa memahami perubahan yang akan dilakukan.
Sebelum menjalankan:
php artisan migrate --forcepastikan:
- Database sudah dibackup
- Migration sudah dites di lokal atau staging
- Tidak ada migration yang menghapus data penting
- Konfigurasi database di
.envsudah benar - Aplikasi siap jika struktur database berubah
Untuk website yang sudah memiliki banyak data, migration sebaiknya dilakukan saat traffic rendah.
Kesimpulan
Deploy Laravel ke cPanel shared hosting bisa dilakukan dengan aman asal struktur folder dan konfigurasi dasarnya benar. Kunci utamanya adalah meletakkan project Laravel di luar folder publik jika memungkinkan, mengarahkan domain ke folder public, mengatur .env dengan benar, menjalankan Composer, membuat APP_KEY, memastikan permission folder, dan mengecek log jika muncul error.
Jika hosting punya SSH, proses deploy jauh lebih mudah karena command Laravel bisa dijalankan langsung di server. Jika tidak ada SSH, siapkan dependency dan asset dari lokal, lalu upload hasilnya ke hosting.
Untuk troubleshooting, jangan hanya melihat tampilan error di browser. Cek storage/logs/laravel.log, pastikan versi PHP sesuai, database terkoneksi, dan cache Laravel sudah dibersihkan setelah perubahan konfigurasi.
Dengan alur yang rapi, Laravel tetap bisa berjalan di shared hosting tanpa harus langsung pindah ke VPS.


