Pendahuluan

Deployment CodeIgniter 3 di bare metal menuntut keseriusan pada otomatisasi, rollback, dan observability agar downtime minimal. Artikel ini menjelaskan bagaimana menyiapkan environment, menjalankan pipeline deployment, memantau status aplikasi, serta menyiapkan rollback dan postmortem ringan agar tim bisa merespons masalah dengan cepat.

Langkah-langkah berikut mengacu pada operasi yang bisa dijalankan di server fisik atau VM self-managed tanpa platform container, sehingga fokusnya adalah pada kontrol file, layanan PHP-FPM/NGINX, dan database yang sudah ada.

Persiapan Lingkungan Bare Metal

Stack PHP, Database, dan Storage

Pastikan versi PHP yang dipakai kompatibel dengan CodeIgniter 3 (misalnya PHP 7.4+). Instalasi harus mencakup ekstensi mysqli/pdo, fileinfo, dan opcaching. Rekomendasikan konfigurasi berikut pada php.ini:

memory_limit = 256M
realpath_cache_size = 4096k
opcache.enable=1

Database harus memiliki backup rutin (mysqldump atau Percona XtraBackup) serta pengguna terbatas untuk aplikasi. Storage penting untuk folder application/cache dan uploads yang perlu writable, serta diatur pemantauan kapasitas disk.

Konfigurasi Network dan Permissions

NGINX atau Apache melayani codebase dari direktori release, bukan workspace git. Gunakan user khusus (www-data atau sebanding) agar proses PHP tidak berjalan sebagai root. Atur firewall untuk hanya membuka port 80/443, dan aktifkan fail2ban untuk mencegah brute-force.

Pipeline Deployment dan Checklist

Pipeline wajib mencakup beberapa tahapan: pull kode, lint (misalnya PHPCS), backup data, deploy release, dan verifikasi health. Di bare metal, implementasi sederhana bisa berupa skrip bash yang dijalankan dari Jenkins/GitLab CI runner.

Contoh checklist deployment manual:

  1. Tarik branch release dari git ke direktori staging.
  2. Jalankan composer install --no-dev dan php spark migrate jika menggunakan fitur upgrade.
  3. Snapshot database dan copy folder uploads.
  4. Jalankan rsync ke direktori release baru.
  5. Uji health check endpoint.
  6. Symlink release baru dan reload PHP-FPM.
  7. Monitor log error selama 5 menit pertama.

Contoh Skrip Deploy

# Path standar
RELEASE_DIR=/var/www/ci3/releases/$(date +%Y%m%d%H%M)
CURRENT=/var/www/ci3/current
mkdir -p "$RELEASE_DIR"
git archive --format=tar HEAD | tar -x -C "$RELEASE_DIR"
rsync -a --exclude='.git' "$RELEASE_DIR"/ "$RELEASE_DIR/"
rm -f $CURRENT
ln -s "$RELEASE_DIR" $CURRENT
systemctl reload php8.1-fpm

Penjelasan: arsip git memastikan hanya file tracked ditransfer, dan symlink mempermudah rollback. Jangan lupa memperbarui env atau config database per env.

Strategi Rollback

Rollback harus dapat dilakukan tanpa downtime panjang. Karena menggunakan symlink /var/www/ci3/current, cukup arahkan kembali ke release sebelumnya dan reload PHP-FPM.

PREV=$(ls -1 /var/www/ci3/releases | tail -n 2 | head -n 1)
ln -sfn /var/www/ci3/releases/$PREV /var/www/ci3/current
systemctl reload php8.1-fpm

Pastikan shared storage (uploads, cache) konsisten antara release. Rollback database harus dipertimbangkan: gunakan migration yang reversible, atau gunakan snapshot untuk restore cepat.

Latihan Rollback dan Automasi

Jadwalkan latihan rollback mingguan. Gunakan script yang sama seperti saat produksi dan pastikan kembali bahwa commit lama berjalan dengan konfigurasi saat itu. Sekaligus aktifkan alert otomatis (misalnya webhook ke Slack) bila deploy gagal untuk mengingatkan tim segera melakukan rollback.

Observability: Log dan Metrics

Observability mencakup log aplikasi, log server, dan metrik kesehatan. Untuk CodeIgniter 3, aktifkan log level DEBUG sementara di staging, lalu atur rotasi log menggunakan logrotate.

Log server (syslog, php-fpm) harus dikumpulkan oleh sistem seperti Filebeat atau Promtail yang mengirimkan ke Elasticsearch/Loki. Pastikan log mencakup URI, response time, dan pesan error. Contoh konfigurasi php-fpm untuk log:

php_admin_value[error_log] = /var/log/php8.1-fpm/www-error.log
slowlog = /var/log/php8.1-fpm/www-slow.log
request_slowlog_timeout = 3s

Health Check dan Metrics

Buat endpoint health seperti /status/health yang mengecek koneksi DB dan disk. Siapkan skrip heartbeat sederhana di cron atau monitoring tool:

curl -f https://app.example.com/status/health || echo "health check failed" | mail -s "CI3 Health" devops@example.com

Gunakan prometheus node exporter untuk metrik CPU/IO, dan pantau latency PHP-FPM serta response time NGINX agar bisa merespons sebelum kerusakan lebih luas.

Postmortem Ringkas & Edukasi Tim

Setelah insiden, tulis postmortem ringan dengan template:

  • Ringkasan insiden: apa yang terjadi, kapan.
  • Penyebab utama: kegagalan deployment, bug, atau environment.
  • Penanganan: langkah rollback dan recovery.
  • Pelajaran: apa yang harus dibenahi (screenshot checklist, automasi, observability).

Bagikan temuan ke tim dengan sesi singkat agar semua tahu tindakan pencegahan berikutnya.

Tindakan Pencegahan sebelum Rilis

Beberapa tindakan preventif untuk deployment aman:

  • Latihan rollback minimal sebulan sekali, dokumentasikan waktu eksekusi.
  • Pasang alert otomatis untuk error rate tinggi (contoh: threshold 5xx > 1% dalam 5 menit).
  • Validasi konfigurasi (env, database credentials) melalui script sebelum release.
  • Periksa status storage (disk usage) dan pastikan ada ruang minimal 20%.
  • Review log build/deploy untuk mendeteksi peringatan seperti dependency missing.

Dengan pendekatan ini, tim DevOps dapat mengelola deployment CodeIgniter 3 di bare metal secara terstruktur, siap untuk rollback cepat, dan mampu menjaga observability yang memadai sebelum, selama, dan setelah rilis.