Pengalaman Deploy Laravel dari MAMP ke Shared Hosting: Struktur Folder yang Aman
Panduan deploy Laravel dari MAMP lokal ke shared hosting dengan struktur folder aman, public directory, .env, storage link, cache, dan checklist pasca-launch.
Banyak project Laravel lokal berjalan lancar di MAMP, tetapi bermasalah saat dipindahkan ke shared hosting. Masalah yang paling sering muncul adalah folder public, file .env, permission storage, URL asset, dan cache config yang masih mengarah ke environment lokal.
Artikel ini membahas pendekatan deploy Laravel dari MAMP ke shared hosting dengan fokus keamanan dan kestabilan, berdasarkan pengalaman langsung memindahkan project nyata. Panduan ini cocok untuk website company profile, sistem internal ringan, landing page custom, atau aplikasi kecil yang belum membutuhkan VPS.
TL;DR:
- Taruh core Laravel di luar
public_html; hanya isi folderpublicyang boleh di web root. Ini keputusan keamanan paling penting. - Sinkronkan versi PHP lokal-hosting, jalankan
composer install --no-dev, dan cache config/route/view untuk production. - Error 500 setelah upload hampir selalu: path
index.phpsalah,.envbelum benar, permissionstorage, atauAPP_KEYhilang. - Setelah mengubah
.envdi production, selalu jalankanphp artisan config:clear— config yang di-cache mengabaikan.envbaru.
Jawaban Singkat
Deploy Laravel ke shared hosting yang aman dilakukan dengan menaruh core Laravel di luar public_html, menaruh isi folder public di public_html, mengatur path index.php, mengisi .env production, menjalankan cache config, memastikan permission storage, dan melakukan checklist keamanan setelah launch.
1. Struktur Folder yang Disarankan
Struktur paling aman adalah memisahkan folder Laravel dari web root.
Contoh:
/home/username/
laravel-app/
app/
bootstrap/
config/
database/
public/
resources/
routes/
storage/
vendor/
.env
public_html/
index.php
build/
css/
js/
images/
Dengan struktur ini, file penting seperti .env, composer.json, storage, dan source code tidak terbuka langsung ke publik.
2. Edit index.php di public_html
Jika isi folder public Laravel dipindahkan ke public_html, file index.php perlu diarahkan ke lokasi core Laravel.
Contoh:
require __DIR__.'/../laravel-app/vendor/autoload.php';
$app = require_once __DIR__.'/../laravel-app/bootstrap/app.php';
Sesuaikan laravel-app dengan nama folder Anda. Kesalahan path di sini biasanya menyebabkan error 500.
3. Setup .env Production
File .env lokal dari MAMP biasanya belum siap untuk production. Pastikan nilai berikut sudah benar:
APP_ENV=production
APP_DEBUG=false
APP_URL=https://domainanda.com
DB_CONNECTION=mysql
DB_HOST=localhost
DB_PORT=3306
DB_DATABASE=nama_database
DB_USERNAME=user_database
DB_PASSWORD=password_database
Jangan pernah membiarkan APP_DEBUG=true di production. Error detail bisa membocorkan path server, query, environment variable, dan informasi sensitif lain.
4. Jalankan Composer dengan Mode Production
Jika hosting mendukung SSH, jalankan:
composer install --no-dev --optimize-autoloader
php artisan config:cache
php artisan route:cache
php artisan view:cache
Jika hosting tidak mendukung SSH, jalankan composer di lokal dengan environment yang sesuai, lalu upload folder vendor. Pastikan versi PHP lokal dan hosting kompatibel.
Jebakan Config Cache
Ini bug yang menghabiskan waktu banyak orang: setelah menjalankan php artisan config:cache, Laravel berhenti membaca .env dan memakai config yang sudah di-cache. Jika Anda mengubah .env di production (misal memperbaiki password database) tanpa menyegarkan cache, perubahan itu diabaikan dan Anda bingung kenapa masih error.
Aturannya: setiap kali .env berubah di production, jalankan berurutan:
php artisan config:clear
php artisan config:cache
Jangan pernah memanggil env() di dalam kode aplikasi (selain file config) — saat config di-cache, env() mengembalikan null. Selalu akses lewat config('...').
5. Migrasi Database dari MAMP
Kode saja tidak cukup — database lokal MAMP harus dipindahkan. Dua pendekatan:
Opsi A: Jalankan migration di server (jika ada SSH). Setelah .env production benar:
php artisan migrate --force
php artisan db:seed --force # hanya jika perlu data awal
Flag --force wajib karena Laravel menolak migrate di APP_ENV=production tanpa konfirmasi eksplisit — pengaman agar Anda tidak sengaja menjalankan migration destruktif.
Opsi B: Export/import manual (tanpa SSH). Export dari MAMP via phpMyAdmin atau command line:
mysqldump -u root -p nama_db_lokal > backup.sql
Lalu import ke database hosting lewat phpMyAdmin di cPanel. Setelah import, verifikasi charset dan collation (idealnya utf8mb4) agar nama, emoji, dan karakter non-Latin tidak rusak — masalah encoding adalah keluhan paling umum setelah migrasi manual.
Apa pun opsinya: jangan pernah upload file .sql ke folder publik dan hapus backup dari server setelah selesai. File dump berisi seluruh data Anda.
6. Permission Storage dan Cache
Laravel butuh akses tulis ke folder tertentu:
storage/
bootstrap/cache/
Jika muncul error seperti The stream or file could not be opened, biasanya permission belum benar.
Gunakan permission yang aman sesuai hosting. Hindari 777 jika tidak diperlukan. Banyak shared hosting cukup dengan 755 untuk folder dan 644 untuk file, tetapi beberapa konfigurasi butuh penyesuaian.
7. Build Asset Frontend (Vite)
Laravel modern memakai Vite untuk asset. Jangan upload folder node_modules atau menjalankan build di shared hosting — bangun di lokal lalu upload hasilnya:
npm run build
Ini menghasilkan folder public/build berisi CSS/JS terkompilasi plus manifest.json. Upload public/build ke public_html/build. Jika halaman muncul tanpa styling setelah deploy, penyebab tersering: public/build tidak terupload, atau APP_URL salah sehingga path asset meleset. Pastikan juga APP_ENV=production agar Laravel memuat asset dari manifest, bukan dari dev server Vite yang tidak ada di production.
8. Storage Link untuk File Upload
Jika aplikasi menggunakan upload file, jalankan:
php artisan storage:link
Pada shared hosting tanpa SSH, Anda bisa membuat symlink manual jika panel hosting mendukung. Jika tidak, pertimbangkan menyesuaikan disk storage agar file publik disimpan di folder yang memang bisa diakses.
9. Checklist Setelah Launch
Setelah website online, jangan langsung selesai. Lakukan checklist berikut:
- Buka homepage, halaman login, form, dan halaman penting.
- Cek
APP_DEBUG=false. - Cek HTTPS aktif.
- Cek mixed content di browser console.
- Cek form email atau SMTP.
- Cek sitemap dan robots.txt jika website publik.
- Cek broken link.
- Cek halaman 404.
- Submit sitemap ke Google Search Console.
- Pasang Google Analytics atau tracking lain jika dibutuhkan.
Untuk kebutuhan SEO dan indexing, baca juga artikel tentang struktur konten jasa website dan halaman Jasa SEO Maintenance Bali.
Jika website Laravel digunakan untuk bisnis lokal, pastikan juga membaca cara membuat sitemap dan robots.txt untuk website baru serta struktur konten jasa website yang siap SEO, AEO, dan GEO. Dua hal ini membantu website tidak hanya berhasil online, tetapi juga lebih mudah dicrawl dan dipahami mesin pencari.
Hardening Keamanan Sebelum Publik
Struktur folder yang benar sudah menutup risiko terbesar, tapi lengkapi dengan ini sebelum situs diumumkan:
APP_DEBUG=false— wajib. Debug mode membocorkan path, query, dan environment variable ke siapa pun yang memicu error.- Paksa HTTPS — redirect semua trafik ke HTTPS dan pertimbangkan HSTS. Sertifikat gratis via Let's Encrypt tersedia di hampir semua cPanel.
- Batasi akses file sensitif — pastikan
.env,composer.json, danstorage/logstidak dapat diakses dari web. Struktur di luarpublic_htmlsudah menangani ini; verifikasi dengan mencoba membuka URL-nya. - Update dependency — jalankan
composer updatedi lokal secara berkala untuk patch keamanan, uji, lalu deploy ulangvendor. - Nonaktifkan route dev — pastikan tidak ada route debug/telescope yang terbuka di production.
Keamanan di shared hosting terbatas karena Anda berbagi server, tapi langkah di atas menutup kesalahan konfigurasi yang paling sering dieksploitasi.
Troubleshooting Error yang Sering Muncul
Berdasarkan deploy nyata, ini error yang paling sering dan cara membacanya:
| Gejala | Penyebab paling mungkin | Perbaikan |
|--------|-------------------------|-----------|
| Layar putih / HTTP 500 | Path index.php salah, atau APP_DEBUG=false menyembunyikan error | Cek path require, lalu baca storage/logs/laravel.log |
| The stream or file could not be opened | Permission storage/ atau bootstrap/cache/ | Set writable (umumnya 755, sesuaikan hosting) |
| No application encryption key | APP_KEY kosong | Jalankan php artisan key:generate, jangan ubah lagi |
| Halaman tanpa CSS/JS | public/build tidak terupload atau APP_URL salah | Upload ulang build, perbaiki APP_URL |
| Perubahan .env tidak berefek | Config ter-cache | php artisan config:clear lalu config:cache |
| SQLSTATE... Access denied | Kredensial DB .env salah / user belum punya privilege | Verifikasi user/password/host DB di cPanel |
Langkah debugging pertama selalu sama: baca storage/logs/laravel.log. Sebagian besar penyebab error 500 tertulis jelas di sana, bahkan saat APP_DEBUG=false. Aktifkan APP_DEBUG=true hanya sementara di lingkungan yang tidak diakses publik, lalu matikan lagi.
Kapan Harus Pindah ke VPS?
Shared hosting cocok untuk website sederhana, tetapi kurang ideal untuk aplikasi Laravel yang membutuhkan queue, scheduler, websocket, background jobs, atau traffic tinggi.
Pertimbangkan VPS jika:
- Aplikasi memakai queue worker.
- Ada banyak upload file.
- Butuh Redis.
- Butuh cron/scheduler yang stabil.
- Traffic mulai tinggi.
- Butuh kontrol penuh atas Nginx, PHP-FPM, dan deployment pipeline.
FAQ Deploy Laravel dari MAMP ke Hosting
Apakah folder Laravel boleh ditaruh langsung di public_html?
Sebaiknya tidak. Jika seluruh folder Laravel ada di public_html, file sensitif bisa lebih berisiko terbuka jika konfigurasi server salah.
Kenapa website Laravel error 500 setelah upload?
Penyebab umum adalah path index.php salah, .env belum benar, permission storage bermasalah, versi PHP tidak kompatibel, atau vendor belum terupload.
Apakah perlu menjalankan php artisan key:generate?
Perlu jika APP_KEY belum ada. Tetapi untuk production, pastikan key tidak berubah sembarangan karena bisa memengaruhi data terenkripsi dan session.
Apakah Laravel di shared hosting bagus untuk SEO?
Bisa, selama website cepat, mobile-friendly, punya meta tag, sitemap, schema, robots.txt, dan struktur konten yang jelas.
Kesimpulan
Deploy Laravel dari MAMP ke shared hosting bukan sekadar upload file. Struktur folder, .env, permission, cache, HTTPS, dan Search Console perlu diperhatikan agar website aman, stabil, dan siap diindex.
Jika project mulai kompleks, gunakan VPS atau managed hosting agar deployment, queue, scheduler, dan security lebih mudah dikontrol.