# 🔧 Laravel Permission Fix Guide untuk Docker ## 🎯 Masalah yang Diselesaikan **Error yang umum terjadi:** ``` The stream or file "/var/www/html/storage/logs/laravel.log" could not be opened in append mode: Failed to open stream: Permission denied ``` **Root Cause:** - Laravel tidak bisa menulis ke direktori `storage/logs/` - Permission dan ownership direktori storage tidak sesuai - Direktori storage yang diperlukan belum dibuat ## 🚀 Solusi Quick Fix ### **Option 1: Automatic Fix (Recommended)** ```bash # Fix semua permission issues otomatis ./docker-fix-permissions.sh dev # Untuk production ./docker-fix-permissions.sh prod ``` ### **Option 2: Manual Fix** ```bash # Buat direktori yang diperlukan docker-compose exec app mkdir -p /var/www/html/storage/logs docker-compose exec app mkdir -p /var/www/html/storage/framework/cache docker-compose exec app mkdir -p /var/www/html/storage/framework/sessions docker-compose exec app mkdir -p /var/www/html/storage/framework/views # Fix ownership docker-compose exec app chown -R www-data:www-data /var/www/html/storage docker-compose exec app chown -R www-data:www-data /var/www/html/bootstrap/cache # Fix permissions docker-compose exec app chmod -R 775 /var/www/html/storage docker-compose exec app chmod -R 775 /var/www/html/bootstrap/cache ``` ### **Option 3: Rebuild Containers (Jika masalah persisten)** ```bash # Clean rebuild containers ./docker-rebuild.sh dev ``` ## 🔍 Verifikasi Fix Berhasil ### **1. Cek Permission Direktori** ```bash # Lihat permission storage docker-compose exec app ls -la /var/www/html/storage/ # Cek ownership logs docker-compose exec app ls -la /var/www/html/storage/logs/ ``` **Output yang benar:** ``` drwxrwxr-x 5 www-data www-data 4096 Jun 10 15:01 storage drwxrwxr-x 2 www-data www-data 4096 Jun 10 15:01 logs ``` ### **2. Test Laravel Logging** ```bash # Test write ke log docker-compose exec app php -r "file_put_contents('/var/www/html/storage/logs/laravel.log', 'Test log: ' . date('Y-m-d H:i:s') . PHP_EOL, FILE_APPEND);" # Cek isi log docker-compose exec app tail -5 /var/www/html/storage/logs/laravel.log ``` ### **3. Test Laravel Artisan** ```bash # Test cache clear docker-compose exec app php artisan cache:clear # Test storage link docker-compose exec app php artisan storage:link # Test route cache docker-compose exec app php artisan route:cache ``` ## 🛡️ Prevention - Dockerfile Updates **Dockerfile sudah diperbarui untuk mencegah masalah ini:** ```dockerfile # Create necessary directories and set permissions RUN mkdir -p /var/www/html/storage/logs \ && mkdir -p /var/www/html/storage/framework/cache \ && mkdir -p /var/www/html/storage/framework/sessions \ && mkdir -p /var/www/html/storage/framework/views \ && mkdir -p /var/www/html/storage/app \ && mkdir -p /var/www/html/bootstrap/cache \ && chown -R www-data:www-data /var/www/html \ && chmod -R 775 /var/www/html/storage \ && chmod -R 775 /var/www/html/bootstrap/cache ``` ## 🔧 Script Features ### **`docker-fix-permissions.sh`** - ✅ **Auto-detect environment** (dev/prod) - ✅ **Create missing directories** - ✅ **Fix ownership** (www-data:www-data) - ✅ **Set proper permissions** (775 untuk storage) - ✅ **Test logging functionality** - ✅ **Create storage link** - ✅ **Show before/after permissions** ### **Usage Examples** ```bash # Fix development environment ./docker-fix-permissions.sh dev # Fix production environment ./docker-fix-permissions.sh prod # Show help ./docker-fix-permissions.sh --help ``` ## 🚨 Common Issues & Solutions ### **1. Permission Denied setelah Fix** **Cause:** Volume mounting conflict **Solution:** ```bash # Cek volume mounts docker-compose config # Restart containers docker-compose restart app # Re-run permission fix ./docker-fix-permissions.sh dev ``` ### **2. Ownership reverted setelah restart** **Cause:** Volume mounting dari host **Solution:** ```bash # Fix di host system juga sudo chown -R $(id -u):$(id -g) storage/ chmod -R 775 storage/ # Atau gunakan named volumes di docker-compose ``` ### **3. Log file tetap tidak bisa ditulis** **Cause:** Log file sudah ada dengan permission salah **Solution:** ```bash # Hapus log file lama docker-compose exec app rm -f /var/www/html/storage/logs/laravel.log # Re-run permission fix ./docker-fix-permissions.sh dev ``` ### **4. Selinux/AppArmor blocking** **Cause:** Security policies **Solution:** ```bash # Disable selinux temporarily (CentOS/RHEL) sudo setenforce 0 # Check AppArmor status (Ubuntu) sudo aa-status ``` ## 📁 Directory Structure yang Benar Setelah fix, struktur direktori storage harus seperti ini: ``` storage/ ├── app/ │ ├── public/ │ └── .gitkeep ├── framework/ │ ├── cache/ │ ├── sessions/ │ ├── testing/ │ └── views/ └── logs/ ├── laravel.log └── .gitkeep ``` ## 🎯 Best Practices 1. **Always use scripts**: Gunakan `docker-fix-permissions.sh` untuk consistency 2. **Regular checks**: Monitor permission setelah update containers 3. **Volume strategy**: Gunakan named volumes untuk persistent storage 4. **Backup first**: Backup data sebelum fix permission 5. **Test thoroughly**: Verify semua Laravel functionality setelah fix ## 📞 Troubleshooting Commands ```bash # Debug permission issues docker-compose exec app ls -laR /var/www/html/storage/ # Check Laravel configuration docker-compose exec app php artisan config:show logging # Monitor Laravel logs docker-compose exec app tail -f /var/www/html/storage/logs/laravel.log # Test file writing docker-compose exec app touch /var/www/html/storage/test.txt # Check container user docker-compose exec app whoami docker-compose exec app id ``` --- **✅ Dengan mengikuti panduan ini, masalah Laravel permission di Docker container akan teratasi.**