Cara Mengatasi Permission Denied pada Folder Storage Laravel
Apa Itu Permission Denied di Laravel?
Laravel membutuhkan akses tulis ke beberapa folder, terutama:
storage/
bootstrap/cache/Jika permission tidak sesuai, dapat muncul error seperti:
Permission deniedatau:
file_put_contents(): Failed to open streamMasalah ini dapat menyebabkan:
Upload file gagal.
Cache gagal dibuat.
Log tidak tersimpan.
Session bermasalah.
File PDF gagal dibuat.
Storage link tidak bekerja.
1. Periksa Owner Folder
Pada VPS Linux, masuk ke folder Laravel:
cd /var/www/appKemudian:
ls -laPeriksa folder:
ls -ld storage
ls -ld bootstrap/cacheContohnya:
drwxr-xr-x root root storageJika PHP-FPM berjalan menggunakan user www-data, tetapi folder dimiliki root, PHP dapat mengalami masalah permission.
2. Ubah Owner Folder
Pada Ubuntu dengan Nginx dan PHP-FPM yang menggunakan www-data:
sudo chown -R www-data:www-data storageKemudian:
sudo chown -R www-data:www-data bootstrap/cacheUntuk memastikan:
ls -ld storage bootstrap/cacheHasilnya kurang lebih:
www-data www-data storage
www-data www-data bootstrap/cacheUser PHP-FPM harus disesuaikan dengan konfigurasi server Anda. Jangan selalu menganggap www-data sebagai user yang benar.
3. Atur Permission Folder
Setelah owner benar:
sudo chmod -R 775 storageKemudian:
sudo chmod -R 775 bootstrap/cachePermission 775 memberikan akses:
Owner → read/write/execute
Group → read/write/execute
Other → read/executeUntuk folder Laravel, pendekatan ini umumnya lebih aman daripada memberikan permission 777.
4. Hindari chmod 777
Kesalahan yang sering dilakukan adalah:
chmod -R 777 storagePermission 777 memberikan akses baca, tulis, dan eksekusi kepada semua user.
Meskipun dapat menghilangkan error permission, cara ini dapat meningkatkan risiko keamanan.
Lebih baik perbaiki:
Owner
Group
Permissionsecara tepat.
5. Periksa Struktur Storage Laravel
Struktur Laravel biasanya:
storage/
├── app/
├── framework/
│ ├── cache/
│ ├── sessions/
│ └── views/
└── logs/Folder-folder tersebut membutuhkan akses tulis dari proses PHP.
Selain storage, Laravel juga membutuhkan:
bootstrap/cacheuntuk menyimpan file cache framework.
6. Buat Storage Link
Jika file upload disimpan pada:
storage/app/publicbuat symbolic link:
php artisan storage:linkHasilnya:
public/storage
↓
storage/app/publicKemudian file dapat diakses melalui:
/storage/nama-file.jpgJika symbolic link sudah ada tetapi bermasalah, periksa:
ls -la public/storage7. Jika Storage Link Bermasalah
Hapus link yang salah:
rm public/storageKemudian buat kembali:
php artisan storage:linkPastikan jangan menghapus folder storage/app/public yang berisi file pengguna.
8. Bersihkan Cache Laravel
Setelah memperbaiki permission:
php artisan optimize:clearKemudian jika production:
php artisan config:cache
php artisan route:cache
php artisan view:cachePastikan command tersebut dijalankan menggunakan user yang sesuai dengan environment deployment.
9. Jika Menggunakan Nginx + PHP-FPM
Contoh arsitektur:
Internet
↓
Nginx
↓
PHP-FPM
↓
Laravel
↓
storage/Periksa user PHP-FPM:
ps aux | grep php-fpmAtau periksa konfigurasi pool:
/etc/php/8.3/fpm/pool.d/www.confCari:
user = www-data
group = www-dataJika ternyata PHP-FPM berjalan sebagai user lain, sesuaikan owner folder Laravel dengan user tersebut.
10. Jika Menggunakan Apache
Pada Ubuntu, Apache biasanya menggunakan:
www-dataPeriksa:
ps aux | grep apacheKemudian sesuaikan owner:
sudo chown -R www-data:www-data storage
sudo chown -R www-data:www-data bootstrap/cache11. Jika Menggunakan cPanel
Pada shared hosting atau cPanel, jangan langsung menggunakan:
chown www-data:www-datakarena user web server biasanya berbeda.
Gunakan user akun hosting sebagai owner file.
Contohnya:
chown -R username:username storageJika tidak memiliki akses SSH, gunakan:
cPanel
↓
File Manager
↓
storage
↓
Change PermissionsPastikan folder dapat dibaca dan ditulis oleh user aplikasi.
12. Periksa Permission Parent Directory
Terkadang permission storage sudah benar tetapi folder induknya tidak dapat diakses.
Contohnya:
/var/www/appPeriksa:
namei -l /var/www/app/storagePerintah tersebut membantu melihat permission setiap folder dalam path.
Semua directory yang dilewati proses PHP harus memiliki permission execute (x) agar dapat diakses.
13. Jika Menggunakan Docker
Pada Docker, masalah permission sering terjadi karena perbedaan user antara host dan container.
Periksa:
docker compose exec app ls -la storageKemudian:
docker compose exec app whoamiJika container menggunakan www-data, Anda dapat memperbaiki:
docker compose exec app \
chown -R www-data:www-data storage bootstrap/cacheSetelah itu:
docker compose exec app \
chmod -R 775 storage bootstrap/cacheKonfigurasi yang tepat tetap bergantung pada user dan volume Docker yang digunakan.
14. Masalah Setelah Git Pull
Error permission sering muncul setelah deployment menggunakan Git.
Contohnya:
Deployment
↓
git pull
↓
File dimiliki user deploy
↓
PHP-FPM menggunakan user lain
↓
Permission DeniedHindari menjalankan semua proses deployment menggunakan root jika tidak diperlukan.
Setelah deployment, periksa:
ls -la storageJika owner berubah, perbaiki:
sudo chown -R www-data:www-data storage bootstrap/cache15. Permission untuk File Upload
Jika aplikasi melakukan upload:
$request->file('image')
->store('uploads', 'public');pastikan:
storage/app/publicdapat ditulis oleh PHP-FPM.
Periksa:
ls -ld storage/app/publicJika diperlukan:
sudo chmod -R 775 storage/app/public16. Permission untuk Log Laravel
Jika muncul error seperti:
storage/logs/laravel.log:
Permission deniedperiksa:
ls -la storage/logsKemudian:
sudo chown -R www-data:www-data storage/logs
sudo chmod -R 775 storage/logsJika log sebelumnya dibuat oleh root, masalah ini cukup sering muncul setelah deployment.
17. Jangan Jalankan Artisan Selalu Sebagai Root
Contohnya:
sudo php artisan migratekemudian file cache atau log dapat dibuat oleh root.
Akibatnya PHP-FPM tidak dapat mengubah file tersebut.
Jika memungkinkan, jalankan command Laravel menggunakan user deployment yang sesuai dengan konfigurasi aplikasi.
Checklist Permission Laravel
Gunakan urutan berikut:
1. Cek user PHP-FPM
↓
2. Cek owner storage
↓
3. Cek owner bootstrap/cache
↓
4. Cek permission folder
↓
5. Cek parent directory
↓
6. Cek storage link
↓
7. Clear Laravel cache
↓
8. Tes upload / loggingPerintah umum pada Ubuntu:
sudo chown -R www-data:www-data storage bootstrap/cache
sudo chmod -R 775 storage bootstrap/cache
php artisan storage:link
php artisan optimize:clearSesuaikan www-data dengan user PHP-FPM pada server Anda.
Kesalahan yang Perlu Dihindari
Menggunakan chmod 777
Jangan menjadikan 777 sebagai solusi utama.
Semua File Dimiliki Root
PHP-FPM belum tentu berjalan sebagai root.
Tidak Memeriksa PHP-FPM
User PHP-FPM menentukan siapa yang membutuhkan akses tulis.
Menjalankan Artisan sebagai Root
Hal ini dapat membuat file cache dan log dimiliki root.
Mengubah Permission Seluruh Project
Tidak semua file Laravel membutuhkan akses tulis.
Fokus utama biasanya:
storage/
bootstrap/cache/Permission Laravel Bersama Ovla Media
Ovla Media dapat membantu melakukan deployment dan maintenance aplikasi Laravel, termasuk:
Konfigurasi permission Linux.
Nginx dan PHP-FPM.
Deployment Laravel.
cPanel.
Docker.
Storage dan upload.
Database.
Laravel Queue.
Backup.
Monitoring server.
Konfigurasi dapat disesuaikan dengan VPS, shared hosting, cPanel, Docker, maupun server internal.
Kesimpulan
Error Permission Denied pada Laravel biasanya terjadi karena user yang menjalankan PHP tidak memiliki izin untuk menulis ke folder yang diperlukan.
Folder utama yang perlu diperhatikan adalah:
storage/
bootstrap/cache/Pada server Ubuntu dengan PHP-FPM www-data, contoh konfigurasi:
sudo chown -R www-data:www-data storage bootstrap/cache
sudo chmod -R 775 storage bootstrap/cacheKemudian:
php artisan storage:link
php artisan optimize:clearYang paling penting, jangan langsung menggunakan chmod 777. Perbaiki owner dan group sesuai user PHP-FPM agar aplikasi tetap dapat berjalan sekaligus menjaga keamanan server.
Artikel Terkait
Cara Mengatasi Could Not Find Driver pada Laravel dan PHP
Error “Could Not Find Driver” pada Laravel biasanya terjadi karena extension PHP untuk database yang digunakan belum terpasang atau belum aktif. Masalah ini sering ditemukan saat menggunakan MySQL, PostgreSQL, SQLite, atau aplikasi Laravel pada server production.
Cara Mencegah Transaksi Ganda dari Webhook Payment Gateway
Webhook payment gateway dapat terkirim lebih dari satu kali karena retry atau gangguan jaringan. Jika tidak ditangani dengan benar, satu pembayaran dapat tercatat sebagai transaksi ganda. Laravel dapat mencegah masalah ini dengan idempotency, unique transaction ID, database transaction, dan validasi status pembayaran.
Cara Mengatasi Database Connection Refused pada Laravel
Error “Database Connection Refused” pada Laravel biasanya terjadi ketika aplikasi tidak dapat terhubung ke server database. Penyebabnya dapat berasal dari konfigurasi .env, database yang belum berjalan, port yang salah, firewall, Docker, atau konfigurasi server. Berikut langkah sederhana untuk menemukan dan mengatasinya.