# Deployment Copy Excludes

เอกสารนี้ใช้สำหรับอัปไฟล์จากเครื่อง Dev ขึ้น Production โดยไม่ทับไฟล์ runtime สำคัญของเครื่องจริง

ใช้คู่กับ:

- [Production Deployment Checklist](./production-deployment-checklist.md)
- [Release Checklist](./release-checklist.md)
- [WinSCP Source-Only Sync](./winscp-source-only-sync.md)

## หลักการสั้น ๆ

เวลา deploy ขึ้น Production ให้ copy เฉพาะ `source code`

ห้ามทับไฟล์ประเภท:

- config runtime ของ Production
- session
- throttle state
- bootstrap marker
- uploaded files
- backup/export files

## ห้าม Copy ทับ

### Root

- `.env`

### Storage runtime

- `storage/sessions/*`
- `storage/settings/login_throttle.json`
- `storage/settings/runtime_schema_bootstrap.json`
- `storage/uploads/payment_slips/*`
- `storage/database_backups/*`
- `storage/maintenance_exports/*`

## ควร Copy ได้

- `assets/`
- `config/`
- `includes/`
- `pages/`
- `process/`
- `scripts/`
- `docs/`
- `manifest.webmanifest`
- `service-worker.js`
- `offline.html`
- `storage/.htaccess`
- `storage/web.config`

## วิธีคิดที่ปลอดภัย

ถ้าไฟล์นั้นเป็น “ข้อมูลที่เกิดขึ้นระหว่างใช้งานจริงบนเครื่อง Production” ให้ถือว่าไม่ควรเอาจาก Dev ไปทับ

ตัวอย่าง:

- payment slips ของลูกค้า
- session ที่ผู้ใช้กำลังล็อกอินอยู่
- backup/export ที่สร้างจาก Production
- login throttle state
- runtime bootstrap marker

## ชุด Exclude กลาง

รายการนี้ใช้เป็นฐานสำหรับเครื่องมือ copy ส่วนใหญ่ได้:

```text
.env
storage/sessions/
storage/settings/login_throttle.json
storage/settings/runtime_schema_bootstrap.json
storage/uploads/payment_slips/
storage/database_backups/
storage/maintenance_exports/
```

## กรณีใช้ WinSCP

ถ้าใช้ `Synchronize` หรือ `Copy` ให้ตั้ง exclude mask ประมาณนี้:

```text
.env; storage/sessions/; storage/settings/login_throttle.json; storage/settings/runtime_schema_bootstrap.json; storage/uploads/payment_slips/; storage/database_backups/; storage/maintenance_exports/
```

ถ้าใช้ `Synchronize...`

- ให้เลือก `Preview changes` ก่อน
- ตรวจว่ารายการข้างบนไม่อยู่ในฝั่งที่จะถูก overwrite
- ระวังมากเป็นพิเศษถ้าเปิด `Delete files`

ถ้าต้องการคู่มือแบบ step-by-step ให้ใช้ [WinSCP Source-Only Sync](./winscp-source-only-sync.md)

## กรณีใช้ FTP / FileZilla

ถ้าเป็นการลากไฟล์ขึ้นตรง ๆ:

1. อย่าลากทั้งโฟลเดอร์ `storage` ขึ้นไปทับ
2. ถ้าจำเป็นต้องอัป `storage/.htaccess` หรือ `storage/web.config` ให้เปิดเข้าไปอัปเฉพาะ 2 ไฟล์นี้
3. อย่าอัป `.env` จากเครื่อง Dev

แนวที่ปลอดภัยกว่า:

- อัปเฉพาะ `assets`, `config`, `includes`, `pages`, `process`
- อัปไฟล์ root ที่จำเป็นทีละไฟล์

## กรณีใช้ RDP / Copy วางทับ

ถ้า copy ผ่าน Windows Explorer บนเครื่อง Cloud:

1. อย่า copy โฟลเดอร์ `CCW` ทั้งก้อนมาวางทับทันที
2. เปิด source กับ target เทียบกัน
3. copy เฉพาะโฟลเดอร์ source code:
   - `assets`
   - `config`
   - `includes`
   - `pages`
   - `process`
4. ที่ `storage` ให้อัปเฉพาะ:
   - `.htaccess`
   - `web.config`

## กรณีใช้ ZIP Deploy

ถ้าจะ zip จาก Dev แล้วเอาไปแตกบน Production:

- อย่าใส่ `.env` ลง zip
- อย่าใส่ไฟล์ runtime ใต้ `storage/` ลง zip

โครงสร้างที่ควรอยู่ใน zip:

- source code ทั้งหมด
- `storage/.htaccess`
- `storage/web.config`

โครงสร้างที่ไม่ควรอยู่ใน zip:

- `storage/sessions/*`
- `storage/settings/*.json`
- `storage/uploads/payment_slips/*`
- `storage/database_backups/*`
- `storage/maintenance_exports/*`

## กรณีใช้ Robocopy

มี template พร้อมใช้แล้วที่ [deploy_source_only_robocopy.ps1](/C:/xampp82/htdocs/CCW/scripts/deploy_source_only_robocopy.ps1:1)

ตัวอย่างแนวคิด:

```powershell
robocopy C:\path\to\CCW \\server\path\CCW /MIR `
  /XD storage\sessions storage\uploads\payment_slips storage\database_backups storage\maintenance_exports `
  /XF .env storage\settings\login_throttle.json storage\settings\runtime_schema_bootstrap.json
```

ข้อควรระวัง:

- `/MIR` มีผลลบไฟล์ฝั่งปลายทางได้
- ถ้าใช้จริง ควรทดสอบด้วย `/L` ก่อน
- ถ้าไม่มั่นใจ ใช้ `/E` แทน `/MIR`

## หลัง Copy เสร็จ ควรเช็กทันที

- `.env` ของ Production ยังเป็นค่าของ Production
- payment slip เดิมยังอยู่
- `storage/settings/runtime_schema_bootstrap.json` ไม่ได้ถูกทับจาก Dev
- session/login ใช้งานได้
- รัน [post_deploy_spot_check.ps1](/C:/xampp82/htdocs/CCW/scripts/post_deploy_spot_check.ps1:1)

## วิธีที่แนะนำที่สุด

ถ้าจะให้ปลอดภัย:

1. อัป source code only
2. เก็บ `.env` ไว้บน Production
3. อย่าทับ runtime files ใต้ `storage/`
4. เปิดเว็บ 1 รอบให้ runtime bootstrap ทำงานเอง
5. ค่อย compare/apply โครงสร้างฐานข้อมูลถ้าจำเป็น

## อย่าพึ่งเชื่อว่า “Copy ทั้งโฟลเดอร์แล้วค่อยแก้ .env” ปลอดภัย

เหตุผล:

- มันยังเสี่ยงทับ `storage/`
- มันยังเสี่ยงพา marker/runtime state จาก Dev ไปด้วย
- มันยังทำให้ uploaded slips / backups / exports ของ Production หายหรือปนกันได้

สรุปคือ:

- `copy source code only` = ปลอดภัยกว่า
- `copy ทั้งโฟลเดอร์` = ทำได้ แต่เสี่ยงและต้อง exclude ให้ถูกจริง
