Cara Deploy Laravel di VPS KVM NVMe Jakarta untuk Toko Online
Bagaimana jika toko online Laravel yang sudah Anda bangun berminggu-minggu hanya bisa dibuka di laptop sendiri, sementara pelanggan menunggu? Itulah yang dialami Rina, pemilik toko perlengkapan kopi bernama "Kopi Kita". Aplikasinya sudah jalan sempurna di komputer lokal, tetapi ia bingung bagaimana membawanya ke internet. Artikel ini mengikuti langkah Rina men-deploy Laravel ke VPS KVM NVMe di Jakarta, dari server kosong sampai toko online yang bisa diakses publik dengan HTTPS.
Panduan ini ditulis untuk pemula. Semua perintah diuji pada Ubuntu 24.04 LTS dan bisa Anda ikuti berurutan. Fokusnya sempit dan praktis: satu aplikasi Laravel toko online, satu VPS, satu domain.
Gambaran Studi Kasus: Toko Kopi Kita
Kebutuhan Rina cukup umum untuk toko online skala kecil sampai menengah:
- Aplikasi Laravel 11 dengan katalog produk, keranjang, dan checkout.
- Database MySQL untuk produk dan pesanan.
- Antrean (queue) untuk mengirim email konfirmasi pesanan.
- Pengunjung mayoritas dari Indonesia, sehingga latensi rendah sangat berpengaruh pada kecepatan halaman.
- Anggaran terbatas, sehingga VPS entry level sudah cukup di awal.
Rina memilih VPS KVM dengan penyimpanan NVMe di Jakarta. Lokasi Jakarta membuat waktu respons ke pengunjung Indonesia lebih pendek dibanding server di luar negeri, dan NVMe mempercepat operasi baca-tulis database, terutama saat banyak pesanan masuk bersamaan. Spesifikasi awalnya: 2 vCPU, 2 GB RAM, 40 GB NVMe, dengan root access.
Glosarium Istilah untuk Pemula
- VPS (Virtual Private Server): server virtual dengan sumber daya yang dialokasikan khusus untuk Anda.
- KVM: teknologi virtualisasi yang memberi Anda kernel dan sumber daya terisolasi, bukan sekadar berbagi dengan pengguna lain.
- NVMe: jenis SSD modern yang jauh lebih cepat dari SSD SATA biasa.
- Root access: hak akses administrator penuh ke server.
- SSH: cara aman mengendalikan server lewat terminal dari komputer Anda.
- Nginx: web server yang menerima permintaan browser.
- PHP-FPM: proses yang menjalankan kode PHP Laravel atas permintaan Nginx.
- Composer: pengelola paket PHP.
- Queue worker: proses latar belakang yang mengerjakan tugas berat, seperti kirim email.
Analogi sederhana: bayangkan toko fisik. VPS adalah ruko yang Anda sewa, Nginx adalah kasir di depan yang menyambut pembeli, PHP-FPM adalah pegawai yang meracik pesanan, dan MySQL adalah gudang tempat semua stok dicatat. Queue worker adalah kurir yang mengantar pesanan tanpa membuat kasir menunggu.
Langkah 1: Masuk ke Server dan Amankan Dasar
Setelah VPS aktif, Anda menerima alamat IP dan kata sandi root. Masuk lewat terminal:
ssh root@IP_SERVER_ANDAPerbarui paket lalu buat pengguna non-root agar Anda tidak bekerja sebagai root setiap saat:
apt update && apt upgrade -y
adduser deploy
usermod -aG sudo deployAktifkan firewall dasar, izinkan SSH dan web saja:
ufw allow OpenSSH
ufw allow "Nginx Full"
ufw enableJika perintah Nginx belum dikenali, jalankan setelah Nginx terpasang pada langkah berikutnya.
Langkah 2: Pasang Nginx, PHP, dan MySQL
Kopi Kita memakai PHP 8.3 yang kompatibel dengan Laravel 11. Pasang semua kebutuhan sekaligus:
sudo apt install -y nginx mysql-server unzip git curl \
php8.3-fpm php8.3-mysql php8.3-mbstring php8.3-xml \
php8.3-curl php8.3-zip php8.3-bcmath php8.3-intl php8.3-gdPasang Composer:
curl -sS https://getcomposer.org/installer | php
sudo mv composer.phar /usr/local/bin/composerLangkah 3: Siapkan Database
Jalankan sudo mysql, lalu buat database dan pengguna khusus aplikasi. Jangan memakai akun root MySQL untuk Laravel.
CREATE DATABASE kopikita CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'kopi_user'@'localhost' IDENTIFIED BY 'KataSandiKuat!2026';
GRANT ALL PRIVILEGES ON kopikita.* TO 'kopi_user'@'localhost';
FLUSH PRIVILEGES;Langkah 4: Unggah Kode dan Pasang Dependensi
Rina menyimpan kode di repositori Git. Letakkan aplikasi di /var/www/kopikita:
sudo mkdir -p /var/www/kopikita
sudo chown deploy:deploy /var/www/kopikita
cd /var/www/kopikita
git clone URL_REPOSITORI .
composer install --no-dev --optimize-autoloaderFlag --no-dev membuang paket pengembangan yang tidak perlu di produksi, sehingga lebih ringan dan aman.
Langkah 5: Konfigurasi File .env
cp .env.example .env
php artisan key:generate
nano .envUbah nilai penting berikut:
APP_ENV=production
APP_DEBUG=false
APP_URL=https://kopikita.example
DB_DATABASE=kopikita
DB_USERNAME=kopi_user
DB_PASSWORD=KataSandiKuat!2026
QUEUE_CONNECTION=databasePastikan APP_DEBUG=false. Jika true, halaman error bisa membocorkan kredensial dan struktur aplikasi kepada pengunjung.
Lanjutkan dengan migrasi dan optimasi cache:
php artisan migrate --force
php artisan storage:link
php artisan config:cache
php artisan route:cache
php artisan view:cacheAtur izin folder agar Laravel bisa menulis log dan cache:
sudo chown -R deploy:www-data /var/www/kopikita
sudo chmod -R 775 /var/www/kopikita/storage /var/www/kopikita/bootstrap/cacheLangkah 6: Konfigurasi Nginx
Buat file /etc/nginx/sites-available/kopikita:
server {
listen 80;
server_name kopikita.example www.kopikita.example;
root /var/www/kopikita/public;
index index.php;
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;
}
# Blokir akses file tersembunyi seperti .env
location ~ /\.(?!well-known) {
deny all;
}
}Poin terpenting: root mengarah ke folder public, bukan folder utama proyek. Dengan begitu file .env tidak pernah terjangkau dari web. Aktifkan situs:
sudo ln -s /etc/nginx/sites-available/kopikita /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginxLangkah 7: Arahkan Domain dan Pasang SSL
Di pengelola DNS domain Anda, buat record A yang mengarah ke IP VPS, untuk domain utama dan www. Tunggu propagasi, biasanya beberapa menit hingga satu jam. Lalu pasang sertifikat gratis Let's Encrypt:
sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d kopikita.example -d www.kopikita.exampleCertbot otomatis mengubah konfigurasi Nginx untuk HTTPS dan menjadwalkan pembaruan sertifikat. HTTPS wajib untuk toko online karena halaman checkout memproses data pelanggan.
Langkah 8: Jalankan Queue Worker dengan Supervisor
Tanpa worker, email konfirmasi pesanan Kopi Kita tidak akan pernah terkirim. Pasang Supervisor agar worker hidup terus dan menyala ulang otomatis:
sudo apt install -y supervisorBuat /etc/supervisor/conf.d/kopikita-worker.conf:
[program:kopikita-worker]
command=php /var/www/kopikita/artisan queue:work --sleep=3 --tries=3 --max-time=3600
autostart=true
autorestart=true
user=deploy
numprocs=1
redirect_stderr=true
stdout_logfile=/var/www/kopikita/storage/logs/worker.logsudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl start kopikita-worker:*Tambahkan juga scheduler Laravel lewat crontab -e milik pengguna deploy:
* * * * * cd /var/www/kopikita && php artisan schedule:run >> /dev/null 2>&1Langkah 9: Uji Hasilnya
Buka domain di browser. Lalu lakukan pengujian fungsional seperti Rina:
- Buka beranda dan halaman produk, pastikan gambar tampil.
- Tambahkan produk ke keranjang dan selesaikan checkout percobaan.
- Periksa apakah email konfirmasi masuk, bukti worker bekerja.
- Cek ikon gembok HTTPS di browser.
- Lihat
storage/logs/laravel.loguntuk memastikan tidak ada error.
Setelah semua beres, Rina mencatat halaman produk termuat jauh lebih cepat dibanding hosting bersama sebelumnya. Hasil ini wajar karena ia mendapat sumber daya khusus, disk NVMe, dan server yang dekat dengan pembelinya. Angka pastinya akan berbeda pada tiap aplikasi, jadi ukur sendiri dengan membandingkan waktu muat sebelum dan sesudah pindah.
Kesalahan Umum Pemula
- Error 403 atau 500 setelah deploy: hampir selalu karena izin folder
storagedanbootstrap/cache. Ulangi perintahchmoddanchowndi Langkah 5. - Root Nginx salah: mengarahkan ke folder proyek, bukan
public. Akibatnya halaman tidak tampil atau.envterekspos. - Lupa menjalankan
config:cachesetelah mengubah.env: perubahan tidak terbaca. Jalankanphp artisan config:clearlalu cache ulang. - APP_DEBUG masih true: membocorkan informasi sensitif di produksi.
- Ekstensi PHP kurang: pesan seperti "could not find driver" berarti
php8.3-mysqlbelum terpasang. - Worker tidak berjalan: pesanan masuk tetapi email tidak terkirim. Cek status dengan
sudo supervisorctl status. - Tidak ada backup: database toko adalah aset utama. Jadwalkan
mysqldumpharian dan simpan salinannya di luar server. - Login SSH hanya dengan kata sandi: beralihlah ke SSH key dan nonaktifkan login root agar lebih aman.
Alur Update Aplikasi Berikutnya
Setiap kali ada fitur baru, Rina cukup menjalankan urutan ini di server:
cd /var/www/kopikita
git pull
composer install --no-dev --optimize-autoloader
php artisan migrate --force
php artisan config:cache && php artisan route:cache && php artisan view:cache
sudo supervisorctl restart kopikita-worker:*Restart worker penting karena proses lama masih memegang kode versi sebelumnya di memori.
Kapan Perlu Upgrade Resource?
Mulailah dari paket kecil, lalu pantau. Tanda perlu upgrade: penggunaan RAM terus di atas 80 persen, CPU tinggi saat promo, atau waktu respons naik ketika pengunjung ramai. Karena memakai KVM, Anda bisa menambah RAM dan vCPU tanpa memigrasi ulang seluruh aplikasi. Pantau dengan htop dan free -h sebelum memutuskan.
Kesimpulan
Men-deploy Laravel ke VPS tidak serumit kelihatannya jika dikerjakan berurutan: amankan server, pasang Nginx, PHP-FPM, dan MySQL, konfigurasi .env, arahkan domain dengan SSL, lalu jalankan queue worker. Kopi Kita kini berjalan stabil di server Jakarta dengan biaya bulanan yang terkendali. Jika Anda ingin mencoba langkah yang sama, VPS Indonesia menyediakan VPS KVM NVMe di Jakarta dengan root access, mulai dari 20 ribu rupiah per bulan, cukup untuk memulai toko online pertama Anda tahun ini.

