BotKit
บทความ › เขียนโค้ด & ดูแลระบบ

รันบอทบน Render แผนฟรี: หลับหลัง 15 นาที ดิสก์หาย และวิธีอยู่ร่วมกับมัน

Render เป็นที่ฝากเว็บและบอทที่นิยมเพราะมีแผนฟรี ต่อกับ GitHub แล้ว push โค้ดก็ deploy ให้เอง ผมใช้รันบอทและระบบดักงานมาหลายเดือน แผนฟรีใช้ได้จริง แต่มีพฤติกรรมที่ต้องรู้ก่อน ไม่อย่างนั้นบอทจะ "ตอบบ้างไม่ตอบบ้าง" แบบหาสาเหตุไม่เจอ

⚠️ ตัวเลขข้างล่างมาจากเอกสารของ Render ณ ตอนเขียน เงื่อนไขแผนฟรีเปลี่ยนได้ ตรวจหน้า Free ของเอกสาร Render อีกครั้ง

1. หลับเมื่อไม่มีคนใช้ 15 นาที

web service แผนฟรีจะหยุดทำงานเมื่อไม่มี request เข้ามา 15 นาที request ถัดไปจะปลุกให้ตื่น ซึ่งใช้เวลาประมาณหนึ่งนาที

สำหรับเว็บทั่วไป แค่โหลดช้าครั้งแรก แต่สำหรับบอทนี่คือปัญหาใหญ่ เพราะ LINE และ Facebook ไม่รอนานขนาดนั้น webhook ที่ส่งมาตอนเซิร์ฟเวอร์หลับอาจหมดเวลา และข้อความแรกของลูกค้าหายไป ยิ่งถ้าตรงกับตอนที่ reviewer ของแพลตฟอร์มกำลังทดสอบแอป ก็โดนตีกลับได้เลย

ทางแก้: ให้มีคนเรียกอยู่เรื่อยๆ

ผมใช้บริการตั้งเวลาฟรีอย่าง cron-job.org เรียก endpoint ของเซิร์ฟเวอร์ทุก 10–14 นาที งานตามรอบที่ต้องทำอยู่แล้ว (เช่น ดึงงานใหม่ทุก 30 นาที) ก็ช่วยปลุกไปในตัว

ข้อควรรู้: มีชั่วโมงฟรี 750 ชั่วโมงต่อเดือนต่อ workspace ช่วงที่หลับไม่นับ ถ้าปลุกให้ตื่นตลอด service เดียวใช้ประมาณ 720–744 ชั่วโมงต่อเดือน พอดีกับโควตา แต่ถ้ามีหลาย service แผนฟรีใน workspace เดียวแล้วปลุกทุกตัวตลอดเวลา ชั่วโมงจะหมดกลางเดือน และ service แผนฟรีทั้งหมดจะถูกระงับถึงเดือนถัดไป บอทที่มีลูกค้าจ่ายเงินจริงควรอยู่บนแผนเสียเงิน

2. ไฟล์ที่เขียนลงเครื่องหายได้ตลอด

ดิสก์ของแผนฟรีเป็นแบบชั่วคราว ไฟล์ที่เขียนระหว่างทำงานหายเมื่อ deploy ใหม่ รีสตาร์ต หรือหลับ และแผนฟรีต่อดิสก์ถาวรไม่ได้ ข้อมูลที่ต้องอยู่ต่อ (การจอง ออเดอร์ รายการที่แจ้งเตือนไปแล้ว) ต้องเก็บในฐานข้อมูลภายนอก เช่น Postgres หรือ Supabase (ดูเคสที่เจอใน บอทแจ้งเตือนซ้ำหลังรีสตาร์ต)

Render ยังบอกไว้ด้วยว่าอาจรีสตาร์ต service แผนฟรีเมื่อไหร่ก็ได้ ตัวแปรในหน่วยความจำจึงหายได้ทุกเมื่อเหมือนกัน

3. ให้ cron รู้ว่าระบบพัง

ถ้า endpoint ที่ cron เรียกตอบ 200 ทุกครั้งแม้งานข้างในล้มเหลว cron จะไม่เตือนอะไรเลย ให้ endpoint ตอบ 5xx เมื่องานล้มเหลวหรือถูกปิดอยู่ แล้วเปิดการแจ้งเตือนทางอีเมลของ cron (รายละเอียดใน ออกแบบให้ของพังแล้วส่งเสียง)

4. ตั้งค่าและ secret อยู่ใน Environment

  • API key, token, รหัสต่างๆ ใส่ในหน้า Environment ของ service ไม่ใช่ในโค้ด
  • แก้ค่าแล้ว Render จะ deploy ใหม่ ช่วงนั้นบอทหยุดตอบสั้นๆ
  • ใช้ตัวแปรเป็นสวิตช์เปิด-ปิดฟีเจอร์ได้ เช่น ตั้งค่าว่างให้ฟีเจอร์นั้นปิด ทำให้ย้อนกลับได้โดยไม่ต้องแก้โค้ด

5. push = deploy จริงทันที

ถ้าตั้ง auto-deploy จาก branch หลัก ทุกครั้งที่ push คือขึ้นเว็บจริง ถ้าเซิร์ฟเวอร์ตัวเดียวรันทั้งเว็บและบอทของลูกค้า โค้ดที่พังนิดเดียวทำให้บอทลูกค้าหยุดด้วย สิ่งที่ผมทำ

  • ทดสอบบนเครื่องก่อน push ทุกครั้ง อย่างน้อยให้เซิร์ฟเวอร์เปิดได้และหน้าหลักตอบ 200
  • ทำงานใหญ่ใน branch แยก แล้วค่อยรวมเข้า branch หลัก
  • หลัง deploy เปิดเช็คหน้าเว็บจริงและทดสอบทักบอทหนึ่งครั้ง
  • ร้านที่ต้องการความเสถียรสูง แยก service ของร้านนั้นออกจากฟีเจอร์ทดลอง

สรุป

เรื่องผลกระทบทางแก้
หลับหลัง 15 นาทีwebhook ข้อความแรกหายcron ปลุกทุก 10–14 นาที (ระวังชั่วโมงฟรี)
ดิสก์ชั่วคราวไฟล์และ state หายฐานข้อมูลภายนอก
รีสตาร์ตได้ทุกเมื่อตัวแปรในแรมหายเก็บ state ใน DB
push = deployโค้ดพังกระทบลูกค้าทดสอบก่อน, branch แยก, เช็คหลัง deploy
เกี่ยวกับผู้เขียน — Jark นักพัฒนา LINE Bot และระบบ AI อัตโนมัติ อยู่เชียงใหม่ ทำระบบตอบแชทและจองคิวให้ร้านค้าจริง บทความในเว็บนี้มาจากงานที่ลงมือทำเอง อ่านเพิ่ม