# Panduan Instalasi NEXORA — Fase 1 (Fondasi)

## 1. Kebutuhan sistem

| Komponen | Versi minimum | Catatan |
|---|---|---|
| PHP | 8.2 (diuji 8.3) | Ekstensi: `pdo_pgsql`, `gd` (dengan JPEG/PNG/WebP), `fileinfo`, `mbstring`, `sodium`, `openssl`. PHP harus mendukung `PASSWORD_ARGON2ID`. |
| PostgreSQL | 13 (diuji 16) | Database & user khusus aplikasi |
| Web server | Nginx atau Apache | **Document root diarahkan ke folder `public/`**, bukan ke root proyek |
| HTTPS | Wajib di produksi | Sertifikat TLS (mis. Let's Encrypt) |

Cek ekstensi PHP:

```bash
php -m | grep -E 'pdo_pgsql|gd|fileinfo|mbstring|sodium'
php -r 'var_dump(defined("PASSWORD_ARGON2ID"));'
```

## 2. Siapkan database

```bash
sudo -u postgres psql
CREATE ROLE nexora LOGIN PASSWORD 'ganti-dengan-password-kuat';
CREATE DATABASE nexora OWNER nexora;
\q
```

## 3. Pasang aplikasi

```bash
# Ekstrak ke mis. /var/www/nexora
cd /var/www/nexora

# Langkah 1: buat config/config.php (kunci aplikasi dibuat otomatis)
php bin/install.php
```

Buka `config/config.php`, lalu isi:

- `db.*`: kredensial database dari langkah 2.
- `app.base_url`: alamat aplikasi, mis. `https://rumah.contoh.id`.
- `security.cookie_secure`: `true` (wajib bila memakai HTTPS).
- `app.env`: biarkan `production`.

```bash
# Langkah 2: buat tabel & akun admin
php bin/install.php --admin-email=owner@contoh.id --admin-name="Nama Pemilik"
```

Installer menampilkan **password sementara** sekali saja. Catat password itu, lalu login. Anda akan diminta menggantinya pada login pertama.

> Untuk uji coba, tambahkan `--demo` agar properti contoh dibuat sesuai Lampiran A FSD. Jangan pakai `--demo` di produksi.

Atur hak akses folder:

```bash
sudo chown -R www-data:www-data storage
sudo chmod -R 750 storage
sudo chmod 640 config/config.php
```

## 4. Konfigurasi web server

### Nginx

```nginx
server {
    listen 443 ssl http2;
    server_name rumah.contoh.id;
    root /var/www/nexora/public;
    index index.php;

    client_max_body_size 16M;          # sesuai batas upload denah

    location / {
        try_files $uri /index.php$is_args$args;
    }
    location ~ \.php$ {
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        fastcgi_pass unix:/run/php/php8.3-fpm.sock;
    }
    location ~ /\. { deny all; }
}
```

### Apache

Arahkan `DocumentRoot` ke `/var/www/nexora/public`, lalu aktifkan `mod_rewrite`. File `public/.htaccess` sudah disertakan.

### Pengaturan PHP

Di `php.ini`, set `upload_max_filesize = 16M` dan `post_max_size = 20M`.

### Server pengembangan (lokal saja)

```bash
php -S 127.0.0.1:8080 -t public public/index.php
```

## 5. Langkah awal setelah login

1. **Ganti password** sementara (wajib).
2. **Aktifkan verifikasi 2 langkah** di *Profil & keamanan*.
3. Di halaman *Properti*, buat properti. Struktur awal (area luar + lantai 1–3) dibuat otomatis.
4. Di *Struktur lokasi*, tambahkan ruangan/zona. Tandai kamar tidur sebagai **Privat**.
5. Di *Denah*, unggah gambar denah untuk tiap lantai/area.
6. Di *Controller*, daftarkan controller/gateway beserta jumlah channel.
7. Di *Perangkat*, daftarkan perangkat (ID stabil, kategori, kapabilitas, channel).
8. Kembali ke *Denah*, klik **Mode edit**, pilih perangkat, lalu klik lokasinya pada denah.
9. Di *Anggota & akses*, tambahkan keluarga, installer (akses otomatis 7 hari), dan petugas sesuai peran.

## 6. Checklist keamanan produksi

- [ ] HTTPS aktif dan `cookie_secure = true`
- [ ] `app.env = production` (detail error tidak ditampilkan)
- [ ] Document root = `public/`; folder `config/` dan `storage/` tidak dapat diakses dari web
- [ ] Password database kuat; user DB bukan superuser
- [ ] MFA aktif untuk semua Owner
- [ ] Aplikasi tidak diekspos langsung ke internet tanpa reverse proxy/VPN (FSD 11.2, 16.2)
- [ ] Backup terenkripsi untuk database + `storage/plans`, dan uji restore secara berkala (FSD 22.3)
- [ ] Jalankan *Audit log → Verifikasi integritas* secara berkala

## 7. Backup & restore

```bash
pg_dump -Fc -U nexora nexora > nexora-$(date +%F).dump
tar czf plans-$(date +%F).tgz storage/plans
# Restore:
pg_restore -c -d nexora nexora-YYYY-MM-DD.dump
```

> Catatan: `config/config.php` memuat `app.key` untuk mendekripsi rahasia TOTP. Simpan salinannya secara aman. Tanpa kunci ini, semua pengguna harus mendaftar ulang MFA.

## 8. Uji end-to-end (opsional, khusus lingkungan uji)

```bash
pip install playwright && python -m playwright install chromium
php bin/install.php --admin-email=owner@nexora.test --demo   # pada DB uji yang kosong
php -S 127.0.0.1:8080 -t public public/index.php &
python3 tests/e2e_fase1.py <password-sementara>
```

Uji ini mencakup 30 skenario: login dan wajib ganti password, kebijakan password, upload denah (termasuk file palsu), penempatan/drag/undo, posisi relatif saat layar diubah ukurannya, rotasi denah, If-Match/412/428/422, CSRF, bentrok channel, RBAC Family (web + API), lockout, MFA, integritas audit, dan trigger append-only.

## 9. Pemecahan masalah

| Gejala | Penyebab & solusi |
|---|---|
| "Konfigurasi belum ada" | Jalankan `php bin/install.php` |
| Upload denah gagal tanpa pesan | Naikkan `upload_max_filesize`/`post_max_size` dan `client_max_body_size` |
| "Sesi formulir kedaluwarsa" | Token CSRF kedaluwarsa. Muat ulang halaman. |
| Waktu tampil bergeser | Database & PHP sengaja memakai UTC. Atur zona waktu tampilan di *Pengaturan properti*. |
| Akun terkunci | Tunggu 15 menit, atau minta platform admin melakukan *Reset password* |
