Table of Contents
▼Deploy aplikasi Laravel pertama kali ke VPS bisa jadi pengalaman yang mendebarkan sekaligus menegangkan.
Banyak developer pemula yang sudah lancar coding di localhost, tapi bingung ketika harus deploy ke server production.
Error "500 Internal Server Error", permission denied, atau database connection failed adalah masalah klasik yang hampir pasti kamu temui.
Tutorial ini akan memandu kamu step-by-step deploy Laravel ke VPS DigitalOcean menggunakan Ubuntu, nginx, php-fpm, dan SSL gratis dari Let's Encrypt.
Semua dijelaskan dengan bahasa yang mudah dipahami, plus troubleshooting untuk error yang paling sering muncul.
Persiapan Server Ubuntu untuk Laravel Production
Sebelum mulai deploy, kamu perlu menyiapkan server Ubuntu yang fresh dan bersih.
DigitalOcean menyediakan droplet Ubuntu yang sangat cocok untuk pemula karena proses setupnya straightforward.
Buat Droplet DigitalOcean
Login ke dashboard DigitalOcean dan buat droplet baru dengan spesifikasi minimal:
- Ubuntu 22.04 LTS (versi long-term support yang stabil)
- Minimal 1GB RAM (cukup untuk aplikasi Laravel kecil-menengah)
- Pilih region Singapore atau Bangalore (latency lebih rendah untuk user Indonesia)
- Aktifkan monitoring gratis untuk tracking resource usage
Setelah droplet dibuat, kamu akan mendapat IP address dan root password via email.
Update System Package
Langkah pertama setelah SSH ke server adalah update semua package ke versi terbaru.
ssh root@your_server_ip
apt update && apt upgrade -y
Proses ini memastikan semua security patch dan bug fix sudah terinstall.
Install Software Dependencies
Laravel membutuhkan beberapa software utama untuk bisa berjalan di production.
apt install -y nginx mysql-server php8.2-fpm php8.2-mysql php8.2-mbstring php8.2-xml php8.2-bcmath php8.2-curl php8.2-zip unzip git
Package-package ini adalah fondasi dasar untuk menjalankan Laravel:
- nginx: web server yang lightweight dan cepat
- mysql-server: database server untuk menyimpan data aplikasi
- php8.2-fpm: FastCGI Process Manager untuk menjalankan PHP
- php extensions: library tambahan yang Laravel butuhkan
Verifikasi instalasi PHP dengan command:
php -v
Kamu harus melihat output PHP 8.2 atau lebih tinggi.
Install Composer
Composer adalah dependency manager untuk PHP yang wajib ada untuk Laravel.
curl -sS https://getcomposer.org/installer | php
mv composer.phar /usr/local/bin/composer
chmod +x /usr/local/bin/composer
Test instalasi Composer:
composer --version
Setup Firewall
Aktifkan UFW (Uncomplicated Firewall) dan buka port yang diperlukan.
ufw allow OpenSSH
ufw allow 'Nginx Full'
ufw enable
Command ini memastikan hanya port SSH dan HTTP/HTTPS yang terbuka untuk akses publik.
Install dan Konfigurasi Nginx dengan PHP-FPM
Nginx dan PHP-FPM harus dikonfigurasi dengan benar agar Laravel bisa serve request dengan optimal.
Konfigurasi PHP-FPM
Edit file konfigurasi PHP-FPM untuk performa yang lebih baik.
nano /etc/php/8.2/fpm/php.ini
Cari dan ubah parameter berikut:
upload_max_filesize = 50M
post_max_size = 50M
max_execution_time = 300
memory_limit = 256M
Setting ini penting agar aplikasi Laravel bisa handle upload file besar dan proses yang kompleks.
Restart PHP-FPM untuk apply perubahan:
systemctl restart php8.2-fpm
Buat Server Block Nginx
Server block adalah konfigurasi virtual host di nginx yang menentukan bagaimana request diproses.
Buat file konfigurasi baru:
nano /etc/nginx/sites-available/laravel
Paste konfigurasi berikut:
server {
listen 80;
server_name your_domain.com www.your_domain.com;
root /var/www/laravel/public;
add_header X-Frame-Options "SAMEORIGIN";
add_header X-Content-Type-Options "nosniff";
index index.php;
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.2-fpm.sock;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ /\.(?!well-known).* {
deny all;
}
}
Ganti your_domain.com dengan domain kamu yang sebenarnya.
Parameter root mengarah ke folder public Laravel, bukan root folder project.
Aktifkan Server Block
Buat symbolic link dari sites-available ke sites-enabled:
ln -s /etc/nginx/sites-available/laravel /etc/nginx/sites-enabled/
Hapus default server block yang tidak diperlukan:
rm /etc/nginx/sites-enabled/default
Test konfigurasi nginx untuk memastikan tidak ada syntax error:
nginx -t
Jika output menunjukkan "syntax is ok", restart nginx:
systemctl restart nginx
Setup MySQL Database dan User Permissions
Database adalah komponen critical untuk aplikasi Laravel yang menyimpan semua data user dan aplikasi.
Amankan MySQL Installation
Jalankan script security bawaan MySQL:
mysql_secure_installation
Ikuti prompt interaktif dan jawab:
- Set root password: Yes (pilih password yang kuat)
- Remove anonymous users: Yes
- Disallow root login remotely: Yes
- Remove test database: Yes
- Reload privilege tables: Yes
Langkah ini menutup celah keamanan default MySQL yang sering dieksploitasi.
Buat Database dan User
Login ke MySQL sebagai root:
mysql -u root -p
Buat database baru untuk aplikasi Laravel:
CREATE DATABASE laravel_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Character set utf8mb4 penting untuk support emoji dan karakter unicode lengkap.
Buat user khusus untuk database ini:
CREATE USER 'laravel_user'@'localhost' IDENTIFIED BY 'strong_password_here';
Berikan permission yang diperlukan:
GRANT ALL PRIVILEGES ON laravel_db.* TO 'laravel_user'@'localhost';
FLUSH PRIVILEGES;
EXIT;
Principle of least privilege: user aplikasi hanya punya akses ke database yang dibutuhkan, bukan semua database.
Test Koneksi Database
Verifikasi user baru bisa connect ke database:
mysql -u laravel_user -p laravel_db
Jika berhasil login, database setup sudah benar.
Deploy Laravel Code dengan Git dan Composer
Sekarang saatnya deploy kode Laravel yang sudah kamu develop di local.
Clone Repository dari Git
Pindah ke directory web server:
cd /var/www
Clone repository Laravel kamu:
git clone https://github.com/username/laravel-project.git laravel
cd laravel
Jika repository private, kamu perlu setup SSH key atau personal access token terlebih dahulu.
Install Dependencies dengan Composer
Install semua package Laravel yang didefinisikan di composer.json:
composer install --optimize-autoloader --no-dev
Flag --no-dev memastikan package development tidak terinstall di production.
Flag --optimize-autoloader membuat autoloading lebih cepat dengan class map yang optimized.
Konfigurasi Environment File
Copy template environment file:
cp .env.example .env
Edit file .env dengan konfigurasi production:
nano .env
Update parameter kritis:
APP_NAME=Laravel
APP_ENV=production
APP_KEY=
APP_DEBUG=false
APP_URL=https://your_domain.com
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel_db
DB_USERNAME=laravel_user
DB_PASSWORD=strong_password_here
SESSION_DRIVER=file
CACHE_DRIVER=file
QUEUE_CONNECTION=sync
Setting APP_DEBUG=false sangat penting untuk production agar detail error tidak exposed ke publik.
Generate application key:
php artisan key:generate
Command ini akan otomatis mengisi APP_KEY di file .env.
Jalankan Database Migration
Eksekusi migration untuk membuat struktur tabel database:
php artisan migrate --force
Flag --force diperlukan karena environment di set ke production.
Jika aplikasi kamu punya seeder untuk initial data, jalankan juga:
php artisan db:seed --force
Set Correct File Permissions
Laravel butuh write permission ke folder storage dan bootstrap/cache.
chown -R www-data:www-data /var/www/laravel
chmod -R 755 /var/www/laravel
chmod -R 775 /var/www/laravel/storage
chmod -R 775 /var/www/laravel/bootstrap/cache
User www-data adalah user yang menjalankan nginx dan php-fpm.
Permission 775 pada storage dan cache memungkinkan Laravel menulis log, session, dan cache files.
Optimize Laravel untuk Production
Jalankan command optimize untuk performance maksimal:
php artisan config:cache
php artisan route:cache
php artisan view:cache
Command-command ini membuat cached version dari config, routes, dan views yang jauh lebih cepat dibaca.
Kesulitan dengan tugas programming atau butuh bantuan coding? KerjaKode siap membantu menyelesaikan tugas IT dan teknik informatika Anda. Dapatkan bantuan profesional di jasa tugas IT KerjaKode.
Install SSL Certificate dengan Let's Encrypt
SSL adalah must-have untuk aplikasi production modern.
Install Certbot:
apt install -y certbot python3-certbot-nginx
Generate dan install certificate:
certbot --nginx -d your_domain.com -d www.your_domain.com
Certbot akan otomatis memodifikasi konfigurasi nginx untuk redirect HTTP ke HTTPS.
Test renewal process:
certbot renew --dry-run
Certificate akan auto-renew sebelum expired melalui cron job yang dibuat certbot.
Troubleshooting Error Deploy yang Sering Muncul
Hampir tidak ada deploy yang berjalan mulus di attempt pertama.
Berikut error paling umum dan cara fix-nya yang terbukti work.
Error 500 Internal Server Error
Error ini adalah masalah paling frustrating karena tidak memberikan informasi spesifik.
Penyebab umum:
- Permission folder storage atau bootstrap/cache salah
- APP_KEY tidak di-generate
- Syntax error di file .env
Cara troubleshoot:
Check log Laravel:
tail -f /var/www/laravel/storage/logs/laravel.log
Check log nginx:
tail -f /var/nginx/error.log
Fix permission jika ada error write:
chmod -R 775 /var/www/laravel/storage
chmod -R 775 /var/www/laravel/bootstrap/cache
Error 502 Bad Gateway
Error ini muncul ketika nginx tidak bisa communicate dengan php-fpm.
Penyebab umum:
- PHP-FPM service tidak running
- Socket path di nginx config tidak match dengan php-fpm config
Cara troubleshoot:
Check status php-fpm:
systemctl status php8.2-fpm
Jika stopped, start service:
systemctl start php8.2-fpm
Verifikasi socket path di nginx config match dengan php-fpm:
ls -la /var/run/php/php8.2-fpm.sock
Error Database Connection Refused
Laravel tidak bisa connect ke MySQL database.
Penyebab umum:
- MySQL service tidak running
- Credential database di .env salah
- User database tidak punya permission yang cukup
Cara troubleshoot:
Check status MySQL:
systemctl status mysql
Test koneksi manual dengan credential di .env:
mysql -u laravel_user -p -h 127.0.0.1 laravel_db
Jika gagal, berarti ada masalah di credential atau permission.
Re-grant permission di MySQL:
GRANT ALL PRIVILEGES ON laravel_db.* TO 'laravel_user'@'localhost';
FLUSH PRIVILEGES;
Error File Not Found untuk Assets
CSS, JavaScript, atau image tidak loading dengan benar.
Penyebab umum:
- APP_URL di .env tidak match dengan domain sebenarnya
- Symlink storage tidak dibuat
Cara troubleshoot:
Buat symlink untuk public storage:
php artisan storage:link
Update APP_URL di .env:
APP_URL=https://your_domain.com
Clear cache:
php artisan config:cache
Error Class Not Found atau Vendor Autoload
Composer dependencies tidak terinstall dengan benar.
Cara troubleshoot:
Regenerate autoload files:
composer dump-autoload
Jika masih error, reinstall dependencies:
rm -rf vendor/
composer install --optimize-autoloader --no-dev
Error Permission Denied untuk Storage
Laravel tidak bisa write ke folder storage atau cache.
Cara troubleshoot:
Set permission yang benar:
chown -R www-data:www-data /var/www/laravel/storage
chown -R www-data:www-data /var/www/laravel/bootstrap/cache
chmod -R 775 /var/www/laravel/storage
chmod -R 775 /var/www/laravel/bootstrap/cache
Verify ownership:
ls -la /var/www/laravel/storage
Output harus menunjukkan owner adalah www-data.
Best Practices Production Deployment
Deploy bukan hanya soal membuat aplikasi running, tapi juga maintainable dan secure.
Setup Automated Deployment
Buat script bash untuk automate deployment process:
#!/bin/bash
cd /var/www/laravel
git pull origin main
composer install --optimize-autoloader --no-dev
php artisan migrate --force
php artisan config:cache
php artisan route:cache
php artisan view:cache
systemctl restart php8.2-fpm
Simpan script ini dan jalankan setiap kali deploy update.
Monitoring dan Logging
Install monitoring tools untuk track performa aplikasi.
Setup log rotation agar disk tidak penuh:
nano /etc/logrotate.d/laravel
Tambahkan konfigurasi:
/var/www/laravel/storage/logs/*.log {
daily
missingok
rotate 14
compress
delaycompress
notifempty
create 0640 www-data www-data
}
Backup Database Otomatis
Buat cron job untuk backup database harian:
crontab -e
Tambahkan line:
0 2 * * * mysqldump -u laravel_user -pYOUR_PASSWORD laravel_db > /backup/laravel_db_$(date +\%Y\%m\%d).sql
Backup akan jalan setiap hari jam 2 pagi.
Security Hardening
Disable function PHP yang berbahaya di php.ini:
disable_functions = exec,passthru,shell_exec,system,proc_open,popen
Setup fail2ban untuk protect dari brute force:
apt install -y fail2ban
systemctl enable fail2ban
systemctl start fail2ban
Setup Queue Worker untuk Background Job
Jika aplikasi kamu pakai queue, setup supervisor untuk manage worker.
Install supervisor:
apt install -y supervisor
Buat konfigurasi worker:
nano /etc/supervisor/conf.d/laravel-worker.conf
Paste konfigurasi:
[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /var/www/laravel/artisan queue:work --sleep=3 --tries=3
autostart=true
autorestart=true
user=www-data
numprocs=2
redirect_stderr=true
stdout_logfile=/var/www/laravel/storage/logs/worker.log
Reload supervisor:
supervisorctl reread
supervisorctl update
supervisorctl start laravel-worker:*
Kesimpulan
Deploy Laravel ke VPS DigitalOcean memang butuh effort dan understanding tentang server administration.
Tapi dengan mengikuti step-by-step guide ini, kamu sudah punya foundation yang solid untuk deploy aplikasi Laravel ke production.
Error pasti akan muncul, tapi dengan troubleshooting checklist di atas, kamu bisa diagnose dan fix masalah dengan cepat.
Yang paling penting adalah terus belajar dan eksperimen dengan konfigurasi yang paling cocok untuk kebutuhan aplikasi kamu.
Setiap project punya karakteristik berbeda yang mungkin butuh tuning khusus untuk performa optimal.
Selamat deploy!