# Deploy Produksi ke Shared Hosting (cPanel)

Panduan ini untuk men-deploy **Sistem Pembayaran SMK GLOBIN** ke hosting cPanel Anda.

- **Domain:** `https://sps.khoerulmuhlisin.my.id`
- **Database:** `khoer4345_spp`
- **DB user:** `khoer4345_spp_globin`
- **DB pass:** `Smkglobin1@`
- **DB host:** `localhost` (di dalam cPanel)

> **PENTING keamanan.** `.env.production`, `.env` dan file `.env*` sudah masuk `.gitignore`
> sehingga **tidak ikut ter-commit**. Kredensial database tinggal di server, jangan dibagikan.

---

## Ringkasan arsitektur

- PHP **8.2** (pilih versi 8.1/8.2 di "Select PHP Version" cPanel).
- Web server: Apache (mod_rewrite menyala).
- Session & cache: **file** (bukan database) → cepat & tidak butuh Redis.
- Queue: **sync** → tidak butuh worker background.
- Aplikasi memakai **storage lokal** untuk file:sitten (logo, backup, PDF).

---

## 1. Persiapan database

1. Buka **cPanel → MySQL® Databases**.
2. Pastikan user `khoer4345_spp_globin` memiliki **semua privilege (ALL PRIVILEGES)** pada
   database `khoer4345_spp`.
3. Database **harus kosong** (belum ada tabel) sebelum migrasi. Kalau sudah ada tabel lama,
   kosongkan dulu (lihat langkah 5-Reset).
4. Catat nama database persis: `khoer4345_spp`.

---

## 2. Konfigurasi `.env.production` (sudah dibuat)

File `.env.production` sudah tersedia di repo dengan kredensial database & domain Anda
(`C:\Users\Lenovo\spp-globin\.env.production`).

Saat upload, **rename** menjadi `.env` di server.

Isi penting:

```ini
APP_ENV=production
APP_DEBUG=false
APP_URL=https://sps.khoerulmuhlisin.my.id
DB_DATABASE=khoer4345_spp
DB_USERNAME=khoer4345_spp_globin
DB_PASSWORD=Smkglobin1@
SESSION_DRIVER=file
CACHE_STORE=file
QUEUE_CONNECTION=sync
```

> **JANGAN pernah menyalin `.env` (lokal) atau `.env.docker` ke server.** Gunakan hanya
> `.env.production` yang di-rename menjadi `.env`.

---

## 3. Membuat paket rilis

Lakukan perubahan ini **di komputer lokal** sebelum upload. Jalankan di folder proyek:

```bash
# 1. Reset struktur produksi (hapus cache lokal, opsional)
php artisan optimize:clear

# 2. Pasang dependency tanpa paket dev (lebih kecil & cepat)
composer install --no-dev --optimize-autoloader --no-interaction

# 3. Build aset frontend (Vite)
npm install
npm run build
```

> Bila `npm`/`composer` tidak mau jalan di komputer Anda saat ini, tidak masalah —
> langsung lanjut ke Langkah 4. Anda bisa tetap upload `vendor/` & `public/build` yang sudah
> pernah di-build, atau jalankan build di server via Terminal cPanel.

---

## 4. Upload file ke server

Pakai **File Manager** cPanel atau **FTP** (mis. FileZilla).

1. Upload seluruh isi folder proyek ke direktori `public_html` (atau subfolder jika domain
   dipasang di subfolder — sesuaikan DocumentRoot agar mengarah ke `public`).

2. **Yang di-upload:**
   - Seluruh kode (app, bootstrap, config, routes, resources, database, public, dll.)
   - `vendor/` (bila sudah ada; jika belum, jalankan `composer install` di Langkah 6)
   - `public/build` hasil `npm run build`
   - File **`.env`** (hasil rename `.env.production`) — letakkan di root aplikasi

3. **Yang TIDAK di-upload:** folder `storage` isi cache/session lama, file `.env` lokal,
   `.env.backup`, `.env.production` (sudah, gunakan rename), node_modules, dsb.

---

## 5. Set permission & storage link

1. Buka **Terminal** cPanel (Ganti Versi PHP dulu ke 8.2 jika perlu) atau jalankan via SSH
   jika tersedia:

```bash
cd ~/public_html   # sesuaikan bila domain di subfolder

# Permission folder storage & bootstrap/cache harus bisa ditulis
chmod -R 775 storage bootstrap/cache
chmod -R 775 public

# Buat symlink storage -> public/storage
php artisan storage:link
```

> Kalau `php` tidak ditemukan, gunakan path penuh di cPanel, mis.:
> `~/bin/php` atau pilih versi di "Select PHP Version", atau `/usr/local/bin/php`.

---

## 6. Migrasi & cache produksi

Masih di Terminal cPanel, dari folder root aplikasi:

```bash
# 1. Generate key (cuma jika .env tidak punya APP_KEY)
php artisan key:generate

# 2. Jalankan migrasi untuk membuat tabel di database khoer4345_spp
php artisan migrate --force

# 3. Simpan cache produksi (config & route di-cache agar cepat)
php artisan config:cache
php artisan route:cache
php artisan view:cache

# 4. Buat akun admin pertama (gantikan email/password)
php artisan tinker --execute="
\$u = App\Models\User::firstOrCreate(
  ['email' => 'admin@example.com'],
  ['name' => 'Admin', 'username' => 'admin', 'password' => bcrypt('GantiPassword123'), 'role' => 'admin', 'email_verified_at' => now()]
);
echo 'Admin OK: '.\$u->username;
"
```

> Setelah `config:cache`, setiap perubahan `.env` **harus** diikuti `php artisan config:cache`
> ulang, atau `optimize:clear` dahulu.

---

## 7. Verifikasi

1. Buka `https://sps.khoerulmuhlisin.my.id/login` → harus tampil halaman login
   (judul "Masuk – SPS").
2. Login dengan akun admin yang dibuat di Langkah 6.
3. Masuk menu **Pengaturan** → isi profil sekolah (nama, NPSN, logo, dll.) jika perlu.
4. Cek folder `storage/app/private/backups` tersedia untuk fitur backup.

### Jika error

- **"Whoops, something went wrong"**: aktifkan sementara `APP_DEBUG=true` di `.env`,
  muat ulang, catat pesan error, lalu balikkan ke `false`.
- **Error koneksi DB**: pastikan `DB_DATABASE/USERNAME/PASSWORD` persis seperti di cPanel.
- **Route 404**: pastikan DocumentRoot mengarah ke folder `public` dan `.htaccess` di dalam
  `public/` ada (mod_rewrite).

---

## Fitur yang perlu perhatian khusus di shared hosting

### Backup database
Backup disimpan di `storage/app/private/backups/`. Pastikan folder ini writable.
Gunakan menu **Pengaturan → Backup** di aplikasi.

### Email (reset password / verifikasi)
SMTP **belum dikonfigurasi** (sengaja dilewati). Untuk mengaktifkan reset password
via email, isi blok `MAIL_*` di `.env` sesuai kredensial email hosting cPanel Anda,
lalu jalankan `php artisan config:cache`.

### File PDF & logo
Disimpan di `storage/app/public`. Symlink `public/storage` sudah dibuat di Langkah 5.

---

## Reset total (bila perlu)

```bash
# Hapus semua cache yang tersimpan
php artisan optimize:clear

# Di server: hapus seluruh tabel lalu migrasi ulang
php artisan migrate:fresh --force
```

---

## Catatan tambahan

- `SESSION_DRIVER=file` berarti **semua user login ulang** saat pertama kali dipasang.
  Ini normal.
- Untuk akselerasi lebih lanjut di masa depan (opsional): aktifkan OPCache dan realpath
  cache via "Select PHP Version → Extensions", tanpa mengubah kode.
- Jangan commit `.env*` ke git untuk mencegah kebocoran kredensial.
