ตั้งเวลาให้แอปทำงานอัตโนมัติด้วยงานตามเวลา (cron) บน BrewInTH

ส่งอีเมลสรุปทุกเช้า ลบไฟล์ทุกคืน ด้วยแท็บงานตามเวลา ทำไมไม่ใส่ตัวตั้งเวลาในแอป วิธีตั้งเวลาเริ่ม และงานที่ AI สร้างหยุดเมื่อ token หมดอายุ
เว็บที่ใช้งานจริงมักมีงานที่ต้องทำซ้ำ ๆ โดยไม่มีใครกด เช่น ส่งอีเมลสรุปยอดขายทุกเช้า ลบไฟล์ชั่วคราวทุกคืน ดึงราคาหรืออัตราแลกเปลี่ยนใหม่ทุกชั่วโมง หรือแจ้งเตือนลูกค้าก่อนถึงวันนัด ถ้าให้ AI ใส่ตัวตั้งเวลาไว้ในแอป บางทีงานก็ไม่ทำงานเลย เพราะแอปพักอยู่หรือเพิ่งเผยแพร่ใหม่
บทความนี้สอนใช้ งานตามเวลา (cron) ของ BrewInTH ให้แอปทำงานเองตามรอบเวลา ตั้งแต่ให้ AI เขียนสคริปต์ ทดสอบ ตั้งความถี่ ไปจนถึงข้อควรรู้ที่ทำให้งานไม่หยุดเงียบ ๆ
สรุปสั้นก่อนอ่าน
✅ แท็บ งานตามเวลา ของโปรเจกต์แบบแอป ตั้งคำสั่งให้รันทุก 5 นาที ถึงทุกสัปดาห์ ได้สูงสุด 10 งาน
✅ แต่ละรอบรันในกล่องแยกจาก image ของเวอร์ชันที่เผยแพร่อยู่ มีค่าตั้งแอปครบ รันได้นานสุด 4 ชั่วโมง
✅ งานยังรันแม้แอปพักอยู่บนแพ็กเกจฟรี ต่างจากตัวตั้งเวลาที่อยู่ในแอป
✅ รอบเวลานับจากตอนสร้างงาน อยากให้รันตอนตี 3 ให้กด รันเลย ตอนตี 3
✅ งานที่ AI สร้างด้วย token จะหยุดเมื่อ token หมดอายุ งานประจำควรสร้างเองในคอนโซล
งานตามเวลาคืออะไร ใช้ทำอะไรได้
งานตามเวลา (หรือ cron) คือคำสั่งที่ระบบรันให้ซ้ำตามรอบ โดยไม่ต้องมีคนเข้าเว็บ ตัวอย่างที่ใช้บ่อย
- ส่งอีเมลสรุปออเดอร์หรือการจองของเมื่อวานให้เจ้าของร้านทุกเช้า
- ส่งข้อความเตือนลูกค้าก่อนถึงวันนัด
- ลบไฟล์ชั่วคราวหรือ session เก่าทุกคืน
- ดึงข้อมูลจากภายนอก เช่น ราคา อัตราแลกเปลี่ยน หรือสต็อกจากระบบอื่นทุกชั่วโมง
- ประมวลผลงานที่ค้างในคิว เช่น ย่อรูปที่ผู้ใช้อัปโหลด
งานตามเวลามีเฉพาะโปรเจกต์แบบแอป (Node, Python, PHP, Laravel, Go, Java, .NET, Ruby, Bun) เว็บ static ไม่มีโปรแกรมฝั่งเซิร์ฟเวอร์จึงไม่มีแท็บนี้
ทำไมไม่ใส่ตัวตั้งเวลาไว้ในแอปเลย
AI หลายตัวชอบใช้ไลบรารีตั้งเวลาในแอป เช่น node-cron หรือ APScheduler วิธีนี้มีปัญหาบนโฮสติ้งจริง
- แอปบนแพ็กเกจฟรีพักเมื่อไม่มีคนเข้า ตอนพัก ตัวตั้งเวลาในแอปก็หยุดด้วย งานตอนกลางคืนจึงไม่เคยเกิด
- ทุกครั้งที่เผยแพร่เวอร์ชันใหม่ แอปเริ่มใหม่ ตัวนับเวลาเริ่มนับใหม่
- แอปตอบคนเข้าเว็บกับทำงานหนักพร้อมกัน ทำให้เว็บช้าตอนงานรัน
งานตามเวลาของ BrewInTH รันแยกจากแอปที่ตอบผู้เข้าชม จึงไม่มีปัญหาทั้งสามข้อ

ตั้งงานตามเวลาทีละขั้น
1. ให้ AI เขียนงานเป็นสคริปต์ที่รันจบในตัว
งานตามเวลาคือ "คำสั่ง" ที่รันแล้วจบ ไม่ใช่โปรแกรมที่เปิดค้างไว้ บอก AI แบบนี้
ร้านฉันอยากได้อีเมลสรุปการจองของเมื่อวาน ส่งถึง owner@myshop.com ทุกเช้า
- เขียนเป็นสคริปต์แยก scripts/daily-summary.js ที่รันแล้วจบเอง (exit 0 เมื่อสำเร็จ, exit 1 เมื่อพลาด)
- ใช้ฐานข้อมูลและค่า MAIL_* จาก environment variable เดียวกับแอป
- พิมพ์บรรทัดสรุปสั้น ๆ ว่าส่งกี่รายการ ห้ามพิมพ์รหัสผ่านหรือข้อมูลลูกค้าเต็ม ๆ
- รันซ้ำในวันเดียวกันต้องไม่ส่งอีเมลซ้ำ (จำวันที่ส่งล่าสุดไว้ในฐานข้อมูล)
- ห้ามใช้ node-cron หรือตัวตั้งเวลาในแอป ฉันจะตั้งรอบเวลาใน BrewInTH เอง
เสร็จแล้วเผยแพร่ใหม่ และทดสอบสคริปต์ด้วยคำสั่ง sandbox หนึ่งครั้ง
ข้อ "รันซ้ำแล้วไม่ทำซ้ำ" สำคัญ เพราะถ้ากด รันเลย เพื่อทดสอบ หรือรอบไหนรันซ้ำ ลูกค้าจะไม่ได้อีเมลสองฉบับ
2. เพิ่มงานในแท็บงานตามเวลา
เปิดโปรเจกต์ ไปที่แท็บ งานตามเวลา ในส่วน งานตามเวลา (cron) กรอก
- ชื่องาน เช่น
daily-summary - คำสั่ง เช่น
node scripts/daily-summary.js(Python:python scripts/daily_summary.py, PHP:php scripts/daily-summary.php) - ความถี่ เลือกได้ ทุก 5 นาที, ทุก 15 นาที, ทุก 30 นาที, ทุกชั่วโมง, ทุก 6 ชั่วโมง, ทุกวัน หรือทุกสัปดาห์
- เวลาสูงสุดต่อครั้ง (วินาที) ค่าเริ่มต้น 120 ตั้งได้ถึง 14,400 (4 ชั่วโมง) งานที่เกินเวลาจะถูกหยุด
แล้วกด เพิ่มงาน

3. กดรันเลยเพื่อทดสอบ และตั้งเวลาเริ่ม
รอบเวลา นับจากตอนสร้างงาน เช่น สร้างงาน "ทุกวัน" ตอน 14:20 งานจะรันครั้งแรกพรุ่งนี้ 14:20 และทุกวันเวลาประมาณนั้น
ปุ่ม รันเลย ใช้ได้สองอย่าง
- ทดสอบทันที ดูผลในคอลัมน์ ครั้งล่าสุด ว่าสำเร็จหรือมีข้อความ error
- เลื่อนเวลาประจำ การกดรันเลยจะนับรอบถัดไปจากตอนนั้น ถ้าอยากให้งานรายวันรันตอนเช้าตรู่ ให้กด รันเลย ตอนเวลานั้นหนึ่งครั้ง
ถ้าต้องการเวลาแม่นยำกว่านี้ ให้ตั้งงานทุก 5 หรือ 15 นาที แล้วให้สคริปต์เช็กเองว่าถึงเวลาตามเวลาไทยหรือยัง และส่งแล้ววันนี้หรือยัง
4. ดูแลงานที่ตั้งไว้
ในตารางของแต่ละงานมี รันครั้งถัดไป และ ครั้งล่าสุด พร้อมสถานะ ปุ่ม พัก ใช้หยุดชั่วคราวโดยไม่ลบ ปุ่ม ลบ ลบงานทิ้ง ถ้าเห็นคำว่า ค้าง แปลว่าถึงเวลาแล้วแต่ยังไม่ได้รัน เช่น โปรเจกต์ยังไม่มีเวอร์ชันที่เผยแพร่สำเร็จ
สิ่งที่ควรรู้ก่อนพึ่งงานตามเวลา

- งานที่ AI สร้างผ่าน token หยุดเมื่อ token หมดอายุหรือถูกยกเลิก token จากปุ่มสร้างลิงก์อัตโนมัติมีอายุ 24 ชั่วโมง งานที่ AI ตั้งให้จึงหยุดในวันถัดไป งานประจำให้สร้างเองในแท็บ งานตามเวลา (ให้ AI เขียนและทดสอบสคริปต์ แล้วคุณเพิ่มงานเอง) ถ้า AI สร้างไว้แล้ว ให้ลบแล้วสร้างใหม่ในคอนโซล
- งานรันจากเวอร์ชันที่เผยแพร่อยู่ แก้สคริปต์แล้วต้องเผยแพร่ใหม่ก่อน งานรอบถัดไปจึงใช้โค้ดใหม่
- ไฟล์ที่ต้องเก็บไว้ต้องอยู่ใน /data แต่ละรอบรันในกล่องใหม่ ไฟล์ที่เขียนที่อื่นหายเมื่อรอบจบ ข้อมูลควรเก็บในฐานข้อมูล หรือเปิด พื้นที่เก็บไฟล์ถาวร (/data) ในแท็บ ตั้งค่าแอป
- โปรเจกต์ที่หยุดชั่วคราวไม่รันงาน ส่วนแอปที่พักอัตโนมัติยังรันงานได้ตามปกติ
- แรงเครื่องเท่าแอปของแพ็กเกจ งานหนัก ๆ ควรทำทีละชุดเล็ก ๆ
ตัวอย่างคำสั่งตามเทคโนโลยี
- Node.js:
node scripts/cleanup.js - Python / Django:
python manage.py clearsessions - PHP:
php scripts/cleanup.php - Laravel:
php artisan queue:work --stop-when-emptyทุก 5 นาทีสำหรับงานในคิว หรือใช้php artisan schedule:runทุก 5 นาที แล้วในโค้ดกำหนดงานที่ไม่ถี่กว่า 5 นาที - Ruby:
bundle exec rake cleanup
ดูวิดีโอประกอบ
▶ ตัวอย่างตั้งแต่สร้างโปรเจกต์จนเปิดเว็บ (1:30 นาที)
ดูบน YouTube
คำถามที่พบบ่อย
ตั้งให้รันทุกนาทีได้ไหม
ไม่ได้ ถี่สุดคือทุก 5 นาที ถ้างานต้องตอบทันที ให้ทำในแอปตอนมีคำขอเข้ามาแทน
ตั้งได้กี่งาน
โปรเจกต์ละไม่เกิน 10 งาน ถ้ามีงานเล็กหลายอย่างในรอบเดียวกัน รวมเป็นสคริปต์เดียวได้
งานตามเวลากินโควตาไหม
งานรันด้วย CPU และ RAM เท่าแอปของแพ็กเกจ ข้อมูลที่ส่งผ่านเว็บยังนับ bandwidth ตามปกติ ส่วนไฟล์ที่งานเขียนลง /data นับรวมพื้นที่ไฟล์ของแพ็กเกจ
งานล้ม จะรู้ได้ยังไง
ดูสถานะและข้อความ error ในคอลัมน์ ครั้งล่าสุด ถ้าเป็นงานสำคัญ ให้ AI ทำให้สคริปต์ส่งอีเมลหรือข้อความแจ้งคุณเองเมื่อพลาด
เว็บ static ทำงานตามเวลาได้ไหม
ไม่ได้ เว็บ static ไม่มีโปรแกรมฝั่งเซิร์ฟเวอร์ ถ้าต้องการงานตามเวลา ต้องทำเว็บเป็นแอป เช่น Node หรือ Python
สรุป
งานที่ต้องเกิดซ้ำ ให้ AI เขียนเป็นสคริปต์ที่รันแล้วจบและรันซ้ำได้ไม่พัง ทดสอบด้วยคำสั่ง sandbox แล้วเพิ่มเองในแท็บ งานตามเวลา เลือกความถี่ แล้วกด รันเลย ตอนเวลาที่อยากให้เป็นเวลาประจำ งานจะเดินต่อแม้แอปพักหรือเผยแพร่เวอร์ชันใหม่
