Deploy Laravel 11 di VPS dengan Nginx + PHP 8.3: Complete Guide

by -8 Views
Deploy Laravel 11 di VPS dengan Nginx

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=log

Catatan 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_modules

1.3 Commit & Push ke GitHub

git add .
git commit -m "Production ready: Laravel 11"
git push origin main

2. Clone Project ke VPS

SSH ke VPS Anda (sebagai user non-root):

ssh zulfianto@IP_VPS -p 2222

Buat folder untuk aplikasi:

sudo mkdir -p /var/www/aplikasi-saya
sudo chown -R $USER:$USER /var/www/aplikasi-saya
cd /var/www/aplikasi-saya

Clone 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-autoloader

Flag 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 build

Flag 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 .env

Edit dengan data production:

nano .env

Isi 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:generate

Laravel akan otomatis generate APP_KEY dan simpan ke .env.


5. Setup Database MySQL

Login ke MySQL sebagai root:

sudo mysql -u root -p

Buat 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:status

Jika muncul daftar migration, koneksi berhasil.

Jalankan Migration & Seed (Hati-hati!)

php artisan migrate --force

Flag --force wajib di production karena Laravel akan konfirmasi “Are you sure?” tanpa flag ini.

Kalau perlu seed:

php artisan db:seed --force

6. 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-saya

Isi 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:

  • root mengarah ke /public — jangan ke root project! File sensitif seperti .env tidak boleh accessible dari web.
  • try_files mengarahkan semua request ke index.php — ini mekanisme routing Laravel.
  • fastcgi_pass ke 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 nginx

nginx -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/cache

Penjelasan:

  • $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/storage

8. Setup SSL dengan Let’s Encrypt

Install certbot jika belum:

sudo apt install certbot python3-certbot-nginx -y

Generate SSL untuk domain:

sudo certbot --nginx -d aplikasi-saya.com -d www.aplikasi-saya.com

Pilih redirect HTTP ke HTTPS. Certbot akan otomatis edit konfigurasi Nginx Anda.

Verifikasi auto-renewal:

sudo certbot renew --dry-run

Test: 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:cache

Catatan: 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 --optimize

9.3 Set Proper File Permissions untuk Storage

php artisan storage:link

Pastikan 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 -y

Buat konfigurasi:

sudo nano /etc/supervisor/conf.d/aplikasi-saya-worker.conf

Isi:

[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=3600

Update Supervisor:

sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl start aplikasi-saya-worker

Cek status:

sudo supervisorctl status

Harus muncul: aplikasi-saya-worker RUNNING


11. Setup Laravel Scheduler dengan Cron

Laravel punya task scheduler yang powerful. Aktifkan dengan cron:

crontab -e

Tambahkan:

* * * * * cd /var/www/aplikasi-saya && php artisan schedule:run >> /dev/null 2>&1

Ini akan mengecek setiap menit: apakah ada scheduled task yang harus dijalankan. Laravel akan handle sisanya.

Verifikasi scheduled tasks:

php artisan schedule:list

12. 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/storage

Error: 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 -v

Jika 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.sh

Isi:

#!/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.sh

Deploy selanjutnya cukup:

/usr/local/bin/deploy-aplikasi-saya.sh

Atau 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

No More Posts Available.

No more pages to load.