# Panduan Deploy ke Shared Hosting

Checklist lengkap untuk deploy/redeploy `Simulasi Karier: Ilusi vs Realita` ke shared hosting (cPanel-style). Untuk menjalankan di lokal, lihat `README.md`.

## 1. Prasyarat di Hosting

- **PHP 8.1 atau lebih baru** (kode ini secara teknis jalan dari PHP 7.4 ke atas, tapi 7.4 sudah tidak lagi dapat update keamanan -- jangan pakai). Cek/atur lewat cPanel > MultiPHP Manager.
- Extension PHP: `pdo_mysql`, `mbstring` (biasanya sudah aktif default di cPanel).
- MySQL/MariaDB 5.7+ / 10.2+.
- Disarankan: SSL/HTTPS aktif di domain (cPanel > SSL/TLS Status > **AutoSSL**, biasanya gratis & sekali klik). Tanpa ini, password siswa/admin terkirim polos lewat HTTP saat login.

## 2. Struktur di Server

```
<folder upload>/
├── public_html/        <- arahkan Document Root domain/subdomain ke SINI (lihat langkah 4)
│   ├── home/
│   ├── admin/
│   ├── index.php
│   └── .htaccess
├── app/                 <- SEJAJAR dengan public_html, bukan di dalamnya
├── database/
└── storage/
```

**Kesalahan paling umum:** meng-upload folder `public_html/` project ini *sebagai folder* ke dalam `public_html/` bawaan hosting, sehingga jadi `public_html/public_html/home/...`. Upload **isi**-nya, bukan foldernya.

Kalau panel hosting tidak mengizinkan Document Root menunjuk lebih dalam dari akar akun (jarang, tapi ada), alternatifnya taruh `app/`, `database/`, `storage/` **di dalam** `public_html/` -- `.htaccess` di masing-masing folder itu tetap memblokir akses langsung lewat browser, meski secara teknis kurang ideal dibanding taruh di luar document root sama sekali.

## 3. Langkah Deploy

1. **Upload semua file** sesuai struktur di atas (FTP/File Manager/Git, sesuai kebiasaan Anda).
2. **Set Document Root** subdomain/domain ke folder `public_html/` hasil upload (cPanel > Domains > edit Document Root).
3. **Buat database MySQL** (cPanel > MySQL Databases): buat database, buat user, assign user ke database dengan semua privilege.
4. **Import skema**: phpMyAdmin > pilih database > tab Import > upload `database/schema.sql`, lalu (opsional, data contoh) `database/seed.sql`.
5. **Konfigurasi kredensial**: di server, buat `app/config/database.php` (salin dari `database.sample.php`) berisi host/nama db/user/password dari langkah 3. File ini tidak pernah ada di git, jadi harus dibuat manual di server.
6. **Pastikan `app/config/config.php` yang ter-upload adalah versi terbaru** (Fase 9): `APP_DEBUG` harus default `false` di file ini. Jangan pernah membuat `app/config/local.php` di server produksi -- file itu cuma untuk override lokal dan sengaja di-gitignore.
7. **Buat akun admin pertama.** Kalau hosting punya Terminal/SSH:
   ```
   php database/create-admin.php
   ```
   Kalau tidak ada Terminal/SSH, gunakan fallback web `public_html/setup-admin.php` (lihat komentar di kepala file untuk cara pakai token-nya) -- **hapus file ini dari server setelah dipakai** (harusnya otomatis terhapus sendiri setelah sukses, tapi verifikasi lewat File Manager).
8. **Uji domain root** (`https://domain-anda.com/`) -- harus redirect ke `/home/`.

## 4. Checklist Pasca-Deploy

- [ ] `app/config/database.php` ada di server, berisi kredensial produksi (bukan lokal).
- [ ] `app/config/config.php` versi terbaru ter-upload, `APP_DEBUG` default `false`.
- [ ] Tidak ada `app/config/local.php` di server produksi.
- [ ] `public_html/setup-admin.php` sudah dihapus dari server (kalau tadinya dipakai).
- [ ] Login admin (`/admin/login.php`) berhasil dengan akun yang baru dibuat.
- [ ] Registrasi siswa (`/home/register.php`) dan login siswa berhasil.
- [ ] Coba mainkan simulasi penuh sekali (minat &rarr; tujuan &rarr; karier &rarr; skema &rarr; hasil) untuk memastikan seluruh alur DB-nya bekerja.
- [ ] Buat minimal 1 kelas (`/admin/siswa/kelas_form.php`) dan cek kode gabungnya bisa dipakai saat registrasi siswa.
- [ ] SSL/HTTPS aktif di domain (cPanel > SSL/TLS Status).
- [ ] Konten: kalau ingin dipakai sungguhan di kelas, publish lebih banyak karier (`/admin/karier/`, saat ini seed cuma 1 yang `published`) dan tambah skema utama sampai mendekati 10 (`/admin/skema/`) supaya tier "Berhasil dengan Baik" bisa benar-benar tercapai siswa (lihat catatan di bagian Skema Database `README.md`).

## 5. Backup & Pemeliharaan

Shared hosting cPanel umumnya sudah punya fitur ini bawaan -- tidak perlu script tambahan:

- **cPanel > Backup Wizard / JetBackup** (nama fitur beda-beda per hosting): backup penuh (file + database) secara berkala. Atur jadwal mingguan minimal, kalau hosting mendukung.
- **phpMyAdmin > Export** untuk backup database manual kapan saja sebelum perubahan besar (mis. sebelum menjalankan ulang `schema.sql`).
- Simpan salinan `app/config/database.php` (kredensial) di tempat aman terpisah (mis. password manager) -- kalau server rusak total, file ini tidak akan ada di backup git.

## 6. Troubleshooting

### 404 setelah deploy
1. Cek domain root redirect ke `/home/` (lewat `public_html/index.php`). Kalau masih 404 di situ juga, lanjut poin 2.
2. Cek struktur folder tidak ke-nested (`public_html/public_html/...`) -- lihat bagian 2 di atas.
3. Cek `app/` ada di lokasi yang benar relatif terhadap `public_html/`. Salah taruh biasanya menghasilkan 500, bukan 404, tapi sebagian hosting menampilkan halaman generik untuk keduanya -- cek cPanel > Errors / Error Log.
4. Cek versi PHP aktif (cPanel > MultiPHP Manager) minimal 7.4, disarankan 8.1+.

### 403 saat membuka file di `app/`, `database/`, atau `setup-admin.php` setelah dipakai
Itu **sesuai desain** -- folder-folder itu memang sengaja diblokir dari akses browser langsung lewat `.htaccess`, dan `setup-admin.php` menolak permanen begitu satu akun admin berhasil dibuat.

### Halaman blank / 500 tanpa pesan
Ini justru tanda `APP_DEBUG=false` bekerja dengan benar (tidak membocorkan detail error). Cek pesan sebenarnya lewat cPanel > Error Log atau `storage/logs/php-error.log` (kalau foldernya writable).

### Login langsung logout sendiri / sesi tidak tersimpan
Kemungkinan besar situs diakses lewat `http://` tapi ada konfigurasi yang memaksa cookie `secure` -- seharusnya sudah otomatis terdeteksi lewat `$_SERVER['HTTPS']` di `config.php` (Fase 9), tapi kalau hosting Anda ada di belakang reverse proxy/load balancer yang tidak meneruskan header ini dengan benar, gejalanya bisa muncul. Laporkan kalau ini terjadi.
