งูการ์ตูนสีเขียวปีนบันไดเปลี่ยนป้ายบอกทางในห้างสรรพสินค้า ป้ายลูกศรชี้ร้านต่าง ๆ เรียงบนเสาป้ายสีเขียว และป้ายเก่าหนึ่งแผ่นถูกทิ้งลงถังรีไซเคิล

FastAPI ออก 3 รุ่นติด: ค่าเก่าถูกถอด ย้าย root_path ไปตั้งที่เซิร์ฟเวอร์

น้องกายEngineering

FastAPI มีรุ่น 0.144.0, 0.145.0 และ 0.146.0 ออกในวันที่ 18 ตุลาคม 2026 วันเดียวกัน โดยรุ่นกลางถอดตัวเลือกเก่าออก ส่วนรุ่นล่าสุดประกาศเลิกแนะนำการตั้งค่าบางอย่างในตัวแอปแล้ว (FastAPI Release Notes) สำหรับคนที่ดูแลเว็บให้ร้านหรือองค์กร เรื่องนี้ควรเข้ารายการตรวจสอบก่อนอัปเดต เพราะงานที่เคยเปิดได้อาจต้องแก้การตั้งค่าก่อนนำรุ่นใหม่ขึ้นใช้งาน

จุดที่ต้องแยกให้ออกคือ “ถูกถอดแล้ว” กับ “ประกาศให้เตรียมย้าย” รุ่น 0.145.0 ถอดตัวเลือกเก่าที่ใช้ตอนสร้างแอป ขณะที่ 0.146.0 ให้ย้ายการกำหนดตำแหน่งแอปหลังระบบรับส่งเว็บไปไว้ที่เซิร์ฟเวอร์ หรือโปรแกรมที่เปิดแอปรับงานแทน (GitHub: 0.145.0, GitHub: 0.146.0) ผมแนะนำให้ทีมตรวจทั้งสองเรื่องในรอบเดียว โดยเฉพาะคนที่ปล่อยให้ระบบติดตั้งรุ่นใหม่และนำขึ้นใช้เอง

สรุป 30 วินาที: เกิดอะไรขึ้น

  • 0.144.0 เพิ่มความสามารถด้านความปลอดภัยให้ WebSocket ซึ่งเป็นการเชื่อมต่อที่เปิดค้างไว้ให้แอปกับผู้ใช้ส่งข้อมูลหากันได้ โดยชุดตัวช่วยตรวจสิทธิ์ของ FastAPI รองรับการเชื่อมต่อแบบนี้เพิ่มเข้ามา งานเปลี่ยนแปลงหมายเลข #10147 เป็นที่มาของฟีเจอร์นี้ (GitHub: 0.144.0)
  • 0.145.0 ถอดตัวเลือกเก่าตอนสร้างแอป ได้แก่ตัวเลือกเดิมสำหรับคำนำหน้าที่อยู่เอกสาร และช่องรับค่าเพิ่มเติมที่ไม่ได้ใช้งาน เป็นการเปลี่ยนแปลงที่ทำให้โค้ดเก่าเข้ากันไม่ได้ ตามงานหมายเลข #16518 (GitHub: 0.145.0)
  • 0.146.0 ประกาศเลิกแนะนำการกำหนดตำแหน่งรากผ่านตัวแอป และแนะนำให้กำหนดผ่านเซิร์ฟเวอร์แทน ตามงานหมายเลข #16520 เหตุผลในคู่มือคือพฤติกรรมของการตั้งผ่านแอปไม่สอดคล้องกับการตั้งผ่านเซิร์ฟเวอร์ (GitHub: 0.146.0, FastAPI: Behind a Proxy)

เวลาประกาศบน GitHub เมื่อแปลงเป็นเวลาไทยแล้ว รุ่น 0.144.0 ออกเวลา 19:42:34 น. รุ่น 0.145.0 เวลา 21:40:20 น. และรุ่น 0.146.0 เวลา 22:18:08 น. ทั้งหมดเป็นวันที่ 18 ตุลาคม 2026 (GitHub: 0.144.0, GitHub: 0.145.0, GitHub: 0.146.0) จึงควรอ่านบันทึกทุกรุ่นที่ข้าม ไม่ใช่เปิดดูเฉพาะรุ่นปลายทาง

ทำไมเรื่องนี้เกี่ยวกับคุณ

สำหรับเจ้าของกิจการหรือคนทำงานที่ใช้เว็บภายใน ข่าวนี้เกี่ยวกับความต่อเนื่องของงานมากกว่าการได้ปุ่มใหม่ ผมเสนอให้ถามผู้ดูแลว่าเว็บที่ใช้อยู่สร้างด้วย FastAPI หรือไม่ และกำลังจะเปลี่ยนรุ่นหรือเปล่า เพราะประกาศรุ่น 0.145.0 ระบุชัดว่ามีการถอดของเก่าที่เคยประกาศเลิกใช้แล้ว (GitHub: 0.145.0) การตรวจล่วงหน้าเป็นงานที่กำหนดเวลาได้ ส่วนการรอให้ผู้ใช้แจ้งว่าเปิดงานไม่ได้มักจัดตารางยากกว่า

สำหรับทีมพัฒนา กลุ่มที่ผมให้ตรวจเป็นลำดับต้นคือทีมที่ระบุรุ่นขั้นต่ำอย่างเดียว ไม่กำหนดเพดาน และให้กระบวนการติดตั้งกับนำขึ้นใช้ทำงานอัตโนมัติ นี่เป็นการประเมินความเสี่ยงจากการที่มีการถอดตัวเลือกในรุ่นใหม่ ไม่ใช่รายงานว่าทีมลักษณะนี้เกิดเหตุแล้ว เพราะแหล่งข่าวให้รายละเอียดการเปลี่ยนแปลง แต่ไม่ได้ให้จำนวนระบบที่เสียหาย (GitHub: 0.145.0)

อีกกลุ่มคือทีมที่วางแอปไว้หลัง reverse proxy หรือโปรแกรมด้านหน้าที่รับการเชื่อมต่อแล้วส่งต่อให้แอป คู่มือยกตัวอย่าง Nginx และ Traefik และระบุว่าโปรแกรมด้านหน้านี้อาจดูแลใบรับรอง HTTPS ซึ่งใช้กับการเชื่อมต่อเว็บแบบเข้ารหัสด้วย (FastAPI: Behind a Proxy) ถ้าธุรกิจในไทยใช้การจัดวางแบบนี้ ก็ควรให้ผู้ดูแลตรวจการตั้งค่าก่อนเปลี่ยนรุ่น โดยยังไม่มีข้อมูลในแหล่งข่าวว่ามีองค์กรไทยได้รับผลกระทบแล้วหรือไม่

นักเรียนหรือคนที่ทำโครงการส่วนตัวก็ใช้ข่าวนี้ทบทวนวิธีส่งงานได้ครับ ผมแนะนำให้จดรุ่นที่ทดสอบผ่านไว้พร้อมวิธีเปิดแอป การแยกเรื่องรุ่นซอฟต์แวร์กับการตั้งค่าตอนเปิดใช้งานจะช่วยให้ตรวจได้ว่ากำลังเปลี่ยนอะไร เมื่อประกาศล่าสุดให้ย้ายการตั้งค่าจากแอปไปไว้ที่เซิร์ฟเวอร์โดยตรง (GitHub: 0.146.0)

ทำงานยังไง

ประเด็นหลักคือ “ตำแหน่งราก” ของแอป หมายถึงส่วนต้นของที่อยู่เว็บที่บอกว่าแอปอยู่ใต้พื้นที่ไหน คู่มืออธิบายกรณีที่พร็อกซีรับที่อยู่ซึ่งมีส่วนต้นเพิ่มมา แล้วตัดส่วนนั้นออกก่อนส่งต่อให้แอป วิธีนี้ทำให้โค้ดภายในไม่ต้องใส่ส่วนต้นซ้ำทุกจุด แต่หน้าที่เปิดในเบราว์เซอร์ยังต้องรู้ตำแหน่งภายนอกที่ถูกต้อง (FastAPI: Behind a Proxy)

นึกถึง ป้ายบอกชั้นในห้าง ครับ ร้านรู้ว่าประตูร้านอยู่ตรงไหน แต่คนที่เดินเข้าห้างต้องรู้ด้วยว่าร้านอยู่ชั้นอะไร การเปลี่ยนครั้งนี้เหมือนย้ายจากให้ร้านติดป้ายเอง ไปให้ตึกเป็นคนติดป้ายรวม เมื่อเทียบกลับมาที่แอป คู่มือให้เซิร์ฟเวอร์เป็นผู้ส่งข้อมูลตำแหน่งราก แทนการตั้งไว้ตอนสร้างตัวแอป เพราะวิธีเก่ามีพฤติกรรมไม่สอดคล้องกับการตั้งที่เซิร์ฟเวอร์ (FastAPI: Behind a Proxy)

ผลที่เห็นได้ชัดอยู่ที่หน้าเอกสารโต้ตอบ หรือ docs UI ซึ่งเป็นหน้าสำหรับดูและทดลองติดต่อบริการของแอป หน้านี้ต้องโหลด OpenAPI schema หรือเอกสารโครงสร้างที่บอกว่าบริการมีอะไรให้เรียกใช้ หากมันไม่รู้ส่วนต้นของที่อยู่ภายนอก ก็อาจไปโหลดเอกสารผิดตำแหน่งและแสดงงานได้ไม่ครบตามตัวอย่างในคู่มือ (FastAPI: Behind a Proxy)

ดังนั้น การที่แอปยังตอบข้อมูลบางอย่างได้ ไม่ได้ยืนยันว่าหน้าเอกสารจะทำงานครบ คู่มือแสดงกรณีที่การรับส่งข้อมูลปกติยังทำงาน แต่หน้าเอกสารต้องมีข้อมูลตำแหน่งรากจึงจะโหลดเอกสารโครงสร้างได้ถูกต้อง และเมื่อกำหนดให้เข้าผ่านพร็อกซีแล้ว การเปิดหน้าเอกสารตรงจากเซิร์ฟเวอร์โดยข้ามพร็อกซีอาจไม่ทำงานตามที่คาด (FastAPI: Behind a Proxy)

ยังมีรายละเอียดที่ทีมต้องแยกอีกอย่าง คือพร็อกซีไม่ได้ตัดส่วนต้นของที่อยู่ทุกการติดตั้ง คู่มือระบุว่าการส่งต่อโดยเก็บที่อยู่เดิมไว้ก็เป็นอีกแบบหนึ่ง จึงควรตรวจรูปแบบที่ระบบตัวเองใช้ก่อนย้ายค่า ไม่ควรทำตามตัวอย่างโดยยังไม่รู้ว่าเส้นทางผ่านโปรแกรมด้านหน้าถูกจัดไว้อย่างไร (FastAPI: Behind a Proxy)

จุดหักมุม: รุ่นล่าสุดยังให้ย้าย แต่รุ่นก่อนหน้าถอดแล้ว

คำว่า deprecated คือประกาศว่าเลิกแนะนำให้ใช้ และควรเตรียมเปลี่ยนไปใช้วิธีที่ระบุ ส่วน removed คือถูกถอดออกแล้ว สำหรับข่าวนี้ รุ่น 0.146.0 ใช้คำแรกกับการตั้งตำแหน่งรากผ่านตัวแอป ขณะที่รุ่น 0.145.0 ใช้คำหลังกับตัวเลือกคำนำหน้าเอกสารเก่าและช่องรับค่าเพิ่มเติม (GitHub: 0.146.0, GitHub: 0.145.0)

การอ่านเฉพาะข้อความ “ให้เตรียมย้าย” ของรุ่นล่าสุดจึงอาจทำให้ประเมินงานไม่ครบ ถ้าโค้ดยังส่งตัวเลือกที่รุ่นก่อนหน้าถอดไปแล้ว ทีมต้องจัดการความเข้ากันได้ส่วนนั้นด้วย ผมแนะนำให้แบ่งรายการแก้เป็นสองช่อง คือของที่ถูกถอดและต้องแก้ก่อนผ่านการทดสอบ กับของที่ประกาศเลิกแนะนำและต้องวางแผนย้าย ตามความต่างในประกาศทั้งสองรุ่น (GitHub: 0.145.0, GitHub: 0.146.0)

อีกจุดที่ชวนสับสนคือ GitHub จัดประกาศเลิกแนะนำของรุ่น 0.146.0 ไว้ใต้หัวข้อ Breaking Changes เช่นเดียวกับการถอดของในรุ่น 0.145.0 จึงต้องอ่านกริยาของแต่ละรายการด้วย หัวข้อหมวดเดียวกันไม่ได้บอกว่าทุกอย่างถูกถอดพร้อมกัน (GitHub: 0.146.0, GitHub: 0.145.0)

เรื่องเงิน / ผลกระทบ

แหล่งข่าวชุดนี้ไม่มีตัวเลขความเสียหาย ค่าใช้จ่ายในการย้าย หรือเวลาที่แต่ละทีมต้องใช้ จึงยังคำนวณเป็นงบประมาณให้ไม่ได้ สิ่งที่ยืนยันได้คือมีการถอดตัวเลือกเก่า และมีการเปลี่ยนคำแนะนำเรื่องจุดที่ควรตั้งค่าตำแหน่งราก (GitHub: 0.145.0, GitHub: 0.146.0)

ในมุมวางแผนงาน ผมเสนอให้เผื่อเวลาสำหรับตรวจโค้ด ตรวจการเปิดเซิร์ฟเวอร์ และทดสอบผ่านพร็อกซี แทนการนับแค่เวลาติดตั้งรุ่นใหม่ เหตุผลคือคู่มือแยกให้เห็นว่าการเปิดตรงถึงแอปกับการเปิดผ่านที่อยู่ภายนอกอาจให้ผลกับหน้าเอกสารต่างกัน (FastAPI: Behind a Proxy) ถ้าต้องจ้างผู้ดูแล ควรขอผลตรวจที่บอกได้ว่าทดสอบผ่านทางไหนและด้วยรุ่นอะไร โดยไม่ต้องเดาราคาจากข่าวนี้

ส่วนฟีเจอร์ WebSocket ในรุ่น 0.144.0 เป็นความสามารถใหม่ของตัวช่วยด้านความปลอดภัยตามประกาศ แต่แหล่งข่าวไม่ได้ให้ตัวเลขว่าลดค่าใช้จ่ายหรือประหยัดเวลาพัฒนาเท่าไร (GitHub: 0.144.0) ทีมที่สนใจจึงควรประเมินจากงานของตัวเอง และแยกการทดลองฟีเจอร์ออกจากเงื่อนไขที่ต้องผ่านก่อนอัปเกรด

ข้อมูลที่ยังไม่ชัด และจุดที่แหล่งข่าวพูดไม่ตรงกัน

วันที่ของสามรุ่นตรงกันระหว่างหน้ารวม release notes กับหน้าประกาศบน GitHub โดยหน้ารวมให้วันที่ ส่วน GitHub ให้เวลาที่แปลงเป็นเวลาไทยได้ด้วย จึงไม่มีข้อขัดแย้งเรื่องวันออกของสามรุ่นนี้ในข้อมูลที่ได้รับ (FastAPI Release Notes, GitHub: 0.146.0, GitHub: 0.145.0, GitHub: 0.144.0)

อย่างไรก็ตาม หน้ารวมยังมีรุ่น 0.143.5 ในวันที่ 18 ตุลาคมด้วย ดังนั้นสามรุ่นที่บทความนี้หยิบมาอธิบายไม่ใช่จำนวนรุ่นทั้งหมดที่หน้ารวมระบุในวันนั้น (FastAPI Release Notes) จุดนี้ควรแยกให้ชัด เพื่อไม่ให้คำว่า “ออกสามรุ่น” กลายเป็นการอ้างว่าทั้งวันมีเพียงสามรายการ

รายละเอียดของสองการเปลี่ยนแปลงหลักไปในทิศทางเดียวกัน คู่มือบอกว่ารุ่น 0.145.0 และก่อนหน้ายังตั้งตำแหน่งรากผ่านตัวแอปได้ ส่วนประกาศ 0.146.0 บอกว่าตัวเลือกนี้ถูกประกาศเลิกแนะนำแล้ว ไม่ได้ระบุว่ากลไกตำแหน่งรากทั้งหมดถูกยกเลิก (FastAPI: Behind a Proxy, GitHub: 0.146.0)

สิ่งที่ยังไม่ทราบคือจะถอดตัวเลือกที่เพิ่งประกาศเลิกแนะนำเมื่อไร มีระบบจริงได้รับผลกระทบกี่แห่ง และมีองค์กรไทยเกี่ยวข้องหรือไม่ ประกาศกับคู่มือที่ให้มาไม่ได้ระบุข้อมูลเหล่านี้ จึงไม่ควรใส่เส้นตายหรือจำนวนผู้เสียหายขึ้นเอง (GitHub: 0.146.0, FastAPI: Behind a Proxy)

แล้วเราควรทำอะไร

เจ้าของกิจการและผู้รับผิดชอบงานที่ใช้เว็บ

  1. ให้ผู้ดูแลยืนยันว่าระบบใช้ FastAPI หรือไม่ และรุ่นที่ใช้งานจริงคืออะไร ผมแนะนำให้ขอหลักฐานจากการติดตั้งจริง เพื่อเทียบกับรุ่นที่มีการเปลี่ยนแปลงในประกาศ (FastAPI Release Notes)
  2. ถ้ากำลังจะอัปเดต ให้ขอรายการตรวจความเข้ากันได้ของตัวเลือกที่ถูกถอดในรุ่น 0.145.0 พร้อมผลทดสอบก่อนเปิดให้ผู้ใช้ทำงาน (GitHub: 0.145.0)
  3. หากมีพร็อกซีอยู่ด้านหน้า ให้ขอผลทดสอบจากที่อยู่ที่ผู้ใช้เข้าจริงด้วย เพราะคู่มือแสดงว่าหน้าเอกสารที่เข้าตรงกับหน้าที่เข้าผ่านพร็อกซีอาจทำงานต่างกัน (FastAPI: Behind a Proxy)

นักพัฒนาและผู้ดูแลระบบ

  1. ผมแนะนำให้ตรึงรุ่นที่ผ่านการทดสอบไว้ก่อน หรือกำหนดขอบเขตรุ่นที่อนุญาตให้ติดตั้งอย่างชัดเจน แล้วอ่านบันทึกของทุกรุ่นที่กำลังข้าม โดยใช้การถอดตัวเลือกใน 0.145.0 เป็นรายการตรวจที่ต้องผ่าน (GitHub: 0.145.0)
  2. ค้นในส่วนสร้างแอปและส่วนตั้งค่าที่ใช้ร่วมกันว่ามีตัวเลือกคำนำหน้าเอกสารเก่าหรือช่องส่งค่าเพิ่มเติมที่ถูกถอดหรือไม่ แก้ให้สอดคล้องกับรุ่นเป้าหมายก่อนนำขึ้นใช้จริง (GitHub: 0.145.0)
  3. ค้นจุดที่กำหนดตำแหน่งรากไว้ในตัวแอป แล้ววางแผนย้ายไปกำหนดตอนเปิดเซิร์ฟเวอร์ผ่านเครื่องมือบรรทัดคำสั่งของ FastAPI ตามแนวทางที่ประกาศและคู่มือระบุ ตรวจค่าที่ใช้จริงร่วมกับการตั้งพร็อกซีด้วย (GitHub: 0.146.0, FastAPI: Behind a Proxy)
  4. ทดสอบหน้าเอกสารผ่านพร็อกซี ตรวจทั้งการเปิดหน้า การโหลดเอกสารโครงสร้าง และปลายทางที่หน้าเอกสารใช้ติดต่อบริการ ถ้ามีรายการเซิร์ฟเวอร์ให้เลือกเอง ให้ตรวจว่ารายการตำแหน่งรากที่ FastAPI เพิ่มไว้ด้านหน้าสอดคล้องกับการใช้งานด้วย (FastAPI: Behind a Proxy)

คนเรียนเขียนเว็บและทีมที่ใช้ WebSocket

  1. จดรุ่นที่ใช้กับวิธีเปิดแอปไว้ในคำอธิบายโครงการ ผมแนะนำให้แยกงานปรับความเข้ากันได้ออกจากงานลองความสามารถใหม่ เพื่อให้ตรวจผลของการเปลี่ยนแต่ละส่วนได้ชัด เมื่อรุ่นหนึ่งเพิ่มฟีเจอร์ แต่อีกรุ่นถอดตัวเลือกเก่า (GitHub: 0.144.0, GitHub: 0.145.0)
  2. หากใช้ตัวช่วยตรวจสิทธิ์กับ WebSocket ให้ทดสอบพฤติกรรมที่โครงการต้องการเอง ประกาศยืนยันการเพิ่มการรองรับ แต่ไม่ได้ให้รายละเอียดผลทดสอบสำหรับทุกแอป (GitHub: 0.144.0)

ผมมองว่า…

ผมมองว่า ในความเห็นของผม ข่าวนี้ไม่ใช่การแข่งขันว่าใครอัปเดตเร็วกว่า แต่คือการทำให้ทีมรู้ว่ารุ่นที่นำขึ้นใช้เปลี่ยนเงื่อนไขอะไร การให้เซิร์ฟเวอร์เป็นผู้กำหนดตำแหน่งรากมีเหตุผลรองรับจากคู่มือเรื่องความไม่สอดคล้องของวิธีเก่า ส่วนการถอดตัวเลือกในรุ่นก่อนหน้าก็ทำให้การตรวจโค้ดเก่าเป็นงานที่เลี่ยงไม่ได้สำหรับทีมที่ยังใช้มัน (FastAPI: Behind a Proxy, GitHub: 0.145.0)

ผมจึงให้น้ำหนักกับผลทดสอบผ่านรูปแบบติดตั้งจริงมากกว่าการเห็นว่าแอปเปิดติดเพียงครั้งเดียว โดยเฉพาะเมื่อคู่มือแสดงให้เห็นว่าหน้าเอกสารต้องเข้าใจที่อยู่ภายนอกผ่านพร็อกซีด้วย (FastAPI: Behind a Proxy) สำหรับทีมเล็ก การบันทึกวิธีตั้งค่าและรุ่นที่ผ่านการทดสอบไว้ชัด ๆ เป็นงานที่ผมเห็นว่าควรทำพร้อมการอัปเดตรอบนี้

ปิดท้าย: สิ่งที่ต้องจับตา

สิ่งที่ควรติดตามต่อคือประกาศรุ่นถัดไปจะระบุเวลาเอาตัวเลือกที่เพิ่งประกาศเลิกแนะนำออกหรือไม่ ตอนนี้แหล่งข้อมูลที่ได้รับยังไม่มีเส้นตายนั้น แต่มีคำแนะนำให้ย้ายการตั้งค่าไปที่เซิร์ฟเวอร์แล้ว (GitHub: 0.146.0) ระหว่างนี้ทีมสามารถตรวจรุ่น ตรวจของเก่าที่ถูกถอด และทดสอบการเข้าผ่านพร็อกซีให้จบก่อนปล่อยงานได้ โดยไม่ต้องรอให้มีรายงานความเสียหายมาช่วยยืนยันความสำคัญ

Recap

  • ตรวจรุ่น FastAPI ที่ติดตั้งจริงและรุ่นที่กำลังจะอัปเดต
  • อ่านบันทึกการเปลี่ยนแปลงทุกรุ่นที่ข้าม
  • ตรวจตัวเลือกเก่าที่ถูกถอดในรุ่น 0.145.0
  • แยกของที่ถูกถอดแล้วออกจากของที่ประกาศเลิกแนะนำ
  • วางแผนย้ายการกำหนดตำแหน่งรากไปที่เซิร์ฟเวอร์
  • ทดสอบหน้าเอกสารและการติดต่อบริการผ่านพร็อกซีที่ใช้จริง
  • ประเมินฟีเจอร์ WebSocket ตามงานของโครงการและทดสอบก่อนใช้
  • ติดตามประกาศใหม่ โดยไม่เดาวันถอดตัวเลือกหรือจำนวนระบบที่ได้รับผลกระทบ