Langsung ke konten
KamusNgoding
Mahir Laravel 4 menit baca

Deploy Aplikasi Laravel ke VPS Ubuntu dengan Nginx

#laravel #deploy #vps #ubuntu #nginx #ssl #production #certbot #advanced

Pendahuluan

Selama ini, banyak developer Indonesia yang terbiasa deploy web dengan cara tradisional: upload file via FTP ke shared hosting dengan cPanel, ekstrak ZIP, selesai. Cara ini memang mudah, tapi memiliki banyak keterbatasan:

  • Tidak bisa menjalankan php artisan commands
  • Tidak bisa mengkonfigurasi PHP secara fleksibel
  • Tidak bisa menjalankan queue worker atau scheduler
  • Performa sangat terbatas

Di era modern, VPS (Virtual Private Server) adalah standar deployment untuk aplikasi Laravel production. Kamu punya kendali penuh atas server — PHP version, Nginx config, SSL, database — semuanya kamu yang atur.

Di artikel ini kita akan deploy Task Manager ke VPS Ubuntu dari awal hingga production-ready dengan HTTPS.


Persiapan: Pilih VPS

VPS yang direkomendasikan untuk memulai (harga ~$6-12/bulan):

ProviderSpesifikasiHarga
DigitalOcean1 vCPU, 1GB RAM$6/bulan
Vultr1 vCPU, 1GB RAM$6/bulan
Hetzner2 vCPU, 2GB RAM€4.5/bulan

Buat VPS dengan:

  • OS: Ubuntu 24.04 LTS
  • Region: Singapore (untuk latensi rendah dari Indonesia)

Langkah 1: Akses VPS via SSH

# Dari terminal lokal (Mac/Linux/WSL)
ssh root@IP_SERVER_KAMU

# Contoh:
ssh [email protected]

# Jika menggunakan SSH key:
ssh -i ~/.ssh/id_rsa [email protected]

Langkah 2: Setup Awal Server

# Update sistem
apt update && apt upgrade -y

# Buat user non-root (lebih aman dari root)
adduser deploy
usermod -aG sudo deploy

# Salin SSH key ke user baru
rsync --archive --chown=deploy:deploy ~/.ssh /home/deploy

# Login sebagai user deploy
su - deploy

# Konfigurasi firewall
sudo ufw allow OpenSSH
sudo ufw allow 'Nginx Full'  # HTTP + HTTPS
sudo ufw enable
sudo ufw status

Langkah 3: Install PHP 8.3

# Tambahkan repository PHP terbaru
sudo apt install -y software-properties-common
sudo add-apt-repository ppa:ondrej/php -y
sudo apt update

# Install PHP dan ekstensi yang dibutuhkan Laravel
sudo apt install -y \
    php8.3-fpm \
    php8.3-cli \
    php8.3-mysql \
    php8.3-mbstring \
    php8.3-xml \
    php8.3-curl \
    php8.3-zip \
    php8.3-gd \
    php8.3-intl \
    php8.3-bcmath \
    php8.3-tokenizer

# Verifikasi
php --version
# PHP 8.3.x

Langkah 4: Install Composer

curl -sS https://getcomposer.org/installer | php
sudo mv composer.phar /usr/local/bin/composer
composer --version

Langkah 5: Install MySQL

sudo apt install -y mysql-server

# Jalankan setup keamanan
sudo mysql_secure_installation
# - Set root password: YES
# - Remove anonymous users: YES
# - Disallow root login remotely: YES
# - Remove test database: YES

# Buat database untuk Laravel
sudo mysql -u root -p
CREATE DATABASE task_manager CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'laravel_user'@'localhost' IDENTIFIED BY 'Password_Kuat_123!';
GRANT ALL PRIVILEGES ON task_manager.* TO 'laravel_user'@'localhost';
FLUSH PRIVILEGES;
EXIT;

Langkah 6: Install Nginx

sudo apt install -y nginx

# Verifikasi
sudo systemctl status nginx

# Buka di browser: http://IP_SERVER_KAMU
# Harus muncul halaman "Welcome to nginx!"

Langkah 7: Clone dan Setup Proyek Laravel

# Buat direktori aplikasi
sudo mkdir -p /var/www/task-manager
sudo chown -R deploy:deploy /var/www/task-manager

# Clone dari GitHub (pastikan repo sudah di GitHub)
cd /var/www
git clone https://github.com/username/task-manager.git task-manager
cd task-manager

# Install dependensi production (tanpa dev packages)
composer install --optimize-autoloader --no-dev

# Buat file .env dari template
cp .env.example .env

# Generate application key
php artisan key:generate

Langkah 8: Konfigurasi .env Production

nano .env
APP_NAME=TaskManager
APP_ENV=production
APP_DEBUG=false
APP_URL=https://domain-kamu.com

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=task_manager
DB_USERNAME=laravel_user
DB_PASSWORD=Password_Kuat_123!

CACHE_DRIVER=file
SESSION_DRIVER=file
QUEUE_CONNECTION=sync
# Set permission yang benar
sudo chown -R deploy:www-data /var/www/task-manager
sudo chmod -R 755 /var/www/task-manager
sudo chmod -R 775 /var/www/task-manager/storage
sudo chmod -R 775 /var/www/task-manager/bootstrap/cache

# Jalankan migration
php artisan migrate --force

Langkah 9: Konfigurasi Nginx

# Buat file konfigurasi Nginx untuk aplikasi kita
sudo nano /etc/nginx/sites-available/task-manager
server {
    listen 80;
    listen [::]:80;
    server_name domain-kamu.com www.domain-kamu.com;

    # Root ke folder public Laravel (penting!)
    root /var/www/task-manager/public;
    index index.php index.html;

    # Log files
    access_log /var/log/nginx/task-manager-access.log;
    error_log  /var/log/nginx/task-manager-error.log;

    # Handle semua request melalui index.php (Laravel routing)
    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    # Proses file PHP dengan PHP-FPM
    location ~ \.php$ {
        fastcgi_pass unix:/var/run/php/php8.3-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        include fastcgi_params;
    }

    # Tolak akses ke file tersembunyi (.env, .git, dll)
    location ~ /\. {
        deny all;
    }

    # Cache file static
    location ~* \.(jpg|jpeg|png|gif|ico|css|js|woff|woff2)$ {
        expires 1y;
        add_header Cache-Control "public, immutable";
    }
}
# Aktifkan konfigurasi
sudo ln -s /etc/nginx/sites-available/task-manager /etc/nginx/sites-enabled/

# Hapus konfigurasi default (opsional)
sudo rm /etc/nginx/sites-enabled/default

# Test konfigurasi Nginx
sudo nginx -t
# Harus menampilkan: syntax is ok & test is successful

# Reload Nginx
sudo systemctl reload nginx

Langkah 10: SSL dengan Let’s Encrypt (HTTPS Gratis)

# Install Certbot
sudo apt install -y certbot python3-certbot-nginx

# Dapatkan dan install sertifikat SSL
# (Pastikan domain sudah pointing ke IP server)
sudo certbot --nginx -d domain-kamu.com -d www.domain-kamu.com

# Ikuti instruksi:
# - Masukkan email
# - Setujui Terms of Service
# - Pilih redirect HTTP ke HTTPS (opsi 2 — Recommended)

# Certbot akan otomatis:
# 1. Mendapatkan sertifikat dari Let's Encrypt
# 2. Mengupdate konfigurasi Nginx untuk HTTPS
# 3. Mengatur auto-renewal

# Test auto-renewal
sudo certbot renew --dry-run

Setelah ini, buka https://domain-kamu.com di browser. Aplikasi Laravel kamu sudah live dengan HTTPS! 🎉


Langkah 11: Optimasi Production

cd /var/www/task-manager

# Cache config, routes, views, dan events
php artisan config:cache    # Cache config/*.php
php artisan route:cache     # Cache routes
php artisan view:cache      # Pre-compile Blade views
php artisan event:cache     # Cache event listeners

# Atau jalankan semua sekaligus
php artisan optimize

# Verifikasi
php artisan optimize:status

Langkah 12: Proses Queue Worker (Jika Menggunakan Queue)

Jika aplikasi menggunakan queue (email, notifikasi, dll), gunakan Supervisor untuk menjalankan worker secara otomatis:

sudo apt install -y supervisor

sudo nano /etc/supervisor/conf.d/task-manager-worker.conf
[program:task-manager-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /var/www/task-manager/artisan queue:work --sleep=3 --tries=3 --max-time=3600
autostart=true
autorestart=true
stopasgroup=true
killasgroup=true
user=deploy
numprocs=1
redirect_stderr=true
stdout_logfile=/var/www/task-manager/storage/logs/worker.log
stopwaitsecs=3600
sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl start task-manager-worker:*

Langkah 13: Script Deploy Otomatis

Buat script sederhana untuk update aplikasi saat ada perubahan kode:

nano /var/www/task-manager/deploy.sh
#!/bin/bash
set -e

echo "🚀 Memulai deployment..."

cd /var/www/task-manager

# Aktifkan maintenance mode
php artisan down --retry=60

# Pull kode terbaru
git pull origin main

# Install dependensi baru
composer install --optimize-autoloader --no-dev

# Jalankan migration
php artisan migrate --force

# Bersihkan dan rebuild cache
php artisan optimize:clear
php artisan optimize

# Matikan maintenance mode
php artisan up

echo "✅ Deployment berhasil!"
chmod +x /var/www/task-manager/deploy.sh

# Jalankan kapanpun ada update
./deploy.sh

Troubleshooting: Error yang Sering Muncul

502 Bad Gateway di Browser

Penyebab: PHP-FPM tidak berjalan atau socket path salah di konfigurasi Nginx.

Solusi:

# Cek status PHP-FPM
sudo systemctl status php8.3-fpm
sudo systemctl restart php8.3-fpm

# Pastikan socket path di Nginx cocok
ls /var/run/php/
# Harus ada: php8.3-fpm.sock

# Cek error log Nginx
sudo tail -f /var/log/nginx/task-manager-error.log

Permission Denied di Storage

Penyebab: Web server (www-data) tidak punya izin menulis ke folder storage.

Solusi:

sudo chown -R deploy:www-data /var/www/task-manager/storage
sudo chown -R deploy:www-data /var/www/task-manager/bootstrap/cache
sudo chmod -R 775 /var/www/task-manager/storage
sudo chmod -R 775 /var/www/task-manager/bootstrap/cache

# Jalankan sebagai www-data user
sudo -u www-data php artisan storage:link

Perubahan di .env Tidak Terdeteksi

Penyebab: Laravel meng-cache konfigurasi lama. Setelah mengubah .env, cache harus dihapus.

Solusi:

php artisan config:clear
php artisan cache:clear

# Jangan jalankan config:cache sampai kamu yakin .env sudah benar
# Jalankan config:cache kembali setelah selesai:
php artisan optimize

Pertanyaan yang Sering Diajukan

Shared hosting vs VPS, mana yang lebih baik untuk Laravel?

Shared hosting (Niagahoster, Dewaweb, dll) cocok untuk proyek kecil dengan Artisan commands terbatas — bisa jalan tapi dengan banyak batasan. VPS wajib untuk: queue workers, cron jobs, SSR, socket connections, dan performa yang konsisten. Untuk proyek production serius, VPS adalah pilihan yang tepat.

Berapa RAM minimum yang dibutuhkan untuk Laravel?

1GB RAM cukup untuk mulai, tapi 2GB lebih nyaman terutama saat composer install. Untuk traffic tinggi atau aplikasi dengan banyak queue worker, pertimbangkan 4GB+. Kamu bisa selalu upgrade VPS plan seiring pertumbuhan traffic.

Bagaimana cara deploy otomatis saat push ke GitHub?

Gunakan GitHub Actions untuk CI/CD otomatis. Buat workflow yang SSH ke server dan menjalankan script deploy.sh saat push ke branch main. Baca panduan lengkapnya di tutorial GitHub Actions di KamusNgoding.

Bagaimana cara backup database secara otomatis?

# Buat script backup
nano /home/deploy/backup.sh
#!/bin/bash
DATE=$(date +%Y%m%d_%H%M%S)
mysqldump -u laravel_user -p'Password_Kuat_123!' task_manager > /backup/db_$DATE.sql
# Tambahkan script untuk upload ke S3 atau Google Drive
# Tambahkan ke cron (backup setiap hari pukul 2 pagi)
crontab -e
# Tambahkan: 0 2 * * * /home/deploy/backup.sh

Kesimpulan

Selamat! Kamu telah berhasil menyelesaikan seluruh perjalanan dari zero hingga production-ready Laravel application! 🎊

Di artikel terakhir ini kita telah:

  • Setup VPS Ubuntu dari awal dengan keamanan dasar
  • Install seluruh stack: PHP 8.3, Composer, MySQL, Nginx
  • Deploy proyek Laravel dengan konfigurasi yang optimal
  • Konfigurasi Nginx yang benar dengan root ke folder public
  • HTTPS gratis dengan Let’s Encrypt dan auto-renewal
  • Optimasi production: config cache, route cache, view cache
  • Script deploy untuk update aplikasi dengan mudah

Rangkuman Perjalanan Seri Laravel

Kita telah menyelesaikan 10 artikel yang membawa kamu dari pemula hingga developer Laravel yang siap production:

ArtikelTopik
1Apa itu Laravel?
2Instalasi & Struktur Proyek
3Routing & Controller
4Blade Template Engine
5Eloquent ORM & Migration
6CRUD Lengkap
7Mengatasi Error CORS
8Authentication & Middleware
9REST API dengan Sanctum
10Deploy ke VPS Production

Dengan menguasai semua topik ini, kamu sudah memiliki fondasi yang kuat untuk membangun dan mendeploy aplikasi web Laravel di dunia nyata. Portfolio Task Manager yang kita bangun bersama adalah bukti kemampuanmu!

Langkah selanjutnya yang bisa kamu eksplorasi:

  • Testing: Unit test dan Feature test dengan PHPUnit
  • Queue & Jobs: Kirim email background, proses data besar
  • Broadcasting: Real-time notifications dengan Pusher/Reverb
  • Package Laravel: Livewire, Inertia.js, Filament

Terima kasih sudah mengikuti seri ini hingga selesai! Kamu sudah membuktikan bahwa belajar Laravel secara sistematis tidak harus sulit. Terus berlatih, terus bangun, dan bagikan ilmumu kepada komunitas developer Indonesia! 🇮🇩

Artikel Terkait