Cara Deploy Laravel ke cPanel Shared Hosting dengan Git dan Auto Deploy
Deploy Laravel ke cPanel shared hosting sebenarnya bisa dilakukan tanpa upload manual lewat File Manager. Cara yang lebih rapi adalah menggunakan Git, lalu cPanel menjalankan proses deploy otomatis setiap kali kita melakukan git push.
Saya sering menemukan kasus Laravel sudah berjalan normal di local, tetapi saat dipindahkan ke shared hosting muncul masalah seperti vendor tidak ada, .env belum terbaca, route masih cache lama, storage tidak bisa diakses, atau build Vite gagal karena keterbatasan resource hosting.
Di artikel ini saya tuliskan alur deploy Laravel ke cPanel shared hosting dengan Git, mulai dari persiapan repository, setting SSH, konfigurasi .cpanel.yml, sampai checklist setelah deploy. Fokusnya bukan teori Git, tapi langkah praktis agar Laravel bisa jalan di hosting cPanel.
Gambaran Alur Deploy Laravel ke cPanel
Secara sederhana, alurnya seperti ini:
- Project Laravel disimpan di GitHub, GitLab, atau repository Git lain.
- cPanel melakukan clone repository ke folder hosting.
- Saat ada
git push, cPanel menjalankan file.cpanel.yml. - File
.cpanel.ymlmenjalankan command seperti:
composer installphp artisan optimize:clearphp artisan migrate --forcenpm installnpm run buildphp artisan queue:restart
Dengan cara ini, kita tidak perlu upload file ZIP berulang-ulang setiap update aplikasi.
Persiapan Sebelum Deploy
Sebelum masuk ke cPanel, pastikan project Laravel sudah siap di repository Git.
Minimal struktur project seperti ini:
app/
bootstrap/
config/
database/
public/
resources/
routes/
storage/
vendor/ # biasanya tidak ikut Git
.env # jangan ikut Git
.env.example
composer.json
package.json
vite.config.js
artisan
.cpanel.ymlPastikan file berikut tidak ikut di-push ke repository:
.env
vendor/
node_modules/
storage/logs/*.logBiasanya sudah diatur di .gitignore.
Contoh .gitignore penting untuk Laravel:
/vendor
/node_modules
/public/build
/public/hot
/storage/*.key
/storage/logs/*.log
.envUntuk public/build, ada dua pendekatan:
- Build asset dilakukan di server saat deploy.
- Build asset dilakukan di local/GitHub Actions lalu hasil build ikut di-push.
Kalau shared hosting resource-nya kecil, saya lebih menyarankan build asset dilakukan di local atau GitHub Actions, bukan langsung di cPanel.
Menentukan Folder Project dan Document Root
Di cPanel, Laravel sebaiknya tidak langsung diletakkan seluruhnya di dalam public_html.
Struktur yang lebih aman:
/home/username/laravel-app
/home/username/public_htmlFolder project Laravel:
/home/username/laravel-appDocument root domain diarahkan ke:
/home/username/laravel-app/publicKalau cPanel menyediakan menu Domains, biasanya document root bisa diatur ke folder public Laravel.
Contoh:
Domain: example.com
Document Root: /home/username/laravel-app/publicJangan arahkan domain langsung ke root project Laravel, karena file seperti .env, composer.json, dan folder storage bisa berisiko terekspos jika konfigurasi server tidak aman.
Membuat Repository Git di cPanel
Masuk ke cPanel, lalu buka menu:
Git Version ControlKemudian pilih:
CreateIsi data repository:
Clone URL: git@github.com:username/nama-repo.git
Repository Path: /home/username/laravel-app
Repository Name: laravel-appJika menggunakan repository private, biasanya perlu menambahkan SSH key dari cPanel ke GitHub atau GitLab.
Membuat SSH Key di cPanel
Masuk ke menu:
SSH Access > Manage SSH KeysBuat SSH key baru, lalu authorize key tersebut.
Setelah itu, ambil public key dengan format seperti ini:
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC...Tambahkan public key tersebut ke GitHub:
GitHub Repository > Settings > Deploy keys > Add deploy keyCentang opsi Allow write access hanya jika server perlu melakukan push balik ke repository. Untuk kebutuhan deploy biasa, tidak perlu dicentang.
Tes koneksi SSH dari Terminal cPanel:
ssh -T git@github.comJika berhasil, biasanya muncul pesan seperti:
Hi username/repository! You've successfully authenticated, but GitHub does not provide shell access.Pesan tersebut normal. Artinya SSH sudah terhubung.
Menyiapkan File .cpanel.yml
File .cpanel.yml adalah file yang dibaca cPanel saat proses deployment berjalan.
Letakkan file ini di root project Laravel:
.cpanel.ymlContoh konfigurasi dasar:
---
deployment:
tasks:
- export DEPLOYPATH=/home/$USER/laravel-app
- /opt/cpanel/composer/bin/composer install --no-dev --optimize-autoloader -d $DEPLOYPATH
- /usr/local/bin/php $DEPLOYPATH/artisan optimize:clear
- /usr/local/bin/php $DEPLOYPATH/artisan migrate --force
- /usr/local/bin/php $DEPLOYPATH/artisan storage:link
- /usr/local/bin/php $DEPLOYPATH/artisan optimizeNamun di beberapa shared hosting, path PHP dan Composer bisa berbeda. Misalnya menggunakan CloudLinux atau MultiPHP:
---
deployment:
tasks:
- export DEPLOYPATH=/home/$USER/laravel-app
- /opt/alt/php84/usr/bin/php -v
- /opt/cpanel/composer/bin/composer install --no-dev --optimize-autoloader -d $DEPLOYPATH
- /opt/alt/php84/usr/bin/php $DEPLOYPATH/artisan optimize:clear
- /opt/alt/php84/usr/bin/php $DEPLOYPATH/artisan migrate --force
- /opt/alt/php84/usr/bin/php $DEPLOYPATH/artisan storage:link
- /opt/alt/php84/usr/bin/php $DEPLOYPATH/artisan optimize
- /opt/alt/php84/usr/bin/php $DEPLOYPATH/artisan queue:restartSesuaikan versi PHP dengan yang tersedia di hosting Anda.
Untuk cek path PHP:
which php
php -vAtau jika menggunakan CloudLinux:
ls /opt/alt/Biasanya tersedia folder seperti:
php81
php82
php83
php84Contoh .cpanel.yml untuk Laravel dengan Vite
Jika project Laravel menggunakan Vite, Tailwind, atau asset frontend lain, biasanya perlu menjalankan npm install dan npm run build.
Contoh:
---
deployment:
tasks:
- export DEPLOYPATH=/home/$USER/laravel-app
- /opt/cpanel/composer/bin/composer install --no-dev --optimize-autoloader -d $DEPLOYPATH
- cd $DEPLOYPATH && npm install
- cd $DEPLOYPATH && npm run build
- /usr/local/bin/php $DEPLOYPATH/artisan optimize:clear
- /usr/local/bin/php $DEPLOYPATH/artisan migrate --force
- /usr/local/bin/php $DEPLOYPATH/artisan storage:link
- /usr/local/bin/php $DEPLOYPATH/artisan optimize
- /usr/local/bin/php $DEPLOYPATH/artisan queue:restart
- rm -rf $DEPLOYPATH/node_modulesSaya biasanya menaruh optimize:clear sebelum optimize, karena cache lama sering menyebabkan Laravel membaca konfigurasi lama.
Namun hati-hati dengan bagian ini:
npm install
npm run buildDi shared hosting, proses build frontend bisa gagal karena RAM kecil, CPU dibatasi, atau proses worker tidak boleh terlalu banyak.
Contoh error yang sering muncul:
JavaScript heap out of memoryAtau:
WebAssembly.instantiate(): Out of memoryAtau:
ERR_WORKER_INIT_FAILEDJika error seperti ini muncul, lebih aman build asset di local atau GitHub Actions, lalu upload hasil public/build ke repository.
Alternatif Lebih Aman: Build Asset di Local
Jika hosting sering gagal menjalankan npm run build, lakukan build di local:
npm install
npm run buildPastikan folder hasil build muncul:
public/buildKemudian ubah .gitignore agar public/build bisa ikut di-push.
Jika sebelumnya ada baris ini:
/public/buildAnda bisa hapus atau beri komentar:
# /public/buildLalu commit hasil build:
git add public/build
git commit -m "Build frontend assets"
git push origin mainDengan cara ini, .cpanel.yml tidak perlu menjalankan npm install dan npm run build di server.
Contoh .cpanel.yml yang lebih ringan:
---
deployment:
tasks:
- export DEPLOYPATH=/home/$USER/laravel-app
- /opt/cpanel/composer/bin/composer install --no-dev --optimize-autoloader -d $DEPLOYPATH
- /usr/local/bin/php $DEPLOYPATH/artisan optimize:clear
- /usr/local/bin/php $DEPLOYPATH/artisan migrate --force
- /usr/local/bin/php $DEPLOYPATH/artisan storage:link
- /usr/local/bin/php $DEPLOYPATH/artisan optimize
- /usr/local/bin/php $DEPLOYPATH/artisan queue:restartUntuk shared hosting, pendekatan ini biasanya lebih stabil.
Menyiapkan File .env di Server
File .env tidak boleh ikut repository, jadi harus dibuat manual di server.
Masuk ke Terminal cPanel:
cd /home/username/laravel-app
cp .env.example .envEdit file .env:
nano .envContoh konfigurasi penting:
APP_NAME="Laravel App"
APP_ENV=production
APP_KEY=
APP_DEBUG=false
APP_URL=https://example.com
LOG_CHANNEL=stack
LOG_LEVEL=error
DB_CONNECTION=mysql
DB_HOST=localhost
DB_PORT=3306
DB_DATABASE=username_database
DB_USERNAME=username_dbuser
DB_PASSWORD=password_databaseSetelah itu generate app key:
php artisan key:generateJika path PHP khusus:
/opt/alt/php84/usr/bin/php artisan key:generatePastikan:
APP_DEBUG=falseJangan biarkan APP_DEBUG=true di production, karena error Laravel bisa menampilkan informasi sensitif.
Mengatur Permission Storage dan Cache
Laravel perlu akses tulis ke folder storage dan bootstrap/cache.
Jalankan:
chmod -R 775 storage bootstrap/cacheJika masih error permission, cek owner file. Di shared hosting biasanya file harus dimiliki user cPanel yang sama.
Jangan langsung menggunakan:
chmod -R 777 storage bootstrap/cacheKecuali benar-benar terpaksa dan paham risikonya. Permission 777 terlalu longgar untuk production.
Membuat Storage Link
Agar file upload dari Laravel bisa diakses publik, jalankan:
php artisan storage:linkAtau:
/opt/alt/php84/usr/bin/php artisan storage:linkJika muncul error karena link sudah ada:
The [public/storage] link already exists.Itu bukan masalah besar. Artinya symbolic link sudah dibuat.
Jika ingin membuat ulang:
rm public/storage
php artisan storage:linkHati-hati, pastikan public/storage memang symbolic link, bukan folder berisi file penting.
Menjalankan Migration Saat Deploy
Untuk production, migration harus dijalankan dengan flag:
php artisan migrate --forceTanpa --force, Laravel biasanya menolak migration di environment production.
Di .cpanel.yml:
- /usr/local/bin/php $DEPLOYPATH/artisan migrate --forceJika ingin lebih aman, lakukan backup database sebelum deploy besar.
Contoh backup MySQL:
mysqldump -u username_dbuser -p username_database > backup-before-deploy.sqlJangan menjalankan migration destruktif seperti drop column atau rename table tanpa backup.
Mengaktifkan Auto Deploy di cPanel
Setelah repository dibuat di cPanel, biasanya ada tombol:
Manage > Pull or DeployAktifkan deployment sesuai fitur yang tersedia di hosting.
Jika auto deploy tidak berjalan, lakukan manual:
Git Version Control > Manage > Update from RemoteAtau dari Terminal:
cd /home/username/laravel-app
git pull origin mainLalu jalankan command deploy manual sesuai .cpanel.yml.
Contoh Workflow Deploy Harian
Setelah semua setup selesai, alur kerja harian menjadi sederhana.
Di local:
git add .
git commit -m "Update fitur checkout"
git push origin mainDi server:
- cPanel menerima update repository.
- cPanel menjalankan
.cpanel.yml. - Composer install berjalan.
- Cache Laravel dibersihkan.
- Migration dijalankan.
- Cache production dibuat ulang.
- Queue direstart.
Jika deploy gagal, cek log deployment di cPanel.
Cara Cek Log Deploy cPanel
Biasanya log deploy tersedia di menu Git Version Control.
Jika ingin cek dari Terminal, lokasi log sering berada di:
/home/username/.cpanel/logs/Cek file terbaru:
ls -lah /home/username/.cpanel/logs/Baca log:
cat /home/username/.cpanel/logs/nama-log-deploy.logAtau gunakan:
tail -n 100 /home/username/.cpanel/logs/nama-log-deploy.logDari log ini biasanya terlihat jelas command mana yang gagal.
Contoh:
composer: command not foundArtinya path Composer salah.
Contoh lain:
SQLSTATE[HY000] [1045] Access denied for userArtinya konfigurasi database di .env salah.
Error Umum Saat Deploy Laravel ke cPanel
1. Composer Command Not Found
Error:
composer: command not foundSolusi:
Cari path Composer:
which composerAtau gunakan path bawaan cPanel:
/opt/cpanel/composer/bin/composer install --no-dev --optimize-autoloaderJika tidak tersedia, cek menu Composer di cPanel atau tanyakan ke provider hosting.
2. PHP Version Berbeda antara Terminal dan Domain
Kadang di Terminal PHP terbaca versi 8.1, tetapi domain menggunakan PHP 8.3.
Cek versi PHP:
php -vCek path PHP CloudLinux:
/opt/alt/php84/usr/bin/php -vGunakan path PHP yang sesuai di .cpanel.yml.
3. APP_KEY Belum Ada
Error:
No application encryption key has been specified.Solusi:
php artisan key:generatePastikan .env memiliki:
APP_KEY=base64:...4. Halaman 500 Setelah Deploy
Cek log Laravel:
tail -n 100 storage/logs/laravel.logPenyebab umum:
.envsalah- database tidak bisa connect
- permission
storagebermasalah - cache config masih lama
- dependency Composer belum terinstall
Coba jalankan:
php artisan optimize:clear5. Vite Manifest Not Found
Error:
Vite manifest not foundPenyebabnya file build belum ada di:
public/build/manifest.jsonSolusi:
npm install
npm run buildAtau build di local lalu push folder:
public/build6. Database Connection Error
Error:
SQLSTATE[HY000] [2002] Connection refusedAtau:
could not translate host name "localhost" to addressSolusi:
Cek kembali konfigurasi .env:
DB_CONNECTION=mysql
DB_HOST=localhost
DB_PORT=3306
DB_DATABASE=username_database
DB_USERNAME=username_dbuser
DB_PASSWORD=password_databaseJika menggunakan PostgreSQL, pastikan host, port, database, user, dan password sesuai dengan data dari cPanel atau provider hosting.
Contoh PostgreSQL:
DB_CONNECTION=pgsql
DB_HOST=localhost
DB_PORT=5432
DB_DATABASE=username_database
DB_USERNAME=username_dbuser
DB_PASSWORD=password_databaseTidak semua shared hosting mengaktifkan PostgreSQL di localhost, jadi cek detail dari hosting.
7. Storage Tidak Bisa Diakses
Gejala:
- gambar upload tidak muncul
- file 404
- symbolic link error
Solusi:
php artisan storage:linkCek link:
ls -lah publicSeharusnya ada:
storage -> ../storage/app/publicContoh .cpanel.yml Final yang Saya Rekomendasikan
Untuk shared hosting biasa, saya lebih suka versi ringan seperti ini:
---
deployment:
tasks:
- export DEPLOYPATH=/home/$USER/laravel-app
- /opt/cpanel/composer/bin/composer install --no-dev --optimize-autoloader -d $DEPLOYPATH
- /usr/local/bin/php $DEPLOYPATH/artisan optimize:clear
- /usr/local/bin/php $DEPLOYPATH/artisan migrate --force
- /usr/local/bin/php $DEPLOYPATH/artisan storage:link
- /usr/local/bin/php $DEPLOYPATH/artisan optimize
- /usr/local/bin/php $DEPLOYPATH/artisan queue:restartJika hosting menggunakan CloudLinux dan PHP 8.4:
---
deployment:
tasks:
- export DEPLOYPATH=/home/$USER/laravel-app
- export PHPBIN=/opt/alt/php84/usr/bin/php
- /opt/cpanel/composer/bin/composer install --no-dev --optimize-autoloader -d $DEPLOYPATH
- $PHPBIN $DEPLOYPATH/artisan optimize:clear
- $PHPBIN $DEPLOYPATH/artisan migrate --force
- $PHPBIN $DEPLOYPATH/artisan storage:link
- $PHPBIN $DEPLOYPATH/artisan optimize
- $PHPBIN $DEPLOYPATH/artisan queue:restartJika asset sudah dibuild di local, tidak perlu memasukkan npm install dan npm run build di server.
Cara Memastikan Masalah Sudah Selesai
- [ ] Domain sudah mengarah ke folder
publicLaravel. - [ ] File
.envsudah dibuat di server dan tidak ikut repository. - [ ]
APP_KEYsudah terisi. - [ ]
APP_DEBUG=falsedi production. - [ ]
composer install --no-dev --optimize-autoloaderberhasil. - [ ]
php artisan migrate --forceberhasil. - [ ]
php artisan optimize:cleardanphp artisan optimizeberhasil. - [ ] Folder
storagedanbootstrap/cachebisa ditulis. - [ ]
php artisan storage:linksudah berjalan. - [ ] Halaman utama website bisa diakses tanpa error 500.
- [ ] File CSS dan JS dari Vite berhasil termuat.
- [ ] Log Laravel tidak menampilkan error baru.
- [ ] Push terbaru dari Git berhasil memicu deploy di cPanel.
Kesalahan yang Perlu Dihindari
- Meletakkan seluruh project Laravel langsung di
public_html. - Mengupload file
.envke repository Git. - Membiarkan
APP_DEBUG=truedi production. - Menjalankan migration production tanpa backup database.
- Menggunakan
chmod 777tanpa memahami risikonya. - Memaksa
npm run builddi shared hosting kecil yang RAM-nya terbatas. - Tidak mengecek log deploy saat proses gagal.
- Menggunakan path PHP yang berbeda antara Terminal dan
.cpanel.yml. - Menghapus
public/storagetanpa memastikan itu symbolic link. - Menganggap semua hosting punya konfigurasi PHP, Composer, dan Node.js yang sama.
FAQ
Apakah Laravel bisa dideploy ke shared hosting cPanel?
Bisa, selama hosting mendukung versi PHP yang sesuai dengan Laravel, menyediakan Composer, akses SSH atau Git, dan mengizinkan document root diarahkan ke folder public.
Namun untuk aplikasi Laravel yang berat, queue aktif, atau butuh worker terus-menerus, VPS biasanya lebih ideal dibanding shared hosting.
Apakah folder vendor perlu diupload ke Git?
Tidak disarankan. Folder vendor sebaiknya dibuat di server dengan command:
composer install --no-dev --optimize-autoloaderDengan begitu repository tetap ringan dan dependency mengikuti composer.lock.
Apakah node_modules perlu ikut diupload?
Tidak. Folder node_modules sangat besar dan tidak perlu masuk repository.
Jika build dilakukan di server, jalankan:
npm install
npm run buildJika build dilakukan di local, cukup push hasil build di public/build.
Lebih baik npm build di cPanel atau local?
Untuk shared hosting, lebih aman build di local atau GitHub Actions. Banyak shared hosting memiliki limit RAM dan CPU yang membuat npm run build gagal.
Jika project kecil dan hosting cukup kuat, build di cPanel masih bisa dilakukan.
Kenapa setelah deploy muncul error 500?
Error 500 biasanya disebabkan oleh .env salah, database tidak terkoneksi, permission folder bermasalah, cache config lama, atau dependency belum terinstall.
Cek log Laravel:
tail -n 100 storage/logs/laravel.logLalu bersihkan cache:
php artisan optimize:clearApakah migration aman dijalankan otomatis saat deploy?
Aman jika migration sudah dites di staging atau local dan tidak menghapus data penting.
Untuk production, selalu gunakan:
php artisan migrate --forceNamun untuk perubahan besar seperti drop column, rename table, atau perubahan struktur data penting, lakukan backup database lebih dulu.
Bagaimana jika hosting tidak menyediakan SSH?
Jika tidak ada SSH, deploy Laravel akan lebih sulit. Anda masih bisa upload manual lewat File Manager, tetapi tidak ideal untuk project yang sering update.
Untuk Laravel, sebaiknya pilih shared hosting yang menyediakan SSH, Git, Composer, dan pengaturan document root.
Kesimpulan
Deploy Laravel ke cPanel shared hosting dengan Git adalah cara yang lebih rapi dibanding upload manual. Kuncinya ada pada struktur folder yang benar, domain diarahkan ke folder public, file .env dibuat manual di server, dan .cpanel.yml berisi command deploy yang sesuai dengan environment hosting.
Untuk shared hosting, bagian yang paling sering bermasalah adalah Composer path, versi PHP, permission storage, koneksi database, dan build asset Vite. Jika npm run build sering gagal karena out of memory, jangan dipaksa di server. Build asset di local atau GitHub Actions, lalu push hasil public/build.
Dengan setup yang benar, proses update Laravel cukup dilakukan dengan git push, lalu cPanel menjalankan deployment secara otomatis.
Rekomendasi Artikel Terkait
- Cara Mengatasi npm run build Error Out of Memory di cPanel Shared Hosting
- Cara Mengatasi Laravel Error 500 Setelah Deploy ke cPanel
- Cara Setting .cpanel.yml untuk Auto Deploy Laravel di Shared Hosting

