Memuat...
👋 Selamat Pagi!

Tips Deploy Laravel ke VPS DigitalOcean untuk Pemula

Panduan lengkap deploy Laravel pertama kali ke VPS DigitalOcean dengan nginx, php-fpm, SSL gratis, dan troubleshooting error umum yang sering developer Indonesi...

Tips Deploy Laravel ke VPS DigitalOcean untuk Pemula

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!

Ajie Kusumadhany
Written by

Ajie Kusumadhany

Founder & Lead Developer KerjaKode. Berpengalaman dalam pengembangan web modern dengan Laravel, React.js, Vue.js, dan teknologi terkini. Passionate tentang coding, teknologi, dan berbagi pengetahuan melalui artikel.

Promo Spesial Hari Ini!

10% DISKON

Promo berakhir dalam:

00 Jam
:
00 Menit
:
00 Detik
Klaim Promo Sekarang!

*Promo berlaku untuk order hari ini

0
User Online
Halo! 👋
Kerjakode Support Online
×

👋 Hai! Pilih layanan yang kamu butuhkan:

Chat WhatsApp Sekarang