# Panduan Deployment cPanel (Shared Hosting) Nexus Scholar

Platform jurnal ilmiah PHP Native ini dirancang agar ringan, cepat deployable, dan berjalan sempurna di lingkungan Shared Hosting cPanel tanpa memerlukan NodeJS, Composer CLI, atau framework berat. 

Berikut adalah panduan lengkap dari fase unggah hingga produksi.

## 1. Struktur Folder yang Harus Diupload
Secara arsitektur, proyek ini memiliki struktur MVC berikut yang akan kita bawa dari lokal ke server:
*   `app/` (Controllers, models, views, core sistem, routing)
*   `config/` (Konfigurasi file env/database)
*   `public/` (Titik entry website: `index.php`, CSS, JS, Images, `.htaccess`)
*   `storage/` (Folder untuk menyimpan unggahan naskah, AI review payload log)
*   `cron/` (Skrip pekerja latar belakang)
*   `database/` (Kumpulan file `.sql` *bisa diabaikan saat upload file, hanya buat import DB*)

## 2. File/Folder di `public_html`
`public_html` adalah satu-satunya direktori yang dapat di-*render* langsung oleh browser secara publik. Oleh karena itu, kita tidak akan mengunggah semuanya ke sini.
*   Pindahkan **SELURUH ISI dari dalam folder `public/`** (seperti `index.php`, font, aset, js, dll) lansung ke dalam `public_html`.
*   File `.htaccess` utama aplikasi juga mendarat di `public_html/.htaccess`.

## 3. File/Folder di Luar `public_html` (Praktik Keamanan)
Agar struktur internal `app` dan `config` tidak bisa diakses orang lain dengan menebak URL, letakkan sisanya **satu level di atas public_html**.
Buka cPanel File Manager, Anda akan melihat susunan berikut:
```text
/home/username/
├── app/          <-- Letakkan di sini
├── config/       <-- Letakkan di sini
├── cron/         <-- Letakkan di sini
├── public_html/  <-- Tempat index.php ditaruh
└── storage/      <-- Letakkan di sini
```
*Trik Wajib:* Karena posisi `app` sekarang berpindah relatif terhadap `index.php`, buka `public_html/index.php`, lalu ubah *Path Mapping* di baris awal menjadi:
`require_once __DIR__ . '/../app/init.php';` (Sesuaikan dengan nama root app jika diperlukan).

## 4. Cara Mengatur Config Database
1. Buka halaman utama cPanel > klik **MySQL® Databases**.
2. **Create New Database**: Buat database baru misalnya `myhost_nexus`.
3. **MySQL Users**: Tambahkan user baru misalnya `myhost_dbuser` beserta Generate Password yang kuat. Simpan password ini.
4. **Add User to Database**: Tautkan `myhost_dbuser` ke dalam `myhost_nexus`, beri centang **ALL PRIVILEGES**.
5. Buka cPanel File Manager, edit file `/home/username/config/env.php` atau `config.php`:
```php
define('DB_HOST', 'localhost');
define('DB_USER', 'myhost_dbuser');
define('DB_PASS', '#SuperSecurePassword2026!');
define('DB_NAME', 'myhost_nexus');
```

## 5. Cara Import Database SQL
1. Buka cPanel > **phpMyAdmin**.
2. Di sebelah kiri, klik basis data yang baru Anda buat (`myhost_nexus`).
3. Di navigasi atas, klik tab **Import**.
4. Pilih file dari direktori `database/` komputer lokal Anda. Sangat direkomendasikan untuk menggabungkan modul 1-12 menjadi satu file `.sql` gabungan, atau upload secara berurutan mulai dari SQL Modul 1 (Authentication) terlebih dahulu karena relasi `foreign_key` berjalan mulai dari tabel Users.
5. Klik Go, pastikan status menunjukkan "Import has been successfully finished".

## 6. Cara Mengatur Permission Folder `storage/uploads`
Agar sistem bisa menyimpan file PDF Journal & Profile avatar user baru:
1. Masuk ke cPanel File Manager > `/home/username/storage/uploads`.
2. Klik kanan pada folder `uploads` > **Change Permissions**.
3. Pastikan angkanya adalah `755` atau pada server ketat `775` agar script PHP *(owner apache/nobody)* bebas baca/tulis/eksekusi direktori itu. 
4. Khusus untuk *File* (seperti PDF yang sudah terupload), pastikan CHMOD adalah `644`.

## 7. Cara Mengamankan File Config
Karena mengikuti langkah nomor 3 (file diluar `public_html`), peretas **secara fisik mustahil** menembak lewat HTTP URL `/config/env.php`.
Akan tetapi, kalau arsitektur server host Anda *"memaksa"* menaruh semua hal di public root, Anda WAJIB membuat file `.htaccess` di dalam folder `config/` lalu isi satu baris berikut:
```apache
Require all denied
```

## 8. Cara Setup Cron Job (Background Tasks)
Agar proses verifikasi AI, analitik reviewer, dan skor berjalan otomatis:
1. Buka cPanel > menu **Cron Jobs** di bagian "Advanced".
2. Di bagian "Add New Cron Job", kita akan mengkonfigurasi 3 pekerjaan.

**(A) process_ai_jobs.php** | Pekerjaan yang padat & terus-terusan 
*   **Common Settings**: `Once Per 5 Minutes (*/5 * * * *)`
*   **Command**: `/usr/local/bin/php /home/username/cron/process_ai_jobs.php > /dev/null 2>&1`

**(B) update_analytics_snapshots.php** | Agregasi data views bacaan.
*   **Common Settings**: `Once Per Day (0 0 * * *)` (Midnight pukul 00.00).
*   **Command**: `/usr/local/bin/php /home/username/cron/update_analytics_snapshots.php > /dev/null 2>&1`

**(C) update_reviewer_scores.php** | Kalkulasi poin bagi para top reviewer bulanan.
*   **Common Settings**: `Once Per Day (0 1 * * *)` (Jam 1.00 Pagi).
*   **Command**: `/usr/local/bin/php /home/username/cron/update_reviewer_scores.php > /dev/null 2>&1`

*(Catatan: prefix bin `/usr/local/bin/php` atau `/usr/bin/php` tergantung setup spesifik server shared hosting yang dipakai)*

## 9. Cara Membuat `.htaccess` (Front Controller)
Untuk menangkap semua routing aplikasi M1-M12 menuju `routes.php` atau `index.php`:
Di folder `public_html/`, pastikan ada `.htaccess` berisi:
```apache
<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /

    # Matikan Auto Director Listing (Security)
    Options -Indexes

    # Jika format path merujuk langung ke File ASLI (css/js/img), allow!
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d

    # Jika tidak ada filenya, limpahkan routing ke index.php
    RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]
</IfModule>
```

## 10. Cara Backup
1. **Weekly Basis**: Gunakan fitur bawaan cPanel **Backup Wizard** > **Full Backup** atau fitur *Automated JetBackup*. 
2. **Manual DB Backup**: Pada phpMyAdmin, buka tab **Export** utamanya sebelum meluncurkan perbaruan fitur yang akan me-*replace* *logic* tabel/controller. Format kompresi `SQL.gz` sangat diutamakan untuk menghemat file.

## 11. Troubleshooting Umum
1.  **Layar Putih (WSOD - White Screen of Death)**
    *   **Solusi**: Server Shared Hosting mematikan error demi keamanan. Buka config PHP, nyalakan `ini_set('display_errors', 1); error_reporting(E_ALL);` sementara.
2.  **Internal Server Error (Error 500)**
    *   **Solusi**: Salah ketik syntax pada `.htaccess` atau Permission pada folder induk ada yang keliru diset ke CHMOD 777 (cPanel menolak 777. CHMOD harus diset di angka 755).
3.  **Gagal Upload File (Error File Terlalu Besar)**
    *   **Solusi**: Buka fitur cPanel > **MultiPHP INI Editor**. Anda perlu meng-override limit menjadi lebih leluasa: 
        *   `upload_max_filesize = 50M`
        *   `post_max_size = 55M` 
        *   `memory_limit = 256M`
4.  **Halaman Selalu Kembali ke Login Secara Random (Sesi Hilang)**
    *   **Solusi**: Terkait penyimpanan Session cPanel (`session.save_path`) yang penuh atau hak akses direktori tmp cPanel dibatasi. Kontak tim support teknis Hosting/Lengkapi konfigurasi session native dari handler database apabila dibutuhkan resolusi mutlak.
