# Tahap 0–1: Persiapan dan Keamanan Dokumen ini adalah checklist deployment untuk fondasi keamanan `accounting_dev`. ## Sebelum deploy 1. Backup database dan folder `uploads`, lalu lakukan uji restore di staging. 2. Rotasi seluruh password database yang pernah tersimpan di repository/source lama. 3. Konfigurasikan environment berdasarkan `.env.example` melalui Apache `SetEnv`, virtual host, container, atau secret manager. File `.env` tidak dibaca otomatis oleh aplikasi. 4. Gunakan `CI_ENV=production`, URL HTTPS, `COOKIE_SECURE=true`, dan encryption key acak minimal 32 karakter pada production. 5. Isi `ATTENDANCE_ALLOWED_SERIALS` dengan serial mesin yang sah. 6. Biarkan `DBCOMPARE_ENABLED=false` kecuali saat diagnosis terkontrol oleh Admin. 7. Pastikan web server dapat menulis `application/logs`, folder session PHP, dan `uploads`, tetapi tidak dapat mengeksekusi PHP dari `uploads`. Contoh konfigurasi Apache development: ```apache SetEnv CI_ENV development SetEnv APP_BASE_URL http://localhost/accounting_dev/ SetEnv APP_ENCRYPTION_KEY ganti-dengan-secret-acak-yang-panjang SetEnv DB_HOST 127.0.0.1 SetEnv DB_PORT 3306 SetEnv DB_USERNAME accounting_app SetEnv DB_PASSWORD secret SetEnv DB_DATABASE accounting_dev ``` ## Deployment dan rollback 1. Deploy ke staging dan jalankan `composer install --no-dev --optimize-autoloader` untuk build production. 2. Jalankan lint, dependency audit, login, logout, seluruh AJAX CRUD utama, upload, export, webhook, dan cron melalui CLI. 3. Ambil backup production tepat sebelum deployment. 4. Deploy source terlebih dahulu; migration baru hanya dijalankan setelah backup tervalidasi. 5. Jika smoke test gagal, kembalikan source release sebelumnya. Restore database hanya jika migration/transaksi deployment telah mengubah data. ## Aturan endpoint - `Auth` adalah endpoint publik untuk login/logout. - `AttendanceWebhook` publik khusus perangkat yang serialnya terdaftar dan dikecualikan dari CSRF. - `Cronjob` hanya dapat dijalankan melalui PHP CLI. - `Dbcompare` hanya untuk Admin, nonaktif secara default, dan seluruh koneksinya berasal dari environment. - Controller bisnis harus mewarisi `MY_Controller`; controller admin penuh dapat mewarisi `MY_Admin_Controller`. ## Upload dan data pribadi - File baru di `uploads/karyawan` dan background hasil upload tidak boleh ditambahkan ke Git. - File lama yang sudah terlanjur tracked perlu dikeluarkan dari Git index pada perubahan repository terpisah, setelah backup dan pemeriksaan dampak deployment. - Untuk production berskala besar, pindahkan upload ke private object storage dan berikan akses melalui endpoint terotorisasi. ## Database migration Folder `application/migrations` telah disiapkan. Baseline migration harus dibuat dari schema production yang sudah diverifikasi dan tidak boleh dijalankan otomatis sebelum perbandingan staging selesai. ## Verifikasi minimum - Request tanpa login ke controller bisnis menghasilkan redirect atau HTTP 401 untuk AJAX. - Login gagal lima kali terkunci selama lima menit pada session tersebut. - POST tanpa token CSRF ditolak. - Cron melalui browser menghasilkan HTTP 403. - Dbcompare nonaktif menghasilkan HTTP 404. - Upload script ke folder upload tidak dapat dieksekusi. - `composer audit --locked` tidak melaporkan advisory pada dependency production.