# Production Readiness

## Status

Source aplikasi telah dilengkapi guard konfigurasi production, throttling login, deklarasi ekstensi runtime, pemeriksaan schema/permission, template Apache/PHP, dan dokumentasi operasional. Status `READY` hanya sah untuk server tertentu setelah command pemeriksaan dijalankan menggunakan `.env` serta database server tersebut.

Lingkungan development tidak diharapkan menghasilkan `READY` karena menggunakan `APP_ENV=local`, HTTP, akun demo, dan konfigurasi upload lokal.

## Gerbang Wajib Sebelum Go-Live

1. Gunakan release source dan `composer.lock` yang disetujui.
2. Salin `.env.production.example` menjadi `.env` di server, lalu ganti seluruh hostname/placeholder/rahasia.
3. Pasang dependensi:

   ```bash
   composer install --no-dev --optimize-autoloader --no-interaction
   ```

4. Terapkan baseline atau migration sesuai kondisi database.
5. Siapkan akun individual serta aset produksi tanpa seeder development.
6. Atur Apache, HTTPS, PHP, storage permission, backup, dan scheduler memakai template/panduan.
7. Jalankan:

   ```bash
   composer validate --strict
   composer audit --locked
   composer production-check
   ```

8. Seluruh `FAIL` wajib diperbaiki. Setiap `WARN` harus diperiksa dan diterima pemilik layanan secara tertulis.
9. Jalankan smoke check manual dan UAT yang disepakati.
10. Aktifkan scheduler SLA setelah aplikasi/database dinyatakan sehat.

## Pemeriksaan Otomatis yang Tersedia

`php bin/production-check.php` bersifat baca-saja terhadap konfigurasi, filesystem, dan database. Command memeriksa:

- PHP minimum 8.2;
- ekstensi `pdo`, `pdo_mysql`, dan `fileinfo`;
- keberadaan `composer.lock` dan autoload vendor;
- `APP_ENV=production`, HTTPS, debug nonaktif, timezone, batas sesi/upload/login, dan log level;
- user database non-root, password database nonkosong, serta seed password kosong;
- permission `storage/logs`, `storage/cache`, dan `storage/uploads`;
- upload berada di luar `public/`;
- batas `upload_max_filesize`, `post_max_size`, dan `max_file_uploads` PHP;
- koneksi database, seluruh tabel inti, dan indeks operasional;
- keberadaan akun aktif untuk empat role;
- ketiadaan username demo development;
- keberadaan data aset.

Command tidak menampilkan password, DSN, exception database, atau isi `.env`. Exit code `0` berarti tidak ada `FAIL`; exit code `1` berarti server belum siap.

## Fail-Closed Production

Pada `APP_ENV=production`, bootstrap menolak melayani aplikasi dengan HTTP 503 bila konfigurasi penting tidak aman, termasuk:

- `APP_URL` bukan HTTPS atau masih placeholder;
- `APP_DEBUG=true`;
- user database kosong/root atau password kosong/placeholder;
- `DEV_SEED_PASSWORD` terisi;
- timezone, timeout, batas upload, batas login, atau log level di luar rentang yang diperbolehkan.

Pesan web tetap generik. Detail nilai konfigurasi tidak dikirim kepada browser.

## Hardening Runtime

- Cookie sesi selalu `Secure`, `HttpOnly`, dan `SameSite=Lax` pada production.
- PHP session GC diselaraskan dengan `SESSION_LIFETIME`.
- Session ID dan token CSRF dirotasi setelah login/perubahan password.
- Akun aktif serta role diverifikasi kembali selama sesi.
- Percobaan login dibatasi per kombinasi username/IP yang di-hash; file throttle tidak menyimpan identitas mentah dan dibersihkan berkala.
- Password lama otomatis di-rehash bila algoritma/default PHP berubah.
- Bootstrap CDN memakai Subresource Integrity dan `crossorigin=anonymous`.
- CSP, HSTS saat HTTPS, anti-framing, no-store, serta redaksi logger tetap aktif.

## Template Deployment

- Environment: `.env.production.example`
- Apache: `deploy/apache/bkkbn-eticketing.conf.example`
- PHP: `deploy/php/production.ini.example`
- Operasional: `docs/24-DEPLOYMENT-BACKUP-DAN-RECOVERY.md`
- UAT: `docs/25-SKENARIO-BLACK-BOX-DAN-UAT.md`

Semua nilai domain, sertifikat, path, user service, database, dan rahasia pada template wajib diganti sesuai server.

## Hal yang Tetap Memerlukan Operator

- DNS, sertifikat, firewall, patch OS, dan konfigurasi Apache/PHP nyata;
- pembuatan user database hak minimal;
- secret management serta rotasi credential;
- provisioning akun/aset produksi;
- backup off-host terenkripsi dan uji restore;
- monitoring uptime, kapasitas disk, database, log, dan scheduler;
- pelaksanaan UAT, persetujuan go-live, serta rollback decision.

Source yang siap tidak berarti server otomatis siap. Keputusan go-live harus berdasarkan output command pada server tujuan ditambah UAT dan checklist operasional.
