Cara Deploy Laravel ke VPS untuk Pemula

Deploy Laravel ke VPS berarti memindahkan aplikasi dari laptop ke server agar bisa diakses lewat domain publik. Jawaban cepatnya: siapkan server Linux, install Nginx, PHP-FPM, Composer, database, clone project, isi .env, jalankan composer install, php artisan migrate, build asset, arahkan Nginx ke folder public, lalu aktifkan HTTPS.

Untuk pemula, bagian paling penting bukan menghafal semua perintah, tetapi memahami urutannya. Laravel tidak boleh diarahkan ke root project, melainkan ke folder public. File .env production juga harus berbeda dari .env lokal.

Kapan Kamu Perlu VPS?

VPS cocok jika kamu ingin:

  • menjalankan Laravel dengan domain sendiri
  • belajar deploy yang mirip production nyata
  • mengatur Nginx, PHP-FPM, queue, scheduler, dan database sendiri
  • punya kontrol lebih besar dibanding shared hosting
  • menyiapkan portofolio yang bisa dibuka rekruter atau client

Kalau project masih latihan sangat awal, Laravel Herd di lokal sudah cukup. VPS mulai masuk akal saat project sudah punya database, auth, upload file, API, atau background job.

Gambaran Arsitektur Sederhana

Di server, request biasanya mengalir seperti ini:

Browser
  -> Domain
  -> Nginx
  -> public/index.php
  -> PHP-FPM
  -> Laravel
  -> Database

Nginx menerima request HTTP. PHP-FPM menjalankan kode PHP. Laravel membaca route, controller, model, view, dan config dari project kamu.

Checklist Deploy Laravel ke VPS

Gunakan checklist ini sebagai urutan kerja:

  1. Siapkan VPS Linux dan domain.
  2. Install Nginx, PHP-FPM, Composer, Node.js, dan database.
  3. Clone project Laravel dari Git.
  4. Install dependency backend dengan Composer.
  5. Buat file .env production.
  6. Generate APP_KEY jika project baru.
  7. Jalankan migration.
  8. Build asset frontend jika memakai Vite.
  9. Set permission folder storage dan bootstrap/cache.
  10. Buat konfigurasi Nginx ke folder public.
  11. Aktifkan HTTPS.
  12. Jalankan queue worker dan scheduler jika project membutuhkannya.

Untuk detail yang sering jadi sumber error setelah go live, gunakan checklist Laravel .env Production, Scheduler Laravel di Production, dan Storage Link Laravel Tidak Jalan di Server.

Contoh Perintah Dasar

Contoh berikut memakai folder /var/www/toko-laravel. Sesuaikan nama folder, user server, versi PHP, dan database dengan server kamu.

cd /var/www
git clone [email protected]:username/toko-laravel.git
cd toko-laravel

composer install --no-dev --optimize-autoloader
cp .env.example .env
php artisan key:generate

Edit .env production:

APP_NAME="Toko Laravel"
APP_ENV=production
APP_KEY=base64:isi-dari-key-generate
APP_DEBUG=false
APP_URL=https://tokolaravel.com

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=toko_laravel
DB_USERNAME=toko_user
DB_PASSWORD=password-kuat

Lalu jalankan:

php artisan migrate --force
php artisan storage:link
npm ci
npm run build
php artisan optimize

--force diperlukan karena Laravel akan meminta konfirmasi saat migration dijalankan di environment production. Jangan pakai migrate:fresh di production karena perintah itu menghapus semua tabel.

Jika php artisan storage:link berhasil tetapi gambar tetap 404, lanjutkan ke Storage Link Laravel Tidak Jalan di Server untuk mengecek symlink, disk public, Nginx, dan permission.

Setup Permission Folder

Laravel harus bisa menulis ke storage dan bootstrap/cache.

sudo chown -R www-data:www-data storage bootstrap/cache
sudo chmod -R ug+rw storage bootstrap/cache

Nama user web server bisa berbeda. Di beberapa server, user-nya www-data; di server lain bisa nginx atau user deploy khusus.

Konfigurasi Nginx Minimal

Konfigurasi lengkap dibahas di Setup Nginx + PHP-FPM untuk Laravel, tetapi bentuk minimalnya seperti ini:

server {
    listen 80;
    server_name tokolaravel.com www.tokolaravel.com;
    root /var/www/toko-laravel/public;

    index index.php index.html;

    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;
    }
}

Bagian paling penting adalah root /var/www/toko-laravel/public;. Kalau root diarahkan ke /var/www/toko-laravel, file .env, composer.json, dan folder internal bisa ikut terekspos.

Setelah Deploy, Cek Ini

Jalankan beberapa pengecekan cepat:

php artisan about
php artisan route:list
php artisan migrate:status
php artisan queue:failed

Buka halaman utama, login, form penting, upload file, dan halaman yang membaca database. Kalau ada error view atau migration, jangan langsung mengubah banyak hal. Mulai dari pesan error yang spesifik.

Kesalahan yang Sering Terjadi

Mengaktifkan APP_DEBUG=true di Production

APP_DEBUG=true bisa menampilkan stack trace dan detail konfigurasi. Di server publik, gunakan:

APP_ENV=production
APP_DEBUG=false

Nginx Diarahkan ke Root Project

Laravel harus diarahkan ke folder public. Jangan arahkan Nginx ke folder utama project.

Lupa Build Asset

Kalau CSS atau JavaScript tidak berubah setelah deploy, kemungkinan npm run build belum dijalankan atau folder hasil build belum ikut tersedia.

Menjalankan Migration Tanpa Backup

Sebelum deploy perubahan database besar, buat backup. Migration production harus dianggap serius karena menyentuh data nyata.

Queue Worker Tidak Dijalankan

Fitur email, notifikasi, import, export, atau job background tidak akan diproses jika queue worker belum berjalan. Gunakan Supervisor untuk Queue Laravel agar worker hidup otomatis.

Pencegahan Masalah Deploy

  1. Simpan source code di Git.
  2. Jangan commit file .env.
  3. Pakai .env.example sebagai template.
  4. Jalankan test sebelum deploy.
  5. Catat perintah deploy dalam checklist.
  6. Pisahkan database lokal dan production.
  7. Aktifkan HTTPS sebelum membagikan link.

Bacaan Terkait

FAQ

Apakah deploy Laravel ke VPS harus memakai Nginx?

Tidak harus, tetapi Nginx + PHP-FPM adalah kombinasi umum untuk server Linux. Yang penting web server diarahkan ke folder public.

Apakah boleh menjalankan php artisan serve di production?

Jangan gunakan php artisan serve untuk production. Gunakan web server seperti Nginx atau Apache yang memang dirancang untuk melayani traffic publik.

Kenapa halaman jalan di lokal tetapi error di VPS?

Biasanya karena versi PHP berbeda, extension PHP belum ada, .env production belum benar, permission folder belum cocok, atau nama file berbeda huruf besar-kecil.

Apakah composer install perlu dijalankan di server?

Ya, jika dependency tidak dibawa dari proses build/deploy lain. Untuk production, gunakan composer install --no-dev --optimize-autoloader.

Kapan perlu Supervisor?

Pakai Supervisor saat aplikasi memakai queue worker. Tanpa Supervisor, worker bisa mati saat terminal ditutup atau server restart.