Beranda Blog Auto Cara Deploy Project Laravel 13 ke VPS da...

Auto

Cara Deploy Project Laravel 13 ke VPS dari Nol Sampai Online

A
Admin
24 menit baca
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.

BASH
ssh root@alamat-ip-server

Jika server memakai autentikasi berbasis kunci:

BASH
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:

BASH
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:

BASH
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:

BASH
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:

BASH
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:

BASH
php -v

Output yang diharapkan:

TEXT
PHP 8.3.x (cli) (built: ...)
Copyright (c) The PHP Group
Zend Engine v4.3.x ...

Kenapa setiap ekstensi penting:

Ekstensi

Fungsi

php-fpm

Memproses permintaan PHP di balik Nginx

php-mysql

Dukungan koneksi database

php-mbstring

Penanganan string multibyte (penting untuk teks non-ASCII)

php-xml

Dukungan XML, dibutuhkan banyak paket

php-bcmath

Operasi matematika presisi tinggi

php-curl

Komunikasi API ke layanan eksternal

php-zip

Penanganan berkas zip saat instalasi paket

php-tokenizer

Diperlukan Laravel untuk memproses kode

php-fileinfo

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:

BASH
sudo apt install mysql-server -y

Amankan instalasi (sangat disarankan di produksi):

BASH
sudo mysql_secure_installation

Masuk ke shell MySQL:

BASH
sudo mysql

Buat database dan pengguna khusus untuk aplikasi Laravel Anda:

SQL
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):

BASH
ssh-keygen -t rsa -b 4096 -C "[email protected]"

Salin kunci publiknya:

BASH
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:

BASH
cd /var/www
sudo git clone [email protected]:namaanda/proyek-laravel-anda.git

Masuk ke folder proyek:

BASH
cd proyek-laravel-anda

Pasang dependensi untuk produksi:

BASH
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:

BASH
cp .env.example .env
php artisan key:generate

Perbarui file .env dengan kredensial database Anda:

INI
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:

BASH
php artisan migrate

Output yang diharapkan: Daftar migrasi yang berjalan dengan status DONE di setiap baris.

Jika proyek memakai aset frontend:

BASH
npm install && npm run build

Terakhir, atur kepemilikan dan izin direktori:

BASH
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:

BASH
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:

NGINX
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:

BASH
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:

TEXT
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:

BASH
php artisan optimize

Untuk membersihkan cache tersebut bila diperlukan:

BASH
php artisan optimize:clear

Anda juga bisa menjalankan perintah granular satu per satu:

BASH
php artisan config:cache
php artisan event:cache
php artisan route:cache
php artisan view:cache

Penjelasan tiap perintah:

  • config:cache menggabungkan seluruh berkas konfigurasi menjadi satu berkas, sehingga mengurangi kunjungan ke filesystem.

  • event:cache meng-cache pemetaan event ke listener yang ditemukan otomatis.

  • route:cache menyatukan registrasi rute menjadi satu panggilan, sangat membantu aplikasi dengan ratusan rute.

  • view:cache mengompilasi semua view Blade lebih awal agar tidak dikompilasi saat permintaan masuk.

Peringatan penting: Jika Anda menjalankan config:cache, pastikan fungsi env() hanya dipanggil dari dalam berkas konfigurasi. Setelah konfigurasi di-cache, berkas .env tidak lagi dimuat, sehingga setiap pemanggilan env() di luar berkas konfigurasi akan mengembalikan null.

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:

BASH
sudo apt install certbot python3-certbot-nginx -y

Terbitkan sertifikat:

BASH
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:

BASH
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:

NGINX
root /var/www/proyek-laravel-anda/public;

Perbaiki izin:

BASH
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.

BASH
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:

BASH
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:

BASH
composer install
composer clear-cache

Error Route Not Found

Kadang rute berjalan di lokal tapi gagal setelah deploy. Penyebab umumnya cache rute yang basi:

BASH
php artisan route:clear
php artisan route:cache

Tabel Ringkas Error dan Solusi

Gejala

Penyebab Umum

Solusi Cepat

403 Forbidden

Salah root atau izin

Tunjuk ke /public, perbaiki izin

500 Internal Error

Ekstensi/.env/izin

Baca laravel.log, lengkapi ekstensi

Database gagal konek

Kredensial .env salah

Cek .env, restart MySQL

Composer gagal

Versi PHP/vendor rusak

composer install, clear-cache

Layar putih kosong

APP_DEBUG=false + error

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 no di /etc/ssh/sshd_config dan jalankan sudo 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:

BASH
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 dengan sudo chmod 600 .env, dan pastikan Nginx hanya menunjuk ke folder public.

  • 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

git pull + cache, ~3 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 reload karena 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-autoloader dan 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 current ke 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 .env terisi benar dengan APP_DEBUG=false

  • Izin folder storage dan bootstrap/cache sudah tepat

  • Nginx menunjuk ke folder public dan 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).