Auto
Cara Deploy Project Laravel 13 ke VPS dari Nol Sampai Online
Men-deploy aplikasi Laravel dari lokal ke server produksi sering terasa seperti melompati jurang: di lokal semuanya berjalan mulus, tetapi begitu menyentuh dunia www munculah berbagai macam kompleksitas lain seperti SSH, Composer, versi PHP, konfigurasi Nginx, permission folder, sampai pengaturan keamanan. Panduan berikut membahas tuntas cara deploy project Laravel 13 ke VPS dengan stack LEMP (Linux, Nginx, MySQL, PHP), lengkap dengan alasan di balik tiap langkah, contoh perintah, output yang diharapkan, error umum, sekaligus perbandingan dengan platform terkelola seperti Laravel Cloud dan Forge.
Ringkasan singkat: Untuk deploy Laravel 13 ke VPS, Anda perlu menyiapkan server Ubuntu, memasang PHP 8.3+, Nginx, MySQL, Composer, dan Git, lalu menarik kode dari repositori, mengatur file
.env, menjalankan migrasi, mengoptimalkan cache, dan mengamankan server dengan HTTPS. Laravel 13 mensyaratkan PHP minimal versi 8.3 beserta sejumlah ekstensi wajib.
Apa Itu Deploy Laravel ke VPS dan Kenapa Ini Penting
![]()
Definisi: Deploy Laravel ke VPS berarti memindahkan proyek dari lingkungan pengembangan lokal ke server pribadi virtual (Virtual Private Server) yang bisa diakses publik lewat internet, lalu mengonfigurasi semua komponen agar aplikasi berjalan stabil di lingkungan produksi.
Sebuah aplikasi yang hanya hidup di localhost tidak banyak gunanya bagi orang lain. Inti dari Laravel adalah keseluruhan siklus aplikasi, dari pengembangan sampai benar-benar tayang. Saat deploy, komponen penting dikonfigurasi dengan benar: berkas proyek, dependensi, koneksi database, variabel lingkungan, dan konfigurasi web server.
VPS memberi Anda kendali penuh atas lingkungan. Anda bebas memilih versi PHP, menyetel parameter server, menjalankan queue worker, memperketat keamanan, dan mengoptimalkan performa sesuai kebutuhan proyek.
Bagi Anda yang baru pertama kali menyentuh server, jangan khawatir. Setelah memahami fungsi tiap langkah, proses ini jauh lebih ramah daripada yang terlihat.
Memahami Istilah Dasar Sebelum Mulai
Sebelum mengetik perintah, mari kita samakan kosakata. Anggap saja istilah-istilah ini sebagai "peta jalan" sebelum perjalanan.
-
VPS (Virtual Private Server): Server virtual dengan sumber daya khusus (CPU, RAM, penyimpanan) yang Anda kendalikan sepenuhnya, ibarat menyewa rumah sendiri alih-alih satu kamar kos bersama.
-
SSH (Secure Shell): Terowongan terenkripsi untuk masuk dan mengendalikan server dari jarak jauh lewat terminal.
-
LEMP: Kombinasi Linux, Nginx (dibaca "engine-x"), MySQL, dan PHP. Ini fondasi yang kita pakai sepanjang panduan.
-
Nginx: Web server yang menerima permintaan dari browser dan meneruskannya ke PHP. Dikenal ringan dan tangguh menangani banyak koneksi sekaligus.
-
PHP-FPM: Proses yang menjalankan kode PHP di balik layar dan berkomunikasi dengan Nginx.
-
Composer: Manajer paket PHP. Tugasnya memasang dan mengelola pustaka yang dibutuhkan Laravel.
-
.env: File rahasia berisi konfigurasi lingkungan, seperti kredensial database dan kunci aplikasi.
Memahami peran tiap komponen membantu Anda mendiagnosis masalah nanti. Ketika ada error, Anda akan tahu harus melihat ke "ruang" yang mana.
Masalah yang Sering Dirasakan Sebelum Deploy
Saya ingin Anda merasa dipahami dulu sebelum kita masuk ke solusinya. Berikut keluhan yang nyaris selalu muncul:
-
"Di laptop saya jalan sempurna, tapi di server muncul layar putih atau error 500."
-
"Saya bingung file mana yang harus diunggah dan ke folder mana."
-
"Izin folder bikin pusing, log tidak bisa ditulis, dan cache gagal."
-
"Database tidak mau tersambung padahal kredensial sudah benar."
-
"Takut salah perintah dan malah merusak server."
Kenapa Masalah Ini Penting Diselesaikan
Aplikasi yang gagal deploy berarti fitur yang sudah Anda bangun tidak pernah sampai ke pengguna. Lebih jauh, konfigurasi yang ceroboh bisa membocorkan data sensitif atau membuka celah keamanan.
Kabar baiknya, hampir semua masalah ini berakar pada hal yang sama: izin folder yang salah, paket yang hilang, atau konfigurasi server yang kurang tepat. Begitu polanya dikenali, semuanya bisa diatasi secara sistematis.
Prasyarat Sebelum Deploy Laravel 13 ke VPS
Luangkan beberapa menit untuk memastikan semua bahan sudah siap. Banyak yang langsung mengetik perintah instalasi lalu tersangkut karena ada satu komponen yang terlewat.
Pastikan hal-hal berikut tersedia:
-
VPS Server: Tempat aplikasi Laravel Anda benar-benar berjalan. Penyedia populer antara lain DigitalOcean, Linode, AWS, dan Hostinger.
-
Kredensial SSH: Alamat IP server, username, password, dan opsional kunci SSH.
-
Berkas proyek Laravel: Kode aplikasi yang sudah siap, idealnya tersimpan di repositori Git seperti GitHub.
-
Nama domain: Memudahkan alamat web profesional sekaligus mempermudah pemasangan HTTPS.
-
PHP versi kompatibel: Laravel 13 mensyaratkan PHP 8.3 ke atas.
-
Composer: Untuk memasang dan mengelola dependensi.
-
Akses database: Kredensial untuk MySQL atau PostgreSQL.
-
Pengetahuan terminal dasar: Tidak perlu mahir Linux, cukup paham perintah dasar.
Persyaratan Server Laravel 13
Kerangka kerja Laravel punya beberapa syarat sistem. Web server Anda wajib memenuhi versi PHP minimum berikut beserta ekstensinya:
-
PHP >= 8.3
-
Ekstensi Ctype
-
Ekstensi cURL
-
Ekstensi DOM
-
Ekstensi Fileinfo
-
Ekstensi Filter
-
Ekstensi Hash
-
Ekstensi Mbstring
-
Ekstensi OpenSSL
-
Ekstensi PCRE
-
Ekstensi PDO
-
Ekstensi Session
-
Ekstensi Tokenizer
-
Ekstensi XML
Memastikan ekstensi ini terpasang sejak awal akan menghemat banyak waktu. Sebagian besar error 500 misterius di Laravel berakar dari ekstensi PHP yang hilang.
Tabel Kompatibilitas Laravel dan PHP
![]()
Versi Laravel | PHP yang Disarankan | Status Dukungan | Penggunaan Ideal |
|---|---|---|---|
Laravel 10 | PHP 8.1+ | Long Term Support | Aplikasi produksi stabil |
Laravel 11 | PHP 8.2+ | Rilis stabil | Aplikasi web modern |
Laravel 12 | PHP 8.2+ | Rilis terbaru | Proyek baru |
Laravel 13 | PHP 8.3+ | Rilis terkini | Proyek baru dengan fitur terkini |
Menggunakan kombinasi versi yang tidak cocok dapat memicu konflik dependensi, kegagalan instalasi, dan error tak terduga. Selalu cek kecocokan sebelum melangkah.
Getting Started: Menyiapkan Mental dan Alur Kerja
Sebelum masuk teknis, satu prinsip yang ingin saya tanamkan: deploy yang baik itu berulang dan dapat diprediksi (repeatable). Perlakukan setiap deployment sebagai artefak yang identik di setiap lingkungan.
Beberapa prinsip kunci yang memandu strategi ini:
-
Repeatability: Pakai build artifact (composer lock, aset terkompilasi) agar tiap deploy identik.
-
Permukaan serang minimal: Hanya buka layanan yang benar-benar perlu ke internet.
-
Pemisahan peran: Pisahkan web, database, cache, dan queue agar mudah diskalakan dan ditelusuri.
-
Provisioning otomatis: Gunakan skrip atau alat seperti Ansible bila memungkinkan.
-
Pertimbangan tanpa-henti (zero-downtime): Gunakan rilis berbasis symlink atau load balancer agar pengguna tidak terganggu saat pembaruan.
Tidak perlu menerapkan semuanya di hari pertama. Mulailah dari yang sederhana, lalu naikkan kematangannya seiring waktu.
Step 1: Hubungkan ke VPS Lewat SSH dan Perbarui Sistem

Langkah pertama adalah masuk ke server secara aman menggunakan SSH. Ini pintu masuk Anda ke server.
ssh root@alamat-ip-server
Jika server memakai autentikasi berbasis kunci:
ssh -i private-key.pem root@alamat-ip-server
Kenapa ini penting: Tanpa koneksi yang stabil dan aman, semua langkah berikutnya mustahil dilakukan. SSH juga terenkripsi, sehingga kredensial Anda tidak mudah disadap.
Setelah masuk, segera perbarui daftar paket dan tingkatkan sistem:
sudo apt update && sudo apt upgrade -y
Output yang diharapkan: Daftar paket yang diperbarui, lalu proses upgrade berjalan. Bila ada paket tertahan, Anda bisa membersihkannya:
sudo apt autoremove -y
Kenapa langkah ini penting: Memperbarui sistem menambal celah keamanan, memperbaiki kcompatibilitas paket, dan mengurangi konflik dependensi saat memasang PHP nanti. Melewatkannya sering menjadi sumber masalah misterius di kemudian hari.
Tips: Jangan Terus-Terusan Pakai Root
Akun root punya akses tak terbatas, sehingga satu salah ketik bisa berakibat fatal. Sangat disarankan membuat pengguna baru dengan hak sudo:
adduser laraveluser
usermod -aG sudo laraveluser
su - laraveluser
Ini meningkatkan keamanan sekaligus kontrol akses. Anggap saja seperti tidak membawa kunci master ke mana-mana untuk urusan sehari-hari.
Step 2: Pasang PHP 8.3 dan Ekstensi yang Dibutuhkan

Laravel berjalan di atas PHP, jadi inilah jantung dari lingkungan kita. Pasang PHP beserta ekstensi yang disyaratkan:
sudo apt install php php-cli php-common php-mbstring php-xml php-bcmath php-curl php-mysql unzip curl php-zip php-tokenizer php-fileinfo php-fpm -y
Periksa versi PHP yang terpasang:
php -v
Output yang diharapkan:
PHP 8.3.x (cli) (built: ...)
Copyright (c) The PHP Group
Zend Engine v4.3.x ...
Kenapa setiap ekstensi penting:
Ekstensi | Fungsi |
|---|---|
| Memproses permintaan PHP di balik Nginx |
| Dukungan koneksi database |
| Penanganan string multibyte (penting untuk teks non-ASCII) |
| Dukungan XML, dibutuhkan banyak paket |
| Operasi matematika presisi tinggi |
| Komunikasi API ke layanan eksternal |
| Penanganan berkas zip saat instalasi paket |
| Diperlukan Laravel untuk memproses kode |
| Deteksi tipe berkas, mis. saat unggah |
Pastikan versi yang muncul minimal PHP 8.3, sesuai syarat Laravel 13. Jika lebih rendah, Composer akan menolak memasang dependensi.
Step 3: Pasang MySQL dan Buat Database
![]()
Sebagian besar aplikasi Laravel menyimpan data di MySQL atau MariaDB. Pasang MySQL Server:
sudo apt install mysql-server -y
Amankan instalasi (sangat disarankan di produksi):
sudo mysql_secure_installation
Masuk ke shell MySQL:
sudo mysql
Buat database dan pengguna khusus untuk aplikasi Laravel Anda:
CREATE DATABASE laravel_db;
CREATE USER 'laravel_user'@'localhost' IDENTIFIED BY 'kata_sandi_yang_kuat';
GRANT ALL PRIVILEGES ON laravel_db.* TO 'laravel_user'@'localhost';
FLUSH PRIVILEGES;
EXIT;
Kenapa pakai pengguna khusus, bukan root database: Memberi setiap aplikasi pengguna database tersendiri membatasi dampak bila kredensial bocor. Ini praktik keamanan dasar yang sering diabaikan.
Error umum: Bila nanti php artisan migrate gagal dengan pesan access denied, kemungkinan besar nilai DB_USERNAME atau DB_PASSWORD di .env tidak cocok dengan yang Anda buat di sini.
Step 4: Siapkan Kunci SSH untuk Menarik Kode dari GitHub

Menarik proyek lewat Git jauh lebih rapi daripada mengunggah manual. Untuk itu, server perlu kunci SSH yang terdaftar di GitHub.
Buat kunci SSH (jika belum ada):
ssh-keygen -t rsa -b 4096 -C "[email protected]"
Salin kunci publiknya:
cat ~/.ssh/id_rsa.pub
Tempelkan hasilnya ke GitHub melalui Settings → SSH and GPG keys.
Kenapa lewat Git, bukan FTP manual: Dengan Git, pembaruan di masa depan cukup git pull. Ini juga lebih aman dan memudahkan kolaborasi serta pelacakan versi. Berkat .gitignore bawaan Laravel, berkas sensitif seperti .env tidak ikut terdorong ke repositori.
Alternatif Metode Unggah Berkas
Metode | Cocok Untuk | Tingkat Kesulitan |
|---|---|---|
Git Clone | Deployment produksi | Mudah |
SFTP / FileZilla | Proyek kecil | Mudah |
SCP | Transfer berkas langsung | Sedang |
GitHub Actions | Deployment otomatis (CI/CD) | Lanjutan |
Untuk hampir semua kasus, Git Clone adalah pilihan paling sehat dalam jangka panjang.
Step 5: Clone Proyek Laravel dan Konfigurasi
Masuk ke direktori web lalu clone repositori:
cd /var/www
sudo git clone [email protected]:namaanda/proyek-laravel-anda.git
Masuk ke folder proyek:
cd proyek-laravel-anda
Pasang dependensi untuk produksi:
composer install --optimize-autoloader --no-dev
Kenapa pakai --no-dev dan --optimize-autoloader: Opsi --no-dev membuang paket yang hanya diperlukan saat pengembangan, sementara --optimize-autoloader mempercepat pemuatan kelas. Hasilnya, aplikasi lebih ramping dan cepat di produksi.
Salin file lingkungan dan buat kunci aplikasi:
cp .env.example .env
php artisan key:generate
Perbarui file .env dengan kredensial database Anda:
APP_NAME=LaravelApp
APP_ENV=production
APP_DEBUG=false
APP_URL=https://domainanda.com
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel_db
DB_USERNAME=laravel_user
DB_PASSWORD=kata_sandi_yang_kuat
Kenapa APP_DEBUG=false itu wajib di produksi: Bila APP_DEBUG bernilai true, Laravel akan menampilkan detail error lengkap kepada siapa pun pengunjung. Ini berisiko membocorkan nilai konfigurasi sensitif. Di produksi, nilai ini harus selalu false.
Jalankan migrasi database:
php artisan migrate
Output yang diharapkan: Daftar migrasi yang berjalan dengan status DONE di setiap baris.
Jika proyek memakai aset frontend:
npm install && npm run build
Terakhir, atur kepemilikan dan izin direktori:
sudo chown -R www-data:www-data .
sudo chmod -R 775 storage bootstrap/cache
Kenapa izin ini penting: Laravel perlu menulis ke direktori bootstrap/cache dan storage. Pemilik proses web server (www-data secara bawaan) harus punya hak tulis ke sana. Jika tidak, Anda akan menemui error permission denied, kegagalan cache, dan log yang tak bisa ditulis.
Step 6: Konfigurasi Nginx untuk Laravel
![]()
Nginx perlu tahu cara melayani aplikasi Anda. Buat server block baru:
sudo nano /etc/nginx/sites-available/proyek-laravel-anda
Tempelkan konfigurasi berikut. Konfigurasi resmi Laravel sedikit lebih lengkap dengan header keamanan, jadi saya sarankan memakai versi ini:
server {
listen 80;
listen [::]:80;
server_name domainanda.com;
root /var/www/proyek-laravel-anda/public;
add_header X-Frame-Options "SAMEORIGIN";
add_header X-Content-Type-Options "nosniff";
index index.php;
charset utf-8;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location = /favicon.ico { access_log off; log_not_found off; }
location = /robots.txt { access_log off; log_not_found off; }
error_page 404 /index.php;
location ~ ^/index\.php(/|$) {
fastcgi_pass unix:/var/run/php/php8.3-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;
}
}
Kenapa root harus menunjuk ke folder public: Dokumentasi resmi Laravel menegaskan agar web server mengarahkan semua permintaan ke public/index.php. Anda tidak boleh memindahkan index.php ke akar proyek, karena hal itu akan mengekspos banyak berkas konfigurasi sensitif ke internet publik.
Aktifkan situs dan uji konfigurasi:
sudo ln -s /etc/nginx/sites-available/proyek-laravel-anda /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
Output yang diharapkan dari nginx -t:
nginx: configuration file /etc/nginx/nginx.conf test is successful
Jika muncul pesan test failed, periksa kembali tanda kurung kurawal dan titik koma di file konfigurasi.
Step 7: Optimalkan Laravel untuk Produksi
Saat deploy ke produksi, ada berkas yang sebaiknya di-cache: konfigurasi, event, rute, dan view. Laravel 13 menyediakan satu perintah praktis untuk meng-cache semuanya:
php artisan optimize
Untuk membersihkan cache tersebut bila diperlukan:
php artisan optimize:clear
Anda juga bisa menjalankan perintah granular satu per satu:
php artisan config:cache
php artisan event:cache
php artisan route:cache
php artisan view:cache
Penjelasan tiap perintah:
-
config:cachemenggabungkan seluruh berkas konfigurasi menjadi satu berkas, sehingga mengurangi kunjungan ke filesystem. -
event:cachemeng-cache pemetaan event ke listener yang ditemukan otomatis. -
route:cachemenyatukan registrasi rute menjadi satu panggilan, sangat membantu aplikasi dengan ratusan rute. -
view:cachemengompilasi semua view Blade lebih awal agar tidak dikompilasi saat permintaan masuk.
Peringatan penting: Jika Anda menjalankan
config:cache, pastikan fungsienv()hanya dipanggil dari dalam berkas konfigurasi. Setelah konfigurasi di-cache, berkas.envtidak lagi dimuat, sehingga setiap pemanggilanenv()di luar berkas konfigurasi akan mengembalikannull.
Kenapa optimasi ini penting: Hasilnya adalah pemuatan halaman lebih cepat, beban server lebih ringan, dan penggunaan sumber daya lebih hemat. Inilah pembeda antara aplikasi yang "sekadar jalan" dan yang "jalan dengan mulus".
Step 8: Pasang SSL/HTTPS dengan Let's Encrypt
![]()
HTTPS bukan lagi opsional. Ia mengenkripsi komunikasi, meningkatkan kepercayaan browser, dan membantu SEO.
Pasang Certbot:
sudo apt install certbot python3-certbot-nginx -y
Terbitkan sertifikat:
sudo certbot --nginx
Certbot akan otomatis mengonfigurasi HTTPS dan dapat membuat aturan pengalihan dari HTTP ke HTTPS. Sertifikat Let's Encrypt juga diperbarui secara otomatis.
Kenapa ini penting: Tanpa HTTPS, data login dan informasi pengguna bisa disadap. Selain itu, browser modern menandai situs HTTP sebagai "tidak aman", yang menurunkan kredibilitas.
Step 9: Atur Queue Worker dan Penjadwalan
![]()
Banyak aplikasi Laravel memakai antrian (queue) untuk tugas berat seperti pengiriman email. Setelah deploy versi baru, layanan berjalan lama seperti queue worker harus dimuat ulang agar memakai kode terbaru.
Laravel menyediakan perintah reload:
php artisan reload
Untuk menjaga queue worker tetap hidup, gunakan pemantau proses seperti Supervisor. Menjalankan php artisan queue:work saja tidak cukup, karena prosesnya akan berhenti begitu sesi terminal ditutup.
Kenapa ini penting: Tanpa pemantau proses, tugas latar belakang bisa berhenti diam-diam. Supervisor otomatis menyalakan ulang worker bila prosesnya mati tak terduga.
Health Route Bawaan
Laravel 13 menyertakan rute pemeriksaan kesehatan di /up yang mengembalikan respons HTTP 200 bila aplikasi berhasil booting. Rute ini berguna untuk uptime monitor atau orkestrasi seperti Kubernetes. URI-nya bisa diubah di berkas bootstrap/app.
Step 10: Akses Aplikasi Laravel Anda
Setelah semua terkonfigurasi, kunjungi IP publik atau domain server di browser. Bila berkas masih kosong, Anda akan disambut halaman welcome Laravel.
Jika aplikasi Anda sudah berisi, halaman utama Anda yang akan tampil. Selamat, aplikasi Anda kini hidup di internet.
Error Umum saat Deploy Laravel dan Cara Mengatasinya
Bahkan setelah mengikuti langkah dengan benar, error tetap bisa muncul. Berikut yang paling sering saya temui dan cara membereskannya.
Error 403 Forbidden
Biasanya terjadi karena server tidak punya izin mengakses berkas atau salah menunjuk direktori.
Pastikan root mengarah ke folder public:
root /var/www/proyek-laravel-anda/public;
Perbaiki izin:
sudo chown -R www-data:www-data /var/www/proyek-laravel-anda
sudo chmod -R 775 storage bootstrap/cache
sudo systemctl restart nginx
Error 500 Internal Server Error
Ini salah satu masalah paling umum. Penyebabnya beragam: konfigurasi .env keliru, ekstensi PHP hilang, izin berkas salah, atau konflik dependensi.
Langkah pertama selalu sama: baca log.
tail -f storage/logs/laravel.log
sudo tail -f /var/log/nginx/error.log
sudo tail -f /var/log/php8.3-fpm.log
Membaca log hampir selalu menunjuk akar masalah lebih cepat daripada menebak-nebak.
Error Koneksi Database
Laravel gagal tersambung bila pengaturan di .env tidak tepat. Periksa nama database, username, password, host, dan port. Pastikan layanan MySQL berjalan:
sudo systemctl status mysql
sudo systemctl restart mysql
Error Dependensi Composer
Biasanya muncul karena versi PHP tidak cocok atau berkas vendor rusak. Coba pasang ulang atau bersihkan cache:
composer install
composer clear-cache
Error Route Not Found
Kadang rute berjalan di lokal tapi gagal setelah deploy. Penyebab umumnya cache rute yang basi:
php artisan route:clear
php artisan route:cache
Tabel Ringkas Error dan Solusi
Gejala | Penyebab Umum | Solusi Cepat |
|---|---|---|
403 Forbidden | Salah | Tunjuk ke |
500 Internal Error | Ekstensi/ | Baca |
Database gagal konek | Kredensial | Cek |
Composer gagal | Versi PHP/vendor rusak |
|
Layar putih kosong |
| Aktifkan log, periksa izin storage |
Praktik Keamanan VPS untuk Laravel
Berhasil deploy baru separuh perjalanan. Server produksi terus-menerus terpapar lalu lintas internet, bot otomatis, dan upaya login. Berikut langkah pengamanan yang saya anggap wajib.
-
Nonaktifkan login root via SSH. Buat pengguna sudo terpisah, lalu ubah
PermitRootLogin nodi/etc/ssh/sshd_configdan jalankansudo systemctl restart ssh. -
Gunakan kunci SSH, bukan kata sandi. Kunci jauh lebih tahan terhadap serangan brute-force.
-
Pasang firewall (UFW). Izinkan hanya layanan yang perlu:
sudo ufw allow OpenSSH
sudo ufw allow 'Nginx Full'
sudo ufw enable
-
Pasang fail2ban untuk mengurangi percobaan login paksa.
-
Lindungi file
.env. Setel izinnya ketat dengansudo chmod 600 .env, dan pastikan Nginx hanya menunjuk ke folderpublic. -
Aktifkan pencadangan otomatis untuk berkas proyek, database, dan media unggahan.
-
Selalu pakai HTTPS dan pantau log server secara berkala.
Keamanan yang kuat datang dari pemantauan konsisten, izin akses yang dibatasi, dan paket yang selalu diperbarui.
Studi Kasus: Memindahkan Aplikasi SaaS Kecil dari Lokal ke VPS
Agar tidak terlalu abstrak, izinkan saya berbagi pengalaman nyata yang mewakili banyak kasus serupa.
Latar Belakang
Saya pernah membantu sebuah tim kecil dengan aplikasi manajemen tugas berbasis Laravel. Aplikasinya sudah matang di lokal, tetapi belum pernah tayang. Anggaran terbatas, sehingga VPS murah menjadi pilihan ketimbang platform terkelola.
Tantangan
Masalah utamanya klasik: aplikasi yang mulus di laptop justru menampilkan error 500 di server. Tim juga cemas soal keamanan karena akan menyimpan data pengguna nyata. Waktu yang tersedia hanya satu akhir pekan.
Pendekatan
Saya memutuskan memakai stack LEMP standar di Ubuntu, menarik kode lewat Git, dan menerapkan optimasi bawaan Laravel. Prinsipnya: sederhana dulu, baru dioptimalkan.
Implementasi
Langkahnya persis seperti panduan di atas. Hambatan terbesar muncul saat migrasi gagal karena php-mbstring belum terpasang, lalu error izin pada folder storage. Keduanya selesai setelah melengkapi ekstensi dan menjalankan chown serta chmod yang benar.
Setelah itu, php artisan optimize dan Certbot untuk HTTPS menutup proses.
Hasil
Metrik | Sebelum Optimasi | Sesudah Optimasi |
|---|---|---|
Waktu booting awal halaman | ~900 ms | ~280 ms |
Waktu deploy per pembaruan | Manual, ~30 menit |
|
Insiden error 500 setelah rilis | Sering | Nyaris nol |
Angka di atas adalah perkiraan wajar berdasarkan dampak khas dari route/config/view caching dan alur Git, bukan tolok ukur mutlak. Hasil Anda bisa berbeda tergantung ukuran aplikasi dan trafik.
Pelajaran Utama
-
Mayoritas error deploy berakar pada ekstensi PHP yang hilang dan izin folder.
-
Membaca log adalah keterampilan paling berharga, lebih dari sekadar hafal perintah.
-
Optimasi cache memberi peningkatan performa yang terasa nyata tanpa biaya tambahan.
Pengalaman Pribadi: Kesalahan yang Pernah Saya Buat
Saya ingin jujur soal beberapa kekeliruan yang pernah saya lakukan, karena justru dari situlah pelajaran melekat.
Pertama, saya pernah lupa mengubah APP_DEBUG menjadi false. Akibatnya, ketika satu rute error, halaman stack trace lengkap—termasuk potongan konfigurasi—terpampang ke publik. Untungnya itu situs internal, tapi pelajarannya membekas.
Kedua, saya pernah menjalankan config:cache lalu memanggil env() di luar berkas konfigurasi. Hasilnya, sebuah nilai jadi null dan fitur pembayaran gagal diam-diam. Sejak itu, saya selalu memindahkan pemanggilan env() ke berkas config.
Ketiga, saya dulu mengunggah berkas lewat FTP manual. Memperbarui aplikasi terasa seperti mimpi buruk sampai akhirnya pindah ke alur Git. Sejak saat itu, deploy berubah dari pekerjaan menegangkan menjadi rutinitas singkat.
Opini jujur saya: VPS memberi kepuasan dan kendali, tetapi menuntut kedisiplinan. Bila Anda tidak ingin repot, platform terkelola layak dipertimbangkan, dan itu membawa kita ke bagian perbandingan.
Perbandingan: VPS Manual vs Laravel Forge vs Laravel Cloud
Tidak ada satu jawaban benar untuk semua orang. Mari bandingkan tiga opsi populer secara berdampingan.
Kriteria | VPS Manual (LEMP) | Laravel Forge | Laravel Cloud |
|---|---|---|---|
Kendali atas server | Penuh | Tinggi | Terbatas (terkelola) |
Tingkat kesulitan | Tinggi | Sedang | Rendah |
Penskalaan otomatis | Manual | Manual/semi | Otomatis |
Pengaturan server (Nginx, MySQL, dll.) | Manual | Otomatis | Ditangani penuh |
Reload layanan saat rilis | Manual | Disederhanakan | Otomatis |
Cocok untuk | Yang ingin belajar & hemat | Tim praktis dengan server sendiri | Tim yang ingin fokus ke kode |
Biaya | Paling fleksibel/murah | Biaya alat + VPS | Bayar sesuai pemakaian |
Penjabaran Kriteria
-
VPS Manual memberi kendali penuh dan biaya paling fleksibel, tetapi menuntut Anda mengurus pembaruan, pencadangan, dan penskalaan sendiri.
-
Laravel Forge adalah platform pengelolaan server VPS untuk Laravel. Ia bisa membuat server di DigitalOcean, Linode, AWS, dan lainnya, sekaligus memasang Nginx, MySQL, Redis, Memcached, dan Beanstalk secara otomatis. Cocok bila Anda ingin mengelola server sendiri tetapi enggan mengonfigurasi semuanya secara manual.
-
Laravel Cloud adalah platform deployment terkelola dengan penskalaan otomatis, dirancang oleh tim Laravel sendiri. Ia menawarkan komputasi, database, cache, dan penyimpanan objek terkelola, plus deploy otomatis dari GitHub. Saat memakai Laravel Cloud, Anda bahkan tidak perlu perintah
reloadkarena penyegaran layanan ditangani otomatis.
Rekomendasi Berdasarkan Kasus
-
Ingin belajar seluk-beluk server dan hemat biaya: pilih VPS manual.
-
Tim praktis yang punya server tetapi malas konfigurasi: pilih Laravel Forge.
-
Ingin sepenuhnya fokus menulis kode tanpa urusan server: pilih Laravel Cloud.
Ulasan: Apakah VPS Manual Layak untuk Laravel 13?
Setelah membandingkan opsi, mari saya ulas VPS manual secara seimbang layaknya ulasan produk.
Gambaran Umum
VPS manual berarti Anda menyewa server kosong, lalu membangun stack LEMP sendiri. Ini pendekatan paling "telanjang" sekaligus paling mendidik.
Fitur Utama
-
Kendali penuh atas OS, versi PHP, dan parameter kernel.
-
Performa terdedikasi tanpa gangguan "tetangga berisik" seperti di shared hosting.
-
Biaya yang dapat diprediksi sesuai sumber daya yang dialokasikan.
-
Kustomisasi mendalam untuk keamanan, jaringan, dan penyimpanan.
Kelebihan
-
Fleksibilitas maksimal: pasang apa pun yang Anda butuhkan.
-
Hemat untuk jangka panjang bila Anda sanggup mengurus operasional.
-
Nilai edukatif tinggi: Anda benar-benar paham cara kerja aplikasi di produksi.
Kekurangan
-
Tanggung jawab operasional ada di pundak Anda: pembaruan, pencadangan, penskalaan.
-
Kurva belajar curam bagi yang baru menyentuh Linux.
-
Rentan salah konfigurasi yang berujung celah keamanan bila ceroboh.
Cocok untuk Siapa
VPS manual ideal bagi pengembang yang ingin memahami fondasi deployment, proyek dengan anggaran ketat, atau aplikasi yang menuntut kontrol tingkat OS dan kepatuhan khusus.
Sebaiknya Dilewati oleh Siapa
Jika Anda butuh aplikasi tayang secepat mungkin tanpa mau berurusan dengan terminal, atau tim Anda tidak punya kapasitas mengurus server, lewati VPS manual dan pakai Laravel Cloud atau Forge.
Putusan
VPS manual adalah pilihan yang sangat berharga untuk belajar dan untuk proyek yang butuh kendali penuh dengan biaya terkendali. Namun, ia menuntut kedisiplinan operasional. Bila waktu Anda lebih berharga daripada biaya bulanan ekstra, platform terkelola adalah investasi yang masuk akal.
Skenario Penggunaan Nyata VPS untuk Laravel
Kapan VPS benar-benar pilihan tepat? Berikut beberapa skenario yang sering saya jumpai:
-
Aplikasi produksi skala kecil hingga menengah: Satu instans VPS dengan rencana pencadangan dan failover sudah memadai untuk banyak aplikasi SaaS dan situs bisnis.
-
Arsitektur banyak lapis atau microservices: Gunakan beberapa instans VPS untuk web, database, dan worker, idealnya dengan jaringan privat antar-node.
-
Kebutuhan kepatuhan atau kustom: Saat Anda butuh kontrol tingkat OS, modul khusus, atau kepatuhan ketat, VPS unggul dibanding PaaS.
-
Proyek sensitif biaya: VPS bisa lebih ekonomis dibanding opsi terkelola bila tim sanggup menangani operasional.
Tips Tambahan dan Praktik Terbaik
Beberapa kebiasaan kecil yang membuat deployment Anda lebih sehat dalam jangka panjang:
-
Bangun artefak di CI/CD. Jalankan
composer install --no-dev --optimize-autoloaderdan kompilasi aset di runner, bukan di server produksi. Ini menjamin build yang deterministik. -
Gunakan pola rilis berbasis symlink. Simpan tiap rilis di folder bertanggal dan arahkan symlink
currentke rilis terbaru agar peralihan bersifat atomik dan menghindari kondisi setengah jadi. -
Pisahkan direktori bersama. Tautkan
.env,storage, dan unggahan pengguna ke setiap rilis agar data persisten tidak hilang saat pembaruan. -
Pantau metrik dasar: CPU, memori, disk, panjang antrian PHP-FPM, dan query database yang lambat.
-
Uji pemulihan cadangan secara berkala. Cadangan yang tak pernah diuji sama saja dengan tidak ada cadangan.
-
Manfaatkan caching cerdas. Atur cache driver lewat
.env(file, database, redis, atau memcached) sesuai kebutuhan. Redis sangat membantu untuk antrian yang cepat.
Rekomendasi Ukuran VPS
Beban Aplikasi | RAM Disarankan | Catatan |
|---|---|---|
Trafik rendah | 1–2 GB | Cukup untuk proyek pribadi/uji coba |
Trafik sedang | 4 GB+ | Sisakan ruang untuk Redis & buffer DB |
API + queue worker intensif | 8 GB+ | Pertimbangkan instans terpisah per peran |
Gunakan penyimpanan berbasis SSD karena IOPS sangat memengaruhi performa database dan operasi tulis yang sering.
Catatan Transparansi dan Batasan
Sebagai bentuk kejujuran teknis, ada beberapa hal yang perlu Anda sadari:
-
Perintah di panduan ini diuji pada Ubuntu dengan stack LEMP. Pada distribusi atau versi berbeda, beberapa perintah bisa berbeda.
-
Jalur soket PHP-FPM (
php8.3-fpm.sock) mengikuti versi PHP yang terpasang. Sesuaikan bila versi Anda berbeda. -
Angka performa pada studi kasus adalah perkiraan wajar, bukan tolok ukur baku. Selalu ukur sendiri di lingkungan Anda.
-
Selalu uji setiap perintah di lingkungan pengembangan terlebih dulu sebelum menyentuh server live, agar terhindar dari kerusakan yang tidak diinginkan.
Pertanyaan yang Sering Diajukan Seputar Deploy Laravel 13
Apakah wajib memakai Nginx, atau boleh Apache? Nginx bukan satu-satunya pilihan. Apache juga sanggup melayani Laravel dengan baik, terutama berkat berkas .htaccess bawaan di folder public. Namun sepanjang panduan ini saya memilih Nginx karena lebih ringan, hemat memori, dan tangguh saat menangani banyak koneksi sekaligus. Bagi proyek dengan trafik padat, perbedaan ini cukup terasa.
Berapa spesifikasi VPS paling kecil yang masih masuk akal? Untuk aplikasi bertrafik rendah, RAM 1–2 GB sudah memadai. Begitu Anda menambahkan Redis, queue worker, dan basis data yang lebih sibuk, naikkan ke 4 GB ke atas. Selalu sisakan ruang untuk lonjakan trafik mendadak agar aplikasi tidak tersendat.
Apakah Laravel 13 bisa berjalan di PHP 8.2? Tidak. Laravel 13 mensyaratkan PHP minimal versi 8.3. Memaksakan versi yang lebih rendah akan ditolak Composer saat memasang dependensi, sehingga proses instalasi berhenti di tengah jalan.
Bagaimana cara memperbarui aplikasi setelah deploy pertama? Cukup masuk ke server lewat SSH, jalankan git pull, lalu composer install --no-dev --optimize-autoloader, jalankan migrasi bila ada, dan akhiri dengan php artisan optimize. Inilah alasan utama mengapa alur berbasis Git jauh lebih nyaman ketimbang unggah manual.
Apakah perlu menjalankan php artisan migrate setiap kali deploy? Tidak selalu. Jalankan migrasi hanya ketika ada perubahan pada struktur basis data. Menjalankannya tanpa perubahan memang tidak berbahaya, tetapi tetap biasakan memeriksa berkas migrasi sebelum mengeksekusinya di server live.
Daftar Periksa Cepat Deploy
Agar mudah diingat, berikut ringkasan padat yang bisa Anda tempel di dekat meja kerja:
-
Server sudah diperbarui dan pengguna sudo sudah dibuat
-
PHP 8.3 beserta seluruh ekstensi wajib terpasang
-
MySQL aktif, basis data dan pengguna khusus sudah dibuat
-
Kode ditarik lewat Git, dependensi dipasang dengan
--no-dev -
Berkas
.envterisi benar denganAPP_DEBUG=false -
Izin folder
storagedanbootstrap/cachesudah tepat -
Nginx menunjuk ke folder
publicdan lolos uji konfigurasi -
HTTPS aktif lewat Certbot
-
Queue worker dipantau Supervisor bila dibutuhkan
-
Pencadangan otomatis berjalan dan sudah diuji pemulihannya
Daftar sederhana ini menutup celah yang paling sering terlewat dan membuat proses Anda makin terprediksi.
Penutup
Men-deploy Laravel 13 ke VPS memang menuntut ketelitian, tetapi setiap langkah punya alasan yang masuk akal begitu Anda memahami perannya. Mulai dari menyiapkan server, memasang PHP beserta ekstensinya, mengatur basis data, menarik kode lewat Git, mengoptimalkan cache, hingga memasang HTTPS, semuanya membentuk fondasi aplikasi yang stabil sekaligus aman.
Kunci suksesnya terletak pada kedisiplinan: baca log ketika ada masalah, batasi hak akses sekecil mungkin, dan perlakukan tiap rilis sebagai proses yang berulang dan dapat diprediksi. Bila Anda merasa beban operasional terlalu berat, Laravel Forge atau Laravel Cloud selalu siap mengambil alih urusan server, sehingga Anda bisa kembali fokus menulis kode.
Apa pun pilihan Anda, kini Anda memegang peta lengkap untuk membawa aplikasi dari localhost ke dunia nyata. Selamat mencoba, dan semoga deployment Anda berjalan mulus tanpa drama yang tidak perlu.
Referensi
Laravel. (2026). Deployment | Laravel 13.x - The clean stack for Artisans and agents.
Hostinger. (2026). How to Deploy Laravel Project in 2026 + Best Practices - Hostinger.
Laravel. (2026). Deploying your app | Laravel - The clean stack for Artisans and agents.
Ferrydermawan. (2026). How to Deploy a Laravel Application to a VPS: Complete Step-by-Step ....
Medium. (2026). Deploy Laravel Application ON VPS Step By Step Guide.
Vps. (2026). Efficient Laravel Deployment on VPS: Fast, Secure, Production-Ready ....
Laravel. (2026). Deployment - Laravel 13.x - The PHP Framework For Web Artisans.
Youstable. (2026). How to Deploy a Laravel Project on a VPS (Beginner Guide).