Cara deploy Laravel ke VPS Ubuntu terdiri dari enam tahap: amankan server, pasang Nginx dan PHP-FPM, siapkan database, salin kode dan konfigurasi .env, aktifkan HTTPS gratis dari Let's Encrypt, lalu jalankan queue worker dan scheduler. Panduan ini memakai Ubuntu 24.04 LTS, PHP 8.3, dan MySQL. Untuk VPS pemula, spesifikasi 1 sampai 2 vCPU dan 2 GB RAM sudah cukup untuk aplikasi kecil sampai menengah.
Tahap 1: Amankan Server
# login sebagai root, buat user deploy
adduser deploy
usermod -aG sudo deploy
# salin SSH key ke user baru (jalankan dari laptop)
ssh-copy-id deploy@IP_SERVER
# matikan login root dan password di /etc/ssh/sshd_config
PermitRootLogin no
PasswordAuthentication no
sudo systemctl restart ssh
# firewall
sudo ufw allow OpenSSH
sudo ufw allow 'Nginx Full'
sudo ufw enable
# update dan pembaruan keamanan otomatis
sudo apt update && sudo apt upgrade -y
sudo apt install unattended-upgrades -y
Pastikan login SSH dengan key sudah berhasil di terminal lain sebelum menutup sesi root, supaya tidak terkunci dari server sendiri.
Tahap 2: Pasang Nginx, PHP-FPM, dan Composer
sudo apt install -y nginx git unzip
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-bcmath php8.3-intl php8.3-gd php8.3-redis
curl -sS https://getcomposer.org/installer | php
sudo mv composer.phar /usr/local/bin/composer
Kalau versi PHP yang dibutuhkan tidak ada di repositori bawaan Ubuntu, gunakan PPA ondrej/php yang umum dipakai komunitas.
Tahap 3: Database
sudo apt install -y mysql-server
sudo mysql_secure_installation
sudo mysql
CREATE DATABASE tokoku CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'tokoku'@'localhost' IDENTIFIED BY 'password-yang-kuat';
GRANT ALL PRIVILEGES ON tokoku.* TO 'tokoku'@'localhost';
FLUSH PRIVILEGES;
Buat password database yang panjang dan acak dengan Generator Password.
Tahap 4: Kode dan Konfigurasi Deploy Laravel
sudo mkdir -p /var/www/tokoku && sudo chown deploy:www-data /var/www/tokoku
cd /var/www/tokoku
git clone [email protected]:kamu/tokoku.git .
composer install --no-dev --optimize-autoloader
cp .env.example .env
php artisan key:generate
Isi .env production:
APP_ENV=production
APP_DEBUG=false
APP_URL=https://tokoku.id
DB_DATABASE=tokoku
DB_USERNAME=tokoku
DB_PASSWORD=password-yang-kuat
php artisan migrate --force
php artisan storage:link
npm ci && npm run build # atau build di CI lalu salin hasilnya
php artisan optimize
sudo chown -R deploy:www-data storage bootstrap/cache
sudo chmod -R 775 storage bootstrap/cache
Tahap 5: Nginx dan SSL
# /etc/nginx/sites-available/tokoku
server {
listen 80;
server_name tokoku.id www.tokoku.id;
root /var/www/tokoku/public;
index index.php;
client_max_body_size 20M;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
}
location ~ /\.(?!well-known) {
deny all;
}
}
sudo ln -s /etc/nginx/sites-available/tokoku /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx
# SSL gratis
sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d tokoku.id -d www.tokoku.id
Certbot memperbarui sertifikat otomatis. Uji dengan sudo certbot renew --dry-run. Pastikan record DNS A domain sudah mengarah ke IP server sebelum menjalankan certbot.
Tahap 6: Queue Worker dan Scheduler
# /etc/supervisor/conf.d/tokoku-worker.conf
[program:tokoku-worker]
command=php /var/www/tokoku/artisan queue:work --sleep=3 --tries=3 --max-time=3600
user=deploy
numprocs=2
autostart=true
autorestart=true
stopwaitsecs=3600
stdout_logfile=/var/www/tokoku/storage/logs/worker.log
sudo apt install -y supervisor
sudo supervisorctl reread && sudo supervisorctl update
# scheduler: crontab -e (user deploy)
* * * * * cd /var/www/tokoku && php artisan schedule:run >> /dev/null 2>&1
Skrip Deploy Berulang
#!/usr/bin/env bash
set -e
cd /var/www/tokoku
php artisan down --retry=15
git pull origin main
composer install --no-dev --optimize-autoloader
php artisan migrate --force
php artisan optimize
php artisan queue:restart
php artisan up
Untuk deploy tanpa jeda sama sekali, gunakan pendekatan rilis per folder dengan symlink, misalnya lewat Deployer atau Envoy, atau layanan terkelola.
Kesalahan yang Sering Terjadi
- Document root mengarah ke folder proyek, bukan
public/, sehingga file.envbisa diunduh publik. APP_DEBUG=truedi production, yang membocorkan konfigurasi saat ada error.- Lupa
queue:restartsetelah deploy, sehingga worker masih menjalankan kode lama. - Tidak ada backup. Jadwalkan backup database harian ke penyimpanan di luar server, dan uji pemulihannya.
Langkah Berikutnya
Sebelum go-live, cek ulang keamanan aplikasi dengan OWASP Top 10 untuk Laravel. Agar environment development tim sama dengan server, gunakan Docker untuk Laravel.