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 artisancommands - 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):
| Provider | Spesifikasi | Harga |
|---|---|---|
| DigitalOcean | 1 vCPU, 1GB RAM | $6/bulan |
| Vultr | 1 vCPU, 1GB RAM | $6/bulan |
| Hetzner | 2 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:
| Artikel | Topik |
|---|---|
| 1 | Apa itu Laravel? |
| 2 | Instalasi & Struktur Proyek |
| 3 | Routing & Controller |
| 4 | Blade Template Engine |
| 5 | Eloquent ORM & Migration |
| 6 | CRUD Lengkap |
| 7 | Mengatasi Error CORS |
| 8 | Authentication & Middleware |
| 9 | REST API dengan Sanctum |
| 10 | Deploy 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! 🇮🇩