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.