Deployment adalah salah satu tahap paling krusial dalam siklus pengembangan aplikasi web. Setelah aplikasi selesai dibangun di lingkungan lokal, langkah selanjutnya adalah membuat aplikasi tersebut dapat diakses oleh pengguna melalui internet. Dalam panduan ini, kita akan membahas secara lengkap bagaimana cara men-deploy aplikasi Laravel ke Ubuntu Server menggunakan Nginx sebagai web server, serta mengeksposnya ke internet menggunakan Cloudflare Tunnel.
Panduan ini dibagi menjadi 12 langkah utama yang mencakup seluruh proses dari instalasi dependencies hingga konfigurasi Cloudflare Tunnel agar website Anda dapat diakses dengan domain custom dan HTTPS otomatis.
Prasyarat
- Server Ubuntu 20.04 atau lebih baru (bisa VPS, dedicated server, atau bahkan komputer lokal)
- Akses root atau sudo ke server
- Repository project Laravel yang sudah siap di GitHub
- Akun Cloudflare dengan domain yang sudah terdaftar (untuk bagian Cloudflare Tunnel)
- Koneksi internet yang stabil pada server
Bagian 1: Setup Server & Deploy Laravel
Step 1 — Install Dependencies
Langkah pertama adalah mempersiapkan server dengan menginstall seluruh software yang dibutuhkan. Laravel memerlukan PHP 8.2 atau lebih baru beserta sejumlah extension PHP, Composer untuk manajemen package PHP, Node.js untuk build frontend assets, Nginx sebagai web server, dan MySQL sebagai database.
Update sistem dan install PHP beserta extension-nya:
# Update package list dan upgrade sistem
apt update && apt upgrade -y
# Install PHP 8.2+ dan seluruh extension yang dibutuhkan Laravel
apt install -y php php-cli php-fpm php-mysql php-mbstring php-xml php-curl php-zip php-gd unzip git nginx mysql-server
Extension PHP yang diinstall memiliki fungsi masing-masing: php-mysql untuk koneksi database, php-mbstring untuk manipulasi string multibyte, php-xml untuk parsing XML, php-curl untuk HTTP request, php-zip untuk kompresi file, dan php-gd untuk manipulasi gambar.
Install Composer dan Node.js:
# Install Composer (dependency manager untuk PHP)
curl -sS https://getcomposer.org/installer | php
mv composer.phar /usr/local/bin/composer
# Install Node.js 20 LTS (dibutuhkan untuk build frontend assets)
curl -fsSL https://deb.nodesource.com/setup_20.x | bash -
apt install -y nodejs
Pastikan semua terinstall dengan benar dengan menjalankan php -v, composer -V, dan node -v untuk mengecek versi masing-masing.
Step 2 — Clone Repository
Setelah semua dependencies terinstall, langkah berikutnya adalah mengunduh source code project dari GitHub ke server. Kita akan meletakkan project di direktori /var/www yang merupakan lokasi standar untuk web applications di Linux.
# Pindah ke direktori web server
cd /var/www
# Clone repository dari GitHub
git clone https://github.com/donarazhar/myblog.git
# Masuk ke direktori project
cd myblog
Jika repository Anda bersifat private, Anda perlu mengkonfigurasi SSH key atau menggunakan personal access token untuk autentikasi.
Step 3 — Setup Laravel
Sekarang kita perlu menginstall semua dependency PHP melalui Composer dan mengkonfigurasi environment variable. Flag --no-dev memastikan hanya package production yang diinstall, dan --optimize-autoloader meningkatkan performa autoloading class.
# Install PHP dependencies (production mode)
composer install --no-dev --optimize-autoloader
# Salin file environment template
cp .env.example .env
# Edit file environment sesuai konfigurasi server
nano .env
⚠️ Penting! Sesuaikan file .env dengan konfigurasi server Anda. Berikut variabel yang harus diubah:
APP_ENV=production— Mengatur mode aplikasi ke productionAPP_DEBUG=false— Menonaktifkan debug mode agar error detail tidak tereksposAPP_URL=http://IP_SERVER_ANDA— URL dimana aplikasi akan diaksesDB_DATABASE=myblog— Nama database yang akan digunakanDB_USERNAME=root— Username database MySQLDB_PASSWORD=password_anda— Password database MySQL
Step 4 — Setup Database
Laravel menggunakan MySQL sebagai database. Kita perlu membuat database baru, lalu menjalankan migrasi untuk membuat tabel-tabel yang dibutuhkan dan seeder untuk mengisi data awal.
Buat database MySQL:
# Masuk ke MySQL console
mysql -u root -p
# Buat database baru
CREATE DATABASE myblog;
# Keluar dari MySQL
exit;
Generate application key dan jalankan migrasi:
# Generate encryption key untuk Laravel
php artisan key:generate
# Jalankan migrasi database dan seeder
php artisan migrate --seed
# Buat symbolic link untuk akses file storage dari public
php artisan storage:link
Perintah key:generate akan menghasilkan encryption key unik yang digunakan Laravel untuk mengenkripsi session, cookies, dan data sensitif lainnya. Perintah migrate --seed akan membuat semua tabel database dan mengisi data awal. Perintah storage:link membuat symlink dari public/storage ke storage/app/public agar file yang di-upload dapat diakses via URL.
Step 5 — Build Frontend
Laravel modern menggunakan Vite sebagai build tool untuk mengompilasi dan mengoptimasi file CSS dan JavaScript. Proses build akan menghasilkan file-file yang sudah di-minify dan di-cache untuk performa optimal di production.
# Install seluruh npm package yang dibutuhkan
npm install
# Build assets untuk production (CSS & JS di-minify dan di-hash)
npm run build
Setelah proses build selesai, file-file hasil kompilasi akan tersimpan di direktori public/build. File-file ini sudah siap untuk digunakan di production dengan filename yang di-hash untuk cache busting.
Step 6 — Set Permissions
Pengaturan permission yang benar sangat penting untuk keamanan dan fungsionalitas Laravel. Web server Nginx berjalan sebagai user www-data, sehingga user ini memerlukan akses ke file-file project, terutama direktori storage dan bootstrap/cache yang digunakan Laravel untuk menulis file cache, log, dan session.
# Set kepemilikan seluruh project ke user www-data
chown -R www-data:www-data /var/www/myblog
# Set permission untuk direktori storage (read, write, execute)
chmod -R 755 /var/www/myblog/storage
# Set permission untuk direktori bootstrap/cache
chmod -R 755 /var/www/myblog/bootstrap/cache
Tanpa permission yang benar, Laravel tidak akan bisa menulis file log, menyimpan session, atau melakukan cache konfigurasi, yang akan menyebabkan error 500 pada website.
Step 7 — Konfigurasi Nginx
Nginx bertindak sebagai web server yang menerima HTTP request dari client dan meneruskannya ke PHP-FPM untuk diproses oleh Laravel. Kita perlu membuat virtual host configuration file yang mendefinisikan bagaimana Nginx harus menangani request untuk website kita.
Buat file konfigurasi:
nano /etc/nginx/sites-available/myblog
Isi dengan konfigurasi berikut:
server {
listen 80;
server_name IP_SERVER_ANDA;
root /var/www/myblog/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 ~ \.php$ {
fastcgi_pass unix:/var/run/php/php8.2-fpm.sock;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ /\.(?!well-known).* {
deny all;
}
}
Konfigurasi di atas mengarahkan semua request ke public/index.php (entry point Laravel), menggunakan PHP-FPM untuk memproses file PHP, dan menambahkan security header untuk perlindungan dasar. Directive location ~ /\. terakhir memblokir akses ke file tersembunyi (seperti .env) untuk keamanan.
Step 8 — Enable & Restart Nginx
Setelah konfigurasi dibuat, kita perlu mengaktifkan site dengan membuat symbolic link ke direktori sites-enabled, menghapus konfigurasi default, dan merestart Nginx.
# Aktifkan konfigurasi site myblog
ln -s /etc/nginx/sites-available/myblog /etc/nginx/sites-enabled/
# Hapus konfigurasi default Nginx (opsional)
rm /etc/nginx/sites-enabled/default
# Test konfigurasi Nginx untuk memastikan tidak ada error syntax
nginx -t
# Restart Nginx untuk menerapkan perubahan
systemctl restart nginx
✅ Local Access Ready! Jika semua langkah berhasil, website Anda sekarang dapat diakses melalui http://IP_SERVER_ANDA dalam jaringan lokal. Buka browser dan akses IP server untuk memastikan Laravel berjalan dengan baik.
Bagian 2: Cloudflare Tunnel Setup
Jika Anda ingin mengekspos server lokal ke internet tanpa perlu port forwarding atau IP publik statis, Cloudflare Tunnel adalah solusi yang tepat. Tunnel ini membuat koneksi terenkripsi dari server Anda ke jaringan Cloudflare, sehingga website dapat diakses via domain custom dengan HTTPS otomatis — tanpa biaya tambahan.
Step 9 — Install Cloudflared
Cloudflared adalah daemon yang menjalankan tunnel antara server Anda dan jaringan Cloudflare. Download dan install dari repository resmi:
# Download package cloudflared terbaru
curl -L --output cloudflared.deb https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb
# Install package
dpkg -i cloudflared.deb
# Verifikasi instalasi berhasil
cloudflared --version
Step 10 — Create Tunnel
Setelah Cloudflared terinstall, login ke akun Cloudflare Anda dan buat tunnel baru. Proses login akan membuka URL di browser untuk autentikasi — jika server tidak memiliki GUI, copy URL yang ditampilkan dan buka di browser komputer lain.
# Login ke akun Cloudflare (akan memberikan URL untuk autentikasi)
cloudflared tunnel login
# Buat tunnel baru bernama "myblog"
cloudflared tunnel create myblog
📝 Catat Tunnel ID! Setelah tunnel berhasil dibuat, akan muncul Tunnel ID berupa UUID (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx). Simpan ID ini karena dibutuhkan untuk konfigurasi selanjutnya.
Step 11 — Configure Tunnel
Buat file konfigurasi YAML yang mendefinisikan bagaimana tunnel harus merutekan traffic dari domain ke service di server lokal.
Buat file konfigurasi:
# Buat direktori konfigurasi (jika belum ada)
mkdir -p ~/.cloudflared
# Edit file konfigurasi
nano ~/.cloudflared/config.yml
Isi file config.yml:
tunnel: <TUNNEL_ID>
credentials-file: /root/.cloudflared/<TUNNEL_ID>.json
ingress:
- hostname: donarazhar.site
service: http://localhost:80
- hostname: www.donarazhar.site
service: http://localhost:80
- service: http_status:404
Ganti <TUNNEL_ID> dengan UUID tunnel Anda. Bagian ingress mendefinisikan routing: request ke donarazhar.site dan www.donarazhar.site akan diteruskan ke Nginx di port 80, sedangkan request lainnya akan mendapat response 404.
Route DNS domain ke tunnel:
# Arahkan domain utama ke tunnel
cloudflared tunnel route dns myblog donarazhar.site
# Arahkan subdomain www ke tunnel
cloudflared tunnel route dns myblog www.donarazhar.site
Update APP_URL di Laravel:
# Edit file .env untuk mengubah APP_URL
nano /var/www/myblog/.env
# Ubah APP_URL menjadi domain Cloudflare:
# APP_URL=https://donarazhar.site
# Clear dan re-cache konfigurasi Laravel
cd /var/www/myblog && php artisan config:cache
Step 12 — Run as Service
Agar tunnel berjalan otomatis setiap kali server boot (restart), kita perlu menginstall Cloudflared sebagai system service. Sebelum itu, lakukan test dulu untuk memastikan tunnel berjalan dengan benar.
# Test tunnel terlebih dahulu (tekan Ctrl+C untuk stop)
cloudflared tunnel run myblog
# Jika tunnel berhasil berjalan, install sebagai system service
cloudflared service install
# Start service
systemctl start cloudflared
# Enable auto-start saat boot
systemctl enable cloudflared
# Cek status service
systemctl status cloudflared
🎉 Deployment Complete! Website Anda sekarang dapat diakses dari mana saja melalui:
https://donarazhar.sitehttps://www.donarazhar.site
Cloudflare secara otomatis menyediakan sertifikat SSL/TLS sehingga website Anda langsung memiliki HTTPS tanpa perlu konfigurasi tambahan.
Troubleshooting
Berikut beberapa masalah umum yang mungkin ditemui beserta solusinya:
- Error 502 Bad Gateway — Pastikan PHP-FPM berjalan:
systemctl status php8.2-fpm - Error 500 Internal Server Error — Cek log Laravel di
storage/logs/laravel.logdan pastikan permission sudah benar - Halaman blank putih — Biasanya terkait permission, jalankan ulang perintah
chowndanchmod - Tunnel tidak connect — Pastikan config.yml sudah benar dan Tunnel ID sesuai
- Assets tidak muncul (CSS/JS) — Pastikan sudah menjalankan
npm run builddanphp artisan storage:link
Kesimpulan
Dalam panduan ini, kita telah berhasil men-deploy aplikasi Laravel dari awal hingga akhir, dimulai dari instalasi dependencies di Ubuntu Server, konfigurasi Nginx sebagai web server, setup database MySQL, hingga mengekspos server ke internet menggunakan Cloudflare Tunnel. Dengan setup ini, website Anda memiliki koneksi yang aman melalui HTTPS, dapat diakses dari mana saja, dan tunnel akan berjalan otomatis setiap kali server restart.