Cara Deploy Aplikasi Laravel di VPS Ubuntu 24.04
Panduan langkah deploy Laravel 13 di VPS Ubuntu 24.04 dengan Nginx, PHP-FPM, dan MariaDB, lengkap dengan izin folder, cache, queue, dan scheduler.
Jawaban singkat
Deploy Laravel di Ubuntu 24.04 berarti memasang PHP 8.3 beserta ekstensinya, Composer, database, dan Nginx yang diarahkan ke folder public. Setelah itu atur .env produksi, izin folder storage, cache optimize, queue worker, dan cron scheduler.
Daftar isi
- Langkah 1: Siapkan server dan pengguna
- Langkah 2: Pasang PHP 8.3 dan ekstensi yang dibutuhkan Laravel
- Langkah 3: Pasang Composer
- Langkah 4: Siapkan database
- Langkah 5: Ambil kode dan pasang dependensi
- Langkah 6: Atur file .env produksi
- Langkah 7: Atur izin folder
- Langkah 8: Konfigurasi Nginx
- Langkah 9: Bagaimana mengoptimalkan untuk produksi?
- Langkah 10: Queue worker dan scheduler
- Komponen apa saja yang sudah terpasang?
- Pertanyaan yang sering diajukan
Aplikasimu sudah jalan mulus di laptop dengan php artisan serve, lalu bagaimana memindahkannya ke VPS supaya bisa dibuka orang lain dengan aman? Jawabannya: siapkan PHP-FPM, Composer, database, dan Nginx yang menunjuk ke folder public, lalu jalankan beberapa perintah Artisan khusus produksi.
Panduan ini memakai Ubuntu 24.04, yang membawa PHP 8.3 di repositori bawaannya. Versi itu pas dengan syarat Laravel 13, yang per 6 November 2026 meminta minimal PHP 8.3 menurut catatan rilis resmi. Kalau aplikasimu masih Laravel 12, PHP 8.3 juga termasuk versi yang didukung.
Langkah 1: Siapkan server dan pengguna
Mulai dari VPS yang sudah diamankan: login dengan SSH key, firewall aktif, dan pembaruan sudah dijalankan. Kalau belum, ikuti dulu langkah awal mengamankan VPS baru.
sudo apt update && sudo apt upgrade -y
sudo adduser deploy
sudo usermod -aG www-data deploy
Pengguna deploy dipakai untuk menarik kode dan menjalankan Composer. Hindari menjalankan aplikasi sebagai root.
Langkah 2: Pasang PHP 8.3 dan ekstensi yang dibutuhkan Laravel
Dokumentasi deployment Laravel menyebut ekstensi seperti Ctype, cURL, DOM, Fileinfo, Mbstring, OpenSSL, PDO, Tokenizer, dan XML. Sebagian sudah termasuk dalam paket inti PHP, sisanya dipasang begini:
sudo apt install -y nginx php8.3-fpm php8.3-cli php8.3-mysql \
php8.3-mbstring php8.3-xml php8.3-curl php8.3-zip php8.3-bcmath \
php8.3-intl unzip git
Cek dengan php -v dan php -m. Kalau aplikasi memakai PostgreSQL, ganti php8.3-mysql dengan php8.3-pgsql.
Langkah 3: Pasang Composer
Ikuti petunjuk instalasi resmi di getcomposer.org (unduh installer, cocokkan hash, jalankan), lalu pindahkan file composer.phar ke /usr/local/bin/composer. Paket composer dari apt juga bisa dipakai, tapi versinya bisa tertinggal dari rilis terbaru.
Langkah 4: Siapkan database
sudo apt install -y mariadb-server
sudo mariadb-secure-installation
sudo mariadb
Di konsol MariaDB, buat database dan pengguna khusus:
CREATE DATABASE appku CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'appku'@'localhost' IDENTIFIED BY 'ganti-password-kuat';
GRANT ALL PRIVILEGES ON appku.* TO 'appku'@'localhost';
FLUSH PRIVILEGES;
Biarkan MariaDB hanya mendengarkan 127.0.0.1. Database tidak perlu dibuka ke internet.
Langkah 5: Ambil kode dan pasang dependensi
sudo mkdir -p /var/www/appku && sudo chown deploy:www-data /var/www/appku
sudo -u deploy git clone https://github.com/akunmu/appku.git /var/www/appku
cd /var/www/appku
sudo -u deploy composer install --no-dev --optimize-autoloader
Kalau aplikasi memakai Vite, jalankan npm ci && npm run build di server (butuh Node.js) atau bangun aset di mesin CI lalu kirim hasil folder public/build.
Langkah 6: Atur file .env produksi
sudo -u deploy cp .env.example .env
sudo -u deploy php artisan key:generate
Isi minimal yang perlu diubah:
APP_ENV=production
APP_DEBUG=false
APP_URL=https://appku.example
DB_CONNECTION=mysql
DB_DATABASE=appku
DB_USERNAME=appku
DB_PASSWORD=ganti-password-kuat
Lalu jalankan migrasi: sudo -u deploy php artisan migrate --force. Opsi --force diperlukan karena Laravel meminta konfirmasi saat migrasi di lingkungan produksi.
Langkah 7: Atur izin folder
Laravel perlu menulis ke storage dan bootstrap/cache. Berikan akses tulis ke grup www-data (pengguna PHP-FPM di Ubuntu), bukan chmod 777:
sudo chown -R deploy:www-data storage bootstrap/cache
sudo chmod -R ug+rwX storage bootstrap/cache
Langkah 8: Konfigurasi Nginx
Buat /etc/nginx/sites-available/appku. Konfigurasi ini diadaptasi dari contoh di dokumentasi deployment Laravel, dengan socket PHP 8.3:
server {
listen 80;
listen [::]:80;
server_name appku.example;
root /var/www/appku/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;
}
}
Perhatikan root yang menunjuk ke folder public. Jangan pernah mengarahkan domain ke akar proyek, karena file .env dan kode sumber bisa ikut terbuka. Aktifkan situs:
sudo ln -s /etc/nginx/sites-available/appku /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx
Setelah domain mengarah ke IP server, pasang HTTPS dengan Let's Encrypt dan Certbot.
Langkah 9: Bagaimana mengoptimalkan untuk produksi?
sudo -u deploy php artisan optimize
Perintah ini menyimpan cache konfigurasi, event, route, dan view sekaligus. Akibatnya, setiap kali .env atau konfigurasi diubah, jalankan lagi php artisan optimize, karena setelah konfigurasi di-cache file .env tidak dibaca ulang.
Langkah 10: Queue worker dan scheduler
Kalau aplikasi memakai antrean, jalankan worker sebagai layanan systemd agar hidup lagi saat server reboot. Buat /etc/systemd/system/appku-queue.service:
[Unit]
Description=Laravel queue worker appku
After=network.target
[Service]
User=deploy
Group=www-data
WorkingDirectory=/var/www/appku
ExecStart=/usr/bin/php artisan queue:work --sleep=3 --tries=3 --max-time=3600
Restart=always
[Install]
WantedBy=multi-user.target
Aktifkan dengan sudo systemctl enable --now appku-queue. Untuk scheduler, tambahkan cron milik pengguna deploy lewat sudo -u deploy crontab -e:
* * * * * cd /var/www/appku && php artisan schedule:run >> /dev/null 2>&1
Setiap kali deploy versi baru, jalankan php artisan queue:restart agar worker memuat kode terbaru.
Komponen apa saja yang sudah terpasang?
| Komponen | Pilihan di panduan ini | Catatan |
|---|---|---|
| PHP | 8.3 (bawaan Ubuntu 24.04) | Minimal untuk Laravel 13 |
| Web server | Nginx + PHP-FPM | Root ke folder public |
| Database | MariaDB | Hanya di 127.0.0.1 |
| Queue | systemd | Restart otomatis |
| Scheduler | cron tiap menit | schedule:run |
Pertanyaan yang sering diajukan
Apakah harus memakai Nginx, tidak bisa Apache?
Bisa memakai Apache. Yang penting document root mengarah ke folder public dan semua request diteruskan ke public/index.php.
Apa yang perlu dilakukan setiap kali deploy ulang?
Urutan umumnya: git pull, composer install --no-dev --optimize-autoloader, php artisan migrate --force, php artisan optimize, lalu php artisan queue:restart.
Kenapa muncul error "Permission denied" di storage/logs?
Biasanya karena file dibuat oleh pengguna lain (misalnya root saat menjalankan Artisan). Jalankan ulang perintah chown dan chmod di langkah 7, dan biasakan menjalankan Artisan sebagai pengguna deploy.
Berapa spesifikasi VPS minimal untuk Laravel?
Untuk aplikasi kecil dengan database di server yang sama, 1 sampai 2 GB RAM biasanya cukup untuk mulai. Pantau pemakaian dan naikkan bila antrean atau trafik bertambah.
Checklist sebelum aplikasi diumumkan:
APP_ENV=productiondanAPP_DEBUG=false.- Nginx menunjuk ke folder
public, bukan akar proyek. - Izin
storagedanbootstrap/cachebenar, tanpa777. - HTTPS aktif dan perpanjangan otomatis sudah diuji.
- Queue worker berjalan sebagai layanan, cron scheduler terpasang.
- Backup database terjadwal.


