# บทเรียน 06 — deploy ขึ้น Cloudflare ด้วย API token จากไฟล์ .env

เว็บสมบูรณ์บนเครื่องแล้ว บทนี้พามันขึ้นอินเทอร์เน็ตจริง — **deploy ขึ้น Cloudflare** โดยให้ agent ใช้ API token ที่เตรียมไว้ในไฟล์ `.env` ขั้นนี้สั้นที่สุดของ session (6 นาที 6 วินาที) แต่แตะเรื่องความปลอดภัยมากที่สุด: **token คือกุญแจเข้าบัญชี Cloudflare ของเรา**

เป้าหมายของบทนี้: เว็บเปิดได้จาก URL จริง และ token ไม่รั่วออกไปไหนทั้งในโค้ด ใน log และใน repository

## ก่อนสั่ง: เตรียม token ให้พร้อม

สิ่งที่เราเตรียมไว้ก่อน prompt ของบทนี้:

- สร้าง **Cloudflare API token** แบบกำหนดสิทธิ์เฉพาะงาน (ทำตาม [บท 06 — สร้าง Cloudflare API token](06-create-cloudflare-token.md) — ไม่ใช้ Global API Key)
- ใส่ token ไว้ในไฟล์ **`.env`** ของโปรเจกต์ และมั่นใจว่า `.gitignore` กันไฟล์นี้ออกจาก git

การเตรียมแบบนี้ทำให้ prompt ในการ deploy สั้นเหลือบรรทัดเดียว:

## Prompt ที่ใช้

> deploy เว็บขึ้น cloudflare โดยการใช้ api token ที่อยู่ในไฟล์ .env

![ภาพ capture ของ prompt deploy ขึ้น Cloudflare](/images/step7-deploy-prompt.webp)

## ผลลัพธ์

![ภาพ capture ของผล deploy สำเร็จพร้อมลิงก์เปิดเว็บไซต์](/images/step7-deploy-result1.webp)

agent รายงานว่า **deploy สำเร็จ** พร้อมลิงก์เปิดเว็บไซต์ และย้ำเรื่องความปลอดภัยของตัวเอง:

- **ไฟล์ `.env` และ API token ไม่ถูกเผยแพร่** — ไม่ขึ้นไปกับไฟล์ที่ deploy และไม่หลุดออกในผลลัพธ์
- **เว็บเดิมบน Cloudflare Sites ยังอยู่ครบถ้วน** — deploy ครั้งนี้ไม่ทำลายงานเดิม
- หมายเหตุ: **ฟอร์มอีเมลบนโดเมนใหม่ยังไม่ได้ทดสอบส่งจริง** — เชื่อมโยงกับบทเรียน Activate Form ในบท 03

![ภาพ capture ของสรุปไฟล์ที่แก้ไฟล์ 6 ไฟล์ เช่น .gitignore README และ .assetsignore](/images/step7-deploy-result2.webp)

ไฟล์ที่แก้ทั้งหมด 6 ไฟล์ (+39 บรรทัด) ที่น่าสนใจคือ agent แก้ `.gitignore` เพิ่ม (กัน `.env` ให้แน่นขึ้น), เพิ่ม `dist/.assetsignore` (บอก Cloudflare ว่าไฟล์ไหนไม่ต้องขึ้นไป) และบันทึกวิธี deploy ลง README

## ความปลอดภัยของ token: กฎ 3 ข้อ

| กฎ | ทำไม |
| --- | --- |
| **ไม่ commit** — token อยู่ใน `.env` ซึ่ง `.gitignore` กันไว้ | repository (รวมถึงแบบ private) ที่มี token เท่ากับมอบกุญแจให้ทุกคนที่เห็น repo และอยู่ในประวัติ git ตลอดไป |
| **ไม่ log / ไม่พิมพ์ออกทางใด** — ตรวจว่าผลลัพธ์ของ agent ไม่มีค่า token | log ที่เก็บไว้ ส่งต่อ หรือแคปภาพหน้าจอ คือช่องทางรั่วที่พบบ่อยที่สุด |
| **สิทธิ์น้อยที่สุด + rotate ได้** — สร้าง token เฉพาะงาน ไม่ใช่ Global API Key | ถ้ารั่ว ความเสียหายจำกัดอยู่แค่สิทธิ์ที่ตั้งไว้ และเพิกถอนได้ทันทีจาก dashboard |

ถ้าสงสัยว่า token รั่ว (เช่น เผลอ commit หรือแปะในแชท) — **เพิกถอนทันทีแล้วสร้างใหม่** ไม่ต้องรอดูก่อน

## ข้อควรระวังและบทเรียน

- **deploy สำเร็จ ≠ งานเสร็จ** — agent เปิดลิงก์ให้ดู แต่เราควรเปิดเองจากอุปกรณ์จริง กดเมนู ค้นหา และลองฟอร์ม อย่างน้อยหนึ่งรอบ
- **ยอมรับว่าบางอย่างยังไม่ได้ตรวจ** — agent ระบุเองว่าฟอร์มบนโดเมนใหม่ยังไม่ได้ทดสอบส่งจริง การที่ AI รู้ขอบเขตของตัวเองเป็นสัญญาณที่ดี หน้าที่เราคือปิดช่องนั้นต่อ
- **ให้ agent อ่านค่าจาก `.env` ดีกว่าวาง token ใน prompt** — prompt เป็นข้อความที่ถูกเก็บ ส่งต่อ และสอนกันได้ อย่าวาง credential ในนั้นเด็ดขาด

ต่อไป: [บท 08 — ผูก custom domain lay-pai-gun.rawinlab.com](08-custom-domain.md)
