# Panduan Hosting — Website SD Negeri 4 Keling

Dokumen ini isinya semua yang perlu disiapkan supaya website ini jalan
lancar begitu di-upload ke hosting, plus penjelasan apa saja yang sudah
dibenerin supaya proses deploy nggak ribet lagi.

---

## Ringkasan Perubahan (biar hosting gampang)

1. **Upload foto sudah tidak butuh `storage:link` lagi.** Semua file yang
   diupload lewat admin (foto, video, berkas pendaftaran) sekarang langsung
   tersimpan di folder `public/uploads/`, bukan di `storage/app/public/`
   yang butuh symlink. Banyak hosting murah tidak mengizinkan pembuatan
   symlink atau tidak punya akses SSH untuk menjalankan perintah itu — ini
   penyebab paling umum foto "hilang" pas baru pindah hosting.
2. **Session & cache dipindah dari database ke file.** Ini menghindari
   beban ekstra ke database setiap kali ada yang buka halaman, dan juga
   menghindari error 419 (Page Expired) yang sering muncul kalau tabel
   session belum ke-setup dengan benar.
3. **Trusted proxy diaktifkan** supaya deteksi HTTP/HTTPS tetap benar
   walau hosting-nya lewat proxy/Cloudflare — ini penyebab umum lain dari
   error 419 setelah login.
4. **Locale di-set ke Indonesia** (`id`) supaya tanggal selalu muncul
   "Juli", "Agustus", dst — bukan "July", "August" dalam bahasa Inggris.
5. **Batas ukuran upload dinaikkan** dari 2MB jadi 10MB per foto (video
   sampai 100MB), plus batas PHP-nya sendiri juga dinaikkan lewat file
   `.user.ini` supaya tidak perlu compress-compress foto lagi sebelum upload.
6. **Caching browser + kompresi diaktifkan** di `.htaccess` supaya lebih
   ringan dipakai banyak orang sekaligus.
7. **Halaman error otomatis dibuatkan** untuk 419 (form kedaluwarsa) biar
   user dikasih pesan jelas, bukan layar putih polos.

---

## Langkah Deploy

### 0. Siapkan folder `vendor/` (WAJIB dilakukan dulu sebelum upload)

Zip ini **tidak menyertakan folder `vendor/`** (isi dependency PHP-nya)
supaya ukuran file tidak kebesaran. Sebelum upload ke hosting, siapkan dulu
dari komputer sendiri (Laragon):

1. Extract zip ini, buka folder project-nya di terminal/CMD
2. Jalankan: `composer install --no-dev --optimize-autoloader`
3. Setelah selesai, folder `vendor/` akan muncul — folder ini yang perlu
   ikut diupload ke hosting bersama semua file lainnya.

> Kalau hosting punya akses SSH dan Composer sendiri, boleh juga jalankan
> `composer install` langsung di hosting dan lewati langkah ini.

### 1. Siapkan `.env`

Copy `.env.example` jadi `.env`, lalu isi bagian ini:

```
APP_URL=https://domainsekolah.sch.id      <-- WAJIB diisi domain asli, jangan dibiarkan default
DB_DATABASE=nama_database_di_hosting
DB_USERNAME=user_database_di_hosting
DB_PASSWORD=password_database_di_hosting
SESSION_SECURE_COOKIE=true                <-- isi TRUE kalau website sudah HTTPS, FALSE kalau masih HTTP
```

Lalu generate APP_KEY (baris ini WAJIB, kalau kosong website akan selalu
error "no application encryption key"):

- Kalau hosting kasih akses terminal/SSH: jalankan `php artisan key:generate`
- Kalau tidak ada akses terminal: generate lewat https://generate-random.org/laravel-key-generator
  lalu tempel manual ke baris `APP_KEY=` di `.env`

### 2. Import Database

Buka phpMyAdmin di hosting → bikin database kosong → tab **SQL** → paste
seluruh isi `database/sdnegeri4keling.sql` → **Go**. Selesai, semua tabel
+ data awal langsung jadi, **tidak perlu jalankan migration/seeder lagi.**

### 3. Upload File ke Hosting

Ada 2 skenario tergantung jenis hosting-nya:

#### Skenario A — Hosting mengizinkan ganti Document Root (paling gampang)

Kalau di panel hosting ada opsi seperti "Document Root", "Addon Domain
Folder", atau semacamnya:

1. Upload semua isi folder project ini ke satu folder, misalnya `laravel_app/`
2. Set Document Root domain ke `laravel_app/public`
3. Selesai — semua otomatis jalan.

#### Skenario B — Hosting cuma kasih folder `public_html` (paling umum di hosting murah)

Kalau tidak ada opsi ganti Document Root:

1. Upload seluruh project ke folder DI LUAR `public_html`, misalnya bikin
   folder `laravel_app/` sejajar dengan `public_html/` (lewat File Manager
   hosting atau FTP)
2. Copy/pindahkan SEMUA ISI folder `laravel_app/public/` (bukan foldernya,
   isinya saja: `index.php`, `.htaccess`, `build/`, `images/`, `uploads/`,
   dll) ke dalam `public_html/`
3. Edit file `public_html/index.php` yang baru dipindah tadi, cari 2 baris
   ini di bagian atas:
   ```php
   require __DIR__.'/../vendor/autoload.php';
   $app = require_once __DIR__.'/../bootstrap/app.php';
   ```
   Ganti `../` jadi mengarah ke folder `laravel_app/`, contoh:
   ```php
   require __DIR__.'/../laravel_app/vendor/autoload.php';
   $app = require_once __DIR__.'/../laravel_app/bootstrap/app.php';
   ```
4. Selesai.

> Kalau bingung mana yang dipakai, hubungi CS hosting dan tanya: "apakah
> saya bisa mengubah document root domain ke folder tertentu?" Kalau bisa
> → pakai Skenario A. Kalau tidak → pakai Skenario B.

### 4. Set Permission Folder (kalau ada akses terminal)

```
chmod -R 775 storage bootstrap/cache public/uploads
```

Kalau tidak ada akses terminal, biasanya file manager hosting sudah kasih
permission yang cukup secara otomatis — coba dulu, kalau ada error
"permission denied" baru perlu diatur manual lewat File Manager (klik kanan
folder → Change Permissions → centang Read/Write untuk folder `storage`,
`bootstrap/cache`, dan `public/uploads`).

### 5. Kalau Ada Composer/Node di Hosting (opsional)

Project ini sudah dikirim dengan asset CSS/JS yang **sudah di-build**
(folder `public/build`), jadi **tidak perlu npm/Node.js di hosting sama
sekali.** Kalau `vendor/` juga sudah disertakan, tidak perlu composer juga
— tinggal upload dan jalan.

---

## Troubleshooting

**Muncul "419 Page Expired" setelah submit form/login**
→ Pastikan `APP_URL` di `.env` sesuai domain asli (pakai `https://` kalau
sudah SSL). Kalau masih terjadi, coba ubah `SESSION_SECURE_COOKIE` jadi
`false` di `.env` (untuk website yang belum HTTPS).

**Foto tidak muncul / rusak (ikon gambar pecah)**
→ Pastikan folder `public/uploads` ter-upload dan writable (bisa ditulis).
Kalau masih blank, cek folder itu benar-benar ada di hosting.

**Upload foto gagal "file too large"**
→ File `.user.ini` di folder `public/` seharusnya otomatis menaikkan batas
ini. Kalau masih gagal, hosting-nya kemungkinan pakai mode PHP yang beda
(mod_php, bukan PHP-FPM) — hubungi CS hosting untuk minta `upload_max_filesize`
dinaikkan lewat menu "MultiPHP INI Editor" atau semacamnya di cPanel.

**Tanggal muncul dalam bahasa Inggris (July, August, dst)**
→ Pastikan `APP_LOCALE=id` di `.env`. Kalau sudah dan masih bahasa
Inggris, jalankan `php artisan config:clear` (kalau ada akses terminal).

**Halaman blank putih / Error 500**
→ Set sementara `APP_DEBUG=true` di `.env` untuk lihat pesan error
aslinya, cek juga file log di `storage/logs/laravel.log`. Jangan lupa
kembalikan ke `APP_DEBUG=false` lagi setelah selesai debug (demi
keamanan).

---

## Soal Kapasitas Pengunjung (100+ pengguna bersamaan)

Beberapa hal sudah disiapkan di sisi kode (session/cache pakai file bukan
database, browser caching, kompresi otomatis). Untuk hasil terbaik, ini
juga membantu kalau memungkinkan di hosting:

- Pilih paket hosting dengan PHP-FPM (bukan mod_php) — jauh lebih ringan
  menangani banyak pengunjung sekaligus.
- Aktifkan OPcache PHP kalau ada opsinya di panel hosting.
- Kalau ada akses terminal, jalankan sekali setelah deploy:
  ```
  php artisan config:cache
  php artisan route:cache
  php artisan view:cache
  ```
  (ini mempercepat setiap request karena Laravel tidak perlu baca ulang
  file config/route setiap kali ada yang buka website)

Untuk website sekolah dengan traffic 100+ pengunjung bersamaan, hosting
shared yang cukup baik biasanya sudah cukup — tidak perlu VPS kecuali
trafficnya jauh lebih besar dari itu.
