# Panduan Deploy CBT SDN 08 ke cPanel

## Persyaratan Server

- PHP 8.2 atau lebih tinggi
- MySQL 5.7+ / MariaDB 10.3+
- Ekstensi PHP: `pdo_mysql`, `mbstring`, `openssl`, `tokenizer`, `xml`, `ctype`, `json`, `bcmath`, `fileinfo`, `gd`
- Composer (via Terminal cPanel)
- Minimum 256MB memory limit PHP

## Langkah Deploy

### 1. Upload File

Upload seluruh project ke folder di luar `public_html`, contoh:
```
/home/username/cbt-sdn08/
```

### 2. Document Root

**Opsi A (Recommended):** Buat subdomain `cbt.domain.com` dengan document root:
```
/home/username/cbt-sdn08/public
```

**Opsi B:** Symlink dari public_html:
```bash
cd ~/public_html
ln -s ~/cbt-sdn08/public cbt
```

### 3. Buat Database MySQL

Di cPanel > MySQL Databases:
- Buat database: `username_cbt`
- Buat user dan berikan ALL PRIVILEGES

### 4. Konfigurasi .env

```bash
cd ~/cbt-sdn08
cp .env.example .env
```

Edit `.env`:
```env
APP_NAME="CBT SDN 08"
APP_ENV=production
APP_DEBUG=false
APP_URL=https://cbt.domain.com
APP_TIMEZONE=Asia/Jakarta

DB_CONNECTION=mysql
DB_HOST=localhost
DB_PORT=3306
DB_DATABASE=username_cbt
DB_USERNAME=username_cbtuser
DB_PASSWORD=your_password

SESSION_DRIVER=database
QUEUE_CONNECTION=database
CACHE_STORE=database
```

### 5. Install & Setup

Via Terminal cPanel:
```bash
cd ~/cbt-sdn08
composer install --optimize-autoloader --no-dev
php artisan key:generate
php artisan migrate --force
php artisan db:seed --force
php artisan storage:link
php artisan config:cache
php artisan route:cache
php artisan view:cache
```

### 6. Permission

```bash
chmod -R 775 storage bootstrap/cache
chown -R username:username storage bootstrap/cache
```

### 7. Cron Job

Tambahkan di cPanel > Cron Jobs:
```
* * * * * cd /home/username/cbt-sdn08 && php artisan schedule:run >> /dev/null 2>&1
```

### 8. Build Assets (Lokal)

Sebelum upload, di komputer lokal:
```bash
npm install
npm run build
```
Upload folder `public/build/` ke server.

**Alternatif:** Project ini sudah menggunakan CDN Tailwind + `public/css/sdn08.css`, jadi tetap berfungsi tanpa build Vite.

## Akun Default

| Role | Login | Password |
|------|-------|----------|
| Admin | admin@sdn08.sch.id | password |
| Guru | guru.mtk | password |
| Siswa | 2024001 (NIS) | password |

**Ganti semua password setelah deploy!**

## Keamanan Produksi

1. Set `APP_DEBUG=false`
2. Pastikan `.env` tidak bisa diakses publik
3. Ganti password default semua akun
4. Aktifkan SSL/HTTPS
5. Backup database rutin via cPanel

## Fitur Keamanan Ujian (Anti-Kecurangan)

Sistem mencatat pelanggaran untuk guru memantau — **tidak auto-mengumpulkan ujian** (ramah untuk SD).

| Fitur | Keterangan |
|-------|------------|
| Kunci browser | Blok klik kanan, copy/cut/paste soal, shortcut DevTools |
| Watermark | NIS + nama siswa di layar ujian (mencegah bocor soal) |
| Blur saat keluar tab | Konten diburamkan saat siswa buka tab lain |
| Tab switch counter | Dicatat + log ke `exam_security_logs` |
| Monitor guru | Badge hijau/kuning/merah di halaman Monitor |
| Sesi tunggal | Satu browser aktif per ujian (cegah login ganda) |
| Validasi server | Soal/opsi jawaban harus milik ujian tersebut |

**Batasan screenshot:** Aplikasi web **tidak bisa memblok screenshot** (PrtScn / screenshot HP) sepenuhnya. Watermark membuat screenshot mudah dilacak ke siswa tertentu.

**Setelah update ke versi ini**, jalankan:
```bash
php artisan migrate
php artisan route:clear
```

Guru dapat mengatur keamanan per ujian di form Buat/Edit Ujian (section Keamanan Ujian).

## Troubleshooting

| Masalah | Solusi |
|---------|--------|
| 500 Error | Cek `storage/logs/laravel.log`, permission folder |
| CSS tidak muncul | Pastikan `public/css/sdn08.css` ada |
| Upload gambar gagal | Jalankan `php artisan storage:link` |
| Gambar soal tidak muncul | Jalankan `php artisan storage:link`. Jika symlink tidak didukung hosting, gambar tetap dilayani lewat route `/media/...` |
| Session error | Pastikan tabel `sessions` sudah dimigrate |
| Excel export error | Aktifkan ekstensi `gd` di PHP |

## Skala Besar

Untuk 500+ siswa ujian bersamaan, disarankan:
- VPS minimal 2GB RAM (bukan shared hosting)
- Gunakan `SESSION_DRIVER=redis` jika tersedia
- Enable OPcache di PHP
