# Panduan Online-kan ke cPanel — absensi.smkn3sigi.sch.id

Panduan ini khusus untuk kondisimu: **shared hosting cPanel**, subdomain
**https://absensi.smkn3sigi.sch.id** yang sudah HTTPS. Susunan akhir nanti:

- API (Laravel) : `https://absensi.smkn3sigi.sch.id/api/...`
- Aplikasi web  : `https://absensi.smkn3sigi.sch.id/app/`
- Scanner siswa : `https://absensi.smkn3sigi.sch.id/scanner/`  ← kamera jalan karena HTTPS

Isi paket ini:
- `public-app/`  → nanti diunggah ke folder `public/app` (aplikasi web, sudah di-build)
- `public-scanner/` → diunggah ke `public/scanner` (scanner siswa, sudah diset ke domainmu)
- `env-produksi-contoh.txt` → acuan isi `.env`

> Yang TIDAK ada di paket ini: folder Laravel + `vendor`. Itu kamu ambil dari
> proyek lokalmu `C:\absensi` yang sudah jalan (sudah punya `vendor`).

---

## Ringkasan alur (baca dulu)
1. Siapkan file Laravel dari laptop (zip `C:\absensi`).
2. Ekspor database dari laptop (agar tidak perlu Terminal di hosting).
3. Di cPanel: set PHP 8.2, buat database, unggah & ekstrak Laravel.
4. Arahkan document root subdomain ke folder `public`.
5. Isi `.env`, impor database.
6. Unggah `public-app` → `public/app`, `public-scanner` → `public/scanner`.
7. Uji.

---

## LANGKAH 1 — Siapkan Laravel dari laptop

1. Di laptop, buka folder `C:\absensi`.
2. **Hapus dulu** folder-folder yang tak perlu diunggah agar zip ringan (opsional):
   `node_modules` (kalau ada), `.git` (kalau ada). **JANGAN** hapus `vendor`.
3. Pilih semua isi `C:\absensi` → klik kanan → **Compress to ZIP** → beri nama `laravel-absensi.zip`.

## LANGKAH 2 — Ekspor database dari laptop

Karena database lokalmu sudah lengkap (tabel + akun admin), kita salin apa adanya
ke hosting — ini menghindari kebutuhan Terminal di server.

1. Buka `http://localhost/phpmyadmin` di laptop.
2. Klik database **`absensi`** di kiri.
3. Klik tab **Export** (Ekspor) → pilih metode **Quick** → format **SQL** → **Go**.
4. Tersimpan file `absensi.sql`. Simpan, nanti diimpor ke hosting.

> Catatan: file ini berisi data ujimu (siswa uji, dll). Aman untuk uji awal;
> nanti bisa dirapikan.

## LANGKAH 3 — cPanel: PHP, Database, Upload

**3a. Set versi PHP.**
cPanel → **MultiPHP Manager** → centang domain `absensi.smkn3sigi.sch.id` →
pilih **PHP 8.2** (atau 8.3) → **Apply**.

**3b. Buat database.**
cPanel → **MySQL® Databases**:
- "Create New Database": mis. `absensi` → **Create** (nama jadi mis. `namaakun_absensi`).
- "MySQL Users" → buat user + sandi (catat).
- "Add User To Database" → pilih user & database → beri **ALL PRIVILEGES**.
- Catat: **nama database, nama user, sandi** (lengkap dengan prefix akun).

**3c. Unggah Laravel.**
cPanel → **File Manager** → masuk ke folder subdomainmu (document root saat ini,
mis. `/home/namaakun/absensi.smkn3sigi.sch.id`).
- **Hapus isi lama** subdomain (yang mau kamu ganti).
- **Upload** `laravel-absensi.zip` ke situ → setelah selesai, klik kanan → **Extract**.
- Setelah diekstrak, di folder itu harus terlihat `app`, `bootstrap`, `public`,
  `vendor`, `.env`, dll.

## LANGKAH 4 — Arahkan document root ke /public (PENTING)

Laravel harus diakses lewat folder `public` saja (demi keamanan). Dua cara,
pilih yang tersedia:

**Cara A (disarankan) — ubah Document Root:**
cPanel → **Domains** (atau "Subdomains") → cari `absensi.smkn3sigi.sch.id` →
**Manage / Edit** → ubah **Document Root** menjadi:
```
.../absensi.smkn3sigi.sch.id/public
```
(tambahkan `/public` di akhir). Simpan.

**Cara B (kalau Document Root tidak bisa diubah)** — pakai pengalih:
Di dalam folder subdomain, buat file `.htaccess` (bila belum ada) berisi:
```
RewriteEngine On
RewriteRule ^(.*)$ public/$1 [L]
```
Cara A lebih bersih; pakai B hanya bila terpaksa.

## LANGKAH 5 — Isi `.env` dan impor database

**5a. Ambil APP_KEY.** Di laptop (Command Prompt):
```
cd C:\absensi
php artisan key:generate --show
```
Salin hasilnya (bentuk `base64:....`).

**5b. Edit `.env` di server.**
File Manager → buka `.env` di folder Laravel (klik kanan → **Edit**). Samakan dengan
`env-produksi-contoh.txt`, isi `APP_KEY`, dan **DB_DATABASE/DB_USERNAME/DB_PASSWORD**
sesuai yang kamu buat di 3b. Pastikan:
```
APP_ENV=production
APP_DEBUG=false
APP_URL=https://absensi.smkn3sigi.sch.id
```
Simpan.

**5c. Impor database.**
cPanel → **phpMyAdmin** → pilih database yang tadi dibuat → tab **Import** →
pilih file `absensi.sql` (dari Langkah 2) → **Go**. Tunggu sampai sukses.

## LANGKAH 6 — Unggah aplikasi web & scanner

Di File Manager, masuk ke folder **`public`** milik Laravel (di dalam folder subdomain):
- Buat folder **`app`** → unggah **seluruh isi** `public-app/` ke dalamnya
  (termasuk file `.htaccess`, `index.html`, dan folder `assets`).
- Buat folder **`scanner`** → unggah isi `public-scanner/` (file `index.html`).

> Tip upload cepat: zip isi `public-app` jadi satu, upload, extract di `public/app`.
> Pastikan `index.html` berada langsung di dalam `public/app`, bukan bersarang.

## LANGKAH 7 — Izin folder & selesai

1. File Manager → klik kanan folder **`storage`** → **Permissions** → set **755**
   (atau 775). Lakukan juga untuk **`bootstrap/cache`**.
2. (Opsional, butuh Terminal) tautan storage untuk logo/lampiran:
   `php artisan storage:link`. Bila tak ada Terminal, lewati dulu — hanya
   memengaruhi tampilnya logo/lampiran, bukan absensi.

## LANGKAH 8 — UJI

Buka di browser:
1. `https://absensi.smkn3sigi.sch.id/api/info`
   → harus muncul JSON `{"ok":true,...}`. **Ini bukti backend + database jalan.**
2. `https://absensi.smkn3sigi.sch.id/app/`
   → halaman login aplikasi. Masuk `admin` / `admin123` (ganti sandi setelah ini!).
3. `https://absensi.smkn3sigi.sch.id/scanner/`
   → scanner siswa. Login pakai akun siswa. **Karena HTTPS, kamera akan menyala** —
   inilah yang tidak bisa kita uji di lokal.

---

## Kalau ada masalah (paling sering)

- **Halaman putih / error 500 di /api/info** → cek: `.env` benar? `APP_KEY` terisi?
  Permission `storage` 755? Coba sementara `APP_DEBUG=true` untuk melihat pesan
  aslinya, lalu kembalikan ke `false`.
- **"No application encryption key"** → APP_KEY kosong. Ulangi 5a–5b.
- **Koneksi database gagal** → nama DB/user/sandi di `.env` harus versi lengkap
  ber-prefix (mis. `namaakun_absensi`), bukan `absensi` saja.
- **/app/ tampil kosong / aset tidak muncul** → pastikan folder bernama persis
  `app`, dan `.htaccess` ikut terunggah di `public/app`.
- **Scanner tidak connect ke API** → pastikan diakses lewat `https://` (bukan http).

Setelah semua jalan, langkah keamanan wajib: **ganti sandi admin** dan buat
akun admin sekolah yang sesungguhnya.
