Deployment yang buruk membatalkan semua kerja keras sebelumnya dalam satu menit. Kabar baiknya, deployment Laravel yang aman pada dasarnya adalah urutan tetap yang sama setiap kali — dan justru sifat berulang itulah yang membuatnya bisa diperiksa dengan checklist. Chapter ini memampatkan seluruh section Deployment dan Production menjadi satu runbook: persiapan sebelum rilis, urutan langkah saat rilis, verifikasi sesudahnya, dan resep untuk kegagalan yang paling sering terjadi. Cetak sekali, tempel di sebelah terminal, dan biarkan menjadi refleks saat tombol deploy ditekan.
Pra-Deploy #
Empat hal ini diperiksa sebelum menyentuh server produksi, berurutan dari yang termurah. Keseluruhan pra-deploy yang sehat biasanya hanya memakan waktu di bawah lima belas menit.
- Test hijau di lokal dan CI —
php artisan testlulus semua; deployment atas test merah adalah undangan insiden. - Backup database terbaru — dump penuh tersimpan dan, lebih penting, sudah dicoba dipulihkan minimal sekali.
- Audit dependensi —
composer auditbersih, seperti dibahas di Referensi Keamanan . - Tinjau migration baru — perintah DDL berat (tambah kolom
NOT NULL, ubah tipe) dipecah agar tidak mengunci tabel besar; pembahasannya di Database Migration Production .
Urutan Langkah Deploy #
| # | Langkah | Perintah | Catatan |
|---|---|---|---|
| 1 | Tarik kode terbaru | git pull / release artifact | mode maintenance belum perlu |
| 2 | Pasang dependensi | composer install --no-dev --optimize-autoloader | tanpa paket dev |
| 3 | Build aset frontend | npm ci && npm run build | hasilnya di public/build |
| 4 | Jalankan migration | php artisan migrate --force | --force wajib di produksi |
| 5 | Bangun semua cache | php artisan optimize | config + route + view sekaligus |
| 6 | Restart queue worker | php artisan queue:restart | agar worker memuat kode baru |
| 7 | Pastikan scheduler | cron * * * * * php artisan schedule:run | cek schedule:list |
| 8 | Hidupkan aplikasi | php artisan up | bila tadi di-maintenance |
Langkah 5 dan 6 adalah dua yang paling sering dilupakan. Berikut output nyata php artisan optimize di sandbox Course ini, memperlihatkan empat cache yang dibangun:
INFO Caching framework bootstrap, configuration, and metadata.
config ......................................................... 7.23ms DONE
events ......................................................... 0.94ms DONE
routes ......................................................... 9.17ms DONE
views .......................................................... 38.30ms DONESedangkan perintah migrate dengan --force terlihat seperti ini pada kondisi tanpa migration baru — yang justru sinyal sehat bila rilis tidak membawa perubahan skema:
INFO Nothing to migrate.Mengapa urutannya penting: migration dijalankan sebelum cache dibangun dan sebelum worker direstart, sehingga saat kode baru mulai melayani request, skema database sudah siap. Simpan tabel ini sebagai skrip atau job di CI — prinsip otomatisasinya dibahas di Deployment Workflow .
Pasca-Deploy #
Menyatakan rilis selesai butuh bukti, bukan perasaan. Jalankan smoke test manual tiga menit berikut.
- Buka halaman depan dan satu halaman ber-data (login bila perlu).
- Lakukan satu aksi tulis (tambah/ubah data) untuk memastikan migration dan
storage/sehat. - Kirim satu aksi yang menulis ke queue (bila ada), lalu pastikan job terproses.
- Amati log selama 15-30 menit pertama:
tail -f storage/logs/laravel.logatauphp artisan pail.
Untuk pemantauan berkelanjutan, konfigurasi channel dan alertnya dibahas di Logging dan Monitoring , sedangkan prosedur mundur bila semuanya berantakan ada di Rollback dan Recovery .
Satu keputusan yang perlu disepakati sebelum insiden terjadi: kapan memperbaiki maju dan kapan mundur. Aturan praktis kami — bila smoke test gagal pada langkah pertama atau kedua dan penyebabnya belum jelas dalam sepuluh menit, mundur ke versi sebelumnya; rilis yang sehat lebih berharga daripada harga diri. Sebaliknya, bila penyebabnya sudah terbaca di log dan perbaikannya berupa perubahan kecil, memperbaiki maju lebih murah daripada membatalkan seluruh rilis.
Resep Kegagalan Umum #
| Gejala pasca-deploy | Penyebab umum | Perbaikan |
|---|---|---|
| 500 segera setelah deploy | Config/route cache basi | php artisan optimize:clear dulu, baru optimize |
Permission denied di log/upload | Web server tak bisa menulis storage/ | sesuaikan kepemilikan storage/ dan bootstrap/cache |
Ekstensi hilang (ext-...) | PHP server tanpa ekstensi | cocokkan composer check-platform-reqs dengan php -m |
| Halaman lama masih tampil | OPcache / worker belum restart | restart php-fpm; queue:restart |
| Migration macet di tengah | Tabel besar terkunci DDL | pecah migration, gunakan jendela tenang |
Bila gejalanya tidak masuk tabel ini, kembali ke prosedur umum di Panduan Debugging — log tetap titik berangkat pertama.
Khusus Deploy Pertama #
Server kosong butuh lima langkah tambahan yang tidak muncul lagi di rilis berikutnya: salin .env produksi (APP_ENV=production, APP_DEBUG=false), jalankan php artisan key:generate, buat symlink php artisan storage:link, pasang entri cron scheduler, dan pasang supervisor untuk queue:work --tries=3 — semuanya dibahas di section Production Environment
hingga Queue Worker Production
. Jangan lupa mengunci izin folder produksi sesuai Storage Permissions
dan menuntaskan Production Security Checklist
.
Aplikasi kini hidup di produksi — dan dengan itu seluruh aspek teknis Course ini telah tersambung. Satu hal terakhir yang perlu kita susun adalah arah belajar ke depan: chapter penutup, Roadmap Belajar .