Membangun aplikasi Laravel di komputer lokal itu mudah, tapi memindahkannya ke server sering bikin pusing. Panduan deploy Laravel ke VPS ini membantu kamu memahami setiap tahap secara berurutan lengkap dengan perintahnya. Mulai dari update server, instalasi PHP, sampai konfigurasi Nginx dan SSL, semua dijelaskan secara praktis.
Persiapan Server Sebelum Instalasi
Sebelum masuk ke instalasi paket, server VPS harus diperbarui dulu. Jalankan perintah update dan upgrade agar semua paket sistem berada di versi terbaru.
sudo apt update && sudo apt upgrade -ysudo apt install -y curl unzip git zip software-properties-commonPerintah di atas juga digunakan untuk memasang tool dasar seperti curl, git, unzip, dan zip. Tool ini dipakai berulang kali selama proses instalasi, misalnya saat clone repository atau mengekstrak file. Server yang bersih dan lengkap tool dasarnya akan mempercepat proses berikutnya.
Pastikan juga akses SSH ke VPS sudah stabil sebelum melanjutkan ke tahap berikutnya. Koneksi yang terputus di tengah instalasi bisa menyebabkan paket setengah jalan dan error saat dijalankan ulang. Kalau memungkinkan, gunakan tool seperti tmux atau screen supaya proses instalasi tetap berjalan meski koneksi SSH sempat putus.
Instalasi PHP dan MySQL
PHP versi terbaru biasanya sudah tersedia langsung dari repository resmi Ubuntu rilis terkini. Instal PHP-FPM beserta ekstensi wajib seperti mysql, mbstring, xml, curl, dan gd dengan satu perintah.
sudo apt install -y php8.5-fpm php8.5-cli php8.5-common php8.5-mysql \
php8.5-mbstring php8.5-xml php8.5-bcmath php8.5-curl php8.5-zip \
php8.5-gd php8.5-intl php8.5-readline
php8.5 -v
sudo systemctl status php8.5-fpmMySQL menjadi database utama untuk menyimpan data aplikasi Laravel. Instal MySQL server lalu jalankan proses pengamanan bawaan untuk menghapus user anonim dan database test.
sudo apt install -y mysql-serversudo mysql_secure_installationSetelah proses pengamanan selesai, masuk ke MySQL lewat akun root. Buat database baru serta user khusus yang punya akses penuh ke database tersebut.
sudo mysqlSetelah memasukan perintah diatas terminal akan masuk ke mysql, gunakan perintah dibawah ini untuk membuat database baru
CREATE DATABASE IF NOT EXISTS namadb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'namauser'@'localhost' IDENTIFIED BY 'password_kuat_disini';
GRANT ALL PRIVILEGES ON namadb.* TO 'namauser'@'localhost';
FLUSH PRIVILEGES;
EXIT;Gunakan karakter set utf8mb4 saat membuat database supaya emoji dan karakter khusus tersimpan dengan benar. Password user database sebaiknya kombinasi huruf, angka, dan simbol agar tidak mudah ditebak. Catat password ini di tempat aman karena akan dipakai lagi saat mengisi file environment aplikasi.
Berikut ringkasan komponen wajib yang perlu disiapkan sebelum lanjut ke tahap project:
PHP-FPM beserta ekstensi yang dibutuhkan Laravel
MySQL server dan database khusus project
Nginx sebagai web server, diinstal lewat
sudo apt install -y nginxComposer untuk mengelola dependency PHP
Node.js jika project memakai Vite untuk build asset
Clone Project dan Konfigurasi Environment
Setelah semua service dasar siap, langkah berikutnya adalah clone project dari repository. GitHub sekarang mewajibkan Personal Access Token, bukan password akun biasa, saat melakukan clone lewat HTTPS.
sudo mkdir -p /var/www/namaprojectsudo chown -R $USER:$USER /var/www/namaprojectcd /var/www/namaprojectgit clone https://github.com/namauser/namarepo.git .Tanda titik di akhir perintah clone penting supaya file project langsung masuk ke folder saat ini. Kalau titik ini terlewat, project akan ter-clone ke dalam subfolder baru bernama sesuai repository. Setelah clone selesai, instal seluruh dependency PHP lewat Composer.
composer install --optimize-autoloader --no-devFile .env perlu disesuaikan supaya aplikasi berjalan dalam mode production. Buka file environment dengan nano .env, lalu ubah variabel APP_ENV, APP_DEBUG, dan APP_URL. Variabel koneksi database juga harus diarahkan ke MySQL, bukan lagi ke SQLite seperti saat development lokal.
Kesalahan kecil di file environment ini sering bikin proses jadi terhambat. Pastikan tanda kutip dipakai untuk password yang mengandung karakter spesial seperti tanda seru. Kesalahan penulisan password jadi penyebab paling umum error access denied saat migrasi database dijalankan.
Tabel berikut merangkum variabel environment yang paling sering menyebabkan error kalau salah isi:
| Variabel | Nilai Lokal | Nilai Production |
|---|---|---|
| APP_ENV | local | production |
| APP_DEBUG | true | false |
| DB_CONNECTION | sqlite | mysql |
| DB_HOST | - | 127.0.0.1 |
| DB_PASSWORD | - | sesuai password MySQL |
Setelah .env siap, generate APP_KEY baru khusus untuk environment production.
php artisan key:generateMigrasi Database dan Permission File
Tahap migrasi database jadi bagian penting dalam proses deploy Laravel ke VPS secara keseluruhan. Perintah migrate dengan flag force diperlukan karena Laravel akan menolak migrasi tanpa konfirmasi di mode production.
php artisan migrateJika muncul error access denied, bersihkan cache konfigurasi dengan php artisan config:clear, lalu periksa kembali kecocokan password di file .env. Kalau project sudah pernah dijalankan sebelumnya, hati-hati memakai perintah migrate:fresh. Perintah ini akan menghapus seluruh tabel beserta datanya tanpa peringatan tambahan.
php artisan db:seedPermission file dan folder juga menentukan apakah aplikasi bisa berjalan tanpa error. Folder storage dan bootstrap/cache membutuhkan permission tulis untuk user www-data. Kesalahan permission sering jadi penyebab utama halaman blank atau error 500 saat aplikasi diakses.
Berikut urutan perintah yang perlu dijalankan setelah database berhasil dimigrasi:
sudo chown -R www-data:www-data /var/www/namaprojectsudo find /var/www/namaproject -type f -exec chmod 644 {} \;sudo find /var/www/namaproject -type d -exec chmod 755 {} \;sudo chmod -R 775 /var/www/namaproject/storage /var/www/namaproject/bootstrap/cacheBuild Asset dan Konfigurasi Nginx
Aplikasi Laravel modern umumnya memakai Vite untuk mengelola asset CSS dan JavaScript. Instal Node.js versi LTS terlebih dahulu sebelum menjalankan proses build.
curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash -sudo apt install -y nodejscd /var/www/namaprojectnpm installnpm run buildError vite manifest not found biasanya muncul kalau proses build belum pernah dijalankan di server. Perbaiki juga permission folder build agar bisa dibaca oleh user www-data lewat sudo chown -R www-data:www-data public/build.
Konfigurasi Nginx menentukan bagaimana request dari browser diteruskan ke aplikasi Laravel. File konfigurasi perlu mengarahkan root ke folder public, bukan ke root folder project.
server {
listen 443 ssl;
server_name namadomain.com;
root /var/www/namaproject/public;
index index.php;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
fastcgi_pass unix:/run/php/php8.5-fpm.sock;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
include fastcgi_params;
}
}Aktifkan konfigurasi lewat symbolic link, lalu tes dan reload Nginx.
sudo ln -s /etc/nginx/sites-available/namaproject /etc/nginx/sites-enabled/sudo nginx -tsudo systemctl reload nginxSertifikat SSL wajib dipasang agar traffic ke aplikasi terenkripsi dengan baik. Jika memakai Cloudflare, kamu bisa memanfaatkan Origin Certificate alih-alih Let's Encrypt. Pastikan mode SSL di dashboard Cloudflare diatur ke Full Strict agar koneksi tetap aman dari ujung ke ujung.
Origin Certificate hanya dikenali oleh jaringan Cloudflare, jadi traffic wajib melewati proxy mereka. Record DNS untuk domain dan subdomain harus berstatus proxied, ditandai ikon awan berwarna. Kalau proxy dimatikan, browser akan menampilkan peringatan sertifikat tidak dikenal saat mengakses domain. Verifikasi status proxy ini langsung dari dashboard Cloudflare sebelum mengumumkan domain sudah live.
Optimasi dan Automasi Setelah Deploy
Setelah aplikasi berhasil diakses lewat domain, lakukan beberapa optimasi tambahan untuk performa. Jalankan config cache, route cache, dan view cache agar Laravel tidak membaca file konfigurasi berulang kali.
php artisan config:cachephp artisan route:cachephp artisan view:cacheQueue worker dan cron scheduler juga perlu diatur kalau project memakai fitur tersebut. Supervisor membantu menjaga queue worker tetap berjalan meskipun proses sempat berhenti karena error.
sudo apt install -y supervisorsudo nano /etc/supervisor/conf.d/laravel-worker.conf[program:laravel-worker]
command=php /var/www/namaproject/artisan queue:work --sleep=3 --tries=3
autostart=true
autorestart=true
user=www-data
numprocs=2sudo supervisorctl rereadsudo supervisorctl updatesudo supervisorctl start laravel-worker:*Cron job schedule:run cukup didaftarkan sekali di crontab milik user www-data lewat crontab -e -u www-data.
* * * * * cd /var/www/namaproject && php artisan schedule:run >> /dev/null 2>&1Kalau ada penambahan fitur baru, ulangi bagian cache setiap kali melakukan perubahan konfigurasi. File cache yang lama bisa membuat perubahan .env tidak terbaca oleh aplikasi. Jalankan config:clear terlebih dahulu sebelum membuat cache baru supaya perubahan langsung berlaku.
Firewall juga perlu diaktifkan supaya server tidak terbuka bebas ke internet
sudo ufw allow 'Nginx Full'sudo ufw statusIzinkan hanya port yang dibutuhkan Nginx, lalu tutup akses langsung ke port database dari luar. Kombinasi firewall dan proxy Cloudflare membuat proses deploy Laravel ke VPS ini jauh lebih aman.
Sebelum menganggap proses deploy Laravel ke VPS ini selesai, cek dulu beberapa hal berikut:
Domain bisa diakses dengan SSL valid tanpa peringatan browser
Status migrasi database sudah menunjukkan semua migration berhasil
File APP_DEBUG bernilai false di environment production
Cron scheduler dan queue worker berjalan sesuai jadwal
Baca artikel menarik lainya hanya di Ruangbacaku