Skip to content

15.5 Legacy runtime & framework EOL

บทนี้รวบรวม debt ที่เกี่ยวข้องกับ runtime และ framework ที่เลย End of Life (EOL) — พื้นฐานของความเสี่ยงด้านความปลอดภัยในระยะยาว เพราะไม่มี patch ใหม่

สถานะ EOL ของ runtime หลัก

┌──────────────────────────────────────────────────────────────┐
│ EOL Timeline (จากข้อมูล ณ ปี 2026)                          │
├──────────────────────────────────────────────────────────────┤
│ Node.js 12     EOL 2022-04   ← vtrc-api, cu-central-api      │
│ Node.js 14     EOL 2023-04   ← vtrc-web Docker build stage   │
│ Node.js 16     EOL 2023-09   ← centralize-api                │
│ Node.js 18     EOL 2025-04                                       │
│ Node.js 20 LTS EOL 2026-04   (recommended target)             │
│ Node.js 22 LTS EOL 2027-04                                       │
└──────────────────────────────────────────────────────────────┘

ทุก service ของ VTRC รันบน Node runtime ที่เลย EOL แล้ว — ไม่มี security backport จาก Node.js project

รายการทั้งหมด

LEG-1 · Node 12 runtime

ข้อมูลรายละเอียด
Evidencevtrc-api/api/Dockerfile:1 + cu-central-api/main-api/Dockerfile:1FROM node:12
ปัญหาNode 12 EOL เมษายน 2022 — ไม่มี security backport มาแล้วกว่า 4 ปี
ImpactCVE ใหม่ ๆ ของ Node จะไม่ถูกแก้ ความเสี่ยงด้านความปลอดภัยเพิ่มขึ้นเรื่อย ๆ
Mitigation ระยะสั้นยกระดับเป็น Node 20 LTS (ขั้นต่ำ) — แต่ติดปัญหา LEG-2 (esm shim)
แนวทางระยะยาวย้ายไป Go ที่ไม่มี runtime tax หรือ Node เวอร์ชันที่รองรับ

LEG-2 · esm shim ล็อค Node 12

ข้อมูลรายละเอียด
Evidencevtrc-api/api/package.json:27 + cu-central-api/.../package.json:26"esm": "^3.2.25"; start script node -r esm .
ปัญหาesm เป็น shim ที่ทำให้ใช้ ES modules บน Node 12 — แต่ esm เองไม่ได้รับการพัฒนาตั้งแต่ปี 2019 และไม่รองรับ Node ≥ 14 อย่างสมบูรณ์ นี่คือ root cause ที่ทำให้ยกระดับ Node ไม่ได้
Impactการยกระดับ Node ต้องแปลง esm shim เป็น native ESM ("type": "module") ก่อน — เป็นงานใหญ่
Mitigation ระยะสั้นไม่มี — ต้องทำ migration
แนวทางระยะยาวแปลงเป็น native ESM บน Node ≥ 14 หรือ rewrite ในภาษาอื่น

LEG-3 · Apollo Server v2 EOL

ข้อมูลรายละเอียด
Evidencevtrc-api/api/package.json:18 + cu-central-api/.../package.json:19"apollo-server": "^2.x"
ปัญหาApollo Server v2 ถูกแทนด้วย @apollo/server v4 — เวอร์ชัน v2 ไม่ได้รับ security patch
ImpactCVE ใหม่ ๆ ของ Apollo ไม่ถูกแก้ ความเสี่ยงเพิ่มขึ้นตามเวลา
Mitigation ระยะสั้นยกระดับเป็น Apollo Server v4 (มี breaking changes ต้องทำ migration)
แนวทางระยะยาวใช้ gqlgen (Go) หรือ GraphQL framework อื่นที่ไม่ใช่ Apollo

LEG-4 · React 16 EOL + Apollo Client v2 EOL

ข้อมูลรายละเอียด
Evidencefrontend package.json ทั้งสองตัว — react ^16, react-apollo ^3.1.5, apollo-client ^2.6.3, apollo-link-*
ปัญหาReact 16 EOL, Apollo Client v2 (react-apollo) ถูก rename/frozen ตั้งแต่ปี 2020 และแทนด้วย @apollo/client v3 — ทั้ง stack frontend Apollo ไม่ได้รับการพัฒนา
Impactไม่ได้รับ bug fix และ security patch ความเร็วในการพัฒนา frontend ช้าลง
Mitigation ระยะสั้นยกระดับเป็น React 18 + @apollo/client v3
แนวทางระยะยาวย้ายไป Nuxt 3 + Vue 3

ผลกระทบรวมของ EOL stack

EOL stack ส่งผลกระทบหลายทาง:

  1. ความเสี่ยงด้านความปลอดภัย — CVE ใหม่ไม่ถูกแก้ ผู้ไม่ประสงค์ดีที่รู้ตำแหน่งช่องโหว่เก่าสามารถใช้ exploit ได้
  2. ความเร็วในการพัฒนา — library ใหม่ ๆ ไม่รองรับเวอร์ชันเก่า การเพิ่ม feature ใหม่ทำได้ยาก
  3. การจ้างงาน — นักพัฒนาใหม่ไม่คุ้นเคยกับ stack เก่า การ onboard ใช้เวลานาน
  4. การ support จาก community — Stack Overflow, GitHub issue ที่เกี่ยวกับเวอร์ชันเก่าได้คำตอบช้า

ลำดับการยกระดับ (แนะนำ)

การยกระดับ stack ต้องทำเป็นลำดับ — แต่ละขั้นต่องอาศัยขั้นก่อนหน้า:

ปัจจุบัน:  Node 12 + esm + Apollo Server v2 + React 16 + Apollo Client v2


ขั้นที่ 1:  แปลง esm shim → native ESM (จำเป็นก่อน)


ขั้นที่ 2:  ยกระดับ Node 12 → Node 20 LTS


ขั้นที่ 3:  Apollo Server v2 → v4 (backend)


ขั้นที่ 4:  React 16 → 18, Apollo Client v2 → v3 (frontend)


ขั้นที่ 5:  (อนาคต) ย้าย backend ไป Go, frontend ไป Nuxt 3

แต่ละขั้นเป็นงาน 2-3 สัปดาห์ขึ้นไป — รวมเป็น Wave 1 (stabilize) ในบท 14.10

ความเสี่ยงถ้าไม่ยกระดับ

ถ้าปล่อยให้ stack EOL ต่อไปโดยไม่ยกระดับ ความเสี่ยงเพิ่มขึ้นตามเวลา:

ระยะเวลาความเสี่ยงที่เพิ่ม
6 เดือนCVE ใหม่ของ Node 12 / Apollo v2 ที่ไม่มี patch
1 ปีlibrary ที่ต้องพึ่ง (เช่น Sequelize, TypeORM) อาจเลิกรองรับ Node 12
2 ปีนักพัฒนาใหม่ไม่ยอมรับงานที่ใช้ stack เก่า
3 ปีinfrastructure ใหม่ (เช่น Kubernetes version ใหม่) อาจไม่รองรับ Node 12

สรุป

IDรายการSeverityEffort รวม
LEG-1Node 12 EOLCriticalรวมกับ LEG-2
LEG-2esm shim ล็อคCritical2-3 สัปดาห์
LEG-3Apollo Server v2 EOLHigh1-2 สัปดาห์
LEG-4React 16 + Apollo v2 EOLHigh2-4 สัปดาห์ (ต่อ frontend)

บทถัดไปจะลงรายละเอียดของ dependency ที่ไม่ใช่ runtime แต่มีผลต่อ supply chain และ maintainability