เซิร์ฟเวอร์ธุรกิจที่ปลอดภัยตั้งแต่เริ่ม
CKN Server คือ framework สำหรับสร้าง API, WebSocket และหน้าเว็บฝั่งเซิร์ฟเวอร์ โดยสร้างบน Node.js โดยตรง ไม่พึ่ง Express หรือ library HTTP ของคนอื่น เหมาะกับองค์กรที่ต้องการระบบหลังบ้านที่เร็ว ปลอดภัย และเป็นของตัวเองทั้งชุด
สิ่งที่ CKN Server ทำได้
HTTP, HTTP/2 และ WebSocket ในตัว
ชั้น network ทั้งหมดเขียนบน Node.js standard library รองรับโปรโตคอลที่ระบบธุรกิจใช้จริงโดยไม่ต้องเพิ่ม library
- HTTP/1.1, HTTPS และ HTTP/2 บน port เดียว
- WebSocket ตามมาตรฐาน RFC 6455 พร้อม room และ broadcast
- streaming แบบ NDJSON และ SSE
- รับ upload ไฟล์ multipart พร้อมตรวจชนิดไฟล์
โครงสร้างแบบ Module, Controller, Feature
ทุก endpoint คือ Feature หนึ่งตัวที่รวม route, สิทธิ์, schema และเอกสารไว้ที่เดียว ทีมใหม่อ่านโค้ดแล้วเข้าใจเร็ว
- โหลด module และ controller อัตโนมัติจากโฟลเดอร์
- แต่ละ Feature มี code ที่ไม่ซ้ำกันทั้งโปรเจกต์
- กำหนด scopes, tags และ idempotent ต่อ Feature
- ดู manifest ของทุก Feature ได้ด้วยคำสั่งเดียว
ความปลอดภัยพร้อมใช้
เรียก useSecureDefaults บรรทัดเดียวก็ได้ชุดป้องกันมาตรฐาน และมี middleware สำหรับ authentication ที่ระบบองค์กรต้องใช้
- security headers, CORS, HPP และ rate limit
- JWT (HS/RS/PS/ES และ JWKS) และ API key
- CSRF และ session ที่เก็บถาวรได้
- Idempotency-Key กันการสั่งซ้ำจาก retry
ตรวจข้อมูลและสร้างเอกสาร API อัตโนมัติ
กำหนด JSON Schema ครั้งเดียว ระบบตรวจ input ก่อนเข้า logic และสร้างเอกสาร OpenAPI ให้เอง เอกสารจึงไม่ล้าสมัย
- input ผิดรูปแบบตอบ 400 พร้อมรายละเอียดทันที
- เอกสาร OpenAPI 3.1 ที่ /api-docs
- error ทุกแบบใช้รูปแบบเดียว (RFC 9457)
พร้อมใช้งานจริงและดูแลง่าย
มีเครื่องมือที่ทีมดูแลระบบต้องใช้ ตั้งแต่ health check ไปจนถึงการใช้ CPU หลาย core
- /healthz, /readyz และ /metrics
- cluster หลาย worker พร้อม rolling restart
- หยุดระบบอย่างนุ่มนวลเมื่อได้รับ SIGTERM
- test server สำหรับเขียน test โดยไม่ต้องเปิดเครือข่ายจริง
หน้าจอ, AI agent และงานแก้ไขร่วมกัน
นอกจาก API แล้ว server ยังส่งหน้าเว็บ เปิดให้ AI agent เรียกใช้งาน และรองรับการแก้เอกสารร่วมกันแบบ real-time
- หน้าเว็บฝั่งเซิร์ฟเวอร์ด้วย theme และ view engine ในตัว
- รวมและส่ง UI พร้อม SPA fallback และ service worker
- MCP server ให้ AI agent เรียก Feature ได้
- ห้องแก้ไขร่วมกันแบบ real-time (collaboration)
ตัวเลขที่วัดจริง
ตัวเลขจาก benchmark ภายในบนเครื่อง Apple M1 Pro (Node.js 24) โดยโปรแกรมทดสอบรันบนเครื่องเดียวกับ server และไม่มี database ตัวเลขจึงวัดต้นทุนของ framework เอง ผลบนระบบจริงจะต่างตามฮาร์ดแวร์และงานของคุณ
ตัวเลขจากชุดทดสอบและ benchmark ภายในของ CKN ผลจริงขึ้นกับเครื่องและปริมาณข้อมูลของแต่ละระบบ
ธุรกิจของคุณได้อะไร
เป็นเจ้าของ stack ทั้งชุด
ชั้น HTTP, router, WebSocket และ security เขียนเองบน Node.js และพึ่ง library ภายนอกที่ใช้ตอน run เพียงตัวเดียวคือ CKN Core ผลคือพื้นที่เสี่ยงจาก supply chain เล็กลง และเมื่อมีช่องโหว่หรือต้องปรับพฤติกรรม ทีมเราแก้ได้เองโดยไม่ต้องรอ maintainer ภายนอก
ลดความเสี่ยงด้านความปลอดภัย
ชุดป้องกันมาตรฐาน, authentication, CSRF และ idempotency มาพร้อมกับ framework และมี test โจมตีจริงเช่น path traversal และ header ผิดรูป ทุก service จึงเริ่มจากระดับความปลอดภัยเดียวกัน ไม่ต้องให้แต่ละทีมประกอบเอง
ส่งมอบเร็วและดูแลต้นทุนได้
validation, เอกสาร OpenAPI, health check และ cluster เป็นการตั้งค่า ไม่ใช่งานเขียนใหม่ ทีมจึงใช้เวลากับ business logic มากขึ้น และเมื่อโหลดเพิ่มก็ใช้ CPU ที่มีอยู่ได้เต็มขึ้นก่อนต้องซื้อเครื่องเพิ่ม
Feature หนึ่งตัว รวม route, สิทธิ์ และ validation
ใช้งานอยู่ในส่วนต่าง ๆ ของ CKN stack
- business services ทุกตัวของ CKN (inventory, transportation และอื่น ๆ) ใช้เป็นตัวรัน API
- platform services เช่น identity, integration และ portal
- บริการปฏิบัติการอย่าง console และ engine ที่ส่งทั้ง API และหน้าจอ
- แอปที่สร้างด้วยคำสั่ง ckn init ใช้ framework นี้เป็นฐาน
class OrderController extends Controller {
constructor() { super(); this.url = "orders"; }
create = {
code: "SALES.ORDER.CREATE", name: "Create order", method: Controller.Method.POST, url: "",
inputSchema: {
type: "object", additionalProperties: false, required: ["sku", "qty"],
properties: { sku: { type: "string", minLength: 1 }, qty: { type: "integer", minimum: 1 } }
},
scopes: ["orders:write"], sideEffects: "write", idempotent: true,
process: async (session: Session) => { session.send({ success: true, data: session.input }); }
};
}
