# Production Readiness Checklist Dokumen ini merangkum kesiapan aplikasi BizOne Portal sebelum naik production live. Status saat ini: - Staging-ready: hampir siap - Production-ready: belum - Rekomendasi: jangan deploy production live sebelum semua item `Blocker` selesai ## Blocker Item berikut wajib selesai sebelum production. ### 1. Rotate semua secret yang pernah tersimpan di repo Status: Belum selesai Risiko: - Secret/password/token di file example atau dokumentasi harus dianggap bocor jika pernah masuk repo. - Credential lama tidak boleh dipakai di production. Yang harus dilakukan: - Bersihkan credential asli dari `deploy/debian12/app.env.example`. - Bersihkan credential asli dari `.env.example` jika ada. - Bersihkan potongan secret/password dari `README.md` atau dokumentasi lain. - Generate secret baru untuk production. - Pakai secret baru hanya di `.env` server, bukan di repo. Secret yang wajib di-rotate: - `DATABASE_URL` password database - `JWT_SECRET` - `JWT_REFRESH_SECRET` - `WEBHOOK_VERIFY_TOKEN` - `WEBHOOK_SHARED_SECRET` - `META_WEBHOOK_APP_SECRET` - `MAIL_PASSWORD` Acceptance criteria: - Tidak ada credential asli di repo. - Production `.env` hanya ada di server. - Semua secret production berbeda dari secret yang pernah ditulis di repo. ### 2. Jalankan build final backend Status: Belum dijalankan final setelah perubahan terbaru Command: ```bash cd backend npm run db:generate npm run build ``` Acceptance criteria: - Build backend sukses tanpa error TypeScript. - Prisma client berhasil generate. - `dist/main.js` tersedia dan bisa dijalankan. ### 3. Jalankan build final frontend Status: Belum dijalankan final setelah perubahan UI terbaru Command: ```bash cd frontend npm run build ``` Acceptance criteria: - Build Next.js sukses. - Tidak ada TypeScript error. - Tidak ada runtime import error. - Tidak ada route yang gagal saat build. ### 4. Jalankan migration deploy di database production/staging Status: Belum diverifikasi final Command: ```bash cd backend npm run db:migrate:deploy ``` Acceptance criteria: - Migration selesai tanpa error. - Tabel utama tersedia. - Backend health check mengembalikan database `ok`. ### 5. Smoke test end-to-end production flow Status: Belum selesai Minimal test: - Login admin berhasil. - Ganti password admin berhasil. - Aktifkan 2FA berhasil. - Dashboard bisa dibuka. - User management bisa load. - Contacts bisa load, create, import/export minimal dicek. - Conversations bisa load. - WhatsApp API Setting bisa load dan save. - Sensitive value tidak tampil plain text saat `NODE_ENV=production`. - Webhook verification dari Meta berhasil. - Webhook event masuk ke logs. - Pesan inbound WhatsApp masuk ke Conversations. - Balas pesan dari dashboard berhasil jika token Meta valid. - Audit trail mencatat aksi penting. Acceptance criteria: - Semua flow utama di atas lolos tanpa error 500. - Browser console tidak menunjukkan runtime error kritikal. - Backend log tidak menunjukkan exception berulang. ## High Priority Item berikut sangat disarankan selesai sebelum production, tapi bisa dipisah setelah blocker jika deployment sangat mendesak. ### 1. Production nginx security headers masuk ke config repo Status: Belum masuk final config repo Tambahkan ke `deploy/debian12/nginx.portal.bizone.id.conf`: ```nginx add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always; add_header X-Frame-Options "SAMEORIGIN" always; add_header X-Content-Type-Options "nosniff" always; add_header Referrer-Policy "strict-origin-when-cross-origin" always; add_header Permissions-Policy "camera=(), microphone=(), geolocation=()" always; ``` Acceptance criteria: - `nginx -t` sukses. - Header muncul di response HTTPS. ### 2. Frontend Dockerfile production-ready Status: Belum siap Masalah: - `frontend/Dockerfile` masih menjalankan `npm run dev`. Opsi: - Jika deployment pakai systemd, Dockerfile ini tidak blocker. - Jika deployment pakai Docker, wajib ubah ke production build. Acceptance criteria: - Docker image frontend menjalankan `next start`, bukan `next dev`. ### 3. Dependency audit Status: Belum dijalankan Command: ```bash npm audit cd backend && npm audit cd ../frontend && npm audit ``` Acceptance criteria: - Tidak ada critical vulnerability. - High vulnerability punya keputusan: fix, upgrade, atau accepted risk tertulis. ### 4. Review penggunaan Next 15.0.0 dan React RC Status: Perlu review Risiko: - React RC dan Next awal versi major bisa punya issue kompatibilitas. Acceptance criteria: - Build final sukses. - Smoke test UI sukses. - Tidak ada issue runtime kritikal. - Jika memungkinkan, upgrade ke versi stabil yang kompatibel. ### 5. Backup PostgreSQL dan Redis Status: Belum ada strategi final Minimal PostgreSQL backup: ```bash pg_dump "$DATABASE_URL" > backup-$(date +%F).sql ``` Yang perlu disiapkan: - Backup harian. - Retention minimal 7-14 hari. - Lokasi backup di luar server utama jika memungkinkan. - Restore test minimal satu kali. Acceptance criteria: - Backup otomatis berjalan. - Restore procedure terdokumentasi. ## Medium Priority Item berikut tidak selalu blocker, tapi penting untuk operasional production yang sehat. ### 1. Monitoring uptime Status: Belum ada Endpoint yang dipantau: ```text https://portal.bizone.id/api/health ``` Acceptance criteria: - Alert aktif saat endpoint non-200. - Alert aktif saat response terlalu lambat. ### 2. Log retention Status: Belum dikunci Cek journald: ```bash sudo journalctl --disk-usage ``` Rekomendasi: - Batasi ukuran journald. - Pastikan log backend/frontend bisa dibaca saat incident. ### 3. Forced first-login password change Status: Belum ada secara code Risiko: - Seed admin default bisa lupa diganti. Acceptance criteria: - Admin bootstrap dipaksa ganti password saat login pertama, atau proses operasional mewajibkan rotate manual sebelum go-live. ### 4. Role permission enforcement review Status: Perlu review final Yang perlu dicek: - User biasa tidak bisa akses halaman admin. - Role non-admin tidak bisa mengubah settings, users, roles, audit trail. - API backend menolak akses yang tidak sesuai role. Acceptance criteria: - Permission UI dan backend konsisten. ### 5. Translation sweep Status: Sebagian besar halaman utama sudah dirapikan Perlu cek lagi: - Detail contact - Detail campaign - Detail template/builder edge case - Auth pages forgot/reset/set password - Notification center - Global search modal Acceptance criteria: - Tidak ada string penting yang hardcoded di halaman utama production. ## Done / Already Good Item berikut sudah terlihat cukup baik dari code saat ini. ### 1. Env validation backend production Status: Sudah ada Catatan: - Production menolak secret pendek/placeholder. - Production menolak `WEBHOOK_ALLOW_UNSIGNED=true`. - Production mewajibkan URL HTTPS untuk origin/public API. ### 2. Sensitive WhatsApp values tidak tampil di production Status: Sudah ada Catatan: - Backend hanya mengembalikan sensitive values saat `!isProduction`. - Pastikan `NODE_ENV=production` benar di server. ### 3. Cookie secure di production Status: Sudah ada Catatan: - Frontend cookie memakai `secure: process.env.NODE_ENV === 'production'`. - `sameSite` memakai `lax`. ### 4. CORS dibatasi via `FRONTEND_ORIGIN` Status: Sudah ada Catatan: - Backend membaca allowed origin dari env. ### 5. Prisma migration deploy tersedia Status: Sudah ada Command: ```bash cd backend npm run db:migrate:deploy ``` ### 6. Systemd deployment tersedia Status: Sudah ada File: - `deploy/debian12/bizone-backend.service` - `deploy/debian12/bizone-frontend.service` ### 7. Nginx reverse proxy config tersedia Status: Ada, perlu hardening headers File: - `deploy/debian12/nginx.portal.bizone.id.conf` ### 8. PostgreSQL dan Redis infra compose tersedia Status: Sudah ada File: - `deploy/debian12/docker-compose.infra.yml` ## Go / No-Go Decision ### Go staging Boleh jika: - Backend build sukses. - Frontend build sukses. - Migration deploy sukses. - Staging `.env` aman. ### Go production Boleh jika semua ini selesai: - Semua blocker selesai. - Secret sudah di-rotate. - Build backend/frontend final sukses. - Migration production sukses. - Smoke test end-to-end sukses. - Nginx HTTPS aktif. - Backup minimal sudah ada. ### No-go production Jangan production jika salah satu ini masih terjadi: - Secret asli masih ada di repo. - Build frontend/backend gagal. - Migration gagal. - Login/admin flow gagal. - Webhook production gagal diverifikasi. - Database belum punya backup. - `NODE_ENV` bukan `production`. - `WEBHOOK_ALLOW_UNSIGNED=true`. ## Suggested production run order 1. Bersihkan repo dari secret dan rotate semua credential. 2. Siapkan `.env` production di server. 3. Jalankan infra PostgreSQL/Redis. 4. Jalankan `npm install` root, backend, frontend. 5. Jalankan `npm run db:generate`. 6. Jalankan backend build. 7. Jalankan frontend build. 8. Jalankan migration deploy. 9. Restart systemd services. 10. Reload nginx. 11. Smoke test health, login, dashboard, webhook, conversation. 12. Aktifkan backup dan monitoring.