Banyak tutorial Laravel berhenti di "aplikasi berjalan di localhost". Tutorial ini melanjutkannya sampai ke production: deploy ke VPS Ubuntu, konfigurasi Nginx + PHP-FPM, database MySQL, SSL gratis dengan Let's Encrypt, dan setup agar queue worker tetap berjalan.

Prasyarat

  • VPS Ubuntu 22.04 (minimal 1 vCPU, 1GB RAM)
  • Domain yang sudah diarahkan ke IP VPS
  • Akses SSH ke server

Step 1: Setup Server Ubuntu

# Update sistem
sudo apt update && sudo apt upgrade -y

# Install paket yang dibutuhkan
sudo apt install -y software-properties-common curl git unzip

# Tambah PPA Ondrej untuk PHP terbaru
sudo add-apt-repository ppa:ondrej/php -y
sudo apt update

# Install PHP 8.2 dengan ekstensi yang dibutuhkan Laravel
sudo apt install -y php8.2-fpm php8.2-mysql php8.2-mbstring \
    php8.2-xml php8.2-curl php8.2-zip php8.2-gd \
    php8.2-bcmath php8.2-redis php8.2-intl

# Install Nginx dan MySQL
sudo apt install -y nginx mysql-server

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

Step 2: Konfigurasi MySQL

sudo mysql_secure_installation

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

Step 3: Deploy Kode Laravel

# Buat direktori aplikasi
sudo mkdir -p /var/www/aplikasi
sudo chown -R $USER:www-data /var/www/aplikasi

# Clone repository
cd /var/www
git clone https://github.com/username/repo.git aplikasi
cd aplikasi

# Install dependencies (tanpa dev)
composer install --no-dev --optimize-autoloader

# Setup .env
cp .env.example .env
nano .env  # Set APP_URL, DB_*, REDIS_HOST, MAIL_*, dll.
php artisan key:generate

# Permission storage dan cache
sudo chown -R www-data:www-data storage bootstrap/cache
sudo chmod -R 775 storage bootstrap/cache

# Migrate dan seed
php artisan migrate --force
php artisan db:seed --force

# Cache config, route, dan view
php artisan config:cache
php artisan route:cache
php artisan view:cache

Step 4: Konfigurasi Nginx

sudo nano /etc/nginx/sites-available/aplikasi
server {
    listen 80;
    server_name domain.com www.domain.com;
    root /var/www/aplikasi/public;
    index index.php;

    client_max_body_size 20M;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        fastcgi_pass unix:/var/run/php/php8.2-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        include fastcgi_params;
        fastcgi_hide_header X-Powered-By;
    }

    location ~ /\.(?!well-known).* {
        deny all;
    }

    gzip on;
    gzip_types text/plain text/css application/json application/javascript;
}
sudo ln -s /etc/nginx/sites-available/aplikasi /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx

Step 5: SSL Gratis dengan Let's Encrypt

sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d domain.com -d www.domain.com

# Auto-renewal sudah otomatis via systemd timer
# Verifikasi:
sudo certbot renew --dry-run

Step 6: Setup Queue Worker dengan Supervisor

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

Step 7: Deployment Otomatis dengan GitHub Actions

# .github/workflows/deploy.yml
name: Deploy to Production

on:
  push:
    branches: [main]

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - name: Deploy via SSH
        uses: appleboy/ssh-action@v1
        with:
          host: ${{ secrets.SERVER_HOST }}
          username: ${{ secrets.SERVER_USER }}
          key: ${{ secrets.SSH_PRIVATE_KEY }}
          script: |
            cd /var/www/aplikasi
            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 reload nginx

Dengan setup ini, setiap push ke branch main akan otomatis di-deploy ke production server. Kombinasi Nginx, PHP-FPM, dan Supervisor memberikan fondasi yang solid dan production-ready untuk aplikasi Laravel skala menengah.