Logo
/
Deploy Laravel ke VPS dengan Nginx dan MySQL Lengkap

 

Deploy Laravel ke VPS dengan Nginx dan MySQL Lengkap



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 -y
sudo apt install -y curl unzip git zip software-properties-common

Perintah 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-fpm

MySQL 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-server
sudo mysql_secure_installation

Setelah proses pengamanan selesai, masuk ke MySQL lewat akun root. Buat database baru serta user khusus yang punya akses penuh ke database tersebut.

sudo mysql

Setelah 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 nginx

  • Composer 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/namaproject
sudo chown -R $USER:$USER /var/www/namaproject
cd /var/www/namaproject
git 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-dev

File .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:

VariabelNilai LokalNilai Production
APP_ENVlocalproduction
APP_DEBUGtruefalse
DB_CONNECTIONsqlitemysql
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:generate

Migrasi 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 migrate

Jika 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:seed

Permission 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/namaproject
sudo 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/cache

Build 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 nodejs
cd /var/www/namaproject
npm install
npm run build

Error 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 -t
sudo systemctl reload nginx

Sertifikat 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:cache
php artisan route:cache
php artisan view:cache

Queue 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 supervisor
sudo 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=2
sudo supervisorctl reread
sudo supervisorctl update
sudo 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>&1

Kalau 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 status

Izinkan 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

Artikel Selanjutnya Ini adalah artikel terbaru