# คู่มือ Deploy + เปิดใช้ LINE OA

ระบบ Class Check + LINE OA ที่ `classcare.kruwor.com` (cPanel/ZW Hosting)

---

## ส่วนที่ 1 — เตรียม Hosting

### 1.1 สร้าง Subdomain

1. เข้า cPanel → **Domains** → **Subdomains**
2. ตั้ง:
   - Subdomain: `classcare`
   - Domain: `kruwor.com`
   - Document Root: `classcare.kruwor.com` (auto-fill)
3. กด **Create**

### 1.2 ติดตั้ง SSL

1. cPanel → **SSL/TLS Status** หรือ **Let's Encrypt SSL**
2. หาบรรทัด `classcare.kruwor.com` → กด **Run AutoSSL** หรือ **Issue**
3. รอ ~1-2 นาที จนสถานะเป็น ✅
4. ลองเปิด `https://classcare.kruwor.com` ในเบราว์เซอร์ → ควรขึ้น default page (ยังไม่มีโค้ด)

### 1.3 อัปโหลดโค้ด

มี 2 วิธี

**วิธี A — Git (แนะนำ)**

```bash
# 1. สร้าง repo private บน GitHub แล้ว push code ขึ้นไป
# 2. SSH เข้า cPanel
ssh wor@kruwor.com -p <port>   # ดู port ที่ cPanel → SSH Access

cd /home/<user>/classcare.kruwor.com
git clone https://github.com/<your-username>/classcheck.git .
```

**วิธี B — FTP (ที่ใช้อยู่แล้ว)**

ใน VS Code SFTP extension → upload โฟลเดอร์ทั้งโปรเจกต์ไปที่ `classcare.kruwor.com/`

ยกเว้นไฟล์/โฟลเดอร์ใน `.gitignore`:
- `node_modules/` (จะรัน `npm install` บน server)
- `storage/` (จะให้ server สร้างเอง)
- `.env` (จะตั้งใน cPanel UI)

### 1.4 ตั้งค่า Node.js App ใน cPanel

1. cPanel → **Setup Node.js App** (อยู่ใน Software)
2. กด **Create Application**:
   - **Node.js version**: เลือก LTS ล่าสุด (20.x หรือสูงกว่า)
   - **Application mode**: `Production`
   - **Application root**: `classcare.kruwor.com` (ตรงกับ subdomain)
   - **Application URL**: `classcare.kruwor.com`
   - **Application startup file**: `src/server.js`
3. กด **Create**
4. หน้าใหม่ขึ้นมา — มีปุ่ม **"Run NPM Install"** → กด → รอจนเสร็จ (~2-5 นาที)
5. **Environment variables** (ในหน้าเดียวกัน) — เพิ่ม:
   - `NODE_ENV` = `production`
   - `JWT_SECRET` = (สุ่ม 64 ตัวอักษร — ใช้คำสั่งนี้สร้าง: `openssl rand -hex 32`)
   - `ADMIN_EMAIL` = อีเมลของคุณ
   - `ADMIN_PASSWORD` = (รหัสที่แข็งแรง)
   - `PUBLIC_URL` = `https://classcare.kruwor.com`
   - `PORT` = ปกติ cPanel จะ auto-set ให้ — ปล่อยไว้
6. กด **Save** → กด **Restart**
7. เปิด `https://classcare.kruwor.com` → ควรเห็น `{"name":"Class Check API","status":"ok"}`

---

## ส่วนที่ 2 — ตั้งค่า LINE Developers

ทำใน [https://developers.line.biz/console/](https://developers.line.biz/console/)

### 2.1 Login + สร้าง Provider

1. ล็อกอินด้วย LINE account ปกติของคุณ
2. กด **Create new provider**:
   - Provider name: `โรงเรียน <ชื่อ>` หรือ `Class Check`
3. ได้ provider ใหม่

### 2.2 สร้าง Messaging API Channel

1. ในหน้า provider → กด **Create a new channel**
2. เลือก **Messaging API**
3. กรอก:
   - **Channel name**: `Class Check`
   - **Channel description**: `ระบบเช็คชื่อนักเรียนผ่าน LINE`
   - **Category** + **Subcategory**: เลือกตามจริง (เช่น Education)
   - **Email address**: อีเมลของคุณ
   - ติ๊ก agreements
4. กด **Create**

หลังสร้าง — เก็บ 2 ค่านี้:

📌 **Basic settings tab:**
- `Channel ID` → เก็บไว้
- `Channel secret` → กด show แล้วเก็บไว้

📌 **Messaging API tab:**
- `Channel access token (long-lived)` → กด **Issue** → เก็บไว้

### 2.3 เปิด Webhook

ใน **Messaging API** tab:

1. **Webhook URL**: `https://classcare.kruwor.com/api/line/webhook`
2. กด **Update** → แล้วกด **Verify** (ควรขึ้น ✅ Success)
3. **Use webhook**: เปิด ON
4. **Auto-reply messages**: ปิด OFF (ไม่งั้นจะตอบซ้อนกับ bot)
5. **Greeting messages**: ปิดหรือเปิดตามต้องการ

### 2.4 สร้าง LIFF App

1. แท็บ **LIFF**
2. กด **Add**
3. กรอก:
   - **LIFF app name**: `Class Check Mobile`
   - **Size**: **Full** (เต็มจอ)
   - **Endpoint URL**: `https://classcare.kruwor.com/liff/`
   - **Scope**: ติ๊ก `profile`, `openid` (สำคัญ — openid จำเป็นสำหรับ ID token)
   - **Bot link feature**: เลือก **On (Aggressive)** หรือ **On (Normal)**
4. กด **Add**
5. เก็บ **LIFF ID** (รูปแบบ `1234567890-AbcDefGh`)

### 2.5 (Optional) Rich Menu

ทำให้ครูเปิด LIFF จากเมนูใต้แชทใน LINE OA:

1. [LINE Official Account Manager](https://manager.line.biz/) → channel ของคุณ
2. **Rich Menu** → **Create**
3. ใส่รูปเมนู (1200×810px) + ตั้ง action เป็น `URI` = `https://liff.line.me/<LIFF_ID>`
4. Apply กับ chat

---

## ส่วนที่ 3 — เชื่อม LINE เข้าระบบ

กลับไปที่ cPanel → **Setup Node.js App** → app ของคุณ

เพิ่ม env variables:

- `LINE_CHANNEL_ID` = (จาก 2.2)
- `LINE_CHANNEL_SECRET` = (จาก 2.2)
- `LINE_CHANNEL_ACCESS_TOKEN` = (จาก 2.2)
- `LIFF_ID` = (จาก 2.4)

กด **Save** → กด **Restart**

ทดสอบ:
```
curl https://classcare.kruwor.com/api/line/config
# ควรได้: {"liff_id":"...","enabled":true}
```

---

## ส่วนที่ 4 — เริ่มใช้งาน

### 4.1 ครูเชื่อมบัญชีกับ LINE (ครั้งแรก)

1. ครูเปิด `https://classcare.kruwor.com/teacher/`
2. ล็อกอิน email + password
3. เมนู **"💬 เชื่อมต่อ LINE"**
4. สแกน QR ด้วย LINE → กดเปิดลิงก์ → กด "ยืนยัน" ในหน้า LIFF
5. เสร็จ → ครูใช้ LINE OA ได้ทันที

### 4.2 ใช้งานบนมือถือ

1. ครูเพิ่ม LINE OA เป็นเพื่อน (ใช้ QR หรือ ID จาก LINE Console)
2. กดเมนูใน LINE → เปิด LIFF
3. เห็นตารางสอนวันนั้น → คลิกห้อง → เช็คชื่อ → กดบันทึก

---

## Troubleshooting

| ปัญหา | สาเหตุ + แก้ |
|---|---|
| `502 Bad Gateway` ที่ subdomain | Node.js app ยังไม่ start — กด Restart ใน cPanel |
| Webhook Verify ล้มเหลว | URL พิมพ์ผิด หรือ HTTPS ไม่ทำงาน — ลอง `curl -v https://classcare.kruwor.com/api/line/webhook` ดูว่ารับ request ได้ |
| LIFF ขึ้น "ระบบ LINE ยังไม่เปิดใช้งาน" | ENV vars ยังไม่ครบ — เช็ค `LINE_CHANNEL_ID` + `LIFF_ID` ใน cPanel + restart |
| `Module not found: better-sqlite3` | กด "Run NPM Install" ใน cPanel Node.js App page |
| Migration ไม่รัน | บางครั้ง Passenger ไม่ได้ start app — ดู log ที่ `~/classcare.kruwor.com/passenger.log` |

---

## คำสั่ง SSH ที่มักใช้

```bash
# Restart Node.js
touch ~/classcare.kruwor.com/tmp/restart.txt

# ดู log
tail -f ~/classcare.kruwor.com/passenger.log

# อัปเดตโค้ด (ถ้าใช้ git)
cd ~/classcare.kruwor.com
git pull
touch tmp/restart.txt   # restart

# Backup DB
cp ~/classcare.kruwor.com/storage/system.sqlite ~/backups/system-$(date +%F).sqlite
```

---

## ตรวจ Checklist

- [ ] Subdomain `classcare.kruwor.com` ใช้งานได้ + HTTPS เขียวทุกหน้า
- [ ] Node.js App start success — เปิด `/` ได้ JSON ok
- [ ] LINE Channel + LIFF สร้างเสร็จ
- [ ] Webhook Verify ผ่าน
- [ ] ENV vars ครบ 4 ตัว (Channel ID, Secret, Access Token, LIFF ID)
- [ ] `/api/line/config` return `enabled:true`
- [ ] ครูล็อกอินผ่าน web → ผูก LINE → ใช้ LIFF บนมือถือได้
