Subsystem: Cloudflare Workers / OpenNext runtime
On this page
ตั้งแต่ v0.3.0 (commit f9ef054) แอปถูก build เป็น Cloudflare Worker ด้วย @opennextjs/cloudflare 1.20.x และ Wrangler 4 คู่มือ deploy ทีละขั้นอยู่ที่ DEPLOY.md และ operations/deploy-cloudflare.md หน้านี้อธิบายว่า runtime ประกอบกันอย่างไรและทำไม
ทำไม Cloudflare Workers + OpenNext#
- แอปเกือบทั้งหมดเป็นหน้า prerendered + API เล็ก ๆ หนึ่งตัว เหมาะกับ edge runtime ที่เสิร์ฟ static ได้เร็วและคิดเงินตามคำขอ
- Workers มี Rate Limiting API ในตัว (ไม่ต้องสร้าง KV/Redis) ใช้ปกป้อง
/api/plan - OpenNext แปลงผล build ของ Next.js เป็น Worker ที่รองรับ App Router ได้โดยไม่ต้องเขียน adapter เอง
- ไม่ผูกกับ Cloudflare:
npm run build && npm startยังรันบน Node ได้ (rate limit ใช้ in-memory)
ไฟล์ config#
| ไฟล์ | สาระสำคัญ |
|---|---|
wrangler.jsonc |
name: nvx-stack-builder, main: .open-next/worker.js, compatibility_flags: [nodejs_compat, global_fetch_strictly_public], workers_dev: true, preview_urls: false, ไม่มี routes, assets (binding ASSETS), service self-reference WORKER_SELF_REFERENCE, vars (OPENAI_MODEL, OPENAI_MAX_OUTPUT_TOKENS, OPENAI_TIMEOUT_MS), ratelimits (สอง limiter), observability.enabled, upload_source_maps |
open-next.config.ts |
incrementalCache: staticAssetsIncrementalCache เพราะทุกหน้า prerender และไม่มี revalidate ตอน runtime จึงไม่ต้องใช้ R2/KV |
cloudflare-env.d.ts |
ชนิดของ binding (สร้างด้วย npm run cf:typegen) |
.dev.vars.example |
ต้นแบบ .dev.vars สำหรับ npm run preview (ห้าม commit .dev.vars) |
public/_headers |
headers ของ static assets ที่เสิร์ฟตรงจาก .open-next/assets |
scripts/patch-opennext.mjs |
patch ตอน postinstall ให้ adapter inline preview-props.json ของ Next 16.4 (ไม่งั้นทุกคำขอ error Unexpected loadManifest(...preview-props.json)) idempotent และเตือนถ้า pattern เปลี่ยน ลบได้เมื่อ adapter แก้เอง |
next.config.ts |
headers, 404 rewrite, และ initOpenNextCloudflareForDev() ใน dev เพื่อให้ next dev เห็น binding |
การทำงานตอนรัน#
- คำขอเข้าที่ Worker → ถ้าเป็นไฟล์ใน
.open-next/assets(เช่น/_next/static/*, HTML ที่ prerender) เสิร์ฟผ่านASSETS - ไม่ใช่ → handler ของ Next (OpenNext) ซึ่งรวมถึง
/api/plan /api/planเรียกgetCloudflareContext().envเพื่อหา rate-limit binding (dynamic import จึงไม่พังนอก Workers)- secret
OPENAI_API_KEYและvarsเข้าถึงผ่านprocess.env(ด้วยnodejs_compat) แล้วตรวจด้วยserverEnv()
ข้อจำกัดและข้อควรรู้#
- Wrangler 4 ต้องใช้ Node 22+
- build ใช้เวลาประมาณ 1 นาที (
npx opennextjs-cloudflare build) ผลลัพธ์อยู่ใน.open-next/(gitignored) npm run previewรันใน workerd จริงที่http://localhost:8787ใช้ตรวจภาพและพฤติกรรมให้ตรงกับ production มากกว่าnext dev- rate-limit counters เป็นต่อ Cloudflare location
- ห้าม เพิ่ม
routesหรือ custom domain จนกว่าจะได้รับอนุมัติตาม custom-domain.md
D1 (ฐานข้อมูล)#
Worker มี binding DB ชี้ D1 nvx-db (ประกาศใน d1_databases ของ wrangler.jsonc พร้อม migrations_dir) ตอนนี้ยังไม่มีโค้ดเรียกใช้ D1 ดู schema ที่ chat-data-model.md และวิธีดูแลที่ d1-database.md ส่วน R2 ยังไม่ได้เปิดใช้
สถานะ deploy ล่าสุด#
Production (v0.6.0) ที่ https://devstack.bid และ www.devstack.bid (Workers Custom Domains, redirect www → apex) บัญชี 2d92bd5b25768fa9093d6adc0a8887fc เวอร์ชันปัจจุบัน 7ddd9404-a31f-4e31-8460-82b3b90c7d0e (ก่อนหน้า 671b6b3b-1074-40cb-84b0-0df2681b69ce v0.5.1) workers.dev สำรอง https://nvx-stack-builder.examplessdk.workers.dev ส่วน deploy เดิม (v0.3.0) ที่ https://nvx-stack-builder.agen-sdk-work.workers.dev บัญชี f70d35188a3c56b9781538c73a86e04e ยังเปิดอยู่และไม่ถูกแก้ไข
Source: docs/architecture/cloudflare-runtime.md · /docs/architecture/cloudflare-runtime.md