Laravel 11 dirilis awal 2024 dengan struktur yang lebih ringan: tidak ada lagi file config/cors.php, config/view.php, dan banyak default yang disederhanakan. PHP 8.3 menjadi requirement minimum. Bagi developer Indonesia yang ingin deploy aplikasi Laravel 11 ke VPS production, artikel ini adalah guide paling lengkap yang Anda butuhkan.
Saya asumsikan Anda sudah punya VPS dengan Ubuntu 24.04 + LEMP stack terinstall (lihat panduan setup VPS saya sebelumnya). Jika belum, setup dulu fondasinya. Kalau sudah, mari deploy.
1. Persiapan di Local / Repository GitHub
Sebelum deploy, pastikan project Laravel 11 Anda sudah siap production:
1.1 Update .env.example untuk Production
APP_NAME="Aplikasi Saya"
APP_ENV=production
APP_KEY=
APP_DEBUG=false
APP_URL=https://aplikasi-saya.com
LOG_CHANNEL=stack
LOG_LEVEL=error
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=aplikasi_db
DB_USERNAME=aplikasi_user
DB_PASSWORD=password_kuat_random
BROADCAST_CONNECTION=log
CACHE_STORE=file
FILESYSTEM_DISK=local
QUEUE_CONNECTION=database
SESSION_DRIVER=file
SESSION_LIFETIME=120
MAIL_MAILER=logCatatan penting:
APP_DEBUG=false— Jangan pernah true di production! Error akan expose informasi sensitif.APP_KEY— Biarkan kosong, akan digenerate di server.DB_PASSWORD— Gunakan password random 16+ karakter. Simpan di password manager.
1.2 Pastikan .gitignore Sudah Benar
File ini seharusnya sudah di-ignore Laravel default, tapi double-check:
/.env
/.env.backup
/.env.production
/storage/*.key
/vendor
/node_modules1.3 Commit & Push ke GitHub
git add .
git commit -m "Production ready: Laravel 11"
git push origin main2. Clone Project ke VPS
SSH ke VPS Anda (sebagai user non-root):
ssh zulfianto@IP_VPS -p 2222Buat folder untuk aplikasi:
sudo mkdir -p /var/www/aplikasi-saya
sudo chown -R $USER:$USER /var/www/aplikasi-saya
cd /var/www/aplikasi-sayaClone repository:
git clone https://github.com/username/repo.git .Jika repository private, setup SSH key di VPS dan tambahkan ke GitHub, atau gunakan Personal Access Token.
3. Install Dependencies
3.1 Install PHP Dependencies (Composer)
composer install --no-dev --optimize-autoloaderFlag penting:
--no-dev— Tidak install package development (phpunit, faker, dll). Hemat space & lebih aman.--optimize-autoloader— Mempercepat autoloading class di production.
3.2 Install Node.js Dependencies & Build (Jika pakai Vite/Breeze/Jetstream)
npm ci
npm run buildFlag npm ci lebih cepat dan konsisten daripada npm install untuk production.
Verifikasi folder public/build sudah ada (berisi asset compiled).
4. Setup Environment & Application Key
Copy environment file:
cp .env.example .envEdit dengan data production:
nano .envIsi database credentials, app URL, dan konfigurasi lainnya. Jangan lupa:
- APP_URL pakai HTTPS
- DB_PASSWORD yang kuat
- MAIL_* jika perlu kirim email
Generate application key:
php artisan key:generateLaravel akan otomatis generate APP_KEY dan simpan ke .env.
5. Setup Database MySQL
Login ke MySQL sebagai root:
sudo mysql -u root -pBuat database dan user:
CREATE DATABASE aplikasi_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'aplikasi_user'@'localhost' IDENTIFIED BY 'password_kuat_random';
GRANT ALL PRIVILEGES ON aplikasi_db.* TO 'aplikasi_user'@'localhost';
FLUSH PRIVILEGES;
EXIT;Test koneksi dari Laravel:
php artisan migrate:statusJika muncul daftar migration, koneksi berhasil.
Jalankan Migration & Seed (Hati-hati!)
php artisan migrate --forceFlag --force wajib di production karena Laravel akan konfirmasi “Are you sure?” tanpa flag ini.
Kalau perlu seed:
php artisan db:seed --force6. Konfigurasi Nginx Server Block untuk Laravel
Laravel membutuhkan konfigurasi khusus: semua request harus diarahkan ke index.php di folder public.
Buat server block:
sudo nano /etc/nginx/sites-available/aplikasi-sayaIsi konfigurasi:
server {
listen 80;
listen [::]:80;
server_name aplikasi-saya.com www.aplikasi-saya.com;
root /var/www/aplikasi-saya/public;
index index.php index.html;
charset utf-8;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location = /favicon.ico { access_log off; log_not_found off; }
location = /robots.txt { access_log off; log_not_found off; }
error_page 404 /index.php;
location ~ \.php$ {
fastcgi_pass unix:/var/run/php/php8.3-fpm.sock;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ /\.(?!well-known).* {
deny all;
}
# Security headers
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
}Penjelasan kunci:
rootmengarah ke/public— jangan ke root project! File sensitif seperti .env tidak boleh accessible dari web.try_filesmengarahkan semua request keindex.php— ini mekanisme routing Laravel.fastcgi_passke PHP 8.3 FPM socket.- Security headers mencegah clickjacking, MIME sniffing, dan XSS.
Aktifkan site:
sudo ln -s /etc/nginx/sites-available/aplikasi-saya /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl restart nginxnginx -t adalah command wajib untuk test konfigurasi sebelum restart. Kalau ada typo, Nginx akan bilang di baris mana.
7. Setup Permissions (Yang Paling Sering Salah!)
Laravel butuh write access ke folder storage dan bootstrap/cache. Ini adalah error paling umum: “The stream or file could not be opened.”
Atur ownership:
sudo chown -R $USER:www-data /var/www/aplikasi-saya
sudo chmod -R 755 /var/www/aplikasi-saya
sudo chmod -R 775 /var/www/aplikasi-saya/storage
sudo chmod -R 775 /var/www/aplikasi-saya/bootstrap/cachePenjelasan:
$USER:www-data— User Anda sebagai owner, web server (www-data) sebagai group.775— Owner & group bisa read/write/execute. Others hanya read/execute.
Jika masih error, cek SELinux (jika aktif):
sudo chcon -R -t httpd_sys_rw_content_t /var/www/aplikasi-saya/storage8. Setup SSL dengan Let’s Encrypt
Install certbot jika belum:
sudo apt install certbot python3-certbot-nginx -yGenerate SSL untuk domain:
sudo certbot --nginx -d aplikasi-saya.com -d www.aplikasi-saya.comPilih redirect HTTP ke HTTPS. Certbot akan otomatis edit konfigurasi Nginx Anda.
Verifikasi auto-renewal:
sudo certbot renew --dry-runTest: Buka https://aplikasi-saya.com. Harus muncul lock icon hijau.
9. Optimasi Laravel untuk Production
9.1 Cache Configuration
Laravel 11 bisa cache config, routes, dan views untuk performa lebih baik:
php artisan config:cache
php artisan route:cache
php artisan view:cache
php artisan event:cacheCatatan: Setelah config:cache, Laravel hanya membaca config dari cache. Jika Anda edit .env, jalankan php artisan config:clear lalu config:cache lagi.
9.2 Optimize Composer Autoloader
composer dump-autoload --optimize9.3 Set Proper File Permissions untuk Storage
php artisan storage:linkPastikan symlink public/storage mengarah ke storage/app/public.
10. Setup Queue Worker dengan Supervisor
Jika aplikasi Anda pakai queue (email, job, notifikasi), jangan jalankan php artisan queue:work manual. Gunakan Supervisor agar worker selalu jalan dan auto-restart kalau crash.
Install Supervisor:
sudo apt install supervisor -yBuat konfigurasi:
sudo nano /etc/supervisor/conf.d/aplikasi-saya-worker.confIsi:
[program:aplikasi-saya-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /var/www/aplikasi-saya/artisan queue:work --sleep=3 --tries=3 --max-time=3600
autostart=true
autorestart=true
stopasgroup=true
killasgroup=true
user=www-data
numprocs=1
redirect_stderr=true
stdout_logfile=/var/www/aplikasi-saya/storage/logs/worker.log
stopwaitsecs=3600Update Supervisor:
sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl start aplikasi-saya-workerCek status:
sudo supervisorctl statusHarus muncul: aplikasi-saya-worker RUNNING
11. Setup Laravel Scheduler dengan Cron
Laravel punya task scheduler yang powerful. Aktifkan dengan cron:
crontab -eTambahkan:
* * * * * cd /var/www/aplikasi-saya && php artisan schedule:run >> /dev/null 2>&1Ini akan mengecek setiap menit: apakah ada scheduled task yang harus dijalankan. Laravel akan handle sisanya.
Verifikasi scheduled tasks:
php artisan schedule:list12. Troubleshooting Umum Deploy Laravel 11
Error: 500 Server Error — “The stream or file could not be opened”
Solusi: Permission storage. Jalankan:
sudo chmod -R 775 /var/www/aplikasi-saya/storage
sudo chown -R $USER:www-data /var/www/aplikasi-saya/storageError: 404 Not Found untuk Semua Route
Solusi: Nginx try_files tidak benar. Pastikan:
try_files $uri $uri/ /index.php?$query_string;Jangan lupa ? sebelum $query_string.
Error: “No application encryption key has been specified”
Solusi: Jalankan php artisan key:generate. Pastikan .env readable dan APP_KEY terisi.
Error: PHP Version Mismatch
Solusi: Laravel 11 butuh PHP 8.3+. Cek:
php -vJika masih PHP 8.1, upgrade atau ganti PHP-FPM socket di Nginx ke php8.3-fpm.sock.
Error: CSS/JS Tidak Load (404)
Solusi: Pastikan npm run build sudah dijalankan dan folder public/build ada. Jika masih tidak load, cek APP_URL di .env — harus match dengan domain.
Error: Database Connection Refused
Solusi: Cek MySQL running: sudo systemctl status mysql. Cek DB_HOST di .env — untuk VPS local, pakai 127.0.0.1 bukan localhost.
13. Deploy Update di Masa Depan (Zero Downtime)
Setelah setup awal, deploy update menjadi sangat mudah. Buat script sederhana:
nano /usr/local/bin/deploy-aplikasi-saya.shIsi:
#!/bin/bash
cd /var/www/aplikasi-saya
git pull origin main
composer install --no-dev --optimize-autoloader
php artisan migrate --force
php artisan config:cache
php artisan route:cache
php artisan view:cache
php artisan queue:restart
sudo systemctl restart php8.3-fpm
echo "Deploy selesai: $(date)"Jadikan executable:
chmod +x /usr/local/bin/deploy-aplikasi-saya.shDeploy selanjutnya cukup:
/usr/local/bin/deploy-aplikasi-saya.shAtau setup GitHub Actions untuk auto-deploy setiap push ke main (lihat panduan CI/CD di kursus saya).
Kesimpulan: Laravel 11 Production-Ready
Anda sekarang punya aplikasi Laravel 11 yang:
- ✅ Deploy di VPS Ubuntu 24.04
- ✅ Nginx + PHP 8.3 FPM
- ✅ MySQL database terkonfigurasi
- ✅ SSL HTTPS aktif
- ✅ Permission aman
- ✅ Queue worker dengan Supervisor
- ✅ Scheduler dengan Cron
- ✅ Config & Route cached untuk performa
- ✅ Security headers aktif
Setup ini sudah cukup untuk handle ribuan pengunjung per hari. Kalau traffic naik, scale dengan:
- Upgrade VPS RAM/CPU
- Tambah Redis untuk cache & session
- Setup load balancer dengan multiple VPS
- Gunakan CDN untuk asset static
Semua konsep di atas — dari setup VPS, install LEMP, deploy Laravel, sampai scale — saya ajarkan secara praktis dan terstruktur di kursus Belajar Server. Bukan sekadar tutorial terpisah, tapi kurikulum lengkap yang membawa Anda dari pemula server sampai bisa deploy dan manage aplikasi production sendiri.
Jika stuck saat deploy, cek log Laravel di /var/www/aplikasi-saya/storage/logs/ dan log Nginx di /var/log/nginx/error.log. Error log adalah teman terbaik developer.
— Ditulis untuk Laravel 11 + PHP 8.3 + Ubuntu 24.04 LTS, Mei 2026









