Aplikasi sudah lengkap dan jalan mulus di laravel13-blog-dasar.test. Episode ini kita bahas cara membawanya ke server sungguhan supaya bisa diakses publik lewat domain asli.
Perintah caching production (config:cache, route:cache, view:cache) berjalan sukses.
Requirement server
Sebelum mulai, pastikan VPS kamu punya:
- PHP 8.3+ dengan extension standar (mbstring, xml, curl, mysql, gd, zip)
- MySQL 8+
- Nginx
- Composer
- Node.js + npm (hanya dipakai saat build, tidak perlu jalan terus di production)
Clone dan install dependency
git clone <your-repo-url> /var/www/blog-dasar
cd /var/www/blog-dasar
composer install --optimize-autoloader --no-dev
npm install && npm run build
Flag --no-dev di composer memastikan package development (testing, debugging) tidak ikut terpasang di production — mengurangi ukuran dan potensi celah keamanan.
Environment production
cp .env.example .env
php artisan key:generate
Edit .env dengan kredensial database production yang sesungguhnya, dan pastikan dua baris ini:
APP_ENV=production
APP_DEBUG=false
APP_DEBUG=false itu wajib. Kalau dibiarkan true di production, error apa pun akan menampilkan stack trace lengkap ke publik — termasuk isi file .env dalam beberapa kasus. Ini salah satu kebocoran keamanan paling umum di aplikasi Laravel yang deploy sembarangan.
Migration dan storage link
php artisan migrate --force
php artisan storage:link
Flag --force diperlukan karena secara default Laravel menolak menjalankan migration di environment production tanpa konfirmasi eksplisit — ini pengaman supaya tidak ada yang tidak sengaja menjalankan migration production.
Caching untuk performa
php artisan config:cache
php artisan route:cache
php artisan view:cache
Ketiga perintah ini meng-compile config, route, dan view jadi satu file cache, menghindari Laravel membaca ulang puluhan file setiap request — dampaknya signifikan untuk response time di production.
Permission storage dan cache
chown -R www-data:www-data storage bootstrap/cache
chmod -R 775 storage bootstrap/cache
Web server (biasanya user www-data) butuh akses tulis ke folder ini untuk log, cache, dan file upload.
Konfigurasi Nginx
server {
listen 80;
server_name your-domain.com;
root /var/www/blog-dasar/public;
index index.php;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
fastcgi_pass unix:/var/run/php/php8.3-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
}
location ~ /\.(?!well-known).* {
deny all;
}
}
Perhatikan root mengarah ke folder public, bukan root repository — ini penting supaya file sensitif seperti .env dan app/ tidak bisa diakses langsung lewat URL.
SSL gratis dengan Let's Encrypt
sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d your-domain.com
Certbot otomatis mengurus konfigurasi HTTPS di Nginx dan memperbarui sertifikat sebelum expired.
Alur update setelah deploy pertama
git pull origin main
composer install --optimize-autoloader --no-dev
npm run build
php artisan migrate --force
php artisan config:cache
php artisan route:cache
php artisan view:cache
Selanjutnya
Ini episode terakhir yang berisi kode — episode penutup berikutnya adalah rangkuman seluruh perjalanan seri ini.