# 🚀 คู่มือ Deploy — KruWai (เว็บไซต์หลัก / Landing)

แพ็กเกจนี้คือ **เว็บไซต์หลัก (หน้า landing)** ของ KruWai — เป็นคนละระบบกับ
"แอปนักเรียน" (login / สมัคร / แดชบอร์ด) ปุ่มต่าง ๆ บนหน้านี้จะลิงก์ไปแอปนักเรียน
ผ่านค่า `USER_APP_URL` ใน `.env`

- **เฟรมเวิร์ก:** Laravel 13
- **ต้องใช้ PHP 8.4 ขึ้นไป** ⚠️ (ดูหัวข้อ "ข้อกำหนด" — สำคัญมาก)
- **ฐานข้อมูล:** MySQL/MariaDB (หน้า landing แทบไม่แตะ DB — ดูหัวข้อ "เรื่องฐานข้อมูล")
- **ไม่ต้องใช้ Node/npm** — หน้าเว็บโหลด Tailwind/Alpine ผ่าน CDN ไม่ต้อง build asset

> ✅ แพ็กเกจนี้ build asset เรียบร้อย/ไม่ต้อง build, รวม `vendor/` มาให้แล้ว,
> และตั้งค่า production ไว้ให้ — งานหลักที่เหลือคือ "แก้ `.env` + อัปโหลด + ตั้งสิทธิ์ไฟล์"

---

## 📦 มีอะไรในแพ็กเกจนี้

```
kruwai-web/                 ← โฟลเดอร์แอปจริง (อันนี้แหละที่อัปโหลด)
  app/ bootstrap/ config/ database/ lang/ resources/ routes/
  storage/ vendor/ public/
  artisan  composer.json  composer.lock
  .env                     ← ตั้งค่า production ไว้แล้ว (มี APP_KEY) — แก้ค่า CHANGE_ME
.env.production.example     ← เทมเพลตอ้างอิง (สำเนาของ .env แบบเว้น key)
DEPLOY-TH.md               ← ไฟล์นี้
extras/
  index.singlefolder.php   ← index.php สำรอง สำหรับเลย์เอาต์แบบโฟลเดอร์เดียว (Option B)
  htaccess-root.txt        ← .htaccess สำหรับ root ของเลย์เอาต์ Option B
```

> ❗ ไฟล์ `DEPLOY-TH.md`, `.env.production.example`, และ `extras/` เป็นเอกสาร/ของสำรอง
> **ไม่ต้องอัปโหลดขึ้นโฮสต์** อัปโหลดเฉพาะข้างใน `kruwai-web/` เท่านั้น

---

## ✅ ข้อกำหนดของโฮสต์ (ตรวจก่อนเริ่ม)

1. **PHP 8.4+ (บังคับ)** — ไฟล์ `config/database.php` ใช้คลาส `Pdo\Mysql` ซึ่งมีเฉพาะ
   PHP 8.4 ขึ้นไป ถ้าใช้ 8.3 หรือต่ำกว่า เว็บจะ error ทันทีเมื่อเชื่อม MySQL
   - cPanel: เมนู **MultiPHP Manager** → เลือกโดเมน → ตั้งเป็น **PHP 8.4**
2. **PHP extensions** (มาตรฐานของ Laravel ส่วนใหญ่โฮสต์เปิดให้อยู่แล้ว):
   `pdo_mysql, mbstring, openssl, tokenizer, ctype, json, bcmath, fileinfo, curl, dom, xml`
   - เปิด/ปิดได้ที่ cPanel → **Select PHP Version** → แท็บ Extensions
3. **mod_rewrite** เปิดใช้งาน (Apache/LiteSpeed บน shared host มักเปิดอยู่แล้ว)
4. **MySQL/MariaDB** — มีสิทธิ์สร้าง database + user
5. แนะนำให้มี **SSL (HTTPS)** — cPanel ส่วนใหญ่มี AutoSSL (Let's Encrypt) ฟรี

---

## 🧭 เลือกวิธีวางไฟล์ (สำคัญ — เลือก 1 แบบ)

### ⭐ Option A — ชี้ Document Root ไปที่ `public/` (แนะนำ ปลอดภัยสุด)
ใช้ได้เมื่อโฮสต์ให้ตั้ง/เปลี่ยน document root ได้ เช่น สร้างเป็น **subdomain** หรือ
**addon domain** ใน cPanel (กำหนด docroot ได้) หรือโฮสต์มีช่องตั้ง docroot

- วางทั้งโฟลเดอร์ `kruwai-web/` ไว้ที่ใดก็ได้ (เช่น `/home/USER/kruwai-web`)
- ตั้ง **Document Root ของโดเมน = `/home/USER/kruwai-web/public`**
- ✅ ไม่ต้องแก้ `index.php` ใด ๆ และซอร์สโค้ด (app, vendor, .env) อยู่นอก web root = ปลอดภัยที่สุด

### Option B — ทุกอย่างอยู่ใน `public_html/` (เมื่อเปลี่ยน docroot ไม่ได้)
ใช้เมื่อโดเมนหลักล็อก docroot ไว้ที่ `public_html` เปลี่ยนไม่ได้

1. ก๊อปปี้ **ข้างใน** `kruwai-web/public/*` (index.php, .htaccess, favicon.*, robots.txt, web.config)
   ขึ้นไปไว้ที่ `public_html/`
2. ก๊อปปี้ **ทุกอย่างที่เหลือ** ใน `kruwai-web/` (app, bootstrap, config, database, lang,
   resources, routes, storage, vendor, artisan, composer.*, **.env**) ไปไว้ที่ `public_html/` ด้วย (โฟลเดอร์เดียวกัน)
3. แทนที่ `public_html/index.php` ด้วย **`extras/index.singlefolder.php`** (เปลี่ยนชื่อเป็น `index.php`)
4. แทนที่ `public_html/.htaccess` ด้วย **`extras/htaccess-root.txt`** (เปลี่ยนชื่อเป็น `.htaccess`)
   — ไฟล์นี้จะบล็อกไม่ให้เข้าถึง app/, vendor/, .env ฯลฯ จากเว็บ

> 🔐 ทั้งสองแบบ: ห้ามให้เข้าถึง `.env` หรือโฟลเดอร์ซอร์สผ่าน URL ได้เด็ดขาด
> Option A ปลอดภัยโดยธรรมชาติ ส่วน Option B พึ่ง `.htaccess` (ทดสอบตามหัวข้อ "ตรวจสอบ")

---

## 🛠️ ขั้นตอนติดตั้ง (ทีละขั้น — อิง cPanel)

### 1) สร้างฐานข้อมูล MySQL
cPanel → **MySQL Databases**
- สร้าง Database (เช่น `user_kruwai`)
- สร้าง User + รหัสผ่าน
- **Add User To Database** แล้วให้สิทธิ์ **ALL PRIVILEGES**
- จดค่า: ชื่อ DB / ชื่อ user / รหัสผ่าน (มักมี prefix `cpaneluser_` นำหน้า)

### 2) อัปโหลด + แตกไฟล์
- ซิปโฟลเดอร์ `kruwai-web/` แล้วอัปโหลดผ่าน cPanel **File Manager** → Extract
  (หรือใช้ FTP/SFTP อัปทั้งโฟลเดอร์)
- วางตำแหน่งตาม Option A หรือ B ที่เลือกไว้

### 3) แก้ไฟล์ `.env`
เปิด `.env` (อยู่ในโฟลเดอร์แอป) แก้ค่าต่อไปนี้:
```env
APP_URL=https://โดเมนจริงของคุณ
USER_APP_URL=https://โดเมนของแอปนักเรียน
DB_DATABASE=ชื่อ_database_จริง
DB_USERNAME=ชื่อ_user_จริง
DB_PASSWORD=รหัสผ่านจริง
# ถ้าเชื่อม DB ไม่ได้ด้วย 127.0.0.1 ให้ลองเปลี่ยนเป็น localhost
DB_HOST=127.0.0.1
```
- มี **HTTPS** แล้ว → เปิดบรรทัด `SESSION_SECURE_COOKIE=true` (เอา `#` ออก)
- `APP_KEY` มีให้แล้ว ไม่ต้องแตะ (ถ้าต้องการสร้างใหม่และมี terminal: `php artisan key:generate`)
- ตรวจให้แน่ใจว่า `APP_ENV=production` และ `APP_DEBUG=false`

### 4) ตั้งสิทธิ์ไฟล์ (สำคัญ — ป้องกัน error 500)
ต้องให้เว็บเซิร์ฟเวอร์เขียน 2 โฟลเดอร์นี้ได้:
- `storage/` (และโฟลเดอร์ย่อยทั้งหมด)
- `bootstrap/cache/`

ใน File Manager: คลิกขวาโฟลเดอร์ → **Change Permissions** → ตั้ง `755`
(บางโฮสต์ต้อง `775`) แบบ recursive
ถ้ามี terminal/SSH:
```bash
cd path/to/kruwai-web
find storage bootstrap/cache -type d -exec chmod 755 {} \;
find storage bootstrap/cache -type f -exec chmod 644 {} \;
```

### 5) ตั้ง PHP เป็น 8.4
cPanel → **MultiPHP Manager** → เลือกโดเมน → **PHP 8.4** → Apply

### 6) (ถ้ามี Terminal/SSH — ไม่บังคับ แต่แนะนำ)
ทำให้แพ็กเกจเล็กลง/เร็วขึ้น:
```bash
cd path/to/kruwai-web

# ตัด dependency ฝั่ง dev ออก + optimize autoloader (ถ้ามี composer)
composer install --no-dev --optimize-autoloader

# แคช config + view (เร็วขึ้น)  — ดูข้อควรระวังด้านล่าง
php artisan config:cache
php artisan view:cache
```
> ⚠️ **อย่ารัน `php artisan route:cache`** — route ของเว็บนี้ใช้ closure จะ cache ไม่ได้ (จะ error)
> ⚠️ ถ้าแก้ `.env` อีกครั้งหลัง `config:cache` ต้องรัน `php artisan config:clear` ก่อนเสมอ
> ถ้าไม่มี terminal ก็ **ข้ามขั้นนี้ได้** เว็บทำงานปกติ (หน้า landing เบาอยู่แล้ว)

---

## 🗄️ เรื่องฐานข้อมูล (อ่านสักนิด)

หน้า **landing แทบไม่ใช้ฐานข้อมูล**:
- session / cache / queue ตั้งเป็นแบบไฟล์ (`file`/`sync`) ไม่แตะ DB
- ผู้เข้าชมทั่วไป (ไม่ได้ล็อกอิน) จะ **ไม่มี query ลง DB** เลย
- ตาราง users/subjects/ฯลฯ เป็นของ "แอปนักเรียน" (คนละระบบ) — ไม่ต้องสร้างที่นี่

ดังนั้นต่อให้ใส่ค่า DB ผิดเล็กน้อย หน้าแรกก็ยังขึ้นได้ แต่ควรตั้งให้ถูกไว้

**ถ้าต้องการให้ฟีเจอร์ที่ใช้ DB ทำงาน** (เช่น Review toolbar — ปกติปิดบน production):
ถ้ามี terminal สั่ง `php artisan migrate --force` (จะสร้างตารางตาม `database/migrations/`)
หน้า landing ปกติ **ไม่จำเป็นต้อง migrate**

---

## 🔎 ตรวจสอบหลัง Deploy

1. เปิด `https://โดเมนของคุณ/` → ต้องเห็นหน้า KruWai (ฮีโร่สีม่วง-คราม)
2. เปิด `https://โดเมนของคุณ/up` → หน้าตรวจสุขภาพของ Laravel ต้องขึ้น **200 / "Application up"**
3. ลองสลับภาษา (ไทย/EN) มุมขวาบน → ต้องสลับได้ (ถ้าไม่สลับ ดู "แก้ปัญหา" เรื่อง cookie)
4. **ทดสอบความปลอดภัย** เปิด URL เหล่านี้ — ต้องได้ **403/404 (เข้าไม่ได้)**:
   - `https://โดเมนของคุณ/.env`
   - `https://โดเมนของคุณ/composer.json`
   - `https://โดเมนของคุณ/storage/logs/laravel.log`
   ถ้าเปิดดูเนื้อหาได้ = ผิด! แสดงว่าวางไฟล์/`.htaccess` ไม่ถูก (Option B ต้องใช้ htaccess-root)

---

## 🧯 แก้ปัญหาที่เจอบ่อย

| อาการ | สาเหตุ / วิธีแก้ |
|---|---|
| **500 Server Error** | 90% คือสิทธิ์ไฟล์ — ตั้ง `storage/` และ `bootstrap/cache/` ให้เขียนได้ (755/775). ดู log ที่ `storage/logs/laravel.log` |
| **500 ทันทีเมื่อโหลด / เกี่ยวกับ `Pdo\Mysql`** | PHP ไม่ใช่ 8.4 → ไปตั้ง MultiPHP เป็น **PHP 8.4** |
| **หน้าขาว / "No application encrypter"** | `APP_KEY` ว่าง → ใส่ค่าจาก `.env` ที่ให้มา หรือรัน `php artisan key:generate` |
| **ดาวน์โหลด index.php แทนที่จะรัน** | โฮสต์ไม่ได้ผูก .php กับ PHP / docroot ผิด → ตรวจ docroot และ MultiPHP |
| **404 ทุกหน้า ยกเว้นหน้าแรก** | `mod_rewrite`/`.htaccess` ไม่ทำงาน → เปิด mod_rewrite, ตรวจว่า `.htaccess` ถูกอัปโหลด (เป็นไฟล์ซ่อน) |
| **สลับภาษาไม่ติด** | ตั้ง `SESSION_SECURE_COOKIE=true` แต่เว็บยังเป็น http → เปลี่ยนเป็น https หรือคอมเมนต์บรรทัดนั้นไว้ |
| **เห็นรายละเอียด error เต็ม ๆ** | `APP_DEBUG` ยังเป็น true → ตั้งเป็น `false` แล้ว `php artisan config:clear` (ถ้าเคย cache) |
| **แก้ `.env` แล้วไม่เปลี่ยน** | เคยรัน `config:cache` ไว้ → `php artisan config:clear` |
| **เนื้อหา/ฟอนต์ไม่ขึ้น (เว็บ https)** | CDN เป็น https อยู่แล้ว ปกติไม่มีปัญหา mixed content — เคลียร์แคชเบราว์เซอร์ |

---

## 🔒 เช็กลิสต์ความปลอดภัยก่อนเปิดจริง

- [ ] `APP_ENV=production` และ `APP_DEBUG=false`
- [ ] เปิด `/.env` ผ่าน URL **ไม่ได้** (403/404)
- [ ] เปิดเว็บผ่าน **HTTPS** และตั้ง `SESSION_SECURE_COOKIE=true`
- [ ] ตั้งรหัส DB user ที่คาดเดายาก และให้สิทธิ์เท่าที่จำเป็น
- [ ] PHP = 8.4, อัปเดต patch ล่าสุดของโฮสต์

---

## 🔁 อัปเดตเวอร์ชันใหม่ภายหลัง

1. อัปโหลดทับเฉพาะโค้ดที่เปลี่ยน (อย่าทับ `.env` และโฟลเดอร์ `storage/`)
2. ถ้าเคย cache ไว้: `php artisan optimize:clear` แล้วค่อย cache ใหม่ตามต้องการ
3. ถ้ามี migration ใหม่และต้องใช้ DB: `php artisan migrate --force`

---

มีปัญหาตอน deploy ส่ง log จาก `storage/logs/laravel.log` มาได้เลย จะช่วยไล่ให้ 🙌
