# NexCMP 1.6.1 — full documentation > Complete NexCMP documentation in one file. Source: https://nexcmp.com/th/docs/ · generated 2026-11-02. --- # NexCMP คืออะไร {#what-is-nexcmp} NexCMP คือซอฟต์แวร์ที่คุณติดตั้งบน **เซิร์ฟเวอร์ของคุณเอง** เพื่อแปลงโครงสร้างพื้นฐานคลาวด์ให้เป็นผลิตภัณฑ์ที่คุณสามารถขายได้ โดยมอบสิ่งเหล่านี้ให้แก่คุณ: - ียร์ **พอร์ทัลลูกค้า** ที่ให้ผู้ใช้สมัครสมาชิก เติมเครดิต สั่งซื้อเครื่องเสมือนและบริการอื่นๆ เปิดคอนโซล ถ่ายสแนปชอต และติดต่อฝ่ายสนับสนุน; - ียร์ **คอนโซลผู้ดูแลระบบ** (`/admin`) สำหรับจัดการลูกค้า แพ็กเกจ ราคา การชำระเงิน โครงสร้างพื้นฐาน และการตั้งค่า; - **การเรียกเก็บเงิน**: ระบบกระเป๋าเงินต่อลูกค้า การคิดเงินตามชั่วโมงหรือรายเดือน ใบแจ้งหนี้ โปรโมชัน และโควตบทรัพยากร; - **ผู้แทนจำหน่ายแบบไวท์ลาเบล**: แบรนด์อื่นๆ ที่ขายความจุของคุณภายใต้โดเมนของตนเอง; - **API**, เครื่องมือบรรทัดคำสั่ง (`cmp`) และเซิร์ฟเวอร์ MCP สำหรับการทำงานอัตโนมัติ; - ตัวเลือก **AI Chat** (ผู้ช่วยสนับสนุน) และ **AI Agent** (จัดการ VM ด้วยภาษาธรรมชาติ) ## สิ่งที่เชื่อมต่อได้ {#what-it-connects-to} NexCMP ไม่ได้โฮสต์เครื่องเสมือนด้วยตนเอง แต่ทำหน้าที่ขับเคลื่อนแพลตฟอร์มที่ทำหน้าที่นั้น *แหล่งที่มา* (หรือเรียกว่าผู้ให้บริการ) ได้แก่: | Source | การใช้งานทั่วไป | คู่มือ | |---|---|---| | Apache CloudStack | ไพรเวทหรือพับลิกคลาวด์ที่มีโซน เครือข่าย เวอร์ชวลเราเตอร์ และพับลิก IP | [CloudStack](https://nexcmp.com/th/docs/infrastructure/cloudstack/) | | Proxmox VE | เซิร์ฟเวอร์เดี่ยวหรือคลัสเตอร์ที่คุณใช้งานอยู่แล้ว | [Proxmox VE](https://nexcmp.com/th/docs/infrastructure/proxmox/) | โมดูลอื่นจำเป็นต้องมีโครงสร้างพื้นฐานของตนเอง ได้แก่ [เซิร์ฟเวอร์แบร์เมทัล](https://nexcmp.com/th/docs/infrastructure/dedicated/), [โหนด VPN และพร็อกซี](https://nexcmp.com/th/docs/infrastructure/vpn-proxy-nodes/), [ที่เก็บข้อมูลออบเจ็กต์ S3](https://nexcmp.com/th/docs/infrastructure/s3/), [Kubernetes และไพรเวทคลาวด์](https://nexcmp.com/th/docs/infrastructure/kubernetes-and-private-cloud/) ดูตารางรวมทั้งหมดได้ที่ [Infrastructure requirements](https://nexcmp.com/th/docs/infrastructure/requirements/) ## วิธีการสร้าง {#how-it-is-built} NexCMP เป็นโปรแกรมเดี่ยวที่มีบริการ systemd สองรายการบนเซิร์ฟเวอร์ Ubuntu หนึ่งเครื่อง: - `nexcmp` — เว็บเซิร์ฟเวอร์: พอร์ทัลลูกค้า, คอนโซลผู้ดูแลระบบ, API, วิซาร์ดการติดตั้ง; - `nexcmp-vmd` — ระบบงานเบื้องหลัง: งานโพรวิชันนิ่ง, การซิงโครไนซ์กับ CloudStack หรือ Proxmox ของคุณ, รอบการเรียกเก็บเงิน ข้อมูลจะอยู่ใน `/var/lib/nexcmp` (ฐานข้อมูล SQLite และไฟล์), การกำหนดค่าใน `/etc/nexcmp`, โปรแกรมใน `/opt/nexcmp` ดูภาพรวมทั้งหมดได้ที่ [Architecture](https://nexcmp.com/th/docs/infrastructure/architecture/) ## ขั้นตอนถัดไป {#where-to-go-next} 1. ตรวจสอบ [requirements](https://nexcmp.com/th/docs/getting-started/requirements/) 2. รับไลเซนส์ — [License and purchase](https://nexcmp.com/th/docs/getting-started/license-and-purchase/) 3. [Install](https://nexcmp.com/th/docs/getting-started/installation/) จากนั้นเรียกใช้ [setup wizard](https://nexcmp.com/th/docs/getting-started/setup-wizard/) 4. เชื่อมต่อแพลตฟอร์มของคุณ: [CloudStack](https://nexcmp.com/th/docs/infrastructure/cloudstack/) หรือ [Proxmox VE](https://nexcmp.com/th/docs/infrastructure/proxmox/) --- # ข้อกำหนดสำหรับเซิร์ฟเวอร์ NexCMP {#requirements-for-the-nexcmp-server} หน้านี้ครอบคลุมถึงเซิร์ฟเวอร์ที่รัน NexCMP สำหรับสิ่งที่คุณต้องการในส่วนของ CloudStack, Proxmox VE หรือโครงสร้างพื้นฐานอื่นๆ โปรดดูที่ [Infrastructure requirements](https://nexcmp.com/th/docs/infrastructure/requirements/) ## Server {#server} | Item | Requirement | ตรวจสอบโดยตัวติดตั้ง | |---|---|---| | Operating system | Ubuntu **22.04** หรือ **24.04** | ใช่ — จะหยุดทำงานพร้อมแสดงข้อผิดพลาดหากเป็นระบบปฏิบัติการอื่น | | CPU architecture | x86_64 | ใช่ | | Memory | ขั้นต่ำ 2 GB (ตัวติดตั้งจะปฏิเสธหากมีค่าน้อยกว่าประมาณ 1.8 GB) | ใช่ | | Free disk | ว่าง 8 GB บน `/` ขั้นต่ำ | ใช่ | | Privileges | root (`sudo`) | ใช่ | | Packages | `curl`, `ca-certificates`, `zstd`, `tar`, `openssl`, `python3`, `openssh-client` — ติดตั้งโดยอัตโนมัติ | ติดตั้งหากไม่มี | | With HTTPS | `nginx` และ `certbot` — ติดตั้งโดยอัตโนมัติเว้นแต่คุณจะระบุ `--no-nginx` | ติดตั้งหากไม่มี | ::: tip Sizing การติดตั้งขนาดเล็ก (ลูกค้าไม่กี่ร้อยราย) สามารถทำงานได้อย่างราบรื่นบน 2 vCPU / 4 GB RAM พื้นที่ดิสก์ส่วนใหญ่จะใช้โดยฐานข้อมูล SQLite รวมถึงชุดอัปเดตและสำรองข้อมูลเสริม — แนะนำให้เผื่อพื้นที่ 20 GB ขึ้นไปสำหรับการใช้งานจริง ::: ## Network {#network} | Direction | Port | Purpose | |---|---|---| | Inbound | 80/tcp | การตรวจสอบความถูกต้องของ Let's Encrypt และเปลี่ยนเส้นทางไปยัง HTTPS | | Inbound | 443/tcp | พอร์ทัลลูกค้า, คอนโซลผู้ดูแลระบบ, API | | Inbound | 3000/tcp | ตัวช่วยติดตั้งในการติดตั้งครั้งแรกและการเข้าถึงในกรณีฉุกเฉินเท่านั้น — ดู [Installation](https://nexcmp.com/th/docs/getting-started/installation/#the-panel-port-3000) | | Outbound | 443/tcp ไปยัง `nexcmp.com` | การเปิดใช้งานไลเซนส์, การตรวจสอบไลเซนส์รายวัน, การอัปเดต | | Outbound | ไปยัง CloudStack API / Proxmox API ของคุณ | การจัดสรรทรัพยากรและการซิงโครไนซ์ | | Outbound | 443/tcp ไปยังผู้ให้บริการชำระเงิน, อีเมล และ AI ที่คุณเปิดใช้งาน | Stripe, PayPal, SMTP, ผู้ให้บริการ AI และอื่นๆ | เซิร์ฟเวอร์จำเป็นต้องมี **แอดเดรส IPv4 สาธารณะ** หากคุณต้องการให้ Let's Encrypt ออกใบรับรองโดยตรง หากโดเมนถูกพร็อกซีโดย Cloudflare โปรดดู [DNS and Cloudflare](https://nexcmp.com/th/docs/getting-started/dns-and-cloudflare/) ## DNS - หนึ่ง **โดเมนหลัก** (ตัวอย่างเช่น `cloud.example.com`) — พอร์ทัลคือ `https://cloud.example.com/` และคอนโซลผู้ดูแลระบบคือ `https://cloud.example.com/admin` - ทางเลือก: `admin.` และ `partner.` หากชื่อเหล่านี้ชี้มาที่เซิร์ฟเวอร์ (หรือไปที่ Cloudflare) ตัวติดตั้งจะเพิ่มชื่อเหล่านี้ลงในใบรับรอง - โดเมนจะต้องตรงกับโดเมนที่ลงทะเบียนไว้ในไลเซนส์ของคุณ ## ไม่จำเป็นต้องมีบนเซิร์ฟเวอร์นี้ {#not-required-on-this-server} NexCMP ทำงานเป็นผู้ใช้บริการทั่วไปที่ไม่มีสิทธิ์พิเศษ (`nexcmp`) โดย**ไม่ต้อง**ใช้สิทธิ์ root ขณะรันไทม์, Docker, เซิร์ฟเวอร์ฐานข้อมูลแยกต่างหาก, Redis หรือซอฟต์แวร์ไฮเปอร์ไวเซอร์ใดๆ --- # สิทธิ์การใช้งานและการซื้อ {#license-and-purchase} > **ตำแหน่งในแอดมิน:** System › Admin › License & updates (`/license`) NexCMP เปิดใช้งานด้วย **คีย์ลิขสิทธิ์** ที่คุณจัดการได้ใน [บัญชี NexCMP](https://nexcmp.com/licenses) ของคุณ รุ่นและราคาปัจจุบันแสดงอยู่ที่ [nexcmp.com/pricing](https://nexcmp.com/pricing) หน้าตานี้จะอธิบายวิธีที่ลิขสิทธิ์ทำงานเมื่อคุณมีแล้ว ## รับลิขสิทธิ์ {#get-a-license} 1. สร้างบัญชีที่ [nexcmp.com](https://nexcmp.com/register) และยืนยันอีเมลของคุณ 2. เลือกรุ่น: - **NexCMP Free** — สำหรับผู้ให้บริการเครือข่ายที่มี ASN ของตนเองและซับเน็ตที่ลงทะเบียนในนามของตนเอง ส่งใบสมัครที่ [nexcmp.com/deploy](https://nexcmp.com/deploy) (บริษัท, ASN, ซับเน็ต, โดเมนพาเนล) อีเมลบัญชีของคุณต้องตรงกับโดเมนบริษัทที่ทะเบียนสาธารณะ (WHOIS) ระบุไว้สำหรับ ASN หรือซับเน็ตนั้นๆ ทุกใบสมัครจะได้รับการตรวจสอบ คุณจะได้รับอีเมลเมื่อมีการตัดสิน และคีย์ลิขสิทธิ์จะปรากฏขึ้นหลังจากการอนุมัติเท่านั้น - **NexCMP Source** — การอัปเกรดแบบครั้งเดียวโดยไม่ต้องมี ASN ดูรายละเอียดที่ [nexcmp.com/pricing](https://nexcmp.com/pricing) 3. เปิดหน้าลิขสิทธิ์ของคุณ โดยจะแสดง **คีย์ลิขสิทธิ์** (รูปแบบ `NXC-XXXXX-XXXXX-XXXXX-XXXXX`), **โดเมนหลัก** และคำสั่งติดตั้งที่พร้อมใช้งาน ::: warning เก็บคีย์นี้ไว้เป็นความลับ คีย์ลิขสิทธิ์ใช้สำหรับเปิดใช้งานการติดตั้ง ให้ปฏิบัติต่อคีย์นี้เหมือนรหัสผ่าน: อย่าส่งหรือวางลงในตั๋วสนับสนุน, แชท หรือภาพหน้าจอ ::: ## สิ่งที่ลิขสิทธิ์ประกอบด้วย {#what-a-license-contains} | ฟิลด์ | ความหมาย | |---|---| | โดเมนหลัก | ชื่อโฮสต์ที่พอร์ทัลของคุณทำงานอยู่ คีย์จะถูกผูกเข้ากับชื่อโฮสต์นี้เมื่อเปิดใช้งาน | | โดเมนตัวแทนจำหน่าย | ชื่อโฮสต์เพิ่มเติมที่ให้บริการในฐานะพอร์ทัลแบบป้ายขาว — ดูที่ [Resellers](https://nexcmp.com/th/docs/customers/resellers/) | | อัปเดตได้ถึง | วันที่คุณจะได้รับ**การอัปเดตและแก้ไขข้อบกพร่อง** ลิขสิทธิ์ฟรีจะเริ่มต้นด้วยระยะเวลา **1 ปี** นับตั้งแต่วันที่ได้รับการอนุมัติ ต่ออายุในราคา $99 ต่อปีได้ที่หน้าลิขสิทธิ์ของคุณ การแก้ไขช่องโหว่ด้านความปลอดภัยจะมีให้อยู่เสมอแม้จะพ้นกำหนดวันนี้ไปแล้ว | | สถานะ | `active` หรือถูกระงับ / หมดอายุ / ถูกเพิกถอน | ## เมื่อครบกำหนดปีฟรี {#when-the-free-year-ends} ซอฟต์แวร์จะ**ทำงานต่อไป**เมื่อพ้นวันที่ระบุใน "Updates until": ลูกค้า, บริการ และการเรียกเก็บเงินจะไม่ได้รับผลกระทบใดๆ คุณจะหยุดรับฟีเจอร์ใหม่และการอัปเดตแก้ไขบั๊ก (การแก้ไขความปลอดภัยยังคงได้รับอยู่) ต่ออายุในราคา $99 ต่อปีที่หน้าลิขสิทธิ์ของคุณที่ [nexcmp.com/licenses](https://nexcmp.com/licenses) เพื่อใช้งานต่อ การต่ออายุจะเพิ่มระยะเวลาอีก 12 เดือนจากวันสิ้นสุดปัจจุบัน NexCMP Free รวมเฉพาะการแก้ไขบั๊กเท่านั้น — ไม่มีการสนับสนุนทางเทคนิคและไม่มีแอป ## สิ่งที่ NexCMP Source เพิ่มเติม {#what-nexcmp-source-adds} ไลเซนส์แบบ Source คือการอัปเกรดไลเซนส์แบบชำระเงินครั้งเดียว $1,999 โดยคุณจะได้รับซอร์สโค้ดฉบับเต็ม, แอปพลิเคชัน NexCMP ทั้งหมด (Android, iOS, Windows, macOS, Linux, Chrome / Edge / Brave และ Firefox) ที่คอมไพล์และใส่แบรนด์ให้คุณ พร้อมวันทำงาน 30 วันกับวิศวกรผู้เชี่ยวชาญ — ย้ายข้อมูลฟรีจาก VMware, WHMCS หรือพาเนลอื่น หรือติดตั้งแบบ A ถึง Z ทั้งระบบ การอัปเดตซอร์สโค้ดใหม่รวมอยู่ด้วยเป็นเวลา 12 เดือน การต่ออายุหลังจากนั้น ($99 ต่อปี) เป็นทางเลือก และซอร์สที่คุณดาวน์โหลดไปแล้วเป็นของคุณตลอดไป ดู [ข้อกำหนดไลเซนส์แบบ Source](https://nexcmp.com/legal/source-license/) ## การติดตั้งตรวจสอบลิขสิทธิ์อย่างไร {#how-the-installation-checks-its-license} - เมื่อทำการติดตั้ง เซิร์ฟเวอร์จะเปิดใช้งานคีย์สำหรับโดเมนของคุณและรับ **โทเค็นที่มีลายเซ็นต์** กลับมา - โทเค็นจะได้รับการต่ออายุโดยอัตโนมัติทุกๆ **24 ชั่วโมง** โดยจะยังคงใช้งานได้เป็นเวลา **14 วัน** ดังนั้นอินเทอร์เน็ตที่ขัดข้องเป็นระยะเวลาสั้นๆ จึงไม่มีผลกระทบใดๆ - ทุกรีลีสและโทเค็นจะได้รับการตรวจสอบด้วยลายเซ็น Ed25519 ที่ฝังอยู่ในโปรแกรม การดาวน์โหลดที่ถูกดัดแปลงแก้ไขจะถูกปฏิเสธ คุณสามารถตรวจสอบสถานะได้ตลอดเวลาในคอนโซลผู้ดูแลระบบหรือใช้ `sudo nexcmp status` ## หากไลเซนส์ไม่ถูกต้อง {#if-the-license-is-not-valid} เมื่อโทเค็นหมดอายุ หรือไลเซนส์ถูกระงับ หรือโดเมนไม่ตรงกันอีกต่อไป: - ลูกค้า**จะไม่สามารถสร้างบริการใหม่ได้** และคอนโซลผู้ดูแลระบบจะแสดงแบนเนอร์แจ้งเตือน; - บริการที่ทำงานอยู่แล้ว **การเรียกเก็บเงินและลูกค้าที่มีอยู่จะไม่ได้รับผลกระทบ**; - แก้ไขสาเหตุ (เชื่อมต่อเซิร์ฟเวอร์กับอินเทอร์เน็ตอีกครั้ง ต่ออายุที่ [nexcmp.com/licenses](https://nexcmp.com/licenses)) แล้วคลิก **Check now** ใน License & updates ## การย้ายไปยังเซิร์ฟเวอร์หรือโดเมนใหม่ {#moving-to-a-new-server-or-domain} เปิดใช้งานบนเซิร์ฟเวอร์ใหม่ด้วยคีย์เดิมและโดเมนที่ลงทะเบียนไว้ (ดู [Installation](https://nexcmp.com/th/docs/getting-started/installation/)) หากต้องการเปลี่ยนโดเมนที่ลงทะเบียน ให้ดำเนินการบนหน้าไลเซนส์ของคุณที่ [nexcmp.com/licenses](https://nexcmp.com/licenses) ก่อน จากนั้นจึงรันตัวติดตั้งใหม่อีกครั้งด้วย `--domain` --- # ติดตั้ง NexCMP {#install-nexcmp} ตัวติดตั้งคือสคริปต์เดี่ยวที่ให้บริการโดยเซิร์ฟเวอร์ไลเซนส์ของคุณ โดยจะตรวจสอบเครื่อง เปิดใช้งานไลเซนส์ ดาวน์โหลดและตรวจสอบความถูกต้องของโปรแกรม ติดตั้งบริการ และ (เลือกได้) ตั้งค่า nginx พร้อมใบรับรองจาก Let's Encrypt ## ก่อนที่คุณจะเริ่มต้น {#before-you-start} - เซิร์ฟเวอร์ที่เป็นไปตาม [requirements](https://nexcmp.com/th/docs/getting-started/requirements/) และสิทธิ์ root - **ไลเซนส์คีย์**และ**โดเมนหลัก**ของคุณจาก [license page](https://nexcmp.com/licenses) — ดู [License and purchase](https://nexcmp.com/th/docs/getting-started/license-and-purchase/) - เรคคอร์ด DNS สำหรับโดเมน — ดู [DNS and Cloudflare](https://nexcmp.com/th/docs/getting-started/dns-and-cloudflare/) คุณยังสามารถติดตั้งก่อนแล้วค่อยแก้ไข DNS ทีหลังได้ โดยตัวติดตั้งจะบอกคุณว่ามีอะไรขาดหายไปและสามารถรันซ้ำอีกครั้งได้ง่ายๆ ## การติดตั้ง {#install} 1. เข้าสู่ระบบเซิร์ฟเวอร์และสลับเป็นสิทธิ์ root (หรือใส่ `sudo` นำหน้า) 2. รันคำสั่งจากหน้าไลเซนส์ของคุณ โดยจะมีลักษณะดังนี้: ```bash curl -fsSL https://nexcmp.com/install.sh | sudo bash -s -- \ --license NXC-XXXXX-XXXXX-XXXXX-XXXXX \ --domain cloud.example.com \ --email admin@example.com ``` 3. รอเครื่องหมายถูก การติดตั้งใหม่จะใช้เวลาเพียงไม่กี่นาที การเริ่มทำงานครั้งแรกจะสร้างสีมาฐานข้อมูลและอาจใช้เวลาถึงหนึ่งนาทีบนดิสก์ที่ช้า 4. อ่านสรุปที่ด้านท้าย ซึ่งจะแสดง URL พอร์ทัลและผู้ดูแลระบบ **รหัสตั้งค่า** และขั้นตอนถัดไป ![หน้าจอการติดตั้งเสร็จสมบูรณ์พร้อมแสดง URL พอร์ทัล URL ผู้ดูแลระบบ และรหัสตั้งค่าแบบใช้ครั้งเดียว](https://nexcmp.com/th/docs/images/getting-started/installation-01-finish.webp) ## พารามิเตอร์ {#parameters} | พารามิเตอร์ | ค่าเริ่มต้น | ความหมาย | |---|---|---| | `--license KEY` | จำเป็นสำหรับการติดตั้งครั้งแรก | ไลเซนส์คีย์ | | `--domain NAME` | จำเป็นสำหรับการติดตั้งครั้งแรก | โดเมนหลัก ต้องตรงกับไลเซนส์ `https://` และเส้นทางต่อท้ายจะถูกตัดออก | | `--email ADDRESS` | ไม่มี | อีเมลติดต่อสำหรับประกาศการหมดอายุของ Let's Encrypt หากไม่มี ใบรับรองจะถูกลงทะเบียนโดยไม่มีอีเมล | | `--port N` | `3000` | พอร์ตภายในของแผงควบคุม (1–65535) | | `--no-nginx` | ปิด | ไม่ต้องติดตั้งหรือกำหนดค่า nginx / TLS ใช้สิ่งนี้เมื่อคุณรันรีเวอร์สพร็อกซีของคุณเองหรือต้องการตรวจสอบ NexCMP ก่อน | | `--behind-cloudflare` | ตรวจหาอัตโนมัติ | บังคับใช้โหมด "โดเมนถูกพร็อกซีโดย Cloudflare" โดยปกติจะตรวจพบจาก DNS | | `--channel NAME` | `stable` | แชนแนลรีลีส | การรันตัวติดตั้งอีกครั้ง**โดยไม่มีพารามิเตอร์**จะนำค่าที่บันทึกไว้กลับมาใช้ใหม่ (`/etc/nexcmp/install.conf`) และอัปเกรดได้อย่างปลอดภัย โดยคงข้อมูล การกำหนดค่า และบัญชีไว้ ซึ่งนั่นคือสิ่งที่จะเกิดขึ้นเมื่อทำ `sudo nexcmp update` ## สิ่งที่ตัวติดตั้งทำ {#what-the-installer-does} 1. **ตรวจสอบเครื่อง** — Ubuntu 22.04/24.04, x86_64, RAM อย่างน้อย 2 GB, พื้นที่ดิสก์ว่าง 8 GB 2. **ติดตั้งแพ็กเกจ** ที่จำเป็น (`curl`, `zstd`, `openssl`, `python3`, `openssh-client` …) 3. **สร้างผู้ใช้สำหรับบริการ** `nexcmp` และไดเรกทอรี: `/opt/nexcmp` (โปรแกรม, เป็นของ root, เซอร์วิสอ่านได้อย่างเดียว), `/etc/nexcmp` (การกำหนดค่า), `/var/lib/nexcmp` (ข้อมูล), `/var/log/nexcmp` 4. **เปิดใช้งานไลเซนส์** สำหรับโดเมน และจัดเก็บ ID อินสแตนซ์ที่กำหนดไว้สำหรับเครื่องนี้ 5. **ดาวน์โหลดรีลีสใหม่ล่าสุดที่คุณมีสิทธิ์ได้รับ** จากนั้นตรวจสอบ SHA-256 และลายเซ็น Ed25519 รีลีสที่ไม่มีลายเซ็นถูกต้องจะถูกปฏิเสธ โดยจะไม่ทำการดาวน์เกรดเวอร์ชันปัจจุบันที่ใหม่กว่า 6. **เขียนการตั้งค่าและยูนิต systemd** (`nexcmp`, `nexcmp-vmd`, `nexcmp-update`) และเริ่มบริการต่างๆ โดยจะรอให้ `/healthz` ตอบสนอง 7. **ตั้งค่า nginx และ TLS** (เว้นแต่จะระบุ `--no-nginx`): รับใบรับรอง Let's Encrypt ด้วย certbot (แบบเว็บรูทชาเลนจ์) สำหรับโดเมน และสำหรับ `admin.` / `partner.` เมื่อชื่อเหล่านั้นชี้มาด้วย หาก DNS ยังไม่ชี้มาที่เซิร์ฟเวอร์นี้ (หรือ Cloudflare) ขั้นตอนนี้จะถูกข้ามและแสดงข้อความแจ้ง 8. **แสดงสรุป** พร้อม URL และรหัสติดตั้ง (**setup code**) หากยังไม่มีผู้ดูแลระบบ ## พอร์ตของพาเนล (3000) {#the-panel-port-3000} - ระหว่างการติดตั้งครั้งแรก พาเนลจะรันบน `0.0.0.0:3000` เพื่อให้คุณสามารถเปิดตัวช่วยตั้งค่าได้ที่ `http://:3000/setup` - เมื่อตัวช่วยตั้งค่าเสร็จสิ้น **และ** เปิดใช้งาน TLS แล้ว พาเนลจะรันบน `127.0.0.1` เท่านั้น โดย nginx จะทำหน้าที่พร็อกซี `https://` ไปยังพาเนล - สำหรับกรณีฉุกเฉิน (nginx เสีย, DNS ผิด) คุณสามารถเปิดพอร์ตชั่วคราวได้: `sudo nexcmp open-port 30` (30 นาที จากนั้นจะปิดเอง) — หรือใช้ SSH ทันเนล: `ssh -L 3000:127.0.0.1:3000 ` แล้วเรียกดู `http://127.0.0.1:3000/` ::: warning HTTP แบบไม่เข้ารหัส พอร์ต 3000 เป็น HTTP แบบไม่เข้ารหัส โปรดใช้เฉพาะสำหรับการตั้งค่าบนเครือข่ายที่เชื่อถือได้ หรือผ่าน SSH ทันเนลเท่านั้น อย่าเปิดทิ้งไว้ ::: ## การติดตั้งโดยไม่มีโดเมนสาธารณะ (สำหรับห้องทดลองหรือทดสอบ) {#installing-without-a-public-domain-lab-or-test} คุณสามารถติดตั้งบนเครื่องที่ยังไม่มี DNS ได้: ```bash curl -fsSL https://nexcmp.com/install.sh | sudo bash -s -- \ --license NXC-XXXXX-XXXXX-XXXXX-XXXXX --domain lab.example.com --no-nginx ``` จากนั้นเปิดตัวช่วยตั้งค่าผ่าน SSH ทันเนล (`ssh -L 3000:127.0.0.1:3000 `, เรียกดู `http://127.0.0.1:3000/setup`) รันตัวติดตั้งใหม่อีกครั้งโดยไม่ใช้ `--no-nginx` เมื่อมี DNS แล้ว ## Docker และ Kubernetes {#docker-and-kubernetes} ไม่มีการเผยแพร่ container image โดยตัวติดตั้ง (การติดตั้ง systemd แบบเนทีฟ) เป็นวิธีการติดตั้งเดียวที่รองรับ ## ตรวจสอบ {#verify} ```bash sudo nexcmp status ``` คุณควรเห็นเวอร์ชัน, `nexcmp: active`, `nexcmp-vmd: active`, `healthz: ok` และรหัสติดตั้ง (จนกว่าตัวช่วยตั้งค่าจะเสร็จสิ้น) ดำเนินการต่อด้วย [ตัวช่วยตั้งค่า](https://nexcmp.com/th/docs/getting-started/setup-wizard/) หากมีข้อผิดพลาดเกิดขึ้น โปรดดู [ข้อผิดพลาดในการติดตั้ง](https://nexcmp.com/th/docs/troubleshooting/installation-errors/) --- # DNS และ Cloudflare {#dns-and-cloudflare} NexCMP ต้องการชื่อ DNS หนึ่งชื่อ คือ **โดเมนหลัก** ของตน และทำงานในสองโหมด ## โหมด A: DNS ชี้ตรงไปยังเซิร์ฟเวอร์ {#mode-a-dns-points-straight-at-the-server} 1. สร้างเรคอร์ด **A** `cloud.example.com → ` (และเรคอร์ด **AAAA** หากเซิร์ฟเวอร์มี IPv6) 2. ทางเลือก หากคุณใช้งาน: `admin.cloud.example.com` และ `partner.cloud.example.com` ชี้ไปยัง IP เดียวกัน 3. รัน (หรือรันซ้ำ) [ตัวติดตั้ง](https://nexcmp.com/th/docs/getting-started/installation/) โดยระบบจะตรวจสอบว่าชื่อนั้นชี้ไปยัง IP สาธารณะของเซิร์ฟเวอร์เอง และขอใบรับรอง Let's Encrypt ผ่าน HTTP-01 ชาเลนจ์บนพอร์ต 80 ## โหมด B: โดเมนถูกพร็อกซีโดย Cloudflare {#mode-b-the-domain-is-proxied-by-cloudflare} สร้างเรกคอร์ดเดียวกันโดยใช้คลาวด์สีส้ม (**Proxied**) โปรแกรมติดตั้งจะตรวจพบว่าชื่อชี้ไปยังแอดเดرسของ Cloudflare เท่านั้น และจะสลับไปยังโหมด Cloudflare: - nginx ยังคงรันและฟังพอร์ต 80/443 บนเซิร์ฟเวอร์ของคุณ; - IP จริงของผู้เยี่ยมชมจะถูกอ่านจากเฮดเดอร์ `CF-Connecting-IP` — **เฉพาะ** สำหรับการเชื่อมต่อที่มาจากช่วงไอพีที่ Cloudflare ประกาศใช้งานเท่านั้น ดังนั้นจึงไม่สามารถปลอมแปลงโดยบุคคลอื่นได้; - ใบรับรองจะออกผ่าน Let's Encrypt (Cloudflare จะส่งต่อคำขอท้าทายไปยังต้นทางของคุณ); หากยังไม่สามารถทำได้ในตอนนี้ ระบบจะสร้าง **self-signed origin certificate** ขึ้นมาเพื่อให้โหมด "Full" ทำงานได้ และการรันโปรแกรมติดตั้งใหม่อีกครั้งในภายหลังจะอัปเกรดเป็น Let's Encrypt คุณสามารถบังคับใช้โหมดนี้ได้ด้วย `--behind-cloudflare` ::: important ตั้งค่าโหมด SSL/TLS ใน Cloudflare ใน Cloudflare ให้ไปที่ **SSL/TLS › Overview** และเลือก **Full (strict)** ทันทีที่โปรแกรมติดตั้งรายงานว่ามีใบรับรอง Let's Encrypt แล้ว สำหรับ self-signed origin certificate ให้ใช้ **Full** ส่วน **Flexible** จะทำให้เกิดลูปการเปลี่ยนเส้นทาง ::: ::: tip หากเปิดใช้งาน "Always Use HTTPS" อยู่ Cloudflare จะส่งคำขอตรวจสอบความถูกต้องไปยังพอร์ต 443 ของต้นทางคุณ โปรแกรมติดตั้งจะจัดการเรื่องนี้โดยการสร้างใบรับรองแบบลงนามด้วยตนเองชั่วคราวก่อน จากนั้นจึงลองใหม่อีกครั้งกับ Let's Encrypt ::: ## ตรวจสอบการทำงาน {#check-it} ```bash dig +short cloud.example.com # A record (a Cloudflare address in mode B) curl -I https://cloud.example.com/healthz sudo certbot certificates # certificate name, domains and expiry ``` ใบรับรองจะต่ออายุโดยอัตโนมัติด้วยตัวจับเวลาของ certbot การต่ออายุจะใช้เว็บรูท `/var/www/nexcmp-acme` ดังนั้นพอร์ต 80 จึงต้องสามารถเข้าถึงได้ (โดยตรงหรือผ่าน Cloudflare) ## ปัญหาที่พบบ่อย {#common-problems} | อาการ | สาเหตุ | วิธีแก้ปัญหา | |---|---|---| | โปรแกรมติดตั้งแจ้งว่า "DNS … does not point to … (nor to Cloudflare) — skipping nginx/TLS" | เรกคอร์ด DNS หายไป ไม่ถูกต้อง หรือยังไม่แพร่กระจาย | แก้ไขเรกคอร์ด รอให้ระบบแพร่กระจาย แล้วรันโปรแกรมติดตั้งใหม่อีกครั้ง | | เบราว์เซอร์แสดง `ERR_TOO_MANY_REDIRECTS` เมื่ออยู่เบื้องหลัง Cloudflare | โหมด SSL คือ **Flexible** | ตั้งค่าเป็น **Full (strict)** (หรือ **Full**) | | ข้อผิดพลาด Cloudflare 525/526 | ใบรับรองต้นทางถูกปฏิเสธ | ใช้ **Full** ร่วมกับ self-signed origin certificate หรือ **Full (strict)** ร่วมกับ Let's Encrypt | | ไอพีของผู้เยี่ยมชมทุกคนในบันทึก (logs) กลายเป็นไอพีของ Cloudflare | ไม่ได้อยู่ในโหมด Cloudflare | รันโปรแกรมติดตั้งใหม่อีกครั้งด้วย `--behind-cloudflare` | ดูข้อมูลเพิ่มเติมได้ที่ [Installation errors](https://nexcmp.com/th/docs/troubleshooting/installation-errors/) --- # ตัวช่วยสร้างการติดตั้ง {#setup-wizard} > **ตำแหน่งในหน้าผู้ดูแลระบบ:** ตัวช่วยสร้างนี้เป็นหน้าเดี่ยวที่ `/setup` ซึ่งจะแสดงเฉพาะจนกว่าจะมีผู้ดูแลระบบคนแรกเกิดขึ้น หลังจากนั้นการตรวจสอบแบบเดียวกันจะย้ายไปอยู่ที่ System › Admin › Start (`/setup`) ตัวช่วยสร้างนี้จะเปลี่ยนการติดตั้งใหม่ให้กลายเป็นแผงควบคุมที่พร้อมใช้งานภายในสี่ขั้นตอนสั้นๆ โดยจะให้บริการบนพอร์ต 3000 (`http://:3000/setup`) หรือหากเปิดใช้งาน TLS แล้ว จะอยู่ที่ `https:///setup` ::: warning ตัวช่วยสร้างจะหายไปหลังขั้นตอนที่ 3 เมื่อสร้างผู้ดูแลระบบเสร็จแล้ว ตัวช่วยสร้างจะถูกปิดและรหัสติดตั้งจะถูกลบออก หากต้องการเข้าถึงแผงควบคุมหลังจากนั้นให้ใช้คอนโซลผู้ดูแลระบบ ::: ## ขั้นตอนที่ 0 — รหัสติดตั้ง {#step-0-—-setup-code} โปรแกรมติดตั้งจะแสดง **รหัสติดตั้งแบบใช้ครั้งเดียว** ไว้ที่ตอนท้าย คุณสามารถอ่านรหัสนี้อีกครั้งได้ด้วยคำสั่ง: ```bash sudo nexcmp status ``` วางรหัสลงในช่อง **Setup code** แล้วคลิก **Continue** รหัสนี้ช่วยปกป้องตัวช่วยสร้าง: ไม่มีใครที่พบพอร์ตที่เปิดอยู่จะสามารถสร้างผู้ดูแลระบบได้โดยไม่มีรหัสนี้ ![ขั้นตอนที่ 0 ของตัวช่วยตั้งค่าที่ขอรหัสตั้งค่าแบบใช้งานครั้งเดียว](https://nexcmp.com/th/docs/images/getting-started/setup-wizard-00-code.webp) ## Step 1 — License {#step-1-—-license} | ฟิลด์ | ค่า | |---|---| | License key | `NXC-XXXXX-XXXXX-XXXXX-XXXXX` — เปิดใช้งานล่วงหน้าโดยตัวติดตั้ง ดังนั้นขั้นตอนนี้จึงมักจะแสดงว่า "Activated for cloud.example.com" | | โดเมนหลัก | โดเมนที่ลงทะเบียนบนไลเซนส์ | หากตัวติดตั้งเปิดใช้งานไลเซนส์แล้ว ตัววิซาร์ดจะจดจำและดำเนินการต่อ ไม่เช่นนั้นให้ป้อนคีย์และโดเมนแล้วคลิก **Activate** ข้อผิดพลาดจะแสดงเป็นสีแดง — ดูที่ [Installation errors](https://nexcmp.com/th/docs/troubleshooting/installation-errors/) ![ขั้นตอนที่ 1 ของตัววิซาร์ดการติดตั้งที่แสดงว่าไลเซนส์ถูกเปิดใช้งานสำหรับโดเมนหลักแล้ว](https://nexcmp.com/th/docs/images/getting-started/setup-wizard-01-license.webp) ## ขั้นตอนที่ 2 — CloudStack (หรือเชื่อมต่อภายหลัง) {#step-2-—-cloudstack-or-connect-later} คุณมีสองตัวเลือก: - **เชื่อมต่อตอนนี้** ป้อน CloudStack **API URL** (`https://cloudstack.example.com/client/api`), **API key** และ **Secret key** คลิก **Test connection** จากนั้นเลือก **Zone**, **Guest network for customer VMs**, **Zone display name** และรหัส **Country** สองตัวอักษร คลิก **Save CloudStack** - **เชื่อมต่อภายหลัง** คลิก **Connect later** ทุกอย่างส่วนที่เหลือจะยังทำงานได้ คุณสามารถเชื่อมต่อ CloudStack หรือ Proxmox VE ภายหลังได้ที่ Infrastructure จนกว่าจะถึงเวลานั้น แผงสถานะสุขภาพจะแจ้งเตือนคุณว่ายังไม่ได้เชื่อมต่อแหล่งข้อมูลใด ![ขั้นตอนที่ 2 ของตัววิซาร์ดที่มีฟิลด์ CloudStack API URL, API key และ secret key ที่กรอกค่าตัวอย่างไว้](https://nexcmp.com/th/docs/images/getting-started/setup-wizard-02-cloudstack-form.webp) ::: important ใช้บัญชี CloudStack แยกต่างหาก อย่าใช้คีย์ผู้ดูแลระบบ ROOT ให้สร้างโดเมนและบัญชีแยกต่างหากสำหรับ NexCMP และใช้ API key ของบัญชีนั้น — ดูที่ [CloudStack](https://nexcmp.com/th/docs/infrastructure/cloudstack/#create-a-dedicated-account-and-api-key) ตัววิซาร์ดจะตรวจสอบว่าเน็ตเวิร์กที่เลือกนั้นเป็นของโซนและบัญชีของคีย์ดังกล่าว ::: ![หลังจากการ Test connection: รายการโซนและเกสต์เน็ตเวิร์ก ฟิลด์ชื่อแสดงโซนและประเทศ](https://nexcmp.com/th/docs/images/getting-started/setup-wizard-02b-cloudstack-picked.webp) หากคุณวางแผนที่จะใช้ **Proxmox VE** เท่านั้น ให้เลือก **Connect later** และทำตาม [Proxmox VE](https://nexcmp.com/th/docs/infrastructure/proxmox/) ## ขั้นตอนที่ 3 — ผู้ดูแลระบบและแบรนด์ {#step-3-—-administrator-and-brand} | ฟิลด์ | กฎ | |---|---| | อีเมลผู้ดูแลระบบ (เข้าสู่ระบบ) | ที่อยู่อีเมลที่ถูกต้อง นี่คือชื่อผู้ใช้ผู้ดูแลระบบของคุณ | | รหัสผ่าน | อย่างน้อย 12 ตัวอักษร ประกอบด้วยตัวอักษรและตัวเลข | | ชื่อแบรนด์ | แสดงให้ลูกค้าของคุณเห็น (ค่าเริ่มต้นคือ "Cloud") สูงสุด 60 ตัวอักษร | | อีเมลซัพพอร์ต | ค่าเริ่มต้นคืออีเมลผู้ดูแลระบบ | ![ขั้นตอนที่ 3 ของตัววิซาร์ดพร้อมอีเมลผู้ดูแลระบบ, รหัสผ่าน, ชื่อแบรนด์ และอีเมลซัพพอร์ต](https://nexcmp.com/th/docs/images/getting-started/setup-wizard-03-admin.webp) คลิก **Finish setup** แผงควบคุมจะรีสตาร์ท (ประมาณ 1–2วินาที) และหน้าเว็บจะนำคุณไปยังหน้าเข้าสู่ระบบผู้ดูแลระบบที่ `https:///admin/` หากที่อยู่นั้นยังไม่ตอบสนอง (DNS หรือ TLS กำลังรออยู่) ระบบจะนำคุณไปยัง `/` บนที่อยู่ปัจจุบันแทน ![ตัววิซาร์ดหลังจากเสร็จสิ้นพร้อมข้อความว่าแผงควบคุมกำลังรีสตาร์ท](https://nexcmp.com/th/docs/images/getting-started/setup-wizard-03-done.webp) ## สิ่งที่ตัววิซาร์ดตั้งค่าให้คุณ {#what-the-wizard-sets-up-for-you} - ชื่อแบรนด์, URL เว็บไซต์ (`https://`), URL ผู้ดูแลระบบ (`https:///admin`), URL คอนโซล (`https:///console`), อีเมลซัพพอร์ต และชื่อผู้ส่ง - การตั้งค่าเริ่มต้นสำหรับโมดูลที่มาพร้อมกับ NexCMP: DDoS & BGP, AI และเว็บ SSH จะถูก **ปิด** ไว้ ส่วนการวัดปริมาณการใช้งานแบนด์วิดท์จะถูก **เปิด** ไว้ ดูที่ [Modules](https://nexcmp.com/th/docs/infrastructure/modules/) - หากคุณเชื่อมต่อ CloudStack: ผู้ให้บริการรายที่ #1, โซนแรก, เกสต์เน็ตเวิร์ก และคีย์คู่สำหรับการดำเนินงานที่แนบกับ VM ของลูกค้าเพื่อให้คุณสามารถช่วยเหลือพวกเขาได้ ถัดไป: [First login](https://nexcmp.com/th/docs/getting-started/first-login/) --- # First login และขั้นตอนถัดไป {#first-login-and-next-steps} > **ตำแหน่งในระบบผู้ดูแล:** หน้าเข้าสู่ระบบคือ `/admin`; หลังจากเข้าสู่ระบบแล้ว หน้าแรกคือ Overview › Dashboard. ## ที่อยู่ {#addresses} | สิ่งที่ต้องทำ | URL | |---|---| | พอร์ทัลลูกค้า | `https:///` | | คอนโซลผู้ดูแล | `https:///admin` | | ติดตั้ง / กรณีฉุกเฉินด้วย IP | `http://:3000/` (ดู [พอร์ตของแผงควบคุม](https://nexcmp.com/th/docs/getting-started/installation/#the-panel-port-3000)) | | ตรวจสอบความสมบูรณ์ | `https:///healthz` | ## เข้าสู่ระบบ {#sign-in} 1. เปิด `https:///admin` 2. ป้อนอีเมลและรหัสผ่านของผู้ดูแลระบบที่คุณสร้างไว้ในตัวช่วยติดตั้ง 3. คุณจะเข้ามาสู่ **Dashboard** แบนเนอร์ที่ด้านบนจะปรากฏขึ้นหากไลเซนส์ไม่ถูกต้องหรือยังไม่ได้เชื่อมต่อ Source ![หน้าเข้าสู่ระบบของผู้ดูแลระบบ](https://nexcmp.com/th/docs/images/getting-started/first-login-01-login.webp) ## รายการตรวจสอบที่แนะนำ {#recommended-checklist} ทำตามลำดับเหล่านี้ — แต่ละรายการจะมีลิงก์ไปยังหน้าของตนเอง | # | งาน | หน้า | |---|---|---| | 1 | เปิดใช้งานการยืนยันตัวตนแบบสองขั้นตอนสำหรับตัวคุณเอง | [Security](https://nexcmp.com/th/docs/administration/security/) | | 2 | เชื่อมต่อโครงสร้างพื้นฐาน Source (หากคุณเลือก "Connect later") | [CloudStack](https://nexcmp.com/th/docs/infrastructure/cloudstack/) หรือ [Proxmox VE](https://nexcmp.com/th/docs/infrastructure/proxmox/) | | 3 | ตรวจสอบโซนและเทมเพลตเครื่อง / รายการ OS | [Zones](https://nexcmp.com/th/docs/infrastructure/zones/), [Templates](https://nexcmp.com/th/docs/infrastructure/templates/) | | 4 | ตรวจสอบแพ็กเกจและราคา | [Plans](https://nexcmp.com/th/docs/catalog/plans/) | | 5 | ตั้งค่าโลโก้ สี และหน้าข้อกฎหมายของคุณ | [Branding](https://nexcmp.com/th/docs/customers/branding/), [Legal](https://nexcmp.com/th/docs/customers/legal/) | | 6 | กำหนดค่าอีเมลขาออกและส่งข้อความทดสอบ | [SMTP and emails](https://nexcmp.com/th/docs/administration/smtp-and-emails/) | | 7 | เปิดใช้งานช่องทางการชำระเงินอย่างน้อยหนึ่งช่องทางและทดสอบการเติมเงิน | [Payment channels](https://nexcmp.com/th/docs/billing/payment-channels/) | | 8 | ตัดสินใจว่าโมดูลใดที่คุณต้องการขาย | [Modules](https://nexcmp.com/th/docs/infrastructure/modules/) | | 9 | ทำการสั่งซื้อทดสอบในฐานะลูกค้าและลบออก | [Ordering](https://nexcmp.com/th/docs/portal/ordering/) | | 10 | ทำการสำรองข้อมูลครั้งแรก | [Backup and restore](https://nexcmp.com/th/docs/getting-started/backup-and-restore/) | ## สร้างคำสั่งซื้อแรกของคุณ (ทดสอบระบบเบื้องต้น) {#create-your-first-order-smoke-test} 1. เปิดพอร์ทัลลูกค้าในหน้าต่างแบบส่วนตัวและลงทะเบียนบัญชีทดสอบ 2. เพิ่มเครดิต (ใช้บัตรกำนัลหรือการชำระเงินทดสอบ) 3. สั่งซื้อแพ็กเกจที่เล็กที่สุดในโซนของคุณ 4. ดูว่าปรากฏในระบบผู้ดูแลภายใต้ Services › Virtual Machines, เปิดคอนโซล จากนั้นลบเครื่องนั้นทิ้ง หาก VM ไม่เปลี่ยนเป็นสถานะ *running*, ให้เปิด **Infrastructure › Cloud provider › Sync & errors** แล้วอ่านข้อผิดพลาด --- # การอัปเดต NexCMP {#updating-nexcmp} > **ตําแหน่งในระบบผู้ดูแล:** System › Admin › License & updates (`/license`) → การ์ด *Update* ## สิ่งที่คุณได้รับ {#what-you-receive} | ประเภทการเผยแพร่ | ส่งมอบเมื่อ | |---|---| | แพทช์ความปลอดภัย | **เสมอ** แม้ว่าจะเลยวันที่ "อัปเดตได้ถึง" ของคุณไปแล้วก็ตาม | | การปล่อยฟีเจอร์ใหม่ | เฉพาะกรณีที่เผยแพร่ **ในหรือก่อน** วันที่ "อัปเดตได้ถึง" ของคุณ | คุณสามารถดูวันที่ทั้งสองได้ที่ **License & updates** ต่ออายุสิทธิ์การใช้งานได้ที่ [nexcmp.com/licenses](https://nexcmp.com/licenses) ## อัปเดตจากคอนโซลผู้ดูแลระบบ {#update-from-the-admin-console} 1. เปิด **System › Admin › License & updates** 2. ในการ์ด **Update** ให้คลิก **Check for update** การ์ดจะแสดงเวอร์ชันปัจจุบัน เวอร์ชันใหม่ที่สุดที่คุณสามารถติดตั้งได้ แท็ก *security* เมื่อมี และบันทึกการเปลี่ยนแปลง 3. คลิก **Update to X.Y.Z** และยืนยัน โปรแกรมจะดาวน์โหลดไฟล์รีลีส ตรวจสอบ **ลายเซ็น SHA-256 และ Ed25519** แทนที่ไฟล์ไบนารีแบบอะตอมิก (โดยเก็บสำเนา `.bak` ไว้) และรีสตาร์ท คาดว่าจะใช้เวลาหยุดทำงานประมาณ **10 วินาที** 4. รีโหลดหน้าเว็บและตรวจสอบเวอร์ชันที่มุมขวาบนของ License & updates ![การ์ด Update ที่แสดงเวอร์ชันที่กำลังทำงานและปุ่ม Check for new version](https://nexcmp.com/th/docs/images/getting-started/updating-01-card.webp) ## อัปเดตจากบรรทัดคำสั่ง {#update-from-the-command-line} ```bash sudo nexcmp update ``` การดำเนินการนี้จะรันตัวติดตั้งที่มาพร้อมกับ *เวอร์ชันที่ติดตั้งอยู่ปัจจุบัน* (ไม่ใช่สคริปต์ที่ดาวน์โหลดในขณะนั้น) พร้อมกับพารามิเตอร์ที่บันทึกไว้จาก `/etc/nexcmp/install.conf` ซึ่งจะรีเฟรชไฟล์ไบนารี หน่วยความจำของ systemd เทมเพลต nginx และโหนดเอเจนต์ โดยยังคงรักษาข้อมูล การตั้งค่า และบัญชีไว้ ::: tip ไม่มีการลดระดับเวอร์ชัน หากเซิร์ฟเวอร์เสนอเวอร์ชันที่เก่ากว่าเวอร์ชันที่กำลังทำงานอยู่ ตัวติดตั้งจะคงเวอร์ชันปัจจุบันไว้ ::: ## ก่อนที่คุณจะอัปเดต {#before-you-update} 1. สำรองข้อมูล: `sudo nexcmp backup` — ดูที่ [Backup and restore](https://nexcmp.com/th/docs/getting-started/backup-and-restore/) 2. อ่านบันทึกการเปลี่ยนแปลงในแท็บ Update สำหรับการเปลี่ยนแปลงตั้งแต่ 1.3 โปรดดู [บันทึกประจำรุ่นจนถึง 1.6.1](https://nexcmp.com/th/docs/getting-started/release-notes/) รวมถึงการอัปเดต VPN agent และกฎราคา Bare Metal 3. ทำการอัปเดตในช่วงเวลาที่มีการใช้งานน้อย เครื่องเสมือนที่กำลังทำงานอยู่จะไม่ได้รับผลกระทบ แต่ลูกค้าจะไม่สามารถใช้งานพอร์ทัลได้ชั่วขณะ ## หลังจากที่คุณอัปเดต {#after-you-update} - รัน `sudo nexcmp status` และยืนยันว่าบริการทั้งสองทำงานอยู่ - เปิดหน้าแดชบอร์ดของผู้ดูแลระบบและหน้า **Needs attention** - การไมเกรตฐานข้อมูลจะทำงานโดยอัตโนมัติเมื่อเริ่มต้นเวอร์ชันใหม่เป็นครั้งแรก - หากคุณใช้งานโหนด VPN ให้อัปเดตเอเจนต์แยกต่างหากและตรวจสอบค่าวัดปริมาณการใช้งาน การอัปเดตแผงควบคุมทำให้มีเอเจนต์ตัวใหม่พร้อมใช้งาน แต่ไม่ได้หมายความว่าโหนดระยะไกลทุกโหนดจะรันเอเจนต์ใหม่แล้วโดยอัตโนมัติ ดูที่ [โควตาเน็ตโหนด VPN](https://nexcmp.com/th/docs/infrastructure/vpn-proxy-nodes/#data-allowance-on-a-vpn-node) หากการอัปเดตล้มเหลว โปรดดู [Update errors](https://nexcmp.com/th/docs/troubleshooting/update-errors/) --- # บันทึกประจำรุ่น {#release-notes} > **ตำแหน่งในส่วนผู้ดูแลระบบ:** System › Admin › License & updates (`/license`) ในส่วนการ์ด **Update** บันทึกเหล่านี้ครอบคลุมการเปลี่ยนแปลงหลังเวอร์ชัน 1.3 จนถึง **NexCMP 1.6.1** โปรดสำรองข้อมูลก่อนอัปเดต และใช้เวอร์ชันที่ระบุในการ์ด **Update** ของระบบที่คุณติดตั้ง ดู [การอัปเดต NexCMP](https://nexcmp.com/th/docs/getting-started/updating/) สำหรับคำสั่งและการตรวจสอบลายเซ็น ## 1.6.1 - **การวัดผล Bare Metal:** หน้า **Overview** ของลูกค้าจะแสดงไทล์ CPU, RAM, การทำงานของดิสก์ และเครือข่ายพร้อมประวัติล่าสุด หากไม่มีค่าวัดจะแสดงเครื่องหมายขีดพร้อมเหตุผล ทั้งนี้การอ่านค่าเครือข่ายต้องใช้ตัวนับทราฟฟิก โดยไม่ได้อนุมานจากฮาร์ดแวร์คงคลังของ iDRAC - **แผนตัวอย่าง Bare Metal:** ชื่อตัวอย่างใช้ `BM-40C-` แผนตัวอย่างในตัวที่คุณยังไม่ได้แก้ไขจะได้รับชื่อที่เป็นกลาง แผนที่แก้ไขแล้วจะยังคงอยู่ และแผนที่มีการอ้างอิงจะยังคงรหัสเดิมไว้ ตรวจสอบฮาร์ดแวร์เซิร์ฟเวอร์จริงก่อนตั้งค่าให้แผนพร้อมจำหน่าย - **การเปลี่ยนแปลงแผน:** รายการคำขอของผู้ดูแลระบบจะจัดเรียงที่ฝั่งเซิร์ฟเวอร์ และคงปุ่มการดำเนินการให้มองเห็นได้เสมอขณะเลื่อนหน้าจอตามแนวนอน - **รายงานข้อผิดพลาด:** แบบฟอร์มสามารถเลื่อนได้โดยที่ปุ่มต่างๆ ยังคงแสดงอยู่เสมอ การปิดบังรหัสผ่านจะยังคงข้อความการวินิจฉัยโดยรอบไว้ - **การโหลด:** ทรัพยากรของหน้าเว็บและข้อมูลผู้ดูแลระบบที่ใช้งานบ่อยจะถูกโหลดเร็วขึ้นเพื่อลดความล่าช้าในการสลับหน้า ดูที่ [การตั้งค่า Bare Metal ราคา และการควบคุมของลูกค้า](https://nexcmp.com/th/docs/infrastructure/dedicated/) และ [รายงานข้อผิดพลาด](https://nexcmp.com/th/docs/administration/report-a-bug/) ## 1.6.0 - **การตั้งค่า Bare Metal:** ป้อนเครือข่าย iDRAC, ที่อยู่เซิร์ฟเวอร์ ISO และที่อยู่ callback ของแผงควบคุมใน **Safety › Management network connection** ค่าตัวอย่างจะระงับการทำงานจริงจนกว่าจะกำหนดค่าเสร็จสมบูรณ์ - **โฮสติ้ง ISO:** `sudo nexcmp dedicated-setup-iso` ใช้ตั้งค่าเว็บเซิร์ฟเวอร์ ISO สำหรับเครือข่ายการจัดการ ตัวติดตั้งสามารถติดตั้งคอนโซลและเครื่องมือ ISO ด้วย `--baremetal` หรือตัวเลือก ISO หากเครื่องมือไม่ครบจะระงับการทำงานจริงด้วย `tools_missing` - **ราคา Bare Metal:** การติดตั้งใหม่หรือยังไม่เคยใช้งานจะเริ่มต้นด้วยราคา USD ส่วนระบบเดิมที่มีข้อมูลราคาเป็น VND อยู่แล้วจะคงสกุลเงิน VND ไว้และยังคงต้องใช้อัตราแลกเปลี่ยน USD/VND การอัปเดตจะไม่แปลงราคาที่มีอยู่เดิมเหล่านั้นเป็นดอลลาร์ - **หน้าเซิร์ฟเวอร์ของลูกค้า:** ต่ออายุล่วงหน้า กำหนดเวลาเปลี่ยนรอบบิล ส่งคำขอเปลี่ยนแผน ตรวจสอบใบแจ้งหนี้ และดูข้อมูลเข้าสู่ระบบ OS หลังการติดตั้ง โดยเจ้าของใหม่จะไม่สามารถเห็นรหัสผ่านของเจ้าของเดิมได้ - **โปรไฟล์ลูกค้า:** แบ่งเป็น 8 แท็บ ได้แก่ ภาพรวม บริการ การเรียกเก็บเงิน โควตา ความปลอดภัย ฝ่ายสนับสนุน พันธมิตร และบันทึกการใช้งาน โดยบริการต่างๆ จะรวมอยู่ในตารางเดียวที่ค้นหาและจัดเรียงได้ - **การดำเนินการกับบริการ:** การล็อก, การปลดล็อก, การยกเลิกโดยไม่คืนเงิน หรือการยกเลิกพร้อมคืนเงิน จะใช้หน้าต่างโต้ตอบร่วมกัน การคืนเงินจะกลับไปยัง wallet หรือการจัดสรรเครดิตเดิม โดยไม่มีการคืนเงินผ่าน payment processor โดยอัตโนมัติ ดู [Dedicated servers](https://nexcmp.com/th/docs/infrastructure/dedicated/) และ [Managing customers](https://nexcmp.com/th/docs/customers/managing-customers/) การใช้ BYOIP และการเชื่อมต่อ subnet ของลูกค้าเข้ากับเซิร์ฟเวอร์ Bare Metal ยังคงไม่รองรับใน NexCMP ## 1.5.2 ผู้ดูแลระบบหลักสามารถเปิด **Report a bug** ข้าง **Docs** และส่ง ticket ไปยังบัญชี license ได้โดยไม่ต้องเข้าสู่ระบบแยกต่างหาก ข้อมูลการวินิจฉัยเป็นแบบระบุหรือไม่ก็ได้ ทั้งนี้ staff, ลูกค้า และผู้ช่วย AI ไม่สามารถส่งรายงานผ่านการดำเนินการนี้ได้ ดู [Report a bug](https://nexcmp.com/th/docs/administration/report-a-bug/) ## 1.5.1 - **การใช้งาน VPN:** โหนด agent จะรายงานทราฟฟิกไปยัง panel แพ็กเกจสมาชิกที่ใช้โควตา GB จนหมดจะถูกตัดการใช้งาน และจะกลับมาใช้งานได้อีกครั้งหลังจากการอัปเกรดแบนด์วิดท์หรือเริ่มรอบบิลใหม่ โหนดที่ไม่มีรายงานการใช้งานจะแสดง **Not measured** และจะไม่ถูกตัดการเชื่อมต่อตาม GB - **VPN agent:** เวอร์ชัน 1.5.1 จะลองส่งข้อมูลการใช้งานที่ไม่ได้รับการตอบรับซ้ำ ส่งทราฟฟิกรอบสุดท้ายเมื่อปิดระบบ และปิดการเชื่อมต่อที่เปิดอยู่เมื่อ endpoint หยุดทำงาน โปรดอัปเดต remote agent ควบคู่ไปกับ panel - **Add-on ของ VPN ที่ยกเลิกแล้ว:** High IP Reputation, High Concurrency และ High Priority Network ไม่มีการเปิดขายอีกต่อไป ค่าบริการจะถูกตัดออกจากยอดต่ออายุในอนาคตของแพ็กเกจสมาชิกที่มีอยู่เดิม โดยไม่มีการคืนเงินสำหรับรอบบิลที่ผ่านมา หาก add-on ถูกลบออกจากแคตตาล็อก โปรดตรวจสอบยอดต่ออายุด้วยตนเอง - **ป้ายกำกับโปรโตคอล:** IPv4 HTTP proxy เป็นแบบ plain HTTP โดยที่อยู่ IPv4 จะไม่มีการ rotate พอร์ต 443 ของ IPv6 proxy จะให้บริการ SOCKS5 ซึ่งไม่ใช่ HTTPS proxy endpoint - **การติดตั้งใหม่:** การเริ่มต้นฐานข้อมูลจะลองจัดการข้อขัดแย้งการย้ายข้อมูล (migration) ชั่วคราวระหว่าง panel กับ worker ใหม่อัตโนมัติ ทำให้การบันทึก provider รายแรกไม่จำเป็นต้องรีสตาร์ตระบบ ดู [VPN and IPv6 proxy nodes](https://nexcmp.com/th/docs/infrastructure/vpn-proxy-nodes/) ## 1.5.0 **AI Models** เป็นโมดูล gateway และการเรียกเก็บเงินเสริม ซึ่งปิดใช้งานตามค่าเริ่มต้น เพิ่มแหล่งโมเดลที่คุณดำเนินการเองหรือได้รับสิทธิ์ในการขายต่อ ซิงค์โมเดล กำหนดราคาและเส้นทาง เปิดใช้งานโมเดล จากนั้นจึงเปิดการขาย ระบบไม่ได้รวมบัญชีผู้ให้บริการ โมเดล หรือราคามาให้ และแยกการทำงานออกจากโมดูล AI Chat และ AI Agent ดู [AI Models](https://nexcmp.com/th/docs/infrastructure/ai-models/) ## 1.4.2 การติดตั้งโหนด IPv6 proxy จะใช้ daemon และสคริปต์เครือข่ายที่จัดส่งมาในแพ็กเกจรีลีส โดย panel จำเป็นต้องใช้ `sshpass` สำหรับการติดตั้ง SSH ด้วยรหัสผ่าน panel จะรันกำหนดการ rotate และการตั้งค่าโหนดจะแยกที่อยู่เกตเวย์ออกจากการจัดสรร คุณสามารถตั้งชื่อที่แสดงของบริการ VPN แบบกำหนดเองได้ในการตั้งค่าแบรนด์ ดู [VPN and IPv6 proxy nodes](https://nexcmp.com/th/docs/infrastructure/vpn-proxy-nodes/) ## 1.4.0–1.4.1 - **การดูแลระบบด้วย AI:** มีระบบ admin AI Chat, บัญชี AI ส่วนตัว, admin API keys, admin MCP server, ตัวเชื่อมต่อ OAuth, การนำเข้า/ส่งออกการกำหนดค่า และรายการตรวจสอบการตั้งค่าพร้อมให้ใช้งาน ดู [Configure with AI](https://nexcmp.com/th/docs/configure-with-ai/overview/) - **การอนุญาตสิทธิ์การใช้งาน:** เวิร์กโฟลว์ของ Free และ Source รองรับทั้งบิลด์ทางการและบิลด์ซอร์สแบบกำหนดเอง บัญชีผู้ใช้, licensing, การดาวน์โหลด และเอกสารประกอบจะใช้ `nexcmp.com` ดู [License and purchase](https://nexcmp.com/th/docs/getting-started/license-and-purchase/) - **ลิงก์เอกสารประกอบ:** **Docs** ในระบบผู้ดูแลจะเปิดคู่มือสำหรับหน้าปัจจุบัน - **สกุลเงิน:** การติดตั้งใหม่จะอิงตามภาษาของลูกค้าตามค่าเริ่มต้น อัตราแลกเปลี่ยน USD/VND ดึงมาจากตารางอัตราแลกเปลี่ยนสาธารณะหรืออัตราคงที่ที่คุณกำหนด ดู [Currency and exchange rates](https://nexcmp.com/th/docs/catalog/currency-and-exchange-rates/) - **โซนแบบหลายแหล่งที่มา:** ราคา Cloud Server สาธารณะจะใช้งานได้เมื่อ CloudStack และ Proxmox VE ใช้งานโซนร่วมกัน โดยแพ็กเกจจะใช้แหล่งโครงสร้างพื้นฐานของตนเอง - **ราคาที่คำนวณจาก offerings:** เปอร์เซ็นต์คือมาร์จินบนราคาขาย มาร์จิน 40% จากต้นทุน $60 จะได้ราคา $100 ก่อนการปัดเศษ ## รายการตรวจสอบการอัปเกรด {#upgrade-checklist} 1. สำรองข้อมูล, อ่านการ์ด **Update**, อัปเดต และรัน `sudo nexcmp status` 2. อัปเดต VPN agent และตรวจสอบให้แน่ใจว่าโหนดรายงานปริมาณทราฟฟิกที่วัดได้ ก่อนที่จะอิงตามการตัดการเชื่อมต่อตาม GB 3. หากใช้งาน Bare Metal โปรดตรวจสอบฟิลด์เครือข่ายการจัดการ, เครื่องมือที่จำเป็น, หน่วยราคา, เทมเพลต และตัวอย่างแพ็กเกจ ก่อนเปิดการขายหรือเริ่มให้บริการจริง 4. เปิดโปรไฟล์ลูกค้าและตรวจสอบรายการบริการของลูกค้า ตรวจสอบจำนวนเงินและการจัดสรรการชำระเงินเดิมก่อนยืนยันการยกเลิกพร้อมคืนเงิน 5. ปิดโมดูลเสริมไว้ก่อนจนกว่าโครงสร้างพื้นฐานจะพร้อม สำหรับ AI Models ให้ตรวจสอบผู้ให้บริการ โมเดลที่มีราคา และคำขอทดสอบของลูกค้าที่สำเร็จก่อนเปิดขาย --- # สำรองและกู้คืนข้อมูล {#backup-and-restore} > **ตำแหน่งในหน้าผู้ดูแลระบบ:** System › Admin › Backup (`/backup`) จะปรากฏขึ้นเมื่อเปิดใช้งานโมดูล DDoS & BGP เท่านั้น สำหรับการติดตั้งมาตรฐาน ให้ใช้คำสั่งด้านล่างนี้ ## สิ่งที่ได้รับการสำรองข้อมูล {#what-is-backed-up} `sudo nexcmp backup` จะสร้างไฟล์เก็บถาวรที่บีบอัดแล้วหนึ่งชุด ซึ่งประกอบด้วย: | ส่วน | เนื้อหา | |---|---| | `data/**/*.db` | ฐานข้อมูล SQLite ทุกฐานใน `/var/lib/nexcmp` ที่คัดลอกด้วย API การสำรองข้อมูลออนไลน์ของ SQLite — มีความสม่ำเสมอแม้ในขณะที่แผงควบคุมกำลังทำงานอยู่ | | `files.tar` | ไฟล์อื่นๆ ทั้งหมดใน `/var/lib/nexcmp` (ไฟล์การตั้งค่า, การอัปโหลดการสร้างแบรนด์, `secrets/`) ยกเว้นฐานข้อมูลและโฟลเดอร์ `updates/` | | `etc/` | สำเนาของ `/etc/nexcmp` (การตั้งค่าตัวติดตั้ง, ID อินสแตนซ์, พอร์ต และการผูกพอร์ต) | ::: warning ไฟล์เก็บถาวรมีคีย์หลักของคุณอยู่ด้วย `secrets/` จัดเก็บคีย์ที่ใช้เข้ารหัส API keys, ข้อมูลรับรองการชำระเงิน และรหัสผ่าน SMTP ที่บันทึกไว้ในฐานข้อมูล การบีบอัดไฟล์สร้างขึ้นด้วยสิทธิ์ `0600` โปรดจัดเก็บในรูปแบบที่เข้ารหัสและแยกเก็บไว้ภายนอกเซิร์ฟเวอร์ หากไม่มีคีย์เหล่านี้ ฐานข้อมูลที่กู้คืนมาจะไม่สามารถถอดรหัสข้อมูลลับได้ ::: ## Take a backup {#take-a-backup} ```bash sudo nexcmp backup # writes to /var/backups/nexcmp sudo nexcmp backup /mnt/nas/nexcmp # or to another directory ``` คำสั่งนี้จะแสดงเส้นทางของไฟล์จัดเก็บ เช่น `/var/backups/nexcmp/nexcmp-backup-20261030-120000.tar.zst` ### Schedule it {#schedule-it} ```bash echo '17 3 * * * root /usr/local/bin/nexcmp backup /var/backups/nexcmp && find /var/backups/nexcmp -name "nexcmp-backup-*" -mtime +14 -delete' | sudo tee /etc/cron.d/nexcmp-backup ``` คัดลอกโฟลเดอร์ออกจากเครื่อง (พื้นที่จัดเก็บออบเจ็กต์, NAS, เซิร์ฟเวอร์อื่น) ## Restore {#restore} กู้คืนไปยังเซิร์ฟเวอร์ที่ติดตั้ง NexCMP **เวอร์ชันเดียวกัน (หรือใหม่กว่า)** 1. ติดตั้ง NexCMP ด้วย [installer](https://nexcmp.com/th/docs/getting-started/installation/) โดยใช้ไลเซนส์และโดเมนเดิม แต่ **ไม่ต้อง** เรียกใช้งานตัวช่วยตั้งค่า 2. หยุดการทำงานของบริการต่างๆ: ```bash sudo systemctl stop nexcmp-vmd nexcmp ``` 3. แตกไฟล์จัดเก็บไปยังไดเรกทอรีชั่วคราว: ```bash sudo mkdir /root/restore && sudo tar --zstd -xf nexcmp-backup-20261030-120000.tar.zst -C /root/restore ``` 4. ย้ายไฟล์กลับที่เดิม: ```bash sudo tar -xf /root/restore/files.tar -C /var/lib/nexcmp sudo cp -a /root/restore/data/. /var/lib/nexcmp/ sudo cp -a /root/restore/etc/. /etc/nexcmp/ sudo chown -R nexcmp:nexcmp /var/lib/nexcmp ``` 5. เริ่มการทำงานของบริการต่างๆ และตรวจสอบ: ```bash sudo systemctl start nexcmp nexcmp-vmd sudo nexcmp status ``` 6. ลงชื่อเข้าใช้ `https:///admin` ด้วยบัญชีผู้ดูแลระบบของระบบที่ *สำรองข้อมูลไว้* ::: tip Rehearse it ทดลองทำขั้นตอนที่ 1–6 บนเซิร์ฟเวอร์สำรองหนึ่งครั้งก่อนที่คุณจะใช้งานจริง การสำรองข้อมูลที่ไม่เคยผ่านการกู้คืนเป็นเพียงความหวังเท่านั้น ::: ## Not included {#not-included} - การกำหนดค่าและใบรับรองของ nginx (สร้างขึ้นใหม่โดยตัวติดตั้ง ใบรับรอง Let's Encrypt จะถูกออกใหม่อีกครั้ง) - เซิร์ฟเวอร์ CloudStack / Proxmox VE ของคุณและเครื่องเสมือนที่อยู่บนนั้น — โปรดสำรองข้อมูลด้วยเครื่องมือของระบบนั้นๆ --- # ถอนการติดตั้ง NexCMP {#uninstall-nexcmp} ::: warning Customers lose access การถอนการติดตั้งจะหยุดพอร์ทัลและการเรียกเก็บเงิน เครื่องเสมือนบน CloudStack หรือ Proxmox VE ของคุณจะยังคงทำงานอยู่ แต่จะไม่มีระบบใดจัดการหรือคิดเงิน โปรดสร้าง [backup](https://nexcmp.com/th/docs/getting-started/backup-and-restore/) ก่อนดำเนินการ ::: ## ลบโปรแกรมออก แต่เก็บข้อมูลไว้ {#remove-the-program-keep-the-data} ```bash sudo nexcmp uninstall ``` การดำเนินการนี้จะปิดใช้งานและลบบริการ `nexcmp` และ `nexcmp-vmd`, ไซต์และสนิปเป็ตของ nginx, `/opt/nexcmp` และคำสั่ง `nexcmp` **ข้อมูลจะยังคงอยู่** ใน `/var/lib/nexcmp` และ `/etc/nexcmp` ดังนั้นการติดตั้งใหม่บนเซิร์ฟเวอร์เดิมในภายหลังจะดำเนินต่อจากจุดที่คุณหยุดไว้ ## Remove everything {#remove-everything} ```bash sudo nexcmp uninstall --purge ``` นอกจากนี้จะลบ `/var/lib/nexcmp`, `/etc/nexcmp`, `/var/log/nexcmp` และผู้ใช้ระบบ `nexcmp` ออกด้วย การดำเนินการนี้ไม่สามารถย้อนกลับได้ ## After uninstalling {#after-uninstalling} - ใบรับรอง Let's Encrypt และแพ็กเกจ `nginx` / `certbot` จะยังคงอยู่ตามเดิม คุณสามารถลบใบรับรองด้วย `sudo certbot delete --cert-name ` ได้หากต้องการ - ยกเลิกการผูกโดเมนบนหน้าไลเซนส์ของคุณที่ [nexcmp.com/licenses](https://nexcmp.com/licenses) หากคุณจะนำไปใช้งานที่อื่น - ลบบัญชี CloudStack หรือโทเค็น API ของ Proxmox ที่สร้างขึ้นสำหรับ NexCMP หากคุณไม่ต้องการใช้อีกต่อไป --- # `nexcmp` command reference {#nexcmp-command-reference} ตัวติดตั้งจะวางโปรแกรมเสริมไว้ที่ `/usr/local/bin/nexcmp` โปรดเรียกใช้งานบนเซิร์ฟเวอร์ NexCMP คำสั่งที่เปลี่ยนแปลงระบบจำเป็นต้องใช้สิทธิ์ `sudo` (เครื่องมือฝั่งลูกค้าสำหรับ API เป็นโปรแกรมแยกต่างหาก โปรดดูที่ [cmp CLI](https://nexcmp.com/th/docs/developers/cmp-cli/)) | Command | Needs root | What it does | |---|---|---| | `nexcmp status` | No (ดูรายละเอียดเพิ่มเติมที่ `sudo`) | เวอร์ชัน, สถานะของบริการ (`nexcmp`, `nexcmp-vmd`), `/healthz`, สรุปใบอนุญาต, สถานะพอร์ตสาธารณะ, รหัสติดตั้งหากตัวช่วยตั้งค่า (wizard) ยังไม่เสร็จสิ้น | | `nexcmp update` | ใช่ | รันตัวติดตั้งที่มาพร้อมกับรีลีสที่ติดตั้งไว้พร้อมพารามิเตอร์ที่บันทึก — ดูที่ [Updating](https://nexcmp.com/th/docs/getting-started/updating/) | | `nexcmp backup [dir]` | ใช่ | สำรองข้อมูลไปยัง `/var/backups/nexcmp` (หรือ `dir`) — ดู [Backup and restore](https://nexcmp.com/th/docs/getting-started/backup-and-restore/) | | `nexcmp uninstall [--purge]` | ใช่ | ลบบริการและโปรแกรม `--purge` จะลบข้อมูลด้วยเช่นกัน — ดู [Uninstall](https://nexcmp.com/th/docs/getting-started/uninstall/) | | `nexcmp open-port [minutes]` | ใช่ | **ฉุกเฉิน**: เปิดรับการเชื่อมต่อบนพอร์ตของแผงควบคุม (ค่าเริ่มต้น 3000) ทุกอินเทอร์เฟซเป็นเวลา 1–1440 นาที (ค่าเริ่มต้น 30) จากนั้นปิดโดยอัตโนมัติ | | `nexcmp close-port` | ใช่ | ปิดหน้าต่างฉุกเฉินตอนนี้ | | `nexcmp fix-owner` | ใช่ | คืนความเป็นเจ้าของไฟล์ใน `/var/lib/nexcmp` ที่เป็นของ root ให้กลับไปเป็นของผู้ใช้ `nexcmp` | ## `nexcmp status` ```text Version : 1.6.1 nexcmp : active nexcmp-vmd : active healthz : ok License : active · domain cloud.example.com · token valid until 2026-11-12 · updates until 2027-10-30 Public port: 127.0.0.1 only (nginx proxy; emergency: sudo nexcmp open-port) ``` หากไฟล์ในไดเรกทอรีข้อมูลเป็นของ root (ตัวอย่างเช่น สร้างจากการรันคำสั่ง `nexcmp` อื่นโดยใช้ `sudo` เป็น root) `status` จะแสดงคำเตือนเนื่องจากผู้ใช้บริการไม่สามารถอ่านได้ อาการทั่วไปคือไลเซนส์แสดง HTTP 421 แก้ไขด้วย `sudo nexcmp fix-owner` การแก้ไขเดียวกันนี้จะทำงานโดยอัตโนมัติทุกครั้งที่เริ่มบริการ ## การเข้าถึงฉุกเฉิน {#emergency-access} เมื่อโดเมน nginx หรือ TLS มีปัญหา คุณยังคงสามารถเข้าถึงแผงควบคุมได้: ```bash sudo nexcmp open-port 30 # http://:3000/ for 30 minutes sudo nexcmp close-port # close it earlier ``` ปลอดภัยกว่าโดยไม่ต้องเปิดพอร์ตใดๆ: `ssh -L 3000:127.0.0.1:3000 user@server` และเปิดดูที่ `http://127.0.0.1:3000/` ## สภาพแวดล้อม {#environment} | ตัวแปร | ใช้สำหรับ | |---|---| | `NEXCMP_BASE` | แทนที่ URL ฐานของเซิร์ฟเวอร์ไลเซนส์ (ค่าเริ่มต้น `https://nexcmp.com`); สำหรับการทดสอบเท่านั้น | ไฟล์และไดเรกทอรี: โปรแกรม `/opt/nexcmp`, การกำหนดค่า `/etc/nexcmp`, ข้อมูล `/var/lib/nexcmp`, บันทึก `/var/log/nexcmp` และ `journalctl -u nexcmp -u nexcmp-vmd` --- # ข้อกำหนดด้านโครงสร้างพื้นฐาน {#infrastructure-requirements} > **ตำแหน่งในหน้าผู้ดูแลระบบ:** Infrastructure (เมนูด้านซ้าย) และ System › Admin › License & updates (`/license`) สำหรับเปิดใช้งานโมดูล หน้านี้แสดงสิ่งที่แต่ละโมดูลต้องการ **นอกเหนือจาก** เซิร์ฟเวอร์ NexCMP สำหรับตัวเซิร์ฟเวอร์เอง (Ubuntu, หน่วยความจำ, ดิสก์, พอร์ต) โปรดดูที่ [Requirements for the NexCMP server](https://nexcmp.com/th/docs/getting-started/requirements/) หากต้องการเปิดใช้งานโมดูล โปรดดู [Modules](https://nexcmp.com/th/docs/infrastructure/modules/) ## รายชื่อโมดูล {#module-by-module} | โมดูล | โครงสร้างพื้นฐานขั้นต่ำ | รายละเอียด | |---|---|---| | **Virtual Machines on CloudStack** | Apache CloudStack 4.23 (ผ่านการทดสอบ), KVM, โซนขั้นสูงที่มีเน็ตเวิร์กสำหรับเกสต์และช่วงไอพีสาธารณะ, โดเมนและบัญชีเฉพาะที่มี API key (ห้ามใช้ ROOT เด็ดขาด), เทมเพลตที่พร้อมใช้งานอย่างน้อย 1 รายการ และ service offering 1 รายการ | [CloudStack](https://nexcmp.com/th/docs/infrastructure/cloudstack/) | | **Virtual Machines on Proxmox VE** | Proxmox VE 9.x (ตรวจสอบยืนยันบน 9.2); API token พร้อมบทบาทกำหนดเอง; สตอเรจที่รองรับการโคลน; บริดจ์; บล็อก IPv4 พร้อมเกตเวย์; เทมเพลต cloud-init 1 รายการต่อระบบปฏิบัติการและต่อโหนด | [Proxmox VE](https://nexcmp.com/th/docs/infrastructure/proxmox/) | | **OS templates** | CloudStack: เครื่องบิลด์ Linux ที่มี libguestfs และเว็บเซิร์ฟเวอร์สำหรับอิมเมจ Proxmox VE: เทมเพลต cloud-image พร้อม guest agent | [OS templates](https://nexcmp.com/th/docs/infrastructure/templates/) | | **Bare metal / Dedicated Server** | เซิร์ฟเวอร์ Dell พร้อม iDRAC 9 ที่เข้าถึงได้ผ่าน HTTPS (Redfish) จากแผงควบคุมบนเน็ตเวิร์กจัดการ; เว็บเซิร์ฟเวอร์บนเน็ตเวิร์กนั้นที่ให้บริการไฟล์ ISO; โฟลเดอร์ ISO ที่เขียนได้สำหรับบริการ NexCMP | [Dedicated servers](https://nexcmp.com/th/docs/infrastructure/dedicated/) | | **AI Models** | แหล่งโมเดลอย่างน้อยหนึ่งแห่งที่คุณได้รับอนุญาตให้นำมาจำหน่ายต่อ พร้อม API ที่เข้ากันได้กับ OpenAI หรือ Anthropic และคีย์ของคุณเอง; การเชื่อมต่อ HTTPS ขาออก (พอร์ต 443, โดเมนสาธารณะ) จากพาเนลไปยังแต่ละแหล่ง หรือเกตเวย์ภายในที่ระบุไว้ใน Allowed internal hosts; ไม่ต้องใช้ GPU หรือฮาร์ดแวร์พิเศษ | [AI Models](https://nexcmp.com/th/docs/infrastructure/ai-models/) | | **VPN** | โฮสต์ Linux หนึ่งเครื่องขึ้นไป (x86_64, systemd, root) พร้อม IPv4 สาธารณะบนอินเทอร์เฟซหรือเส้นทางที่กำหนด, การเชื่อมต่อ HTTPS ขาออกไปยังแผงควบคุมของคุณ | [โหนด VPN และพร็อกซี](https://nexcmp.com/th/docs/infrastructure/vpn-proxy-nodes/) | | **IPv6 Proxy** | โฮสต์ Linux (x86_64, systemd, `nft`, `ip`, `ss`, `sysctl`) ที่มี IPv4 สาธารณะ, พอร์ต 80, 443 และ 60001-65535 ที่ว่าง, และ IPv6 prefix ตั้งแต่ /32 ถึง /64 ที่ใช้งานได้สำหรับการรับส่งข้อมูลขาออก; การเข้าถึง SSH ด้วยรหัสผ่านสำหรับการติดตั้งครั้งเดียว | [โหนด VPN และพร็อกซี](https://nexcmp.com/th/docs/infrastructure/vpn-proxy-nodes/) | | **Object Storage (S3)** | คลัสเตอร์ Ceph ที่มี RADOS Gateway (RGW), ผู้ใช้งาน Admin Ops และพอร์ตสาธารณะ HTTPS บนพอร์ต 443 | [S3](https://nexcmp.com/th/docs/infrastructure/s3/) | | **Kubernetes** | CloudStack ที่เปิดใช้งาน Kubernetes Service (CKS), มี ISO ของเวอร์ชัน Kubernetes อย่างน้อยหนึ่งเวอร์ชัน และมีบริการ control-plane ฟรีขนาด 2 vCPU และ 2048 MB พอดี | [Kubernetes and Private Cloud](https://nexcmp.com/th/docs/infrastructure/kubernetes-and-private-cloud/) | | **Private Cloud** | CloudStack ที่มี VPC offering และ 1 network offering ต่อแผนแบนด์วิดท์ (บวกกับ offering แบบล็อกที่ 1 Mbps) | [Kubernetes and Private Cloud](https://nexcmp.com/th/docs/infrastructure/kubernetes-and-private-cloud/) | | **OS & ISO Images** | CloudStack ซึ่งมี secondary storage VM ที่สามารถเข้าถึงอินเทอร์เน็ตเพื่อดาวน์โหลดอิมเมจของลูกค้าได้ (ลิงก์ตรง, ไม่มี redirect); บัญชี CloudStack สามารถลงทะเบียนเทมเพลตและ ISO ได้ | [Modules](https://nexcmp.com/th/docs/infrastructure/modules/) | | **Bandwidth** | ไม่มีอะไรเพิ่มเติมสำหรับ source เริ่มต้น: การใช้งานจะอ่านจากสถิติ VM ของ CloudStack ส่วน VM บน Proxmox VE จะไม่มีการคิดตามการใช้งาน | [Bandwidth](https://nexcmp.com/th/docs/catalog/bandwidth/) | | **AI Chat and AI Agent** | API ที่รองรับ OpenAI (base URL, โมเดล และคีย์) ซึ่งเซิร์ฟเวอร์ของแผงควบคุมสามารถเข้าถึงได้ โดยไม่ต้องติดตั้งซอฟต์แวร์เพิ่มเติมบนเซิร์ฟเวอร์ของคุณ | [AI providers](https://nexcmp.com/th/docs/ai/ai-providers/) | | **DDoS & BGP** | แพ็กเกจเสริมที่ต้องใช้โฮสต์ edge router ที่มี daemon ทำงานด้วยสิทธิ์ root (BGP, การกรอง, สถิติการไหลของข้อมูล) ซึ่งไม่ได้เป็นส่วนหนึ่งของการติดตั้งมาตรฐาน | [Modules](https://nexcmp.com/th/docs/infrastructure/modules/) | | **DDoS Shield** | ส่วนเสริม DDoS & BGP | [Modules](https://nexcmp.com/th/docs/infrastructure/modules/) | | **Web SSH terminal** | บริการ SSH proxy แยกต่างหากและเส้นทางสำหรับบริการดังกล่าว โดยไม่ได้เป็นส่วนหนึ่งของการติดตั้งมาตรฐาน และ AI Agent ไม่จำเป็นต้องใช้งาน | [Modules](https://nexcmp.com/th/docs/infrastructure/modules/) | ## ภาพรวมเส้นทางเครือข่าย {#network-paths-at-a-glance} | จาก | ถึง | Port | Purpose | |---|---|---|---| | เซิร์ฟเวอร์แผงควบคุม | เซิร์ฟเวอร์การจัดการ CloudStack | 443 หรือ 8080 (ตามที่คุณเผยแพร่) | API | | เซิร์ฟเวอร์แผงควบคุม | โหนด Proxmox VE | 8006/tcp | API และคอนโซล | | เซิร์ฟเวอร์แผงควบคุม | Dell iDRAC | 443/tcp (และพอร์ต VNC ค่าเริ่มต้นคือ 5901) | Redfish และคอนโซล | | iDRAC | เว็บเซิร์ฟเวอร์ ISO | พอร์ต HTTP ที่คุณเลือก (ตัวอย่างเช่น 8080) | สื่อเสมือน | | เซิร์ฟเวอร์แผงควบคุม | Ceph RGW | 443/tcp | Admin Ops | | เซิร์ฟเวอร์แผงควบคุม | โหนดพร็อกซี IPv6 | พอร์ต SSH ที่คุณป้อน | ติดตั้งครั้งเดียว | | โหนด VPN และพร็อกซี | แผงควบคุม (ผ่าน nginx) | 443/tcp | การลงทะเบียน, การตรวจสอบการทำงาน (heartbeat), การกำหนดค่า | | ลูกค้า | โหนด VPN และพร็อกซี | พอร์ตต่อ IP 65001-65535 (VPN); 80, 443, 60001-65535 (พร็อกซี IPv6) | ตัวบริการเอง | ::: tip เก็บเครือข่ายการจัดการไว้เป็นส่วนตัว ที่อยู่สำหรับจัดการ iDRAC และไฮเปอร์ไวเซอร์ควรอยู่บนเครือข่ายที่ลูกค้าเข้าถึงไม่ได้ NexCMP จะปฏิเสธที่อยู่ iDRAC ที่อยู่นอกช่วงเครือข่ายส่วนตัวที่คุณอนุญาต ::: ## รายการตรวจสอบก่อนเริ่มขาย {#checklist-before-you-sell} 1. โครงสร้างพื้นฐานเบื้องหลังบริการแรกเชื่อมต่ออยู่และ **Test connection** เป็นสีเขียว 2. โซนพร้อมขาย (ดูที่ [Zones](https://nexcmp.com/th/docs/infrastructure/zones/)): มีแบ็กเอนด์ที่ใช้งานได้ แผนบริการ และเทมเพลตที่พร้อม 3. กำหนดค่าช่องทางชำระเงินเรียบร้อยแล้ว (ดูที่ [Payment channels](https://nexcmp.com/th/docs/billing/payment-channels/)) 4. อีเมลใช้งานได้ (ดูที่ [SMTP and e-mails](https://nexcmp.com/th/docs/administration/smtp-and-emails/)) 5. คุณได้ทำการสั่งซื้อทดสอบหนึ่งรายการและลบ VM นั้นแล้ว --- # สถาปัตยกรรมระบบ {#architecture} > **ตำแหน่งในแผงผู้ดูแลระบบ:** หน้านี้เป็นหน้าเอกสารอ้างอิง บริการที่อธิบายไว้ที่นี่สามารถดูได้ด้วย `sudo nexcmp status`; การเชื่อมต่อต่างๆ จะได้รับการกำหนดค่าไว้ใต้ Infrastructure และ System › Settings ## ภาพรวม {#the-picture} ![สถาปัตยกรรมของ NexCMP: ลูกค้าเข้าถึง nginx ผ่าน DNS และ Cloudflare (ถ้ามี), nginx ส่งต่อคำขอไปยังแผงควบคุมที่พอร์ต 3000, แผงควบคุมและเวิร์กเกอร์เรียกใช้งาน CloudStack, Proxmox VE, iDRAC, Ceph, เกตเวย์การชำระเงิน, SMTP และผู้ให้บริการ AI, รวมถึงโหนด VPN และพร็อกซี IPv6 ที่เชื่อมต่อกลับมายังแผงควบคุม](https://nexcmp.com/th/docs/images/infrastructure/architecture.svg) ### แผนภาพเดียวกันในรูปแบบคำอธิบาย {#the-same-diagram-in-words} 1. ลูกค้าหรือผู้ดูแลระบบเปิด `https://cloud.example.com` (พอร์ทัล), `https://cloud.example.com/admin` (คอนโซลผู้ดูแลระบบ) หรือเรียกใช้งาน REST API โดย DNS จะชี้ชื่อโดเมนไปยังเซิร์ฟเวอร์ของคุณหรือไปยัง Cloudflare ซึ่งทำหน้าที่เป็นพร็อกซี 2. **nginx** บนเซิร์ฟเวอร์แผงควบคุมจะ侦听 (ฟัง) ที่พอร์ต 80 (สำหรับการเปลี่ยนเส้นทางและการต่ออายุใบรับรอง) และ 443 (TLS) พร้อมทั้งส่งต่อทุกคำขอไปยัง **panel** ที่ `127.0.0.1:3000` หลังจากผ่านตัวช่วยติดตั้ง แผงควบคุมจะฟังเฉพาะบนอินเทอร์เฟซลูปแบ็กเท่านั้น 3. **panel** (`nexcmp.service`) ทำหน้าที่ให้บริการพอร์ทัลลูกค้า, คอนโซลผู้ดูแลระบบ, REST API, ตัวช่วยติดตั้ง และไฟล์ดาวน์โหลดที่โหนดต้องการ (ไบนารีของเอเจนต์, สคริปต์ติดตั้ง, เครื่องมือบรรทัดคำสั่ง `cmp`) นอกจากนี้ยังตรวจสอบไลเซนส์ของคุณวันละหนึ่งครั้ง 4. **worker** (`nexcmp-vmd.service`) ทำงานบน `127.0.0.1:8112` ซึ่งใช้งานได้เฉพาะภายในเครื่องเท่านั้น โดยจะรันงานทั้งหมดที่ใช้เวลาหรือต้องเกิดขึ้นตามกำหนดเวลา เช่น งานโหนด, การซิงโครไนซ์กับ CloudStack และ Proxmox VE, รอบการเรียกเก็บเงิน, การเก็บข้อมูลแบนด์วิดท์ และการเชื่อมต่อคอนโซลเบราว์เซอร์ 5. จากกระบวนการทั้งสองนี้ NexCMP จะทำการเรียกออกไปยังภายนอก ได้แก่ **CloudStack** (Management API), **Proxmox VE** (API ที่พอร์ต 8006, ตรึงใบรับรอง), **Dell iDRAC** (Redfish ผ่าน HTTPS บนเครือข่ายการจัดการ), **Ceph RGW** (S3 และ Admin Ops ผ่าน HTTPS), **เกตเวย์การชำระเงิน** (Stripe, PayPal, USDT และผู้ให้บริการโอนเงินผ่านธนาคาร ซึ่งจะเรียกกลับมายัง URL เว็บฮุกของคุณด้วย), **เซิร์ฟเวอร์ SMTP ของคุณ**, **ผู้ให้บริการ AI** ที่มี API รองรับรูปแบบ OpenAI และ **Telegram** (ตัวเลือกเสริม) 6. **โหนด VPN** รัน `cmp-agent` โดยแต่ละโหนดจะลงทะเบียนครั้งเดียวด้วยโทเค็นแบบใช้ครั้งเดียว จากนั้นจะส่งฮาร์ตบีททุกๆ 5วินาทีผ่าน HTTPS ไปยังแผงควบคุมและรับการตั้งค่ากลับมาในคำตอบ ส่วน **โหนดพร็อกซี IPv6** จะถูกติดตั้งครั้งเดียวโดยแผงควบคุมผ่าน SSH จากนั้นจะดึงการตั้งค่าของตนเองจากแผงควบคุม 7. ข้อมูลสถานะจะถูกจัดเก็บไว้ในฐานข้อมูล SQLite และไฟล์จำนวนหนึ่งใน `/var/lib/nexcmp` สำหรับข้อมูลรับรองของ CloudStack, Proxmox, S3, iDRAC และผู้ให้บริการ AI จะถูกเข้ารหัส (AES-256-GCM) ด้วยไฟล์คีย์หลักที่อยู่ในพื้นที่เดียวกัน ## บริการและกระบวนการ {#services-and-processes} | กระบวนการ | ทำงานในฐานะ | ฟังที่พอร์ต/อินเทอร์เฟซ | หน้าที่การทำงาน | |---|---|---|---| | `nginx` | root (เวิร์กเกอร์ `www-data`) | 80, 443 | TLS, เปลี่ยนเส้นทาง, พร็อกซีไปยังแผงควบคุม | | `nexcmp` | `nexcmp` | 3000 (ทุกอินเทอร์เฟซระหว่างการติดตั้งครั้งแรก จากนั้นเปลี่ยนเป็น `127.0.0.1`) | พอร์ทัล, คอนโซลผู้ดูแลระบบ, API, ตัวช่วยติดตั้ง, การดาวน์โหลด | | `nexcmp-vmd` | `nexcmp` | `127.0.0.1:8112` | งาน, การซิงค์, การเรียกเก็บเงิน, แบนด์วิดท์, คอนโซล | | `nexcmp-update` | root | ไม่มี | ใช้การอัปเดตที่คอนโซลผู้ดูแลระบบร้องขอ (path unit จะรอคำขอ) | | `cmp-agent` (บนโหนด VPN) | root | พอร์ตตัวรับฟัง VPN | รายงานไปยังพาเนล รันพร็อกซีตัวรับฟังบน IPv4 สาธารณะ | พาเนลและเวิร์กเกอร์ทำงานเป็นผู้ใช้ทั่วไปโดยไม่มีความสามารถของ Linux ใดๆ มีระบบไฟล์แบบอ่านอย่างเดียว ยกเว้น `/var/lib/nexcmp` และ `/var/log/nexcmp` โดยไม่ต้องใช้ root, Docker, แยกฐานข้อมูล หรือ Redis ## ไฟล์และตำแหน่งที่อยู่ {#files-and-where-they-are} | พาธ | เนื้อหา | |---|---| | `/opt/nexcmp` | โปรแกรม: เวอร์ชันที่ปล่อย, `bin/`, ไฟล์ที่ใช้ร่วมกัน เช่น ตัวสร้างเทมเพลต เป็นเจ้าของโดย root และเป็นแบบอ่านอย่างเดียวสำหรับบริการ | | `/etc/nexcmp` | การตั้งค่าตัวติดตั้ง (`install.conf`), พอร์ตและการผูก (`nexcmp.env`) | | `/var/lib/nexcmp` | ฐานข้อมูล SQLite, การอัปโหลดแบรนด์, โฟลเดอร์ดาวน์โหลดเอเจนต์, สถานะไลเซนส์ และไฟล์มาสเตอร์คีย์ กรุณาสำรองข้อมูลส่วนนี้ | | `/var/log/nexcmp` | ล็อก | ดูที่ [Backup and restore](https://nexcmp.com/th/docs/getting-started/backup-and-restore/) ไฟล์มาสเตอร์คีย์จะต้องได้รับการสำรองข้อมูลไปพร้อมกับฐานข้อมูล มิฉะนั้นฐานข้อมูลที่กู้คืนมาจะไม่สามารถถอดรหัสข้อมูลประจำตัวที่จัดเก็บไว้ได้ ## ใครเชื่อมต่อกับใคร {#who-connects-to-whom} | Direction | พาธ | Port | หมายเหตุ | |---|---|---|---| | ลูกค้าไปยังพาเนล | อินเทอร์เน็ต, DNS, Cloudflare (ไม่บังคับ), nginx | 443 | ดูที่ [DNS and Cloudflare](https://nexcmp.com/th/docs/getting-started/dns-and-cloudflare/) | | พาเนลไปยังเซิร์ฟเวอร์ไลเซนส์ | `nexcmp.com` | 443 | การเปิดใช้งาน, การตรวจสอบรายวัน และการอัปเดต | | พาเนลไปยัง CloudStack | API | 443 หรือ 8080 | คอนโซล VM, แบนด์วิดท์ และฟีเจอร์ Kubernetes ใช้เอนด์พอยต์เดียวกัน | | พาเนลไปยัง Proxmox VE | API และคอนโซล WebSocket | 8006 | ใบรับรองถูกพินด้วย SHA-256 | | พาเนลไปยัง iDRAC | Redfish | 443, VNC 5901 | เครือข่ายการจัดการเท่านั้น | | iDRACไปยังเซิร์ฟเวอร์ ISO | HTTP | พอร์ตของคุณ | iDRAC ทำการดึงไฟล์ ISO | | พาเนลไปยัง Ceph RGW | Admin Ops | 443 | | | พาเนลไปยัง SMTP | SMTP | 587 หรือ 465 | | | พาเนลไปยังผู้ให้บริการ AI | HTTPS | 443 | เฉพาะเมื่อเปิดใช้งานโมดูล AI | | เกตเวย์ชำระเงินไปยังพาเนล | Webhook | 443 | Stripe และ PayPal เรียกกลับ | | โหนดไปยังพาเนล | `cmp-agent` | 443 | ลงทะเบียน, ฮาร์ทบีท, อัปเกรด | | พาเนลไปยังโหนดพร็อกซี IPv6 | SSH | พอร์ตที่คุณป้อน | ติดตั้งเพียงครั้งเดียวเท่านั้น | ## ทำไมจึงสำคัญ {#why-it-matters} - **แผงควบคุมที่เข้าถึงได้คือแผงควบคุมที่ถูกโจมตีได้** ปิดพอร์ต 3000 ทันทีเมื่อตัวช่วยสร้างการตั้งค่าเสร็จสิ้น โปรแกรมติดตั้งจะดำเนินการนี้ให้โดยอัตโนมัติเมื่อเปิดใช้งาน TLS - **Worker ต้องทำงานอยู่** จึงจะสามารถสร้างหรือเรียกเก็บเงินได้ `sudo nexcmp status` แสดงทั้งบริการและการตรวจสอบสถานะ - **วางแผนไฟร์วัลขาออก** หากทราฟฟิกขาออกของเซิร์ฟเวอร์แผงควบคุมถูกกรอง ให้ALLOW ปลายทางในตารางด้านบน - **ทราฟฟิกการจัดการจะไม่ผ่านเส้นทางสาธารณะ** การเชื่อมต่อกับ CloudStack, Proxmox VE, iDRAC และ Ceph จะส่งตรงจากเซิร์ฟเวอร์แผงควบคุมไปยังระบบเหล่านั้น โดยไม่ผ่าน nginx หรือ Cloudflare --- # โมดูล {#modules} > **ตำแหน่งในหน้าผู้ดูแลระบบ:** System › Admin › License & updates (`/license`) การ์ด **Module** ## What it does {#what-it-does} โมดูลคือบริการหรือฟีเจอร์ที่คุณสามารถเปิดหรือปิดได้ทั้งชุด โมดูลที่ **ปิด** อยู่จะถูกซ่อนจากเมนูผู้ดูแลระบบและลูกค้าไม่สามารถซื้อได้ เส้นทาง API ของโมดูลจะตอบกลับเป็น `404 module_disabled` ในกรณีที่เป็นโมดูลเสริม การเปิดใช้งานโมดูลเป็นการแสดงผลฟีเจอร์เท่านั้น โครงสร้างพื้นฐานเบื้องหลังยังคงต้องเชื่อมต่ออยู่ (ดูคอลัมน์สุดท้าย) ## ข้อกำหนด {#requirements} | Item | Requirement | |---|---| | บัญชี | ผู้ดูแลระบบที่มีสิทธิ์เขียน พนักงานที่มีสิทธิ์อ่านอย่างเดียวจะเห็นสิทธิ์การสลับแต่ไม่สามารถเปลี่ยนแปลงได้ | | โครงสร้างพื้นฐาน | ดูตาราง: โมดูลแต่ละตัวจะระบุสิ่งที่จำเป็น | | ขึ้นอยู่กับ | บางโมดูลต้องอาศัยโมดูลอื่น (DDoS Shield ต้องใช้ DDoS & BGP) | ## เตรียมโครงสร้างพื้นฐาน {#prepare-the-infrastructure} ไม่จำเป็นต้องใช้กับตัวสลับเอง เชื่อมต่อโครงสร้างพื้นฐานของแต่ละโมดูลตามที่อธิบายไว้ในหน้าที่ลิงก์ไว้ในตาราง ## เชื่อมต่อใน NexCMP {#connect-in-nexcmp} 1. เปิด **System › Admin › License & updates** แล้วเลื่อนไปที่การ์ด **Module** ซึ่งระบุว่าโมดูลที่ปิดการใช้งานจะถูกซ่อนจากเมนูผู้ดูแลระบบและลูกค้าไม่สามารถซื้อได้ 2. ใช้สวิตช์ของโมดูล หน้าเว็บจะยืนยันว่า **Saved: reloading menu** และโหลดซ้ำ เพื่อให้เมนูปรับเปลี่ยนทันที ![การ์ด Module ใน License & updates พร้อมสวิตช์สำหรับแต่ละโมดูล](https://nexcmp.com/th/docs/images/infrastructure/modules-01-license-modules.webp) ### โมดูลต่างๆ {#the-modules} | โมดูล (ตามที่แสดง) | ค่าเริ่มต้น | สิ่งที่เพิ่มเข้ามา | สิ่งที่ต้องใช้ | หน้า | |---|---|---|---|---| | **Virtual Machines** | เปิดตลอดเวลา | แคตตาล็อก VM, คำสั่งซื้อ, คอนโซล, สแนปชอต | CloudStack หรือ Proxmox VE | [CloudStack](https://nexcmp.com/th/docs/infrastructure/cloudstack/), [Proxmox VE](https://nexcmp.com/th/docs/infrastructure/proxmox/) | | **Bandwidth** | **เปิด** | โควต้า, ส่วนเสริม, การแจ้งเตือน และการดำเนินการส่วนเกินสำหรับ VM, Kubernetes และ S3 | ไม่มีอะไรเพิ่มเติม (สถิติ VM ของ CloudStack) | [Bandwidth](https://nexcmp.com/th/docs/catalog/bandwidth/) | | **OS & ISO Images** | ปิด | ลูกค้าลงทะเบียนอิมเมจ OS และ ISO ของตนเอง คิดค่าบริการตาม GB | CloudStack, การเข้าถึงอินเทอร์เน็ตสำหรับ VM ที่เก็บข้อมูลสำรอง | [Requirements](https://nexcmp.com/th/docs/infrastructure/requirements/) | | **Kubernetes** | ปิด | คลัสเตอร์ Kubernetes (CKS) | CloudStack ที่เปิดใช้งาน CKS | [Kubernetes and Private Cloud](https://nexcmp.com/th/docs/infrastructure/kubernetes-and-private-cloud/) | | **Private Cloud** | ปิด | VPC พร้อมแผนแบนด์วิดท์เฉพาะ | CloudStack VPC และข้อเสนอนำIเที่ยวเครือข่าย | [Kubernetes and Private Cloud](https://nexcmp.com/th/docs/infrastructure/kubernetes-and-private-cloud/) | | **Object Storage** | ปิด | บัญชี S3 บน Ceph RGW คิดค่าบริการตามการใช้งานจริง | Ceph RGW และโซนที่มีบริการ S3 | [S3](https://nexcmp.com/th/docs/infrastructure/s3/) | | **VPN** | ปิด | VPN บนโหนดของคุณเอง | โหนดที่รัน `cmp-agent` | [โหนด VPN และพร็อกซี](https://nexcmp.com/th/docs/infrastructure/vpn-proxy-nodes/) | | **IPv6 Proxy** | ปิด | IPv6 proxy บนโหนดของคุณเอง | โหนดพร็อกซีที่มี prefix ของ IPv6 | [โหนด VPN และพร็อกซี](https://nexcmp.com/th/docs/infrastructure/vpn-proxy-nodes/) | | **Bare Metal** | ปิด | เซิร์ฟเวอร์ Dell ผ่าน iDRAC: คำสั่งซื้อ, การติดตั้ง OS, คอนโซล, ระบบไฟฟ้า | iDRAC 9 บนเครือข่ายการจัดการ | [Dedicated servers](https://nexcmp.com/th/docs/infrastructure/dedicated/) | | **AI Models** | ปิด | เกตเวย์สำหรับจำหน่ายสิทธิ์การเข้าถึงโมเดล AI: ใช้คีย์เดียวสำหรับหลายโมเดล กำหนดราคาแยกตามโมเดล การจำกัดการใช้งาน บันทึกการใช้งาน และการคิดค่าบริการผ่านกระเป๋าเงิน | แหล่งโมเดลที่คุณนำมาเอง: API ที่เข้ากันได้กับ OpenAI หรือ Anthropic พร้อมคีย์ของคุณเอง | [AI Models](https://nexcmp.com/th/docs/infrastructure/ai-models/) | | **AI** | ปิด | AI Chat (การสนับสนุนอัตโนมัติ) และ AI Agent (การจัดการ VM ด้วยภาษาธรรมชาติ) | ผู้ให้บริการที่เข้ากันได้กับ OpenAI | [AI providers](https://nexcmp.com/th/docs/ai/ai-providers/) | | **DDoS Shield** | ปิด | การป้องกัน IP สำหรับลูกค้า ต้องการ DDoS & BGP ดังนั้นสวิตช์จึงถูกปิดใช้งานไว้หากไม่มีสิ่งเหล่านี้ | ส่วนเสริม DDoS & BGP | ด้านล่าง | | **DDoS & BGP** | ปิด, **add-on** | คอนโซลเราเตอร์ขอบเครือข่าย: BGP, RTBH, XDP, เซสชัน และทราฟฟิกขอบเครือข่าย | โหนดขอบเครือข่ายที่มี root daemon | ด้านล่าง | ### สวิตช์ใดทำหน้าที่อะไร {#which-switch-does-what} - **Bare Metal** มี 2 ระดับ โดยสวิตช์เปิดใช้งานโมดูลจะแสดงเมนูผู้ดูแลระบบและ API ส่วนการเปิดขายให้ลูกค้าจะเป็นอีกสวิตช์แยกต่างหากที่ต้องพิมพ์ยืนยันภายใต้ **Services › Dedicated Server** และคำสั่งเขียน (write) ทั้งหมดไปยัง iDRAC จะถูกบล็อกไว้จนกว่าคุณจะเปิด **live ops** ภายใต้ **Infrastructure › Bare Metal › Safety** ดูที่ [Dedicated servers](https://nexcmp.com/th/docs/infrastructure/dedicated/) - สำหรับ **Kubernetes**, **Private Cloud**, **VPN**, **IPv6 Proxy** และ **Images** สวิตช์โมดูลและสวิตช์การขายบนหน้าบริการจะมีผลกับการตั้งค่าเดียวกัน - **AI** ยังต้องกำหนดค่าผู้ให้บริการภายใต้ **System › Settings › AI provider** ด้วย - **AI Models** มีสองระดับ สวิตช์โมดูลจะแสดงเมนูผู้ดูแลระบบและ API ส่วนการเปิดขายให้ลูกค้าจะเป็นสวิตช์การขายแยกต่างหากที่อยู่ด้านบนของหน้า AI Models ซึ่งจะปิดไว้โดยค่าเริ่มต้น ดูที่ [AI Models](https://nexcmp.com/th/docs/infrastructure/ai-models/) ### โมดูลที่อ่านค่าตอนเริ่มต้นระบบ {#modules-read-at-start-up} ฟีเจอร์สามอย่างไม่ใช่สวิตช์ธรรมดา โดยจะถูกอ่าน **ครั้งเดียวเมื่อบริการเริ่มต้นขึ้น** และต้องใช้โครงสร้างพื้นฐานที่การติดตั้งมาตรฐานไม่ได้รวมไว้ | ฟีเจอร์ | การตั้งค่า | สถานะ | สิ่งที่จำเป็น | |---|---|---|---| | DDoS & BGP | `module_ddos` | แสดงเป็น **Add-on package** เมื่อปิด และ **Installed** เมื่อเปิด ไม่มีสวิตช์ในคอนโซล | Edge-router daemon (BGP, RTBH, XDP, สถิติการไหลของข้อมูล) ที่ทำงานในฐานะ root แผงควบคุมทำงานเป็นผู้ใช้ที่ไม่มีสิทธิ์จึงไม่สามารถรันได้ | | AI | `module_ai` | สวิตช์ปกติ เส้นทางจะอัปเดตตามทันที งานเบื้องหลังของ AI Chat (การตรวจสอบตั๋ว, การตอบกลับตามกำหนดเวลา) จะเริ่มต้นขึ้นเมื่อรีสตาร์ทบริการครั้งถัดไป คอนโซลจะแจ้งว่าแนะนำให้รีสตาร์ท | ผู้ให้บริการ AI | | เทอร์มินัล Web SSH | `feature_ssh_web` | ปิดตามค่าเริ่มต้น ไม่มีสวิตช์ในคอนโซล | บริการ SSH proxy แยกต่างหากและเส้นทางของมัน หากไม่มีแท็บ Console ของพอร์ทัลจะแสดงเฉพาะ VNC แต่ **AI Agent ไม่จำเป็นต้องใช้สิ่งนี้**: มันรันคำสั่งผ่านการเชื่อมต่อ SSH ที่แผงควบคุมสร้างขึ้นเอง | หลังจากเปลี่ยนการตั้งค่าเริ่มต้นระบบ ให้รีสตาร์ทบริการด้วยคำสั่ง: `sudo systemctl restart nexcmp nexcmp-vmd` ## ตรวจสอบ {#verify} 1. รายการเมนูของโมดูลจะปรากฏขึ้น (หรือหายไป) หลังจากโหลดใหม่ 2. สำหรับโมดูลที่ลูกค้าใช้งาน พอร์ทัลจะแสดงรายการเมนูใหม่สำหรับลูกค้าที่เข้าสู่ระบบแล้ว โมดูลที่ปิดอยู่จะไม่แสดงอะไรเลยหรือแสดงว่า "coming soon" ## ข้อจำกัดและหมายเหตุ {#limits-and-notes} - การปิดโมดูลจะไม่ลบข้อมูลใดๆ VM, คลัสเตอร์, บัญชี S3 และการสมัครสมาชิกที่กำลังทำงานอยู่จะยังคงทำงานและคิดเงินต่อไป เพียงแต่ลูกค้าจะไม่สามารถสร้างรายการใหม่ได้ - หน้าโควตาจะแสดงเฉพาะบริการที่มีโมดูลเปิดอยู่เท่านั้น ## การแก้ Problme {#troubleshooting} | อาการ | สาเหตุ | วิธีแก้ปัญหา | |---|---|---| | เมนูไม่แสดงขึ้นมา | ไม่ได้โหลดหน้าใหม่ | โหลดหน้าคอนโซลผู้ดูแลระบบใหม่ | | สวิตช์ DDoS Shield ถูกปิดใช้งาน | ไม่ได้ติดตั้งส่วนเสริม DDoS & BGP | DDoS Shield จำเป็นต้องใช้ส่วนเสริม DDoS & BGP | | "โมดูลนี้เป็นแพ็กเกจเสริมและไม่สามารถสลับที่นี่ได้" (HTTP 409 หรือ 422) | คุณ (หรือสคริปต์) พยายามสลับ DDoS & BGP | เป็นแพ็กเกจเสริม จึงไม่มีสวิตช์ให้เปิดปิด | | "DDoS Shield จำเป็นต้องใช้ส่วนเสริม DDoS & BGP" | เช่นเดียวกันสำหรับ DDoS Shield | ติดตั้งส่วนเสริมก่อน | | เส้นทางของโมดูลตอบกลับ 404 `module_disabled` | โมดูลถูกปิดอยู่ | เปิดใช้งานโมดูล | | AI Chat ตอบกลับแต่การตรวจสอบตั๋วไม่เคยเริ่มต้น | โมดูล AI ถูกเปิดใช้งานโดยไม่มีการรีสตาร์ท | `sudo systemctl restart nexcmp nexcmp-vmd`. | | พนักงานที่มีสิทธิ์อ่านอย่างเดียวไม่สามารถบันทึกได้ | บทบาทของพวกเขาเป็นแบบอ่านอย่างเดียว | ใช้บัญชีผู้ดูแลระบบ | --- # โซน {#zones} > **ตำแหน่งในหน้าผู้ดูแลระบบ:** Infrastructure › Datacenter › Zone (`/infra/zones`). หน้า详情ของโซนคือ `/infra/zones/` ## What it does {#what-it-does} **โซน** คือสถานที่ที่ลูกค้าเลือกเมื่อทำการสั่งซื้อ: ประเทศและเมืองพร้อมธง รวมถึงบริการที่ขายในที่นั้น เป็นแนวคิดด้านการขาย แยกต่างหากจากโซน คลัสเตอร์ และโหนดของแพลตฟอร์มเบื้องหลัง เบื้องหลังโซน คุณจะเชื่อมโยง **โครงสร้างพื้นฐาน**: โซน CloudStack, คลัสเตอร์ Proxmox VE, โหนด VPN พร้อมช่วงไอพี และแบ็กเอนด์ S3 โซน 1 ถูกสร้างขึ้นโดย [ตัวช่วยติดตั้ง](https://nexcmp.com/th/docs/getting-started/setup-wizard/) พร้อมชื่อที่แสดงและประเทศที่คุณป้อน เพิ่มโซนเพิ่มเติมเมื่อคุณมีโครงสร้างพื้นฐานในสถานที่อื่น ๆ หรือเพื่อให้ VPN และ S3 มีสถานที่ตั้งของตนเอง ## ข้อกำหนด {#requirements} | Item | Requirement | |---|---| | สิทธิ์การใช้งาน | บัญชีผู้ดูแลระบบ บทบาทพนักงานแบบอ่านอย่างเดียวสามารถดูได้แต่ไม่สามารถเปลี่ยนแปลงได้ | | โครงสร้างพื้นฐาน | โซนจะไม่ขายอะไรเลยจนกว่าจะมีสิ่งถูกแนบมาด้วย (ดูหัวข้อ "บริการใดขายที่ไหน" ด้านล่าง) | | ขึ้นอยู่กับ | [CloudStack](https://nexcmp.com/th/docs/infrastructure/cloudstack/) หรือ [Proxmox VE](https://nexcmp.com/th/docs/infrastructure/proxmox/) สำหรับ VM, [โหนด VPN และพร็อกซี](https://nexcmp.com/th/docs/infrastructure/vpn-proxy-nodes/) สำหรับ VPN, [S3](https://nexcmp.com/th/docs/infrastructure/s3/) สำหรับออบเจ็กต์สตอเรจ | ## เตรียมโครงสร้างพื้นฐาน {#prepare-the-infrastructure} ไม่จำเป็น โซนคือเรกคอร์ดภายใน NexCMP ## เชื่อมต่อใน NexCMP {#connect-in-nexcmp} ### สร้างโซน {#create-a-zone} 1. เปิด **Infrastructure › Datacenter › Zone** แล้วคลิก **Add zone** 2. กรอกข้อมูลในฟอร์ม: | ฟิลด์ | ค่าตัวอย่าง | หมายเหตุ | |---|---|---| | ประเทศ | `United States` | เลือกธง | | เมือง | `New York` | ไม่บังคับ | | Name (Vietnamese), Name (English) | `New York` | ชื่อที่ลูกค้าเห็นในแต่ละภาษา | | สลัก (Slug) | `us-new-york` | a-z, 0-9, ขีดกลาง, 2-32 ตัวอักษร กรอกอัตโนมัติจากประเทศและเมืองจนกว่าคุณจะพิมพ์เอง | | การมองเห็น | สาธารณะ | **Public** (สาธารณะ) จะมองเห็นได้โดยลูกค้าทุกคน ส่วน **Hidden** (ซ่อน) จะกำหนดให้ได้โดยผู้ดูแลระบบเท่านั้น | | ลำดับ | `0` | แสดงตัวเลขน้อยกว่าก่อนในรายการ | | บริการที่ขายในโซนนี้ | Virtual Machines (VM), VPN, Object Storage (S3) | เลือกอย่างน้อยหนึ่งรายการ | | ใช้งาน | เปิด | **Off** จะซ่อนโซนนี้จากลูกค้า | | ค่าเริ่มต้น | ปิด | โซนที่เลือกไว้ล่วงหน้าสำหรับลูกค้าที่ยังไม่ได้เลือก มีโซนเริ่มต้นได้เพียงโซนเดียวเท่านั้น | ![หน้าต่างเพิ่มโซนพร้อมระบุประเทศ เมือง สลัก (slug) และบริการที่เลือก](https://nexcmp.com/th/docs/images/infrastructure/zones-01-add-zone.webp) 3. คลิก **Create zone** รายการจะแสดงโซนพร้อมธง เจ้าของ บริการ สถานะ และจำนวน VM, แผน และโครงสร้างพื้นฐานที่แนบไว้ ![รายการโซนที่มีโซนเริ่มต้นและโซนที่สอง](https://nexcmp.com/th/docs/images/infrastructure/zones-02-list.webp) ### ตรวจสอบสิ่งที่แนบอยู่ {#look-at-what-is-attached} คลิกแถวเพื่อเปิดโซน แท็บ **Provider infrastructure** จะแสดงแบ็คเอนด์ที่แนบมาแต่ละรายการ พร้อมผู้ให้บริการ ชนิด (CloudStack หรือ Proxmox VE) ภูมิภาค สถานะ และลำดับความสำคัญ แท็บ **VPN infrastructure** จะแสดงช่วง IP และโหนด VPN ของโซนพร้อมลิงก์ไปยังพูล VPN ![รายละเอียดโซนพร้อมแท็บ Provider infrastructure](https://nexcmp.com/th/docs/images/infrastructure/zones-03-detail.webp) ### บริการใดขายที่ไหน {#which-service-sells-where} | บริการ | วิธีการเพิ่มเข้าไปในโซน | |---|---| | Virtual Machines บน CloudStack | วิซาร์ด (หรือ **Infrastructure › Cloud provider › CloudStack**) จะแนบ CloudStack เข้ากับโซน 1 | | Virtual Machines บน Proxmox VE | บนแท็บ **Clusters** ของคลัสเตอร์ ให้เลือก **Attach cluster to zone** คลัสเตอร์จะเข้าร่วมโซนที่ **มีอยู่แล้ว** โดยปกติคือโซนที่ขายผ่าน CloudStack | | VPN | โหนด VPN ที่รายงานช่วง IP สาธารณะจะสร้าง (หรือเข้าร่วม) โซนสำหรับประเทศของตนและใส่ช่วง IP ลงในพูล VPN คุณยังสามารถกำหนดโซนและโหนดของช่วง IP ได้ภายใต้ **VPN IP pools** | | IPv6 Proxy | โหนดพร็อกซี IPv6 ใหม่จะสร้างโซนขึ้นในสถานะ **ปิด** ให้เปิดใช้งานโซนที่นี่เพื่อให้ลูกค้าสามารถเลือกได้ | | Object Storage (S3) | ทำเครื่องหมายเลือกบริการ S3 บนโซน จากนั้นแนบแบ็คเอนด์ภายใต้ **Ceph S3 (RGW)** | ### เมื่อใดที่โซนจึงจะสามารถขายเครื่องเสมือนได้ {#when-can-a-zone-sell-virtual-machines} โซนจะแสดงแท็ก **not ready to sell VMs** จนกว่าจะมีแบ็คเอนด์ที่ใช้งานได้และขายได้อย่างน้อยหนึ่งรายการ **และ** มีแผนที่มองเห็นได้อย่าวาน้อยหนึ่งแผน **และ** มีเทมเพลตที่พร้อมใช้งานบนแบ็คเอนด์นั้นอย่างน้อยหนึ่งรายการ แบบฟอร์มสั่งซื้อของลูกค้าจะแสดงเฉพาะโซนที่พร้อมแล้วเท่านั้น ## ตรวจสอบ {#verify} 1. โซนจะปรากฏในรายการเป็น **On** พร้อมกับธงที่ถูกต้อง 2. หน้ารายละเอียดจะแสดงแบ็คเอนด์หรือช่วง IP ของ VPN ตามที่คุณคาดไว้ 3. สำหรับ VM: แท็ก **not ready to sell VMs** จะหายไป ในพอร์ทัลลูกค้า ให้เริ่มการสั่งซื้อและตรวจสอบว่ามีโซนนั้นเสนอให้เลือก ## ข้อจำกัดและหมายเหตุ {#limits-and-notes} - ใน NexCMP รุ่นนี้ ลูกค้าจะสั่งซื้อเครื่องเสมือนใน **โซนเริ่มต้น** (โซน 1) โซนอื่น ๆ จะใช้สำหรับ VPN, IPv6 Proxy และ Object Storage หรือเพื่อเตรียมสถานที่ก่อนที่จะมีโครงสร้างพื้นฐาน หมายเหตุใต้รายการโซนก็ระบุไว้เช่นเดียวกัน - โซนจะสามารถลบได้ก็ต่อเมื่อไม่มีสิ่งใดแนบอยู่เลย: ไม่มีแบ็คเอนด์, VM, แผน หรือช่วง IP ของ VPN โซนเริ่มต้นจะไม่สามารถลบได้ ให้ตั้งค่าโซนอื่นเป็นโซนเริ่มต้นก่อน - โซนที่เป็นของรีเซลเลอร์จะสามารถเปิดหรือปิด รวมถึงซ่อนหรือแสดงได้โดยคุณเท่านั้น ฟิลด์อื่น ๆ ของโซนจะถูกล็อกไว้ - Slug เป็นส่วนหนึ่งของการอ้างอิงภายใน เลือกเพียงครั้งเดียว ## การแก้ Problme {#troubleshooting} | อาการ | สาเหตุ | วิธีแก้ปัญหา | |---|---|---| | "ต้องระบุชื่อโซน" / "เลือกประเทศ" / "เลือกอย่างน้อย 1 บริการ" | ฟิลด์ที่จำเป็นว่างอยู่ | กรอกชื่อ เลือกประเทศ และทำเครื่องหมายเลือกบริการ | | "Slug ไม่ถูกต้อง (a-z 0-9 -, 2-32 ตัวอักษร)" | Slug มีอักขระอื่นหรือมีความยาวไม่ถูกต้อง | ใช้ตัวอักษรพิมพ์เล็ก ตัวเลข และยัติภังค์เท่านั้น | | ป้ายกำกับ "not ready to sell VMs" | ไม่มีแบ็กเอนด์ที่พร้อมขาย ไม่มีแพ็กเกจ หรือไม่มีเทมเพลตที่พร้อมใช้งานในโซนนั้น | เชื่อมต่อโครงสร้างพื้นฐาน จากนั้นเพิ่มแพ็กเกจและเทมเพลต ดู [Plans](https://nexcmp.com/th/docs/catalog/plans/) และ [Templates](https://nexcmp.com/th/docs/infrastructure/templates/) | | การลบถูกปิดใช้งานเนื่องจาก "still attached" | โซนนี้มีแบ็กเอนด์, VM, แพ็กเกจ หรือช่วง VPN อยู่ | นำออกหรือย้ายรายการเหล่านั้นก่อน | | การลบถูกปิดใช้งานเนื่องจาก "Default zone" | โซนนี้คือโซนเริ่มต้น | ตั้งค่าโซนอื่นเป็นโซนเริ่มต้น | | ลูกค้ามองไม่เห็นโซนนี้ | โซนถูกซ่อน ไม่ใช้งาน หรือไม่ได้ทำเครื่องหมายเลือกบริการ | ตั้งค่า Visibility เป็น Public, Active เป็น On และทำเครื่องหมายเลือกบริการ | | โซน S3 หายไปจากฟอร์มแบ็กเอนด์ | บริการ S3 ไม่ได้ถูกทำเครื่องหมายเลือกบนโซน | แก้ไขโซนและทำเครื่องหมายเลือก **Object Storage (S3)** | --- # CloudStack > **ตำแหน่งในหน้าผู้ดูแลระบบ:** Infrastructure › Cloud provider › CloudStack › API connection (`/infra/cloudstack?tab=connect`) การเชื่อมต่อครั้งแรกสามารถทำได้ใน [setup wizard](https://nexcmp.com/th/docs/getting-started/setup-wizard/) ขั้นตอนที่ 2 ## What it does {#what-it-does} NexCMP จำหน่ายเครื่องเสมือนที่ทำงานบนคลาวด์ Apache CloudStack ของคุณ โดยจะทำหน้าที่ปรับใช้ เริ่มต้น หยุด ปรับขนาด สร้างสแนปชอต และลบ VM ผ่าน CloudStack API แจกจ่ายที่อยู่ IP สาธารณะจากโซน อ่านการใช้งานสำหรับการเรียกเก็บเงินและแบนด์วิดท์ รวมถึงแสดงความจุและสถานะในคอนโซลผู้ดูแลระบบ CloudStack ยังคงเป็นแหล่งข้อมูลหลักสำหรับไฮเปอร์ไวเซอร์ ส่วน NexCMP ทำหน้าที่เป็นหน้าร้าน ระบบเรียกเก็บเงิน และพอร์ทัลที่อยู่ด้านบน ใช้หน้านี้เมื่อ CloudStack เป็น (หรือจะเป็น) แหล่งที่มาของ VM หลักของคุณ สำหรับแหล่งที่มาสำรองถัดไป โปรดดู [Proxmox VE](https://nexcmp.com/th/docs/infrastructure/proxmox/) ## ข้อกำหนด {#requirements} | Item | Requirement | |---|---| | เวอร์ชัน CloudStack | 4.23 คือรุ่นที่ผ่านการทดสอบ คอนโซล VM ต้องใช้ 4.18 หรือใหม่กว่า และการปรับขนาด CPU/RAM แบบสดของ VM ที่กำลังทำงานต้องใช้ 4.23 ร่วมกับ KVM | | ประเภทโซน | โซนที่มีเครือข่ายเกสต์อย่างน้อยหนึ่งเครือข่ายสำหรับ VM ของลูกค้า และช่วง IP สาธารณะที่มีแอดเดรสว่าง | | ไฮเปอร์ไวเซอร์ | KVM คือไฮเปอร์ไวเซอร์ที่ผ่านการทดสอบ | | บัญชี | **โดเมนและบัญชีเฉพาะ**ที่สร้างขึ้นสำหรับ NexCMP ห้ามใช้คีย์ผู้ดูแลระบบ ROOT เด็ดขาด | | การเข้าถึง API | เซิร์ฟเวอร์แผงควบคุมต้องสามารถเข้าถึง URL ของ API ของเซิร์ฟเวอร์การจัดการ (`https://cloudstack.example.com/client/api`) ผ่าน HTTP(S) คอนโซล VM แบนด์วิดท์ และฟีเจอร์ Kubernetes ใช้จุดสิ้นสุดเดียวกัน | | คีย์อ่านอย่างเดียวที่เป็นทางเลือก | คีย์แบบอ่านอย่างเดียวตัวที่สองช่วยให้คอนโซลผู้ดูแลระบบแสดงโฮสต์ สตอเรจ VM ของระบบ และช่วง IP สาธารณะได้ ไม่จำเป็นต้องใช้สำหรับการขาย VM | | IP สาธารณะ | แอดเดรส IPv4 สาธารณะที่ว่างในโซน คำนำหน้าที่ NexCMP สามารถขายได้จะถูกกำหนดค่าภายใต้ Sales IP pools | | เทมเพลต | เทมเพลตที่พร้อมใช้งานและเปิดใช้งานรหัสผ่านอย่างน้อยหนึ่งรายการ และ offering บริการหนึ่งรายการที่บัญชีของคุณมองเห็น ดูที่ [Templates](https://nexcmp.com/th/docs/infrastructure/templates/) | | สตอเรจ | สตอเรจหลักสำหรับโวลุ่มของบัญชี และสตอเรจสำรองหากคุณขายสแนปชอตหรืออิมเมจ | | ขึ้นอยู่กับ | ไม่มี Kubernetes, Private Cloud, Images และ Bandwidth ขึ้นอยู่กับหน้านี้ | ::: warning อย่าใช้คีย์ผู้ดูแลระบบ ROOT สร้างโดเมนและบัญชีเฉพาะสำหรับ NexCMP คีย์ดังกล่าวจะเข้าถึงได้เฉพาะโดเมนนั้นเท่านั้น และคีย์ที่รั่วไหลจะไม่สามารถเข้าถึงส่วนที่เหลือของคลาวด์ของคุณได้ ตัวช่วยตั้งค่า (wizard) ยังตรวจสอบด้วยว่าเน็ตเวิร์กที่คุณเลือกเป็นของโซน **และ** เป็นของบัญชีที่เป็นเจ้าของคีย์ ::: ## เตรียมโครงสร้างพื้นฐาน {#prepare-the-infrastructure} คำสั่งเหล่านี้ใช้ [CloudMonkey](https://cloudstack.apache.org/) (`cmk`) ที่ล็อกอินในฐานะผู้ดูแลระบบ CloudStack แทนที่ชื่อตัวอย่างและตัว placeholder ในเครื่องหมายวงเล็บมุม ### สร้างบัญชีเฉพาะและคีย์ API {#create-a-dedicated-account-and-api-key} 1. สร้างโดเมนที่จะเก็บทุกสิ่งที่ NexCMP เป็นเจ้าของ ```bash cmk create domain name=nexcmp ``` จดบันทึก `id` ในเอาต์พุต ซึ่งจะถูกใช้เป็น `` ด้านล่าง 2. ค้นหาบทบาทที่คุณต้องการกำหนดให้กับบัญชี ```bash cmk list roles type=DomainAdmin filter=id,name ``` | บทบาท | ควรเลือกเมื่อใด | |---|---| | **Domain Admin** (แนะนำ) | ชุดฟีเจอร์เต็มรูปแบบ: VM, เน็ตเวิร์ก, โปรเจกต์สำหรับ Kubernetes, VPC, อิมเมจ ขอบเขตการทำงานสิ้นสุดที่โดเมน `nexcmp` | | User | วงจรชีวิตของ VM เท่านั้น ผู้ใช้ทั่วไปจะไม่สามารถลบ VM ถาวรได้เว้นแต่การตั้งค่าส่วนกลาง `allow.user.expunge.recover.vm` เป็น true จากนั้น NexCMP จะหยุด VM และ CloudStack จะลบ VM ถาวรหลังจาก `expunge.delay` | 3. สร้างบัญชีและผู้ใช้คนแรก ใช้รหัสผ่านสุ่มที่ยาว; จะไม่ต้องพิมพ์ซ้ำอีก ```bash cmk create account name=nexcmp-api username=nexcmp-api \ password='CHANGE-ME-LONG-RANDOM' email=ops@example.com \ firstname=NexCMP lastname=API roleid= domainid= ``` 4. สร้างคู่คีย์ API สำหรับผู้ใช้ใหม่ ```bash cmk list users domainid= username=nexcmp-api filter=id,username cmk generate userkeys id= ``` คัดลอก `apikey` และ `secretkey` นี่คือ **API key** และ **Secret key** ที่คุณป้อนใน NexCMP NexCMP จะจัดเก็บแบบเข้ารหัสและแสดงเฉพาะอักษร 4 ตัวสุดท้ายหลังจากนั้น 5. ตรวจสอบให้แน่ใจว่าโดเมนไม่มีขีดจำกัดทรัพยากรที่เข้มงวด (instances, โวลุ่ม, IP สาธารณะ, เน็ตเวิร์ก, สแนปชอต, เทมเพลต, โปรเจกต์) ```bash cmk list resourcelimits domainid= ``` ### สร้างเน็ตเวิร์กเกสต์สำหรับ VM ของลูกค้า {#create-the-guest-network-for-customer-vms} VM ของลูกค้าจะถูกปรับ ใช้งานในเน็ตเวิร์กเกสต์เดียวที่เป็นของบัญชีใหม่ เน็ตเวิร์กแบบไอโซเลทที่มีเราเตอร์เสมือน (VR) และบริการ Static NAT, Firewall และ Port Forwarding จะทำงานได้ดี เนื่องจาก NexCMP จะเชื่อมโยง IP สาธารณะเข้ากับแต่ละ VM ด้วย static NAT ```bash cmk list networkofferings state=Enabled guestiptype=Isolated filter=id,name cmk create network name=customers displaytext=customers zoneid= \ networkofferingid= account=nexcmp-api domainid= ``` ตรวจสอบนโยบาย egress เริ่มต้นของ offering: หากเป็น "deny" VM ของลูกค้าจะไม่มีการเข้าถึงภายนอกจนกว่าจะมีการเพิ่มกฎ firewall egress ### ทำให้ offering และ template มองเห็นได้ {#make-offerings-and-templates-visible} - **Service offerings** และ **network offerings** จะต้องเป็นแบบสาธารณะหรือกำหนดให้กับ `nexcmp` domain ไม่เช่นนั้นบัญชีจะไม่สามารถแสดงรายการหรือใช้งานได้ - ลงทะเบียนหรือแชร์ template อย่างน้อยหนึ่งรายการ (ดู [Templates](https://nexcmp.com/th/docs/infrastructure/templates/)) NexCMP จะแสดงรายการ template ที่พร้อมใช้งานและเป็นรายการเด่น ### ตัวเสริม: คีย์แบบอ่านได้อย่างเดียวสำหรับหน้าโครงสร้างพื้นฐาน {#optional-read-only-key-for-infrastructure-pages} แท็บ **Capacity**, **Host**, **Storage** และ **System VM** รวมถึงรายการช่วง IP สาธารณะจะใช้คีย์ตัวที่สองที่ต้องการเพียงสิทธิ์การอ่านสำหรับหกคำสั่งเท่านั้น ให้สร้างบทบาทแบบจำกัดแทนที่จะนำคีย์ผู้ดูแลระบบเต็มรูปแบบมาใช้ซ้ำ: ```bash cmk create role name=nexcmp-readonly type=Admin # is the id printed above for api in listHosts listCapacity listSystemVms listVlanIpRanges listClusters listStoragePools; do cmk create rolepermission roleid= rule=$api permission=allow done cmk create rolepermission roleid= rule='*' permission=deny ``` จากนั้นสร้างบัญชีด้วยบทบาทนั้น (ใน ROOT domain เนื่องจากมีการอ่านข้อมูลทั่วทั้งโซน) สร้างคีย์เหมือนขั้นตอนที่ 4 และป้อนคีย์เหล่านั้นเป็น **RO API key** ในส่วนถัดไป ### ตรวจสอบเส้นทางเครือข่าย {#check-the-network-path} จากเซิร์ฟเวอร์แผงควบคุม: ```bash curl -fsS -o /dev/null -w '%{http_code}\n' https://cloudstack.example.com/client/api ``` การตอบกลับแบบ HTTP ใดก็ตาม (แม้แต่ 4xx) ก็แสดงว่าพอร์ตสามารถเข้าถึงได้ หากเกิด Timeouts แสดงว่ามีปัญหาไฟร์วอลล์หรือ DNS ฝั่งคุณ ## เชื่อมต่อใน NexCMP {#connect-in-nexcmp} ### ในวิซาร์ดการตั้งค่า {#in-the-setup-wizard} ขั้นตอนที่ 2 ของ [setup wizard](https://nexcmp.com/th/docs/getting-started/setup-wizard/) จะขอค่าเดิม **Test connection** จะแสดงรายการโซนและเครือข่ายที่คีย์มองเห็น; ให้เลือกโซนและเครือข่ายเกสต์, ชื่อที่แสดงสำหรับโซนและประเทศ จากนั้นคลิก **Save CloudStack** วิซาร์ดจะปฏิเสธเครือข่ายที่ไม่อยู่ในโซนนั้นหรือไม่สามารถมองเห็นได้ด้วยคีย์ ![ขั้นตอนที่ 2 ของวิซาร์ดซึ่งกรอก URL และคีย์ API ของ CloudStack แล้ว พร้อมทั้งเลือกโซนและเครือข่ายหลังทดสอบการเชื่อมต่อ](https://nexcmp.com/th/docs/images/infrastructure/cloudstack-01-wizard-step.webp) ### ภายหลังในคอนโซลผู้ดูแลระบบ {#later-in-the-admin-console} 1. เปิด **Infrastructure › Cloud provider › CloudStack** แล้วเลือกแท็บ **API connection** 2. กรอกข้อมูลในส่วน **Connection**: | ฟิลด์ | ค่าตัวอย่าง | |---|---| | Endpoint API | `https://cloudstack.example.com/client/api` | | API key (สิทธิ์เขียน) | `XXXX` (เว้นว่างไว้เพื่อรักษาคีย์ที่บันทึกไว้เดิม) | | Secret key | `XXXX` | | คีย์ API แบบ RO / คีย์ลับแบบ RO | ไม่บังคับ จากบัญชีแบบอ่านอย่างเดียว | | Zone ID | UUID ของโซนของคุณ | ![แท็บการเชื่อมต่อ API พร้อม Endpoint ตัวอย่างและคีย์ที่ซ่อนไว้](https://nexcmp.com/th/docs/images/infrastructure/cloudstack-02-connect-form.webp) 3. คลิก **Test connection** ก่อนบันทึก ระบบจะทดสอบคีย์ที่คุณพิมพ์โดยยังไม่บันทึก ได้แก่ คีย์เขียนด้วย `listZones` และ `listCapabilities` รวมถึงคีย์อ่านอย่างเดียวด้วย `listSystemVms` 4. คลิก **Save connection** เปิด **Enable CloudStack connection** ไว้; การปิดสวิตช์นี้จะทำให้เวิร์กเกอร์หยุดงาน CloudStack ทั้งหมดโดยที่ข้อมูลไม่สูญหาย 5. เปิด **Services › Virtual Machines › Policy › Provisioning** เพื่อตั้งค่าเครือข่ายเกสต์เริ่มต้น, ออฟเฟอริงกำหนดเอง และคีย์แพร์เริ่มต้นสำหรับ VM ใหม่ ![นโยบาย VM, แท็บ Provisioning พร้อม ID เครือข่ายเริ่มต้น](https://nexcmp.com/th/docs/images/infrastructure/cloudstack-04-provisioning.webp) 6. เปิด **Infrastructure › Cloud provider › Sales IP pools** และภายใต้ **Configure sales ranges** ให้ตั้งค่า **Sellable IP range prefixes** (ตัวอย่างเช่น `203.0.113.`) และ **Excluded IP prefixes** หากมีแอดเดรสบางตัวในโซนที่ห้ามขายเด็ดขาด เว้น prefix ว่างไว้เพื่ออนุญาตทุกแอดเดรสที่ว่างอยู่ ![พูล IP สำหรับขายพร้อม prefix ที่ขายได้ 203.0.113. ที่ตั้งค่าไว้](https://nexcmp.com/th/docs/images/infrastructure/cloudstack-05-sales-ip-pool.webp) ### สิ่งที่ NexCMP อ่านและเขียน {#what-nexcmp-reads-and-writes} | พื้นที่ | อ่าน | เปลี่ยนแปลง | |---|---|---| | VMs | รายการ, สถานะ, ประวัติการใช้งาน, ปลายทางคอนโซล | ปรับใช้, เริ่ม, หยุด, รีบูต, ติดตั้งใหม่, ทำลาย, สเกล, รีเซ็ตพาสเวิร์ดและ SSH Keys | | ดิสก์และสแนปชอต | วอลุ่ม, สแนปชอต VM, สำรองข้อมูล | สร้าง, แนบ, ถอด, ปรับขนาด, ลบ, สแนปชอต, กู้คืน | | ระบบเครือข่าย | เครือข่าย, เราเตอร์, IP สาธารณะ, ไฟร์วอลล์, การส่งต่อพอร์ต, กฎโหลดบาลานเซอร์ | เชื่อมโยงและปล่อย IP สาธารณะ, Static NAT, ไฟร์วอลล์, การส่งต่อพอร์ต, กฎ Egress, เครือข่ายและ ACL สำหรับ Private Cloud | | แคตตาล็อก | บริการ, ออฟเฟอริงดิสก์และเครือข่าย, เทมเพลต, ISO, ประเภท OS | ลงทะเบียนและลบเทมเพลตและ ISO (Images), ออฟเฟอริงบริการเมื่อสร้างแพ็กเกจกำหนดเอง | | Kubernetes | เวอร์ชันที่รองรับ, คลัสเตอร์, การกำหนดค่า | โปรเจกต์, ขีดจำกัดทรัพยากร, เครือข่าย, คลัสเตอร์ (โมดูล Kubernetes) | | คีย์อ่านอย่างเดียว | โฮสต์, คลัสเตอร์, สตอเรจพูล, ระบบ VM, ความจุ, ช่วง IP ของ VLAN | ไม่มี | ### CPU และ RAM แบบเรียลไทม์ รวมถึงแบนด์วิดท์ {#live-cpu-and-ram-and-bandwidth} - **Hot-plug.** VM ที่กำลังทำงานอยู่สามารถปรับขนาดได้โดยไม่ต้องรีบูตเฉพาะเมื่อเทมเพลตอนุญาต (ปรับขนาดได้แบบไดนามิก) และระบบปฏิบัติการแขกนำ CPU และ RAM ใหม่เข้าสู่ระบบ NexCMP จะเปิดใช้งาน Auto Scaling สำหรับเทมเพลตที่มีชื่อลงท้ายด้วย `vN` โดยมี N ตั้งแต่ 6 ขึ้นไป หรือเมื่อคุณตั้งค่าด้วยตนเองในฟิลด์ **vCPU/RAM hot-plug** ของเทมเพลต ดูที่ [Templates](https://nexcmp.com/th/docs/infrastructure/templates/). - **แหล่งที่มาของแบนด์วิดท์.** ในการตั้งค่าเริ่มต้น NexCMP จะวัดปริมาณการใช้งานจากสถิติ VM ของ CloudStack (`listVirtualMachinesUsageHistory` ซึ่งจะดึงข้อมูลทุกๆ 5 นาทีและรวมผลลัพธ์ต่ออินเทอร์เฟซเครือข่าย VM) ตัวเลขเหล่านี้รวมปริมาณการใช้งานระหว่าง VM ด้วย ดังนั้นจึงอาจสูงกว่าที่เกตเวย์เราเตอร์วัดเล็กน้อย โปรดเปิดใช้งานการเก็บรวบรวมสถิติ VM ของ CloudStack ไว้ ช่องว่างที่นานกว่าระยะเวลาเก็บรักษาสถิติจะถูกข้ามไป ดูที่ [Bandwidth](https://nexcmp.com/th/docs/catalog/bandwidth/). ## ตรวจสอบ {#verify} 1. **Test connection** จะแสดงผล "Write key: OK" พร้อมโซนของคุณและเวอร์ชัน CloudStack 2. **Infrastructure › Cloud provider › Providers** จะแสดงสถานะผู้ให้บริการว่าใช้งานอยู่ พร้อมเวลาทดสอบล่าสุด แผงสุขภาพบนแดชบอร์ดจะไม่แสดงข้อความ "CloudStack: not connected" อีกต่อไป 3. **Sales IP pools** จะแสดงรายการแอดเดรสที่ว่าง (ข้อมูลจะรีเฟรชประมาณนาทีละครั้ง) 4. สั่งซื้อ VM ขนาดเล็กจากพอร์ทัลลูกค้าหรือคอนโซลแอดมิน และตรวจสอบว่าสถานะเปลี่ยนเป็น Running มี IP สาธารณะ และคุณสามารถเปิดคอนโซลใช้งานได้ ## ข้อจำกัดและหมายเหตุ {#limits-and-notes} - NexCMP เวอร์ชันนี้สามารถเชื่อมต่อ CloudStack คลัสเตอร์ได้หนึ่งรายการ ไดล็อก **Add cloud provider** สามารถทดสอบคีย์ของคลัสเตอร์ที่สองได้ แต่ยังไม่สามารถบันทึกได้ - โซน CloudStack หนึ่งโซนจะถูกผูกไว้กับโซนเริ่มต้นของ NexCMP สำหรับ CloudStack ที่มีหลายโซน ขอบเขตจะจำกัดเฉพาะโซนที่คุณป้อน ดังนั้น VM, IP และเครือข่ายของโซนอื่นๆ จะถูกละเว้น - การลบเครือข่ายเกสต์ใน CloudStack จะทำให้การปรับ khai (deployment) ใหม่ทั้งหมดล้มเหลว คอนโซลแอดมินจะแสดงประกาศสีแดงเมื่อเครือข่ายหายไป - ข้อมูลรับรองจะไม่ถูกส่งออกจากเซิร์ฟเวอร์ API จะส่งคืนเฉพาะอักขระสี่ตัวสุดท้ายเท่านั้น ## การแก้ Problme {#troubleshooting} | อาการ | สาเหตุ | วิธีแก้ปัญหา | |---|---|---| | `listCapabilities: cloudstack 401: unable to verify user credentials and/or request signature` | API key หรือ secret ไม่ถูกต้อง, คีย์จากผู้ใช้รายอื่น, หรือปัญหาเรื่องเวลาบนเซิร์ฟเวอร์แผงควบคุม | สร้างคีย์ใหม่อีกครั้งด้วย `cmk generate userkeys` และวางข้อมูลทั้งสองค่า ตรวจสอบเวลาของเซิร์ฟเวอร์แผงควบคุม | | การทดสอบ: `listZones: …` หรือหมดเวลา | เซิร์ฟเวอร์แผงควบคุมไม่สามารถเข้าถึง URL ของ API ได้ | ตรวจสอบ DNS, ไฟร์วอลล์ และเส้นทาง `/client/api` ที่แน่นอน | | วิซาร์ด: "network not found in that zone for this API key" | เครือข่ายที่เลือกเป็นของบัญชีหรือโซนอื่น | สร้างเครือข่ายในบัญชีเฉพาะ (ดูด้านบน) และรัน **Test connection** อีกครั้ง | | วิซาร์ด: "pick a zone and a network" | ยังไม่ได้รันการทดสอบ หรือไม่ได้เลือกโซนหรือเครือข่าย | คลิก **Test connection** และเลือกทั้งสองรายการ | | แบนเนอร์ "CloudStack key not configured" | ยังไม่มีการบันทึกคีย์ ("Connect later") | กรอกข้อมูลในบัตร Connection, คลิก **Save connection** จากนั้นคลิก **Test connection** | | แบนเนอร์ "CloudStack connection is OFF" | สวิตช์ **Enable CloudStack connection** ปิดอยู่ | เปิดสวิตช์แล้วบันทึก | | คีย์แบบอ่านอย่างเดียว: "unusable …" ในการทดสอบ | สิทธิ์ของบทบาทหายไปหรือบัญชีไม่ถูกต้อง | ตรวจสอบคำสั่งที่อนุญาตทั้งหกรายการและตรวจสอบว่าบัญชีอยู่ในโดเมน ROOT | | "Zone public IP ranges not measured yet" หรือ "no public IP ranges declared" | ไม่มีคีย์แบบอ่านอย่างเดียว หรือโซนนั้นไม่มีช่วง IP สาธารณะจริงๆ | เพิ่มคีย์แบบอ่านอย่างเดียว หรือเพิ่มช่วงพับลิกไอพีใน CloudStack | | "พูลว่าง — โปรดรอ 60 วินาทีเพื่อให้ vmd ซิงค์" | รายการ IP จะถูกรีเฟรชโดย worker ทุกๆ หนึ่งนาที | รอสักครู่แล้วรีโหลดอีกครั้ง | | "IP ฟรีในย่าน 203.0.113. หมดลงแล้ว" | แอดเดรสในพรีฟิกซ์ที่ขายได้ถูกใช้งานหมดแล้ว | เพิ่มแอดเดรสให้กับโซน ขยายพรีฟิกซ์ หรือปล่อย IP ที่ไม่ได้ใช้งาน | | "ไม่สามารถดึงข้อมูลเครือข่ายได้ (CloudStack ไม่ตอบสนองหรือคีย์ขาดสิทธิ์)" | คีย์สูญเสียสิทธิ์การเข้าถึง หรือ CloudStack ล่ม | รัน **Test connection** แล้วตรวจสอบว่าบัญชีเปิดใช้งานอยู่ | | "เครือข่ายแขก (Guest network) ไม่มีอยู่จริง" | เน็ตเวิร์กนี้ถูกลบไปแล้วใน CloudStack | สร้างเน็ตเวิร์กขึ้นใหม่อีกครั้งและตั้งค่าเป็นค่าเริ่มต้นภายใต้ Provisioning | --- # Proxmox VE > **ตำแหน่งในหน้าผู้ดูแลระบบ:** Infrastructure › Cloud provider › Providers (`/infra/providers`) จากนั้นไปที่หน้าผู้ให้บริการ (`/infra/providers/`) ที่มีแท็บ Overview, Clusters, VMs, Servers และ Credentials ตั้งค่าแพ็กเกจได้ที่ Services › Virtual Machines › Plans & pricing (`/vm/catalog`) ## What it does {#what-it-does} NexCMP สามารถขายเครื่องเสมือนที่ทำงานบนคลัสเตอร์ Proxmox VE หนึ่งคลัสเตอร์หรือมากกว่านั้น ควบคู่หรือแทนที่ CloudStack ได้ การสร้าง VM ทำได้โดยโคลนเทมเพลต OS แบบ full clone จากนั้นกำหนดค่าผ่าน cloud-init ได้แก่ ขนาด, ที่อยู่ IP จากพูลที่คุณกำหนด, รหัสผ่าน root และ SSH key ลูกค้าจะได้รับสิทธิ์การควบคุมเปิดปิดเครื่อง, คอนโซล, สแนปชอต, ติดตั้งใหม่, รีเซ็ตรหัสผ่าน และเมตริกในพอร์ทัล โดยจะไม่เห็นชื่อคลัสเตอร์, โหนด หรือแหล่งที่มาเลย ใช้งานเมื่อคุณรัน Proxmox VE อยู่แล้ว หรือเพื่อเสนอพูล VM สำรองที่มีการกำหนดราคาแตกต่างออกไป ## ข้อกำหนด {#requirements} | Item | Requirement | |---|---| | Proxmox VE | PVE 9.x การบูรณาการได้รับการตรวจสอบยืนยันบนเวอร์ชัน 9.2 โดยต้องใช้เนื้อหาในสเทอเรจ `import` และตัวเลือกดิสก์ `import-from` (PVE 8.2 หรือใหม่กว่า) | | เน็ตเวิร์กจากพาเนล | HTTPS ไปยัง API ของคลัสเตอร์ `https://:8006` ไม่มีพาธ, ชื่อผู้ใช้ หรือคิวรี ทั้งพาเนลและ worker จะทำการเชื่อมต่อเข้ามา และคอนโซลของเบราว์เซอร์จะถูกพร็อกซีผ่านพาเนล | | บัญชี | ผู้ใช้ PVE เฉพาะสำหรับ **API token** และบทบาทกำหนดเองพร้อมสิทธิ์ที่แสดงรายการด้านล่าง ห้ามใช้ `root@pam` เด็ดขาด | | สตอเรจ | สเทอเรจสำหรับดิสก์ VM ที่รองรับการโคลน (ตัวอย่างเช่น `local-lvm`) สำหรับตัวสร้างเทมเพลตในตัว ให้ใช้สเทอเรจชื่อ `local` ที่มีประเภทเนื้อหา `import` และ `snippets` | | Network | บริดจ์ Linux (ตัวอย่างเช่น `vmbr0`) ที่เชื่อมต่อไปยังเน็ตเวิร์กซึ่งที่อยู่ IP ของลูกค้าอยู่ ใช้บริดจ์ที่รองรับ VLAN หากคุณป้อนแท็ก VLAN | | IP | บล็อก IPv4 (/16 ถึง /30) ที่กำหนดเส้นทางไปยังบริดจ์นั้น พร้อมเกตเวย์ NexCMP จะทำการกำหนดแอดเดรสเอง เนื่องจาก Proxmox ไม่มีระบบจัดการ IP | | เทมเพลต | เทมเพลต VM แบบ cloud-init หนึ่งรายการต่อ OS บนทุกโหนดที่คุณปรับ the deployment พร้อมกับ QEMU guest agent | | โซน | โซนที่มีอยู่เพื่อเชื่อมต่อคลัสเตอร์เข้าด้วยกัน ดูเพิ่มเติมที่ [Zones](https://nexcmp.com/th/docs/infrastructure/zones/) | | ขึ้นอยู่กับ | ไม่มี | ## เตรียมโครงสร้างพื้นฐาน {#prepare-the-infrastructure} รันคำสั่งในฐานะ root บนโหนดคลัสเตอร์ใดก็ได้ ### 1. สร้างบทบาทสิทธิ์น้อยที่สุด ผู้ใช้ และ API token {#_1-create-a-least-privilege-role-user-and-api-token} 1. สร้างบทบาท รายการสิทธิ์เป็นสิ่งที่ NexCMP ใช้พอดี ไม่มีสิ่งใดที่แก้ไขผู้ใช้ คำจำกัดความของสเทอเรจ หรือดาต้าเซ็นเตอร์ ```bash pveum role add NexCMP -privs "VM.Allocate VM.Clone VM.Config.CDROM VM.Config.CPU VM.Config.Cloudinit VM.Config.Disk VM.Config.HWType VM.Config.Memory VM.Config.Network VM.Config.Options VM.PowerMgmt VM.Audit VM.Console VM.Snapshot VM.Snapshot.Rollback VM.Backup VM.GuestAgent.Audit VM.GuestAgent.Unrestricted Datastore.Audit Datastore.AllocateSpace Datastore.AllocateTemplate Sys.Audit Sys.AccessNetwork SDN.Use SDN.Audit Pool.Audit Mapping.Audit Mapping.Use" ``` `Sys.AccessNetwork` จำเป็นสำหรับการดาวน์โหลดอิมเมจคลาวด์ PVE 9 ไม่มีสิทธิ์ `VM.Monitor` ดังนั้นห้ามเพิ่มลงไป 2. สร้างผู้ใช้และโทเค็น `--privsep 1` หมายความว่าสิทธิ์ของโทเค็นคือการ **อินเตอร์เซกชัน** ระหว่างสิทธิ์ของผู้ใช้และสิทธิ์ของโทเค็นเอง ```bash pveum user add nexcmp@pve --comment "NexCMP" pveum user token add nexcmp@pve api --privsep 1 ``` คำสั่งจะพิมพ์โทเค็น **secret ออกมาครั้งเดียว** (เป็น UUID) โปรดคัดลอกเก็บไว้ตอนนี้ ID ของโทเค็นคือ `nexcmp@pve!api`. 3. กำหนดบทบาทให้กับ **ทั้ง** ผู้ใช้และโทเค็น นี่คือขั้นตอนที่คนมักพลาด เนื่องจากมีการแยกสิทธิ์ มีเพียงโทเค็นเท่านั้นที่จะได้รับข้อผิดพลาด 403 เช่น `Datastore.Audit` หากผู้ใช้ไม่มีสิทธิ์ ```bash pveum acl modify / --roles NexCMP --users nexcmp@pve pveum acl modify / --roles NexCMP --tokens 'nexcmp@pve!api' ``` 4. ทดสอบการทำงานจากเซิร์ฟเวอร์พาเนล: ```bash curl -sk -H 'Authorization: PVEAPIToken=nexcmp@pve!api=' https://192.0.2.10:8006/api2/json/version ``` เอกสาร JSON ที่มี `version` หมายความว่าโทเค็นทำงานได้ (`-k` ใช้สำหรับการตรวจสอบอย่างรวดเร็วนี้เท่านั้น โดย NexCMP จะทำการตรึงใบรับรองด้วยตัวเอง ดูรายละเอียดด้านล่าง) ### 2. ตรวจสอบบริดจ์และที่เก็บข้อมูล {#_2-check-the-bridge-and-the-storage} ```bash pvesm status # storages, type, content and free space ip -br link show type bridge ``` - VM ของลูกค้าจะได้รับอินเทอร์เฟซเครือข่าย `virtio` บนบริดจ์ที่คุณป้อนใน NexCMP หากคุณตั้งค่า VLAN บริดจ์นั้นจะต้องรองรับ VLAN (VLAN-aware) - วาง VM ของลูกค้าไว้บนบริดจ์หรือ VLAN **แยกต่างหากจาก address การจัดการของโหนด** หากใช้เครือข่ายร่วมกัน ชุด IP การจัดการอัตโนมัติของไฟร์วอลล์ Proxmox จะเปิดพอร์ต 22, 8006, 3128, 5900-5999 และ 60000-60050 ของโหนดให้กับทุก VM ในเครือข่ายนั้น หากไม่สามารถแยกกันได้ ให้เพิ่มกฎ DROP สำหรับซับเน็ตของ VM ไปยังพอร์ตดังกล่าวไว้เหนือพอร์ตการจัดการแบบ ACCEPT ### 3. หมายเหตุเกี่ยวกับที่เก็บข้อมูล (LVM-thin) {#_3-storage-notes-lvm-thin} - ปล่อยให้การทำ zeroing ของ thin-pool **เป็นค่าเริ่มต้น** การปิดใช้งาน (`lvchange -Zn`) อาจทำให้มีข้อมูลเก่าหลงเหลืออยู่ในบล็อกที่จัดสรรใหม่ และสร้างความเสียหายให้กับตารางพาร์ติชันหรือระบบไฟล์ของ VM ที่ถูกโคลน - ดิสก์ที่รายงาน "write cache: disabled" อาจมีความเร็วในการโคลนเพียงไม่กี่ MB/s เท่านั้น ให้ตรวจสอบด้วย `hdparm -W /dev/sdX` และเปิดใช้งานแคชการเขียนหากดิสก์มีระบบป้องกันไฟดับ ### 4. เปิดใช้งานเนื้อหา `import` (สำหรับตัวสร้างเทมเพลตในตัวเท่านั้น) {#_4-enable-the-import-content-only-for-the-built-in-template-builder} ตัวสร้างในตัวจะดาวน์โหลดอิมเมจคลาวด์ไปยังที่เก็บข้อมูลชื่อ `local` และสร้างเทมเพลตจากอิมเมจนั้น เพิ่ม `import` (และ `snippets`) ลงในรายการเนื้อหาของที่เก็บข้อมูลนั้น รักษาประเภทที่คุณใช้อยู่เดิมไว้ เนื่องจาก `--content` จะแทนที่รายการทั้งหมด: ```bash pvesm status --storage local # note the current content pvesm set local --content iso,vztmpl,backup,import,snippets ``` ### 5. สร้างเทมเพลต OS จากอิมเมจคลาวด์ {#_5-build-an-os-template-from-a-cloud-image} เทมเพลตคือ VM แบบ cloud-init ที่ NexCMP ทำการโคลน แต่ละรายการจะลงทะเบียนภายใต้ **OS key** สั้น ๆ เช่น `ubuntu-24.04` พร้อมกับ ID ของ VM นั้น สร้างเทมเพลตหนึ่งชุดต่อหนึ่ง OS **บนทุกโหนดที่จะรับ VM** เนื่องจากการโคลนจะทำงานบนโหนดที่เลือก **ตัวเลือก A แนะนำ: สร้างด้วยตัวเอง** อิมเมจคลาวด์สต็อกของ Ubuntu และ Debian ไม่มี guest agent และไม่อนุญาตให้ล็อกอินด้วย root โดย NexCMP จะตั้งค่ารหัสผ่าน root ผ่านทาง cloud-init ให้เตรียมอิมเมจก่อนดังนี้: ```bash apt install -y libguestfs-tools wget -O noble.qcow2 https://cloud-images.ubuntu.com/noble/current/noble-server-cloudimg-amd64.img virt-customize -a noble.qcow2 --install qemu-guest-agent \ --write /etc/cloud/cloud.cfg.d/99-nexcmp.cfg:$'ssh_pwauth: true\ndisable_root: false\n' \ --write /etc/ssh/sshd_config.d/00-nexcmp.conf:$'PermitRootLogin yes\nPasswordAuthentication yes\n' ``` จากนั้นสร้าง VM เทมเพลต (id 9000 เป็นตัวอย่าง; ให้เก็บ id เทมเพลตไว้ต่ำกว่าค่า `vmid from` ซึ่งค่าเริ่มต้นคือ 1000): ```bash qm create 9000 --name tpl-ubuntu-24-04 --memory 2048 --cores 2 --cpu host --ostype l26 \ --scsihw virtio-scsi-single --net0 virtio,bridge=vmbr0 --agent 1 --serial0 socket --vga serial0 qm set 9000 --scsi0 local-lvm:0,import-from=$PWD/noble.qcow2,discard=on,iothread=1 qm set 9000 --ide2 local-lvm:cloudinit --boot order=scsi0 qm template 9000 ``` **ตัวเลือก B: ตัวสร้างในตัว** การ์ด **Create OS template from cloud image** บนแท็บ Clusters (ดูด้านล่าง) จะดาวน์โหลดอิมเมจ qcow2 สร้างเทมเพลตและลงทะเบียนไว้ โดยจะสร้าง VM พร้อมกับ cloud-init และแฟล็ก guest agent แต่จะไม่เปลี่ยนแปลงเนื้อหาภายในอิมเมจ ให้ใช้ตัวเลือกนี้เฉพาะกับอิมเมจที่อนุญาตให้ล็อกอิน root และรัน guest agent อยู่แล้ว หรือเมื่อคุณระบุสนิปเพ็ต cloud-init vendor-data เพิ่มเติม จำเป็นต้องมี guest agent สำหรับ **Reset password** และสำหรับการแสดงที่อยู่ IP ของ VM ### 6. ตรวจสอบลายนิ้วมือใบรับรอง (ไม่บังคับ) {#_6-know-the-certificate-fingerprint-optional} NexCMP เชื่อถือคลัสเตอร์ด้วยการตรึงลายนิ้วมือ SHA-256 ของใบรับรอง TLS ดังนั้นการใช้ใบรับรองที่ลงนามด้วยตนเองจึงใช้งานได้ วิธีดูค่าที่ NexCMP จะทำการตรึง: ```bash openssl x509 -in /etc/pve/local/pve-ssl.pem -noout -fingerprint -sha256 ``` ## เชื่อมต่อใน NexCMP {#connect-in-nexcmp} 1. เปิด **Infrastructure › Cloud provider › Providers** และคลิก **Add cloud provider** เลือก **Proxmox VE** แล้วกรอกข้อมูลดังนี้: | ฟิลด์ | ค่าตัวอย่าง | |---|---| | Name | `Proxmox cluster 1` | | Endpoint | `https://192.0.2.10:8006` | | Token id | `nexcmp@pve!api` | | Token secret | `XXXX` (UUID ที่พิมพ์ออกมาในขั้นตอนที่ 1) | | สลัก (Slug) | `pve-1` (a-z, 0-9, ขีดกลาง, ความยาว 2-32 ตัวอักษร) | | Default node | `pve1` (ว่าง: โหนดออนไลน์ที่มี RAM ว่างมากที่สุด) | | สตอเรจ | `local-lvm` | | Bridge | `vmbr0` | ![ไดอะล็อกเพิ่มผู้ให้บริการคลาวด์โดยเลือก Proxmox VE และมีตัวอย่างค่าเอนด์พอยต์ โทเค็น และสตอเรจ](https://nexcmp.com/th/docs/images/infrastructure/proxmox-01-add-provider.webp) 2. คลิก **Save & open provider** แล้วป้อนเหตุผลเมื่อระบบถาม โทเค็นจะถูกเข้ารหัสก่อนจัดเก็บ 3. บนแท็บ **Overview** ให้คลิก **Test connection** การทดสอบครั้งแรกที่สำเร็จจะ**พินลายนิ้วมือ TLS ของคลัสเตอร์** และหลังจากนั้นจะปฏิเสธใบรับรองอื่น 4. เปิดแท็บ **Clusters** การ์ด **Node · storage · bridge** จะแสดงสิ่งที่ API มองเห็น ส่วนการ์ด **Cluster configuration** จะเก็บการตั้งค่า: | ฟิลด์ | ความหมาย | |---|---| | Default node | โหนดที่ใช้สำหรับ VM ใหม่ ค่าว่างหมายถึงโหนดออนไลน์ที่มี RAM ว่างมากที่สุด | | Storage, Bridge, VLAN | ดิสก์สตอเรจ, NIC bridge และแท็ก VLAN ที่เลือกได้ (0 หมายถึงไม่มี) | | CPU type | `host` เป็นค่าเริ่มต้น ใช้ `x86-64-v2-AES` เมื่อโหนดมีรุ่น CPU ต่างกัน | | vmid from | ID ของ VM แรกที่กำหนดให้ VM ของลูกค้า (ค่าเริ่มต้น 1000) | | Storage ISO, Storage backup | เว้นว่างไว้เว้นแต่คุณจะใช้งาน ค่าว่างหมายถึงไม่มีการให้บริการฟีเจอร์ ISO และสำรองข้อมูล | | Template OS | บรรทัดละหนึ่งรายการ `os-key=vmid` เช่น `ubuntu-24.04=9000` | | Pinned TLS fingerprint (SHA-256) | กรอกอัตโนมัติจากการทดสอบครั้งแรก ล้างค่าแล้วทดสอบอีกครั้งหลังจากที่คุณเปลี่ยนใบรับรองคลัสเตอร์ | ![แท็บ Clusters และการ์ด Cluster configuration พร้อมตัวอย่างโหนด สตอเรจ บริดจ์ และรายการเทมเพลต OS](https://nexcmp.com/th/docs/images/infrastructure/proxmox-03-cluster-config.webp) 5. ไม่บังคับ: หากคุณใช้ตัวเลือก B ด้านบน ให้กรอก **Create OS template from cloud image** (คีย์ OS `ubuntu-24.04`, vmid `9000`, โหนด `pve1`, URL อิมเมจ qcow2) แล้วคลิก **Create template** การทำงานจะรันอยู่เบื้องหลังสักครู่ ผลลัพธ์จะอยู่ใน Audit log ![การ์ด Create OS template from cloud image พร้อมตัวอย่าง URL อิมเมจ Ubuntu](https://nexcmp.com/th/docs/images/infrastructure/proxmox-04-template-from-image.webp) 6. คลิก **Add pool** ใน **Cluster IP pool** และสร้างพูลที่ VM จะดึงแอดเดรสมาใช้: | ฟิลด์ | ค่าตัวอย่าง | |---|---| | Name | `customers-1` | | CIDR | `198.51.100.0/24` | | Gateway | `198.51.100.1` (ไม่เคยกำหนดให้ VM) | | DNS | `1.1.1.1,8.8.8.8` (1 ถึง 4 แอดเดรส IPv4) | | Bridge, VLAN | `vmbr0`, `0` | | Already used IPs | บรรทัดละหนึ่งรายการ `ip note` เช่น `198.51.100.10 monitoring` | NexCMP จะไม่กำหนดแอดเดรสเครือข่าย, แอดเดรสบรอดคาสต์, เกตเวย์ หรือแอดเดรสที่สงวนไว้ พูลของคลัสเตอร์เดียวกันต้องไม่ทับซ้อนกัน พูลจะสามารถลบได้ก็ต่อเมื่อไม่มีแอดเดรสใดถูกใช้งานอยู่ ![ไดอะล็อกเพิ่มพูล IP พร้อมตัวอย่าง /24 และเกตเวย์](https://nexcmp.com/th/docs/images/infrastructure/proxmox-05-ip-pool.webp) 7. ใน **Attach cluster to zone** ให้เลือกโซน และระบุชื่อโหนด (ไม่บังคับ) จากนั้นคลิก **Attach to zone** คลัสเตอร์จะเข้าร่วมโซนที่มีการขาย VM อยู่แล้ว ทำให้โซนเดียวสามารถมีทั้ง CloudStack และ Proxmox ร่วมกันได้ แหล่งที่มาใหม่นี้จะ**ไม่ถูกวางจำหน่ายโดยค่าเริ่มต้น** และไม่เปลี่ยนแปลงพฤติกรรมของแพ็กที่มีอยู่เดิม ![การ์ด Attach cluster to zone พร้อมเลือกโซนที่มีอยู่แล้ว](https://nexcmp.com/th/docs/images/infrastructure/proxmox-06-attach-zone.webp) 8. เปิด **Services › Virtual Machines › Plans & pricing** และคลิก **Add plan** ใน **Infrastructure source** ให้เลือกคลัสเตอร์ Proxmox จากนั้นกำหนด CPU, RAM, ดิสก์ และราคา แพ็ก Proxmox ไม่จำเป็นต้องใช้ข้อเสนอ CloudStack หากต้องการขายการกำหนดค่าเดียวกันจากทั้งสองแหล่ง ให้ใช้ **Clone** บนแพ็กแล้วเลือกแหล่งอื่น ดิสก์ของแพ็กต้องมีขนาดอย่างน้อยเท่ากับดิสก์ของเทมเพลต เนื่องจาก Proxmox ไม่สามารถย่อขนาดดิสก์ลงได้ ### นำเข้า VM ที่มีอยู่แล้ว {#import-a-vm-that-already-exists} เปิดแท็บ **Servers** เพื่อแสดงรายการ VM บนคลัสเตอร์ **Import** เป็นการกำหนด VM ที่มีอยู่แล้วให้กับบัญชีลูกค้าโดยไม่มีค่าใช้จ่าย: จะไม่มีการเรียกเก็บเงินสำหรับชั่วโมงการทำงาน เวลาที่ปิดเครื่อง หรือปริมาณการใช้งาน ลูกค้าสามารถเริ่ม, หยุด, รีบูต และเปิดคอนโซลได้ แต่ไม่สามารถลบได้ มีเพียงผู้ดูแลระบบเท่านั้นที่ทำได้ NexCMP จะอ่านข้อมูลจากคลัสเตอร์ในระหว่างการนำเข้าเท่านั้น - คลัสเตอร์ต้องเชื่อมโยงกับโซนที่ **มีชื่อโหนด** ของ VM นั้น (หากเว้นว่างโหนดไว้ ระบบจะรายงานว่ายังไม่ได้ตั้งค่าภูมิภาค) - หากต้องการทำให้ VM อยู่ในสถานะ **protected** (จะไม่สามารถหยุด, รีบูต, ติดตั้งใหม่, กู้คืนสแนปชอต, ลบถาวร และเปลี่ยนแผนได้) ให้ทำการนำเข้าจากบรรทัดคำสั่งด้วย `--protect`: ```bash sudo -u nexcmp /opt/nexcmp/bin/nexcmp px-import --provider pve-1 --server-ref pve1/101 --account-id 12 --hostname web-1 --protect ``` ### สิ่งที่รองรับและไม่รองรับบน Proxmox {#what-is-and-is-not-supported-on-proxmox} | ฟีเจอร์ | Proxmox VE | |---|---| | สร้าง, เปิด/ปิดเครื่อง/รีบูต, ลบ | ใช่ | | ปรับขนาด CPU และ RAM, ขยายดิสก์ | ได้ แต่ VM จะต้องถูกหยุดทำงาน เปลี่ยนแปลง และเริ่มทำงานใหม่อีกครั้ง (ไม่มีการปรับขนาดแบบสด) | | Snapshots | ได้ สูงสุด 5 รายการต่อ VM: สร้าง, แสดงรายการ, กู้คืน, ลบ | | ติดตั้งระบบปฏิบัติการใหม่ | ได้: VM จะถูกสร้างขึ้นใหม่จากเทมเพลตโดยยังคงรหัสประจำตัว, IP และการตั้งค่าเดิม พร้อมรหัสผ่านใหม่ | | รีเซ็ตรหัสผ่าน | ได้ ผ่านทาง guest agent | | คอนโซล | ได้ คอนโซลผ่านเบราว์เซอร์ที่พร็อกซีโดยแผงควบคุม | | เมตริก | ได้: CPU, หน่วยความจำ, เครือข่าย และดิสก์ | | การเมานต์ ISO, การสำรองข้อมูล, ไฟร์วอลล์, IPv6, การส่งต่อพอร์ต, เปลี่ยน IP, วอลุ่มเสริม, Auto Scaling, DDoS Shield, VPC, การวัดปริมาณการใช้งานแบนด์วิดท์ | ไม่สามารถใช้งานได้ หน้าจัดการ VM ของลูกค้าจะซ่อนสิ่งที่ไม่รองรับ | ## ตรวจสอบ {#verify} 1. **Test connection** แสดงสถานะ OK และสถานะผู้ให้บริการใช้งานได้ 2. **Clusters** แสดงรายการโหนดของคุณว่าออนไลน์ พร้อมทั้งสตอเรจและบริดจ์ 3. **Cluster IP pool** แสดงจำนวนที่ว่าง, ที่ใช้ไป และที่ถูกถือครอง 4. คีย์ OS จะปรากฏภายใต้เทมเพลตของโซนใน **Services › Virtual Machines › Template** หลังจากเชื่อมโยงคลัสเตอร์แล้ว 5. สั่งซื้อ VM ทดสอบจากแผนที่ใช้คลัสเตอร์ดังกล่าว ควรได้รับที่อยู่ IP จากพูล, รหัสผ่านรูท และคอนโซลที่ใช้งานได้ รวมถึงพูลจะแสดงที่อยู่ IP ที่ถูกใช้งานไป 1 รายการ ## ข้อจำกัดและหมายเหตุ {#limits-and-notes} ::: tip โซนที่มีหลายแหล่งโครงสร้างพื้นฐาน ตั้งแต่ NexCMP 1.4.0 รายการราคา Cloud Server สาธารณะสามารถใช้งานได้เช่นกันเมื่อ CloudStack และ Proxmox VE ใช้งานโซนร่วมกัน แต่ละแพ็กเกจจะใช้ **Infrastructure source** ของตนเอง หลังจากเชื่อมต่อคลัสเตอร์แล้ว ให้ตรวจสอบรายการราคาสาธารณะและทดลองสั่งซื้อสำหรับแต่ละแหล่ง ::: - สามารถเพิ่มคลัสเตอร์ Proxmox หลายรายการได้ โดยแต่ละรายการคือหนึ่งผู้ให้บริการ - โซนหนึ่งจะมีแหล่งที่มาเริ่มต้นหนึ่งรายการ; แผนที่มี **Infrastructure source** ของตัวเองจะถูกปรับใช้กับคลัสเตอร์นั้นโดยตรง ตราบใดที่คลัสเตอร์ยังใช้งานได้และอยู่ในโซนของแผน - คลัสเตอร์ที่อยู่เบื้องหลังโซนเดียวกับ CloudStack จะยังคงใช้แผนเดิมบน CloudStack ต่อไป ให้ทดสอบคำสั่งซื้อตั้งแต่ต้นจนจ trướcเปิดใช้งานจริง - โทเค็น API สามารถเปลี่ยนแทนที่ได้เท่านั้น ไม่สามารถดูค่าได้ ให้แทนที่ในแท็บ **Credentials**: สร้างโทเค็นใหม่ใน Proxmox ก่อน,ป้อนค่า, รัน **Test connection** แล้วจึงเพิกถอนโทเค็นเก่า - การกระทำ Test, Sync และ cluster-info ถูกจำกัดไว้ที่หกครั้งต่อนาทีต่อผู้ดูแลระบบหนึ่งท่าน - NexCMP เรียกเก็บเงินจากลูกค้าของคุณ ส่วนค่าฮาร์ดแวร์และค่าลิขสิทธิ์ของคลัสเตอร์เป็นภาระรับผิดชอบของคุณ ## การแก้ Problme {#troubleshooting} | อาการ | สาเหตุ | วิธีแก้ปัญหา | |---|---|---| | ทดสอบ: "Key rejected (wrong access key / secret, or revoked)" หรือ HTTP 401/403 | รหัสโทเค็นหรือรหัสลับไม่ถูกต้อง หรือมีการกำหนดสิทธิ์ ACL ให้กับโทเค็นนั้นเท่านั้น | รันคำสั่ง `pveum acl modify` ทั้งสองคำสั่ง (ผู้ใช้ **และ** โทเค็น) อีกครั้งและตรวจสอบว่ารหัสโทเค็นคือ `user@realm!tokenid` | | การทดสอบ: "Could not connect to the provider" หรือ "Timed out" | ไฟร์วอลล์ โฮสต์ หรือพอร์ตไม่ถูกต้อง | ตรวจสอบ `https://host:8006` จากเซิร์ฟเวอร์แผงควบคุม | | การทดสอบ: "Invalid endpoint or not on the allowlist" | เอนด์พอยต์มีพาธ ผู้ใช้ คิวรี หรือไม่ใช่ HTTPS | ใช้ `https://host:8006` ให้ถูกต้อง | | "ใบรับรอง TLS ของคลัสเตอร์ไม่ตรงกับฟิงเกอร์พริ้นต์ที่ตรึงไว้" | ใบรับรองคลัสเตอร์ถูกแทนที่ | ล้าง **Pinned TLS fingerprint** บนแท็บ Clusters บันทึก แล้วรัน **Test connection** อีกครั้ง | | Slug ถูกปฏิเสธ | ไม่ใช่ a-z, 0-9, ขีดกลาง หรือไม่ใช่ 2-32 ตัวอักษร | ใช้ค่าประมาณ `pve-1` | | "รูปแบบ Token id: user@realm!tokenid และจำเป็นต้องระบุ secret" | รหัสโทเค็นหรือรหัสลับหายไป | ป้อนทั้งสองค่า; รหัสลับคือ UUID ที่แสดงขึ้นเมื่อสร้างโทเค็น | | "บรรทัดเทมเพลตไม่ถูกต้อง: …" | บรรทัดใน **Template OS** ไม่ใช่ `key=vmid` | ใช้อักษร ตัวเลข `.`, `_`, `-` ในคีย์และ vmid อย่างน้อย 100 | | "คีย์ OS: a-z 0-9 . _ - และ vmid ≥ 100" | คีย์หรือไอดีไม่ถูกต้องใน **Create template** | แก้ไขคีย์ OS และใช้ vmid ที่ว่างอยู่ | | "vmid … already exists" เมื่อสร้างเทมเพลต | vmid นี้ถูกใช้งานแล้ว | เลือกไอดีอื่น | | "url ชี้ไปยังที่อยู่ภายใน" | URL ของอิมเมจเป็น IP ภายใน | ใช้ URL สาธารณะ โดยชื่อจะถูกแปลงโดย Proxmox | | งานเทมเพลตล้มเหลวในการดาวน์โหลด | พื้นที่เก็บข้อมูล `local` ไม่มีเนื้อหา `import` | `pvesm set local --content …,import,snippets` แล้วลองอีกครั้ง ชื่อไฟล์ต้องลงท้ายด้วย `.qcow2`, `.raw`, `.vmdk`, `.ova` หรือ `.ovf` | | "cluster has no online nodes" หรือ "node … is not online" | โหนดเริ่มต้นออฟไลน์หรือสะกดผิด | แก้ไข **Default node** หรือปล่อยว่างไว้ | | "อิมเมจไม่ได้เป็นของคลัสเตอร์" | OS ของแผนไม่มีอยู่ใน **Template OS** | เพิ่มคีย์ลงในรายการและบันทึก | | การปรับใช้ค้าง จากนั้นล้มเหลวในการโคลน | VM เทมเพลตไม่ได้อยู่บนโหนดที่เลือก | สร้างเทมเพลตบนโหนดนั้น หรือตั้งค่า **Default node** ไปยังโหนดที่มีเทมเพลตดังกล่าว | | ลูกค้าไม่สามารถเข้าสู่ระบบในฐานะ root ได้ | อิมเมจบล็อกการเข้าสู่ระบบของ root | สร้างเทมเพลตใหม่ตามตัวเลือก A | | การรีเซ็ตกรุ๊ปรหัสผ่านไม่มีผลใดๆ | ไม่มีเกสต์เอเจนต์ในระบบปฏิบัติการแขก | ติดตั้งและเปิดใช้งาน `qemu-guest-agent` ใน template | | "ต้องระบุชื่อ, CIDR และเกตเวย์" | ฟิลด์พูลหายไป | กรอกข้อมูลทั้งสามช่อง | | Pool create: "overlaps with pool …", "gateway must be within range (not network/broadcast address)" หรือ "cidr: network address must be …" | พูลทับซ้อนกัน เกตเวย์ไม่ถูกต้อง หรือ CIDR ที่ไม่อยู่บนขอบเขตเครือข่าย | ใช้ช่วงที่ว่าง เกตเวย์ที่อยู่ภายใน และ CIDR ที่เขียนเป็นที่อยู่เครือข่าย (ตัวอย่างเช่น `198.51.100.0/24`) | | การนำเข้า: "region is not set up" | คลัสเตอร์เชื่อมต่ออยู่โดยไม่มีชื่อโหนดของ VM | เชื่อมต่อคลัสเตอร์เข้ากับโซนพร้อมระบุชื่อโหนด | --- # OS templates และ ISOs {#os-templates-and-isos} > **ตำแหน่งในแผงผู้ดูแลระบบ:** Services › Virtual Machines › Template (`/vm/templates`) เทมเพลต Proxmox จะแสดงรายการตามแต่ละคลัสเตอร์ใน Infrastructure › Cloud provider › Providers › (cluster) › Clusters ## What it does {#what-it-does} Template คืออิมเมจระบบปฏิบัติการที่ VM ใหม่เริ่มต้นทำงาน NexCMP ไม่ได้จัดเก็บอิมเมจด้วยตนเอง แต่จะอ่านข้อมูลที่ CloudStack รายงาน (template ที่พร้อมใช้งานและเป็นรายการเด่น) หรือรายการที่คุณระบุสำหรับคลัสเตอร์ Proxmox และช่วยให้คุณเลือกได้ว่าจะขายรายการใด พร้อมด้วยชื่อที่แสดงต่อลูกค้า ไอคอน และผู้ใช้สำหรับเข้าสู่ระบบ หน้าตานี้แสดงวิธีเตรียมอิมเมจที่ทำงานร่วมกับ NexCMP ได้เป็นอย่างดี ได้แก่ การเข้าสู่ระบบด้วยรหัสผ่าน การปรับขนาด CPU และ RAM แบบสด ไฟล์สลับ (swap) และดิสก์รากที่ขยายขนาดได้ตามแผน ## ข้อกำหนด {#requirements} | Item | Requirement | |---|---| | ตัวสร้าง CloudStack template | เครื่อง Linux ที่มี `libguestfs-tools` (`virt-customize`, `virt-sparsify`, `guestfish`), `qemu-utils`, `curl` และพื้นที่ดิสก์ว่างประมาณ 5 GB ไม่จำเป็นต้องใช้ KVM และ root เข้าถึงอินเทอร์เน็ตสำหรับการติดตั้งแพ็กเกจ (หรือสร้างด้วย `--offline`) | | ตำแหน่งของตัวสร้าง | มีมาให้พร้อมกับทุกรุ่นใน `/opt/nexcmp/releases//share/templates/` บนเซิร์ฟเวอร์แผงควบคุม คุณไม่จำเป็นต้องเรียกใช้งานที่นั่น: ให้คัดลอกโฟลเดอร์ไปยังเครื่อง Linux ใดก็ได้ | | เว็บเซิร์ฟเวอร์ | เซิร์ฟเวอร์ HTTP(S) ใดๆ ที่ secondary storage VM ของ CloudStack สามารถเข้าถึงได้ เพื่อเผยแพร่ไฟล์ `.qcow2` ที่สร้างเสร็จแล้ว โดยไม่จำเป็นต้องเข้าถึงได้จากอินเทอร์เน็ต | | CloudStack | บัญชีที่สามารถลงทะเบียนเทมเพลตได้ พร้อมทั้ง ID ของโซนและประเภทระบบปฏิบัติการที่ตรงกัน ดูที่ [CloudStack](https://nexcmp.com/th/docs/infrastructure/cloudstack/) | | Proxmox VE | VM เทมเพลตแบบ cloud-init ที่ติดตั้ง QEMU guest agent หนึ่งรายการต่อระบบปฏิบัติการและต่อโหนด ดูที่ [Proxmox VE](https://nexcmp.com/th/docs/infrastructure/proxmox/) | | ขึ้นอยู่กับ | เชื่อมต่อ [CloudStack](https://nexcmp.com/th/docs/infrastructure/cloudstack/) หรือ [Proxmox VE](https://nexcmp.com/th/docs/infrastructure/proxmox/) ก่อน | ## เตรียมโครงสร้างพื้นฐาน {#prepare-the-infrastructure} ### CloudStack: สร้างเทมเพลต {#cloudstack-build-a-template} อิมเมจฐานที่รองรับ (ระบบจะดาวน์โหลดอิมเมจของผู้ให้บริการและตรวจสอบ checksum ก่อนที่จะทำการเปลี่ยนแปลงใดๆ): | อิมเมจ | `--distro` | ผู้ใช้สำหรับเข้าสู่ระบบ | |---|---|---| | Ubuntu 22.04 | `ubuntu-22.04` | `ubuntu` | | Ubuntu 24.04 | `ubuntu-24.04` | `ubuntu` | | Debian 12 | `debian-12` | `debian` | | Rocky Linux 9 | `rocky-9` | `rocky` | ดิสโทรอื่นๆ เพิ่มเติม: เพิ่มบรรทัดลงใน `distros.conf` (URL ของอิมเมจ, ไฟล์ checksum, ตระกูล `deb` หรือ `rpm`) 1. คัดลอก builder ไปยังเครื่องที่ใช้บิลด์และเรียกใช้งาน: ```bash cp -r /opt/nexcmp/releases//share/templates ~/templates && cd ~/templates ./build-template.sh --distro ubuntu-24.04 --version v7 --work ./out ``` เพิ่ม `--panel-url https://cloud.example.com` เพื่อฝังเอเจนต์มอนิเตอร์ตอนบูตครั้งแรก (ไม่บังคับ) ซึ่งจะลงทะเบียนเข้ากับพาเนลของคุณ (HTTPS เท่านั้น) หากไม่ระบุ จะไม่มีการเพิ่มเอเจนต์ ตัวเลือกอื่นๆ: `--base ` เพื่อใช้อิมเมจที่คุณดาวน์โหลดมาแล้ว, `--offline` เพื่อข้ามการติดตั้งแพ็กเกจ 2. ผลลัพธ์ที่ได้คือ `out/ubuntu-24.04-v7.qcow2` และ `.sha256` ของไฟล์ดังกล่าว การบิลด์จะสิ้นสุดด้วยการรัน `verify-image.sh` ซึ่งจะตรวจสอบอิมเมจที่เสร็จแล้วแบบอ่านอย่างเดียว และปฏิเสธอิมเมจที่มีปัญหา (โดยจะเก็บไว้เป็น `.unverified`) คุณสามารถรันซ้ำเมื่อใดก็ได้: `./verify-image.sh out/ubuntu-24.04-v7.qcow2 --no-agent` สิ่งที่ builder ใส่ลงในอิมเมจ: | Item | เหตุผล | |---|---| | `qemu-guest-agent` | CloudStack สามารถสอบถามข้อมูล CPU และ IP จาก VM ได้ รวมถึงพักการทำงานชั่วคราวเพื่อทำ snapshot | | cloud-init พร้อมด้วย data source ของ CloudStack, `set_passwords` ในทุกครั้งที่บูต, การเข้าสู่ระบบด้วยรหัสผ่าน SSH | รหัสผ่านที่สร้างขึ้นจะถูกดึงมาจาก virtual router และ **Reset password** สามารถใช้งานได้ | | กฎ udev สำหรับ CPU และ RAM ที่เพิ่มเข้ามาแบบ hot-added | vCPU และ RAM ที่เพิ่มเข้ามาแบบ hot-added จะเริ่มทำงานได้เอง ทำให้การปรับขนาดแบบ live scaling และ Auto Scaling ใช้งานได้ | | บริการไฟล์ swap | สร้าง `/swapfile` ของค่าที่น้อยกว่าระหว่าง 50% ของ RAM และ 4 GiB หลังจากที่ดิสก์ขยายขนาดแล้ว `touch /etc/cmp-swap.disabled` จะปิดการใช้งาน | | cloud-init `growpart` และ `resizefs` | ดิสก์รากขนาดเล็กจะขยายใหญ่ขึ้นตามขนาดดิสก์ของแพ็กเกจเมื่อบูตครั้งแรก | | machine-id ว่างเปล่า, ไม่มี SSH host key | VM ทุกตัวจะมีเอกลักษณ์เป็นของตัวเอง | ::: warning ตั้งชื่อเทมเพลตว่า ` ` NexCMP จะเปิด **Auto Scaling** ให้กับเทมเพลตที่มีชื่อลงท้ายด้วย `vN` หรือ `vN.M` โดยมี **N ตั้งแต่ 6 ขึ้นไป** (`Ubuntu 24.04 v7`, `Rocky Linux 9 v7.1`) ตัวสร้างจะบังคับใช้กฎนี้สำหรับ `--version` โปรดลงทะเบียนเทมเพลตด้วยชื่อที่พิมพ์ไว้อย่างแม่นยำ ::: 3. เผยแพร่ไฟล์และลงทะเบียนใน CloudStack โดยใช้ค่า SHA-256 ที่ตัวสร้างแสดงขึ้นมา และให้ลงทะเบียนหลังจากที่เขียนไฟล์เสร็จสมบูรณ์แล้วเท่านั้น: ```bash cmk list ostypes keyword="Ubuntu 24.04" filter=id,description cmk register template name="Ubuntu 24.04 v7" displaytext="Ubuntu 24.04 v7" \ url=https://files.example.com/ubuntu-24.04-v7.qcow2 zoneid= format=QCOW2 hypervisor=KVM \ ostypeid= passwordenabled=true sshkeyenabled=true isdynamicallyscalable=true \ requireshvm=true isextractable=false ispublic=true isfeatured=true \ checksum="{SHA-256}" \ details[0].guest.cpu.mode=host-passthrough details[0].rootDiskController=osdefault ``` - `passwordenabled=true` ช่วยให้ CloudStack สามารถสร้างรหัสผ่านสำหรับ VM ได้ - `isdynamicallyscalable=true` ช่วยให้สามารถปรับขนาดแบบ live scaling ได้ - `host-passthrough` จำเป็นสำหรับการบูตอิมเมจ Rocky และ Alma รุ่นปัจจุบัน ส่วน `osdefault` ช่วยให้คอนโทรลเลอร์ดิสก์สามารถย้ายข้ามระบบได้ 4. รอจนกว่าเทมเพลตจะแสดงสถานะเป็น **Download Complete / Ready** อิมเมจของผู้ให้บริการจะยังคงขนาดเสมือนจริงที่เล็ก (ประมาณ 3.5 GiB สำหรับ Ubuntu และ Debian, 10 GiB สำหรับ Rocky) โปรดจำไว้ว่าดิสก์ของแพ็กเกจต้องไม่เล็กกว่าดิสก์ของเทมเพลต ### Proxmox VE: สร้างเทมเพลต {#proxmox-ve-make-a-template} สร้างเทมเพลต VM แบบ cloud-init ตามระบบปฏิบัติการบนทุกโหนดที่คุณปรับ the deploy ไปใช้งาน โดยติดตั้ง guest agent และเปิดใช้งาน root login จากนั้นลงทะเบียนเป็น `os-key=vmid` คำสั่งเต็มรูปแบบอยู่ใน [Proxmox VE](https://nexcmp.com/th/docs/infrastructure/proxmox/) ตัวสร้างของ CloudStack ด้านบน **ไม่ใช่** สำหรับ Proxmox เนื่องจากเป็นการกำหนดค่า cloud-init สำหรับ data source ของ CloudStack ### ISO {#isos} ลูกค้าสามารถเมานต์ ISO ของตนเองได้ผ่านโมดูล **Images** (CloudStack) หรือโมดูลเซิร์ฟเวอร์เฉพาะ (Dedicated Server) ซึ่งแยกต่างหากจากเทมเพลต OS ในหน้านี้ โปรดดูเพิ่มเติมที่ [Modules](https://nexcmp.com/th/docs/infrastructure/modules/) และ [Dedicated servers](https://nexcmp.com/th/docs/infrastructure/dedicated/) ## เชื่อมต่อใน NexCMP {#connect-in-nexcmp} 1. เปิด **Services › Virtual Machines › Template** คลิก **Sync now** หรือรอไม่เกิน 15 นาที การซิงค์จะเพิ่มเทมเพลตที่พร้อมใช้งานและตั้งค่าเป็น featured ไว้ใน CloudStack ![หน้าเทมเพลตที่แสดงรายการเทมเพลตที่ซิงก์แล้ว พร้อมสถานะความพร้อมใช้งานและคอลัมน์การเพิ่ม CPU แบบ hot-plug](https://nexcmp.com/th/docs/images/infrastructure/templates-01-list.webp) 2. คลิก **Edit** บนเทมเพลตใหม่และตั้งค่าสิ่งที่ลูกค้าจะมองเห็น: | ฟิลด์ | ค่าตัวอย่าง | |---|---| | ชื่อที่แสดงสำหรับลูกค้า | `Ubuntu 24.04 LTS` | | ตระกูล OS | `ubuntu` (ไอคอนและผู้ใช้เริ่มต้น) | | เวอร์ชัน | `24.04` | | ชื่อผู้ใช้สำหรับเข้าสู่ระบบ | `ubuntu` (Windows: `Administrator`; อื่นๆ: `root`) | | ไอคอน | URL ของอิมเมจ, พาธ หรือชื่อ | | ลำดับ | `10` | | ใช้งาน | เปิด | | การเพิ่ม vCPU/RAM แบบ hot-plug (ปรับขนาดแบบ live) | **Auto by name (v6 or later)**, **Yes** หรือ **No (needs a restart)** | ![หน้าต่างแก้ไขเทมเพลตพร้อมชื่อสำหรับลูกค้า, ตระกูล OS, ผู้ใช้สำหรับเข้าสู่ระบบ และตัวเลือก hot-plug](https://nexcmp.com/th/docs/images/infrastructure/templates-02-edit.webp) 3. เปิดใช้งานเทมเพลต เทมเพลตที่ CloudStack ไม่ได้แสดงรายการไว้อีกต่อไปจะถูกซ่อนโดยอัตโนมัติ (และคุณจะได้รับการแจ้งเตือนทาง Telegram หากตั้งค่าไว้) โดยจะไม่มีการลบออกจาก NexCMP อย่างถาวร ### แทนที่เทมเพลตด้วยบิลด์ใหม่กว่า {#replace-a-template-with-a-newer-build} ใช้ **More › Replace with new version** บนเทมเพลตที่ขายอยู่ เลือกเทมเพลตใหม่ที่พร้อมใช้งานและถูกปิดใช้งานอยู่ รายการที่ขายจะชี้ไปที่บิลด์ใหม่โดยยังคงชื่อ ลําดับ และไอคอนเดิมไว้ ส่วนของเดิมจะถูกปิดใช้งานเพื่อใช้เป็นทางถอย (หากต้องการย้อนกลับ ให้ใช้ **Replace** บนรายการใหม่) VM ที่กําลังทํางานอยู่จะไม่ได้รับผลกระทบ หากบิลด์ใหม่เป็นตระกูล OS ที่ต่างออกไป ให้ทำเครื่องหมายยืนยันก่อน ## ตรวจสอบ {#verify} 1. แถวจะแสดงสถานะ **ready** และสําหรับบิลด์ที่มีชื่อว่า `vN` โดยมี N ตั้งแต่ 6 ขึ้นไป จะแสดง **CPU hot-plug: supported** 2. ปรับใช้ VM ทดสอบหนึ่งเครื่องจากเทมเพลตและตรวจสอบภายใน VM: - คุณสามารถเข้าสู่ระบบด้วยรหัสผ่านที่แสดงในพอร์ทัล; - `df -h /` แสดงขนาดดิสก์ของแพ็กเกจ; - หลังจากการปรับขนาดแบบสด (**Change plan** โดยไม่ต้องรีบูต) `nproc` และ `free -m` จะขยายใหญ่ขึ้น; - `swapon --show` แสดงรายชื่อ `/swapfile` (ดิสก์ที่มีพื้นที่เหลือน้อยกว่า swap บวก 2 GiB จะข้ามไป); - `systemctl is-active qemu-guest-agent` พิมพ์ `active` 3. หากคุณฝังเอเจนต์ไว้ล่วงหน้า VM จะปรากฏในโฮสต์ที่ตรวจสอบของแผงควบคุมภายในหนึ่งนาทีหลังจากการบูตครั้งแรก VM ต้องการ IP สาธารณะของตัวเอง โดยแผงควบคุมจะจดจำจาก IP ต้นทางสาธารณะ ## ข้อจำกัดและหมายเหตุ {#limits-and-notes} - ตัวสร้างนี้รองรับเฉพาะ Linux เท่านั้นและสร้างอิมเมจ Linux อิมเมจอื่น ๆ (เช่น Windows) สามารถลงทะเบียนใน CloudStack ได้ด้วยวิธีอื่น โดย NexCMP จะแสดงรายการตามที่ CloudStack รายงาน - มีเฉพาะเอเจนต์ amd64 เท่านั้นที่จัดส่งมา สถาปัตยกรรมอื่น ๆ จะข้ามการติดตั้งเอเจนต์ - อิมเมจจะถูกตรวจสอบด้วย `guestfish` แต่จะไม่ถูกบูตโดยตัวสร้าง โปรดปรับใช้ VM ทดสอบหนึ่งเครื่องเสมอก่อนที่จะขายอิมเมจใหม่ - ข้ามเอเจนต์บน VM หนึ่งเครื่องด้วย `touch /etc/cmp-agent.disabled` ก่อนการบูตครั้งแรก ลบออกทีหลังด้วย `systemctl disable --now cmp-agent cmp-agent-install; rm -rf /etc/cmp-agent /usr/local/bin/cmp-agent` จากนั้นจึงลบเอเจนต์ในคอนโซลผู้ดูแลระบบ ## การแก้ Problme {#troubleshooting} | อาการ | สาเหตุ | วิธีแก้ปัญหา | |---|---|---| | `virt-customize` ไม่สามารถดาวน์โหลดแพ็กเกจได้ | เครื่องมือสร้างไม่มีเครือข่ายขาออก | แก้ไข DNS หรือพร็อกซี่บนเครื่องนั้น หรือสร้างด้วย `--offline` บนอิมเมจฐานที่มีแพ็กเกจอยู่แล้ว | | `libguestfs: error: /usr/bin/supermin exited with error status 1` | เคอร์เนลของโฮสต์ไม่สามารถอ่านได้โดยผู้ใช้ปัจจุบัน (Ubuntu) | `sudo chmod +r /boot/vmlinuz*` หรือเรียกใช้การสร้างในฐานะ root | | เช็คซัมไม่ตรงกัน หรืออิมเมจของผู้จัดจำหน่ายไม่มีอยู่อีกต่อไป | ผู้จัดจำหน่ายย้ายไฟล์ "latest" ของตน | ดาวน์โหลดอิมเมจด้วยตนเอง ตรวจสอบเทียบกับไฟล์เช็คซัมของผู้จัดจำหน่าย และส่งผ่านด้วย `--base` | | Rocky: XFS เวอร์ชันใหม่กว่าไม่สามารถติดตั้งใช้งานได้ | เคอร์เนลของโฮสต์เก่าเกินไป | สร้างบนเครื่องที่มีเคอร์เนลเวอร์ชันล่าสุด | | `--version must be v6 or higher` | ชื่อต้องเป็น `vN` โดยมี N ตั้งแต่ 6 ขึ้นไป | ใช้ `--version v7` | | `--panel-url must be a plain https:// URL` | เอเจนต์ถูกดาวน์โหลดและเรียกใช้ในฐานะ root จึงปฏิเสธ HTTP แบบธรรมดา | ใช้ URL `https://` ที่ไม่มีช่องว่าง เครื่องหมายคำพูด หรือคิวรีสตริง | | เทมเพลตยังคงสถานะ **not ready** | CloudStack ดาวน์โหลด1ยังไม่เสร็จสิ้น | รอ **Download Complete**, ตรวจสอบว่า VM ที่จัดเก็บข้อมูลสำรองเข้าถึง URL ได้ | | แถวแสดงสถานะ **no-pass** | เทมเพลตถูกลงทะเบียนโดยไม่มี `passwordenabled=true` | ลงทะเบียนใหม่อีกครั้งด้วยแฟล็กดังกล่าว | | CPU hot-plug แสดงสถานะ **unsupported** | ชื่อไม่ได้ลงท้ายด้วย `vN` (N ตั้งแต่ 6 ขึ้นไป) | เปลี่ยนชื่อเทมเพลต หรือตั้งค่า **vCPU/RAM hot-plug** เป็น **Yes** ใน Edit หากอิมเมจมีกฎ udev | | รายการเทมเพลตว่างเปล่าหลังจากการเชื่อมต่อครั้งแรก | การซิงค์ยังไม่ทำงาน | คลิก **Sync now** (ต้องใช้งานเวิร์กเทเบิล) หรือรอรอบ 15 นาที | --- # เซิร์ฟเวอร์เฉพาะกิจ (Bare Metal) {#dedicated-servers-bare-metal} > **ตำแหน่งในระบบผู้ดูแล:** Infrastructure › Bare Metal (Servers `/infra/baremetal`, IP Pools, Stock / iDRAC import, Operations, Templates, Customer ISOs, Safety). แพ็กเกจและการสมัครสมาชิก: Services › Dedicated Server (`/dedicated`). เปิดใช้งานโมดูลได้ที่ System › Admin › License & updates (`/license`). ## What it does {#what-it-does} NexCMP จัดการเซิร์ฟเวอร์จริง **ผ่าน iDRAC โดยตรง** ผ่านทาง Redfish API ลูกค้าจะเช่าเซิร์ฟเวอร์ทั้งเครื่อง: สามารถเปิด/ปิดเครื่อง, เปิดคอนโซลเบราว์เซอร์, เมาท์ ISO หรือติดตั้งระบบปฏิบัติการจากแม่แบบ รวมถึงดูฮาร์ดแวร์และเมตริกได้ โดยจะไม่เห็นที่อยู่ iDRAC, ชื่อผู้ใช้ หรือรหัสผ่านเลย ใช้เพื่อขายเซิร์ฟเวอร์เฉพาะกิจจากตู้แร็คของคุณเอง ## ข้อกำหนด {#requirements} | Item | Requirement | |---|---| | ฮาร์ดแวร์ | เซิร์ฟเวอร์ Dell ที่มี **iDRAC 9** และ Redfish API | | เครือข่ายการจัดการ | **คุณเป็นผู้จัดเตรียม** เซิร์ฟเวอร์ของแผงควบคุมต้องสามารถเชื่อมต่อไปยัง iDRAC ทุกเครื่องผ่าน **HTTPS 443** ได้ (รวมถึงพอร์ต VNC ของ iDRAC ซึ่งค่าเริ่มต้นคือ **5901** สำหรับคอนโซล) และ iDRAC ทุกเครื่องต้องสามารถเข้าถึงเว็บเซิร์ฟเวอร์ ISO ด้านล่างนี้ได้ ที่อยู่ของ iDRAC จะต้องเป็น **ที่อยู่ IPv4 ในช่วง private** (RFC 1918 โดยมี prefix ขนาด /16 หรือเล็กกว่า) ตามที่คุณระบุไว้ในการตั้งค่า `dedicated_bmc_cidrs` ระบบจะปฏิเสธชื่อ DNS และ IPv6 ทั้งนี้ NexCMP ไม่ได้เป็นผู้สร้างเครือข่ายนี้และไม่สามารถทดสอบเครือข่ายแทนคุณได้ | | บัญชี iDRAC | บัญชีผู้ใช้ที่มีสิทธิ์ระดับ **Administrator** หนึ่งบัญชีในแต่ละ iDRAC โดย NexCMP จะใช้บัญชีนี้เพื่ออ่านข้อมูลของเซิร์ฟเวอร์และส่งคำสั่งเพียงไม่กี่คำสั่งที่ระบบอนุญาตให้ดำเนินการได้ (power, virtual media, one-time boot, console) ระบบจะไม่สร้างบัญชี iDRAC ให้กับลูกค้าของคุณอย่างเด็ดขาด | | เครื่องมือบนเซิร์ฟเวอร์ของแผงควบคุม | `xorriso` และ `genisoimage` (สร้าง ISO สำหรับติดตั้งของแต่ละเซิร์ฟเวอร์) และ `novnc` (หน้าคอนโซลบนเบราว์เซอร์) ติดตั้งเครื่องมือเหล่านี้ด้วย `sudo apt-get install -y xorriso genisoimage novnc` หรือให้ตัวติดตั้งดำเนินการให้ โดยเรียกใช้งานพร้อมกับ `--baremetal` หรือระบุตัวเลือก ISO server นอกจากนี้การอัปเดตก็จะติดตั้งเครื่องมือเหล่านี้ด้วยเช่นกันหากเปิดใช้งานโมดูล Bare Metal อยู่แล้ว หากมีเครื่องมือใดขาดหายไป **Safety** จะแสดงรายการนั้นในแถบแจ้งเตือนสีแดง และ **live ops** จะปฏิเสธการเปิดทำงาน (ข้อผิดพลาด `tools_missing`) โดยคอนโซลและการติดตั้ง OS จะแจ้งว่ามีเครื่องมือไม่ครบแทนที่จะไปล้มเหลวในภายหลัง | | เว็บเซิร์ฟเวอร์ ISO | เซิร์ฟเวอร์ **HTTP** แบบทั่วไปบนเครือข่ายการจัดการที่ให้บริการโฟลเดอร์ ISO ของ NexCMP แก่บรรดา iDRAC โดยที่อยู่ของเซิร์ฟเวอร์จะต้องเป็นที่อยู่ private IPv4 และสามารถระบุพอร์ตหรือไม่ก็ได้ เช่น `http://10.20.0.2:8080` **โดยไม่มี path** ซึ่งจัดเก็บไว้ใน `dedicated_iso_base_url` ทั้งนี้จะต้องรองรับ byte ranges ด้วย เนื่องจากโฟลเดอร์นี้จะถูกเขียนโดย worker ของแผงควบคุม โดยปกติแล้วเว็บเซิร์ฟเวอร์จึงทำงานอยู่บน **เซิร์ฟเวอร์ของแผงควบคุมเอง** โดยรอรับการเชื่อมต่อบนที่อยู่ที่เซิร์ฟเวอร์ดังกล่าวมีอยู่บนเครือข่ายการจัดการ NexCMP มีไซต์ nginx สำเร็จรูปและคำสั่งแบบขั้นตอนเดียวมาให้เรียบร้อยแล้ว (ดูรายละเอียดด้านล่าง) | | โฟลเดอร์ ISO | โฟลเดอร์สำหรับไฟล์ ISO และภายในประกอบด้วย `pub` (ส่วนที่ iDRAC ใช้อ่าน) และ `server` (ISO ของลูกค้า) คำสั่งแบบขั้นตอนเดียวจะใช้ `/srv/nexcmp-iso` หากไม่มีคำสั่งดังกล่าว ค่าเริ่มต้นจะเป็นไปตามการติดตั้ง (การตั้งค่า `dedicated_iso_lib_dir`, `dedicated_iso_pub_dir`, `dedicated_iso_server_dir`) NexCMP worker จะต้องสามารถ **เขียน** ข้อมูลลงในโฟลเดอร์เหล่านี้ได้ โดย worker จะทำงานด้วยระบบไฟล์แบบอ่านอย่างเดียว ยกเว้น `/var/lib/nexcmp` ดังนั้นหากเป็นโฟลเดอร์ที่อยู่ที่อื่นจะต้องใช้ systemd drop-in (ซึ่งคำสั่งแบบขั้นตอนเดียวจะติดตั้งให้) | | ที่อยู่สำหรับเรียกกลับ (Callback address) | `dedicated_callback_base` ซึ่งเป็น `https://` ที่เซิร์ฟเวอร์ติดตั้งสามารถเข้าถึงได้และชี้ไปยังแผงควบคุมของคุณ | | สตอเรจ | ดิสก์ว่างสำหรับไลบรารี ISO และ ISO ที่ลูกค้าจัดเตรียมเอง | | ขึ้นอยู่กับ | โมดูล **Bare Metal**, โซน และพูล IP ของเซิร์ฟเวอร์ | ::: warning ค่าตัวอย่างไม่ใช่การกำหนดค่าจริง การติดตั้งใหม่จะมีค่าตัวอย่างอยู่ใน `dedicated_bmc_cidrs`, `dedicated_iso_base_url` และ `dedicated_callback_base` (เครือข่ายตัวอย่างแบบ private และ `https://example.com`) ซึ่งไม่ใช่เครือข่ายของคุณ ตราบใดที่ค่ายังคงเป็นค่าตัวอย่าง หน้า Bare Metal จะแสดงข้อความแจ้งเตือนสีแดงว่า **Management network not configured** การนำเข้า iDRAC จะไม่ผ่านการตรวจสอบ allow-list และสวิตช์ **live ops** จะปฏิเสธการเปิดทำงาน (ข้อผิดพลาด `config_placeholder`) ให้กำหนดค่าทั้งสามนี้ที่ **Infrastructure › Bare Metal › Safety › Management network connection** (ดูรายละเอียดด้านล่าง) ::: ## เตรียมโครงสร้างพื้นฐาน {#prepare-the-infrastructure} 1. **วาง iDRAC ทุกตัวไว้บนเครือข่ายการจัดการ**ที่ลูกค้าไม่สามารถเข้าถึงได้ และกำหนดที่อยู่ IPv4 ส่วนตัวแบบคงที่ให้กับแต่ละตัว ตรวจสอบ Redfish API จากเซิร์ฟเวอร์แผงควบคุม: ```bash curl -sk -u 'nexcmp-admin:XXXX' https://10.20.0.11/redfish/v1/Systems | head ``` 2. **สร้างบัญชีผู้ดูแลระบบบน iDRAC** สำหรับ NexCMP (ผ่านหน้าเว็บ UI ของ iDRAC หรือ `racadm`) ใช้รหัสผ่านที่รัดกุมและไม่ซ้ำใคร ห้ามใช้บัญชีในตัวของ iDRAC ซ้ำ 3. **เผยแพร่โฟลเดอร์ ISO ให้กับ iDRAC ด้วยคำสั่งเดียว** บนเซิร์ฟเวอร์ของแผงควบคุม โดยใช้สิทธิ์ root พร้อมกับที่อยู่ที่เซิร์ฟเวอร์มีบนเครือข่ายการจัดการและเครือข่าย iDRAC: ```bash sudo nexcmp dedicated-setup-iso --listen 10.20.0.2:8080 --allow 10.20.0.0/24 ``` `--listen` ต้องเป็นที่อยู่ของเซิร์ฟเวอร์นี้ (private IPv4 หากไม่ระบุจะใช้พอร์ต 8080) `--allow` ระบุรายการเครือข่าย iDRAC (CIDR แบบ private ขนาด /16 หรือเล็กกว่า สูงสุด 8 รายการ คั่นด้วยเครื่องหมายจุลภาค) ซึ่งจะมีเพียงเครือข่ายเหล่านี้เท่านั้นที่สามารถดาวน์โหลดได้ และคำสั่งนี้จะนำค่าดังกล่าวไปใช้เป็น `dedicated_bmc_cidrs` ด้วยหากการตั้งค่านั้นยังคงเป็นค่าตัวอย่างอยู่ `--dir /path` ใช้เลือกโฟลเดอร์ ISO อื่น (ค่าเริ่มต้นคือ `/srv/nexcmp-iso`) โดยคำสั่งนี้จะ: - สร้างโฟลเดอร์ที่มี `pub` และ `server` อยู่ภายใน ซึ่งมี NexCMP service user เป็นเจ้าของ - สร้างกลุ่ม `nexcmp-iso` และเพิ่มผู้ใช้ nginx เข้าไปในกลุ่ม เพื่อให้ nginx สามารถอ่าน ISO ในขณะที่ iDRAC กำลัง mount อยู่ได้ และไม่มีผู้อื่นสามารถเข้าถึงได้ - ติดตั้งไซต์ nginx `nexcmp-iso` (จะเก็บไว้ก็ต่อเมื่อ `nginx -t` ยอมรับการตั้งค่า และจะติดตั้ง nginx ให้หากยังไม่มี) และ systemd drop-in `nexcmp-vmd.service.d/iso.conf` (`ReadWritePaths` สำหรับโฟลเดอร์ดังกล่าว `SupplementaryGroups=nexcmp-iso`) - บันทึกการตั้งค่า ISO (`dedicated_iso_base_url`, โฟลเดอร์ทั้งสาม, กลุ่ม) และรีสตาร์ท NexCMP worker สามารถเรียกใช้คำสั่งนี้ซ้ำได้ด้วยค่าอื่นๆ และ `sudo nexcmp dedicated-setup-iso --remove` จะลบไซต์ nginx รวมถึง drop-in ออก (ไฟล์ ISO จะยังคงอยู่) นอกจากนี้ยังสามารถเรียกใช้ในขั้นตอนการติดตั้งได้ด้วย โดยเพิ่ม `--iso-listen`, `--iso-allow` (และ `--iso-dir`) ลงในคำสั่งติดตั้ง ทั้งนี้คำสั่งนี้จะ**ไม่ได้**สร้างเครือข่ายการจัดการและไม่ได้ติดต่อไปยัง iDRAC ใดๆ หากค่าไม่ถูกต้อง ที่อยู่ไม่ได้อยู่บนเซิร์ฟเวอร์นี้ หรือพอร์ตถูกใช้งานอยู่ คำสั่งจะหยุดทำงานพร้อมข้อความแจ้งเตือนก่อนที่จะมีการเปลี่ยนแปลงใดๆ และหาก `nginx -t` ปฏิเสธไซต์ nginx ไซต์ดังกล่าวก็จะไม่ถูกเก็บไว้ 4. **สิ่งที่เว็บเซิร์ฟเวอร์ ISO ให้บริการ** ไซต์ nginx ตอบกลับคำขอ `GET` (และ `HEAD` พร้อม byte ranges) สำหรับ `/pub/.iso` เท่านั้นและไม่มีสิ่งอื่น: ไม่มีการแสดงรายการไดเรกทอรี ไม่มีพาธอื่นภายใต้โฟลเดอร์ (ไลบรารีและ `server/` ไม่สามารถเข้าถึงได้) ไม่มีเมธอดอื่น และอนุญาตเฉพาะจากเครือข่าย `--allow` เท่านั้น (ไคลเอนต์อื่นจะได้รับ 403) NexCMP จะเปิดให้อ่านแต่ละ ISO ที่ iDRAC ต้องใช้ในรูปแบบไฟล์หรือลิงก์ชั่วคราวใน `pub` โดย nginx จะเข้าถึงตามลิงก์เฉพาะเมื่อลิงก์และไฟล์ปลายทางมีเจ้าของเดียวกัน (service user) เท่านั้น ดังนั้นลิงก์ไปยังไฟล์ระบบจะถูกปฏิเสธ ตรวจสอบได้จากโฮสต์อื่นบนเครือข่ายการจัดการ: ```bash curl -I http://10.20.0.2:8080/ # 403 or 404, never a listing curl -I http://10.20.0.2:8080/pub/ # 403 or 404 ``` ไฟล์ทดสอบใน `pub` ควรตอบกลับคำขอ `Range` ด้วยรหัส 206 *หากต้องการดำเนินการด้วยตนเองแทน:* ไซต์ nginx และ drop-in มีเทมเพลตจัดเตรียมไว้ให้ในแพ็กเกจ release (`share/dedicated/nginx-iso.conf` และ `share/dedicated/vmd-iso.conf` ใต้ `/opt/nexcmp/releases//`) ให้คัดลอกไฟล์เหล่านั้น แทนที่ตัวทำเครื่องหมาย `__...__` (listen address, โฟลเดอร์, บรรทัด allow, group) และปฏิบัติตามกฎข้างต้น 5. **เตรียมอิมเมจ OS ให้พร้อม** วาง ISO ที่ติดตั้งได้เองลงในโฟลเดอร์ไลบรารี (ดูหัวข้อ **Templates** ด้านล่าง) ลูกค้ายังสามารถเพิ่ม ISO จากลิงก์ได้ โดยไฟล์จะถูกดาวน์โหลดมายังเซิร์ฟเวอร์ และจะไม่ส่ง URL ไปยัง iDRAC โดยตรง ## เชื่อมต่อใน NexCMP {#connect-in-nexcmp} ### 1. เปิดใช้งานโมดูล {#_1-turn-the-module-on} ที่ **System › Admin › License & updates** ให้เปิดสวิตช์ **Bare Metal** หมวดหมู่ **Bare Metal** จะปรากฏขึ้นใต้ Infrastructure ดูเพิ่มเติมที่ [Modules](https://nexcmp.com/th/docs/infrastructure/modules/) ### 2. กำหนดค่าการเชื่อมต่อเครือข่ายการจัดการ {#_2-set-the-management-network-connection} เปิด **Infrastructure › Bare Metal › Safety** การ์ด **Management network connection** จะมีค่า 3 ค่าที่กำหนดว่าระบบจะสามารถทำงานได้หรือไม่: | ฟิลด์ | การตั้งค่า | ข้อมูลที่ต้องระบุ | |---|---|---| | iDRAC network (CIDR) | `dedicated_bmc_cidrs` | เครือข่ายส่วนตัว (private network) ของ iDRAC ของคุณ เช่น `10.20.0.0/24` ต้องเป็น CIDR ส่วนตัวเท่านั้น ขนาด /16 หรือเล็กกว่า สูงสุด 8 รายการ คั่นด้วยเครื่องหมายจุลภาค ระบบจะสามารถนำเข้าได้เฉพาะ iDRAC ที่อยู่ในช่วงเหล่านี้เท่านั้น | | เซิร์ฟเวอร์ ISO สำหรับ iDRACs | `dedicated_iso_base_url` | `http://[:port]` โดยไม่มีพาธ: ที่อยู่ของเว็บเซิร์ฟเวอร์ ISO จากส่วนก่อนหน้า เช่น `http://10.20.0.2:8080` คำสั่งแบบขั้นตอนเดียวจะกรอกค่านี้ให้คุณโดยอัตโนมัติ | | Panel callback address | `dedicated_callback_base` | `https://` โดยไม่มีพาธ: ที่อยู่ที่เซิร์ฟเวอร์ที่กำลังติดตั้งจะเรียกกลับมาเพื่อแจ้งว่าเสร็จสิ้นแล้ว โดยเซิร์ฟเวอร์ดังกล่าวต้องสามารถเข้าถึงที่อยู่นี้ได้จากเครือข่ายของตน ระบบจะปฏิเสธ `example.com`, `localhost` และค่าอื่นที่คล้ายกัน | แบบฟอร์มจะตรวจสอบรูปแบบขณะที่คุณพิมพ์ และเซิร์ฟเวอร์จะตรวจสอบอีกครั้งเมื่อบันทึก หากค่าไม่ถูกต้องจะถูกปฏิเสธพร้อมระบุเหตุผล และค่าที่บันทึกไว้จะยังคงเดิม ฟิลด์ที่ยังคงเป็นค่าตัวอย่างที่มากับระบบจะแสดงป้ายกำกับสีแดงว่า **Not configured** และทุกหน้า Bare Metal จะแสดงการแจ้งเตือนสีแดงว่า **Management network not configured** จนกว่าจะกำหนดค่าจริงครบทั้งสามค่า การเปลี่ยนแปลงจะถูกบันทึกลงใน audit log พร้อมเหตุผลของคุณ การบันทึกค่าตัวอย่างซ้ำอีกครั้งจะไม่ถือว่าเป็นการกำหนดค่า เว้นแต่คุณจะเป็นผู้พิมพ์ค่านั้นเอง ### 3. ตรวจสอบ Safety Gate (ปล่อยให้ปิดไว้ก่อน) {#_3-check-the-safety-gate-leave-it-closed-for-now} เปิด **Infrastructure › Bare Metal › Safety** โดย **Live ops** คือสวิตช์ระดับระบบสำหรับทุกคำสั่งเขียนไปยัง iDRAC (เปิด/ปิดเครื่อง, virtual media, console และการติดตั้ง OS) ซึ่งเริ่มต้นเป็น **off** และไม่สามารถเปิดใช้งานได้ในขณะที่การเชื่อมต่อเครือข่ายการจัดการด้านบนยังคงเป็นค่าตัวอย่างอยู่ (สวิตช์จะตอบกลับ `config_placeholder` พร้อมระบุชื่อฟิลด์) คำสั่งเขียนจะถูกปฏิเสธที่ API และภายใน worker อีกครั้ง ในขณะที่การอ่านสถานะยังคงทำงานได้ตามปกติ ระบบยังมีล็อกตัวที่สองคือ **ops_locked** เพื่อปกป้องแต่ละเซิร์ฟเวอร์ โดยเซิร์ฟเวอร์ที่เพิ่งนำเข้าใหม่จะถูกล็อกเสมอ แม้ว่าจะเปิด live ops อยู่ก็ตาม ![หน้า Safety เมื่อปิด Live ops อยู่และแสดงรายการการดำเนินการที่ถูกบล็อก](https://nexcmp.com/th/docs/images/infrastructure/dedicated-01-safety.webp) ### 4. นำเข้าเซิร์ฟเวอร์ {#_4-import-servers} 1. เปิดไปที่ **Infrastructure › Bare Metal › Stock / iDRAC import** 2. ภายใต้ **Add one server** ให้ป้อนที่อยู่ iDRAC บัญชีผู้ใช้ และรหัสผ่าน จากนั้นคลิก **Test connection** การทดสอบนี้จะส่งเฉพาะคำสั่งอ่านและไม่มีการบันทึกข้อมูลใดๆ | ฟิลด์ | ค่าตัวอย่าง | |---|---| | ที่อยู่ iDRAC (URL หรือโฮสต์) | `10.20.0.11` | | บัญชี | `nexcmp-admin` | | รหัสผ่าน | `XXXX` | | ป้ายกำกับ | `rack1-01` (ว่างเปล่า: สร้างขึ้นอัตโนมัติ) | | กำหนด IP จากพูล | ไม่บังคับ เลือกพูล IP บริการของเซิร์ฟเวอร์ | | รวมในรายการขาย | ปิดไว้จนกว่าคุณจะพร้อม | ![Stock และ iDRAC import พร้อมตัวอย่างที่อยู่และการทดสอบแบบอ่านอย่างเดียวที่สำเร็จ](https://nexcmp.com/th/docs/images/infrastructure/dedicated-02-import-server.webp) 3. คลิก **Save to stock** NexCMP จะอ่านรุ่น, CPU, RAM, ดิสก์, NIC และ service tag จาก iDRAC เซิร์ฟเวอร์จะเข้าสู่สต็อกในสถานะ **locked** 4. สำหรับเซิร์ฟเวอร์จำนวนมาก ให้ใช้ **Bulk import**: เซิร์ฟเวอร์หนึ่งรายการต่อหนึ่งบรรทัด คั่นด้วยจุลภาค, อัฒภาค หรือ Tab ฟังก์ชัน **Preview** จะตรวจสอบรายการที่อนุญาต, การซ้ำกันของที่อยู่ iDRAC หรือ service tag และอ่านข้อมูลฮาร์ดแวร์ (สูงสุดครั้งละสี่เครื่อง) ### 5. ISO ของลูกค้าและที่อยู่เว็บ ISO {#_5-customer-isos-and-the-iso-web-address} เปิดไปที่ **Infrastructure › Bare Metal › Customer ISOs** - **HTTP address serving ISOs to iDRAC** คือ `dedicated_iso_base_url` ซึ่งเป็นค่าเดียวกับในการ์ด Safety (สามารถแก้ไขได้จากที่ใดที่หนึ่ง) ให้ระบุที่อยู่บนเครือข่ายการจัดการของเว็บเซิร์ฟเวอร์ ISO ของคุณ - **Customer ISO limits** กำหนดขนาดของ ISO หนึ่งไฟล์, พื้นที่เก็บข้อมูล ISO รวม, พื้นที่ว่างขั้นต่ำ, ระยะเวลาเก็บรักษา ISO (ชั่วโมง), เวลาดาวน์โหลดสูงสุด และจำนวนการดาวน์โหลดพร้อมกัน ![Customer ISOs พร้อมที่อยู่ HTTP สำหรับ iDRAC และขีดจำกัดของ ISO](https://nexcmp.com/th/docs/images/infrastructure/dedicated-03-iso-settings.webp) ### 6. เทมเพลต OS {#_6-os-templates} เปิด **Infrastructure › Bare Metal › Templates** หน้านี้จะแสดงรายการ ISO แบบติดตั้งอัตโนมัติที่พบในโฟลเดอร์ library คลิก **Register** ที่ไฟล์เพื่อกรอกตระกูล OS, เวอร์ชัน และบัญชีผู้ใช้ (ระบบจะใส่ข้อมูลล่วงหน้าจากชื่อไฟล์) จากนั้นสลับเทมเพลตเป็น **Enable** การเปิดใช้งานเทมเพลตจะไม่เริ่มการทำงานใดๆ เนื่องจากการติดตั้งทุกครั้งยังคงต้องผ่าน safety gate ทั้งนี้ **Unregister** จะลบเฉพาะแถวของเทมเพลตเท่านั้น ไม่ลบไฟล์จริง ![Bare Metal Templates พร้อม ISO ที่ลงทะเบียนแล้วและยังไม่ได้ลงทะเบียน](https://nexcmp.com/th/docs/images/infrastructure/dedicated-04-os-templates.webp) ### 7. พูล IP {#_7-ip-pools} เปิดไปที่ **Infrastructure › Bare Metal › IP Pools** และเพิ่มช่วง IPv4 ที่เซิร์ฟเวอร์จะได้รับเป็นที่อยู่บริการ เซิร์ฟเวอร์แต่ละเครื่องจะได้รับหนึ่งที่อยู่ การเลือก **Assign an IP from a pool** ตอนนำเข้าจะใช้ที่อยู่ว่างตัวถัดไป โดยที่อยู่ว่างจะถูกนับจำนวนแยกตามพูล ![Bare Metal IP Pools พร้อมช่วงตัวอย่างและจำนวนที่ว่าง](https://nexcmp.com/th/docs/images/infrastructure/dedicated-05-ip-pools.webp) ### 8. แพลนและการจำหน่าย {#_8-plans-and-sale} 1. เปิด **Services › Dedicated Server › Plans & pricing** แก้ไขแพ็กเกจตัวอย่างทั้งสี่ (ชื่อ `BM-40C-` ใน 1.6.1) หรือสร้างขึ้นใหม่: ราคา รอบบิล และค่าติดตั้ง **ในการติดตั้งใหม่ ราคาจะป้อนเป็นดอลลาร์สหรัฐแบบมีจุดทศนิยม และจะหักยอดเงินในกระเป๋าตรงตามนั้นพอดี: ไม่จำเป็นต้องใช้อัตราแลกเปลี่ยน** การติดตั้งที่มีแพ็กเกจกำหนดราคาเป็นดองเวียดนามอยู่แล้วจะยังคงใช้เงินดองต่อไปและยังต้องตั้งค่าอัตราแลกเปลี่ยน (หากไม่มี คำสั่งซื้อจะถูกปฏิเสธด้วย `dedicated_fx_unavailable`) แพ็กเกจตัวอย่างจะเริ่มต้นด้วยราคา 0 และอยู่ในสถานะ **disabled**: แพ็กเกจที่จะเปิดขายต้องมีราคามากกว่า 0 ตรวจสอบแต่ละแพ็กเกจให้ตรงกับฮาร์ดแวร์ที่คุณนำเข้าจริง ชื่อแพ็กเกจตัวอย่างไม่ได้ตรวจหาหรือเปลี่ยนแปลงฮาร์ดแวร์ของเซิร์ฟเวอร์ 2. เปิดเซิร์ฟเวอร์ (Infrastructure › Bare Metal › the server › **Sales**) **ผูกแพลน** และเปิด **Sellable** 3. เปิดใช้งาน **live ops** (ที่หน้า Safety พร้อมกับการพิมพ์ยืนยัน) และปลดล็อกเซิร์ฟเวอร์ที่คุณต้องการใช้งาน (ที่แท็บ **Lock** ของเซิร์ฟเวอร์ พร้อมระบุเหตุผลที่จะบันทึกrลงในบันทึกการตรวจสอบ) 4. ที่ **Services › Dedicated Server** ให้เปิดใช้งานการขาย ซึ่งขั้นตอนนี้มี 2 ขั้นตอนคือ อ่านผลกระทบที่อาจเกิดขึ้น จากนั้นพิมพ์ `ENABLE SALES` จนกว่าจะดำเนินการเสร็จ ลูกค้าจะไม่เห็นหน้าสั่งซื้อและจะไม่ถูกเรียกเก็บเงิน ![แผน Dedicated Server ที่ปิดสวิตช์การขายอยู่](https://nexcmp.com/th/docs/images/infrastructure/dedicated-06-plans.webp) ### สิ่งที่ลูกค้าสามารถทำได้บนหน้าเซิร์ฟเวอร์ของตน {#what-customers-can-do-on-their-server-page} หน้าเซิร์ฟเวอร์ของลูกค้าประกอบด้วย 16 แท็บ แบ่งออกเป็น 7 กลุ่ม (Overview, Control, Network, Hardware, Billing, Activity, Settings) โดยกลุ่ม **Billing** ประกอบด้วย: - **Plan & renewal**: ชำระล่วงหน้า 1 ถึง 24 เดือนได้ในขั้นตอนเดียว โดยวันต่ออายุรอบใหม่จะนับต่อจากวันต่ออายุเดิม และหักเงินจากกระเป๋าเงินเพียงครั้งเดียว สามารถเปิดหรือปิด Auto-renew ได้ - **Billing cycle**: เลือกรอบการเรียกเก็บเงินอื่น (เช่น รายไตรมาส) ซึ่งจะมีผลตั้งแต่การต่ออายุในรอบ**ถัดไป** โดยจะไม่มีการหักเงินหรือคืนเงินในทันที - **Change plan**: ลูกค้าสามารถ**ส่งคำขอ**เปลี่ยนแพ็กเกจได้ การส่งคำขอนี้จะยังไม่มีการคิดค่าใช้จ่าย คุณสามารถอนุมัติหรือปฏิเสธคำขอได้ที่ **Services › Dedicated Server › Plan changes** หลังจากอัปเกรดฮาร์ดแวร์หรือย้ายเซิร์ฟเวอร์เรียบร้อยแล้ว เมื่ออนุมัติการอัปเกรด ระบบจะคิดส่วนต่างตามระยะเวลาที่เหลือของรอบบิลปัจจุบันที่ลูกค้าชำระไว้แล้ว ส่วนการดาวน์เกรดจะไม่มีการคืนเงินและจะมีผลในรอบบิลถัดไป - **Invoices**: ใบแจ้งหนี้ทั้งหมดของเซิร์ฟเวอร์นั้น (คำสั่งซื้อ, การต่ออายุ, การอัปเกรด) ใน **Plan changes** สามารถจัดเรียงคำขอตาม ID วันที่ สถานะ แพ็กเกจ หรือเซิร์ฟเวอร์ โดยการจัดเรียงจะครอบคลุมผลลัพธ์ทั้งหมดบนเซิร์ฟเวอร์ คอลัมน์การดำเนินการจะยังคงมองเห็นได้เมื่อคุณเลื่อนในแนวนอนบนหน้าจอแคบ ด้านบนของ **Overview** จะมีไทล์สด 4 ช่องแสดง **CPU**, **RAM**, **Disk** และ **Network** พร้อมกราฟขนาดเล็กสำหรับช่วง 24 ชั่วโมงที่ผ่านมา โดย CPU, RAM และ Disk คือเปอร์เซ็นต์การใช้งานจากการดึงข้อมูลของ iDRAC ครั้งล่าสุด (Disk คือกิจกรรม I/O ไม่ใช่พื้นที่ว่าง) ส่วน Network คือความเร็วขาเข้าและขาออกปัจจุบันรวมกับยอดรวมของเดือน ซึ่งได้มาจากตัวนับทราฟฟิก ไทล์จะแสดง **—** พร้อมเหตุผลสั้น ๆ เมื่อเซิร์ฟเวอร์ปิดอยู่, ไม่สามารถเข้าถึง iDRAC ได้ หรือเครื่องไม่ได้รายงานค่านั้น โดยจะไม่มีการแสดงค่า 0 ที่สมมุติขึ้นมา ค่าที่อ่านได้เหล่านี้มาจาก Dell iDRAC และหากไม่มีตัวนับทราฟฟิก ไทล์ Network จะยังคงแสดงเป็น **—** ทั้งนี้ไทล์จะรีเฟรชทุกนาทีขณะเปิดหน้านี้ไว้ และการคลิกจะเปิดแท็บ **Hardware** หรือ **Bandwidth** ในหน้า **Overview** การ์ด **Access** จะแสดงชื่อผู้ใช้และรหัสผ่านของระบบปฏิบัติการที่คุณติดตั้ง โดยค่าเริ่มต้นจะถูกซ่อนไว้พร้อมปุ่ม **Show** และ **Copy** ข้อมูลนี้จะแสดงหลังการติดตั้งทุกครั้ง ไม่ใช่เพียงครั้งเดียว และเจ้าของเซิร์ฟเวอร์คนใหม่จะไม่มีทางเห็นรหัสผ่านของเจ้าของคนก่อนหน้า หากมีการเปลี่ยนรหัสผ่านของระบบปฏิบัติการภายในเซิร์ฟเวอร์ การ์ดนี้จะยังคงแสดงรหัสผ่านเดิมที่ตั้งไว้ตอนติดตั้ง ส่วนแท็บ **Bandwidth** จะแสดงก็ต่อเมื่อมี traffic counter ส่งข้อมูลเข้ามาเท่านั้น (ดูที่ Limits) และจะไม่มีแท็บ **Subnet** เนื่องจาก NexCMP ไม่รองรับการนำ IP prefix ของตนเองมาใช้กับเซิร์ฟเวอร์ที่เช่า ### สิ่งที่ลูกค้าสามารถทำได้และไม่สามารถทำได้ {#what-customers-can-and-cannot-do} | สิ่งที่ลูกค้าทำได้ | สิ่งที่เป็นไปไม่ได้ | |---|---| | ดูคลังสินค้า สถานะสุขภาพ สถานะพลังงาน และเมตริกต่างๆ | ดูที่อยู่ iDRAC ชื่อผู้ใช้ หรือรหัสผ่าน | | เปิดเครื่อง ปิดเครื่องแบบสมบูรณ์ รีสตาร์ท บังคับปิด และรีเซ็ต | เปลี่ยนบัญชี iDRAC หรือการตั้งค่าเครือข่าย iDRAC | | เปิดคอนโซลเบราว์เซอร์ (ครั้งละหนึ่งเซสชัน) | เปลี่ยน BIOS หรือ RAID ล้างบันทึก อัปเดตเฟิร์มแวร์ หรือรีเซ็ต iDRAC | | เมาท์ ISO หรือลิงก์ ISO ส่วนตัว ตั้งค่าการบูตครั้งเดียว ติดตั้ง OS ใหม่จากเทมเพลตที่เปิดใช้งาน | รันคำสั่ง Redfish ดิบ (ฟังก์ชันเหล่านี้ไม่มีอยู่ใน NexCMP) | NexCMP จะไม่สร้างบัญชี iDRAC ให้แก่ลูกค้า โดยลูกค้าจะใช้งานผ่านการควบคุมบนพอร์ทัลเท่านั้น และจะไม่มีการแสดงที่อยู่หรือข้อมูลการเข้าสู่ระบบ iDRAC ให้ลูกค้าเห็น ## ตรวจสอบ {#verify} 0. ในหน้า **Safety** การ์ด **Management network connection** จะไม่แสดงป้ายกำกับสีแดง และหน้า Bare Metal จะไม่แสดงการแจ้งเตือนสีแดง เมื่อทดสอบจากโฮสต์บน management network คำสั่ง `curl -I http:///` จะต้องไม่แสดงรายการไฟล์ 1. **Test connection** ในแบบฟอร์มการนำเข้าจะส่งคืนข้อมูลรุ่น CPU, RAM และ service tag 2. เซิร์ฟเวอร์จะปรากฏใน **Servers** พร้อมกับฮาร์ดแวร์ เมื่อ **ปิด live ops อยู่** การดำเนินการด้านพลังงานจะถูกปฏิเสธด้วยข้อความ "Server control is temporarily disabled system-wide" 3. หลังจากเปิดใช้งาน live ops และปลดล็อกเซิร์ฟเวอร์ทดสอบแล้ว ให้ลองปิดและเปิดเซิร์ฟเวอร์จาก **Operations** หรือหน้าเซิร์ฟเวอร์ และเปิดคอนโซล 4. ทำการสั่งซื้อทดสอบด้วยแผนทดสอบ: เซิร์ฟเวอร์จะถูกกำหนด ระบบปฏิบัติการจะถูกติดตั้ง และการติดตั้งจะสิ้นสุดลงเมื่อเซิร์ฟเวอร์รายงานกลับมายังแพเนล ## ข้อจำกัดและหมายเหตุ {#limits-and-notes} - เซิร์ฟเวอร์จริงแต่ละเครื่องจะมีสิทธิ์การใช้งานที่ใช้งานอยู่ได้ไม่เกินหนึ่งรายการ - คำสั่งเขียนจะถูกส่งก็ต่อเมื่อ **เปิด live ops** **และ** ปดล็อกเซิร์ฟเวอร์ไว้เท่านั้น การตรวจสอบนี้จะทำซ้ำภายในเวิร์กเกอร์ทันทีก่อนส่งแต่ละคำสั่ง - สถานะ **Installing** จะรอให้ OS ใหม่ตอบสนองบนพอร์ตของตน (SSH 22, Windows 3389, Proxmox 8006) ก่อนที่คำสั่งซื้อจะเสร็จสมบูรณ์ การติดตั้งจะมีขีดจำกัดเวลา (`dedicated_install_timeout_min` ค่าเริ่มต้นคือ 150 นาที) - Bandwidth ของ dedicated server จะนับจากเอเจนต์ traffic-counter ซึ่งไม่ได้รวมอยู่ในการติดตั้งมาตรฐาน หากไม่มีเอเจนต์นี้ ระบบจะไม่บันทึกข้อมูลใดๆ พอร์ทัลจะซ่อนแท็บ Bandwidth และ API จะรายงาน `capabilities.bandwidth` เป็น `false` - การดำเนินการของผู้ดูแลระบบบนเซิร์ฟเวอร์ที่เช่า (ล็อก, ปลดล็อก, ยกเลิกโดยคืนเงินหรือไม่คืนเงิน) เป็นการทำงานแบบเดียวกันกับบริการอื่นๆ ทั้งหมด โดยการคืนเงินจะโอนกลับเข้ายอดเงินคงเหลือที่ใช้ชำระเงินเข้ามา - เซิร์ฟเวอร์จะไม่ถูกนำไปขายต่อผ่านตัวแทนจำหน่าย: Dedicated จะขายผ่านเว็บไซต์หลักเท่านั้น ## การแก้ Problme {#troubleshooting} | อาการ | สาเหตุ | วิธีแก้ปัญหา | |---|---|---| | การทดสอบล้มเหลวพร้อมข้อผิดพลาดเกี่ยวกับที่อยู่ | ที่อยู่นี้ไม่ใช่ค่า IPv4 literal ใน `dedicated_bmc_cidrs` (เป็นส่วนตัว ขนาด /16 หรือเล็กกว่า) หรือไม่อนุญาตให้ใช้พอร์ตดังกล่าว | ใช้ที่อยู่ IPv4 ของ iDRAC และเพิ่มเครือข่ายดังกล่าวภายใต้ Safety › Management network connection (`dedicated_bmc_cidrs`) โดยระบบไม่รองรับชื่อ DNS และ IPv6 | | การแจ้งเตือนสีแดง "Management network not configured" หรือสวิตช์ live ops ตอบกลับเป็น `config_placeholder` | ค่าใดค่าหนึ่งใน `dedicated_bmc_cidrs`, `dedicated_iso_base_url`, `dedicated_callback_base` ยังคงเป็นค่าตัวอย่างเริ่มต้นที่มากับระบบ | ป้อนค่าที่แท้จริงภายใต้ Safety › Management network connection | | ฟิลด์ไม่ผ่านการตรวจสอบขณะบันทึก | รูปแบบไม่ถูกต้อง (CIDR ไม่ใช่ private IP หรือกว้างกว่า /16, ที่อยู่ ISO ไม่ใช่ `http://[:port]`, callback ไม่ใช่ `https://`) หรือเป็นที่อยู่ตัวอย่างเช่น `example.com` | ตรวจสอบข้อความแจ้งเตือนใต้ฟิลด์ โดยค่าที่บันทึกไว้จะยังไม่มีการเปลี่ยนแปลง | | `nexcmp dedicated-setup-iso` หยุดทำงานก่อนที่จะมีการเปลี่ยนแปลงใดๆ | `--listen` ไม่ใช่ที่อยู่ของเซิร์ฟเวอร์นี้ พอร์ตถูกใช้งานแล้ว หรือค่าไม่ถูกต้อง | ใช้ที่อยู่ของเซิร์ฟเวอร์นี้บน management network, เปลี่ยนไปใช้พอร์ตอื่น หรือแก้ไขค่าที่ระบุในข้อความแจ้งเตือน | | "ใบรับรอง iDRAC TLS แตกต่างจากใบรับรองที่ปักหมุดไว้ - การดึงข้อมูลและการเขียนถูกหยุดลงแล้ว" | ใบรับรอง iDRAC ถูกเปลี่ยน (มีใบรับรองใหม่ หรือมีการเปลี่ยน iDRAC) | เปิดเซิร์ฟเวอร์ ไปที่แท็บ **Access** เปรียบเทียบลายนิ้วมือทั้งสอง และหากตั้งใจจะเปลี่ยน ให้คลิก **Repin certificate** | | "การควบคุมเซิร์ฟเวอร์ถูกปิดใช้งานชั่วคราวทั่วทั้งระบบ" | การทำงานสดถูกปิดอยู่ | เปิดใช้งานได้ใน **Safety** | | "เซิร์ฟเวอร์นี้ถูกล็อกไม่ให้ดำเนินการ" | การล็อกรายเซิร์ฟเวอร์ปิดอยู่ | ปลดล็อกในแท็บ **Lock** ของเซิร์ฟเวอร์พร้อมระบุเหตุผล | | "มีการดำเนินการอื่นทำงานอยู่บนเซิร์ฟเวอร์นี้" | การดำเนินการก่อนหน้ายังไม่เสร็จสิ้น | โปรดรอ; ตรวจสอบที่ **Operations** | | "มีเซสชันคอนโซลอื่นเปิดอยู่แล้วบนเซิร์ฟเวอร์นี้" | อนุญาตทีละหนึ่งคอนโซลเท่านั้น | ปิดเซสชันอื่นเสียก่อน | | "ตัวควบคุมของเซิร์ฟเวอร์ไม่สามารถใช้งานได้ชั่วคราว" | iDRAC ไม่ตอบสนอง | ตรวจสอบเครือข่ายการจัดการและ iDRAC | | การเมาท์ ISO ล้มเหลวด้วยข้อผิดพลาด 403 หรือ 404 จาก iDRAC | เว็บเซิร์ฟเวอร์ไม่สามารถอ่านไฟล์ได้หรือแอตเดรสฐานไม่ถูกต้อง | ตรวจสอบสิทธิ์ของเว็บเซิร์ฟเวอร์ ISO และ **HTTP address serving ISOs to iDRAC** | | "แผนบริการนี้หมดสต็อกในตำแหน่งที่เลือก" | ไม่มีเซิร์ฟเวอร์ที่ขายได้พร้อมแผนนั้นในโซนดังกล่าว | ผูกแผนเข้ากับเซิร์ฟเวอร์และเปิด **Sellable** | | "ไม่มีที่อยู่ IPv4 ว่างสำหรับการกำหนดในขณะนี้" | พูล IP ว่างเปล่า | เพิ่มที่อยู่ลงในพูล | | "การติดตั้ง OS อัตโนมัติไม่พร้อมใช้งานในขณะนี้" | ข้อกำหนดเบื้องต้นสำหรับการติดตั้งขาดหายไป | ตรวจสอบว่าได้เปิดใช้งานเทมเพลตแล้วและโฟลเดอร์ ISO สามารถเขียนได้ ลูกค้ายังคงสามารถติดตั้งผ่าน ISO และคอนโซลได้ | | การติดตั้งหยุดชะงัก | เซิร์ฟเวอร์ที่กำลังติดตั้งไม่สามารถเข้าถึงที่อยู่คอลแบ็กได้ | ตรวจสอบ `dedicated_callback_base` และตรวจสอบว่าเครือข่ายของเซิร์ฟเวอร์สามารถเข้าถึงพาเนลของคุณผ่าน HTTPS ได้ | --- # โหนด VPN และพร็อกซี IPv6 {#vpn-and-ipv6-proxy-nodes} > **ตำแหน่งในหน้าผู้ดูแลระบบ:** Infrastructure › VPN & Proxy nodes › Agents & external nodes (`/agents`), VPN IP pools (`/vpn/pool`), IPv6 Proxy nodes (`/vpn/proxy6/nodes`) บริการเหล่านี้อยู่ภายใต้ Services › VPN และ Services › IPv6 Proxy โมดูลทั้งสองเปิดใช้งานได้ใน System › Admin › License & updates ## What it does {#what-it-does} NexCMP จำหน่ายบริการ VPN และพร็อกซีที่เชื่อมต่อผ่าน **ที่อยู่ IP ของคุณเอง** บนเซิร์ฟเวอร์ที่คุณดูแล โหนดมี 2 ประเภท: - **โหนด VPN:** โปรแกรม Go ขนาดเล็ก `cmp-agent` ทำงานบนโหนด Linux ของคุณ โดยจะค้นหาที่อยู่ IPv4 สาธารณะบนโหนด เปิดพอร์ต SOCKS5, HTTP และตัวรับ UDP บนทุกที่อยู่ที่มีการขาย และส่งทราฟฟิกออกจาก **IP เดียวกัน** ที่ลูกค้าเชื่อมต่อ (การออกสู่ภายนอกด้วย IP เดียวกัน) พร้อมทั้งส่งรายงานไปยังพาเนลทุก ๆ ไม่กี่วินาที - **โหนดพร็อกซี IPv6:** บริการพร็อกซีที่ให้ที่อยู่แก่ลูกค้าจากพรีฟิกซ์ IPv6 ที่คุณกำหนดเส้นทางไปยังโหนด พาเนลจะติดตั้งให้คุณผ่าน SSH ใช้โหนดเหล่านี้เพื่อรีเซลล์ที่อยู่ IP ที่สะอาดในประเทศที่คุณมีเซิร์ฟเวอร์อยู่ ## ข้อกำหนด {#requirements} ### โหนด VPN {#vpn-node} | Item | Requirement | |---|---| | Operating system | ระบบปฏิบัติการ Linux ที่มี systemd และเคอร์เนลเวอร์ชัน 4.15 หรือใหม่กว่า (รองรับ IPv6 free-bind) ไบนารีเอเจนต์ที่มาพร้อมแพ็กเกจรองรับ **x86_64** (amd64) เท่านั้น | | Privileges | สิทธิ์ root สำหรับการติดตั้ง บริการจะคงไว้เฉพาะ `CAP_NET_ADMIN`, `CAP_NET_RAW` และ `CAP_DAC_READ_SEARCH` เท่านั้น | | เครื่องมือ | `curl` หรือ `wget` และ `sha256sum` (ตัวติดตั้งจะไม่ยอมดำเนินการต่อหากไม่ได้ตรวจสอบไฟล์) | | พับลิกแอดเดรส | พับลิก IPv4 แอดเดรสที่กำหนดบนอินเทอร์เฟซของโฮสต์ (อย่างละหนึ่ง `/32`) **หรือ** พรีฟิกซ์ที่เส้นทางวิ่งมายังโฮสต์ซึ่งคุณเพิ่มเป็นซับเน็ตเสริม (IPv4 /16 ถึง /32, IPv6 /48 ถึง /128) จะละเว้นช่วงไอพีส่วนตัว, CGNAT และช่วงสำหรับคู่มือ | | เครือข่าย, ขาเข้า | ลูกค้าเชื่อมต่อกับพับลิกไอพีที่จำหน่ายแต่ละรายการผ่าน **พอร์ต 65001-65535** (TCP สำหรับ SOCKS5 และ HTTP, UDP สำหรับ UDP associate) แต่ละเอนด์พอยต์ใช้ชุดพอร์ตต่อเนื่องกันสามพอร์ต | | เครือข่าย, ขาออก | HTTPS (443) ไปยังโดเมนของพาเนลของคุณ นอกจากนี้ตัวแทนยังตรวจสอบประเทศของตนเองบน `ip-api.com` (HTTP) และ `ipinfo.io` (HTTPS) โดยมีขีดจำกัด 3.5 วินาที | | เมล | การเชื่อมต่อขาออกไปยังพอร์ต 25 จะถูกบล็อกเสมอ และไม่มีการตั้งค่าสำหรับเปิดใช้งาน | | ด็อกเกอร์, VPN และอินเทอร์เฟซเสมือน | อินเทอร์เฟซชื่อ `docker*`, `veth*`, `br-*`, `cni*`, `flannel*`, `virbr*`, `cali*`, `tun*`, `tap*`, `wg*` และ `tailscale*` จะไม่มีส่วนร่วมในการจ่ายแอดเดรส | | ขึ้นอยู่กับ | โมดูล **VPN**, โซน (สร้างโดยอัตโนมัติจากประเทศของโฮสต์) และพาเนล NexCMP ที่สามารถเข้าถึงได้ผ่าน HTTPS | ### โหนดพร็อกซี IPv6 {#ipv6-proxy-node} | Item | Requirement | |---|---| | Operating system | Linux ที่ใช้ systemd บน **x86_64** คำสั่ง `systemctl`, `nft`, `ip`, `ss`, `sysctl` และ `useradd` จะต้องมีอยู่ มิฉะนั้นการติดตั้งจะหยุดลงและระบุชื่อคำสั่งที่หายไป | | การเข้าถึงสำหรับการติดตั้ง | พับลิก IPv4 แอดเดรส (ไม่อนุญาตแอดเดรสส่วนตัว, ลูปแบ็ค และ CGNAT), พอร์ต SSH, บัญชีที่มีสิทธิ์ root หรือ `sudo` และ **รหัสผ่าน** ของบัญชีนั้น รหัสผ่านนี้ใช้สำหรับการติดตั้งเท่านั้นและจะไม่ถูกจัดเก็บไว้ | | พอร์ตว่าง | **80, 443 และทุกพอร์ตที่สูงกว่า 60000** จะต้องว่าง ตัวติดตั้งจะไม่หยุดหรือเปลี่ยนแปลงบริการที่กำลังทำงานอยู่แล้ว แต่จะรายงานพอร์ตที่มีการใช้งานและหยุดทำงาน | | IPv6 | พรีฟิกซ์สาธารณะระหว่าง **/32 และ /64** ภายใน `2000::/3` ซึ่งโฮสต์สามารถใช้เป็นแหล่งที่มาสำหรับทราฟฟิกขาออก โดยจัดส่งแบบ **มีเส้นทางวิ่ง (routed)** ไปยังโฮสต์หรือ **บนลิงก์ (on-link)** พร้อม NDP proxy (ดูด้านล่าง) | | Network | ลูกค้าจะเชื่อมต่อไปยัง IPv4 ของโหนดผ่านพอร์ต 80 (HTTP proxy), พอร์ต 443 (SOCKS5) และพอร์ต 60001-65535 (หนึ่งพอร์ตต่อหนึ่ง static IP) โหนดไม่มีใบรับรอง จึงไม่มี HTTPS proxy ทราฟฟิกขาออกจะส่งผ่าน IPv6 เท่านั้น และไปยังปลายทางที่มีที่อยู่ IPv6 เท่านั้น โหนดจะดึงการกำหนดค่าจาก panel ผ่าน HTTPS | | ซอฟต์แวร์โหนดบนเซิร์ฟเวอร์พาเนล | โหนด daemon และสคริปต์เครือข่ายจะรวมอยู่ในแพ็กเกจรีลีสของ NexCMP โดย panel จะคัดลอกไฟล์เหล่านี้จากโฟลเดอร์ติดตั้ง (`/opt/nexcmp/releases//bin` หรือ `/opt/nexcmp/bin` ในบิลด์แบบกำหนดเอง) ไปยังแต่ละโหนดระหว่างการติดตั้ง นอกจากนี้ เซิร์ฟเวอร์ panel ยังต้องใช้ `sshpass` และไคลเอนต์ SSH ซึ่งตัวติดตั้งจะเพิ่ม `sshpass` ให้ และในเซิร์ฟเวอร์ที่ติดตั้งก่อน 1.4.2 คุณสามารถเพิ่มได้ด้วย `sudo apt-get install -y sshpass` | | ขึ้นอยู่กับ | โมดูล **IPv6 Proxy** และ URL ของ panel ที่โหนดจะเรียกกลับมา (**IPv6 Proxy › Settings › Panel URL for nodes** ค่าเริ่มต้น `https://`) | ## เตรียมโครงสร้างพื้นฐาน {#prepare-the-infrastructure} ### โหนด VPN {#vpn-node-1} 1. **จัดเตรียมโฮสต์** ด้วย Linux ที่รองรับและพับลิก IPv4 แอดเดรสที่คุณต้องการขาย โดยกำหนดค่าบนอินเทอร์เฟซเครือข่ายหรือกำหนดเส้นทางมายังโฮสต์ 2. **หากคุณขาย routed block** ให้วางแผนที่จะป้อนค่านั้นเป็น **Extra subnet** เมื่อคุณเพิ่มโหนด โดย agent จะติดตั้ง route `local dev lo` เพื่อให้โฮสต์ยอมรับทราฟฟิกสำหรับทุกที่อยู่ในบล็อก จากนั้นจะรายงานที่อยู่ที่พบ นอกจากนี้ agent ยังอ่าน routing table จริงของโฮสต์ และจะไม่ขายหรือดึงที่อยู่ **gateway** มาใช้เด็ดขาด: หากบล็อกดังกล่าวมี next-hop ของหนึ่งในเส้นทางของโฮสต์ (เช่น ที่อยู่เราเตอร์ของบล็อกแบบ on-link) agent จะติดตั้ง route `local` เฉพาะสำหรับส่วนของบล็อกที่อยู่รอบๆ เท่านั้น พร้อมรายงาน gateway ไปยัง panel และ panel จะกันที่อยู่นั้นออกจากพูลและจากการจัดสรรทั้งหมด ทั้งนี้ระบบจะลบ route ที่ติดตั้งไว้เมื่อ extra subnet มีการเปลี่ยนแปลงหรือเมื่อ agent หยุดทำงาน 3. **เปิดไฟร์วอลล์** อนุญาต TCP และ UDP ขาเข้า **65001-65535** บนพับลิกแอดเดรส และ HTTPS ขาออกไปยังพาเนล 4. **เสริม: ตัวนับไบต์ต่อไอพี** การบันทึกสถิติ Conntrack (`net.netfilter.nf_conntrack_acct = 1`) ช่วยให้บทบาทการตรวจสอบสามารถนับไบต์ต่อไอพีได้ พาเนลสามารถเปิดใช้งานได้โดยส่งคำสั่ง `acct` ไปยังตัวแทน ซึ่งจะเขียน `/etc/sysctl.d/99-cmp-agent.conf` ด้วย ส่วนบทบาท VPN นั้นไม่ต้องใช้ฟังก์ชันนี้ 5. **ตรวจสอบพาเนลจากโหนด:** ```bash curl -fsS -o /dev/null -w '%{http_code}\n' https://cloud.example.com/install.sh ``` ### โหนดพร็อกซี IPv6 {#ipv6-proxy-node-1} พรีฟิกซ์ IPv6 จะเดินทางมาถึงโหนดได้สองวิธี ตัวติดตั้งจะทดสอบทั้งสองวิธีด้วยการเชื่อมต่อขาออกจริงและเก็บบริการที่ใช้งานได้ | ชนิด | ความหมาย | สิ่งที่คุณกำหนดค่า | |---|---|---| | **มีเส้นทางวิ่ง (Routed)** | upstream ของคุณจะส่งต่อ prefix (เช่น /48 หรือ /56) **ไปยังที่อยู่ของตัวโหนดเอง** แพ็กเกจขาออกสามารถใช้ที่อยู่ใดก็ได้ใน prefix นั้นเป็นต้นทาง และแพ็กเกจตอบกลับจะส่งกลับมายังโหนด | ขอ prefix ที่มีการทำ routing จากผู้ให้บริการของคุณโดยมีฮอปถัดไปคือโหนด ไม่ต้องตั้งค่าอะไรเพิ่มเติมบนโหนด: บริการพร็อกซีใช้ซ็อกเก็ตแบบโปร่งใส, ตาราง policy-routing แบบคงที่ และ `nft` | | **On-link** | /64 จะอยู่บน LAN เดียวกันกับโหนด การตอบกลับจะใช้งานได้ก็ต่อเมื่อโหนดตอบสนองการค้นหาเพื่อนบ้าน (neighbour discovery) สำหรับแต่ละที่อยู่ที่มีการใช้งาน (**NDP proxy**) เท่านั้น | บริการจะตั้งค่า `net.ipv6.conf..accept_ra=2`, `forwarding=1` และ `proxy_ndp=1` เฉพาะบนอินเทอร์เฟซนั้น จดจำค่าเก่าไว้, กู้คืนค่าเดิมเมื่อหยุดทำงาน และบล็อกการส่งต่อที่อยู่ของพูล เพื่อไม่ให้โหนดกลายเป็นเราเตอร์สำหรับพูลดังกล่าว | วิธีที่การตรวจสอบทำงาน: โหนดจะพยายามเชื่อมต่อ TCP ไปยังที่อยู่ IPv6 สาธารณะ (พอร์ต 443) จากที่อยู่แบบสุ่มของ prefix ที่เป็นผู้ท้าชิง ภายในเวลา 6วินาที ผู้ท้าชิงคือที่อยู่สากลบนอินเทอร์เฟซที่มี prefix ขนาด /64 หรือสั้นกว่า บวกกับเส้นทางประเภท `local`, `unreachable` หรือ `blackhole` ระหว่าง /16 และ /64 Prefix ที่สั้นกว่า /64 จะได้รับการยอมรับว่าเป็น **routed** หาก /64 แบบสุ่มภายในนั้นทำงานได้ ::: warning ห้ามใช้ prefix เดิมซ้ำ Prefix ต้องไม่ทับซ้อนกับ prefix ของโหนดอื่น และต้องไม่กว้างไปกว่า prefix ที่เป็นของพูล IPv6 ของแผงควบคุมเองอยู่แล้ว อนุญาตให้ใช้ /64 **ภายใน**พูลของแผงควบคุมได้ การทับซ้อนจะถูกรายงานว่าเป็น "assign range … (node …)" ในผลลัพธ์การติดตั้ง และ prefix นั้นจะถูกข้ามไป ::: ข้อจำกัดที่โหนดบังคับใช้ด้วยตนเอง: ลูกค้าไม่สามารถส่งเมล (พอร์ต 25, 465, 587, 2525) จากที่อยู่ของพูลได้ และทราฟฟิก IPv4 ของแดมอนเองจะถูกจำกัดไว้เฉพาะการตอบกลับ รวมถึงการเชื่อมต่อกับแผงควบคุมและ DNS เท่านั้น ## เชื่อมต่อใน NexCMP {#connect-in-nexcmp} ### โหนด VPN {#vpn-node-2} 1. ไปที่ **System › Admin › License & updates** แล้วเปิดสวิตช์ **VPN** ดูรายละเอียดเพิ่มเติมที่ [Modules](https://nexcmp.com/th/docs/infrastructure/modules/) ![การ์ดโมดูลที่มีสวิตช์ VPN และ IPv6 Proxy](https://nexcmp.com/th/docs/images/infrastructure/vpn-proxy-nodes-01-modules.webp) 2. เปิด **Infrastructure › VPN & Proxy nodes › Agents & external nodes** คุณสามารถเพิ่มโหนดได้ 2 วิธี **a. ติดตั้งผ่าน SSH** คลิก **+ Add server (SSH)** แล้วกรอกข้อมูลดังนี้: | ฟิลด์ | ค่าตัวอย่าง | |---|---| | แอดเดรส IPv4 ของเซิร์ฟเวอร์ | `192.0.2.50` | | พอร์ต SSH | `22` | | ผู้ใช้ SSH | `root` | | รหัสผ่าน SSH | `XXXX` | | ชื่อที่แสดง | `node-ny-1` (เว้นว่าง: ตั้งชื่อตาม IP) | | บทบาทของเซิร์ฟเวอร์ | External VPN / Proxy Node | | การกำหนดโซน | อัตโนมัติด้วย GeoIP (สร้าง/กำหนดโซน) หรือเลือกโซนที่มีอยู่แล้ว | | ซับเน็ตเพิ่มเติม (ไม่บังคับ) | เว้นว่างเพื่อสแกนอินเทอร์เฟซโดยอัตโนมัติ หรือระบุบล็อกที่มีการ rout เช่น `203.0.113.0/24` | | เปิดใช้งานเพื่อขายหลังติดตั้ง | เปิดเพื่อทำเครื่องหมายว่าที่อยู่ทั้งหมดที่ตรวจพบสามารถขายได้ | คลิก **Connect & install** แผงควบคุมจะเชื่อมต่อผ่าน SSH, รันโปรแกรมติดตั้งแบบบรรทัดเดียวบนโหนดด้วยตั๋วใช้ครั้งเดียว และแสดงชื่อโหนด, ตำแหน่ง GeoIP รวมถึงช่วงที่อยู่ IP ที่ตรวจพบ ![หน้าต่างเพิ่มโหนดผ่าน SSH พร้อมตัวอย่างที่อยู่เซิร์ฟเวอร์และบทบาท](https://nexcmp.com/th/docs/images/infrastructure/vpn-proxy-nodes-02-add-server-ssh.webp) **b. ติดตั้งด้วยตนเอง** คลิก **Generate manual install token** คำสั่งจะปรากฏเพียง**ครั้งเดียว** ให้คัดลอกและนำไปรันบนโหนด: ```bash curl -fsSL https://cloud.example.com/install.sh | sudo sh -s -- --token XXXX --name node-ny-1 ``` การติดตั้งด้วยโทเค็นจะเป็นการลงทะเบียนเครื่องสำหรับการมอนิเตอร์เท่านั้น: เพื่อความปลอดภัย panel จะไม่อนุญาตให้เครื่องที่ถือโทเค็นที่แชร์กันกำหนดบทบาท VPN ให้กับตัวเอง (การเพิ่ม `--roles vpn` ในคำสั่งจะไม่มีผลใดๆ) หลังจากที่เครื่องปรากฏในรายการแล้ว ให้เปิดเครื่องนั้นและเพิ่มบทบาท **VPN** ด้วยตนเอง ส่วนการติดตั้งผ่าน SSH (ตัวเลือก a) จะกำหนดบทบาท VPN ให้กับโหนดตั้งแต่เริ่มต้น โทเค็นใหม่จะยกเลิกโทเค็นเดิม แต่โฮสต์ที่ลงทะเบียนแล้วจะยังคงทำงานต่อไปเนื่องจากใช้คีย์ของตนเอง ![หน้าต่างคำสั่งติดตั้งที่แสดงคำสั่งโทเค็นแบบใช้ครั้งเดียว](https://nexcmp.com/th/docs/images/infrastructure/vpn-proxy-nodes-03-install-command.webp) สิ่งที่โปรแกรมติดตั้งทำ: ดาวน์โหลด `cmp-agent-linux-amd64` จากแผงควบคุมของคุณ, **ตรวจสอบ SHA-256**, ติดตั้งไปยัง `/usr/local/bin/cmp-agent`, ลงทะเบียนด้วยโทเค็น, เขียนไฟล์ `/etc/cmp-agent/agent.json` และเริ่มบริการ systemd `cmp-agent` หากต้องการลบออก: `curl -fsSL https://cloud.example.com/install.sh | sudo sh -s -- --uninstall` 3. หลังจากฮาร์ทบีทแรก โหนดจะปรากฏในรายการ ประเทศของโหนดจะถูกตรวจหาโดย GeoIP (ค้นหาจากตัวโหนดเองก่อน แล้วจึงตามด้วยฐานข้อมูลของแผงควบคุม) **zone** สำหรับประเทศนั้นจะถูกสร้างและตั้งค่าเป็นสาธารณะหากยังไม่มีอยู่ และที่อยู่ที่พบบนโฮสต์จะกลายเป็นช่วงของพูล 4. เปิด **Infrastructure › VPN & Proxy nodes › VPN IP pools** เพื่อดูช่วง IP, โซน และโหนดของช่วงเหล่านั้น รวมถึงเปลี่ยนโซน, โหนด หรือสวิตช์ **Sellable** ของแต่ละช่วง โดย **Enable range** จะอนุญาตให้คำสั่งซื้อใหม่ใช้ IP ที่ว่างได้ ส่วน **Disable range** จะหยุดเฉพาะการจัดสรรใหม่เท่านั้น IP ที่เช่าอยู่จะยังคงทำงานต่อไป ![VPN IP pools พร้อมช่วง IP ที่รายงานโดยโหนด](https://nexcmp.com/th/docs/images/infrastructure/vpn-proxy-nodes-04-vpn-pool.webp) 5. เปิด **Services › VPN** กำหนดรายการราคาและเปิดการขาย สวิตช์ **Sell VPN** ใน **Subscriptions** เป็นสวิตช์เดียวกันกับโมดูล VPN ใน License & updates 6. **ไม่บังคับ: เปลี่ยนชื่อบริการ** ใน **Settings › Branding** ตัวเลือก **VPN service display name** จะเปลี่ยนชื่อที่แสดงของบริการ VPN ในเมนูลูกค้า หน้าสั่งซื้อ หน้ารายละเอียด และรายการ deploy (เช่น `IPv4 Proxy`, `Datacenter Proxy` หรือ `Static Residential Proxy` สูงสุด 40 ตัวอักษร หากเว้นว่างไว้จะใช้ `VPN`) ซึ่งจะเปลี่ยนเฉพาะป้ายข้อความเท่านั้น โดย routes, ข้อมูล และ API จะไม่เปลี่ยนแปลง ### โหนดพร็อกซี IPv6 {#ipv6-proxy-node-2} 1. ที่ **System › Admin › License & updates** ให้เปิดสวิตช์ **IPv6 Proxy** 2. เปิด **Infrastructure › VPN & Proxy nodes › IPv6 Proxy nodes** แล้วคลิก **Add node (SSH)** กรอกที่อยู่ IPv4, พอร์ต SSH, ผู้ใช้, รหัสผ่าน, ชื่อ (ระบุหรือไม่ก็ได้) และ **Reason** (จะบันทึกลงใน audit log) ของโหนด จากนั้นคลิก **Install** ![ไดอะล็อกเพิ่มโหนด IPv6 พร้อมตัวอย่างที่อยู่และเหตุผล](https://nexcmp.com/th/docs/images/infrastructure/vpn-proxy-nodes-05-proxy6-add-node.webp) 3. จากนั้นระบบจะทำตามลำดับดังนี้: ตรวจสอบเครื่องและพอร์ต, คัดลอก daemon, สคริปต์เครือข่าย, หน่วยบริการ และไฟล์สภาพแวดล้อมเฉพาะโหนด (โทเค็นโหนดและคีย์ลงนามรหัสผ่าน), รันการ **probe** เพื่อหา prefix ที่ใช้งานได้, บันทึก prefix ลงในพูล, เริ่มต้นบริการ และรอสูงสุด 90 秒สำหรับรายงานแรก **Install log** จะแสดงแต่ละขั้นตอน 4. โหนดใหม่จะสร้างโซนในสถานะ **off** (จาก GeoIP ของ IPv4 ของโหนด) เปิดใช้งานโซนได้ที่ **Infrastructure › Datacenter › Zone** เพื่อให้ลูกค้าเลือกใช้งานได้ 5. กำหนด **Mbps cap** รวมต่อโหนด (10 ถึง 100000 ต่อทิศทาง) ที่ **Services › IPv6 Proxy** กำหนดรายการราคาและเปิดการขาย 6. ตรวจสอบ **IPv6 Proxy › Settings › Panel URL for nodes** โหนดจะเรียกที่อยู่นี้ (`https://host` โดยไม่มี path) เพื่อดึงการกำหนดค่าและส่งรายงาน หากเว้นว่างไว้จะหมายถึง `https://` โดยจะต้องเป็นโฮสต์ที่มีที่อยู่ชี้ตรงไปยัง panel เพื่อให้ IPv4 ของตัวโหนดเองเชื่อมต่อไปถึงได้โดยไม่เปลี่ยนแปลง ::: tip กำหนดการหมุนเวียน ลูกค้าสามารถกำหนดช่วงเวลาการหมุนเวียนอัตโนมัติได้ตั้งแต่ 30 ถึง 600 วินาที ใน NexCMP ตัว panel จะทำงานตามกำหนดการดังกล่าว (รวมถึงการล้าง connection log ทุกชั่วโมง) และโหนดจะได้รับที่อยู่ใหม่ภายในเวลาประมาณ 5 วินาที ::: ### วิธีการรายงานของโหนด {#how-a-node-reports} | | โหนด VPN (`cmp-agent`) | โหนดพร็อกซี IPv6 | |---|---|---| | การลงทะเบียน | ทิกเก็ตหรือโทเค็นแบบใช้ครั้งเดียวผ่าน HTTPS จากนั้นใช้คีย์ของตนเอง | การติดตั้งผ่าน SSH แบบครั้งเดียว จากนั้นใช้โทเค็นโหนด | | ฮาร์ทบีท | ทุก **5 seconds** (10 วินาทีสำหรับเอเจนต์ประเภทตรวจสอบอย่างเดียว); แผงควบคุมสามารถตั้งค่าได้ 3 ถึง 300 วินาที หลังเกิดข้อผิดพลาด ระบบจะเว้นระยะเพิ่มขึ้นทีละ 5 วินาที สูงสุด 60 วินาที | โหนดจะส่งรายงานประมาณทุกๆ 60 วินาทีและดึงค่ากำหนด | | แสดงสถานะว่าออนไลน์ | มีการส่งฮาร์ทบีทภายใน **60 seconds** ล่าสุด | **alive** ภายใน **120 seconds** ล่าสุด มิฉะนั้นจะแสดง **missed heartbeat** | | การเปลี่ยนแปลงค่ากำหนด | นำไปใช้ในการส่งฮาร์ทบีทครั้งถัดไป | นำไปใช้ภายในเวลาประมาณ 5 วินาที | | การอัปเดต | แผงควบคุมสามารถส่งคำสั่ง `upgrade` พร้อมระบุเวอร์ชันใหม่, URL และ SHA-256 | ติดตั้งใหม่จากแถวของโหนด | ### ปริมาณการรับส่งข้อมูลบนโหนด VPN {#data-allowance-on-a-vpn-node} ตั้งแต่ NexCMP **1.5.1** เป็นต้นไป VPN node agent จะส่งปริมาณทราฟฟิกที่มีการใช้งานไปพร้อมกับทุก heartbeat และแผงควบคุมจะนำไปบวกเพิ่มในการใช้งานของแพ็กเกจสำหรับรอบปัจจุบัน ตัวเลขเดียวกันนี้จะแสดงให้ลูกค้าเห็น (แท็บ Overview และ Bandwidth) รวมถึงแสดงให้คุณเห็น (VPN › Subscriptions, คอลัมน์ Used และแถวของโหนด) - **การตัดการเชื่อมต่อ** เมื่อแพ็กเกจใช้ GB ครบตามกำหนดสำหรับรอบนั้นแล้ว panel จะหยุดส่ง endpoint ของแพ็กเกจดังกล่าวไปยัง agent ทำให้การเชื่อมต่อใหม่ถูกปฏิเสธและการเชื่อมต่อที่เปิดอยู่ถูกปิดลง การตัดการเชื่อมต่อจะเกิดขึ้นภายในหนึ่ง heartbeat ดังนั้นแพ็กเกจจึงอาจทำงานเกินขีดจำกัดไปได้เล็กน้อย ส่วนแพ็กเกจที่มีระดับ Unlimited จะไม่มีการตัดการเชื่อมต่อเด็ดขาด - **เปิดให้บริการอีกครั้ง** แพ็กเกจจะกลับมาให้บริการอีกครั้งภายในหนึ่ง heartbeat หลังจากที่ลูกค้าซื้อแบนด์วิธเพิ่ม หรือเมื่อเริ่มต้นรอบการใช้งานถัดไป - **Not measured** โหนดที่เอเจนต์ยังไม่ได้ส่งข้อมูลการใช้งาน (เช่น เอเจนต์รุ่นเก่า) จะแสดงเป็น **Not measured** และแพ็กเกจจะไม่ถูกระงับการใช้งานเนื่องจากปริมาณ GB - **อัปเดต agent** ใช้ agent เวอร์ชัน **1.5.1** บนโหนด แม้ agent เวอร์ชันเก่าจะยังคงนับปริมาณข้อมูลได้ แต่ข้อมูลไบต์อาจสูญหายได้ในกรณีที่ heartbeat ล้มเหลว มี endpoint หยุดทำงาน หรือมีการรีสตาร์ต และจะไม่ปิดการเชื่อมต่อที่ค้างอยู่เมื่อแพ็กเกจถูกตัด อัปเดตได้จากแถวของโหนด (Reinstall) หรือใช้คำสั่ง `upgrade` - การนับปริมาณข้อมูลจะนับจาก payload ที่ส่งผ่านพร็อกซี จึงมีค่าน้อยกว่าไบต์ที่ส่งจริงบนเครือข่ายเล็กน้อย (ประมาณ 1 %) ### ส่วนเสริม VPN ที่ยกเลิกแล้ว {#retired-vpn-add-ons} High IP Reputation, High Concurrency และ High Priority Network จะไม่มีให้เลือกสำหรับคำสั่งซื้อใหม่อีกต่อไป การสมัครสมาชิกที่มีอยู่จะยังคงรักษาส่วนเสริมที่เลือกไว้ แต่ยอดต่ออายุจะถูกหักค่าธรรมเนียมของรายการที่ยกเลิกออก ไม่มีการคืนเงินสำหรับรอบที่ชำระไปแล้ว การปรับเปลี่ยนจะใช้ราคาปัจจุบันในแค็ตตาล็อกของส่วนเสริม หากคุณเปลี่ยนราคานั้นหรือลบส่วนเสริมออก ให้ตรวจสอบยอดต่ออายุของการสมัครสมาชิกก่อนถึงกำหนดต่ออายุครั้งถัดไป ## ตรวจสอบ {#verify} 1. แถวของโหนดแสดงสถานะออนไลน์ สำหรับโหนด VPN หัวข้อ **Agents & external nodes** จะแสดงโซน ประเทศ บทบาท และช่วงไอพีที่ตรวจพบ 2. **VPN IP pools** จะแสดงช่วงไอพีที่มีไอพีว่างอยู่ และหน้า detal ของโซนจะแสดงโครงสร้างพื้นฐาน VPN 3. สั่งซื้อแพ็กเกจทดสอบ VPN หรือพร็อกซี่ ลูกค้าจะได้รับเอนด์พอยต์ `ip:port`, ชื่อผู้ใช้ และรหัสผ่าน เชื่อมต่อผ่านข้อมูลดังกล่าวและตรวจสอบว่า Public IP ที่มองเห็นตรงกับ IP ของโหนด (เช่น `curl --proxy socks5h://USER:XXXX@IP:PORT https://ifconfig.me`) 4. บนโหนด IPv6 ให้รันคำสั่งนี้บนโฮสต์: ```bash systemctl is-active nft list tables | grep proxy6 ss -ltn | grep -E ':(80|443|6[0-9]{4})\b' ``` ## ข้อจำกัดและหมายเหตุ {#limits-and-notes} - โฮสต์ Windows สามารถรันเอเจนต์สำหรับตรวจสอบได้ แต่ไม่สามารถใช้บทบาท VPN ได้ - โควตาปริมาณข้อมูล (GB ต่อรอบบิล) ของแพ็กเกจ VPN: ตั้งแต่ NexCMP 1.5.1 เป็นต้นมา แผงควบคุมจะรวมปริมาณข้อมูลที่รายงานโดย VPN node agent และตัดการทำงานของพร็อกซีในแพ็กเกจเมื่อใช้ GB ของรอบนั้นหมดแล้ว (ดูหัวข้อ "Data allowance on a VPN node" ด้านล่าง) ทั้งนี้แพ็กเกจ IPv6 Proxy จะไม่มีโควตา GB แต่จะจำกัดความเร็วเป็น Mbps ต่อแพ็กเกจ - ที่อยู่ IPv4 ของแพ็กเกจ VPN จะไม่มีการสลับเปลี่ยน (rotate) เมื่อลูกค้าแจ้งว่า IP ติดแบล็กลิสต์ คุณหรือตัวแทนจำหน่ายสามารถอนุมัติการเปลี่ยน IP จากโซนเดียวกันได้ โดยมีเพียง IPv6 Proxy เท่านั้นที่มีการ rotate - รายงานช่วงไอพีสูงสุด 64 ช่วงต่อฮาร์ทบีทหนึ่งครั้ง - ชุดพอร์ต VPN ใช้สามพอร์ตต่อหนึ่ง IP ที่ขาย ด้วยพอร์ต 65001-65535 แต่ละ IP จะให้บริการเอ็นด์พอยต์ได้จำกัด (178 ชุดพอร์ต); พาเนลจะข้ามชุดพอร์ตที่เคยถูกใช้งานไปแล้ว - การลบโหนดพร็อกซี IPv6 จะทำได้ต่อเมื่อไม่มีแพ็กเกจใดถือ IP อยู่บนโหนดนั้น การกระทำนี้จะลบช่วงไอพีและโทเค็นของโหนดออก แต่ซอฟต์แวร์บนโฮสต์จะไม่ถูกถอนการติดตั้ง - การรีเซลช่วงไอพีที่มี VM ของคุณเองอยู่ด้วยนั้นสามารถทำได้: VPN ใช้เฉพาะพอร์ต 65001-65535 เท่านั้น จึงใช้งาน IP ร่วมกับบริการอื่นได้ ## การแก้ Problme {#troubleshooting} | อาการ | สาเหตุ | วิธีแก้ปัญหา | |---|---|---| | "การลงทะเบียนล้มเหลว (โทเค็นไม่ถูกต้องหรือเข้าถึงเซิร์ฟเวอร์ไม่ได้)" | โทเค็นไม่ถูกต้องหรือถูกใช้งานไปแล้ว หรือไม่สามารถติดต่อพาเนลได้ | สร้างโทเค็นใหม่ หรือลองติดตั้งผ่าน SSH อีกครั้ง | | "ลายเซ็นต์ไฟล์ไม่ตรงกัน - หยุดการทำงาน" | ตัวแทนที่ดาวน์โหลดมาไม่ตรงกับค่า SHA-256 ที่เผยแพร่ | ตรวจสอบโฟลเดอร์ `/dl/` ของพาเนล และตรวจสอบว่าไม่มีการเขียนทับไฟล์ดาวน์โหลดระหว่างทาง | | "ตัวติดตั้งนี้สำหรับ Linux เท่านั้น" / "ยังไม่รองรับสถาปัตยกรรม …" | Windows หรือสถาปัตยกรรมอื่นที่ไม่ใช่ x86_64 (รุ่นที่เผยแพร่มี agent สำหรับ x86_64 เท่านั้น) | ใช้โฮสต์ Linux แบบ x86_64 | | ไม่ปรากฏโหนด | โหนดไม่สามารถติดต่อกับพาเนลผ่าน HTTPS ได้ | ทดสอบ `curl https:///install.sh` จากโหนด; ตรวจสอบ DNS และไฟร์วอลล์ | | โหนดปรากฏขึ้นพร้อมกับประเทศที่ไม่ถูกต้อง | การค้นหาประเทศล้มเหลว ระบบจึงใช้ฐานข้อมูลที่อยู่ของพาเนลแทน | อนุญาตการเข้าถึงขาออกไปยัง `ip-api.com` และ `ipinfo.io` หรือเลือกโซนอย่างชัดเจนในฟอร์ม SSH | | ไม่พบช่วงไอพี | ไม่มี IPv4 สาธารณะบนอินเทอร์เฟซที่ไม่ใช่เสมือน | เพิ่มแอดเดรสสาธารณะ หรือป้อนบล็อกที่เส้นทางเราต์เป็น **Extra subnet** | | VPN ทำงานปกติ แต่ทราฟฟิกออกทาง IP อื่น | IP ที่ขายไม่ได้ถูกกำหนดหรือเราต์ไปยังโฮสต์ | ตรวจสอบให้แน่ใจว่า IP อยู่บนอินเทอร์เฟซหรือครอบคลุมโดย `local … dev lo` | | "เซิร์ฟเวอร์ panel ไม่มี sshpass" | โฮสต์ของแผงควบคุมไม่สามารถเข้าสู่ระบบโหนดด้วยรหัสผ่านได้ | รัน `sudo apt-get install -y sshpass openssh-client` บนเซิร์ฟเวอร์แผงควบคุม แล้วติดตั้งโหนดใหม่อีกครั้ง | | ขึ้นข้อความ "not found in the installed package" ขณะติดตั้งโหนด IPv6 | แผงควบคุมเป็นเวอร์ชันเก่ากว่า 1.4.2 หรือเป็นบิลด์แบบกำหนดเองที่ไม่มีไฟล์ของโหนด | อัปเดต NexCMP เป็นเวอร์ชัน 1.4.2 หรือใหม่กว่า สำหรับบิลด์แบบกำหนดเองให้ใช้ `build.sh` ซึ่งปัจจุบันจะแพ็ก `brandy-proxy6d` และ `brandy-proxy6-net` มาด้วย | | "SSH: …" ที่จุดเริ่มต้นของการติดตั้ง IPv6 หรือ "SSH to internal/loopback addresses is not allowed" | พอร์ต ผู้ใช้ หรือรหัสผ่านไม่ถูกต้อง, SSH ถูกบล็อก หรือแอดเดรสเป็นแบบส่วนตัว | ใช้ IPv4 สาธารณะของโหนดและตรวจสอบการเข้าถึงด้วยตนเองโดยใช้ `ssh -p PORT USER@IP` | | "ไม่รองรับสถาปัตยกรรม … (รองรับเฉพาะ x86_64 เท่านั้น)" | โหนดไม่ใช่สถาปัตยกรรม x86_64 | ใช้โฮสต์ x86_64 | | "โหนดขาดคำสั่ง: …" | ยังไม่ได้ติดตั้ง `nft`, `ip`, `ss`, `sysctl`, `systemctl` หรือ `useradd` | ติดตั้งแพ็กเกจเหล่านี้ แล้วรันการติดตั้งใหม่อีกครั้ง | | "พอร์ตถูกใช้งานโดยบริการอื่นบนโหนด: … — 80, 443, 60001-65535 ต้องว่าง" | พอร์ต 80, 443 หรือพอร์ตที่สูงกว่า 60000 กำลังถูกใช้งานอยู่ | ย้ายบริการอื่นออกไป ตัวติดตั้งจะไม่หยุดบริการนั้นโดยอัตโนมัติ | | "ไม่พบคำนำหน้า IPv6 ที่เข้าถึงอินเทอร์เน็ตได้จากโหนด (การตรวจสอบการออกสู่ภายนอกจริงล้มเหลว)" | ไม่มีพรีฟิกซ์ที่ผ่านการเราต์, ไม่สามารถใช้ NDP proxy ได้, หรือไม่มี IPv6 ขาออก | ตรวจสอบว่าพรีฟิกซ์ถูกเราต์ไปยังโหนดแล้ว, อินเทอร์เฟซมี connectivity ของ IPv6, และไม่มีการกรองทราฟฟิกขาออก | | "ช่วงที่ตรวจพบทั้งหมดเป็นของโหนดอื่นอยู่แล้ว" | พรีฟิกซ์นี้ถูกใช้งานโดยโหนดอื่นแล้ว | ลบออกจากโหนดอื่นหรือเลือกพรีฟิกซ์อื่น | | การติดตั้งสิ้นสุดลงด้วยข้อความ "no initial report received from node" | บริการเริ่มทำงานแล้วแต่ไม่สามารถเชื่อมต่อไปยังพาเนลได้ภายใน 90 วินาที | ตรวจสอบ URL ของพาเนลที่ระบุให้โหนดและเส้นทาง HTTPS ของโหนดไปยังพาเนล ดูเพิ่มเติมที่ **Install log** | | แถวโหนดแสดงสถานะ **missed heartbeat** | ไม่มีรายงานเข้ามาเป็นเวลา 120 วินาที | ตรวจสอบบริการบนโหนด นาฬิกา และเส้นทางที่เชื่อมต่อไปยังพาเนล | | ลูกค้าไม่เห็นตำแหน่ง IPv6 | โซนถูกปิดใช้งานอยู่ | เปิดใช้งานโซนได้ที่ **Zone** | --- # AI Models {#ai-models} > **ตำแหน่งในแผงผู้ดูแลระบบ:** System › Admin › License & updates (`/license`) เพื่อเปิดโมดูล จากนั้นไปที่ Services › AI Models: Providers (`/ai/providers`), Models (`/ai/models`), Profit (`/ai/profit`) และ Audit (`/ai/audit`) ลูกค้าจะใช้งานผ่าน AI › API ในพอร์ทัลลูกค้า ## What it does {#what-it-does} AI Models คือเกตเวย์และเลเยอร์ระบบคิดเงินบนแผงควบคุมของคุณเอง ลูกค้าของคุณจะได้รับคีย์ API และเรียกใช้ **endpoint เดียวบนโดเมนของคุณ** ในรูปแบบที่เข้ากันได้กับ OpenAI หรือ Anthropic คุณสามารถเลือกได้ว่าจะให้บริการโมเดลใดและคิดค่าบริการเท่าใดต่อ 1 ล้านโทเค็น NexCMP จะตรวจสอบคีย์ ขีดจำกัด และวอลเล็ต จากนั้นส่งคำขอไปยังผู้ให้บริการที่คุณเพิ่มไว้ วัดปริมาณโทเค็น และหักเงินจากวอลเล็ตแบบเติมเงินของลูกค้า **คุณต้องจัดเตรียมแหล่งโมเดลเอง** NexCMP ไม่มีผู้ให้บริการ ไม่มีโมเดล ไม่มีที่อยู่เริ่มต้น และไม่มีการตั้งราคามาให้ในตัว ทั้งยังไม่ได้จัดหาโมเดล, คีย์ API, โทเค็น หรือบัญชีผู้ให้บริการใดๆ ::: warning ตรวจสอบข้อกำหนดของแหล่งโมเดลของคุณก่อน แหล่งโมเดลหลายแห่งจำกัดการขายต่อหรือการส่งต่อสิทธิ์การเข้าถึงให้แก่บุคคลที่สาม โปรดใช้เฉพาะแหล่งที่คุณได้รับอนุญาตให้ใช้งานและขายต่อได้เท่านั้น พร้อมทั้งปฏิบัติตามข้อกำหนดและกฎหมายที่บังคับใช้กับคุณ หน้านี้ไม่ใช่คำแนะนำทางกฎหมาย ::: AI Models เป็นผลิตภัณฑ์คนละตัวกับ **AI Chat and AI Agent** (โมดูล **AI** โปรดดู [AI providers](https://nexcmp.com/th/docs/ai/ai-providers/)) โดยทั้งสองโมดูลนี้ไม่ขึ้นต่อกัน ## ข้อกำหนด {#requirements} | Item | Requirement | |---|---| | โมดูล | เปิดใช้งาน **AI Models** ภายใต้ License & updates, Modules โดยค่าเริ่มต้นจะปิดอยู่ | | Providers | แหล่งโมเดลตั้งแต่หนึ่งแห่งขึ้นไปที่คุณได้รับอนุญาตให้จำหน่ายต่อ โดยแต่ละแห่งมี API ที่เข้ากันได้กับ OpenAI (`/chat/completions`), API ที่เข้ากันได้กับ Anthropic (`/messages`) หรือทั้งสองแบบ ซึ่งแต่ละแห่งต้องมี base URL และ API key | | Network | แผงควบคุมต้องสามารถเข้าถึงผู้ให้บริการแต่ละรายผ่าน **HTTPS บนพอร์ต 443** ที่ชื่อโดเมนสาธารณะได้ หากผู้ให้บริการอยู่บนโฮสต์ภายใน, ใช้พอร์ตอื่น หรือใช้ HTTP ธรรมดา จะต้องระบุไว้ใต้ **Allowed internal hosts** (การตั้งค่า `ai_endpoint_allow`) | | ลูกค้า | บัญชีลูกค้าที่มียอดเงินในวอลเล็ตและยืนยันที่อยู่อีเมลแล้ว | | ฮาร์ดแวร์ | ไม่มี NexCMP ทำหน้าที่ส่งต่อคำขอเท่านั้น จึงไม่ต้องใช้ GPU และไม่มีไฟล์โมเดล | ## เตรียมโครงสร้างพื้นฐาน {#prepare-the-infrastructure} 1. รับคีย์ API จากแหล่งโมเดลแต่ละแห่งที่คุณจะใช้งาน และจดบันทึก base URL ของแหล่งนั้นไว้ (เช่น `https://api.example.com/v1`) 2. ตรวจสอบข้อกำหนดและเงื่อนไขของแหล่งให้บริการเกี่ยวกับการจำหน่ายต่อ 3. หากแหล่งให้บริการทำงานอยู่ภายในเครือข่ายของคุณ ให้กำหนดที่อยู่ เช่น `http://10.0.0.5:8000/v1` โดยคุณจะต้องระบุ `10.0.0.5:8000` ไว้ใต้ **Allowed internal hosts** ## เชื่อมต่อใน NexCMP {#connect-in-nexcmp} ### 1. เปิดใช้งานโมดูล {#_1-turn-the-module-on} เปิด **System › Admin › License & updates** ค้นหาการ์ด **Module** แล้วเปิดสวิตช์ **AI Models** จากนั้นเมนูจะโหลดใหม่และมี **Services › AI Models** ปรากฏขึ้นมา ในขณะที่โมดูลยังปิดอยู่ หน้าของลูกค้า หน้าของผู้ดูแลระบบ และ gateway ทั้งหมดจะตอบกลับเป็น `404 module_disabled` และจะไม่มีการติดต่อไปยัง provider ใดๆ ![การ์ด Module ที่เปิดสวิตช์ AI Models อยู่](https://nexcmp.com/th/docs/images/infrastructure/ai-models-01-modules.webp) ### 2. เพิ่ม provider {#_2-add-a-provider} 1. เปิด **AI Models › Providers** แล้วเลือก **Add provider** 2. ป้อน **slug** แบบสั้น, **name** (มีเพียงคุณเท่านั้นที่เห็น), **type** (OpenAI-compatible, Anthropic-compatible หรือ Both), **base URL** และ **API key** พร้อมทั้ง **priority** (ตัวเลขที่น้อยกว่าจะได้รับการทดลองใช้งานก่อน) 3. บันทึกข้อมูล key จะถูกจัดเก็บแบบเข้ารหัสและจะแสดงเฉพาะ 4 ตัวอักษรสุดท้ายในภายหลังเท่านั้น key จะสามารถป้อนได้จากเซสชันของผู้ดูแลระบบที่เข้าสู่ระบบแล้วเท่านั้น ใช้ **Both** เฉพาะกับ gateway ที่รองรับทั้งสองรูปแบบอย่างแท้จริงเท่านั้น NexCMP **ไม่** แปลงข้อมูลข้ามระหว่างสองรูปแบบนี้: โมเดลที่ให้บริการโดย provider ที่เป็น OpenAI-compatible จะเข้าถึงได้ที่ `/ai/v1/chat/completions` และโมเดลที่ให้บริการโดย provider ที่เป็น Anthropic-compatible จะเข้าถึงได้ที่ `/ai/v1/messages` ![หน้า Providers ที่แสดงรายชื่อ provider ตัวอย่าง 3 รายการพร้อม type, priority และ status](https://nexcmp.com/th/docs/images/infrastructure/ai-models-02-providers.webp) ### 3. ทดสอบการเชื่อมต่อ {#_3-test-the-connection} เลือก **Test connection** ที่ provider โดย NexCMP จะอ่าน `GET /models` ด้วย key และรายงานผลเป็น **ok** หรือระบุสาเหตุที่ล้มเหลว: **auth** (key ไม่ถูกต้อง), **blocked**, **billing** หรือ **unreachable** การทดสอบจำกัดอยู่ที่ 6 ครั้งต่อนาที ### 4. ซิงค์โมเดล {#_4-sync-the-models} เลือก **Sync models** โดย NexCMP จะอ่านรายชื่อโมเดลของ provider และเพิ่มแต่ละโมเดลใหม่ในสถานะ **ปิดใช้งานและไม่มีการกำหนดราคา** โมเดลที่ provider ไม่มีในรายการอีกต่อไปจะถูกทำเครื่องหมายไว้ ในขณะที่โมดูลเปิดอยู่ รายการจะได้รับการซิงค์โดยอัตโนมัติทุกๆ 6 ชั่วโมง (การตั้งค่า `ai_models_sync_hours`) ### 5. กำหนดราคาและเปิดใช้งานโมเดล {#_5-set-prices-and-switch-models-on} 1. เปิด **AI Models › Models**. 2. สำหรับแต่ละโมเดลที่คุณต้องการขาย ให้กำหนด **selling price** เป็นสกุลเงินดอลลาร์สหรัฐต่อ 1 ล้าน token: **input**, **cached input** และ **output** 3. คุณสามารถเลือกป้อน **cost** ของคุณสำหรับโมเดลได้ จากนั้น **Profit** จะแสดงรายได้เทียบกับต้นทุนตามรายวันและตามโมเดล และ selling price ที่ต่ำกว่าต้นทุนบวกมาร์จิ้นขั้นต่ำของคุณ (การตั้งค่า `ai_min_margin_pct` ค่าเริ่มต้นคือ 10) จะถูกปฏิเสธ เว้นแต่คุณจะยืนยันว่ายอมรับการขาดทุนโดยเจตนา ทั้งนี้ **Set price from cost** จะใช้ส่วนต่างราคา (markup) ที่คุณเลือก โดยไม่มี markup เริ่มต้น 4. เปิดใช้งานโมเดล โมเดลที่ไม่ได้กำหนด selling price จะไม่สามารถเปิดใช้งานได้ ราคา cached input ที่ปล่อยว่างไว้ที่ศูนย์จะถูกคิดค่าบริการในราคา input ![หน้า Models พร้อม selling price ของ input, cached input และ output รวมถึงสวิตช์เปิด-ปิด](https://nexcmp.com/th/docs/images/infrastructure/ai-models-03-models.webp) ### 6. Routes และ failover {#_6-routes-and-failover} ในแต่ละโมเดล ส่วน **Routes** จะแสดงรายการ provider ที่ให้บริการตามลำดับ ให้เพิ่ม provider รายที่สองเป็น fallback กำหนดลำดับ และสามารถเลือกตั้งชื่อโมเดลที่แตกต่างกันสำหรับแต่ละ provider ได้ (ชื่อที่ส่งไปยัง provider อาจแตกต่างจากชื่อที่คุณเผยแพร่) เมื่อ provider ส่งกลับข้อผิดพลาดของเซิร์ฟเวอร์, ข้อผิดพลาดด้านสิทธิ์การใช้งานหรือการเรียกเก็บเงิน, ไม่พบโมเดล หรือติด rate limit ทาง NexCMP จะลองใช้เส้นทางถัดไป หากการอ่านข้อมูลหมดเวลาหลังจากส่งคำขอไปแล้ว ระบบจะ **ไม่** ส่งคำขอไปยัง provider รายอื่น เพื่อที่คุณจะได้ไม่ต้องจ่ายเงินซ้ำซ้อน provider แต่ละรายจะถูกจำกัดอัตราคำขอไว้ที่ `ai_provider_rpm` คำขอต่อนาที (ค่าเริ่มต้นคือ 50) หาก provider ยังคงส่งกลับข้อผิดพลาดด้านสิทธิ์การใช้งานหรือการเรียกเก็บเงินอย่างต่อเนื่อง NexCMP จะแจ้งเตือนผู้ดูแลระบบทาง Telegram เมื่อมีการตั้งค่า Telegram ไว้ ### 7. เปิดสวิตช์การขาย {#_7-open-the-sale-switch} ที่ด้านบนของหน้า AI Models ส่วน **sale switch** (การตั้งค่า `feature_ai_models`) จะปิดอยู่โดยค่าเริ่มต้น ในขณะที่ปิดอยู่ ลูกค้าจะเห็นว่าบริการยังไม่เปิดให้บริการ และรายการราคาสาธารณะจะแสดงสถานะว่าไม่พร้อมให้บริการ โปรดตรวจสอบว่ามีโมเดลอย่างน้อยหนึ่งโมเดลที่เปิดใช้งาน มีการกำหนดราคาขาย และมีเส้นทางพร้อม key เรียบร้อยแล้ว จากนั้นจึงเปิดสวิตช์ ### สิ่งที่ลูกค้าทำได้ {#what-customers-can-do} ในพอร์ทัลลูกค้า **AI › API**: - **Models** แสดงโมเดลและราคาของคุณ base URL และตัวอย่างคำสั่งที่พร้อมใช้งาน - **API Keys**: สร้าง เปลี่ยนชื่อ หมุนเวียน ปิดใช้งาน และลบคีย์ ข้อมูลลับจะแสดงเพียงครั้งเดียว และจัดเก็บเฉพาะค่าแฮชเท่านั้น การตั้งค่าต่อคีย์: โมเดลที่อนุญาต วันหมดอายุ งบประมาณแบบ soft budget (แจ้งเตือน) และ hard budget (บล็อกด้วย `402`) รวมถึงจำนวนคำขอต่อนาทีและโทเคนต่อนาที - **Usage** ตามโมเดล คีย์ และวัน พร้อมการส่งออกข้อมูล - **Logs**: ประวัติคำขอที่สามารถกรองได้ (เวลา, คีย์, โมเดล, โทเคน, ค่าใช้จ่าย, สถานะ, latency) **ไม่มีการบันทึกพรอมต์และการตอบกลับ** บันทึกจะถูกเก็บไว้ 90 วันตามค่าเริ่มต้น (`ai_log_retention_days`) - **Settings**: งบประมาณของบัญชีและที่อยู่อีเมลสำหรับการแจ้งเตือนงบประมาณ - **Playground**: สนทนากับโมเดล เปรียบเทียบโมเดลแบบเคียงข้างกัน และคัดลอกโค้ดที่เกี่ยวข้อง ![หน้า API Keys ของลูกค้าพร้อม base URL สำหรับรูปแบบ API ทั้งสองแบบ](https://nexcmp.com/th/docs/images/infrastructure/ai-models-04-keys.webp) เอนด์พอยต์เกตเวย์ บนโดเมนของคุณ: ```text POST /ai/v1/chat/completions OpenAI-compatible POST /ai/v1/messages Anthropic-compatible (also /ai/v1/messages/count_tokens) GET /ai/v1/models model list GET /ai/v1/models/pricing public price list, no key needed ``` ### วอลเล็ตและการเรียกเก็บเงิน {#wallet-and-billing} การใช้งาน AI จะถูกหักจากวอลเล็ตแบบเติมเงินใบเดียวกับบริการอื่นๆ ทั้งหมด ก่อนที่คำขอจะถูกส่งไปยังผู้ให้บริการ NexCMP จะกันเงินไว้สำหรับค่าใช้จ่ายสูงสุดที่อาจเกิดขึ้นของคำขอนั้น หากยอดคงเหลือต่ำกว่าเกณฑ์ขั้นต่ำ (`ai_min_balance_cents` ค่าเริ่มต้นคือ 20 เซนต์) หรือมีไม่เพียงพอ คำขอจะถูกปฏิเสธด้วย `402 insufficient_balance` และ**จะไม่มีการเรียกไปยังผู้ให้บริการ** การใช้งานจะถูกรวบรวมเป็นรายบัญชีและบันทึกลงในรายการบัญชีแยกประเภทวอลเล็ตหลังจบแต่ละชั่วโมง โดยมีการกวาดข้อมูลทุก 5 นาที การใช้งานที่ยังไม่ได้ชำระจะถูกหักออกจากยอดคงเหลือที่เกตเวย์เห็นแล้ว Reseller สามารถขาย AI Models บนโดเมนของตนเองได้ โดยมาร์กอัปหรือส่วนลดของพวกเขาจะมีผลกับราคาขายของคุณ และวอลเล็ตขายส่งของพวกเขาจะถูกหักตามราคาขายส่ง สวิตช์ AI แบบราย reseller ซึ่งเปิดไว้ตามค่าเริ่มต้น จะทำหน้าที่ควบคุมว่าใครสามารถขายได้บ้าง ## ตรวจสอบ {#verify} 1. หลังขั้นตอนที่ 3 **Test connection** จะแสดง **ok** และจำนวนโมเดล 2. หลังขั้นตอนที่ 4 โมเดลใหม่จะแสดงในรายการ โดยมีสถานะปิดอยู่และไม่มีราคา 3. ในฐานะลูกค้าที่มีเงินในวอลเล็ต ให้สร้างคีย์แล้วเรียกใช้งานเกตเวย์: ```bash curl https://your-domain/ai/v1/chat/completions \ -H "Authorization: Bearer sk-ai-…" -H "Content-Type: application/json" \ -d '{"model":"model-one","messages":[{"role":"user","content":"hello"}]}' ``` การตอบกลับ `200` จะส่งคำตอบของโมเดลกลับมา **Usage** จะแสดงคำขอ และ **Profit** จะแสดงรายการนี้หากคุณป้อนต้นทุนไว้ 4. เมื่อยอดเงินในวอลเล็ตเป็นศูนย์ การเรียกเดียวกันจะส่งกลับ `402 insufficient_balance` ## ข้อจำกัดและหมายเหตุ {#limits-and-notes} - โมดูลนี้ไม่มีผู้ให้บริการ โมเดล หรือราคาในตัว และไม่มีการอ่านรายการราคาจากผู้ให้บริการแต่อย่างใด - เครื่องมือที่ทำงานบนฝั่งผู้ให้บริการและคิดค่าบริการตามจำนวนครั้งที่เรียก เช่น การค้นหาเว็บ จะถูกปฏิเสธเนื่องจากไม่สามารถวัดปริมาณการใช้งานได้ และจะส่งต่อเฉพาะพารามิเตอร์คำขอตามรายการสั้นๆ เท่านั้น - การใช้โทเคนจะอ้างอิงจากการตอบกลับของผู้ให้บริการ หากไม่มีการตอบกลับมา NexCMP จะประเมินยอดให้และทำเครื่องหมายเรคคอร์ดนั้นว่าเป็นการประเมิน - ข้อผิดพลาดจากผู้ให้บริการจะถูกล้างข้อมูลก่อนส่งไปถึงลูกค้า (ชื่อ โฮสต์ ที่อยู่ และชื่อโมเดลของผู้ให้บริการจะถูกนำออก) ลูกค้าจะไม่เห็นว่าผู้ให้บริการรายใดเป็นผู้ประมวลผลคำขอ - ลูกค้าเข้าถึงเกตเวย์ผ่านโดเมนของพาเนลคุณ ดังนั้น TLS ของโดเมนดังกล่าวจะต้องทำงานได้อย่างถูกต้อง - NexCMP ไม่ได้ให้บริการข้อตกลงระดับการบริการ, การ fine-tuning หรือ GPU โฮสติ้งสำหรับโมดูลนี้ ## การแก้ Problme {#troubleshooting} | อาการ | สาเหตุและวิธีแก้ไข | |---|---| | ทุกหน้า AI Models และเกตเวย์ตอบกลับเป็น `404 module_disabled` | โมดูลปิดอยู่ ให้เปิด **AI Models** ภายใต้ License & updates, Modules | | การเพิ่มผู้ให้บริการล้มเหลวด้วย `endpoint_host_not_allowed`, `endpoint_must_be_https` หรือ `invalid_endpoint_port` | base URL ต้องเป็น HTTPS บนพอร์ต 443 ที่โดเมนเนมสาธารณะ สำหรับโฮสต์ภายใน พอร์ตอื่น หรือ HTTP ธรรมดา ให้ระบุ `host:port` ภายใต้ **Allowed internal hosts** | | `blocked_endpoint` | ที่อยู่ดังกล่าวเป็น IP หรือชื่อนั้นแปลงเป็นที่อยู่ส่วนตัว ให้ระบุไว้ภายใต้ **Allowed internal hosts** หากคุณต้องการใช้งานเช่นนั้น | | **Test connection** แสดงข้อความ `auth` | คีย์ไม่ถูกต้องหรือไม่มีสิทธิ์การเข้าถึง โปรดป้อนคีย์ใหม่อีกครั้ง | | ไม่สามารถเปิดใช้งานโมเดลได้ (`no_price`) | กำหนดราคาขายก่อน | | ลูกค้าได้รับ `503 ai_unavailable` | สวิตช์การขายปิดอยู่ หรือสวิตช์ AI ของตัวแทนจำหน่ายปิดอยู่ | | ลูกค้าได้รับ `503 upstream_unavailable` | ไม่มีเส้นทางที่เปิดใช้งานพร้อมคีย์ที่ให้บริการโมเดลดังกล่าวในรูปแบบที่ร้องขอ ตรวจสอบเส้นทางของโมเดลและประเภทผู้ให้บริการ | | ลูกค้าได้รับ `402 insufficient_balance` | ยอดเงินในวอลเล็ตต่ำกว่าเกณฑ์ขั้นต่ำหรือไม่เพียงพอสำหรับคำขอ แจ้งให้ลูกค้าเติมเงิน | --- # Object Storage (S3, Ceph RGW) {#object-storage-s3-ceph-rgw} > **ตำแหน่งในระบบผู้ดูแล:** Infrastructure › Cloud provider › Ceph S3 (RGW) (`/infra/s3`). บัญชีผู้ใช้: Services › Object Storage › S3 accounts (`/s3`). ราคา: Services › Object Storage › PAYG pricing (`/s3/policy`). เปิดใช้งานโมดูลได้ที่ System › Admin › License & updates ## What it does {#what-it-does} ลูกค้าสามารถสร้างบัญชี S3 จากพอร์ทัลและรับคีย์เข้าใช้งานได้ NexCMP จะทำหน้าที่สร้างและลบผู้ใช้ที่ตรงกันบน **Ceph RADOS Gateway (RGW)** ของคุณผ่านทาง RGW Admin Ops API อ่านค่าการใช้งานเพื่อการเรียกเก็บเงิน และคิดเงินแบบจ่ายตามจริง: พื้นที่จัดเก็บที่เกินโควตาฟรีต่อ GB ต่อเดือน (คิดเงินเป็นรายชั่วโมง) และปริมาณการใช้งานดาวน์โหลดต่อ GB ส่วนการอัปโหลดไม่มีค่าใช้จ่าย ใช้งานเมื่อคุณรันคลัสเตอร์ Ceph ที่มี RGW และต้องการรีเซล러บริการ object storage ## ข้อกำหนด {#requirements} | Item | Requirement | |---|---| | Ceph | คลัสเตอร์ที่มี RGW daemon อย่างน้อยหนึ่งตัว และเปิดใช้งาน **Admin Ops API** แล้ว (ค่าเริ่มต้น `rgw_enable_apis` รวม `admin` แล้ว) | | ผู้ดูแลระบบ | ผู้ใช้ RGW สำหรับ NexCMP พร้อมสิทธิ์การใช้งานที่ระบุไว้ด้านล่าง ห้ามใช้บัญชีผู้ใช้ที่เป็นเจ้าของข้อมูลของลูกค้า | | เอนด์พอยต์ | เอนด์พอยต์ S3 ที่ลูกค้าใช้งาน และเอนด์พอยต์ Admin Ops ทั้งคู่ต้องเขียนในรูปแบบ `https://host` โดย **ไม่มีพาท, ใช้พอร์ต 443 เท่านั้น** และต้องแปลงเป็นแอดเดรสแบบ **สาธารณะ** เท่านั้น: ห้ามใช้แอดเดรสแบบ loopback, link-local, multicast, private และ unique-local | | ใบรับรอง | ใบรับรองที่ถูกต้องสำหรับโฮสต์เอนด์พอยต์ | | บันทึกการใช้งาน | เปิดใช้งาน RGW usage logging (`rgw_enable_usage_log = true`) เพื่อให้ API การใช้งานสามารถรายงานปริมาณรับส่งข้อมูลได้ | | โซน | โซนหลักที่เลือกบริการ **Object Storage (S3)** ไว้ ดูเพิ่มเติมที่ [Zones](https://nexcmp.com/th/docs/infrastructure/zones/) | | สตอเรจ | ความจุใน Ceph สำหรับโควตาที่คุณต้องการขาย | | ขึ้นอยู่กับ | โมดูล **Object Storage** ปริมาณการดาวน์โหลดจะถูกนําไปคิดรวมใน [Bandwidth](https://nexcmp.com/th/docs/catalog/bandwidth/) ด้วย | ## เตรียมโครงสร้างพื้นฐาน {#prepare-the-infrastructure} บนโหนดผู้ดูแลระบบของ Ceph: 1. สร้างผู้ดูแลระบบและกำหนดสิทธิ์ Admin Ops ที่จำเป็น: ```bash radosgw-admin user create --uid=nexcmp-admin --display-name="NexCMP admin" radosgw-admin caps add --uid=nexcmp-admin --caps="users=*;buckets=*;usage=read;metadata=read" radosgw-admin user info --uid=nexcmp-admin ``` คัดลอก `access_key` และ `secret_key` จากผลลัพธ์ ซึ่งจะทำหน้าที่เป็น **Admin access key** และ **Admin secret key** ใน NexCMP 2. เปิดใช้งานบันทึกการใช้งานและรีสตาร์ทเกตเวย์: ```bash ceph config set client.rgw rgw_enable_usage_log true ``` 3. วางเกตเวย์ไว้เบื้องหลัง HTTPS บนพอร์ต 443 (ผ่านรีเวิร์สพร็อกซีหรือ TLS ของ RGW เอง), ประกาศชื่อ DNS และทดสอบจากเซิร์ฟเวอร์พาเนล: ```bash curl -fsS -o /dev/null -w '%{http_code}\n' https://s3.example.com/ ``` คุณควรได้รับผลลัพธ์เป็น S3 XML (HTTP 200 หรือ 403) ไม่ใช่หมดเวลา (timeout) ## เชื่อมต่อใน NexCMP {#connect-in-nexcmp} 1. **กำหนดบริการ S3 ให้กับโซน** เปิดไปที่ **Infrastructure › Datacenter › Zone**, แก้ไขโซนแล้วเลือก **Object Storage (S3)** เฉพาะโซนหลักที่เปิดใช้บริการ S3 เท่านั้นที่จะปรากฏในฟอร์มแบ็กเนด 2. เปิดไปที่ **Infrastructure › Cloud provider › Ceph S3 (RGW)** และคลิก **Add backend**: | ฟิลด์ | ค่าตัวอย่าง | |---|---| | ชื่อแบ็กเนด | `Ceph RGW 1` | | โซน | โซนจากขั้นตอนที่ 1 | | เอนด์พอยต์ RGW Admin Ops | `https://s3.example.com` | | Customer S3 endpoint | `https://s3.example.com` | | S3 signing region | `default` | | Admin access key | `XXXX` | | Admin secret key | `XXXX` | | ใช้งาน | on | | เปิดใช้งานการขาย (ต้องทดสอบการเชื่อมต่อก่อน) | **off** สำหรับตอนนี้ | | Reason for change | `initial setup` | ![หน้าต่าง S3 ของแบ็กและพร้อมตัวอย่างเอ็นด์พอยต์ ภูมิภาค และคีย์ที่ถูกซ่อน](https://nexcmp.com/th/docs/images/infrastructure/s3-02-backend-dialog.webp) 3. คลิก **OK** (บันทึก) แล้วคลิก **Check** ในแถว NexCMP จะเรียก Admin Ops API ด้วย admin key คำว่า **Ceph connection successful** และแท็ก **Verified** หมายความว่าใช้งานได้ 4. คลิก **Edit** เปิดสวิตช์ **Enable sales** แล้วบันทึก NexCMP จะไม่อนุญาตให้เปิดการขายจนกว่าการทดสอบจะสำเร็จ 5. เปิด **Services › Object Storage › PAYG pricing** และกำหนดราคา: | ฟิลด์ | ความหมาย | |---|---| | พื้นที่จัดเก็บข้อมูลส่วนที่เกินฟรีเทียร์ (VND/GB/เดือน) | ราคาพื้นที่จัดเก็บ; คิดเงินเป็นรายชั่วโมงโดยใช้ราคารายเดือนหารด้วย 730 | | Download (VND/GB) | ราคาสำหรับทราฟฟิกขาออก | | Upload (VND/GB) | เท่ากับ 0 เสมอ | | ฟรีเทียร์สำหรับ VM ที่กำลังทำงาน (GB) | กำหนดตายตัวที่ 100 GB ต่อบัญชีเมื่อลูกค้ามี VM ที่รันอยู่อย่างน้อย 1 รายการ โดยใช้ร่วมกันทุกบัญชี S3 ตามขนาด | | Debt limit (VND) | วงเงินการใช้งานค้างชำระที่อนุญาต | | Billing threshold (VND) | รวบรวมการใช้งานเป็นใบแจ้งหนี้เดียวเมื่อยอดเกินจำนวนนี้ | | ยอดเงินขั้นต่ำในการสร้าง S3 (VND) | ยอดเงินในกระเป๋าเงินที่ต้องมีเพื่อสร้างบัญชี | | จำนวนบัญชี S3 สูงสุดต่อลูกค้าหนึ่งราย, โควตาทางเทคนิคเริ่มต้น (GB) | ขีดจำกัดสำหรับบัญชีใหม่ | ![ฟอร์มกำหนดราคา S3 แบบ PAYG](https://nexcmp.com/th/docs/images/infrastructure/s3-04-pricing.webp) ราคาร S3 กรอกเป็นสกุลเงิน VND โดยจะถูกแปลงเพื่อแสดงผลและหักเงินในกระเป๋าเงินตามอัตราแลกเปลี่ยนที่มีผลบังคับใช้ ดูข้อมูลเพิ่มเติมที่ [Currency and exchange rates](https://nexcmp.com/th/docs/catalog/currency-and-exchange-rates/) ## ตรวจสอบ {#verify} 1. **Check** แสดงข้อความ "Ceph connection successful" 2. ในฐานะลูกค้า (หรือใช้บัญชีทดสอบ) ให้สร้างบัญชี S3 บน Ceph `radosgw-admin user list` จะแสดงผู้ใช้ใหม่ และ **S3 accounts** จะแสดงรายการดังกล่าว 3. สร้าง bucket ด้วย S3 client ใดก็ได้โดยใช้คีย์ของลูกค้าเทียบกับ endpoint ของลูกค้า จากนั้นอัปโหลดไฟล์ 4. หลังรอบการคิดเงินของชั่วโมงถัดไป **S3 accounts** จะแสดงการใช้งาน ## ข้อจำกัดและหมายเหตุ {#limits-and-notes} - แบ็กเอนด์ที่มีบัญชีเชื่อมอยู่แล้วจะยังคงรักษา **zone, endpoint และ region** เดิมไว้ หากต้องการเปลี่ยนแปลง ให้สร้างแบ็กเอนด์ใหม่ - หนึ่งโซนสามารถมีแบ็กเอนด์ของตัวเองได้ โดยบัญชีและแบ็กเอนด์จะผูกติดกับโซนนั้นอย่างถาวร - Free tier และ "การอัปโหลดฟรี" เป็นกฎตายตัว ไม่ใช่ตัวเลือก - คีย์จะถูกจัดเก็บแบบเข้ารหัส คอนโซลจะแสดงเพียงฟิลด์ "เว้นว่างไว้เพื่อคงคีย์ปัจจุบัน" โดยคู่คีย์จะต้องป้อนร่วมกันเสมอ - Secret key ของลูกค้าจะแสดงเพียงครั้งเดียวตอนสร้าง และจะไม่แสดงอีกหากทำหายต้องเปลี่ยนใหม่โดยการหมุนเวียนคีย์ (rotate) ## การแก้ Problme {#troubleshooting} | อาการ | สาเหตุ | วิธีแก้ปัญหา | |---|---|---| | "Endpoint requires HTTPS" | Endpoint ใช้ HTTP ธรรมดา | เผยแพร่ HTTPS บนพอร์ต 443 | | "ไม่อนุญาตให้ใช้พอร์ตเอ็นด์พอยต์นี้" | พอร์ตอื่นที่ไม่ใช่ 443 | ใช้พอร์ต HTTPS มาตรฐาน | | "ไม่อนุญาตให้ใช้ที่อยู่ Endpoint นี้" | ชื่อนี้ชี้ไปยังแอดเดอร์สแบบ private, loopback, link-local หรือ unique-local | ใช้แอดเดอร์สแบบสาธารณะ (public address) | | "Endpoint ต้องประกอบด้วยโปรโตคอลและโฮสต์เท่านั้น" | URL มี path, query หรือข้อมูลผู้ใช้ | Use `https://host` only. | | "ไม่สามารถแก้ไขที่อยู่ Endpoint ได้" | DNS ไม่สามารถ resolve จากเซิร์ฟเวอร์แพเนลได้ | Fix DNS. | | "Failed to connect to Ceph" | Firewall or TLS error | ทดสอบด้วย `curl` จากเซิร์ฟเวอร์แพเนล | | "Ceph returned HTTP 403 AccessDenied" | คีย์ไม่ถูกต้องหรือขาดสิทธิ์การใช้งานที่จำเป็น | ตรวจสอบคีย์อีกครั้งแล้วรัน `radosgw-admin caps add` ใหม่ | | "Invalid Ceph response" | Endpoint ไม่ใช่ RGW Admin Ops API | ชี้ไปยัง RGW ไม่ใช่หน้าเว็บเพจ | | "การทดสอบการเชื่อมต่อต้องสำเร็จก่อนจึงจะเปิดใช้งานการขายได้" | คุณเปิดใช้งานการขายก่อนที่จะทำ **Check** สำเร็จ | รัน **Check** ก่อน แล้วจึงเปิดใช้งานการขาย | | "จำเป็นต้องกรอกคีย์ใหม่ทั้งหมดสำหรับ Endpoint" | มีการเปลี่ยนแปลง Endpoint โดยไม่ได้ระบุคีย์ทั้งสองตัว | กรอก Access Key และ Secret Key พร้อมกัน | | "แบกแอนด์มีทรัพยากรที่เชื่อมโยงอยู่แล้ว โปรดสร้างแบกแอนด์ใหม่หากต้องการเปลี่ยนโซนหรือ Endpoint" | มีบัญชีใช้งานอยู่บนแบ็กเอนด์นี้แล้ว | สร้างแบ็กเอนด์ใหม่ | | "เลือกโซนหลักที่มีบริการ S3" | โซนนี้ไม่ใช่มาสเตอร์โซนหรือไม่มีบริการ S3 | ทำเครื่องหมายที่ **Object Storage (S3)** บนโซน | | "Invalid region" | ภูมิภาค (Region) มีอักขระอื่นนอกเหนือจากตัวอักษร ตัวเลข `-` และ `_` | ใช้ `default` หรือชื่อ RGW zonegroup ของคุณ | | "ไม่พบสรุปการใช้งาน Ceph จึงไม่มีการเรียกเก็บเงิน" | Usage log disabled | Enable `rgw_enable_usage_log`. | --- # Kubernetes และ Private Cloud {#kubernetes-and-private-cloud} > **ตำแหน่งในหน้าผู้ดูแลระบบ:** Kubernetes: Infrastructure › Cloud provider › CloudStack › Kubernetes (CKS) (`/infra/cloudstack?tab=k8s`) จากนั้นไปที่ Services › Kubernetes (Overview, Clusters, Versions, Policy) Private Cloud: Services › Private Cloud (Overview `/vpc`, VPC `/vpc/list`, Plans & pricing `/vpc/plans`) เปิดใช้งานทั้งสองโมดูลได้ที่ System › Admin › License & updates ## What it does {#what-it-does} - **Kubernetes.** ลูกค้าสามารถสร้างคลัสเตอร์ Kubernetes แบบจัดการบน CloudStack ของคุณได้ด้วย CloudStack Kubernetes Service (CKS) Control plane ไม่มีค่าใช้จ่าย ลูกค้าชำระเงินสำหรับโหนด **worker** NexCMP จะสร้างเครือข่ายและ IP สาธารณะแยกต่างหากสำหรับแต่ละคลัสเตอร์ พร้อมแยกคลัสเตอร์ของลูกค้าแต่ละรายออกจากกัน - **Private Cloud.** ลูกค้าจะได้รับเครือข่ายส่วนตัว (CloudStack VPC) พร้อมเราเตอร์, ซับเน็ต (tiers), กฎไฟร์วัล (network ACLs) และเครื่องเสมือนภายในนั้น ขายโดยอิงตาม **แผนแบนด์วิดท์** พร้อมความเร็วเฉพาะแบบไม่จำกัดปริมาณ (เช่น 50, 100, 500 Mbps, 1 และ 3 Gbps) ลูกค้าแต่ละรายสามารถมี VPC ได้ 1 รายการเป็นค่าเริ่มต้น ทั้งสองระบบสร้างขึ้นบน [CloudStack](https://nexcmp.com/th/docs/infrastructure/cloudstack/) และใช้งาน API ผ่านการเชื่อมต่อเดียวกัน ## ข้อกำหนด {#requirements} ### Kubernetes {#kubernetes} | Item | Requirement | |---|---| | CloudStack | 4.23 (ทดสอบแล้ว) CKS จะต้อง **เปิดใช้งาน** (`cloud.kubernetes.service.enabled = true`) | | บัญชี | บัญชี **Domain Admin** ในโดเมนเฉพาะ เพื่อให้ NexCMP สามารถสร้างโปรเจกต์ CloudStack สำหรับลูกค้าแต่ละรายและกำหนดขีดจำกัดทรัพยากรภายในนั้น ดู [CloudStack](https://nexcmp.com/th/docs/infrastructure/cloudstack/#create-a-dedicated-account-and-api-key) | | `endpoint.url` | การตั้งค่าส่วนกลางของ CloudStack ต้องชี้ไปยัง management API ของคุณ ซึ่งสามารถเข้าถึงได้จาก VM ของคลัสเตอร์ NexCMP จะแสดงค่าและผลลัพธ์ของการตรวจสอบ endpoint | | เวอร์ชัน | รายการเวอร์ชัน Kubernetes ที่รองรับอย่างน้อยหนึ่งรายการพร้อม ISO ของไบนารี ในสถานะ **Enabled** เวอร์ชันที่พ้นกำหนดซัพพอร์ตแล้วจะไม่สามารถนำมาวางจำหน่ายได้ | | คอนโทรลเพลนออฟเฟอริง | เซอร์วิสออฟเฟอริงฟรีที่ **มี vCPU 2 vCPU, RAM 2048 MB และจำกัด CPU พอดี** (`limitcpuuse = true`) ซึ่งมองเห็นได้สำหรับบัญชี เซิร์ฟเวอร์จะปฏิเสธค่าอื่นทั้งหมดด้วย `cp_offering_invalid` | | Network | เน็ตเวิร์กออฟเฟอริงแบบ isolated ที่รองรับ CKS และเปิดใช้งานอยู่ | | IP | แอดเดอร์ส IPv4 สาธารณะแบบฟรีในช่วงที่เปิดขาย โดยแต่ละคลัสเตอร์จะใช้งานหนึ่งไอพี | | ความจุ | แต่ละคลัสเตอร์จะใช้ RAM ของคุณ 2 ถึง 4 GB สำหรับคอนโทรลเพลนและ router VM ขนาดเล็ก คอยสังเกตแท็บความจุ | ### Private Cloud {#private-cloud} | Item | Requirement | |---|---| | CloudStack | 4.23 (ทดสอบแล้ว) โดยเปิดใช้งาน VPC | | VPC ออฟเฟอริง | หนึ่ง VPC ออฟเฟอริง ออฟเฟอริงแบบ dual-stack จะทำให้แต่ละเทียร์ได้รับ IPv6 /64 ด้วยเช่นกัน | | เทียร์เน็ตเวิร์กออฟเฟอริง | **หนึ่งเน็ตเวิร์กออฟเฟอริงต่อแพ็กเกจแบนด์วิดท์** สร้างขึ้นสำหรับ VPC โดยมี **network rate** (Mbps) เท่ากับแพ็กเกจ บวกกับออฟเฟอริงที่ **ถูกล็อก** ไว้ที่ **1 Mbps** ซึ่งจะถูกใช้งานเมื่อ VPC ถูกล็อกเนื่องจากค้างชำระ | | บัญชี | บัญชีเฉพาะ (แนะนำให้ใช้ Domain Admin) เน็ตเวิร์ก VPC จะอยู่ในบัญชี ไม่ใช่ในโปรเจกต์ | | IP | แอดเดอร์ส IPv4 สาธารณะแบบฟรี (แต่ละ VPC จะใช้หนึ่งไอพีสำหรับ source NAT) | | พื้นที่แอดเดอร์ส | แต่ละ VPC จะได้รับ /16 จาก `10.128.0.0/9` โปรดเว้นช่วงดังกล่าวในเน็ตเวิร์กของคุณเองโดยไม่ใช้งาน | | ขึ้นอยู่กับ | เชื่อมต่อ CloudStack แล้ว โมดูล **Private Cloud** | ## เตรียมโครงสร้างพื้นฐาน {#prepare-the-infrastructure} ### Kubernetes: เปิดใช้งาน CKS และเพิ่มเวอร์ชัน {#kubernetes-enable-cks-and-add-versions} 1. เปิดใช้งานบริการและตั้งค่า endpoint จากนั้นรีสตาร์ท management server: ```bash cmk update configuration name=cloud.kubernetes.service.enabled value=true cmk update configuration name=endpoint.url value=https://cloudstack.example.com/client/api sudo systemctl restart cloudstack-management ``` `endpoint.url` จะถูกเรียกกลับโดยคอนโทรลเลอร์ของคลัสเตอร์ ดังนั้นจึงต้องเป็นแอดเดอร์สที่ VM ของคลัสเตอร์สามารถเข้าถึงได้ 2. สร้าง ISO ของไบนารี Kubernetes สำหรับเวอร์ชันที่คุณต้องการขาย ด้วยสคริปต์ `create-kubernetes-binaries-iso.sh` จากซอร์สทรีของ CloudStack โฮสต์ไว้บนเว็บเซิร์ฟเวอร์แล้วลงทะเบียน: ```bash cmk add kubernetessupportedversion name="Kubernetes 1.35.0" semanticversion=1.35.0 \ url=https://files.example.com/setup-v1.35.0-calico-amd64.iso zoneid= \ mincpunumber=2 minmemory=2048 cmk list kubernetessupportedversions filter=name,semanticversion,state,isostate ``` รอจนกว่าสถานะของ ISO จะเปลี่ยนเป็น **Ready** และเวอร์ชันเป็น **Enabled** 3. สร้างคอนโทรลเพลนออฟเฟอริง โดยจำกัดไว้ที่โดเมนของ NexCMP: ```bash cmk create serviceoffering name=K8S-CP-2-2 displaytext="Kubernetes control plane" \ cpunumber=2 cpuspeed=1000 memory=2048 limitcpuuse=true offerha=false domainid= ``` 4. ตรวจสอบว่าเน็ตเวิร์กออฟเฟอริงของ CKS เปิดใช้งานอยู่: ```bash cmk list networkofferings state=Enabled forvpc=false filter=id,name ``` ### Private Cloud: สร้างออฟเฟอริง {#private-cloud-create-the-offerings} ใน UI ของ CloudStack (**Service Offerings › Network Offerings › Add network offering**) หรือด้วย `cmk`: 1. แสดงรายการสิ่งที่คุณมี: ```bash cmk list vpcofferings filter=id,name,state cmk list networkofferings forvpc=true filter=id,name,networkrate,state ``` 2. ใช้ VPC ออฟเฟอริงที่เปิดใช้งานแล้ว (แบบ dual-stack หากคุณต้องการ IPv6) หากคุณต้องการรายการใหม่ ให้โคลน VPC ออฟเฟอริงเริ่มต้นของ CloudStack แล้วเปิดใช้งาน 3. สำหรับ **แต่ละ** แพ็กเกจแบนด์วิดท์ที่คุณขาย ให้สร้างเน็ตเวิร์กออฟเฟอริง **สำหรับ VPC** (โคลน "isolated network offering for VPC networks" เริ่มต้น) และตั้งค่า **Network rate (Mb/s)** เป็นความเร็วของแพ็กเกจ: `50`, `100`, `500`, `1000`, `3000` เปิดใช้งานออฟเฟอริงแต่ละรายการ 4. สร้างออฟเฟอริงเพิ่มอีกหนึ่งรายการที่มี **network rate 1** (`VPC-LOCKED-1M`) สำหรับ VPC ที่ถูกล็อก: ลูกค้ายังคงสามารถเข้าถึงเซิร์ฟเวอร์ของตนผ่าน SSH ได้ แต่ความเร็วจะถูกจำกัด 5. จดจำ UUID ของแต่ละแพ็กเกจบริการไว้ NexCMP จะต้องใช้งานในหัวข้อถัดไป ::: warning รหัส offering ที่ระบุไม่มีอยู่ในคลาวด์ของคุณ แบบฟอร์ม Private Cloud จะถูกกรอกล่วงหน้าด้วย UUID ของ offering ที่เป็นของระบบ CloudStack อื่น ให้แทนที่**ทุก**รายการด้วยของคุณเอง มิฉะนั้นการสั่งซื้อ VPC แรกจะล้มเหลว ::: ## เชื่อมต่อใน NexCMP {#connect-in-nexcmp} ### Kubernetes {#kubernetes-1} 1. เปิด **Infrastructure › Cloud provider › CloudStack** แล้วเลือกแท็บ **Kubernetes (CKS)** การ์ดด้านขวา **CKS status on CloudStack (read-only)** จะแสดง `kubernetesserviceenabled`, `endpoint.url` พร้อม **Endpoint check**, network offering ของ CKS, การตั้งค่า `cloud.kubernetes.*` และรายการ ISO พร้อมเวอร์ชัน คลิก **Recheck** หลังจากที่คุณแก้ไขบางอย่างเสร็จ 2. ใน **Sales config** ให้เลือก **Control plane Offering** (จะมีคำเตือนปรากฏขึ้นหากไม่ใช่ 2 vCPU / 2048 MB / CPU cap พอดี), ตั้งค่า **Max workers per cluster** (1 ถึง 9: CKS อนุญาต 10 โนดรวมโนดควบคุม), เปิดสวิตช์ **Enable CKS for this backend** และคลิก **Save** สวิตช์จะยังคงปิดใช้งานอยู่จนกว่าจะมีการเลือก offering ![แท็บ Kubernetes (CKS) ที่เลือก control plane offering ไว้และการ์ดสถานะ CKS](https://nexcmp.com/th/docs/images/infrastructure/kubernetes-and-private-cloud-01-cks.webp) 3. เปิด **Services › Kubernetes › Versions** และคลิก **Sync from CloudStack** เปิดสวิตช์ **Available for new clusters** สำหรับเวอร์ชันที่คุณต้องการขาย กำหนดค่าเริ่มต้น และหากต้องการ ให้ระบุวันที่ **End of life (EOL)** ด้วย 4. เปิด **Services › Kubernetes › Policy** ในส่วน **Worker plans** ให้เพิ่มแผนโดยระบุ **Plan code** (A-Z, 0-9, ขีดกลาง, สูงสุด 16 ตัวอักษร) กำหนดค่า **NVMe per worker (GB)**, **Min and max workers** รวมถึงขีดจำกัดของคลัสเตอร์ (คลัสเตอร์ที่ใช้งานอยู่ต่อบัญชี, การสร้างต่อ 24 ชั่วโมง, ขีดจำกัดรวมทั่วโลก, การทำงาน CKS พร้อมกัน) จากนั้นเปิดสวิตช์ **Sell Kubernetes (CKS)** ต้องมีอย่างน้อยหนึ่งแผนที่เปิดขายอยู่ ![นโยบาย Kubernetes พร้อมแผน worker และสวิตช์การขาย](https://nexcmp.com/th/docs/images/infrastructure/kubernetes-and-private-cloud-03-policy.webp) ### Private Cloud {#private-cloud-1} 1. เปิด **Services › Private Cloud** (ภาพรวม) ในการ์ดนโยบาย ให้แทนที่ **VPC offering** และ **Locked offering tier** ด้วย UUID ของคุณเอง ตรวจสอบขีดจำกัด (VPC ต่อบัญชี, เทียร์, VM และกฎ ACL ต่อ VPC, ยอดเงินคงเหลือเป็นชั่วโมงของค่าบริการแผนที่จำเป็นต้องใช้ในการสร้าง, การเปลี่ยนแผนต่อ 24 ชั่วโมง, การทำงานพร้อมกันโดย 0 หมายถึงการหยุดฉุกเฉิน) และเซิร์ฟเวอร์ DNS คลิก **Save** (ระบบจะถามเหตุผล) ![ภาพรวม Private Cloud พร้อมฟิลด์ VPC offering และ locked offering](https://nexcmp.com/th/docs/images/infrastructure/kubernetes-and-private-cloud-04-vpc-policy.webp) 2. เปิด **Services › Private Cloud › Plans & pricing** สำหรับแต่ละแผน ให้คลิก **Edit** แล้วกำหนด **VND price per month**, **On sale** และ UUID ของ **CloudStack tier offering** ที่มีอัตราเครือข่ายเท่ากับ Mbps ของแผนนั้น แถวจะแสดงต้นทุนและกำไรเมื่อใช้งานเต็มที่ เพื่อให้คุณเห็นว่าแผนใดอยู่ต่ำกว่าต้นทุนของคุณ ![หน้าต่างแก้ไขแผนสำหรับแผนแบนด์วิดท์ Private Cloud](https://nexcmp.com/th/docs/images/infrastructure/kubernetes-and-private-cloud-05-vpc-plan.webp) 3. เปิดสวิตช์ **Sell Private Cloud** หากต้องการทดสอบก่อน ให้เพิ่ม ID บัญชีทดสอบลงใน **Beta accounts**: บัญชีเหล่านั้นจะสามารถใช้บริการได้ในขณะที่สวิตช์การขายปิดอยู่ ## ตรวจสอบ {#verify} 1. Kubernetes: การ์ดสถานะแสดง `kubernetesserviceenabled: true`, การตรวจสอบ endpoint ที่ถูกต้อง และเวอร์ชันที่เปิดใช้งาน ลองสร้างคลัสเตอร์ทดสอบแบบ 1 worker ในฐานะลูกค้า คลัสเตอร์ควรเปลี่ยนเป็นสถานะ running และ `kubectl get nodes` ควรแสดงว่าพร้อมใช้งาน ลบมันทิ้งทีหลัง: เน็ตเวิร์กและ IP จะถูกคืนกลับสู่พูล 2. Private Cloud: สร้าง VPC ด้วยแผนที่เล็กที่สุดในฐานะลูกค้าทดสอบ VPC จะแสดงสถานะ active, เทียร์ได้รับซับเน็ต, VM ในเทียร์สามารถเข้าถึงอินเทอร์เน็ตผ่าน VPC router ได้ และการใช้ **Change plan** ไปยังแผนที่ใหญ่ขึ้นจะมีผลภายในประมาณ 20 วินาทีโดยที่การเชื่อมต่อไม่หลุด ## ข้อจำกัดและหมายเหตุ {#limits-and-notes} - Kubernetes: worker จะถูกเรียกเก็บเงินเหมือน VM ตามราคาของแผนและนับเป็น VM ในขีดจำกัดของ VM คลัสเตอร์สามารถมี worker ได้สูงสุด 9 ตัวเนื่องจากข้อจำกัด CKS ที่ 10 โนด - Kubernetes: control plane, router และ public IP ของคลัสเตอร์ไม่มีค่าใช้จ่ายสำหรับลูกค้า โดยคุณจะเป็นผู้รับภาระต้นทุนส่วนนี้ - Private Cloud: ทุกแผนเป็นแบบ **unmetered** ราคาในแบบฟอร์มเป็นดองเวียดนามต่อเดือน คอลัมน์ต้นทุนจะใช้ราคาอ้างอิงที่ไม่ใช่ของคุณ ดังนั้นโปรดใช้ตัวเลขของคุณเอง - VPC ที่ถูกล็อกจะถูกจำกัดความเร็วไว้ที่ 1 Mbps, ไม่มีการเรียกเก็บเงิน และไม่ถูกลบโดยอัตโนมัติ - Private Cloud ใช้ router หนึ่งตัวต่อ VPC ไม่ใช่แบบคู่สำรอง หากโฮสต์ของมันล่ม CloudStack จะทำการสร้างขึ้นใหม่ภายในไม่กี่นาที ## การแก้ Problme {#troubleshooting} | อาการ | สาเหตุ | วิธีแก้ปัญหา | |---|---|---| | `cp_offering_invalid` / "ข้อเสนอนี้ไม่ใช่ 2 vCPU / 2048 MB / limitcpuuse" | ข้อเสนอ control-plane มีขนาดอื่นหรือไม่มีการจำกัด CPU | สร้างข้อเสนอตามขั้นตอนที่ 3 และเลือกใหม่อีกครั้ง | | สวิตช์ **Enable CKS** ถูกปิดอยู่ | ไม่ได้เลือกข้อเสนอ control-plane | โปรดเลือกหนึ่งรายการก่อน | | `kubernetesserviceenabled: false` | CKS ถูกปิดใช้งานใน CloudStack | เปิดใช้งานและรีสตาร์ท management server | | การตรวจสอบ Endpoint ล้มเหลว | `endpoint.url` ไม่สามารถเข้าถึงได้จาก VM ของคลัสเตอร์ | ตั้งค่า URL ที่เข้าถึงได้, รีสตาร์ท management server, แล้วคลิก **Recheck** | | "EOL: ไม่สามารถเปิดใช้งานสำหรับการขายได้" | เลยกำหนดวันสิ้นสุดอายุ (end-of-life) ของเวอร์ชันนี้แล้ว | ลงทะเบียนเวอร์ชันใหม่กว่า | | "ไม่มีเวอร์ชัน: คลิก Sync from CloudStack" | ยังไม่ได้ลงทะเบียนเวอร์ชัน Kubernetes | ลงทะเบียนเวอร์ชันและซิงค์ | | "แบ็กเอนด์ CKS ปิดอยู่: ลูกค้าไม่สามารถสร้างคลัสเตอร์ได้แม้ว่าจะเปิดใช้งานแฟล็กการขายแล้วก็ตาม" | เปิดสวิตช์การขายไว้แต่แบ็กเอนด์ CKS ปิดอยู่ | เปิดใช้งาน CKS บนแท็บ CloudStack | | "ต้องมีแผนอย่างน้อย 1 แผนที่วางจำหน่าย" | แผน worker ตัวสุดท้ายถูกลบออก | คงแผนไว้อย่างน้อยหนึ่งแผน หรือปิดการขาย Kubernetes | | คลัสเตอร์ค้างอยู่ในสถานะกำลังสร้าง | ทรัพยากรไม่เพียงพอหรือ ISO หายไป | ตรวจสอบแท็บความจุและสถานะ ISO ของเวอร์ชัน | | VPC ใหม่ล้มเหลวในขั้นตอนแรก | ข้อเสนอ VPC หรือข้อเสนอ tier ไม่ถูกต้อง | แทนที่ UUID ของข้อเสนอทั้งหมดด้วยค่าจาก CloudStack ของคุณ | | "cs_offering_id ต้องเป็น UUID" | รหัสข้อเสนอไม่ใช่ UUID | วางรหัสจาก `cmk list networkofferings` | | การเปลี่ยนแผนล้มเหลว | ข้อเสนอ tier ใหม่ไม่มีอยู่จริงหรืออัตราเครือข่ายไม่ถูกต้อง | ตรวจสอบ UUID ของข้อเสนอและอัตราเครือข่าย | --- # แผนและราคา {#plans-and-pricing} > **ตำแหน่งในหน้าผู้ดูแลระบบ:** Services › Virtual Machines › Plans & pricing (`/vm/catalog`) โดยมีแท็บ Plan, Custom plan, Cycle และ Offering CloudStack เทมเพลตจะอยู่บนหน้าแยกต่างหากคือ Services › Virtual Machines › Template (`/vm/templates`) ## What it does {#what-it-does} **แผน** คือขนาดที่ลูกค้าซื้อได้: vCPU, RAM, ดิสก์รูท และราคา ในโซนหนึ่ง จากแหล่งข้อมูลเดียว (CloudStack หรือคลัสเตอร์ Proxmox VE) ลูกค้าจะเลือกแผน, ระบบปฏิบัติการ และ**รอบการเรียกเก็บเงิน** (รายชั่วโมง, รายเดือน หรือระยะเวลาชำระเงินล่วงหน้าที่นานกว่า) แผนจะถูกวางขายในพอร์ทัลลูกค้า ผ่านทาง API และบนเว็บไซต์ของตัวแทนจำหน่าย ## ข้อกำหนด {#requirements} | Item | Requirement | |---|---| | Source | เชื่อมต่อ CloudStack แล้ว (แผนชี้ไปยังข้อเสนอเซอร์วิสของ CloudStack) หรือเชื่อมต่อคลัสเตอร์ Proxmox VE เข้ากับโซน ดู [CloudStack](https://nexcmp.com/th/docs/infrastructure/cloudstack/) และ [Proxmox VE](https://nexcmp.com/th/docs/infrastructure/proxmox/) | | โซน | โซนที่ขาย Virtual Machine ดู [Zones](https://nexcmp.com/th/docs/infrastructure/zones/) | | เทมเพลต | เทมเพลตที่เปิดใช้งานและพร้อมใช้งานอย่างน้อยหนึ่งรายการ ดู [OS templates](https://nexcmp.com/th/docs/infrastructure/templates/) | | อัตราแลกเปลี่ยน | เฉพาะเมื่อคุณป้อนราคาเป็น VND เท่านั้น ดู [Currency and exchange rates](https://nexcmp.com/th/docs/catalog/currency-and-exchange-rates/) | | สิทธิ์การใช้งาน | ผู้ดูแลระบบ: ทุกการเปลี่ยนแปลงราคาต้องระบุเหตุผล | ## เตรียมโครงสร้างพื้นฐาน {#prepare-the-infrastructure} - **CloudStack:** สร้าง service offerings ที่คุณต้องการขาย (แบบสาธารณะ หรือแชร์กับโดเมนของ NexCMP) โดยแผนจะชี้ไปยัง offering หนึ่ง แท็บ **Offering CloudStack** จะแสดง offerings และ disk offerings แบบสดจาก CloudStack (แคชไว้ 60วินาที) เมื่อตารางแผนว่างเปล่า เวิกเกอร์จะสร้างแผนหกรายการจาก offerings จริงของคุณโดยอัตโนมัติ - **Proxmox VE:** ไม่ต้องตั้งค่าใน Proxmox โดยแผนจะกำหนด CPU, RAM และดิสก์ของตัวเอง ซึ่งดิสก์ต้องไม่เล็กกว่าดิสก์ของเทมเพลต ## เชื่อมต่อใน NexCMP {#connect-in-nexcmp} ### วิธีการจัดเก็บราคา {#how-prices-are-stored} NexCMP จัดเก็บทุกราคาเป็น **ไมโครดอลลาร์ต่อชั่วโมง** (µ$/hour; 1 µ$ เท่ากับ 1/1,000,000 USD) คุณสามารถป้อนราคาในหน่วยที่คุณต้องการได้และฟอร์มจะทำการแปลงให้: | หน่วย | หมายเหตุ | |---|---| | USD / ชั่วโมง (6 ตำแหน่งทศนิยม) | จัดเก็บตามที่เป็นอยู่ | | USD / เดือน | หารด้วยการตั้งค่าชั่วโมงต่อเดือน (730) | | VND / เดือน | แปลงหนึ่งครั้งตามอัตราแลกเปลี่ยนปัจจุบัน แล้วจัดเก็บเป็น µ$/hour จะปรากฏขึ้นเมื่อมีอัตราแลกเปลี่ยนเท่านั้น | ฟอร์มจะแสดงผลลัพธ์: µ$/hour, USD/hour, ราคาต่อเดือน และรอบการเรียกเก็บเงินทั้งหมด **ราคาต่อเดือน = ราคาต่อชั่วโมง × 730**; รอบที่นานกว่าคือ **ราคาต่อเดือน × จำนวนเดือน × (1 − ส่วนลด)** ### เพิ่มแผน {#add-a-plan} 1. เปิด **Services › Virtual Machines › Plans & pricing** แล้วคลิก **Add plan** 2. กรอกข้อมูลในฟอร์ม: | ฟิลด์ | ค่าตัวอย่าง | |---|---| | ชื่อแผน | `VM-2-4` | | สลัก (Slug) | ว่างไว้: สร้างจากชื่อ | | โซน | โซนเริ่มต้นของคุณ | | แหล่งที่มาของโครงสร้างพื้นฐาน | ว่างไว้สำหรับ CloudStack หรือคลัสเตอร์ Proxmox | | Service offering CloudStack (แบบสด) | เลือกหนึ่งรายการ (แสดงเฉพาะสำหรับ CloudStack) | | CPU (คอร์), RAM (MB), ดิสก์หลัก (GB) | `2`, `4096`, `40` | | Disk offering | ไม่บังคับ สำหรับขนาดดิสก์หลักที่กำหนดเอง | | ป้อนราคาตาม / ราคา | `USD / month`, `12` | | คำอธิบายสั้น | `2 vCPU, 4 GB RAM, 40 GB NVMe` | | ลำดับ | `10` | | ใช้งาน | เปิด: ลูกค้าสามารถซื้อได้ | | การมองเห็น | มองเห็นได้ในแคตตาล็อก | | เหตุผลในการเปลี่ยนราคา | `initial price` | 3. คลิก **OK** แผนจะปรากฏในตารางพร้อมราคาต่อชั่วโมงและต่อเดือน รวมถึงช่องสำหรับรอบการเรียกเก็บเงินที่เปิดใช้งานทั้งหมด ![ตารางแผนพร้อมราคาต่อชั่วโมง ต่อเดือน และต่อรอบการเรียกเก็บเงิน](https://nexcmp.com/th/docs/images/catalog/plans-02-list.webp) ### รอบการเรียกเก็บเงิน {#billing-cycles} เปิดแท็บ **Cycle** เพื่อตั้งค่าว่ารอบใดบ้างที่ลูกค้าสามารถเลือกได้และส่วนลดของรอบนั้นๆ | รอบ | ค่าเริ่มต้น | หมายเหตุ | |---|---|---| | รายชั่วโมง | เปิดตลอดเวลา | เรียกเก็บเงินเป็นรายชั่วโมง | | รายเดือน | เปิด, 0% | | | 1 ปี | เปิด, 10% | | | 2 ปี | เปิด, 15% | | | 3 ปี | เปิด, 20% | | คุณสามารถเปลี่ยนชื่อรอบการเรียกเก็บเงิน ปรับส่วนลด (0 ถึง 90%) และเปิดหรือปิดใช้งานได้ การเปลี่ยนแปลงจะมีผลกับ VM ที่ซื้อหรือต่ออายุ **หลังจาก** ที่คุณบันทึกแล้ว ส่วน VM ที่กำลังทำงานอยู่จะยังคงใช้ราคาเดิมที่ล็อกไว้ ![แท็บรอบการเรียกเก็บเงินพร้อมส่วนลดตามรอบ](https://nexcmp.com/th/docs/images/catalog/plans-03-cycles.webp) ### กำหนดแผนหลักและคำนวณแผนอื่น ๆ ต่อ {#set-a-base-plan-and-derive-the-others} **Set base plan + derive other plans** จะทำการคำนวณราคาใหม่ทั้งตารางจากราคาเดียว เลือกแผนหลักและราคา จากนั้นเลือกว่าจะรักษา **current price ratios** ระหว่างแผนไว้ หรือคำนวณจาก **component prices** (µ$/ชั่วโมง ต่อ vCPU, ต่อ GB RAM และต่อ GB NVMe พร้อมส่วนลดชุดรวมเสริม 0 ถึง 50%) ตารางตัวอย่างจะแสดงราคาเก่าและใหม่ก่อนที่จะบันทึกจริง คลิก **Apply** และระบุเหตุผล เมื่อคุณใช้ราคาใหม่: VM แบบ **รายชั่วโมง** ที่กำลังทำงานอยู่จะได้รับราคาที่ **ถูกลง** ตั้งแต่รอบการเรียกเก็บเงินถัดไป และ VM แบบชำระเงินล่วงหน้าจะได้รับราคาใหม่เมื่อต่ออายุ หากราคา **สูงขึ้น** VM ที่กำลังทำงานอยู่จะยังคงใช้ราคาเดิม ### แผนกำหนดเอง {#custom-plans} แท็บ **Custom plan** ช่วยให้ลูกค้าสามารถเลือกขนาด vCPU, RAM และ NVMe ได้เอง กำหนดราคาต่อหน่วยรายชั่วโมงสำหรับหนึ่ง vCPU, หนึ่ง GB ของ RAM และหนึ่ง GB ของ NVMe (เว้นว่างไว้เพื่อคำนวณจากส่วนลดเปอร์เซ็นต์), ค่าต่ำสุด, สูงสุด และขั้นบันไดของแต่ละรายการ รวมถึงรอบการเรียกเก็บเงินที่ใช้ได้ แผนแบบ **custom** ควรมีราคาสแพงกว่าแผนคงที่ที่มีขนาดเท่ากัน มิฉะนั้นลูกค้าจะข้ามแผนคงที่ หน้าดังกล่าวจะไฮไลต์แถวที่แผน custom มีราคาถูกกว่า เปิดใช้งาน **Enable custom plans for customers** เพื่อทำการขาย หากปิดจะแสดงคำว่า "Coming soon" ในพอร์ทัล VM แบบ custom แต่ละรายการจะมีแถวแผนที่ซ่อนอยู่เป็นของตัวเอง แถวเหล่านั้นจะไม่สามารถแก้ไขหรือลบได้ในขณะที่ VM ยังคงอยู่ ### เปลี่ยน, ซ่อน, โคลน, ลบ {#change-hide-clone-delete} | การดำเนินการ | What it does | |---|---| | **Edit** | เปลี่ยนชื่อ, คำอธิบาย, ลำดับ, ราคา, สถานะการใช้งานและการมองเห็น | | **เปิด/ปิด** | **Off**: ลูกค้าไม่สามารถซื้อได้ VM ที่กำลังทำงานอยู่จะไม่ได้รับผลกระทบ | | **ซ่อน / แสดง** | แผนที่ถูกซ่อนจะไม่ปรากฏในแคตตาล็อก แต่ VM ที่มีอยู่จะยังคงใช้งานได้และผู้ดูแลระบบสามารถกำหนดให้ได้ | | **Clone** | สร้างแผนใหม่ในโซนเดียวกันด้วยแหล่งที่มา, ขนาด หรือราคาใหม่ และสามารถเลือกซ่อนแผนเก่าได้ หากต้องการขายการกำหนดค่าเดียวกันจาก CloudStack และ Proxmox ให้ทำการโคลนแล้วเลือกแหล่งที่มาอื่น | | **เลื่อนขึ้น/ลง** | เปลี่ยนลำดับ | | **Delete** | นำแผนออกจากรายการขายและจากตาราง VM ที่ใช้งานอยู่แล้วจะยังคงใช้งานแผนนั้นต่อไป | ::: warning แผนที่กำลังใช้งานอยู่จะถูกล็อก เมื่อแผนมี VM ใช้งานอยู่ **โซน, ออฟเฟอริง, ซีพียู, แรม, ดิสก์ และแหล่งที่มา** ของแผนจะถูกล็อกเพื่อไม่ให้ VM ที่ทำงานอยู่ถูกเปลี่ยนแปลงโดยไม่รู้ตัว ใช้ **Clone** เพื่อสร้างการกำหนดค่าใหม่ ส่วนแผนเก่าจะยังคงรักษา VM ของตนไว้ ::: ## ตรวจสอบ {#verify} 1. แผนจะปรากฏในตารางพร้อมกับราคารายชั่วโมงและรายเดือนที่ถูกต้องตามที่คาดไว้ 2. ในพอร์ทัลลูกค้า ให้เริ่มการสั่งซื้อ: โซนจะมีแผนดังกล่าวให้บริการและราคาตามรอบจะตรงกับแท็บ **Cycle** 3. ทดลองสั่งซื้อ ตรวจสอบการหักเงินในกระเป๋าเงินเทียบกับราคาที่แสดง และลบ VM ## ข้อจำกัดและหมายเหตุ {#limits-and-notes} - แผนหนึ่งรายการจะอยู่ใน **หนึ่ง** โซนและ **หนึ่ง** แหล่งที่มาเท่านั้น - ราคาจะถูกจัดเก็บในหน่วย µ$/ชั่วโมง ส่วนราคา VND ที่แสดงจะถูกคำนวณและปัดเศษตาม **VND rounding step** (ดูที่หน้าสกุลเงิน) กระเป๋าเงินจะเป็น USD เสมอ - ผู้ค้าระดับตัวแทนจะได้รับราคาขายส่งและราคาขายปลีกที่คำนวณมาจากราคาขายปลีกมาตรฐาน การเปลี่ยนแปลงราคาสำหรับแผนที่มีอยู่จะไม่คัดลอกราคาตัวแทนแบบกำหนดเองไปยังแผนที่โคลนซึ่งคุณได้เปลี่ยนการกำหนดค่า - ขีดจำกัดต่ำสุด สูงสุด และขั้นบันไดของแผนกำหนดเองจะถูกตรวจสอบกับขีดจำกัดของ CloudStack เอง การกำหนดขนาดดิสก์สูงสุดที่เกินกว่า `storage.max.volume.size` ของ CloudStack จะทำให้การปรับใช้ล้มเหลวและมีการคืนเงิน ## การแก้ Problme {#troubleshooting} | อาการ | สาเหตุ | วิธีแก้ปัญหา | |---|---|---| | "ต้องระบุชื่อแพ็กเกจ" / "ต้องระบุข้อเสนอการบริการ" | ข้อมูลที่จำเป็นหายไป | ระบุชื่อ และสำหรับ CloudStack ให้เลือก offering | | "CPU/RAM/ดิสก์ต้องมีค่า > 0" | ขนาดว่างเปล่าหรือเป็นศูนย์ | กรอกข้อมูลทั้งสามรายการ | | "ราคาไม่ถูกต้อง (µ$/hr ต้องอยู่ระหว่าง 1 ถึง 100,000,000)" | ราคานอกเหนือช่วงที่กำหนด | ตรวจสอบหน่วยและจำนวนเงิน | | "การเปลี่ยนแปลงราคาต้องระบุเหตุผล" | ไม่ได้ระบุเหตุผลขณะแก้ไข | พิมพ์เหตุผล (อย่างน้อย 3 ตัวอักษร) | | "Offering "X" เป็น 4c/8192 แต่แพลนกำหนด 2c/4096 - CloudStack จะจัดสรรตาม offering ต้องการบันทึกหรือไม่?" | ตัวเลขในแพลนไม่ตรงกับของ offering | ทำให้ตรงกัน หรือยืนยันเพื่อใช้ขนาดของ CloudStack | | "ไม่สามารถดึงข้อมูล offering จาก CloudStack ได้" | การเชื่อมต่อขัดข้องหรือคีย์ไม่มีสิทธิ์ | ดูที่ [CloudStack](https://nexcmp.com/th/docs/infrastructure/cloudstack/) | | "เทมเพลตยังไม่พร้อมใช้งานบน CloudStack - การปรับใช้จะล้มเหลว ต้องการเปิดใช้งานต่อไปหรือไม่?" | คุณเปิดใช้งานเทมเพลตที่ยังไม่เสร็จสมบูรณ์ | รอให้เทมเพลตพร้อมใช้งาน | | ไม่สามารถแก้ไขแพลนได้ ("มี VM อยู่ - ถูกล็อก") | มี VM ที่ใช้งานแพลนนี้อยู่ | โคลนแพลนนี้ | | แพลนไม่แสดงให้ลูกค้าเห็น | ปิดใช้งาน, ซ่อนอยู่, หรือโซนยังไม่พร้อม | ตรวจสอบ **Active**, **Visibility** และแท็กโซน ดูที่ [Zones](https://nexcmp.com/th/docs/infrastructure/zones/) | | "โปรดเลือกอย่างน้อย 1 รอบการเรียกเก็บเงิน" | ไม่ได้เลือก vòng รอบสำหรับแพลนกำหนดเอง | เลือกอย่างน้อยหนึ่งรายการ | | "ส่วนลดบันเดิลต้องอยู่ระหว่าง 0–50%" | นอกเหนือช่วงที่กำหนด | ใช้ค่า 0 ถึง 50 | | ตัวเลือกราคา VND หายไป | ยังไม่มีอัตราแลกเปลี่ยน | อัปเดตอัตราแลกเปลี่ยนก่อน | --- # โควต้าแบนด์วิธและส่วนเสริม {#bandwidth-quotas-and-add-ons} > **ตำแหน่งในหน้าผู้ดูแลระบบ:** Services › Bandwidth: Summary (`/bandwidth`), Add-on (`/bandwidth/addons`) และ Quotas, pricing & policy (`/bandwidth/policy`) สวิตช์โมดูลอยู่ใน System › Admin › License & updates ## What it does {#what-it-does} แบนด์วิธจะกำหนด **โควต้า** ทราฟฟิกรายเดือนให้กับทุกบริการที่มีการวัดปริมาณการใช้งาน NexCMP จะวัดการใช้งาน แจ้งเตือนลูกค้าที่ 80% และ 100% และเมื่อใช้งานเกินโควต้า ระบบจะดำเนินการตาม **นโยบายเมื่อเกินโควต้า** ของคุณ ลูกค้าสามารถซื้อ **ส่วนเสริม** เป็นเทราไบต์เพิ่มได้จากกระเป๋าเงิน และคุณยังสามารถมอบส่วนเสริมให้ฟรีได้อีกด้วย | บริการ | โควต้า | |---|---| | Virtual Machines | ต่อ VM ต่อเดือน (ค่าเริ่มต้น 2048 GB หรือก็คือ 2 TB) | | Kubernetes | โควต้า VM คูณด้วยจำนวน worker | | Object Storage | ทราฟฟิกดาวน์โหลดต่อลูกค้าต่อเดือน (ค่าเริ่มต้น 100 GB) หลังจากนั้นจะคิดราคาตามการใช้งานจริงปกติ | | VPN | คงโควต้าของแพลนเดิมไว้ อัปเกรดแบนด์วิธได้ที่หน้า VPN | | Private Cloud | **ไม่จำกัดแบนด์วิธ** | ## ข้อกำหนด {#requirements} | Item | Requirement | |---|---| | โมดูล | **Bandwidth** จะเปิดใช้งานโดยค่าเริ่มต้น ปิดใช้งานได้ที่ License & updates เพื่อซ่อน | | แหล่งข้อมูลการวัด | ใช้แหล่งข้อมูลเริ่มต้นคือ **CloudStack VM statistics** เปิดใช้งานการเก็บสถิติ VM ไว้ใน CloudStack โดยค่าเริ่มต้นที่เก็บไว้ 720 นาทีนั้นเพียงพอแล้ว | | Proxmox VE | VM บน Proxmox VE **ไม่ได้วัดปริมาณการใช้งาน** | | อัตราแลกเปลี่ยน | ราคาส่วนเสริมกรอกเป็น VND ดูที่ [Currency and exchange rates](https://nexcmp.com/th/docs/catalog/currency-and-exchange-rates/) | | ขึ้นอยู่กับ | [CloudStack](https://nexcmp.com/th/docs/infrastructure/cloudstack/) สำหรับทราฟฟิก VM และ Kubernetes ส่วน [S3](https://nexcmp.com/th/docs/infrastructure/s3/) สำหรับการดาวน์โหลดข้อมูลจัดเก็บ | ## เตรียมโครงสร้างพื้นฐาน {#prepare-the-infrastructure} ไม่จำเป็นต้องตั้งค่าเพิ่มเติม นอกจากการเชื่อมต่อ CloudStack ระบบ NexCMP จะดึงข้อมูล `listVirtualMachinesUsageHistory` สำหรับ VM ทั้งหมดของบัญชีในการเรียกครั้งเดียว ทุกๆ 5 นาที ภายในช่วงเวลาสูงสุดไม่เกินสอง小时 แต่ละตัวอย่างครอบคลุมเวลาหนึ่งนาทีและจะถูก **รวมเข้าด้วยกัน** ตัวอย่างจะถูกเก็บย้อนหลังจากปัจจุบันไปสามนาทีเพื่อให้แน่ใจว่าข้อมูลส่งมาถึงทัน หากมีช่องว่างที่นานกว่าระยะเวลาการเก็บข้อมูลของ CloudStack (ประมาณ 12 ชั่วโมง) ระบบจะข้ามและบันทึกไว้ ::: info ความหมายของตัวเลข การใช้งานจะนับบนอินเทอร์เฟซเครือข่ายของ VM แต่ละตัว ดังนั้นจึงรวมทราฟฟิกหว่าง VM ด้วย ไม่ใช่แค่ทราฟฟิกออกอินเทอร์เน็ตเท่านั้น ตัวเลขนี้จึงอาจสูงกว่าที่เร้าเตอร์ขอบข่าย (Edge Router) นับเล็กน้อย ::: ## เชื่อมต่อใน NexCMP {#connect-in-nexcmp} 1. เปิดไปที่ **Services › Bandwidth › Quotas, pricing & policy** 2. กำหนดค่าต่างๆ แล้วคลิก **Save** โดยจะต้องระบุเหตุผลเพื่อบันทึกประวัติ ระบบเบื้องหลังจะทำการเปลี่ยนแปลงภายในประมาณ 30 วินาที | ฟิลด์ | ค่าเริ่มต้น | ความหมาย | |---|---|---| | Enable Bandwidth (เมนูสำหรับลูกค้าและซื้อส่วนเสริม) | on | สวิตช์สำหรับเปิดปิดส่วนงานการขายของโมดูลนี้ | | VM, GB/เดือน (Kubernetes = ค่านี้ × จำนวน Worker) | 2048 | โควต้าต่อ VM ต่อรอบบิล | | S3, GB ที่ดาวน์โหลด/เดือน ต่อลูกค้าหนึ่งราย | 100 | หลังจากนี้จะคิดราคาตามการใช้งานจริง (Pay-as-you-go) ของ S3 ปกติ | | ทิศทางโควต้า (VM, Kubernetes) | เข้า + ออก | หรือ **Outbound only** | | ราคา +1 TB (VND) | 100,000 | แปลงเป็นเซนต์ตามอัตราแลกเปลี่ยนอ้างอิง | | ซื้อสูงสุดได้ต่อครั้ง (TB) | 50 | | | นโยบายเมื่อเกินโควต้า | ระงับการใช้งาน | **notify**, **throttle** หรือ **suspend** (ด้านล่าง) | | บังคับระงับการใช้งานจริงตั้งแต่วันที่ | วันที่ย้ายระบบ + 24 ชั่วโมง | ก่อนวันนี้จะไม่มีการระงับบริการใดๆ ลูกค้าจะได้รับเพียงคำเตือนเท่านั้น | | จำกัดอัตราความเร็ว Throttle (Mbps) | | ใช้สำหรับการจำกัดความเร็ว (Throttle) เท่านั้น | ![นโยบายแบนด์วิธ: โควตาเริ่มต้น, ราคาแอดออน และนโยบายส่วนเกิน](https://nexcmp.com/th/docs/images/catalog/bandwidth-01-policy.webp) ### นโยบายการใช้งานเกินโควต้า {#overage-policies} | นโยบาย | เกิดอะไรขึ้นเมื่อบริการใช้งานเกิน 100% | |---|---| | **notify** | แจ้งเตือนลูกค้า โดยไม่มีการดำเนินการอื่น | | **throttle** | ปฏิบัติเช่นเดียวกับ notify ในขณะนี้: ระบบจำกัดความเร็วยังไม่เชื่อมต่อในรุ่นนี้ | | **suspend** (ค่าเริ่มต้น) | VM, คลัสเตอร์ หรือบัญชี S3 จะถูกระงับจนกว่าลูกค้าจะซื้อส่วนเสริมหรือเริ่มต้นรอบบิลถัดไป มีผลบังคับใช้ตั้งแต่วันที่ระบุใน **suspend-from** เป็นต้นไป | การแจ้งเตือนที่ 80% และ 100% (กระดิ่งและอีเมล) จะทำงานเสมอ ครั้งเดียวต่อเกณฑ์ รอบบิล และบริการนั้น หากคุณปลดล็อกบริการที่ถูกระงับเนื่องจากแบนด์วิดท์หมดในขณะที่ปริมาณการใช้งานยังเกินโควต้าอยู่ การตรวจสอบครั้งถัดไป (ภายใน 5 นาที) จะระงับบริการนั้นอีกครั้ง หากต้องการให้บริการทำงานต่อเนื่อง ให้ทำการ **grant an add-on** ### ดูการใช้งานและให้ส่วนเสริม {#watch-usage-and-grant-add-ons} เปิด **Services › Bandwidth › Summary** ระบบจะแสดงรายการบริการทั้งหมดพร้อมการใช้งานในรอบปัจจุบัน โควตาที่รวมส่วนเสริมแล้ว โควตาคงเหลือ และเครื่องหมาย 80% และ 100% ไทล์ KPI จะแสดงจำนวนบริการ ส่วนเสริมที่ขายได้ใน 30 วันที่ผ่านมา และสถานะตัวจัดเก็บข้อมูล (ทำงานอยู่, เคอร์เซอร์) ตาราง **Daily** จะแสดงรอบปัจจุบันแบบวันต่อวัน ![Bandwidth Summary พร้อมสถานะตัวจัดเก็บข้อมูลและการใช้งานต่อบริการ](https://nexcmp.com/th/docs/images/catalog/bandwidth-02-summary.webp) หากต้องการให้โควตาเพิ่มเติมแก่ลูกค้า ให้ใช้ **Grant** บนบริการ (ส่วนเสริมขนาดหลายเทระไบต์โดยไม่มีค่าใช้จ่าย) เปิด **Add-on** เพื่อดูประวัติการซื้อและการให้ส่วนเสริม โดยเรียงจากใหม่ไปเก่า พร้อมตัวกรองประเภท ![ประวัติส่วนเสริมแสดงการซื้อและการให้ฟรี](https://nexcmp.com/th/docs/images/catalog/bandwidth-03-addons.webp) ### สิ่งที่ลูกค้าเห็น {#what-customers-see} พอร์ทัลลูกค้าจะมีเมนู **Bandwidth** ที่แสดงการใช้งาน โควตาคงเหลือ และการดำเนินการ **buy +1 TB** ซึ่งชำระเงินจากกระเป๋าเงิน (สูงสุดตามจำนวนจำกัดต่อการซื้อของคุณ) ส่วนเสริมจะมีผลใช้งานสำหรับรอบปัจจุบัน ## ตรวจสอบ {#verify} 1. ตัวจัดเก็บข้อมูลบน **Summary** กำลังทำงานอยู่และเคอร์เซอร์จะเลื่อนไปข้างหน้าทุกๆ สองสามนาที 2. VM ที่มีปริมาณการใช้งานจะแสดงข้อมูลการใช้งานหลังจากผ่านไปประมาณ 10 ถึง 15 นาที 3. หากต้องการดูการแจ้งเตือน ให้ลดโควตา VM ลงเหลือเพียงไม่กี่ GB บนการติดตั้ง **test** แล้วสร้างปริมาณการใช้งานขึ้นมา อย่าทำเช่นนี้บนระบบจริง เนื่องจากโควตานี้มีผลกับทุก VM ## ข้อจำกัดและหมายเหตุ {#limits-and-notes} - การใช้งานจะนับตามรอบ (หนึ่งเดือน) ส่วนเสริมและโควตานี้นำไปใช้กับรอบปัจจุบัน - "Enforce actual suspend from" ช่วยป้องกันไม่ให้คุณระงับการใช้งานของลูกค้าทันทีในวินาทีที่เปิดใช้งานโมดูลเป็นครั้งแรก - นโยบายการจำกัดความเร็วนั้นจะเป็นการส่งการแจ้งเตือนเท่านั้นในรุ่นนี้ - การเปลี่ยนโควตานี้จะมีผลกับทุกไซต์ รวมถึงไซต์ตัวแทนจำหน่าย ราคาขายปลีกและขายส่งของส่วนเสริมสำหรับตัวแทนจำหน่ายจะเป็นไปตามส่วนลดหรือส่วนบวกเพิ่มของพวกเขา - แบนด์วิดท์สำหรับ **Dedicated servers** เป็นคนละส่วนกัน ดูที่ [Dedicated servers](https://nexcmp.com/th/docs/infrastructure/dedicated/) ## การแก้ Problme {#troubleshooting} | อาการ | สาเหตุ | วิธีแก้ปัญหา | |---|---|---| | การใช้งานยังคงเป็นศูนย์สำหรับ VM ที่กำลังทำงานอยู่ | เวิร์กเกอร์หยุดทำงาน CloudStack ตัดการเชื่อมต่อ หรือปิดใช้งานสถิติของ VM อยู่ | ตรวจสอบ `sudo nexcmp status` และ **Test connection** ใน [CloudStack](https://nexcmp.com/th/docs/infrastructure/cloudstack/) และเปิดใช้งานสถิติ VM ของ CloudStack | | ข้อมูลการใช้งานมีช่องว่างขาดหาย | เกินระยะเวลาเก็บรักษาของ CloudStack หรือเวิร์กเกอร์หยุดทำงานนานกว่าประมาณ 12 ชั่วโมง | ไม่สามารถกู้คืนได้ โดยช่องว่างดังกล่าวจะถูกบันทึกไว้ | | การใช้งานสูงกว่าที่คาดไว้เล็กน้อย | มีการรวมปริมาณการใช้งานระหว่าง VM และการจราจรบนอินเทอร์เฟซอื่น ๆ เข้าไปด้วย | เป็นเรื่องปกติ โปรดอธิบายให้ลูกค้าเข้าใจ | | บริการที่ถูกระงับกลับมามีสถานะถูกระงับอีกครั้งหลังจากที่คุณปลดล็อกแล้ว | บริการนั้นยังคงเกินโควตาอยู่ | ให้ส่วนเสริมหรือเพิ่มโควตา | | ไม่มีการระงับบริการแม้ว่านโยบายจะถูกตั้งเป็น **suspend** ก็ตาม | วันที่เริ่มระงับอยู่ในอนาคต | ตั้งค่าเป็นปัจจุบัน (หน้าเว็บจะแสดง "ACTIVE" เมื่อมีผลใช้งาน) | | "bw_over_policy ต้องเป็น notify, throttle หรือ suspend" | มีการส่งนโยบายที่ไม่ถูกต้องผ่านทาง API | ให้ใช้หนึ่งในสามค่านี้ | | Proxmox VMs ไม่แสดงการใช้งาน | ไม่ได้วัดปริมาณการใช้งานของ VM เหล่านั้น | เป็นเรื่องปกติ | | ลูกค้าไม่สามารถซื้อส่วนเสริมได้ | ปิดการใช้งานแบนด์วิดท์อยู่ หรือกระเป๋าเงินว่างเปล่า | ตรวจสอบสวิตช์เปิดปิดและกระเป๋าเงิน | --- # สกุลเงินและอัตราแลกเปลี่ยน {#currency-and-exchange-rates} > **ตำแหน่งในระบบผู้ดูแล:** Finance › Payment channels › Exchange rates (`/payments/fx`) สำหรับอัตราแลกเปลี่ยน และ System › Settings › Brand (`/settings/branding`) สำหรับสวิตช์ **Site currency** ## What it does {#what-it-does} NexCMP จัดเก็บกระเป๋าเงินและใบแจ้งหนี้เป็น USD ราคาแผน VM จะถูกจัดเก็บเป็นไมโครดอลลาร์ต่อชั่วโมง สกุลเงินสำหรับแสดงผลช่วยให้ลูกค้าดูยอดเงิน USD ในสกุลเงินของตนเองตามอัตราที่เผยแพร่ไว้ โดยไม่เปลี่ยนยอดคงเหลือในกระเป๋าเงิน บริการบางรายการรองรับราคาที่ระบุเป็น VND รวมถึงส่วนเสริมแบนด์วิดท์, S3, Private Cloud และแผน Bare Metal ที่มีอยู่เดิมซึ่งยังคงใช้การกำหนดราคาเป็น VND การโอนเงินผ่านธนาคารผ่าน Sepay จะชำระเป็น VND อัตราแลกเปลี่ยนจะถูก **เผยแพร่โดยผู้ดูแลระบบ** ไม่มีกระบวนการอัปเดตอัตโนมัติ ดังนั้นอัตราที่คุณบันทึกไว้จะยังคงอยู่เช่นนั้นจนกว่าคุณจะกดปุ่มอัปเดต ## ข้อกำหนด {#requirements} | Item | Requirement | |---|---| | การเข้าถึงอินเทอร์เน็ต | เซิร์ฟเวอร์ของแผงควบคุมต้องสามารถเข้าถึง `open.er-api.com` (สำหรับ USD/VND) และ `api.frankfurter.dev` (สำหรับสกุลเงินอื่น ๆ) ได้เมื่อคุณกด **Update exchange rates** | | สิทธิ์การใช้งาน | ต้องดำเนินการโดยผู้ดูแลระบบสำหรับการเปลี่ยนแปลง; ทุกการเปลี่ยนแปลงจะต้องระบุเหตุผล | | ขึ้นอยู่กับ | ไม่มี [Plans](https://nexcmp.com/th/docs/catalog/plans/), [Bandwidth](https://nexcmp.com/th/docs/catalog/bandwidth/), [S3](https://nexcmp.com/th/docs/infrastructure/s3/) และการโอนเงินผ่านธนาคาร VND จะใช้อัตรานี้ | ## เตรียมโครงสร้างพื้นฐาน {#prepare-the-infrastructure} ไม่จำเป็น หากเซิร์ฟเวอร์ของคุณมีการกรองทราฟฟิกขาออก ให้ออนุญาตการเชื่อมต่อ HTTPS ไปยังบริการทั้งสองด้านบน ## เชื่อมต่อใน NexCMP {#connect-in-nexcmp} ### 1. เลือกสกุลเงินของเว็บไซต์ {#_1-choose-the-site-currency} เปิด **System › Settings › Brand** และกำหนดค่า **Site currency**: | ตัวเลือก | สิ่งที่ลูกค้าเห็น | |---|---| | **Language-based (auto)** (ค่าเริ่มต้นในการติดตั้งใหม่) | พอร์ทัลจะเลือกสกุลเงินที่แสดงตามภาษา (ตารางด้านล่าง) ลูกค้าสามารถเลือกเปลี่ยนเป็น USD แทนได้ | | **USD** | ราคาและยอดเงินในสกุลเงิน USD เท่านั้น ไม่มีสวิตช์เลือกสกุลเงินและไม่มีการแปลงยอดเงิน | | **VND** | การตั้งค่าเดิม โดยจะใช้กฎการแสดงผลตามภาษาเช่นเดียวกับ Auto | บันทึก หน้าเพจของลูกค้าจะอัปเดตภายในเวลาประมาณหนึ่งนาที เมื่อเว็บไซต์แสดงผลตามภาษาของลูกค้า: | ภาษา | สกุลเงินที่แสดง | |---|---| | ภาษาอังกฤษ | USD | | ภาษาเวียดนาม | VND | | ภาษาจีน (ตัวเต็ม / ตัวย่อ) | CNY / TWD | | ภาษาญี่ปุ่น, ภาษาเกาหลี | JPY, KRW | | ภาษาฝรั่งเศส, เยอรมัน, สเปน, อิตาลี | EUR | | ภาษาโปรตุเกส, รัสเซีย | BRL, RUB | | ภาษาอาหรับ, ฮินดี | SAR, INR | | ภาษาอินโดนีเซีย, ไทย | IDR, THB | สกุลเงินที่ยังไม่มีการประกาศอัตราแลกเปลี่ยนจะไม่สามารถใช้งานได้ โดยพอร์ทัลจะสำรองไปใช้ USD แทน ### 2. ประกาศอัตราแลกเปลี่ยน {#_2-publish-the-rates} 1. เปิดไปที่ **Finance › Payment channels › Exchange rates** 2. การ์ด **Currency by language** แสดงรายการสกุลเงินที่แสดงผลทั้ง 11 สกุล พร้อมอัตราแลกเปลี่ยนต่อ USD แหล่งที่มา (Frankfurter) และเวลาที่อัปเดตล่าสุด คลิก **Update exchange rates** ปุ่มนี้จะดำเนินการสองขั้นตอนในคราวเดียว: อ่านตารางตลาดสาธารณะสำหรับ **USD/VND** และอ่านอัตราแลกเปลี่ยนของอีก 11 สกุลเงิน ทั้งสองรายการจะได้รับการตรวจสอบก่อนที่จะบันทึก หากรายการใดล้มเหลว จะไม่มีการเปลี่ยนแปลงใด ๆ และยังคงใช้อัตราเดิมต่อไป 3. การ์ด **Active exchange rate** จะแสดงอัตราแลกเปลี่ยน USD/VND ที่มีผลบังคับใช้ ป้ายระบุแหล่งที่มา (ตลาดสาธารณะหรือคงที่) ส่วนต่างกำไร และตัวเลขอ้างอิงของตลาดพร้อมการประทับเวลา 4. การ์ด **Config** (บันทึกพร้อมระบุเหตุผล): | ฟิลด์ | ความหมาย | ช่วง | |---|---|---| | ส่วนต่าง (bp, 100 = 1 %) | บวกเพิ่มจากอัตราอ้างอิงของตลาด อัตราที่ใช้งานจริงคืออัตราอ้างอิงบวกมาร์จิน แล้วปัดเศษขึ้น | 0 ถึง 1000 | | Fixed rate (VND ต่อ USD, 0 = ตามตลาด) | อัตราที่คุณกำหนดเอง โดยจะใช้แทนตัวเลขจากตลาด | 0 หรือ 15,000 ถึง 50,000 | | เกณฑ์การกระโดดของอัตรา (bp) | อัตราตลาดใหม่ที่ต่างจากอัตราปัจจุบันเกินกว่าค่านี้จะถูก **ระงับไว้** จนกว่าคุณจะยืนยัน | 50 ถึง 2000 (ค่าเริ่มต้น 500) | | ขั้นตอนการปัดเศษ VND | ปัดเศษราคาในสกุลเงิน VND และยอดโอนผ่านธนาคาร | 1, 100, 1,000 (ค่าเริ่มต้น) หรือ 10,000 | 5. หากอัตราตลาดใหม่เปลี่ยนแปลงเกินกว่าเกณฑ์ที่กำหนด การ์ด **Pending exchange rate** จะปรากฏขึ้นและอัตราดังกล่าวจะ **ยังไม่ถูกนำไปใช้** ให้ตรวจสอบเทียบกับแหล่งอ้างอิงที่คุณเลือกแล้วคลิก **Apply this rate** อัตราตลาดที่อยู่นอกช่วง 15,000 ถึง 50,000 VND ต่อ USD จะถูกปฏิเสธเนื่องจากไม่สมเหตุสมผล การรีเฟรชด้วยตนเองจำกัดไว้ที่ 1 คำขอต่อ 5 นาที ดังนั้นปุ่มอาจขอให้คุณรอก่อน 6. ตาราง **Exchange rate history** จะแสดงรายการอัตราแลกเปลี่ยนที่ดึงมาหรือได้รับการยืนยันแล้วทุกรายการ พร้อมเวลา อัตราที่มีผล อัตราอ้างอิงตลาด แหล่งที่มา สถานะการนำไปใช้ ผู้ดำเนินการ และบันทึกหมายเหตุ (การเปลี่ยนแปลงที่ถูกระงับจะกำกับว่า **held**) ## วิธีการใช้อัตราแลกเปลี่ยน {#how-a-rate-is-used} | ตำแหน่ง | กฎ | |---|---| | กระเป๋าเงินและใบแจ้งหนี้ | เซนต์ USD อัตราแลกเปลี่ยนนี้จะไม่เปลี่ยนแปลงยอดเงินคงเหลือ | | แผน VM ที่ป้อนเป็น VND | แปลงค่า**เพียงครั้งเดียว**ตามอัตราที่มีผลบังคับใช้ขณะที่คุณบันทึก จากนั้นจัดเก็บเป็น USD การเปลี่ยนแปลงอัตราแลกเปลี่ยนในภายหลังจะไม่ปรับราคาแผน VM เหล่านั้นใหม่ | | โอนเงินผ่านธนาคารผ่าน Sepay | ลูกค้าชำระเงิน `ceil(USD × rate)` โดยปัดเศษขึ้นตามขั้นตอนการปัดเศษ ระบบ Sepay จะถูก **บล็อก** จนกว่าจะมีอัตรา USD/VND | | แผน Bare Metal | การติดตั้งใหม่จะใช้ USD โดยตรง แผน VND ที่มีอยู่เดิมจะยังคงรักษาสกุลเงินเดิมไว้และจำเป็นต้องใช้อัตราแลกเปลี่ยนเมื่อเรียกเก็บเงิน โปรดดู [Dedicated servers](https://nexcmp.com/th/docs/infrastructure/dedicated/) | | การชำระเงินระหว่างประเทศอื่นๆ ที่ป้อนเป็น VND | ปัดเศษให้เป็นเซนต์ที่ใกล้ที่สุด | | การแสดงผลในพอร์ทัล | USD คูณด้วยอัตราที่เผยแพร่ของสกุลเงินที่แสดง จัดรูปแบบตามภาษา | ## ตรวจสอบ {#verify} 1. **Active exchange rate** แสดงค่า USD/VND พร้อมเวลา "ดึงข้อมูลล่าสุด" 2. ตารางกริด **Currency by language** แสดงอัตราแลกเปลี่ยนที่ไม่ว่างเปล่า 3. ในพอร์ทัลลูกค้า ให้สลับภาษาเป็นภาษาเวียดนาม (site currency เป็น Auto): ราคาจะแสดงเป็นดอง สลับเป็นภาษาญี่ปุ่น: ราคาจะแสดงเป็นเยน หาก site currency เป็น USD จะแสดงเฉพาะดอลลาร์เท่านั้น 4. บนฟอร์มแพ็กเกจ (Plans & pricing) รายการ **Enter price by** จะมีตัวเลือก **VND / month** ## ข้อจำกัดและหมายเหตุ {#limits-and-notes} - ไม่มีการรีเฟรชอัตโนมัติ กด **Update exchange rates** เมื่อคุณต้องการอัตราใหม่ และตั้งค่าการเตือนหากอัตราแลกเปลี่ยนมีความสำคัญต่อคุณ - อัตราตลาดสาธารณะจะถูกนำมาใช้สำหรับ USD/VND ซึ่งเป็นอัตราอ้างอิงมากกว่าราคาเสนอซื้อหรือขายของธนาคาร ส่วนสกุลเงินที่แสดงอื่นๆ ดึงมาจาก Frankfurter หากวันที่เก่ากว่า 14 วันหรือตารางไม่สมบูรณ์จะถูกปฏิเสธ - Margin และอัตราคงที่ส่งผลเฉพาะ USD/VND เท่านั้นสกุลเงินที่แสดงทั้ง 11 สกุลไม่มีการบวก margin - แต่ละภาษาของลูกค้าจะมีหนึ่งสกุลเงิน การเปลี่ยนภาษาจะเป็นการรีเซ็ตกลับไปเป็นสกุลเงินของภาษานั้น เว้นแต่ลูกค้าจะเลือก USD สำหรับภาษานี้ - เว็บไซต์ตัวแทนจำหน่ายใช้อัตราเดียวกัน ## การแก้ Problme {#troubleshooting} | อาการ | สาเหตุ | วิธีแก้ปัญหา | |---|---|---| | "อัตราแลกเปลี่ยนใหม่เบี่ยงเบนเกินกว่าเกณฑ์ - อยู่ระหว่างระงับ, ต้องมีการยืนยันด้วยตนเอง" | การกระโดดของค่าเงินมากกว่าเกณฑ์ที่กำหนด | ตรวจสอบแล้วคลิก **Apply this rate** หรือเปลี่ยนค่าเกณฑ์ | | "เซิร์ฟเวอร์ปฏิเสธอัตราแลกเปลี่ยนใหม่" | ตัวเลขตลาดอยู่นอกช่วง 15,000 ถึง 50,000 หรือมีรูปแบบไม่ถูกต้อง | รอแล้วลองอีกครั้ง หรือตั้งค่าอัตราคงที่ | | การรีเฟรชขอให้คุณรอก่อนลองใหม่อีกครั้ง | Too frequent updates | Wait and retry. | | "ไม่สามารถดึงอัตราแลกเปลี่ยนได้: …" | เซิร์ฟเวอร์ของระบบไม่สามารถเชื่อมต่อกับบริการอัตราแลกเปลี่ยนได้ | อนุญาตการเชื่อมต่อ HTTPS ขาออกแล้วลองใหม่อีกครั้ง | | **Sepay blocked** tag | ยังไม่มีการประกาศอัตรา USD/VND | กด **Update exchange rates** หรือตั้งค่าอัตราคงที่ | | สกุลเงินหายไปในพอร์ทัล | อัตราของสกุลเงินนั้นหายไป | กด **Update exchange rates** | | ลูกค้าเห็นราคาเป็น USD เท่านั้น | สกุลเงินของเว็บไซต์คือ USD หรือยังไม่มีอัตราแลกเปลี่ยน | ตั้งค่า **Site currency** เป็น Auto และเผยแพร่อัตราแลกเปลี่ยน | | "ตารางอัตรา Fx ไม่สมบูรณ์; ยังคงใช้อัตราเดิม" | Frankfurter ส่งคืนสกุลเงินน้อยกว่า 11 สกุล | ลองใหม่อีกครั้งภายหลัง ไม่มีอะไรเปลี่ยนแปลง | | ตัวเลือก VND หายไปในแบบฟอร์มแพ็กเกจ | No USD/VND rate | เผยแพร่อัตราแลกเปลี่ยนก่อน | --- # ช่องทางการชำระเงิน {#payment-channels} > **ตำแหน่งในหน้าผู้ดูแลระบบ:** Finance › Payment channels (`/payments`) สวิตช์และค่าธรรมเนียม: Finance › Payment channels › Fees & limits (`/payments/fees`) NexCMP ใช้ระบบ **วอลเล็ต USD แบบเติมเงินล่วงหน้า** ลูกค้าเติมเงินเข้าวอลเล็ตผ่านช่องทางการชำระเงิน จากนั้นบริการทั้งหมดจะถูกหักเงินจากวอลเล็ต ช่องทางจะแสดงต่อเมื่อถูก **เปิดใช้งาน (enabled)** และ **กำหนดค่าแล้ว (configured)** เท่านั้น ## What it does {#what-it-does} ช่องทางชำระเงินจะเชื่อมต่อบัญชีรับชำระเงินของคุณ (Stripe, PayPal, Binance, ธนาคารในเวียดนาม) เข้ากับกระเป๋าเงินของลูกค้า การชำระเงินที่ยืนยันแล้วจะกลายเป็นเครดิตในกระเป๋าเงินพอดี โดยเครดิตแต่ละรายการจะใช้รหัสการชำระเงินของเกตเวย์เป็นคีย์หลัก ดังนั้นเว็บฮุกที่ส่งซ้ำจึงไม่มีทางเพิ่มเงินซ้ำสองครั้ง ใช้หน้านี้เพื่อดูว่าช่องทางใดพร้อมใช้งาน มีประสิทธิภาพเป็นอย่างไรในช่วง 30 วันที่ผ่านมา และช่องทางใดที่ต้องได้รับการตรวจสอบ ## ข้อกำหนด {#requirements} | Item | Requirement | |---|---| | Public HTTPS address | เกตเวย์จะส่งเว็บฮุกมาที่ `https:///v1/billing/...` ดังนั้นแผงควบคุมของคุณจึงต้องสามารถเข้าถึงได้จากอินเทอร์เน็ตผ่าน TLS ที่ถูกต้อง (ดูที่ [DNS and Cloudflare](https://nexcmp.com/th/docs/getting-started/dns-and-cloudflare/)) | | Accounts | บัญชีของคุณเองกับผู้ให้บริการแต่ละรายที่คุณต้องการใช้งาน ข้อมูลรับรองจะถูกป้อนในหน้าผู้ดูแลระบบและจะไม่แสดงขึ้นมาอีก (แสดงเพียง 4 ตัวอักษรสุดท้ายเท่านั้น) | | Admin role | An administrator account. | | Dependencies | ไม่มี ช่องทางธนาคารเวียดนามจำเป็นต้องมี [exchange rate](https://nexcmp.com/th/docs/catalog/currency-and-exchange-rates/) เพิ่มเติม | ## ช่องทางต่างๆ {#the-channels} | ช่องทาง | สิ่งที่ลูกค้าเห็น | ตั้งค่าใน | บทความ | |---|---|---|---| | บัตร (Stripe) | ฟอร์มบัตร, บัตรที่บันทึกไว้ | Payment channels › Stripe | [Stripe](https://nexcmp.com/th/docs/billing/stripe/) | | Apple Pay, Google Pay, Link | ปุ่มกระเป๋าเงิน (Stripe Express Checkout) | Stripe พร้อมกับการจดทะเบียนโดเมน | [Stripe](https://nexcmp.com/th/docs/billing/stripe/#apple-pay-google-pay-and-link) | | Alipay | เปลี่ยนเส้นทางไปยัง Alipay (เรียกเก็บเงินเป็น JPY โดย Stripe) | Stripe พร้อมกับ Fees & limits | [Stripe](https://nexcmp.com/th/docs/billing/stripe/#alipay) | | PayPal | ปุ่ม PayPal, บัญชี PayPal ที่บันทึกไว้ | Payment channels › PayPal | [PayPal](https://nexcmp.com/th/docs/billing/paypal/) | | USDT | ที่อยู่สำหรับฝากเงินและจำนวนเงินที่แน่นอน | Payment channels › USDT | [USDT](https://nexcmp.com/th/docs/billing/usdt/) | | การโอนเงินผ่านธนาคารเวียดนาม | คิวอาร์โค้ดและรายละเอียดการโอนเงิน (อินเทอร์เฟซภาษาเวียดนามเท่านั้น) | Payment channels › VN bank transfer | [Bank transfer (Vietnam)](https://nexcmp.com/th/docs/billing/bank-transfer-vn/) | ## เตรียมโครงสร้างพื้นฐาน {#prepare-the-infrastructure} ไม่ต้องใช้ ทุกอย่างถูกกำหนดค่าไว้ในส่วนผู้ดูแลระบบแล้ว และไม่มีอะไรต้องติดตั้งบนเซิร์ฟเวอร์ ## เชื่อมต่อใน NexCMP {#connect-in-nexcmp} 1. เปิด **Finance › Payment channels** (`/payments`) ตารางภาพรวมจะแสดงรายการช่องทางทั้งหมดพร้อมสถานะ 2. เปิดแท็บเฉพาะของช่องทาง (**Stripe**, **PayPal**, **USDT**, **VN bank transfer**) แล้วทำตามบทความของแต่ละช่องทาง แต่ละแท็บจะลงท้ายด้วยปุ่ม **Save** และปุ่ม **Test** หากมีให้บริการ 3. เปิด **Fees & limits** (`/payments/fees`) ค้นหาการ์ด **Payment gateways & fees (wallet top-up)** เปิดสวิตช์ใช้งานช่องทางแล้วคลิก **Save channels & fees** ![ภาพรวมช่องทางชำระเงินที่แสดงเกตเวย์พร้อมสถานะเปิดใช้งาน การกำหนดค่า และสถิติ 30 วัน](https://nexcmp.com/th/docs/images/billing/payment-channels-01-overview.webp) ![หน้าค่าธรรมเนียมและขีดจำกัดพร้อมสวิตช์ช่องทางและช่องกรอกค่าธรรมเนียม](https://nexcmp.com/th/docs/images/billing/payment-channels-02-fees.webp) ### สวิตช์และค่าธรรมเนียม (Fees & limits) {#switches-and-fees-fees-limits} | การตั้งค่า | ค่าเริ่มต้น | ความหมาย | |---|---|---| | บัตร (Stripe) | เปิด | ฟอร์มบัตรบนหน้าจอฝากเงิน จะซ่อนอยู่จนกว่า Stripe จะมีคีย์ลับ | | Apple Pay, Google Pay, Link | เปิด | ปุ่มกระเป๋าเงิน จะปรากฏขึ้นเมื่อโดเมนได้รับการยืนยันกับ Stripe แล้วเท่านั้น | | Alipay | ปิด | ต้องเปิดใช้งาน Alipay ใน Stripe Dashboard ก่อน | | PayPal | ปิด | แสดงขึ้นเมื่อมีการกำหนดค่า PayPal แล้วเท่านั้น | | USDT (Binance) | ปิด | สวิตช์จะถูกล็อกจนกว่าที่อยู่ฝากเงินจะได้รับการยืนยันกับ Binance แล้ว | | ค่าธรรมเนียม Stripe % / จำนวนเงินคงที่ (เซนต์) | 3.6 % และ 0 | ใช้เพื่อแสดงค่าธรรมเนียมแก่ลูกค้าและคำนวณยอดเงินที่เติมเข้าบัญชี ตั้งค่าให้ตรงกับเรตราคาจริงของ Stripe | | ค่าธรรมเนียม PayPal % / จำนวนเงินคงที่ | 4.4 % และ 30 เซนต์ | เช่นเดียวกัน สำหรับ PayPal | | ค่าธรรมเนียม USDT % | 1 % | เช่นเดียวกัน สำหรับ USDT | | ลูกค้ารับผิดชอบค่าธรรมเนียมการเติมเงิน | ปิด | **On**: ลูกค้าจ่ายยอดเงิน + ค่าธรรมเนียม และกระเป๋าเงินได้รับเต็มจำนวน **Off**: หักค่าธรรมเนียมออกและกระเป๋าเงินได้รับยอดเงินลบด้วยค่าธรรมเนียม | ลูกค้าจะเห็นค่าธรรมเนียมและเครดิตในกระเป๋าเงินสุทธิก่อนชำระเงินเสมอ การปิดช่องทางการชำระเงินจะซ่อนปุ่มและเซิร์ฟเวอร์ปฏิเสธการชำระเงินใหม่ด้วย `method_disabled` (HTTP 403) ::: tip ขีดจำกัดการเติมเงิน จำนวนเงินขั้นต่ำและสูงสุดต่อการเติมเงินอยู่บนหน้าเดียวกัน — ดูที่ [Minimum top-up](https://nexcmp.com/th/docs/billing/minimum-top-up/) ::: ## ตรวจสอบ {#verify} 1. ในตารางภาพรวม ช่องทางจะแสดง **Enabled** และ **Configured** คอลัมน์ **Last test** จะถูกเติมข้อมูลหลังจากที่คุณคลิก **Test** บนแท็บของช่องทางนั้น 2. เข้าสู่ระบบพอร์ทัลในฐานะลูกค้าทดสอบแล้วเปิด **Billing › Deposit** ปุ่มช่องทางชำระเงินจะปรากฏขึ้น 3. ทำการชำระเงินจำนวนเล็กน้อย (ดูบทความของช่องทางสำหรับบัตรทดสอบหรือบัญชีแซนด์บ็อกซ์) ยอดคงเหลือจะเพิ่มขึ้น การแจ้งเตือน **Top-up received** จะปรากฏขึ้น และการชำระเงินจะแสดงอยู่ใน **Finance › Billing › Top-ups** (`/billing/deposits`) ## ขีดจำกัดและหมายเหตุ {#limits-notes} - **คอลัมน์ภาพรวม:** *30 days* (จำนวนการชำระเงิน, ความสำเร็จ, ความล้มเหลวและปริมาณ), *Stuck 24h* (การชำระเงินที่ยังรอดำเนินการหลังจากผ่านไปหนึ่งวัน) และ *Unmatched* (USDT หรือการโอนเงินผ่านธนาคารที่เข้ามาแต่ไม่ตรงกับคำสั่งซื้อใดๆ) แถว KPI จะเพิ่มปริมาณใน 30 วัน, จำนวนช่องทางที่ผิดพลาด (เปิดใช้งานแต่ไม่ได้กำหนดค่า หรือการชำระเงินที่ค้างอยู่) และยอดรวมที่ไม่ตรงกัน - **Webhook events** แสดงอยู่ภายใต้ **Payment channels › Gateway events** (`/payments/events`) Stripe มีแท็บของตัวเอง ส่วน PayPal และ USDT ใช้ร่วมกัน เหตุการณ์ที่ล้มเหลวสามารถเล่นซ้ำได้ — บัญชีแยกประเภทกระเป๋าเงินมีความเป็นอิดัมโพเทนต์ (idempotent) ดังนั้นการเล่นซ้ำจะไม่ให้เครดิตซ้ำ - **Resellers** สามารถมีช่องทาง Stripe, PayPal, USDT และธนาคารของตนเองได้ แถวของพวกเขาจะปรากฏที่นี่ด้วย และตัวเลือกไซต์ในส่วนหัวจะกรองข้อมูลเหล่านั้น ดู [Resellers](https://nexcmp.com/th/docs/customers/resellers/) - **การคืนเงิน:** การชำระเงินผ่าน Stripe และ PayPal สามารถคืนเงินได้จากรายการชำระเงิน ส่วนการชำระเงินผ่าน USDT ไม่สามารถคืนเงินไปยังแหล่งที่มาได้ (เซิร์ฟเวอร์ตอบกลับ `usdt_no_refund`) - **โหมดบำรุงรักษา** ยังคงรับ webhook ของเกตเวย์ ดังนั้นการชำระเงินที่ทำขึ้นก่อนการบำรุงรักษาจะไม่สูญหาย ## การแก้ Problme {#troubleshooting} | อาการ | สาเหตุ | วิธีแก้ปัญหา | |---|---|---| | ไม่พบช่องทางบนหน้าฝากเงินของลูกค้า | ปิดสวิตช์, ยังไม่ได้กำหนดค่า, หรือ (ธนาคารเวียดนาม) อินเทอร์เฟซไม่ใช่ภาษาเวียดนาม | ตรวจสอบ **Fees & limits** และแท็บช่องทาง; ดู [Bank transfer (Vietnam)](https://nexcmp.com/th/docs/billing/bank-transfer-vn/) | | KPI **Faulty channels** อยู่เหนือ 0 | ช่องทางถูกเปิดใช้งานโดยไม่มีข้อมูลประจำตัว หรือการชำระเงินรอดำเนินการนานกว่า 24 ชั่วโมง | เปิดแถวและคลิก **Configure**; สำหรับการชำระเงินที่ค้างอยู่ ให้เปิด **Gateway events** แล้วเล่นซ้ำ | | ลูกค้าชำระเงินแล้วแต่ยอดเงินไม่เปลี่ยนแปลง | Webhook ไม่มาถึง | ตรวจสอบ URL ของ webhook บนแท็บช่องทาง จากนั้นเล่นซ้ำเหตุการณ์ใน **Gateway events** | | เซิร์ฟเวอร์ตอบกลับ `method_disabled` | สวิตช์ปิดอยู่ | เปิดใช้งานใน **Fees & limits** และบันทึก | | สวิตช์ USDT เป็นสีเทา | ที่อยู่สำหรับฝากเงินยังไม่ได้รับการยืนยัน | คลิก **Test & verify address** บนแท็บ USDT | --- # Stripe > **ตำแหน่งในระบบผู้ดูแล:** Finance › Payment channels › Stripe (`/payments/stripe`) สวิตช์และค่าธรรมเนียม: Finance › Payment channels › Fees & limits (`/payments/fees`) ## What it does {#what-it-does} Stripe รองรับการชำระเงินผ่านบัตรสำหรับการเติมเงินในวอลเล็ต ด้วยบัญชีเดียวกันคุณยังสามารถเปิดใช้งาน **Apple Pay**, **Google Pay**, **Link** และ **Alipay** รวมถึงให้ลูกค้า **บันทึกบัตร** สำหรับการ [เติมเงินอัตโนมัติ](https://nexcmp.com/th/docs/billing/auto-top-up/) ได้ ใช้เป็นช่องทางหลักสำหรับลูกค้าระหว่างประเทศ ## ข้อกำหนด {#requirements} | Item | Requirement | |---|---| | บัญชี Stripe | บัญชี Stripe ที่สามารถรับชำระเงินเป็น **USD** ได้ Alipay จะถูกเรียกเก็บเงินเป็น JPY และต้องเปิดใช้งานโดย Stripe สำหรับบัญชีของคุณ | | คีย์ | ซีเคร็ตคีย์ (`sk_live_...` หรือ `sk_test_...`) และพับลิชเบิลคีย์ (`pk_live_...` หรือ `pk_test_...`) ฟอร์มจะยอมรับเฉพาะคีย์ที่มีคำนำหน้าเหล่านี้เท่านั้น | | Network | แผงควบคุมของคุณต้องสามารถเข้าถึงได้ผ่าน HTTPS จากอินเทอร์เน็ต (Stripe จะเรียกเว็บฮุก) และต้องสามารถเข้าถึง `api.stripe.com` ที่พอร์ต 443 ได้ | | โดเมน (สำหรับวอลเล็ตเท่านั้น) | โดเมนฝั่งลูกค้าต้องให้บริการ `/.well-known/apple-developer-merchantid-domain-association` ซึ่ง NexCMP จะจัดการส่วนนี้ให้คุณ | | Dependencies | ไม่มี | ::: info บัญชี Stripe ที่ใช้ร่วมกัน NexCMP จะประมวลผลเหตุการณ์เว็บฮุกเฉพาะสำหรับการชำระเงินที่สร้างขึ้นเองเท่านั้น คุณจึงสามารถใช้บัญชี Stripe ที่ใช้งานร่วมกับแอปพลิเคชันอื่นได้ ::: ## เตรียมโครงสร้างพื้นฐาน {#prepare-the-infrastructure} ฝั่ง Stripe: 1. ลงชื่อเข้าใช้ [Stripe Dashboard](https://dashboard.stripe.com) สลับ **Test mode** เปิดหรือปิดเพื่อเลือกว่าคุณกำลังทดลองใช้งานหรือใช้งานจริง คีย์ของโหมดหนึ่งจะไม่สามารถใช้ร่วมกับอีกโหมดหนึ่งได้ 2. เปิดไปที่ **Developers › API keys** คัดลอก **Publishable key** รวมถึงแสดงและคัดลอก **Secret key** เก็บซีเคร็ตคีย์ไว้เป็นความลับ 3. (ไม่บังคับ) เปิดไปที่ **Settings › Payment methods** และเปิดใช้งาน **Alipay** หากคุณต้องการให้บริการ 4. คุณ **ไม่จำเป็น** ต้องสร้างเว็บฮุกด้วยตนเอง เนื่องจาก NexCMP สามารถสร้างให้คุณได้ (ดูขั้นตอนที่ 5 ด้านล่าง) หากคุณต้องการทำด้วยตนเอง ให้สร้างเอนด์พอยต์ใน **Developers › Webhooks** ด้วย URL และเหตุการณ์ที่ระบุไว้ใน [Webhook](#webhook) ## เชื่อมต่อใน NexCMP {#connect-in-nexcmp} 1. เปิดไปที่ **Finance › Payment channels › Stripe** (`/payments/stripe`) 2. ในการ์ด **API keys** ให้เลือก **Mode** (`live` หรือ `test`) วาง **Secret key** และ **Publishable key** 3. คลิก **Save** คีย์จะถูกเขียนลงในไฟล์กำหนดค่าบนเซิร์ฟเวอร์ซึ่งบัญชีบริการของ NexCMP เท่านั้นที่สามารถอ่านได้ โดยจะไม่ถูกส่งกลับไปยังเบราว์เซอร์อีก หลังจากนั้นหน้าเว็บจะแสดงเพียง 4 ตัวอักษรสุดท้ายเท่านั้น 4. คลิก **Check** กล่องข้อความจะรายงานสถานะการเชื่อมต่อ โหมด ยอดเงินคงเหลือและยอดเงินรอดำเนินการ รหัสบัญชี สถานะการเปิดใช้งานการชำระเงิน การมีอยู่ของเว็บฮุก และความพร้อมใช้งานของ Alipay เส้นสีแดงหมายถึงส่วนนั้นต้องได้รับการตรวจสอบ 5. ในการ์ด **Webhook** คลิก **Create webhook** และยืนยัน NexCMP จะขอให้ Stripe สร้างเอนด์พอยต์พร้อมทุกเหตุการณ์ที่จำเป็นและเติมข้อมูลใน **Webhook signing secret** (`whsec_...`) โดยอัตโนมัติ URL ที่กรอกไว้ล่วงหน้าในฟิลด์คือ `https:///v1/billing/stripe/webhook` เช่น `https://cloud.example.com/v1/billing/stripe/webhook` 6. เปิดไปที่ **Fees & limits** (`/payments/fees`) เปิดใช้งาน **Card (Stripe)** กำหนดค่า **Stripe fee %** และ **Stripe fixed fee (cents)** ตามอัตราค่าธรรมเนียมจริงของคุณ แล้วคลิก **Save channels & fees** ดูเพิ่มเติมที่ [Payment channels](https://nexcmp.com/th/docs/billing/payment-channels/#switches-and-fees-fees-limits) ![หน้า Stripe ที่กรอกโหมด ซีเคร็ตคีย์ และพับลิชเบิลคีย์ด้วยค่าตัวอย่าง](https://nexcmp.com/th/docs/images/billing/stripe-01-keys.webp) ### Webhook {#webhook} แถบแบนเนอร์สีแดง "Missing webhook_secret" จะยังคงแสดงอยู่จนกว่าจะบันทึก signing secret หากไม่มีค่านี้ การเติมเงินผ่าน Stripe จะ**ไม่ถูกบันทึก** แม้ว่า Stripe จะตัดเงินไปแล้วก็ตาม | Item | ค่า | |---|---| | URL | `https:///v1/billing/stripe/webhook` | | Events | `checkout.session.completed`, `payment_intent.succeeded`, `payment_intent.payment_failed`, `charge.refunded`, `charge.dispute.created`, `charge.dispute.closed`, `radar.early_fraud_warning.created`, `refund.updated`, `refund.failed` | | Signature | ส่วนหัว Stripe `Stripe-Signature`, HMAC-SHA256, ค่าความคลาดเคลื่อน 300 วินาที คำขอที่มีลายเซ็นไม่ถูกต้องจะได้รับ HTTP 400 | | Idempotency | แต่ละ event ID จะถูกจัดเก็บเพียงครั้งเดียว การส่งข้อมูลซ้ำจะไม่เพิ่มเครดิตเป็นสองเท่า | หากคุณอัปเกรดจากเวอร์ชันที่มีการลงทะเบียนอีเวนต์น้อยกว่า ให้คลิก **Create webhook** อีกครั้ง — ระบบจะยังคงเก็บเอนด์พอยต์เดิมไว้ ดังนั้นให้ลบออกด้วยตนเองใน Stripe Dashboard ในภายหลัง แถว **24h events** และ **Latest event** ในการ์ด Webhook จะบอกว่า Stripe สามารถติดต่อแผงควบคุมได้หรือไม่ อีเวนต์แต่ละรายการจะแสดงอยู่ใน **Payment channels › Gateway events** (`/payments/events` แท็บ Stripe) ซึ่งแต่ละอีเวนต์สามารถดูข้อมูลได้ (**Payload**) หรือส่งซ้ำได้ (**Replay**) ### Apple Pay, Google Pay และ Link {#apple-pay-google-pay-and-link} 1. ในการ์ด **Wallets (Apple Pay · Google Pay · Link) & Alipay** ช่อง **Customer app Domain registered with Stripe** จะถูกกรอกล่วงหน้าด้วยชื่อโฮสต์ของไซต์คุณ (เช่น `cloud.example.com`) 2. คลิก **Register / verify domain** แล้วยืนยัน NexCMP จะลงทะเบียนโดเมนในโดเมนวิธีการชำระเงินของ Stripe และขอให้ Stripe ตรวจสอบความถูกต้อง 3. ผลลัพธ์จะแสดงสถานะของ **Apple Pay**, **Google Pay** และ **Link** โดย Apple Pay จะแสดงขึ้นก็ต่อเมื่อสถานะเป็น `active` เท่านั้น 4. ใน **Fees & limits** ให้เปิด **Apple Pay · Google Pay · Link** ไว้ ![การ์ด Wallet แสดงโดเมนที่ลงทะเบียนและสถานะของ Apple Pay, Google Pay และ Link](https://nexcmp.com/th/docs/images/billing/stripe-03-wallets.webp) ::: tip Apple Pay ยังคงไม่ทำงาน Apple Pay ต้องใช้ไฟล์เชื่อมโยงโดเมนเพื่อตอบกลับ HTTP 200 บนโดเมนสาธารณะของคุณ หากคุณวาง Cloudflare หรือพร็อกซีอื่นไว้ด้านหน้า อย่าบล็อก `/.well-known/` ::: ### Alipay {#alipay} Alipay เป็นตัวเลือกเสริม เปิดใช้งานใน **Stripe Dashboard › Settings › Payment methods** คลิก **Check** แล้วรอจนกว่ากล่องข้อความจะแสดงว่า Alipay พร้อมใช้งาน จากนั้นเปิด **Alipay (Stripe, JPY display)** ใน **Fees & limits** ตั้งค่า **Alipay fee %**, **Alipay fixed fee**, **¥/USD rate** (50–500) และ **FX spread %** (0–20) อัปเดตอัตรา ¥/USD อย่างสม่ำเสมอ โดยหน้านี้จะแจ้งเตือนเมื่อข้อมูลมีอายุเกิน 7 วัน ## ตรวจสอบ {#verify} 1. ในโหมดทดสอบ ให้ลงชื่อเข้าใช้พอร์ทัลในฐานะลูกค้าทดสอบ เปิด **Billing** คลิก **Deposit** เลือก **Card** และชำระเงินตามจำนวนขั้นต่ำด้วยบัตรทดสอบของ Stripe `4242 4242 4242 4242` (วันที่ใดก็ได้ในอนาคต CVC ใดก็ได้) 2. ยอดคงเหลือจะเพิ่มขึ้นภายในไม่กี่วินาที และรายการชำระเงินจะปรากฏใต้ **Finance › Billing › Top-ups** พร้อมสถานะ *Completed* 3. เปิด **Payment channels › Gateway events › Stripe**: คุณควรเห็น `checkout.session.completed` หรือ `payment_intent.succeeded` พร้อมเวลาที่ประมวลผล 4. เมื่อกลับไปที่หน้า Stripe ค่า **24h events** จะมากกว่า 0 ก่อนเริ่มใช้งานจริง ให้เปลี่ยน **Mode** เป็น `live` วางคีย์สำหรับใช้งานจริง และคลิก **Create webhook** อีกครั้ง (เว็บฮุกของโหมดทดสอบและโหมดใช้งานจริงจะแยกจากกัน) ## ขีดจำกัดและหมายเหตุ {#limits-notes} - **จำนวนเงินและสกุลเงิน** กระเป๋าเงินอยู่ในสกุล USD การชำระเงินผ่านบัตร วอลเล็ต และลิงก์จะถูกเรียกเก็บเป็น USD ส่วน Alipay จะแสดงให้ลูกค้าเห็นในสกุล JPY และแปลงตามอัตราแลกเปลี่ยนของคุณ - **ค่าธรรมเนียม** ระบบจะไม่อ่านค่าธรรมเนียมจริงของ Stripe กลับมาโดยอัตโนมัติ เปอร์เซ็นต์ค่าธรรมเนียมที่คุณตั้งไว้จะเป็นตัวกำหนดสิ่งที่ลูกค้าเห็นและยอดเงินที่เข้ากระเป๋าเงิน เลือก **Customer pays top-up fee** ใน *Fees & limits* เพื่อเรียกเก็บค่าธรรมเนียมเพิ่มเติมจากยอดเงิน - **บัตรที่บันทึกไว้** เมื่อลูกค้าทำเครื่องหมายที่ *Save card for auto top-up* บัตรจะถูกจัดเก็บไว้ที่ Stripe ไม่ใช่บนเซิร์ฟเวอร์ของคุณ ดูที่ [Saved payment methods](https://nexcmp.com/th/docs/billing/saved-payment-methods/) - **การคืนเงิน** การคืนเงินเข้าบัตรเป็นกระบวนการแบบ 2 ขั้นตอน: ผู้ดูแลระบบจะสร้างคำขอคืนเงินสำหรับการชำระเงินที่เสร็จสมบูรณ์ (**Finance › Billing › Top-ups** การดำเนินการคืนเงินในรายการชำระเงิน) จากนั้นจึงอนุมัติที่ **Finance › Payouts › Card refunds** (`/billing/payouts`) การคืนเงินของ Alipay จะเป็นแบบอะซิงโครนัส หากรายการล้มเหลว (`refund.failed`) ระบบจะคืนเงินจำนวนที่ระงับไว้กลับเข้ากระเป๋าเงิน - **ข้อพิพาท (Disputes):** เมื่อ `charge.dispute.created` NexCMP จะบล็อกบัญชีของลูกค้า ระงับบริการแบบชำระเงินล่วงหน้า (ไม่มีการลบข้อมูลใดๆ) และส่งการแจ้งเตือนไปยังผู้ดูแลระบบ หากคุณชนะ (`charge.dispute.closed`) จำนวนเงินจะถูกคืนเข้ากระเปเงิน - **การรอการชำระเงิน:** หากเว็บฮุกไม่มาถึง NexCMP จะตรวจสอบการชำระเงินที่ค้างอยู่เกิน 10 นาทีกับ Stripe ด้วยตนเองและทำรายการให้เสร็จสมบูรณ์ การชำระเงินที่เก่ากว่า 7 วันจะถูกละเว้น - **Resellers** สามารถเชื่อมต่อบัญชี Stripe ของตนเองได้ (webhook `https:///v1/billing/stripe/webhook/r/`) ดูที่ [Resellers](https://nexcmp.com/th/docs/customers/resellers/) ## การแก้ Problme {#troubleshooting} | อาการ | สาเหตุ | วิธีแก้ปัญหา | |---|---|---| | "Secret key ต้องขึ้นต้นด้วย sk_live_ หรือ sk_test_" | วางรหัสลับผิด | วางรหัสลับจาก **Developers › API keys** | | "Secret key ไม่ตรงกับโหมด live/test" | โหมดและรหัสไม่ตรงกัน | ทำให้ **Mode** ตรงกับคำนำหน้าของรหัส | | "Publishable key ต้องขึ้นต้นด้วย pk_" | Wrong key | ใช้คีย์ที่เผยแพร่ได้ (Publishable key) | | การตรวจสอบระบุว่าการเชื่อมต่อล้มเหลว | คีย์ไม่ถูกต้อง ถูกเพิกถอน หรือเซิร์ฟเวอร์ไม่สามารถเข้าถึง `api.stripe.com` ได้ | วางคีย์ใหม่อีกครั้ง ทดสอบด้วย `curl -I https://api.stripe.com` จากเซิร์ฟเวอร์ | | แบนเนอร์สีแดง "Missing webhook_secret" | ไม่ได้บันทึกรหัสลับสำหรับการลงชื่อ (Signing secret) | คลิก **Create webhook** หรือวางความลับ `whsec_...` จากแดชบอร์ด Stripe และ **Save** | | หักเงินแล้วแต่ยอดเงินในบัญชีไม่เปลี่ยนแปลง | เว็บฮุกไม่ถูกส่งหรือลายเซ็นล้มเหลว | ตรวจสอบว่า URL ลงท้ายด้วย `/v1/billing/stripe/webhook`, รหัสลับตรงกับปลายทาง และเล่นเหตุการณ์ซ้ำใน **Gateway events** ใน Stripe ให้เปิดปลายทางและดูความพยายามในการส่ง (HTTP 400 หมายถึงรหัสลับการลงชื่อไม่ถูกต้อง) | | "Create webhook" fails | URL ไม่ใช่ HTTPS หรือไม่สามารถเข้าถึงได้ | ใช้โดเมนสาธารณะ `https://` ของคุณ | | สถานะ Apple Pay ไม่ใช้งาน | Domain not validated | คลิก **Register / verify domain** อีกครั้งหลังจากไฟล์เชื่อมโยงโดเมนตอบกลับสถานะ 200 | | Alipay ไม่พร้อมใช้งานในกล่องโต้ตอบ Check | Not activated at Stripe | เปิดใช้งานในแดชบอร์ด Stripe จากนั้นคลิก **Check** | | ลูกค้าไม่เห็นฟอร์มบัตร | **Card (Stripe)** ปิดอยู่หรือไม่มีคีย์ลับ | เปิดใช้งานใน **Fees & limits** และบันทึกคีย์ | --- # PayPal > **ตำแหน่งในส่วนผู้ดูแล:** Finance › Payment channels › PayPal (`/payments/paypal`) สวิตช์เปิด/ปิดและค่าธรรมเนียมอยู่ที่ Finance › Payment channels › Fees & limits (`/payments/fees`) ## What it does {#what-it-does} ช่วยให้ลูกค้าสามารถเติมเงินในกระเปเงิน USD ด้วยยอดคงเหลือใน PayPal, บัญชีธนาคาร หรือบัตรที่ผูกไว้กับ PayPal ได้ ลูกค้ายังสามารถให้ NexCMP จดจำบัญชี PayPal สำหรับการ [เติมเงินอัตโนมัติ](https://nexcmp.com/th/docs/billing/auto-top-up/) ใช้ควบคู่ไปกับ [Stripe](https://nexcmp.com/th/docs/billing/stripe/) สำหรับลูกค้าที่ชื่นชอบ PayPal ## ข้อกำหนด {#requirements} | Item | Requirement | |---|---| | PayPal account | บัญชี PayPal แบบ **Business** ที่สามารถรับเงินสกุล USD ได้ | | REST app | แอป REST หนึ่งแอปในแดชบอร์ดนักพัฒนา PayPal (**Apps & Credentials**) ซึ่งให้ **Client ID** และ **Client secret** ใช้แท็บ **Sandbox** สำหรับการทดสอบ และ **Live** สำหรับการใช้งานจริง | | Network | HTTPS สามารถเข้าถึงได้จากอินเทอร์เน็ต (PayPal เรียกเว็บฮุก) และการเข้าถึงขาออกไปยัง `api-m.paypal.com` (ใช้งานจริง) หรือ `api-m.sandbox.paypal.com` (แซนด์บ็อกซ์) พอร์ต 443 | | สิทธิ์การใช้งาน | แอป REST ต้องการความสามารถในการคืนเงิน (Refund) และเว็บฮุก กล่องโต้ตอบ **Check** จะแสดงว่ามีขอบเขต (Scopes) ทั้งสองครบถ้วนหรือไม่ | | Dependencies | ไม่มี | ## เตรียมโครงสร้างพื้นฐาน {#prepare-the-infrastructure} 1. ลงชื่อเข้าใช้ [developer.paypal.com](https://developer.paypal.com) ด้วยบัญชีธุรกิจของคุณและเปิด **Apps & Credentials** 2. เลือก **Sandbox** (ทดสอบ) หรือ **Live** แล้วคลิก **Create App** ตั้งชื่อ เช่น "NexCMP" 3. คัดลอก **Client ID** และ **Secret** ของแอป 4. สำหรับการทดสอบ ให้ใช้ **Testing Tools › Sandbox Accounts** เพื่อค้นหาหรือสร้างบัญชีแซนด์บ็อกซ์ประเภท *Personal* (ผู้ซื้อ) 5. คุณไม่จำเป็นต้องสร้างเว็บฮุกด้วยตัวเอง; NexCMP จะสร้างให้ด้วยปุ่ม **Create webhook** ## เชื่อมต่อใน NexCMP {#connect-in-nexcmp} 1. เปิด **Finance › Payment channels › PayPal** (`/payments/paypal`) 2. ใน **API keys** ให้เลือก **Mode**: `live` (เงินจริง, `api-m.paypal.com`) หรือ `sandbox` (`api-m.sandbox.paypal.com`) 3. วาง **Client ID** (อย่างน้อย 20 ตัวอักษร) และ **Client secret** 4. คลิก **Check** โดยระบบจะทดสอบข้อมูลประจำตัวที่คุณพิมพ์ (ไม่ต้องบันทึก) และรายงานผลการเชื่อมต่อ, App ID, โหมด, ขอบเขตสิทธิ์ refund และ webhooks ว่ามีอยู่หรือไม่ รวมถึงอายุของโทเค็น 5. คลิก **Save** 6. ในการ์ด **Webhook** ให้ยืนยันว่า URL คือ `https:///v1/billing/paypal/webhook` (ต้องเป็น `https`) จากนั้นคลิก **Create webhook** และยืนยัน NexCMP จะร้องขอให้ PayPal สร้างหรืออัปเดตเว็บฮุกด้วยเหตุการณ์ 11 รายการและจัดเก็บ **Webhook ID** ที่ส่งกลับมา ปุ่มนี้จะใช้คีย์ที่ **บันทึกไว้** ดังนั้นควรบันทึกก่อนหากคุณเพิ่งแก้ไข 7. คลิก **Check** อีกครั้ง: แถว **Webhook** ควรแสดงข้อความ "exists, 11 events" 8. เปิด **Fees & limits** เปิดใช้งาน **PayPal** ตั้งค่า **PayPal fee %** (ค่าเริ่มต้น 4.4) และ **PayPal fixed fee (cents)** (ค่าเริ่มต้น 30) ตามอัตราค่าบริการของคุณ แล้วคลิก **Save channels & fees** ![หน้า PayPal พร้อมโหมด sandbox และป้อนข้อมูลประจำตัวตัวอย่างแล้ว](https://nexcmp.com/th/docs/images/billing/paypal-01-keys.webp) ### Webhook events {#webhook-events} NexCMP จะลงทะเบียนเหตุการณ์ 11 รายการเหล่านี้: `CHECKOUT.ORDER.APPROVED`, `PAYMENT.CAPTURE.COMPLETED`, `PAYMENT.CAPTURE.PENDING`, `PAYMENT.CAPTURE.DECLINED`, `PAYMENT.CAPTURE.REFUNDED`, `PAYMENT.CAPTURE.REVERSED`, `CUSTOMER.DISPUTE.CREATED`, `CUSTOMER.DISPUTE.UPDATED`, `CUSTOMER.DISPUTE.RESOLVED`, `RISK.DISPUTE.CREATED`, `CHECKOUT.PAYMENT-APPROVAL.REVERSED` เว็บฮุกแต่ละรายการจะถูกตรวจสอบโดยการเรียก API ตรวจสอบลายเซ็นของ PayPal จัดเก็บไว้หนึ่งครั้ง และประมวลผลแบบไอเด็มโพเทนต์ NexCMP จะไม่เชื่อถือยอดเงินในเนื้อหาเว็บฮุก: ก่อนที่จะเติมเงินจากการจับภาพ จะทำการดึงข้อมูลการจับภาพนั้นจาก PayPal ก่อน ## ตรวจสอบ {#verify} 1. คงค่า **Mode** ไว้ที่ `sandbox` ในพอร์ทัล ให้เปิด **Billing › Deposit** เลือก **PayPal** คลิก **Continue on PayPal** (หรือปุ่ม PayPal) แล้วเข้าสู่ระบบด้วยบัญชีผู้ซื้อ sandbox 2. อนุมัติการชำระเงิน คุณจะกลับมาที่พอร์ทัล ยอดเงินคงเหลือจะเพิ่มขึ้น และการชำระเงินจะปรากฏภายใต้ **Finance › Billing › Top-ups** ในสถานะ *Completed* 3. เปิด **Payment channels › Gateway events › PayPal & USDT**: เหตุการณ์ `PAYMENT.CAPTURE.COMPLETED` จะแสดงอยู่ในรายการ 4. เมื่อทุกอย่างทำงานได้ ให้สลับ **Mode** เป็น `live` กรอกข้อมูลประจำตัวจริง **Save** จากนั้นคลิก **Create webhook** อีกครั้ง (เว็บฮุกของ sandbox และ live จะแยกออกจากกัน) ## ขีดจำกัดและหมายเหตุ {#limits-notes} - **การชำระเงินเสร็จสมบูรณ์อย่างไร** คำสั่งซื้อจะถูกสร้างขึ้นในสกุลเงิน USD หลังจากที่ลูกค้าอนุมัติแล้ว **เซิร์ฟเวอร์** จะทำการจับภาพ (รหัสคำสั่งซื้อแบบไอเด็มโพเทนต์) และเติมเงินเข้ากระเป๋าเงินให้พอดีหนึ่งครั้ง เว็บฮุกและงานตรวจสอบความถูกต้องที่ทำงานทุกๆ 10 นาทีจะเป็นระบบสำรองความปลอดภัยในกรณีที่ลูกค้าปิดเบราว์เซอร์ - **คำสั่งซื้อที่รอดำเนินการและถูกยกเลิก** คำสั่งซื้อสามารถเปิดค้างไว้ได้ 12 ชั่วโมง ลูกค้าสามารถมีคำสั่งซื้อที่รอดำเนินการได้สูงสุด 5 รายการ (เซิร์ฟเวอร์จะตอบกลับด้วย `too_many_pending`, HTTP 429) คำสั่งซื้อที่ยังไม่ถูกจับภาพหลังจากผ่านไป 24 ชั่วโมงจะถูกทำเครื่องหมายว่าล้มเหลว - **ไม่ได้กำหนดค่าเว็บฮุก** แผงควบคุมจะตอบกลับด้วย HTTP 503 สำหรับเว็บฮุกทุกรายการของ PayPal จนกว่าจะมีการบันทึก Webhook ID การจับภาพที่ทำผ่านพอร์ทัลและการตรวจสอบความถูกต้องทุกๆ 10 นาทีจะยังคงเติมเงินเข้ากระเป๋าเงิน แต่เหตุการณ์ใดๆ ที่ PayPal รายงานผ่านเว็บฮุก (ข้อพิพาท, การเรียกคืนเงิน, การจับภาพล่าช้า) จะไม่ถูกนำมาใช้ — ให้คลิก **Create webhook** - **บันทึกบัญชี PayPal แล้ว** เมื่อลูกค้าเลือกที่จะบันทึก PayPal (หรือทำการฝากเงินครั้งแรก ซึ่งจะเปิดใช้งาน [automatic top-up](https://nexcmp.com/th/docs/billing/auto-top-up/)) PayPal จะจัดเก็บโทเค็นการชำระเงินไว้ในห้องนิรภัย NexCMP จะเก็บบันทึกเพียงตัวระบุและอีเมล PayPal เท่านั้น ดูข้อมูลเพิ่มเติมที่ [Saved payment methods](https://nexcmp.com/th/docs/billing/saved-payment-methods/) - **การคืนเงินและข้อพิพาท** จะได้รับการจัดการเช่นเดียวกับ Stripe: คำขอคืนเงินจะได้รับการอนุมัติภายใต้ **Finance › Payouts › Card refunds** และข้อพิพาทจะบล็อกบัญชีของลูกค้าพร้อมระงับบริการแบบชำระเงินล่วงหน้าจนกว่าคุณจะแก้ไขเสร็จสิ้น - **ค่าธรรมเนียม** ค่าธรรมเนียมของ PayPal จะไม่ถูกอ่านกลับ ค่าเปอร์เซ็นต์และค่าธรรมเนียมคงวัลที่คุณกำหนดจะเป็นตัวกำหนดสิ่งที่ลูกค้าเห็นและยอดเงินที่จะได้รับเครดิต อัตราค่าบริการที่แท้จริงจะขึ้นอยู่กับประเทศของคุณ (แบบฟอร์มแนะนำ 4.4% สำหรับเวียดนามและ 3.49% สำหรับสหรัฐอเมริกา) ## การแก้ Problme {#troubleshooting} | อาการ | สาเหตุ | วิธีแก้ปัญหา | |---|---|---| | "Client ID สั้นเกินไป" | มีการวางข้อความน้อยกว่า 20 ตัวอักษร | คัดลอก Client ID เต็ม | | "Webhook URL ต้องเป็น https" | พิมพ์ URL โดยมี `http://` | ใช้โดเมนสาธารณะ `https://` ของคุณ | | การตรวจสอบรายงานข้อผิดพลาดในการเชื่อมต่อ | โหมดไม่ถูกต้อง (คีย์ใช้งานจริงในแซนด์บ็อกซ์หรือกลับกัน), รหัสลับไม่ถูกต้อง, ไม่มีสิทธิ์เข้าถึงขาออก | จับคู่ **Mode** กับประเภทคีย์; ทดสอบ `curl -I https://api-m.paypal.com` จากเซิร์ฟเวอร์ | | สโคปการคืนเงิน / webhook แสดง "no" | แอป REST ขาดฟีเจอร์ดังกล่าว | เปิดใช้งานฟีเจอร์บนแอปใน PayPal Developer Dashboard | | แบนเนอร์ "ตั้งค่าคีย์ PayPal แล้ว แต่ไม่มี webhook" | 11: ไม่พบ Webhook ID | คลิก **Create webhook** | | "ไม่พบ Webhook" ในการตรวจสอบ | Webhook ถูกลบที่ PayPal หรือเป็นของแอปอื่น | คลิก **Create webhook** อีกครั้ง | | ลูกค้าได้รับแจ้งว่า PayPal ปฏิเสธการชำระเงิน | PayPal ปฏิเสธแหล่งเงินทุนนั้น | ขอให้ลูกค้าเลือกแหล่งชำระเงินอื่น | | ลูกค้าเห็นข้อความ "คำขอรอดำเนินการมากเกินไป" | 5 คำคนที่ยังไม่ปิด | รอให้หมดอายุหรือดำเนินการให้เสร็จสิ้น | | ปุ่ม PayPal หายไป | ปิด PayPal ไว้ใน **Fees & limits** หรือยังไม่ได้กำหนดค่า | เปิดใช้งานและบันทึกข้อมูลรับรอง | --- # USDT (Binance) {#usdt-binance} > **ตำแหน่งในผู้ดูแลระบบ:** Finance › Payment channels › USDT (`/payments/usdt`). สวิตช์และค่าธรรมเนียม: Finance › Payment channels › Fees & limits (`/payments/fees`). เงินฝากที่ไม่ตรงกัน: Finance › Payment channels › Gateway events › PayPal & USDT (`/payments/events?tab=gateways`). ## What it does {#what-it-does} ลูกค้าส่ง USDT ไปยัง **ที่อยู่ฝากเงิน Binance ของคุณ**; NexCMP จะอ่านประวัติการฝากเงินผ่านคีย์ API ของ Binance แบบ **อ่านอย่างเดียว** และเติมเงินเข้ากระเป๋าเงินเมื่อการฝากเงินตรงกับคำขอที่เปิดอยู่ ไม่มีค่าธรรมเนียมผู้ประมวลผลการชำระเงินในฝั่งของคุณนอกเหนือจากที่ Binance เรียกเก็บ และ NexCMP จะไม่เก็บรักษากุญแจส่วนตัวใดๆ ทั้งสิ้น ## ข้อกำหนด {#requirements} | Item | Requirement | |---|---| | บัญชี Binance | บัญชี Binance ที่ยืนยันตัวตนแล้วและเปิดใช้งานการฝาก USDT บนเครือข่ายที่คุณเลือก | | คีย์ API | คีย์ API ของ Binance ที่มีเฉพาะ **Enable Reading** เท่านั้น ต้อง **ปิด** การใช้งาน Enable Withdrawals, Internal Transfer และ Spot/Margin Trading | | การจำกัด IP | แนะนำอย่างยิ่ง: จำกัดคีย์ให้ใช้ได้เฉพาะ IP ขาออกของเซิร์ฟเวอร์ (หน้าต่าง **Test & verify address** จะแสดง IP นี้) | | Network | HTTPS ขาออกไปยัง `api.binance.com` ไม่จำเป็นต้องใช้พอร์ตขาเข้า | | เครือข่ายที่รองรับ | `TRX` (Tron, TRC20), `BSC` (BNB Smart Chain, BEP20), `SOL` (Solana), `ETH` (Ethereum, ERC20). เหรียญถูกกำหนดไว้ที่ USDT | | Dependencies | ไม่มี | ::: warning เลือกเครือข่ายเพียงครั้งเดียว ลูกค้าที่ส่งเงินผิดเครือข่ายจะสูญเสียเงินดังกล่าว เลือกเครือข่ายที่มีค่าธรรมเนียมต่ำซึ่งการแลกเปลี่ยนของลูกค้าของคุณรองรับ (TRX และ BSC เป็นตัวเลือกทั่วไป) และอย่าเปลี่ยนบ่อย ::: ## เตรียมโครงสร้างพื้นฐาน {#prepare-the-infrastructure} 1. ใน Binance ให้เปิด **Account › API Management** และสร้างคีย์ API ใหม่ (สร้างโดยระบบ) ตั้งชื่อป้ายกำกับ เช่น "NexCMP" 2. แก้ไขสิทธิ์: คงเครื่องหมายถูกไว้เฉพาะที่ **Enable Reading** เท่านั้น ห้ามเปิดใช้งานการถอนเงิน การโอนเงิน หรือการซื้อขาย 3. ภายใต้ **Restrict access to trusted IPs only** ให้เพิ่มไอพีแอดเดรสสาธารณะของเซิร์ฟเวอร์ NexCMP ของคุณ หากคุณยังไม่ทราบ ให้สร้างคีย์โดยไม่ต้องจำกัดไอพี รันการทดสอบแรกใน NexCMP (ระบบจะแสดงไอพีขาออก) แล้วจึงค่อยเพิ่มไอพี 4. คัดลอก **API key** และ **Secret key** (รหัสลับจะแสดงเพียงครั้งเดียวเท่านั้น) 5. เปิด **Wallet › Deposit › Crypto** เลือก **USDT** และ **network** ที่คุณจะใช้ จากนั้นคัดลอก **deposit address** (ตัวอย่างเช่น `T...` address บน TRX หรือ `0x...` บน BSC/ETH) ## เชื่อมต่อใน NexCMP {#connect-in-nexcmp} 1. เปิด **Finance › Payment channels › USDT** (`/payments/usdt`) 2. ใน **API key (Binance › API Management)** ให้วาง **API key** และ **API secret** โดยต้องป้อนทั้งสองค่าพร้อมกัน 3. ใน **Deposit address** ให้เลือก **Network** และวาง **USDT deposit address on the selected network** รูปแบบจะถูกตรวจสอบเทียบกับเครือข่าย (`T` + 33 อักขระสำหรับ TRX, `0x` + 40 อักขระเลขฐานสิบหกสำหรับ BSC และ ETH, base58 สำหรับ SOL) 4. คลิก **Save** การเปลี่ยนแปลงที่อยู่หรือเครือข่ายจะรีเซ็ตการยืนยันและหยุดการทำงานของช่องทางชั่วคราวจนกว่าคุณจะยืนยันอีกครั้ง โดยหน้าเว็บจะขอให้คุณยืนยัน 5. คลิก **Test & verify address** (การเปลี่ยนแปลงที่ยังไม่บันทึกจะไม่ຖືກต้อง — การตรวจสอบจะรันบนการตั้งค่าที่บันทึกไว้แล้ว) หน้าต่างจะแสดงดังนี้: - สิทธิ์ของคีย์ (การอ่าน, การถอนเงิน, การโอนภายใน, การเทรด, การจำกัดไอพี) — คำเตือนสีแดงสำหรับสิทธิ์อันตราย; - ไอพีขาออกของเซิร์ฟเวอร์ (เพื่อป้อนใน Binance); - เครือข่าย (การฝากเปิดหรือปิด, การยืนยันที่จำเป็น, ยอดเงินเศษ); - ที่อยู่ที่ Binance ออกให้สำหรับเครือข่ายนั้นและตรวจสอบว่า **ตรงกับ** ของคุณหรือไม่ 6. เมื่อที่อยู่ตรงกัน NexCMP จะบันทึกเวลาการยืนยัน จากนั้นคุณจึงจะสามารถเปิด **Fees & limits**, เปิดใช้งาน **USDT (Binance)**, ตรวจสอบ **USDT fee %** (ค่าเริ่มต้น 1) และ **USDT request expires after (mins)** (5–180 ค่าเริ่มต้น 30) แล้วคลิก **Save channels & fees** ## วิธีการจับคู่การชำระเงิน {#how-a-payment-is-matched} 1. ลูกค้าระบุจำนวนเงินใน **Billing › Deposit › USDT** และคลิก **Get deposit address** 2. NexCMP จะสร้างคำขอและแสดงที่อยู่ เครือข่าย และ **จำนวนเงินที่แน่นอน** พร้อมทศนิยมห ตำแหน่ง — ตัวอย่างเช่น `19.173742` โดยทศนิยมสี่ตำแหน่งสุดท้ายคือร,อนซ์แบบสุ่มที่ทำให้จำนวนเงินไม่ซ้ำกันสำหรับคำขอนั้น 3. ลูกค้าต้องส่ง **จำนวนเงินที่แน่นอน** นั้นบนเครือข่ายดังกล่าว การชำระเงินที่ไม่ตรงกัน (จำนวนเงินที่ปัดเศษ, ผิดเครือข่าย) จะไม่สามารถจับคู่โดยอัตโนมัติได้ 4. ทุกๆ 60 วินาที NexCMP จะอ่านข้อมูลการฝากเงินของ Binance ในช่วง 24 ชั่วโมงที่ผ่านมา การฝากเงินที่ตรงกันจะย้ายคำขอไปที่สถานะ *confirming* และเมื่อ Binance ได้รับการยืนยันที่จำเป็นแล้ว จะทำการเติมเงินเข้ากระเป๋าเงิน คำที่มีการทำรายการเข้ามาแล้วจะไม่หมดอายุในระหว่างที่รอการยืนยัน 5. คำขอที่ไม่ได้รับการชำระเงินภายในเวลาที่กำหนด (ค่าเริ่มต้น 30 นาที) จะถูกทำเครื่องหมายว่าหมดอายุ ## ตรวจสอบ {#verify} 1. หลังจากที่ยื่นยันที่อยู่และเปิดใช้งาน USDT แล้ว ให้ลงชื่อเข้าใช้ในฐานะลูกค้าทดสอบและขอฝากเงินจำนวนเล็กน้อย (ยอดเติมเงินขั้นต่ำ) 2. ส่งจำนวนเงินที่แน่นอนจากกระเป๋าเงินหรือกระดานเทรดอื่น รอสักครู่ 3. พอร์ทัลจะแสดง *Transfer seen — confirming* จากนั้นแสดง *USDT received — balance updated* 4. หน้า USDT จะแสดงเวลา **Last poll** ล่าสุด และช่อง **Unmatched** เป็น 0 ## ขีดจำกัดและหมายเหตุ {#limits-notes} - **อัตราแลกเปลี่ยน** 1 USDT = 1.00 USD ค่าธรรมเนียมใน **USDT fee %** จะแสดงให้ลูกค้าเห็นและจะถูกหักออกจากหรือบวกเพิ่มไปยังจำนวนเงิน ขึ้นอยู่กับการตั้งค่า **Customer pays top-up fee** - **ไม่มีการคืนเงิน** การชำระเงินผ่าน USDT จะไม่ถูกคืนเงินไปยังแหล่งที่มาโดย NexCMP (HTTP 409 `usdt_no_refund`) หากจำเป็น โปรดดำเนินการคืนเงินด้วยตนเองนอกระบบ - **ขีดจำกัดคำขอรอดำเนินการ** ลูกค้าสามารถมีคำขอที่เปิดอยู่ได้ในจำนวนจำกัด หากเกินกว่านั้น เซิร์ฟเวอร์จะตอบกลับด้วย `too_many_pending` (HTTP 429) - **Resellers** สามารถใช้บัญชี Binance ของตนเองได้ ดูรายละเอียดที่ [Resellers](https://nexcmp.com/th/docs/customers/resellers/) - **หากคุณแชร์บัญชี Binance** กับระบบอื่น ให้กำหนดเครือข่ายที่แตกต่างกันสำหรับแต่ละระบบ เพื่อไม่ให้ตัวดึงข้อมูลสองตัวเห็นเงินฝากรายการเดียวกัน ### เงินฝากที่ไม่ตรงกัน {#unmatched-deposits} เงินฝากที่ไม่ตรงกับคำขอใดๆ (จำนวนเงินผิด เครือข่ายผิด คำขอหมดอายุ) จะสร้างเหตุการณ์ `deposit.unmatched` และการแจ้งเตือนผู้ดูแลระบบ เปิด **Payment channels › Gateway events › PayPal & USDT** ค้นหาเหตุการณ์ ตรวจสอบธุรกรรมบน Binance และคลิกการดำเนินการกำหนดเพื่อเติมเงินให้ลูกค้าที่ถูกต้อง ตัวนับ **Unmatched** บนหน้า USDT และภาพรวมช่องทางจะลดลงเหลือ 0 หลังจากนั้น ## การแก้ Problme {#troubleshooting} | อาการ | สาเหตุ | วิธีแก้ปัญหา | |---|---|---| | "ต้องกรอก API key และ secret พร้อมกัน" | กรอกข้อมูลเพียงช่องเดียว | กรอกทั้งสองช่อง | | "ที่อยู่ไม่1ม่ตรงตามรูปแบบของเน็ตเวิร์ก ..." | ที่อยู่ไม่ตรงกับเครือข่ายที่เลือก | คัดลอกใหม่อีกครั้งจาก Binance สำหรับเครือข่ายเดิม | | "มีการเปลี่ยนแปลงที่ยังไม่บันทึก — โปรดบันทึกก่อนจึงจะทดสอบ" | การทดสอบทำงานบนการตั้งค่าที่บันทึกไว้ | คลิก **Save** แล้วจึงทดสอบ | | คำเตือน "key has Enable Withdrawals" | สิทธิ์เกินความจำเป็น | ลบออกในส่วน Binance API Management | | คำเตือน "key not restricted to IP" | `ipRestrict` ปิดอยู่ | เพิ่ม IP ขาออกของเซิร์ฟเวอร์ที่แสดงในหน้าต่าง对话 | | คำเตือน "key lacks Enable Reading" | สิทธิ์หายไป | เปิดใช้งาน Reading | | คำเตือน "Binance has deposits disabled for USDT on the network" | เครือข่ายถูกระงับ | เลือกเครือข่ายอื่นหรือรอ | | "อันตราย: ที่อยู่ที่กำหนดค่าไว้แตกต่างจากที่อยู่ที่ Binance ออกให้" | ที่อยู่หรือเครือข่ายไม่ถูกต้อง | คัดลอกที่อยู่อีกครั้งจาก Binance สำหรับเครือข่ายนั้น | | ปุ่มสลับ USDT เป็นสีเทาใน Fees & limits | ยังไม่ได้ยืนยันที่อยู่ | รัน **Test & verify address** จนกว่าจะตรงกัน | | ลูกค้าชำระเงินแล้ว แต่ยังไม่ได้รับเครดิต | จำนวนเงินถูกปัดเศษหรือเครือข่ายผิด | ค้นหาเหตุการณ์ใน Gateway events และกำหนดด้วยตนเอง | | เห็นเงินฝากแล้วแต่รอนานมาก | การยืนยันยังไม่เพียงพอ | รอสักครู่ คำขอจะไม่หมดอายุในระหว่างการยืนยัน | --- # โอนผ่านธนาคาร (เวียดนาม) {#bank-transfer-vietnam} > **ตำแหน่งในหน้าผู้ดูแล:** Finance › Payment channels › VN bank transfer (`/payments/bank`) อัตราแลกเปลี่ยน: Finance › Payment channels › Exchange rates (`/payments/fx`) ## What it does {#what-it-does} ให้ลูกค้าเติมเงินในกระเป๋าเงิน USD ผ่านการโอนเงินผ่านธนาคารปกติในสกุลเงินดองเวียดนาม NexCMP จะแสดงรหัส VietQR รายละเอียดบัญชี และ **บันทึกการโอน** ที่ไม่ซ้ำกัน [SePay](https://sepay.vn) จะคอยตรวจสอบบัญชีธนาคารของคุณและเรียกเว็บฮุกเมื่อเงินเข้า จากนั้น NexCMP จะเติมเงินเข้ากระเป๋าเงินให้ ใช้สิ่งนี้หากคุณขายสินค้าให้กับลูกค้าในเวียดนาม ::: info แสดงเฉพาะในอินเทอร์เฟซภาษาเวียดนาม ตัวเลือกธนาคาร VN จะแสดงต่อเมื่อพอร์ทัลแสดงเป็นภาษา **Vietnamese** เท่านั้น ลูกค้าที่ใช้ภาษาอื่นจะไม่เห็นตัวเลือกนี้ ::: ## ข้อกำหนด {#requirements} | Item | Requirement | |---|---| | บัญชีธนาคาร | บัญชีธนาคารเวียดนาม (หรือบัญชีเสมือนของ Sepay, **VA**) ที่เชื่อมต่อกับบัญชี Sepay ที่ [my.sepay.vn](https://my.sepay.vn) | | Sepay | บัญชี Sepay ที่เปิดใช้งานการบูรณาการ Webhook แล้ว | | อัตราแลกเปลี่ยน | ต้องมีอัตราแลกเปลี่ยน USD เป็น VND อยู่: โปรดอัปเดตที่ **Exchange rates** ก่อน หากไม่มีอัตราแลกเปลี่ยน ช่องทางนี้จะตอบกลับด้วย `fx_unavailable` และลูกค้าจะไม่สามารถเริ่มการโอนเงินได้ | | Network | แผงควบคุมของคุณต้องสามารถเข้าถึงได้ผ่าน HTTPS เพื่อให้ Sepay สามารถเรียกใช้งาน `https:///v1/billing/sepay/webhook` ได้ | | Dependencies | [สกุลเงินและอัตราแลกเปลี่ยน](https://nexcmp.com/th/docs/catalog/currency-and-exchange-rates/). | ## เตรียมโครงสร้างพื้นฐาน {#prepare-the-infrastructure} ฝั่งของ Sepay: 1. ใน [my.sepay.vn](https://my.sepay.vn) ให้เชื่อมต่อบัญชีธนาคารของคุณ (หรือสร้าง VA) และตรวจสอบว่ามีรายการธุรกรรมปรากฏขึ้น 2. กำหนด**คำนำหน้าบันทึกช่วยจำ (memo prefix)** — ตัวอักษรพิมพ์ใหญ่ 2 ถึง 5 ตัว เช่น `PAY` NexCMP จะสร้างบันทึกช่วยจำโดยใช้คำนำหน้าตามด้วยตัวเลขสุ่ม 8 หลัก (เช่น `PAY48210937`) คำนำหน้าต้องไม่มี `ORD` และไม่ควรซ้ำกับระบบอื่นที่รับเงินเข้าบัญชีเดียวกัน 3. หากบัญชี Sepay ของคุณใช้ *โครงสร้างรหัสการชำระเงิน (payment code structure)* ให้ลงทะเบียนคำนำหน้าเดียวกันที่นั่นเพื่อให้ Sepay จดจำบันทึกช่วยจำได้ 4. สร้าง Webhook ในภายหลัง หลังจากที่หน้า NexCMP แสดง URL และคีย์ให้คุณแล้ว (ขั้นตอนที่ 7 ด้านล่าง) ## เชื่อมต่อใน NexCMP {#connect-in-nexcmp} 1. เปิด **Finance › Payment channels › Exchange rates** แล้วคลิก **Update exchange rates** หากยังไม่มีการบันทึกอัตราแลกเปลี่ยน 2. เปิด **Finance › Payment channels › VN bank transfer** (`/payments/bank`) 3. ในส่วน **Receiving account** ให้กรอกข้อมูลดังนี้: | ฟิลด์ | ตัวอย่าง | กฎ | |---|---|---| | ธนาคาร | `VCB` Vietcombank | เลือกจากรายการ รหัส BIN จะถูกเติมอัตโนมัติ | | เลขที่บัญชี | `0123456789` | ตัวเลข 4–24 หลักหรือตัวอักษรพิมพ์ใหญ่ | | บัญชีเสมือน (VA — ไม่บังคับ) | | หากตั้งค่าไว้ ลูกค้าจะโอนเงินเข้า VA และคิวอาร์โค้ดจะแสดงผลดังกล่าว | | ชื่อเจ้าของบัญชี | `NGUYEN VAN A` | ไม่มีอักษรพิเศษ, ตัวพิมพ์ใหญ่ทั้งหมด, ความยาว 2–60 ตัวอักษร | | คำนำหน้าบันทึกการโอนเงิน | `PAY` | ตัวอักษรพิมพ์ใหญ่ 2–5 ตัว, ไม่มี `ORD` | 4. ใน **Webhook authentication** ให้เลือก **Auth method**: **HMAC-SHA256** (แนะนำ) หรือ **API key** และป้อน **Webhook key / HMAC secret** (8–200 ตัวอักษร) หรือเลือกป้อน **userapi token** จาก Sepay ซึ่งใช้สำหรับการตรวจสอบยอดโอนที่ Webhook ขาดหายไปเท่านั้น 5. ใน **Channel & limits** ให้กำหนดขีดจำกัด (ค่าเริ่มต้นอยู่ในวงเล็บ): **Min / order** (10,000 VND), **Max / order** (200,000,000 VND), **Order expiry** (120 นาที, 15–1440), **Max pending orders / account** (3, 1–10), **Reconcile every** (10 นาที) และ **Allowed webhook IPs** (คั่นด้วยจุลภาค หากเว้นว่างไว้จะบันทึกเฉพาะ IP เท่านั้น เป็นทางเลือก) 6. คลิก **Save** แบนเนอร์สีแดง "Sepay not configured" จะหายไปเมื่อบัญชี ชื่อ คำนำหน้า และคีย์ถูกต้อง 7. คัดลอก **Webhook URL to paste into my.sepay.vn** (ซึ่งแสดงเป็น `https:///v1/billing/sepay/webhook`) ด้วย **Copy** จากนั้นใน Sepay ให้เปิดการเชื่อมต่อ webhook วาง URL เลือกประเภทและคีย์การตรวจสอบสิทธิ์ให้ตรงกัน แล้วเปิดใช้งานอีเวนต์ "money in" 8. คลิก **Test connection** จากนั้นเปิดสวิตช์ **Enable Sepay for clients (main site)** และคลิก **Save** ![หน้าการโอนเงินผ่านธนาคารเวียดนามที่มีการกรอกข้อมูลบัญชีผู้รับ คำนำหน้าบันทึก และการยืนยันตัวตน Webhook ด้วยค่าตัวอย่าง](https://nexcmp.com/th/docs/images/billing/bank-transfer-vn-01-config.webp) ![การ์ดช่องทางและขีดจำกัดที่เปิดสวิตช์ Sepay และตั้งค่าขีดจำกัดเริ่มต้นไว้](https://nexcmp.com/th/docs/images/billing/bank-transfer-vn-02-limits.webp) ### ความปลอดภัยของ Webhook {#webhook-security} | วิธี | สิ่งที่ Sepay ต้องส่ง | |---|---| | HMAC-SHA256 | ส่วนหัว `X-SePay-Signature: sha256=` คำนวณจาก `"."` โดยเวลาอาจแตกต่างกันได้ไม่เกิน 300 วินาที | | คีย์ API | ส่วนหัว `Authorization: Apikey ` | จะมีการตรวจสอบเฉพาะส่วนหัวเท่านั้น (ไม่รวมเนื้อหาหรือคิวรีสตริง) และการเปรียบเทียบใช้เวลาคงที่ จะใช้เฉพาะการโอนเงินขาเข้า (`transferType = in`) ไปยังบัญชีหรือ VA ที่คุณกำหนดไว้เท่านั้น ธุรกรรม SePay แต่ละรายการจะถูกจัดเก็บไว้เพียงครั้งเดียว ดังนั้นเว็บฮุกที่มีการส่งซ้ำจะไม่ถูกเครดิตซ้ำ NexCMP จะตอบกลับเป็น `200 {"success":true}` แม้ว่าจะจงใจเพิกเฉยต่อธุรกรรมนั้น และตอบกลับ HTTP 5xx เฉพาะกรณีข้อผิดพลาดชั่วคราวเพื่อให้ SePay ส่งซ้ำ ## วิธีที่ลูกค้าชำระเงิน {#how-the-customer-pays} 1. ใน **Billing › Deposit** (อินเทอร์เฟซภาษาเวียดนาม) ลูกค้าเลือกตัวเลือกการโอนเงินผ่านธนาคารเวียดนามและระบุจำนวนเงิน จากนั้นคลิกปุ่มสร้างรายการโอน 2. NexCMP จะแปลงจำนวนเงิน USD ตามอัตราที่จัดเก็บไว้ (รวมถึงส่วนต่างและขั้นตอนการปัดเศษที่คุณตั้งค่าไว้ใน **Exchange rates**) และ **ปัดเศษจำนวนเงิน VND ขึ้น** ไปยังขั้นการปัดเศษ 3. ลูกค้าจะเห็นคิวอาร์โค้ด (VietQR สร้างขึ้นในเครื่อง) พร้อมเลขที่บัญชี ธนาคาร จำนวนเงิน และบันทึกช่วยจำ 4. หลังจากการโอนเงิน SePay จะเรียกเว็บฮุก และ NexCMP จะเพิ่มเครดิต `floor(VND received × 100 / rate)` เซนต์ อัตราแลกเปลี่ยนจะถูกล็อกไว้เมื่อสร้างคำสั่งซื้อ หากเงินเข้าหลังจากคำสั่งซื้อหมดอายุ จะใช้อัตราที่สูงกว่าระหว่างอัตราที่ล็อกไว้กับอัตราปัจจุบัน 5. คำสั่งซื้อจะหมดอายุหลังจาก **Order expiry**; การกระทบยอดจะทำงานทุกๆ **Reconcile every** นาทีเพื่อเป็นตาข่ายความปลอดภัย (ต้องใช้โทเค็น userapi) ## ตรวจสอบ {#verify} 1. สร้างคำสั่งซื้อทดสอบในฐานะลูกค้าบนอินเทอร์เฟซภาษาเวียดนาม ตรวจสอบว่าจำนวนเงิน บัญชี และบันทึกช่วยจำถูกต้อง 2. โอนเงินตามจำนวนขั้นต่ำที่อนุญาตพร้อมบันทึกช่วยจำที่แน่นอน 3. ภายในหนึ่งนาที พอร์ทัลจะแสดงการฝากเงินว่าเสร็จสมบูรณ์และยอดเงินในกระเป๋าเงินจะเพิ่มขึ้น การ์ด **State** ในหน้าธนาคารจะแสดงเวลาเว็บฮุกครั้งล่าสุด 4. เปิด **Finance › Billing › Top-ups** และตรวจสอบว่าการชำระเงินแสดงอยู่ในรายการพร้อมจำนวนเงิน VND ที่ได้รับ ## ขีดจำกัดและหมายเหตุ {#limits-notes} - **ขั้นต่ำ** จำนวนเงิน VND ขั้นต่ำที่ลูกค้าเห็นคือค่าที่มากกว่าระหว่าง **Min / order** และมูลค่า VND ของ [minimum top-up](https://nexcmp.com/th/docs/billing/minimum-top-up/) - **คำสั่งซื้อที่รอดำเนินการ** ลูกค้าสามารถมีคำสั่งซื้อที่เปิดอยู่ได้สูงสุด **Max pending orders / account** รายการ (ค่าเริ่มต้นคือ 3) - **บันทึกช่วยจำซ้ำกัน** การโอนเงินสองครั้งด้วยบันทึกช่วยจำเดียวกันจะสร้างการชำระเงินที่สำเร็จรายการที่สองตามอัตราปัจจุบัน - **ไม่มีการคืนเงินอัตโนมัติ** ไปยังบัญชีธนาคาร - **ค่าธรรมเนียม** ช่องทางนี้ไม่มีบรรทัดค่าธรรมเนียมคงที่ใน **Fees & limits** โดยส่วนต่างอัตราแลกเปลี่ยนคือการปรับแก้เพียงอย่างเดียว - **Resellers** สามารถกำหนดค่าบัญชีของตนเองได้ โดย URL เว็บฮุกจะลงท้ายด้วย `/v1/billing/sepay/webhook/r/` ### การโอนเงินที่ยังไม่ได้จับคู่ {#unmatched-transfers} เงินที่เข้าบัญชีแล้วแต่ไม่มีบันทึกช่วยจำที่ถูกต้องจะปรากฏใน **Unmatched transactions** ที่ด้านล่างของหน้า (ตัวกรอง *All channel owners* หรือ *Master*) ตรวจสอบอ้างอิงธนาคารกับลูกค้า จากนั้นคลิก **Assign** และเลือกบัญชี ยอดเงินในกระเป๋าจะถูกเติมเครดิตตามอัตราปัจจุบัน ## การแก้ Problme {#troubleshooting} | อาการ | สาเหตุ | วิธีแก้ปัญหา | |---|---|---| | แบนเนอร์ "Sepay not configured" | ธนาคาร, บัญชี, ชื่อผู้ถือบัญชี, คำนำหน้า หรือคีย์หายไปหรือไม่ถูกต้อง | กรอกข้อมูลในการ์ด **Receiving account** และ **Webhook authentication** ให้ครบถ้วน | | แบนเนอร์ "USD/VND rate blocked" (`fx_unavailable`) | ไม่มีการจัดเก็บอัตราแลกเปลี่ยน | ไปที่ **Exchange rates › Update exchange rates**. | | `prefix: 2–5 capital letters, no ORD` | คำนำหน้าไม่ถูกต้อง | ใช้ตัวอักษรพิมพ์ใหญ่ 2–5 ตัวโดยไม่มี `ORD` | | ข้อผิดพลาด `account_name` | มีอักษรมีเครื่องหมายกำกับหรือตัวพิมพ์เล็ก | ใช้ตัวอักษรพิมพ์ใหญ่ภาษาอังกฤษที่ไม่มีเครื่องหมายกำกับ, ตัวเลข, ช่องว่าง, จุด หรือยัติภังค์ | | `webhook_secret: 8–200 characters` | คีย์สั้นเกินไป | ใช้อักขระที่พิมพ์ได้3อย่างน้อย 8 ตัว | | ลูกค้ามองไม่เห็นตัวเลือก | ไม่พบในอินเทอร์เฟซภาษาเวียดนาม ปิดใช้งาน หรือไม่มีเรท | ตรวจสอบภาษา สวิตช์ และเรท | | ลูกค้าชำระเงินแล้วแต่ยอดเงินไม่เข้า | เว็บฮุกไม่มา เมโมเปลี่ยน หรือยอดเงินไม่ถูกต้อง | ตรวจสอบบันทึกเว็บฮุกของ Sepay; การโอนเงินจะอยู่ใต้ **Unmatched transactions** หากใส่เมโมผิด | | เว็บฮุกคืนค่า 401 หรือ 403 | วิธีการยืนยันตัวตนหรือคีย์ไม่ตรงกัน | ใช้วิธีการและคีย์เดียวกันใน Sepay และ NexCMP | | ลูกค้าเห็นข้อความ "คำขอรอดำเนินการมากเกินไป" | ถึงขีดจำกัดคำสั่งซื้อที่รอดำเนินการแล้ว | รอให้เสร็จสิ้นหรือรอจนกว่าจะหมดอายุ | --- # การเติมเงินขั้นต่ำ {#minimum-top-up} > **ตำแหน่งในแอดมิน:** Finance › Payment channels › Fees & limits (`/payments/fees`), การ์ด **Wallet & top-up (Billing › Policy)**. ## What it does {#what-it-does} ช่องทางการชำระเงินทุกช่องทางจะปฏิเสธยอดเงินที่ต่ำกว่า **minimum top-up** หรือสูงกว่า **maximum top-up per transaction** ค่าเริ่มต้นคือ **$10.00** และ **$5,000.00** ใช้ค่าขั้นต่ำเพื่อหลีกเลี่ยงการชำระเงินจำนวนน้อยซึ่งมีค่าธรรมเนียมเกตเวย์สูงกว่ามูลค่าที่ได้รับ ## ข้อกำหนด {#requirements} | Item | Requirement | |---|---| | บทบาท | ผู้ดูแลระบบ | | Dependencies | ไม่มี | ## กำหนดขีดจำกัด {#set-the-limits} 1. เปิด **Finance › Payment channels › Fees & limits** (`/payments/fees`) 2. ในการ์ด **Wallet & top-up (Billing › Policy)** ให้แก้ไข **Min top-up (USD)** และ **Max top-up per transaction (USD)** 3. คลิก **Save Wallet & top-up** ![การ์ดกระเป๋าเงินและการเติมเงินพร้อมขั้นต่ำการเติมเงิน 10.00 และสูงสุด 5000.00](https://nexcmp.com/th/docs/images/billing/minimum-top-up-01-limits.webp) | การตั้งค่า | ค่าเริ่มต้น | ช่วงที่อนุญาต | กฎ | |---|---|---|---| | Min top-up (USD) | $10.00 | $0 ถึง $10,000 | ต้องน้อยกว่าหรือเท่ากับค่าสูงสุด | | วงเงินเติมเงินสูงสุดต่อรายการ (USD) | $5,000.00 | $1 ถึง $1,000,000 | ต้องมีค่าอย่างน้อยเท่ากับค่าขั้นต่ำ | ค่าต่างๆ จะถูกจัดเก็บเป็นหน่วยเซนต์ (`min_topup_cents`, `max_topup_cents`) ## ตำแหน่งที่ใช้ขีดจำกัด {#where-the-limits-apply} | ตำแหน่ง | พฤติกรรม | |---|---| | บัตร, Apple/Google Pay, Link, Alipay, PayPal, USDT | จำนวนเงินที่อยู่นอกช่วงจะถูกปฏิเสธโดยเซิร์ฟเวอร์ พอร์ทัลจะแสดงข้อความ "Enter an amount between {min} and {max}" | | การโอนเงินผ่านธนาคารเวียดนาม | จำนวนเงิน VND จะต้องอยู่ภายในขีดจำกัดของ Sepay **และ** มูลค่า USD (ที่กระเป๋าเงินได้รับ) จะต้องอยู่ระหว่างค่าขั้นต่ำและค่าสูงสุด พอร์ทัลจะแสดงค่าขั้นต่ำ VND ที่สูงกว่า ดู [Bank transfer (Vietnam)](https://nexcmp.com/th/docs/billing/bank-transfer-vn/) | | [Automatic top-up](https://nexcmp.com/th/docs/billing/auto-top-up/) | การหักเงินอัตโนมัติทุกครั้งจะมีค่าอย่างน้อยเท่ากับขั้นต่ำและไม่เกินสูงสุด ในโหมดคงที่ จำนวนเงินของลูกค้าจะต้องอยู่ระหว่างขั้นต่ำและ $1,000 | | รหัสเติมเงิน ([Vouchers](https://nexcmp.com/th/docs/billing/promotions/)) | ไม่ได้รับผลกระทบ | | เครดิต / เดบิตโดยผู้ดูแลระบบ | ไม่ได้รับผลกระทบ | | การเติมเงินกระเป๋าเงินตัวแทนจำหน่าย | กำหนดขั้นต่ำแยกต่างหาก (`rs_topup_min_cents`, ค่าเริ่มต้น $20) ใต้ Resellers › Defaults. | ## เกณฑ์ยอดเงินที่เกี่ยวข้อง {#related-floors} การเติมเงินขั้นต่ำไม่ใช่กฎยอดเงินเพียงข้อเดียว สิ่งเหล่านี้อยู่ใน **Services › Virtual Machines › Policy** (`/vm/policy`): | กฎ | ค่าเริ่มต้น | ความหมาย | |---|---|---| | ยอดเงินขั้นต่ำ (`min_balance_cents`) | $5.00 | ยอดเงินในกระเป๋าเงินขั้นต่ำที่ลูกค้าต้องการเพื่อสร้าง VM | | โควตา | ปิด | เมื่อเปิดใช้งาน **Quotas** การสร้าง VM จะต้องมีจำนวนเงินในยอดคงเหลือที่ครอบคลุมการใช้งาน VM นั้นหลายชั่วโมง ดูข้อมูลเพิ่มเติมที่ [Quotas](https://nexcmp.com/th/docs/billing/quotas/) | ## ตรวจสอบ {#verify} 1. ในพอร์ทัล ให้เปิด **Billing › Deposit** และพิมพ์จำนวนเงินที่ต่ำกว่าขั้นต่ำเล็กน้อย ปุ่มชำระเงินจะถูกปิดใช้งานและข้อความช่วงจำนวนเงินจะปรากฏขึ้น 2. ป้อนจำนวนเงินขั้นต่ำและยืนยันว่าการชำระเงินเริ่มต้นขึ้น ## ขีดจำกัดและหมายเหตุ {#limits-notes} - การเปลี่ยนแปลงจะมีผลกับการชำระเงินใหม่ คำสั่งซื้อที่สร้างไว้แล้วจะใช้จำนวนเงินเดิมที่สร้างขึ้น - คำแนะนำสำหรับลูกค้า ("Minimum $10.00, maximum $5,000.00") และปุ่มจำนวนเงินด่วนจะอัปเดตตามขีดจำกัดใหม่โดยอัตโนมัติ - หากคุณแสดงสกุลเงิน VND (หน้า **Exchange rates**) จำนวนเงินขั้นต่ำจะถูกแปลงตามอัตราแลกเปลี่ยนที่บันทึกไว้เพื่อการแสดงผลเท่านั้น แต่กระเป๋าเงินและขีดจำกัดจะยังคงเป็น USD ## การแก้ Problme {#troubleshooting} | อาการ | สาเหตุ | วิธีแก้ปัญหา | |---|---|---| | "ยอดเติมเงินขั้นต่ำต้องน้อยกว่าหรือเท่ากับยอดสูงสุด" | ค่าสลับกัน | ลดจำนวนเงินขั้นต่ำหรือเพิ่มจำนวนเงินสูงสุด | | ลูกค้าไม่สามารถชำระเงินจำนวนน้อยผ่านการโอนเงินผ่านธนาคารใน VN | ยอดขั้นต่ำของ Sepay VND หรือยอดขั้นต่ำของ USD สูงกว่า | ลดค่า **Min / order** บนหน้าธนาคารหรือลดขั้นต่ำของ USD ลง | | เกิดข้อผิดพลาดของเซิร์ฟเวอร์ `invalid_argument` ขณะเติมเงิน | จำนวนเงินอยู่นอกช่วงที่กำหนด | ระบุจำนวนเงินให้อยู่ในช่วงที่แสดง | --- # วิธีการชำระเงินที่บันทึกไว้ {#saved-payment-methods} > **ตำแหน่งในพอร์ทัล:** Billing › Settings (`/billing?settings=1`) **ตำแหน่งในผู้ดูแลระบบ:** Customers › List › a customer › Overview (`/customers/`) การ์ด **Payment** จะแสดงวิธีที่บันทึกไว้และประวัติการเติมเงินอัตโนมัติ ## What it does {#what-it-does} วิธีการชำระเงินที่บันทึกไว้ช่วยให้ NexCMP สามารถเรียกเก็บเงินจากลูกค้าได้ **โดยที่ลูกค้าไม่ต้องดำเนินการใดๆ** บริการของพวกเขาจึงไม่หยุดชะงักเนื่องจากยอดเงินในกระเป๋าหมด ซึ่งใช้งานผ่าน [automatic top-up](https://nexcmp.com/th/docs/billing/auto-top-up/) เท่านั้น โดยมี 2 ประเภท ได้แก่ **บัตร** ที่บันทึกไว้ใน Stripe (รวมถึงบัตรที่ใช้ผ่าน Apple Pay, Google Pay หรือ Link เมื่อ Stripe ส่งคืนบัตรที่นำกลับมาใช้ใหม่ได้) และ **บัญชี PayPal** ที่จัดเก็บไว้ใน PayPal vault ## ข้อกำหนด {#requirements} | Item | Requirement | |---|---| | ช่องทาง | กำหนดค่าและเปิดใช้งาน [Stripe](https://nexcmp.com/th/docs/billing/stripe/) และ/หรือ [PayPal](https://nexcmp.com/th/docs/billing/paypal/) แล้ว | | ไซต์ | ไซต์หลัก หรือไซต์ตัวแทนจำหน่ายที่มีช่องทางการชำระเงินรวบรวมโดยแพลตฟอร์ม ไซต์ตัวแทนจำหน่ายที่ใช้บัญชี Stripe ของตนเองจะไม่สามารถบันทึกบัตรได้ | | ลูกค้า | บัญชีลูกค้าที่เคยทำการเติมเงินด้วยบัตรหรือ PayPal แล้ว | ## วิธีการบันทึกข้อมูล {#how-a-method-gets-saved} 1. ลูกค้าเปิดหน้า **Billing** คลิก **Deposit** และชำระเงินด้วย **Card** หรือ **PayPal** 2. การชำระเงินถูกสร้างขึ้นเพื่อให้สามารถนำวิธีนี้กลับมาใช้ใหม่ได้ในภายหลัง: Stripe บันทึกบัตรไว้กับลูกค้าที่ Stripe (การใช้งานแบบ off-session) ส่วน PayPal จะจัดเก็บโทเค็นห้องนิรภัย NexCMP เก็บเฉพาะข้อมูลอ้างอิง (รหัสวิธีการชำระเงินและรหัสลูกค้าของ Stripe หรือรหัสห้องนิรภัยของ PayPal) และป้ายกำกับสำหรับการแสดงผล เช่น `visa •••• 4242` หรืออีเมล PayPal **หมายเลขบัตรจะไม่ถูกส่งไปยังเซิร์ฟเวอร์ของคุณเด็ดขาด** 3. เมื่อการชำระเงินเสร็จสมบูรณ์ [เติมเงินอัตโนมัติ](https://nexcmp.com/th/docs/billing/auto-top-up/) จะถูกเปิดใช้งานหนึ่งครั้งหากลูกค้าไม่เคยเลือกการตั้งค่ามาก่อน ไม่มีช่องทำเครื่องหมายหรือข้อความเพิ่มเติมบนหน้าจอ เซิร์ฟเวอร์จะบันทึกเวลา, IP ออดิสของลูกค้า และวิธีการชำระเงินไว้เป็นหลักฐาน 4. ครั้งถัดไป หน้าจอเติมเงินจะมีตัวเลือก **Saved card ...** ในเมนูแบบดรอปดาวน์ของบัตร และ **Saved PayPal ...** สำหรับ PayPal ## การจัดการและการลบ {#manage-and-remove} 1. ในพอร์ทัล ให้ไปที่ **Billing** และคลิกที่ **Settings** แผงควบคุมจะแสดงวิธีการชำระเงินที่บันทึกไว้ (บัตร Stripe และ/หรือ PayPal) และตัวเลือกการเติมเงินอัตโนมัติ 2. หากต้องการลบการ์ด ให้คลิก **Remove card** แล้วยืนยัน Stripe จะทำการถอดการ์ดออกและ **การเติมเงินอัตโนมัติจะถูกปิดใช้งาน** 3. หากต้องการลบ PayPal ให้คลิก **Remove saved PayPal** แล้วยืนยัน ### มุมมองผู้ดูแลระบบ {#admin-view} เปิดข้อมูลลูกค้าใน **Customers › List** การ์ด **Payment** บนแท็บ **Overview** จะแสดงป้ายกำกับของวิธีการชำระเงินที่บันทึกไว้ (**Saved cards**), เกตเวย์ที่ใช้สำหรับการตัดเงินอัตโนมัติ, หลักฐานความยินยอมที่จัดเก็บไว้ (เวลา, IP, วิธีการ) และประวัติความพยายามตัดเงินอัตโนมัติ 20 ครั้งล่าสุดพร้อมสถานะและเหตุผล (**Auto top-up history**) ## ตรวจสอบ {#verify} 1. ในฐานะลูกค้าทดสอบ ให้เติมเงินจำนวนขั้นต่ำด้วยบัตร เมื่อการชำระเงินเสร็จสิ้น ให้เปิด **Billing › Settings**: จะเห็นบัตรและสวิตช์เติมเงินอัตโนมัติ (เปิดอยู่) 2. เริ่มการเติมเงินครั้งอื่น: เมนูดรอปดาวน์จะมีบัตรที่บันทึกไว้ให้เลือก 3. ในหน้าผู้ดูแลระบบ การ์ด **Payment** ของลูกค้าจะแสดงป้ายกำกับบัตรเดียวกัน ## ขีดจำกัดและหมายเหตุ {#limits-notes} - **Stripe Link และวอลเล็ต** Link, Apple Pay และ Google Pay เป็นฟีเจอร์ของ Stripe โดย NexCMP จะไม่จัดเก็บข้อมูลใดๆ ที่เฉพาะเจาะจงกับ Link แต่จะเก็บบันทึกอ้างอิงบัตรที่ Stripe ส่งกลับมาเท่านั้น - **PayPal** การเติมเงินผ่าน PayPal ทุกครั้งที่ลูกค้าเริ่มทำรายการจะต้องคลิกยืนยัน การบันทึก PayPal จะใช้สำหรับการเติมเงินอัตโนมัติเท่านั้น และจะไม่ถูกใช้โดยฟีเจอร์อื่น - **เว็บไซต์ตัวแทนจำหน่าย** หากตัวแทนจำหน่ายใช้บัญชี Stripe หรือ PayPal ของตนเอง วิธีการชำระเงินที่บันทึกไว้จะถูกซ่อนและฟีเจอร์เติมเงินอัตโนมัติจะไม่สามารถใช้งานได้สำหรับเว็บไซต์นั้น - **ข้อพิพาท** ข้อพิพาทเกี่ยวกับการชำระเงินใดๆ จะบล็อกบัญชีและหยุดบริการแบบพรีเปย์ ดูรายละเอียดที่ [Stripe](https://nexcmp.com/th/docs/billing/stripe/) - **การลบวิธีชำระเงินรายการสุดท้าย** จะเป็นการปิดการเติมเงินอัตโนมัติ โดยที่ลูกค้ายังคงมียอดคงเหลือในวอลเล็ต - **หลักฐาน** บันทึกความยินยอมจะถูกเขียนโดยเซิร์ฟเวอร์ (ลูกค้าไม่สามารถแก้ไขได้) และถูกเก็บไว้สำหรับการจัดการข้อพิพาท ## การแก้ Problme {#troubleshooting} | อาการ | สาเหตุ | วิธีแก้ปัญหา | |---|---|---| | ลูกค้าไม่เห็นปุ่ม Settings หรือบัตรที่บันทึกไว้ | เว็บไซต์ใช้ช่องทางการชำระเงินของตัวแทนจำหน่าย หรือยังไม่มีการชำระเงินด้วยบัตร | ทำการเติมเงินผ่านบัตรหรือ PayPal ผ่านช่องทางของแพลตฟอร์ม | | ไม่พบ "Saved card" หลังจากชำระเงินผ่าน Stripe | การชำระเงินทำด้วยวิธีที่ไม่สามารถนำกลับมาใช้ซ้ำได้ (ตัวอย่างเช่น Alipay) | ชำระเงินใหม่อีกครั้งด้วยบัตร | | PayPal: "ไม่สามารถบันทึกบัญชีนี้ได้ในขณะนี้" | PayPal ไม่ได้ส่งโทเค็นห้องนิรภัย (vault token) กลับมา | ดำเนินการต่อด้วยการชำระเงินครั้งเดียว หรือลองใช้บัญชี PayPal อื่น | | การเติมเงินอัตโนมัติหยุดลงหลังจากลบบัตร | คาดหวัง: การลบบัตรจะเป็นการปิดใช้งานฟีเจอร์ดังกล่าว | บันทึกวิธีชำระเงินใหม่พร้อมกับการเติมเงินครั้งถัดไป | --- # Auto top-up {#auto-top-up} > **ตำแหน่งในหน้าผู้ดูแลระบบ:** Finance › Payment channels › Fees & limits (`/payments/fees`), การ์ด **Wallet & top-up (Billing › Policy)**, ส่วน **Auto top-up (Stripe / PayPal)** **ตำแหน่งในพอร์ทัลลูกค้า:** Billing › Settings (`/billing?settings=1`) ## What it does {#what-it-does} เมื่อยอดคงเหลือในวอลเล็ตของลูกค้าลดต่ำเกินไป NexCMP จะทำการเรียกเก็บเงินจาก [ saved payment method ](https://nexcmp.com/th/docs/billing/saved-payment-methods/) และเติมเครดิตเข้าวอลเล็ต เพื่อให้บริการที่กำลังทำงานอยู่ไม่ถูกระงับเนื่องจากเงินหมด โดยจะมีเบื้องหลังการทำงานคอยตรวจสอบลูกค้าที่เปิดใช้งานทั้งหมด **ทุกๆ 5 นาที** ## ข้อกำหนด {#requirements} | Item | Requirement | |---|---| | ช่องทาง | กำหนดค่า [Stripe](https://nexcmp.com/th/docs/billing/stripe/) และ/หรือ [PayPal](https://nexcmp.com/th/docs/billing/paypal/) แล้ว | | Saved method | ลูกค้ามีบัตรหรือบัญชี PayPal ที่บันทึกไว้ | | ไซต์ | เว็บไซต์หลัก หรือเว็บไซต์ตัวแทนจำหน่ายที่มีช่องทาง Stripe/PayPal ซึ่งรวบรวมโดยแพลตฟอร์ม | | Global switch | **Auto top-up enabled** เปิดอยู่ (ค่าเริ่มต้นคือเปิด) | ## วิธีการทำงาน {#how-it-works} หลังจากที่ลูกค้าทำการ **เติมเงินครั้งแรกผ่าน Stripe หรือ PayPal** เซิร์ฟเวอร์จะบันทึกวิธีชำระเงินและเปิดใช้งานการเติมเงินอัตโนมัติในโหมด **By usage** ให้ — เฉพาะในกรณีที่ลูกค้าไม่เคยตั้งค่าการเติมเงินอัตโนมัติด้วยตนเอง ไม่มีช่องให้ติ๊กเพิ่มเติมบนหน้าจอฝากเงิน โดยเซิร์ฟเวอร์จะบันทึกเวลา, ที่อยู่ IP และวิธีชำระเงินไว้เป็นหลักฐาน หากลูกค้าปิดการเติมเงินอัตโนมัติในภายหลัง ระบบจะไม่เปิดใช้งานใหม่อีกเอง | โหมด | เงื่อนไขการเรียกเก็บ (เมื่อยอดเงินคงเหลือต่ำกว่า ...) | จำนวนเงินที่เรียกเก็บ | |---|---|---| | **By usage** (ค่าเริ่มต้นหลังการเติมเงินครั้งแรก) | ค่าใช้จ่ายในการรันบริการสำหรับ 24 ชั่วโมงถัดไป (VM แบบคิดตามชั่วโมงบวกกับการต่ออายุแบบชำระล่วงหน้าที่จะครบกำหนดใน 24 ชั่วโมง) แต่จะไม่ต่ำกว่า **$5** | ต้นทุน 24 ชั่วโมงปัดเศษขึ้นเป็นจำนวนเต็มดอลลาร์ อย่างน้อยเท่ากับ [minimum top-up](https://nexcmp.com/th/docs/billing/minimum-top-up/) อย่างมากไม่เกิน maximum top-up และวงเงินจำกัดรายวัน | | **Fixed amount** | เกณฑ์ที่ลูกค้ากำหนดเอง ($1 ถึง $500) | จำนวนเงินที่ลูกค้ากำหนดเอง (ตั้งแต่ minimum top-up ถึง $1,000 และมากกว่าเกณฑ์ที่กำหนด) | หากไม่มีบริการที่กำลังทำงานอยู่และอยู่ในโหมด **By usage** จะไม่มีการเรียกเก็บเงิน ยอดเงินคงเหลือที่นำมาเทียบกับเกณฑ์คือ **เงินสดจริงในกระเป๋าเงิน** เครดิตบริการจากโค้ดส่วนลดจะถูกแยกเก็บไว้ต่างหากและไม่นำมานับรวม (ดูที่ [Promotions](https://nexcmp.com/th/docs/billing/promotions/)) ค่าธรรมเนียมจะได้รับการจัดการเหมือนการเติมเงินปกติ: หากเปิด **Customer pays top-up fee** บัตรจะถูกหักเงินตามจำนวนรวมค่าธรรมเนียมและกระเป๋าเงินจะได้รับเงินเต็มจำนวน; หากปิด กระเป๋าเงินจะได้รับเงินจำนวนที่หักค่าธรรมเนียมแล้ว ## กำหนดค่าขีดจำกัดส่วนกลาง {#configure-the-global-limits} 1. เปิด **Finance › Payment channels › Fees & limits** (`/payments/fees`) 2. ในหัวข้อ **Auto top-up (Stripe / PayPal)** ให้ตั้งค่า: | การตั้งค่า | ค่าเริ่มต้น | ช่วง | ความหมาย | |---|---|---|---| | Auto top-up enabled | เปิด | เปิดหรือปิด | การปิดจะหยุดการเรียกเก็บเงินเบื้องหลังทั้งหมดทันที | | เกณฑ์การเติมเงินอัตโนมัติเริ่มต้น (USD, สำรองสำหรับโหมดคงที่) | $5.00 | $0 ถึง $10,000 | ใช้เป็นเกณฑ์เริ่มต้นในโหมด Fixed amount เท่านั้น | | จำนวนครั้งการเติมเงินอัตโนมัติสูงสุดต่อ 24 ชม. ต่อลูกค้าหนึ่งราย | 3 | 1 ถึง 50 | นับรวมความพยายามที่สำเร็จและที่อยู่ระหว่างดำเนินการ | | ขีดจำกัดยอดเติมเงินอัตโนมัติสูงสุดต่อ 24 ชม. ต่อลูกค้าหนึ่งราย (USD) | $500.00 | $0 ถึง $1,000,000 | ยอดรวมของการเรียกเก็บเงินอัตโนมัติภายในช่วงเวลา 1 วันที่ผ่านมา | 3. คลิก **Save Wallet & top-up** ![ส่วนเติมเงินอัตโนมัติของหน้าค่าธรรมเนียมและขีดจำกัด พร้อมสวิตช์ส่วนกลางและขีดจำกัดรายวัน](https://nexcmp.com/th/docs/images/billing/auto-top-up-01-limits.webp) ## สิ่งที่ลูกค้าเห็น {#what-the-customer-sees} 1. ในพอร์ทัล ลูกค้าจะเปิด **Billing** และคลิก **Settings** 2. แผงควบคุมจะแสดงวิธีชำระเงินที่บันทึกไว้, สวิตช์เปิด/ปิด, โหมด (**By usage** หรือ **Fixed amount**), การใช้งานปัจจุบันโดยประมาณ, การเรียกเก็บเงินครั้งถัดไป และ **Recent automatic top-ups** 3. การเปลี่ยนไปใช้โหมด **Fixed amount** จะช่วยให้พวกเขาสามารถระบุเกณฑ์และจำนวนเงินได้ การปิดสวิตช์จะหยุดการเรียกเก็บเงิน ![การตั้งค่าการเรียกเก็บเงินของลูกค้าพร้อมการเติมเงินอัตโนมัติในโหมด By usage และรายการเติมเงินอัตโนมัติล่าสุด](https://nexcmp.com/th/docs/images/billing/auto-top-up-02-portal.webp) ## ตรวจสอบ {#verify} 1. ในฐานะลูกค้าทดสอบ ให้ทำการเติมเงินครั้งแรกด้วยบัตรทดสอบ ([Stripe](https://nexcmp.com/th/docs/billing/stripe/#verify)) เปิด **Billing › Settings**: จะพบว่าการเติมเงินอัตโนมัติเปิดอยู่ 2. รัน VM ขนาดเล็กเพื่อให้มีการใช้งาน และลดค่ายอดเงินคงเหลือให้อยู่ต่ำกว่าเกณฑ์ (ตัวอย่างเช่น ใช้ **Customers › customer › Credit / debit**) 3. ภายในเวลาประมาณ 5 นาที จะมีการเรียกเก็บเงินเกิดขึ้น ในการ์ด **Overview › Payment** ของลูกค้า **Auto top-up history** จะแสดงความพยายามที่มีสถานะเป็น *Done* และมีการส่งการแจ้งเตือน *Top-up received* ## ขีดจำกัดและหมายเหตุ {#limits-notes} - **การหักเงินหนึ่งครั้งต่อหนึ่งรอบการลดลง** หลังจากหักเงินแล้ว งานจะรอจนกว่ายอดคงเหลือจะกลับมาสูงกว่าเกณฑ์หรือสิ้นสุดเวลาที่รอ: 1 ชั่วโมงหลังจากสำเร็จ, 24 ชั่วโมงหลังจากรายการรอดำเนินการ, 30 นาทีหลังจากเกิดข้อผิดพลาดของระบบ - **ขีดจำกัดรายวัน** เมื่อถึงขีดจำกัดรายวันใดๆ จะไม่มีการหักเงินและจะมีการบันทึกบรรทัด *Daily limit reached* (อย่างน้อยที่สุดทุกๆ 6 ชั่วโมง) - **ความล้มเหลว** บัตรที่ถูกปฏิเสธ, บัตรหมดอายุ หรือยอดเงินในบัญชีไม่เพียงพอจะถือเป็นความล้มเหลวของบัตร งานจะลองใหม่อีกครั้งหลังจาก 1 ชั่วโมง, จากนั้น 6 ชั่วโมง และ 24 ชั่วโมง **หลังจากบัตรล้มเหลวติดต่อกัน 3 ครั้ง ระบบจะปิดการเติมเงินอัตโนมัติ** และแจ้งเตือนลูกค้า (*Auto top-up failed*) การชำระเงินที่ต้องมีการยืนยันจากลูกค้า (ตัวอย่างเช่น 3-D Secure) จะไม่นับเป็นความล้มเหลว โดยจะแจ้งให้ลูกค้ายืนยัน - **ไม่มีการหักเงินซ้ำ** การเรียกเก็บเงินแต่ละครั้งจะถูกดำเนินการแบบอะตอมิกต่อการลดลงต่ำกว่าเกณฑ์ และใช้คีย์การทำซ้ำ (idempotency key) ที่เกตเวย์ - **การลบบัตร** จะเป็นการปิดการใช้งานเติมเงินอัตโนมัติ - **ตัวแทนจำหน่าย (Resellers)** หากตัวแทนจำหน่ายใช้ช่องทางการชำระเงินของตนเอง ลูกค้าจะไม่สามารถเปิดใช้งานการเติมเงินอัตโนมัติได้ (HTTP 403 `feature_disabled`) ## การแก้ Problme {#troubleshooting} | อาการ | สาเหตุ | วิธีแก้ปัญหา | |---|---|---| | ลูกค้าไม่สามารถเปิดใช้งานได้: "Top up once with a card or PayPal" | ไม่มีวิธีชำระเงินที่บันทึกไว้ | ทำการเติมเงินผ่านบัตรหรือ PayPal หนึ่งครั้งก่อน | | ข้อผิดพลาด `no_card` (422) | เกตเวย์ที่เลือกไม่มีวิธีชำระเงินที่บันทึกไว้ | เลือกเกตเวย์ที่มีวิธีชำระเงิน หรือบันทึกวิธีชำระเงิน | | ข้อผิดพลาด `invalid_argument` ที่จำนวนเงิน | โหมดคงอยู่นอกช่วงที่อนุญาต | เกณฑ์ $1–$500, จำนวนเงินอยู่ระหว่างการเติมเงินขั้นต่ำและ $1,000, จำนวนเงินมากกว่าเกณฑ์ | | ไม่มีการหักเงินแม้ว่ายอดคงเหลือจะต่ำ | ปิดสวิตช์ส่วนกลาง, ไม่มีบริการที่กำลังทำงานในโหมด By usage, ถึงขีดจำกัดรายวัน หรือการหักเงินครั้งก่อนยังรอดำเนินการอยู่ | ตรวจสอบสวิตช์, ประวัติ และขีดจำกัด | | "ความพยายามล้มเหลวติดต่อกัน N ครั้ง — การเติมเงินอัตโนมัติจะปิดใช้งานหลังจาก 3 ครั้ง" | บัตรล้มเหลวซ้ำๆ | ลูกค้าเปลี่ยนบัตรใหม่ด้วยการฝากเงินครั้งใหม่ | | สถานะ *Needs your confirmation* | ธนาคารต้องการการยืนยัน 3-D Secure | ลูกค้าทำการเติมเงินปกติให้เสร็จสิ้นหนึ่งครั้ง | --- # ใบแจ้งหนี้และบัญชีแยกประเภท {#invoices-and-ledger} > **ตําแหน่งในหน้าผู้ดูแลระบบ:** Finance › Billing (`/billing`) พร้อมด้วยแท็บ Overview, Transactions (`/billing/ledger`), Invoices (`/billing/invoices`), Top-ups (`/billing/deposits`), Payouts (`/billing/payouts`), Vouchers (`/billing/vouchers`) และ Reports (`/billing/reports`). **ตําแหน่งในพอร์ทัล:** Billing (`/billing`). ## What it does {#what-it-does} ทุกยอดเงินใน NexCMP จะถูกจัดเก็บเป็นเซนต์ดอลลาร์สหรัฐและบันทึกเพียงครั้งเดียว แนวคิดหลัก: **สมุดบัญชีวอลเล็ต** คือแหล่งข้อมูลความจริงสําหรับยอดคงเหลือ; ใบแจ้งหนี้, การเติมเงิน และรายงานคือมุมมองที่สร้างขึ้นจากสมุดบัญชีดังกล่าว สมุดบัญชีนี้เป็นแบบ **append-only** (เพิ่มข้อมูลได้อย่างเดียว) — ข้อผิดพลาดจะถูกแก้ไขด้วยการเพิ่มรายการกลับรายการ โดยไม่มีการแก้ไขประวัติย้อนหลัง ## ข้อกำหนด {#requirements} | Item | Requirement | |---|---| | บทบาท | ผู้ดูแลระบบ | | รายละเอียดผู้ขาย | ตั้งค่าชื่อตามกฎหมาย, หมายเลขประจำตัวผู้เสียภาษี, ที่อยู่, อีเมลติดต่อ และคำนำหน้าหมายเลขใบแจ้งหนี้ได้ที่ **System › Settings › General**, แท็บ **Seller & invoicing** (`/settings?tab=seller`), การ์ด **Seller details (printed on invoices)**. | | Dependencies | [Payment channels](https://nexcmp.com/th/docs/billing/payment-channels/) สำหรับเงินที่รับเข้า | ## ส่วนประกอบต่างๆ {#the-pieces} | แท็บผู้ดูแลระบบ | สิ่งที่แสดงรายการ | การใช้งานทั่วไป | |---|---|---| | **Overview** | รายได้ในวันนี้และเดือนนี้ ยอดรวมบัญชีแยกตามประเภท (เงินฝาก, หักเงิน, คืนเงิน, ปรับยอด, บัตรกำนัล), ใบแจ้งหนี้ตามสถานะ, เงินคืนที่รอดำเนินการ, ทางลัด, การใช้จ่ายต่อบริการใน 30 วันล่าสุด | ตรวจสอบประจำวัน | | **Transactions** | บัญชีแยกประเภทกระเป๋าเงิน หนึ่งบรรทัดต่อการเคลื่อนไหว | อธิบายยอดคงเหลือของลูกค้า | | **Invoices** | ใบแจ้งหนี้ และมุมมองที่สอง **Orders** พร้อมการซื้อบริการทุกรายการ | ค้นหาเอกสาร, ส่งซ้ำ, ทำเครื่องหมายว่าชำระแล้ว | | **Top-ups** | การชำระเงินที่ได้รับผ่านเกตเวย์ | ตรวจสอบการชำระเงิน, คืนเงิน | | **Payouts** | การคืนเงินผ่านบัตร, การจ่ายเงินค่าแนะนำ, การถอนเงินของตัวแทนจำหน่าย | อนุมัติเงินออก | | **Vouchers** | รหัสเติมเงิน | ดู [Promotions](https://nexcmp.com/th/docs/billing/promotions/) | | **Reports** | รายได้, แยกตามบริการ, แยกตามตัวแทนจำหน่าย | การบัญชี | ### Transactions (ledger) {#transactions-ledger} คอลัมน์: เวลา, ลูกค้า, **ประเภท**, บริการ, จำนวนเงิน (มีเครื่องหมายบวก/ลบ), VM, อ้างอิง, ผู้ดำเนินการ, บันทึก ตัวกรอง: ประเภท, บริการ, รหัสลูกค้า, ไซต์ (เมื่อคุณมีตัวแทนจำหน่าย), ช่วงวันที่ และลิงก์ VM | ชนิด | ความหมาย | |---|---| | `deposit` | เติมเงินจากเกตเวย์ | | `charge` | เงินที่หักสำหรับบริการ (คำสั่งซื้อ, การต่ออายุ, การใช้งานรายชั่วโมง ...) | | `refund` | เงินที่คืนเข้ากระเป๋าเงิน | | `adjust` | เครดิตหรือเดบิตของผู้ดูแลระบบ และรหัสเติมเงิน (การอ้างอิงเริ่มต้นด้วย `vch:`) — ภาพรวมแสดงบัตรกำนัลเป็นบรรทัดของตัวเอง | ทุกแถวจะมีการอ้างอิง เช่น `dep:stripe:`; การอ้างอิงเดียวกันจะไม่สามารถบันทึกซ้ำได้ ซึ่งเป็นสาเหตุที่เว็บฮุกที่ส่งซ้ำจะไม่สามารถเครดิตซ้ำได้ ใช้ **Customers › List › customer › Credit / debit** เพื่อเพิ่มการปรับยอดด้วยตนเอง: ต้องระบุเหตุผล, จำนวนเงินที่เป็นบวกจะพยายามปลดล็อก VM ที่ถูกล็อกเนื่องจากขาดเงินด้วย และการดำเนินการจะได้รับการยืนยันในสองขั้นตอน ![แท็บ Transactions แสดงแถวบัญชีแยกประเภทกระเป๋าเงินพร้อมประเภท บริการ จำนวนเงิน และการอ้างอิง](https://nexcmp.com/th/docs/images/billing/invoices-and-ledger-01-ledger.webp) ### Invoices {#invoices} ใบแจ้งหนี้จะถูกสร้างขึ้นโดยอัตโนมัติเมื่อลูกค้าซื้อหรือต่ออายุบางสิ่งที่ชำระเงินจากกระเป๋าเงิน หรือสำหรับการเติมเงิน ตัวเลขมีลักษณะดังนี้ `-<000001>` (ตัวอย่างเช่น `NX202610-000042`); ไซต์ตัวแทนจำหน่ายจะใช้คำนำหน้าและลำดับของตนเอง หมายเลขที่มีอยู่จะไม่เปลี่ยนแปลงเมื่อคุณเปลี่ยนคำนำหน้า | ฟิลด์ | ค่า | |---|---| | ชนิด | ใบเสร็จ, การต่ออายุ, เติมเงิน, ด้วยตนเอง, คืนเงิน | | สถานะ | ยังไม่ชำระ, ชำระแล้ว, เกินกำหนด, ยกเลิก, คืนเงินแล้ว | การดำเนินการบนแถว: | การดำเนินการ | ผลลัพธ์ | |---|---| | **View** / **Print** | เปิดใบแจ้งหนี้ พอร์ทัลยังสามารถพิมพ์หรือบันทึกเป็น PDF ได้ | | **Mark paid** (เฉพาะที่ยังไม่ชำระหรือเกินกำหนดเท่านั้น) | ทำเครื่องหมายว่าชำระแล้ว **โดยไม่ต้องเคลื่อนย้ายเงินในกระเป๋าเงิน** — ใช้เมื่อลูกค้าชำระเงินให้คุณนอก NexCMP ต้องระบุเหตุผล สำหรับใบแจ้งหนี้การต่ออายุ ระบบจะขยายเวลาและปลดล็อก VM ที่ถูกล็อกด้วย | | **Cancel** (เฉพาะที่ยังไม่ชำระหรือเกินกำหนดเท่านั้น) | ยกเลิกใบแจ้งหนี้ ต้องระบุเหตุผล | | **Resend** | ส่งอีเมลใบแจ้งหนี้อีกครั้ง | **Create manual invoice** (ปุ่มที่ด้านบนของแท็บ): รหัสลูกค้า, 1 ถึง 50 บรรทัด (คำอธิบาย, จำนวน, ราคาต่อหน่วย), รหัส VM (ไม่บังคับ), จำนวนวันครบกำหนด (0 ถึง 365, ค่าเริ่มต้นคือ 7), หมายเหตุ (ไม่บังคับ) โดยจะถูกสร้างขึ้นในสถานะยังไม่ชำระเงิน และลูกค้าจะเห็นรายการนี้ใน **Billing › Invoice History** ใบแจ้งหนี้บริการที่ยังไม่ได้ชำระจะถูก**หักชำระโดยอัตโนมัติจากกระเป๋าเงิน**ทันทีที่มีเงินเพียงพอ ดังนั้นสิ่งที่ลูกค้าต้องทำจึงมีเพียงแค่การเติมเงินเท่านั้น ### การเติมเงิน (การชำระเงิน) {#top-ups-payments} 1 แถวต่อ 1 การทำรายการ: เวลา, ลูกค้า, **เกตเวย์และวิธีชำระเงิน**, ประเภท (การเติมเงินหรือการเติมเงินอัตโนมัติ), สถานะ (รอดำเนินการ, สำเร็จ, ล้มเหลว, คืนเงิน, โต้แย้ง, ยกเลิก), จำนวนเงินที่ลูกค้าจ่าย, ค่าธรรมเนียม, จำนวนเงินที่เข้ากระเป๋าเงิน, อ้างอิงเกตเวย์ และเวลาที่ทำรายการเสร็จสิ้น การชำระเงินผ่าน Stripe และ PayPal ที่สำเร็จแล้วจะมีปุ่ม **Refund** ให้ใช้งาน คุณสามารถดูเว็บฮุกได้จากหน้าเหตุการณ์เกตเวย์ ([Payment channels](https://nexcmp.com/th/docs/billing/payment-channels/)) ### การจ่ายเงินออก {#payouts} 3 แท็บย่อย: **Card refunds** (อนุมัติหรือปฏิเสธคำขอคืนเงิน ซึ่งคำขอนี้สร้างขึ้นจากการชำระเงินที่สำเร็จแล้ว), **Affiliate payouts** (การถอนเงินค่าคอมมิชชัน) และ **Reseller withdrawals** ทุกการตัดสินใจจะถูกบันทึกประวัติการตรวจสอบ ### รายงาน {#reports} **Revenue** (แนวโน้ม 30 วัน, เปรียบเทียบเป็นรายเดือน, ลูกค้าสูงสุด), **By service** และ **By reseller** ![แท็บ Reports แสดง KPI ของรายได้และแนวโน้มในรอบสามสิบวัน](https://nexcmp.com/th/docs/images/billing/invoices-and-ledger-03-reports.webp) ## สิ่งที่ลูกค้าเห็น {#what-the-customer-sees} ในหน้า **Billing** ลูกค้าจะมีเมนู **Balance**, **Deposit**, **Redeem code**, **Settings** (การเติมเงินอัตโนมัติ) และประวัติการทำรายการที่มีแท็บ **Invoice History**, **Payment Order**, **Ledger** และ **Orders** (บริการทั้งหมดในรายการเดียว พร้อมตัวกรองตามบริการและประเภท) แต่ละใบแจ้งหนี้จะมีปุ่ม **View**, **Print** และ **Save as PDF** โดยยอดเงินจะแสดงเป็น USD และสามารถเลือกแสดงเป็นสกุลเงินที่กำหนดไว้ได้ ## ตรวจสอบ {#verify} 1. ลองทำการเติมเงินจำนวนเล็กน้อยโดยใช้บัญชีลูกค้าทดสอบ 2. **Transactions** จะแสดงรายการ `deposit`, **Top-ups** จะแสดงสถานะการชำระเงินเป็น *Completed* และรายได้ใน **Overview** จะเพิ่มขึ้น 3. ทดลองซื้อบริการ: รายการ `charge` จะปรากฏขึ้น และใน **Invoices** จะแสดงใบแจ้งหนี้ประเภท *Receipt* หรือ *Renewal* พร้อมรายละเอียดผู้ขายที่คุณได้ตั้งค่าไว้ ## ขีดจำกัดและหมายเหตุ {#limits-notes} - **บันทึกแบบเพิ่มข้อมูลเท่านั้น (Append-only)** ไม่สามารถแก้ไขหรือลบรายการในบัญชีแยกประเภทได้ หากต้องการปรับปรุงให้เพิ่มรายการปรับยอดพร้อมระบุเหตุผล - **สกุลเงิน** จำนวนเงินทั้งหมดเป็น USD ส่วนสกุลเงินที่แสดงผลเป็นเพียงการแสดงผลภายนอกเท่านั้น (ดูเพิ่มเติมที่ [Currency and exchange rates](https://nexcmp.com/th/docs/catalog/currency-and-exchange-rates/)) - **Refund to card** มีขั้นตอน 2 ขั้นตอน (ส่งคำขอ จากนั้นรออนุมัติในหน้า Payouts) ส่วน USDT และการโอนผ่านธนาคารจะไม่สามารถคืนเงินไปยังช่องทางเดิมได้ - **ทุกการกระทำจะถูกบันทึกประวัติ** ไว้ที่ System › Logs › Admin actions พร้อมกับเหตุผลที่คุณระบุไว้ - **คำสั่งซื้อเทียบกับใบแจ้งหนี้** การใช้งานแบบรายชั่วโมงจะไม่ถูกออกใบแจ้งหนี้ทุกชั่วโมง แต่ มุมมอง Orders จะจัดกลุ่มข้อมูลเป็นรายวันเพื่อให้คุณยังสามารถตรวจสอบได้ ## การแก้ Problme {#troubleshooting} | อาการ | สาเหตุ | วิธีแก้ปัญหา | |---|---|---| | ยอดเงินคงเหลือของลูกค้าไม่ถูกต้อง | มีการเรียกเก็บเงิน, การปรับยอด หรือคูปองที่คุณไม่ได้คาดคิด | กรองข้อมูลใน **Transactions** ตามรหัสลูกค้าและตรวจสอบหมายเลขอ้างอิงกับหมายเหตุ | | "ใบแจ้งหนี้ได้รับการชำระเงินแล้ว" (409) | พยายามทำเครื่องหมายว่าชำระเงินแล้วบนใบแจ้งหนี้ที่ชำระเงินไปแล้ว | ไม่ต้องดำเนินการใดๆ | | ไม่สามารถยกเลิกใบแจ้งหนี้ได้ | สามารถยกเลิกได้เฉพาะใบแจ้งหนี้ที่ยังไม่ได้ชำระหรือเกินกำหนดชำระแล้วเท่านั้น | สำหรับใบแจ้งหนี้ที่ชำระแล้ว ให้ใช้การคืนเงินหรือการปรับยอดแทน | | ไม่พบรายละเอียดผู้ขายบนใบแจ้งหนี้ | ยังไม่ได้กรอกข้อมูล | กรอกข้อมูล **Seller details** ให้ครบถ้วนใน System › Settings › General › Seller & invoicing | | บัตรเครดิต/เดบิตถูกปฏิเสธ | ยอดเงินเป็นศูนย์หรือมากกว่า $100,000 | ใช้ยอดเงินระหว่าง 1 เซนต์ ถึง $100,000 | | การชำระเงินแสดงสถานะ *Pending* เป็นเวลานาน | เว็บฮุกขาดหายไป | ตรวจสอบที่ **Gateway events** แล้วทำการส่งซ้ำ (replay) | --- # โปรโมชั่น {#promotions} > **ตำแหน่งในหน้าผู้ดูแลระบบ:** Finance › Billing › Vouchers (`/billing/vouchers`). **ตำแหน่งในพอร์ทัล:** Billing › Redeem code (และในเมนู Deposit ด้วย) ## What it does {#what-it-does} **โค้ดเติมเงิน** (คูปอง) คือรหัสลับที่ใช้ได้ครั้งเดียวที่คุณให้กับลูกค้า ขึ้นอยู่กับวิธีที่คุณสร้าง มันสามารถ: | ประเภท | สิ่งที่ลูกค้าได้รับ | ตำแหน่งที่มูลค่าจะเข้า | |---|---|---| | **Bonus credit** สำหรับบริการทั้งหมด | เพิ่มเงินเข้ากระเป๋าเงิน | ยอดคงเหลือในกระเป๋าเงิน ใช้ได้สำหรับทุกอย่าง | | **Bonus credit** สำหรับบริการที่เลือก | เครดิตบริการ | กระเป๋าเงินแยกต่างหากที่ใช้ชำระค่าบริการเหล่านั้นได้เท่านั้น | | **Discount %** | ส่วนลดเปอร์เซ็นต์สำหรับคำสั่งซื้อแรกของบริการที่เลือก | ไม่มีการเติมเครดิต โดยจะนำส่วนลดไปใช้เมื่อชำระเงิน | ใช้สำหรับแคมเปญ เครดิตชดเชย ข้อเสนอพาร์ทเนอร์ หรือส่วนลดคำสั่งซื้อแรก ## ข้อกำหนด {#requirements} | Item | Requirement | |---|---| | บทบาท | ผู้ดูแลระบบ | | ลูกค้า | ลูกค้าแลกโค้ดในขณะที่เข้าสู่ระบบพอร์ทัลแล้ว (ไม่ใช่ในฐานะแขก) ตามค่าเริ่มต้น ลูกค้าต้องยืนยันอีเมลแล้ว | | โค้ด VND | โค้ดที่สร้างในสกุลเงิน VND จะแปลงเป็น USD เมื่อทำการแลกโดยใช้อัตราแลกเปลี่ยนที่บันทึกไว้ (ดู [Currency and exchange rates](https://nexcmp.com/th/docs/catalog/currency-and-exchange-rates/)) | ## สร้างชุดโค้ด {#create-a-batch} 1. เปิด **Finance › Billing › Vouchers** และคลิก **Create vouchers** 2. กรอกแบบฟอร์ม ตัวอย่างค่าจะอยู่ในวงเล็บ | ฟิลด์ | หมายเหตุ | |---|---| | ชื่อชุดโค้ด | 1–80 ตัวอักษร (`Spring welcome`) | | เป้าหมาย | **Main site clients**, **Single reseller's customers** (ต้องมีรายชื่อลูกค้า) หรือ **Reseller wallet** | | ผู้ใช้ที่มีสิทธิ์ | **All in target audience** หรือ **Specified** — อยู่อันดับละหนึ่งอีเมลหรือรหัสลูกค้า สูงสุด 1,000 รายการ สำหรับลูกค้าของตัวแทนจำหน่ายต้องตั้งค่าเป็น *Specified* | | 1 โค้ดต่อเป้าหมาย | หากใช้ *Specified* ระบบจะสร้าง 1 โค้ดต่อลูกค้าที่ระบุ | | ประเภทโค้ด | **Bonus credit** หรือ **Discount %** | | ใช้กับ | เลือกบริการอย่างน้อยหนึ่งรายการ ค่าว่าง = **All services** | | สกุลเงิน มูลค่าหน้าบัตร | USD เริ่มต้น $1.00 หรือ VND เริ่มต้น 10,000 โดยทวีคูณครั้งละ 1,000 (สำหรับโบนัสเครดิตเท่านั้น) | | ส่วนลด (%) | 1 ถึง 100 (สำหรับส่วนลด % เท่านั้น) | | วงเงินส่วนลดสูงสุด (USD) | จำเป็นสำหรับส่วนลด % เริ่มต้น $1.00 และยังเป็นมูลค่าสูงสุดที่คุณอาจเสียไปต่อการแลกหนึ่งครั้ง | | คำสั่งซื้อขั้นต่ำ (USD) | `0` = ไม่มี คำสั่งซื้อแรกต้องมีมูลค่าไม่น้อยกว่าจำนวนนี้ | | จำนวนโค้ด | 1 ถึง 1,000 โค้ดสุ่ม | | การใช้งานต่อโค้ด | 1 ถึง 100,000 `1` หมายถึงหนึ่งคนต่อหนึ่งโค้ด เพิ่มค่านี้สำหรับโค้ดที่ใช้ร่วมกัน | | การใช้งานสูงสุดต่อบัญชี | อย่างน้อย 1 สำหรับส่วนลด % ต้องตั้งเป็น `1` | | เวลาเริ่มต้น (ไม่บังคับ), วันหมดอายุ | วันหมดอายุต้องอยู่หลังวันปัจจุบันและหลังเวลาเริ่มต้น ล่วงหน้าได้ไม่เกิน 2 ปี | | คำนำหน้ารหัส (0–6 ตัวอักษร) | เฉพาะตัวอักษรเท่านั้น หากเว้นว่างจะใช้คำนำหน้าของเว็บไซต์ | | รหัสกำหนดเอง (เฉพาะเมื่อ count = 1) | 6 ถึง 32 ตัวอักษร A–Z และ 0–9 แชร์ง่ายแต่เดาง่าย: ควรกำหนดจำนวนการใช้น้อยๆ | | ต้องยืนยันอีเมล | เปิดใช้งานตามค่าเริ่มต้น | | บันทึกภายใน, เหตุผล | ต้องระบุเหตุผลและจะถูกบันทึกในบันทึกการตรวจสอบ (audit log) | 3. ฟอร์มจะแสดง **ความเสี่ยงสูงสุด** (มูลค่าหน้าบัตร x จำนวนโค้ด x จำนวนครั้งที่ใช้) เพื่อให้คุณทราบกรณีที่แย่ที่สุด คลิก **Generate codes** 4. **คัดลอกโค้ดเหล่านี้ทันที** ระบบจะแสดงเพียงครั้งเดียวเท่านั้น: NexCMP จะจัดเก็บเฉพาะแฮชและตัวอักษร 4 ตัวสุดท้าย ใช้ **Copy all** หรือ **Download CSV**, ทำเครื่องหมายยืนยันและปิดหน้าต่าง ## พฤติกรรมของแต่ละประเภท {#how-each-type-behaves} ### โบนัสกระเป๋าเงิน (ไม่ได้เลือกบริการ) {#wallet-bonus-no-service-selected} กระเป๋าเงินจะได้รับรายการ **ปรับยอด** (ข้อมูลอ้างอิง `vch:...`) ไม่สามารถขอคืนเงินเข้าบัตร ไม่ได้รับค่าคอมมิชชั่นแนะนำ ไม่สร้างใบแจ้งหนี้ และนับเป็นยอดเงินในกระเป๋าเงินสำหรับโควตา โค้ดที่เป็น VND จะใช้อัตราแลกเปลี่ยน ณ ขณะที่แลก ### เครดิตบริการ (เลือกบริการแล้ว) {#service-credit-services-selected} - เครดิตจะอยู่ใน **ช่องแยกต่างหาก** ใช้ชำระค่าบริการที่เลือกเท่านั้น (คำสั่งซื้อใหม่ การต่ออายุ ค่าธรรมเนียมรายชั่วโมงหรือรายวัน การอัปเกรด) และจะถูกใช้ **ก่อน** กระเป๋าเงินหลัก - ไม่สามารถถอน โอน หรือแปลงเป็นเงินสดได้ และจะหมดอายุพร้อมกับโค้ด - บัญชีแยกประเภทจะแสดงยอดชำระเต็มจำนวนบวกกับบรรทัดเครดิตที่ตรงกัน ดังนั้นรายได้ต่อบริการจึงยังคงถูกต้อง ในขณะที่กระเป๋าเงินจะลดลงเฉพาะตามที่ลูกค้าจ่ายจริงเท่านั้น - เครดิตนี้จะ **ไม่** ทำให้ระดับ [quota](https://nexcmp.com/th/docs/billing/quotas/) สูงขึ้น และจะถูกละเว้นโดยระบบ [auto top-up](https://nexcmp.com/th/docs/billing/auto-top-up/) - หากมีการคืนเงินสำหรับรายการที่ชำระด้วยเครดิตหรือส่วนลด ส่วนที่โค้ดจ่ายไปจะถูกหักกลับจากการคืนเงินเข้ากระเป๋าเงินและคืนเข้าสู่ช่องเครดิต ### ส่วนลด % {#discount} 1. ลูกค้าใส่โค้ด: โค้ดจะถูก **เปิดใช้งาน** โค้ดที่เป็นเปอร์เซ็นต์สามารถใช้ได้เพียงครั้งเดียวต่อหนึ่งบัญชีเท่านั้น 2. **การชำระเงินครั้งแรก** ของบริการที่เลือกซึ่งไม่ใช่ค่าธรรมเนียมรายชั่วโมง และมีมูลค่าอย่างน้อยเท่ากับ **ยอดสั่งซื้อขั้นต่ำ** จะได้รับส่วนลดตามเปอร์เซ็นต์ แต่จะไม่เกิน **วงเงินส่วนลดสูงสุด** 3. เซิร์ฟเวอร์จะคำนวณส่วนลดใหม่ ณ เวลาที่คิดเงิน โดยจะละเว้นจำนวนเงินที่แสดงในเบราว์เซอร์ แถวการแลกโค้ดจะถูกบันทึกเมื่อมีการใช้งานโค้ดจริงพร้อมส่วนลดจริง 4. ค่าบริการการใช้งานรายชั่วโมงจะไม่ใช้โค้ดส่วนลดนี้ ## สิ่งที่ลูกค้าต้องทำ {#what-the-customer-does} 1. เปิด **Billing** ในพอร์ทัลแล้วคลิก **Redeem code** หรือใช้ **Have a top-up code?** ในลิ้นชักการฝากเงิน 2. พิมพ์รหัส (ไม่ case-sensitive ขีดกลางใส่หรือไม่ก็ได้) และคลิก **Check** พอร์ทัลจะแสดงสิ่งที่ได้รับ เช่น *Valid code: +$5.00*, *$5.00 credit for VPN* หรือ *20% off voucher for Virtual Machines (up to $5.00)* และ *Valid for orders from $10.00* 3. คลิก **Redeem** และยืนยัน โค้ดแต่ละอันสามารถใช้ได้หนึ่งครั้งต่อบัญชี โค้ดจะผูกติดกับเว็บไซต์: โค้ดจากเว็บไซต์หนึ่งจะ "ไม่ถูกต้อง" บนอีกเว็บไซต์หนึ่ง โดยไม่มีข้อความบอกใบ้ว่ามีอยู่จริงในที่อื่น การเดาผิดจะถูกจำกัดความเร็วและหลังจากเดาผิดหลายครั้ง บัญชีจะถูกล็อกเป็นเวลาสองสามนาที ("เหลือโอกาส N ครั้งก่อนถูกล็อกชั่วคราว") ## ติดตามและระงับ {#track-and-stop} - **Batches** แสดงรายการแต่ละชุดพร้อมสถานะ (*active*, *disabled*, *expired*, *used up*), จำนวนครั้งที่แลกใช้ และวงเงิน เปิดชุดเพื่อดูแท็บ **Codes** (ซ่อนไว้) และ **Redemptions** รวมถึง **Export CSV**. - **Redemptions** แสดงรายการการแลกใช้ทั้งหมดข้ามชุด; **Reseller quotas** แสดงสัดส่วนการใช้วงเงินการออกโค้ดรายเดือนของตัวแทนจำหน่ายแต่ละราย; **Settings** เปิดหรือปิดการใช้งานโค้ดของตัวแทนจำหน่ายและตั้งค่าวงเงินรายเดือนเริ่มต้น - **Disable batch** จะหยุดโค้ดทั้งหมดที่ยังไม่ได้ใช้งาน ส่วนการแลกใช้ที่ทำไปแล้วจะยังคงอยู่ นอกจากนี้ยังสามารถปิดการใช้งานโค้ดทีละรายการได้ ## ตรวจสอบ {#verify} 1. สร้างชุดโค้ด 1 โค้ด: ส่วนลด % 20, สูงสุด $5, คำสั่งซื้อขั้นต่ำ $10, บริการ Virtual Machines. 2. ทำการแลกใช้ในฐานะลูกค้าทดสอบ พอร์ทัลจะแสดงสถานะว่าเปิดใช้งานแล้ว 3. สั่งซื้อ VM ที่มีราคาอย่างน้อย $10 (รอบบิลรายเดือน): ใบแจ้งหนี้จะแสดงส่วนลด (สูงสุด $5) 4. ในชุดโค้ด โค้ดจะแสดงการแลกใช้ 1 ครั้งพร้อมส่วนลดจริง ## ขีดจำกัดและหมายเหตุ {#limits-notes} - โค้ดจะผูกติดกับ **audience** และ **site** ตั้งแต่ตอนสร้าง และไม่สามารถย้ายภายหลังได้ - ตัวแทนจำหน่ายสามารถออกโค้ดให้กับลูกค้าของตนเองได้ภายใต้วงเงินจำกัดรายเดือน ดูเพิ่มเติมที่ [Resellers](https://nexcmp.com/th/docs/customers/resellers/). - สไลด์โปรโมชันในแถบด้านข้างสำหรับลูกค้า (**Marketing › Promo slides**) เป็นฟีเจอร์แยกต่างหากและไม่ได้ให้ส่วนลดใดๆ - เนื่องจากไม่มีการจัดเก็บโค้ดในรูปแบบข้อความธรรมดา จึงไม่สามารถกู้คืนชุดโค้ดที่สูญหายได้: ให้ปิดการใช้งานและสร้างชุดใหม่ ## การแก้ Problme {#troubleshooting} | อาการ | สาเหตุ | วิธีแก้ปัญหา | |---|---|---| | "โค้ดเปอร์เซ็นต์: ใช้ได้หนึ่งครั้งต่อบัญชี" (`percent_one_per_account`) | จำนวนครั้งสูงสุดต่อบัญชีมากกว่า 1 สำหรับส่วนลด % | ตั้งค่าเป็น `1`. | | ฟอร์มแจ้งว่าจำเป็นต้องระบุยอดสูงสุด | ส่วนลด % โดยไม่มีขีดจำกัดส่วนลดสูงสุด | ป้อนอย่างน้อย $1.00. | | ไม่พบลูกค้า | อีเมลหรือ ID ในรายการไม่มีอยู่จริง | แก้ไขรายการ (ข้อความแสดงข้อผิดพลาดจะระบุรายการที่ไม่รู้จัก) | | ลูกค้าแจ้งว่า "โค้ดไม่ถูกต้อง" | ผิดเว็บไซต์ หมดอายุ ถูกปิดการใช้งาน ใช้หมดแล้ว ไม่ใช่ลูกค้าเป้าหมาย หรือยังไม่ได้ยืนยันอีเมล | ตรวจสอบชุดโค้ดและลูกค้า | | เครดิตไม่ได้ถูกใช้งาน | รายการเรียกเก็บเงินเป็นของบริการอื่น | เครดิตใช้ชำระเฉพาะบริการที่เลือกไว้ในชุดโค้ดเท่านั้น | | ไม่ได้ใช้ส่วนลด | คำสั่งซื้อต่ำกว่าขั้นต่ำ ค่าบริการรายชั่วโมง หรือโค้ดถูกเปิดใช้งานสำหรับบริการอื่น | สร้างคำสั่งซื้อแรกที่มีคุณสมบัติตรงตามเงื่อนไข | | ลูกค้าถูกล็อกจากการแลกใช้ | พยายามทำรายการผิดพลาดบ่อยเกินไป | รอจนกว่าการล็อกจะหมดอายุ | --- # โควตา {#quotas} > **ตำแหน่งในหน้าผู้ดูแลระบบ:** Services › Virtual Machines › Policy › Quota tab (`/vm/policy?tab=quota`). ต่อลูกค้า: Customers › List › a customer › Overview (`/customers/`), การ์ด **Quota**. **ตำแหน่งในพอร์ทัล:** Client › Quotas (`/client/quotas`). ## What it does {#what-it-does} โควตาช่วยปกป้องคุณจากการถูกละเมิดโดยบัญชีใหม่: ยิ่งลูกค้าใส่เงินจริงลงในกระเป๋าเงินมากเท่าไหร่ พวกเขาก็ยิ่งสามารถสร้างทรัพยากรได้มากขึ้นเท่านั้น โดยมี 2 ชั้นด้วยกัน: - **ทรัพยากร VM และ Kubernetes**: vCPU, RAM และดิสก์รวม รวมถึงจำนวน VM ระดับ (Tier) คือแพ็กเกจแบบคงที่ของคุณ - **โควตาบริการ**: จำนวน IP, คลาสเตอร์, VPC, พื้นที่จัดเก็บข้อมูล (GB) และอื่น ๆ โดยแบ่งเป็น 5 ระดับ (L0 ถึง L4) ตามยอดเงินที่ฝากไว้ โควต้าจะถูกตรวจสอบ **ก่อน** ที่จะมีการเรียกเก็บเงินใดๆ คำขอที่เกินขีดจำกัดจะถูกปฏิเสธด้วย HTTP 403 `quota_exceeded` และข้อความที่แจ้งให้ลูกค้าทราบว่าต้องเติมเงินเท่าใด ## ข้อกำหนด {#requirements} | Item | Requirement | |---|---| | บทบาท | ผู้ดูแลระบบ | | สวิตช์ | **Enable quota** (`quota_enabled`) จะถูก **ปิด** ไว้เป็นค่าเริ่มต้น ฟังก์ชันด้านล่างทั้งหมดจะไม่ทำงานจนกว่าคุณจะเปิดใช้งาน | | แพ็กเกจแบบคงที่ | ต้องมีแผนที่ไม่ใช่แบบกำหนดเองอย่างน้อยหนึ่งแผน (ดูที่ [Plans](https://nexcmp.com/th/docs/catalog/plans/)) โดยระดับทรัพยากรคือแพ็กเกจแบบคงที่ของคุณ หากไม่มีแผนใด ๆ เลย จะใช้กฎการนับจำนวน VM เท่านั้น | | Dependencies | แถวโควตาบริการจะมีอยู่เฉพาะสำหรับผลิตภัณฑ์ที่เปิดใช้งานในการติดตั้งของคุณเท่านั้น (VPN, IPv6 proxy, Kubernetes, Private Cloud, Images, Object Storage, Dedicated) | ## วิธีการคำนวณฐาน {#how-the-basis-is-calculated} NexCMP ไม่ได้พิจารณาจากการชำระเงินผ่านบัตรเพียงอย่างเดียว **ฐาน (Basis)** คือ **ยอดคงเหลือในกระเปเงินที่บันทึกไว้** ของลูกค้า: การเติมเงินผ่านเกตเวย์, เครดิตจากผู้ดูแลระบบ (**Credit / debit**) และบัตรกำนัลกระเปเงินที่แลกแล้ว จะถูกนับรวมทั้งหมดผ่านทางบัญชีแยกประเภทกระเปเงิน ส่วนส่วนลดคำสั่งซื้อและเครดิตบริการจากรหัสโปรโมชั่นไม่ใช่เงินในกระเปเงินและจะไม่ถูกนำมานับ ฐานสูงสุดที่ลูกค้าเคยทำได้จะถูก **เก็บรักษาไว้** (ต่อไซต์) — การใช้จ่ายหรือการคืนเงินจะไม่ทำให้ระดับที่ปลดล็อกแล้วลดลง ### ทรัพยากร VM และ Kubernetes {#vm-and-kubernetes-resources} 1. ระดับต่างๆ คือแพ็กเกจแบบคงที่ของเว็บไซต์ จัดเรียงตามต้นทุนในการใช้งานเป็นเวลา 24 ชั่วโมง 2. ลูกค้าจะอยู่ในระดับสูงสุดที่มีต้นทุน 24 ชั่วโมงไม่เกินฐานของตน ขีดจำกัดคือ vCPU, RAM และดิสก์ของแผนนั้น ลูกค้าที่ไม่สามารถซื้อแม้กระทั่งแผนที่ถูกที่สุด ก็ยังคงได้รับทรัพยากรของแผนที่ถูกที่สุด 3. การใช้งานที่นำมาคำนวณเทียบกับขีดจำกัด ได้แก่ VM ที่เปิดใช้งานอยู่ทั้งหมด (รวมถึง VM ที่ถูกล็อก), โวลุมข้อมูลที่ซื้อ (แม้ว่าจะถอดการเชื่อมต่ออยู่) รวมถึง Worker และ Control Plane ของ Kubernetes (Worker ก็นับเป็น VM ด้วยเช่นกัน) 4. **จำนวน VM:** สูงสุดไม่เกิน **Max VMs at 24h tier** (ค่าเริ่มต้นคือ 2) ตั้งแต่ VM ถัดไปเป็นต้นไป ยอดคงเหลือในกระเปเงิน *ปัจจุบัน* ของลูกค้าจะต้องครอบคลุม **30 วัน (720 ชั่วโมง)** ของ VM ที่มีอยู่ทั้งหมดรวมถึง VM ใหม่ จนถึง **Max VMs when meeting 30-day threshold** (ค่าเริ่มต้นคือ 10) 5. **การสร้าง VM** ยังต้องมียอดคงเหลืออย่างน้อย **N ชั่วโมง** ของ VM นั้น (**Create VM: balance ≥ N hours**, ค่าเริ่มต้นคือ 2) และยอดคงเหลือขั้นต่ำของแพลตฟอร์มด้วยเช่นกัน 6. การลดขนาด VM จะไม่มีการบล็อกใด ๆ ทั้งสิ้น ระบบจะตรวจสอบเฉพาะส่วนที่มีการเพิ่มขึ้นเท่านั้น ดังนั้น ลูกค้าที่เกินขีดจำกัดดิสก์ก็ยังสามารถเพิ่ม vCPU ได้ หากขีดจำกัด vCPU เอื้ออำนวย ## การกำหนดค่า {#configure} 1. เปิด **Services › Virtual Machines › Policy** และเลือกแท็บ **Quota** 2. เปิดสวิตช์ **Enable quota** 3. ตรวจสอบตัวเลขทั้งสามรายการ (สามารถแก้ไขได้ทั้งหมด): | ฟิลด์ | ค่าเริ่มต้น | ช่วง | |---|---|---| | สร้าง VM: ยอดคงเหลือ ≥ N ชั่วโมง | 2 | 1 ถึง 720 | | Max VMs at 24h tier | 2 | 1 ถึง 100 | | VM สูงสุดเมื่อถึงเกณฑ์ 30 วัน | 10 | 1 ถึง 1000 (ต้องไม่น้อยกว่าฟิลด์ก่อนหน้า) | 4. ในหัวข้อ **Tier-based service quotas** ให้แก้ไขตาราง (ด้านล่าง) 5. คลิก **Save** NexCMP จะขอ **เหตุผล** ซึ่งจะถูกบันทึกลงในบันทึกการตรวจสอบ (audit log) พร้อมกับค่าเดิมและค่าใหม่ การเปลี่ยนแปลงนี้จะมีผลกับลูกค้าทุกคน ![แท็บโควตาพร้อมสวิตช์เปิดใช้งาน, ขีดจำกัด VM และตารางโควตาบริการตามระดับ](https://nexcmp.com/th/docs/images/billing/quotas-01-policy.webp) ### ตารางโควตาบริการ {#service-quota-table} ตารางนี้มี 5 ระดับ เซลล์ส่วนหัว **L0** ถึง **L4** กำหนด **เกณฑ์การฝากเงินเป็นเซนต์**: ค่าเริ่มต้น `0, 1000, 5000, 20000, 100000` หมายถึง L0 สำหรับบัญชีใหม่, L1 จาก $10, L2 จาก $50, L3 จาก $200 และ L4 จาก $1,000 เกณฑ์แรกต้องคงไว้ที่ `0` แต่ละแถวจะกำหนดโควตาของหนึ่งคีย์ต่อหนึ่งระดับ โดย **-1 หมายถึงไม่จำกัด**. | คีย์ | ความหมาย | L0 | L1 | L2 | L3 | L4 | |---|---|---|---|---|---|---| | `vpn.ips` | VPN IPs | 2 | 10 | 30 | 100 | 500 | | `proxy6.ips` | IPv6 proxy IPs | 500 | 2000 | 10000 | 50000 | -1 | | `dedicated.servers` | Bare-metal servers | 1 | 2 | 5 | 20 | 50 | | `s3.storage_gb` | Object Storage GB ที่จัดสรร | 2048 | 4096 | 10240 | 51200 | -1 | | `k8s.clusters` | Kubernetes clusters | 1 | 2 | 5 | 10 | 30 | | `k8s.workers` | Kubernetes worker nodes | 3 | 9 | 18 | 50 | 200 | | `vpc.count` | เครือข่าย Private Cloud | 1 | 2 | 5 | 10 | 30 | | `images.gb` | พื้นที่เก็บข้อมูลอิมเมจกำหนดเอง GB | 50 | 100 | 200 | 500 | 2000 | ตารางนี้ยังแสดงแถวสำหรับผลิตภัณฑ์ที่ยังไม่รวมอยู่ในรุ่นนี้ด้วย ให้คงไว้ตามเดิม คีย์ที่มีผลิตภัณฑ์ที่ถูกปิดใช้งานจะถูกซ่อนและไม่มีการบังคับใช้ ค่าต้องเป็น `-1` หรืออยู่ระหว่าง `0` และ `10,000,000`. โควตาบริการอิงตาม **เกณฑ์ยอดเงิน** เช่นเดียวกับระดับ VM โดยดูจากยอดคง 1 เหลือในกระเป๋าเงินสูงสุดที่ทำได้ ไม่ใช่ยอดรวมจากการชำระเงินผ่านบัตร ลูกค้าตัวแทนจำหน่ายจะใช้ค่าเริ่มต้นเดียวกันและตัวแทนจำหน่ายสามารถดูได้เท่านั้น. ## การกำหนดค่าแทนที่รายลูกค้า {#per-customer-overrides} 1. เปิด **Customers › List** จากนั้นเลือกที่ตัวลูกค้า ใน **Overview** ให้ค้นหาการ์ด **Quota** 2. **ทรัพยากร VM:** คลิก **Quota override** และเลือกหนึ่งในรายการต่อไปนี้ - **ตามยอดเติมเงิน (ลบการกำหนดค่าแทนที่)** — พฤติกรรมเริ่มต้น - **ไม่จำกัด (รวมถึงจำนวน VM)** — ลบขีดจำกัดทั้งหมดสำหรับลูกค้ารายนี้ - **ระดับแพ็กเกจ** — กำหนดเพดานทรัพยากรไว้ที่แพ็กเกจนั้น แต่กฎจำนวน VM ยังคงมีผลอยู่ ป้อนเหตุผล ผู้ดูแลระบบแพลตฟอร์มสามารถกำหนดระดับใดก็ได้ ส่วนการกำหนดค่าแทนที่โดยตัวแทนจำหน่ายต้องไม่เกินเกณฑ์ที่ลูกค้าคงไว้ 3. **บริการ:** ตารางภายใต้ *Service quotas* จะแสดงแต่ละคีย์พร้อมด้วย *In use*, ขีดจำกัดที่มีผล และ *Source* (ระดับหรือการกำหนดค่าแทนที่) คลิก **Edit** บนแถว พิมพ์ **New quota** (`-1` = ไม่จำกัด, ว่างเปล่า = กลับสู่ค่าเริ่มต้นของระดับ) และระบุเหตุผล ![การ์ด Customer Quota พร้อมระดับ, การใช้งานทรัพยากร และตารางโควตาบริการที่มีการกำหนดค่าแทนที่](https://nexcmp.com/th/docs/images/billing/quotas-02-customer.webp) การกำหนดค่าแทนที่ทุกรายการจะถูกบันทึกไว้ในบันทึกการตรวจสอบพร้อมระบุผู้ดูแลระบบ เหตุผล และค่าก่อน/หลังการเปลี่ยนแปลง ## สิ่งที่ลูกค้าเห็น {#what-the-customer-sees} **Client › Quotas** (`/client/quotas`) แสดง **ระดับปัจจุบัน** ของลูกค้า, vCPU, RAM, ดิสก์ และจำนวน VM ที่ใช้และทั้งหมด (แบ่งระหว่าง VM และ Kubernetes), **ยอดเงินในกระเป๋าเงินที่มีสิทธิ์**, **เกณฑ์ทรัพยากรที่ถืออยู่** (จะไม่ลดลงเมื่อใช้งาน) และจำนวนเงินที่ต้องเติมเพื่อไปยังระดับถัดไป แถบเลื่อนช่วยให้ลูกค้าเลือกเป้าหมายระดับและไปที่หน้าจอฝากเงินได้ทันที การ์ด **Service Quotas** แสดงรายการบริการแต่ละรายการพร้อมโควตา, จำนวนที่ใช้, ระดับของตน (L0 ถึง L4), จำนวนเงินที่ต้องฝากเพิ่มสำหรับระดับถัดไป และปุ่ม **Request increase** ที่เปิดแบบร่างตั๋วสนับสนุน ปุ่ม **Quota policy** จะอธิบายกฎระเบียบต่างๆ ![หน้า Portal Quotas ที่แสดงระดับปัจจุบัน, การใช้งานทรัพยากร และโควตาบริการ](https://nexcmp.com/th/docs/images/billing/quotas-03-portal.webp) ## ตรวจสอบ {#verify} 1. เปิดใช้งาน **Enable quota** และใช้ลูกค้าทดสอบรายใหม่ที่มี ยอดคงเหลือ $0 2. ลองสร้าง VM ที่มีขนาดใหญ่กว่าแพ็กเกจที่ถูกที่สุดของคุณ คำขอจะถูกปฏิเสธด้วย `quota_exceeded` และข้อความ "Exceeds the resources of tier ... Top up $X more to unlock tier ...". 3. เติมเงินตามจำนวนที่แสดง ระดับจะเปลี่ยนทันทีและคำขอเดิมจะสำเร็จ 4. ซื้อ VPN IPs ที่เกินขีดจำกัด L0: HTTP 403 `quota_exceeded` พร้อมด้วย `"scope":"service"` และลิงก์ไปยัง `/client/quotas`. 5. ในการ์ด Quota ของลูกค้า ช่อง **Source** จะแสดง *tier*; ให้ตั้งค่าการกำหนดค่าแทนที่และสังเกตว่าเปลี่ยนเป็น *override*. ## ขีดจำกัดและหมายเหตุ {#limits-notes} - **ปิดคือปิด** เมื่อปิด `quota_enabled` กฎเดิม `new_account_max_vms` (**Services › Virtual Machines › Policy › Sales**) จะจำกัดบัญชีใหม่ให้สร้าง VM ได้สูงสุด 2 เครื่องจนกว่ายอดฝากจะถึง $10 เมื่อเปิดใช้งานโควตา กฎดังกล่าวจะไม่มีผลอีกต่อไป. - **VM ที่สร้างโดยแอดมินจะไม่ถูกบล็อก** - **ข้อผิดพลาดจะถูกตั้งค่าให้ล้มเหลวแบบปิด (Fail closed)** หากไม่สามารถอ่านสถานะโควต้าได้ คำขอจะถูกปฏิเสธด้วย `quota_unavailable` แทนที่จะได้รับอนุญาต - **คำขอผ่าน API, CLI และ MCP** ใช้ตัวจัดการเดียวกัน ดังนั้นจึงใช้ขีดจำกัดเดียวกัน - **เครดิตส่งเสริมการขาย** ไม่ได้ช่วยยกระดับเทียร์ (ดู [Promotions](https://nexcmp.com/th/docs/billing/promotions/)) - **เกณฑ์ของเทียร์มีหน่วยเป็นเซนต์** ไม่ใช่ดอลลาร์ ## การแก้ Problme {#troubleshooting} | อาการ | สาเหตุ | วิธีแก้ปัญหา | |---|---|---| | `quota_exceeded`, เหตุผล `resources` | ผลรวม vCPU/RAM/ดิสก์ใหม่เกินกว่าเทียร์กำหนด | เติมเงินตามจำนวนในข้อความหรือตั้งค่าการแทนที่ (override) | | `quota_exceeded`, เหตุผล `vm_30d` | มีจำนวน VM เกินเทียร์ 24 ชม. และยอดเงินในกระเป๋าเงินยังไม่เพียงพอครอบคลุม 30 วันของกลุ่มอินสแตนซ์ | เติมเงินตามจำนวนที่แสดง | | `quota_exceeded`, เหตุผล `vm_max` | ถึงขีดจำกัดสูงสุดของ VM แล้ว | เพิ่มค่า **Max VMs when meeting 30-day threshold** หรือใช้ค่ากำหนดแทนที่ (override) | | `quota_exceeded`, `scope: service` | ถึงขีดจำกัดต่อบริการแล้ว | เพิ่มค่าในตารางหรือแทนที่คีย์นั้นสำหรับลูกค้า | | `quota_unavailable` | ไม่สามารถตรวจสอบสถานะโควต้าได้ | ลองใหม่อีกครั้ง หากยังเกิดปัญหาให้ตรวจสอบบันทึกของเซิร์ฟเวอร์ | | "quota_max_vms_30d must be >= quota_max_vms_24h" เมื่อบันทึก | ค่าสลับกัน | ทำให้ค่า 30 วันมีค่าอย่างน้อยเท่ากับค่า 24 ชั่วโมง | | ลูกค้าแจ้งว่าเทียร์ลดลง | เทียร์ไม่ได้ลดลง เปรียบเทียบ **Held resource basis** กับต้นทุนแพ็กเกจ | ตรวจสอบรายการราคาแพ็กเกจ การขึ้นราคาแพ็กเกจอาจทำให้เกณฑ์เปลี่ยนแปลงได้ | --- # การจัดการลูกค้า {#managing-customers} > **ตำแหน่งในแอดมิน:** Customers › Customers › List (`/customers`), Deletion requests (`/customers/requests`), Service transfers (`/customers/transfers`) และ API keys (`/customers/apikeys`). ## What it does {#what-it-does} พื้นที่ Customers เป็นจุดที่ทีมซัพพอร์ตใช้ค้นหาบัญชี ตรวจสอบกระเป๋าเงิน บริการ ตั๋ว และประวัติการเข้าสู่ระบบ รวมถึงดำเนินการต่างๆ เช่น ล็อก, ปลดล็อก, ยืนยันอีเมล, รีเซ็ตรหัสผ่าน, เพิ่มหรือลดเครดิต, สวมรอยใช้งาน (impersonate), สร้าง VM หรือปิดบัญชี ## ข้อกำหนด {#requirements} | Item | Requirement | |---|---| | บทบาท | ผู้ดูแลระบบ ทุกการดำเนินการเขียนข้อมูลจะต้องระบุเหตุผลและถูกบันทึกในบันทึกการตรวจสอบ (System › Logs › Admin actions) | | อีเมล | อีเมลรีเซ็ตรหัสผ่านและคำเชิญจำเป็นต้องมี [SMTP configuration](https://nexcmp.com/th/docs/administration/smtp-and-emails/) ที่ใช้งานได้ | ## รายชื่อลูกค้า {#the-customer-list} เปิด **Customers › List** ลูกค้าคือบัญชีของไซต์หลักของคุณ บัญชีของตัวแทนจำหน่าย (reseller) จะแสดงขึ้นเช่นกัน และสามารถกรองตามไซต์ได้ ![รายชื่อลูกค้าพร้อมตัวกรองและคอลัมน์ประเทศ แหล่งที่มาของการแนะนำ ยอดคงเหลือ และจำนวน VM](https://nexcmp.com/th/docs/images/customers/managing-customers-01-list.webp) | คอลัมน์ | ความหมาย | |---|---| | **Email** (และชื่อ) | คลิกเพื่อเปิดข้อมูลลูกค้า | | **State** | *Active*, *Locked* หรือ *Deleted* พร้อมกับอีเมลที่ *verified* หรือ *unverified* วางเมาส์เหนือแท็กต์ล็อกเพื่ออ่านเหตุผล | | **Login** | วิธีการเข้าสู่ระบบที่ลูกค้ามี: รหัสผ่าน, Google, GitHub, passkey | | **Country** | ธงและชื่อที่ได้มาจาก **IP address**: ประเทศของ IP ที่ใช้สมัคร หรือหากไม่ทราบ จะใช้ของ IP ที่เข้าสู่ระบบล่าสุด ทูลทิปจะแสดงว่าใช้ตัวเลือกใด | | **Referral source** | *Referral* พร้อมลิงก์ไปยังผู้แนะนำและรหัสแนะนำเมื่อลูกค้าสมัครผ่านลิงก์พันธมิตร; หากไม่ใช่จะแสดง "Not recorded" | | **Balance**, **VMs** | ยอดคงเหลือในวอลเล็ต (ค่าติดลบแสดงด้วยสีแดง) และจำนวน VM ที่กำลังทำงานอยู่ | | **IP ที่ลงทะเบียน / ล่าสุด** | IP ที่ใช้ตอนสมัครสมาชิกและตอนเข้าสู่ระบบล่าสุดพร้อมรหัสประเทศสองตัวอักษร ใช้เพื่อสังเกตบัญชีหลายบัญชีที่มาจากที่อยู่เดียวกัน | | **Tenant** | รหัส Tenant ภายในของลูกค้า | | **Created**, **Last login** | เวลาแบบสัมพัทธ์ | | **Site** | แสดงขึ้นเมื่อคุณมีผู้แทนจำหน่าย (resellers) | **Search** รองรับอีเมล, ชื่อ หรือ IP **ตัวกรอง:** สถานะ (ทั้งหมด, ใช้งานอยู่, ล็อกอยู่, ถูกลบ), วิธีการเข้าสู่ระบบ (ใดๆ, Google, GitHub, passkey, ยังไม่มีรหัสผ่าน) และไซต์ ตัวกรองจะถูกบันทึกไว้ใน URL ดังนั้นรายการที่กรองแล้วจึงสามารถคั่นหน้าเว็บหรือแชร์ให้เพื่อนร่วมงานได้ **การเรียงลำดับเป็นแบบสากล** การคลิกที่ส่วนหัวของ *Email*, *State*, *Balance*, *VMs*, *Created* หรือ *Last login* จะเป็นการเรียงลำดับฐานลูกค้าราย **ทั้งหมด** บนเซิร์ฟเวอร์ ไม่ใช่แค่หน้าท่ีกำลังดูอยู่ และหมายเลขหน้าจะกลับไปที่ 1 **รายการจะอัปเดตโดยอัตโนมัติ** ระบบจะรีเฟรชทุกๆ สองสามวินาทีขณะที่คุณดูอยู่ (จะหยุดชั่วคราวขณะที่กล่องโต้ตอบเปิดอยู่หรือขณะที่คุณกำลังพิมพ์) ดังนั้นการลงทะเบียนใหม่และการเปลี่ยนแปลงยอดคงเหลือจึงปรากฏขึ้นโดยไม่ต้องโหลดซ้ำ หน้าลูกค้าจะรีเฟรชประมาณทุก 30 วินาทีขณะที่เปิดดูอยู่ โดยแต่ละแท็บจะโหลดข้อมูลของตัวเองเมื่อเปิดครั้งแรก ### สร้างลูกค้า {#create-a-customer} 1. คลิก **Create customer** 2. ป้อน **e-mail**, **display name** (ไม่บังคับ), **password** (ไม่บังคับ = ลูกค้ากำหนดเองผ่านลิงก์เชิญ) และเลือกว่าจะ **send the invitation e-mail** หรือไม่ 3. ยืนยัน บัญชีที่สร้างด้วยตนเองจะถือว่าได้รับการยืนยันแล้วเมื่อคุณส่งคำเชิญ ## หน้าของลูกค้า {#a-customer-s-page} คลิกที่แถว หน้านี้มี 8 แท็บ โดยแท็บที่เลือกจะถูกเก็บไว้ใน URL เพื่อให้คุณสามารถบุ๊กมาร์กได้ แท็บจะโหลดเมื่อเปิดครั้งแรกและคงสถานะเดิมไว้เมื่อคุณสลับไปแท็บอื่น | แท็บ | เนื้อหา | |---|---| | **Overview** | ข้อมูลระบุตัวตน ข้อมูลการลงทะเบียนและการเข้าสู่ระบบล่าสุด สรุปข้อมูลกระเป๋าเงินและบริการ | | **Services** | ตารางเดียวสำหรับบริการของลูกค้า พร้อมตัวกรองประเภทและสถานะ การค้นหา การเรียงลำดับฝั่งเซิร์ฟเวอร์ และการแบ่งหน้า | | **Billing** | กระเป๋าเงินและเครดิต บัญชีแยกประเภท ใบแจ้งหนี้ การชำระเงิน การคืนเงิน วิธีการชำระเงินที่บันทึกไว้ และการเติมเงินอัตโนมัติ | | **Quota** | ขีดจำกัดและการแทนที่ทรัพยากร โปรดดู [Quotas](https://nexcmp.com/th/docs/billing/quotas/) | | **Security** | เซสชัน การยืนยันตัวตน วิธีการเข้าสู่ระบบ ประวัติการเข้าสู่ระบบ และ API keys โปรดดู [API keys](https://nexcmp.com/th/docs/developers/api-keys/) | | **Support** | ทิกเก็ตล่าสุด | | **Affiliate** | สถานะโปรแกรมแนะนำเพื่อน | | **Log** | ประวัติการตรวจสอบและกิจกรรม | ปุ่มการดำเนินการส่วนหัว (ซ่อนสำหรับบัญชีที่ถูกลบ): | ปุ่ม | What it does | |---|---| | **Lock account** / **Unlock** | บล็อกการลงชื่อเข้าใช้และการเข้าถึง API นอกจากนี้ยังสามารถเลือกหยุด VM ทั้งหมดได้ (โดยไม่ต้องลบ) บริการแบบชำระเงินล่วงหน้าที่ไม่ใช่ VM (Kubernetes, Private Cloud, VPN และอื่นๆ) จะถูกหยุดเช่นกัน VM ที่ถูกล็อกโดยผู้ดูแลระบบจะต้องถูกเปิดใช้งานแยกต่างหากบนหน้า VM | | **Verify email** | ทำเครื่องหมายว่าอีเมลได้รับการยืนยันแล้วโดยที่ลูกค้าไม่ต้องคลิกลิงก์ | | **Send reset link** | ระบบจะส่งลิงก์รีเซ็ตรหัสผ่านทางอีเมล (ใช้งานได้ 1 ชั่วโมง ใช้ได้ครั้งเดียว) หากไม่ได้กำหนดค่า SMTP ลิงก์จะแสดงขึ้นมาครั้งเดียวเพื่อให้คุณส่งด้วยตนเอง ผู้ดูแลระบบจะไม่มีทางเห็นรหัสผ่าน | | **Impersonate** | เข้าสู่ระบบในฐานะลูกค้ารายนั้นเป็นเวลาหนึ่งชั่วโมง ดูที่ [Log in as a customer](https://nexcmp.com/th/docs/customers/login-as/) | | **Credit / debit** | เพิ่มหรือลดเงินในวอลเล็ตด้วยการปรับปรุงบัญชีแยกประเภท ดูที่ [Invoices and ledger](https://nexcmp.com/th/docs/billing/invoices-and-ledger/) | | **Revoke sessions** | ออกจากระบบของลูกค้ารายนี้จากทุกอุปกรณ์ โทเค็นแอปทั้งหมดจะหยุดทำงาน | | **Create VM** | สร้าง VM ให้แก่ลูกค้า | | **Soft delete** | ปิดบัญชี คุณต้องพิมพ์อีเมลเพื่อยืนยัน | ### จัดการบริการแต่ละรายการ {#manage-an-individual-service} เปิดแท็บ **Services** ของลูกค้า ค้นหาบริการตามชื่อ, ID, IP หรือการกำหนดค่า แล้วใช้การดำเนินการของแถวนั้น การดำเนินการเดียวกันนี้ยังมีให้ใช้งานในรายการผู้ดูแลระบบของบริการนั้นด้วย โดยกล่องโต้ตอบจะแสดงเฉพาะการดำเนินการที่บริการนั้นและสถานะปัจจุบันรองรับเท่านั้น | การดำเนินการ | ผลลัพธ์ | |---|---| | **Lock** | หยุดบริการโดยยังคงเก็บข้อมูลไว้ ลูกค้าจะเห็นบริการอยู่ในสถานะล็อกและไม่สามารถดำเนินการใดๆ ได้ การเติมเงินจะไม่ปลดล็อกที่ตั้งโดยผู้ดูแลระบบ และการต่ออายุอัตโนมัติจะถูกบล็อกขณะที่ถูกล็อก | | **Unlock** | ยกเลิกการล็อกของผู้ดูแลระบบ ทั้งนี้จะไม่ปลดการล็อกเนื่องจาก abuse หรือการล็อกเพื่อการป้องกันอื่นๆ ที่ไม่เกี่ยวข้อง | | **Cancel without refund** | ยกเลิกบริการโดยไม่มีการบันทึกการคืนเงินในบัญชีแยกประเภท การยืนยันจะมีคำเตือนว่าการยกเลิกไม่สามารถเรียกคืนได้ | | **Cancel and refund** | แสดงการชำระเงินเดิม การจัดสรรกระเป๋าเงิน/เครดิต การคืนเงินก่อนหน้า และจำนวนเงินคืนสูงสุด ตรวจสอบจำนวนเงินก่อนยืนยัน | ระบุเหตุผลสำหรับการดำเนินการทุกครั้ง เหตุผลนี้มีไว้สำหรับผู้ดูแลระบบ ส่วนลูกค้าจะได้รับข้อความแจ้งเตือนหรือบันทึกเหตุการณ์การบริการตามปกติ เงินที่คืนเข้าวอลเล็ตจะกลับเข้าสู่วอลเล็ต และเครดิตหรือโควตาโปรโมชันจะกลับคืนสู่เครดิต การดำเนินการนี้จะไม่ส่งเงินคืนผ่าน Stripe การโอนเงินผ่านธนาคาร หรือ PayPal สำหรับบริการประเภทเดียวกันหลายรายการ ให้เลือกได้สูงสุด 50 แถวและเลือกการดำเนินการแบบกลุ่ม ผลลัพธ์จะแสดงความสำเร็จหรือความล้มเหลวของแต่ละแถว การคืนเงินแบบกลุ่มจะใช้จำนวนเงินที่แนะนำของแต่ละบริการ บริการที่มียอดคืนเงินที่แนะนำเป็นศูนย์จะถูกข้ามในโหมดการคืนเงิน และจำเป็นต้องตรวจสอบทีละรายการหรือยกเลิกโดยไม่คืนเงิน DDoS Shield ดิสก์ และ Backups เป็นแถวแบบอ่านอย่างเดียวในที่นี้ ส่วนเสริม Bandwidth จะขึ้นอยู่กับบริการหลัก การเข้าถึง AI Models สามารถล็อกได้ แต่ไม่มี subscription ให้ยกเลิก หากต้องการล็อกเซิร์ฟเวอร์ Bare Metal ที่เช่าไว้ ให้ดำเนินการที่ subscription แทน order ### การปิดบัญชี (การลบแบบซอฟต์เดลีท) {#closing-an-account-soft-delete} บัญชีจะถูกตั้งสถานะเป็น *deleted* ถูกบล็อก เซสชันทั้งหมดจะถูกเพิกถอน และค่าคอมมิชชั่นแนะนำเพื่อนที่ยังไม่ได้รับจะถูกยกเลิก ใบแจ้งหนี้และบัญชีแยกประเภทจะยังคงอยู่เพื่อการทำบัญชี การดำเนินการนี้จะถูกปฏิเสธหากลูกค้ายังมี **บริการที่ยังใช้งานอยู่** (VM, Kubernetes, Private Cloud, Dedicated, VPN, IPv6 proxy) บัญชี S3 หรือมีการใช้งาน S3 ที่ยังไม่ได้ชำระเงิน กรุณาลบสิ่งเหล่านี้ก่อน ## คำขอการลบบัญชี {#deletion-requests} ลูกค้าสามารถขอให้ลบบัญชีได้จากหน้าบัญชีของตนเอง คำขอจะปรากฏภายใต้ **Customers › Deletion requests** (ตัวกรองเริ่มต้น: รอดำเนินการ) พร้อมระบุข้อมูลลูกค้า เหตุผล จำนวน VM ที่ใช้งานอยู่ ยอดคงเหลือ และเวลาที่ขอ - **Approve deletion** จะทำได้ก็ต่อเมื่อลูกค้าไม่มี VM ที่ใช้งานอยู่ พิมพ์อีเมลเพื่อยืนยัน บัญชีจะถูกลบแบบซอฟต์เดลีท **ยอดเงินคงเหลือในวอลเล็ตจะไม่ได้รับเงินคืนโดยอัตโนมัติ** — หากคุณมีหนี้ที่ต้องคืน โปรดสร้างรายการคืนเงินก่อน - **Reject** จำเป็นต้องระบุเหตุผล ## การโอนย้ายบริการ {#service-transfers} **Customers › Service transfers** จะแสดงรายการคำขอเพื่อย้าย **VM หรือการสมัครใช้งาน VPN** จากบัญชีหนึ่งไปยังอีกบัญชีหนึ่ง **บนเว็บไซต์เดียวกัน** - หน้าจอนี้เป็นแบบอ่านและสร้างได้เท่านั้น: คุณสามารถสร้างคำขอในนามของลูกค้าหรือยกเลิกคำขอได้ จงใจ **ไม่มี** ปุ่มอนุมัติสำหรับเจ้าของหรือผู้รับ - ขั้นตอน: เจ้ายืนยันผ่านลิงก์อีเมลแบบใช้ครั้งเดียว (ใช้งานได้ 30 นาที พร้อมรหัส TOTP หากเปิดใช้งานอยู่) จากนั้นผู้รับจะเข้าสู่ระบบและกดยอมรับ (ผู้รับจะเป็นผู้รับภาระผูกพันในการชำระเงินต่อ) คำขอที่ไม่ได้รับการยอมรับภายใน 7 วันจะหมดอายุ - กฎ: บริการต้องใช้งานอยู่ ไม่มีใบแจ้งหนี้ที่ค้างชำระ และไม่มีงานที่กำลังทำงานอยู่ ผู้รับต้องเป็นลูกค้าที่ใช้งานอยู่และยืนยันอีเมลแล้วบนเว็บไซต์เดียวกัน การโอน VM จะลบ SSH key และปิดการต่ออายุอัตโนมัติ ส่วนการโอน VPN จะเปลี่ยนรหัสผ่านการเชื่อมต่อ - ใบแจ้งหนี้ที่ออกไปแล้วจะยังคงอยู่กับเจ้าของเดิม ผู้รับรายใหม่สามารถดูประวัติการเรียกเก็บเงินของบริการโดยจะซ่อนข้อมูลของเจ้าของเดิมไว้ - ลูกค้าสามารถสร้างคำขอของตนเองได้ที่ **Transfers** ในพอร์ทัล (จำกัด 5 คำขอต่อชั่วโมงและมีคำหน้าที่เปิดอยู่ได้สูงสุด 3 คำขอ) ## ตรวจสอบ {#verify} 1. สร้างลูกค้าพร้อมกับส่งอีเมลเชิญ บัญชีใหม่จะปรากฏขึ้นที่ด้านบนสุดของรายการภายในไม่กี่วินาที 2. เรียงลำดับตาม **Balance**: ลำดับจะครอบคลุมลูกค้าทั้งหมด 3. ล็อกลูกค้า: ป้ายสถานะจะเปลี่ยนเป็น *Locked* และลูกค้าจะไม่สามารถเข้าสู่ระบบได้อีกต่อไป ปลดล็อกได้ ## ขีดจำกัดและหมายเหตุ {#limits-notes} - คอลัมน์ประเทศเป็นเพียงแนวทางที่อ้างอิงจาก IP ไม่ใช่เครื่องยืนยันถิ่นที่อยู่ ที่อยู่ส่วนตัวหรือที่ไม่ทราบจะไม่แสดงประเทศ - การล็อกบัญชีจะไม่คืนเงินใดๆ และจะไม่ลบ VM เว้นแต่คุณจะเลือกหยุดการทำงานด้วย - การปลดล็อกบัญชีจะไม่ปลดล็อก VM ที่ผู้ดูแลระบบเป็นคนล็อกไว้ คุณต้องเปิดใช้งานแยกต่างหากในหน้า VM ## การแก้ Problme {#troubleshooting} | อาการ | สาเหตุ | วิธีแก้ปัญหา | |---|---|---| | "ลูกค้ายังมีบริการที่ใช้งานอยู่ ... โปรดหยุดหรือลบก่อน" | ลูกค้ารายนี้มีบริการอยู่หรือมีบัญชี S3 | ลบรายการเหล่านั้นออก แล้วค่อยทำการลบแบบ Soft delete | | ข้อความยืนยันการลบแจ้งว่า "N VMs alive" | สาเหตุเดียวกัน | ลบ VM ออกก่อน | | แสดงลิงก์รีเซ็ตแทนที่จะเป็น "e-mail queued" | ยังไม่ได้กำหนดค่า SMTP | กำหนดค่าอีเมล หรือส่งลิงก์ให้ด้วยตนเอง | | ไม่สามารถลบวิธีการเข้าสู่ระบบออกได้ (`last_login_method`) | เป็นวิธีเดียวที่ลูกค้าใช้เข้าสู่ระบบ | เพิ่มวิธีการอื่นก่อน | | การล็อกไม่สามารถหยุดบริการประเภทพรีไพย์ (Prepaid) ได้ | มีรายงานข้อผิดพลาดในการหยุดการทำงาน | อ่านข้อความหลังจากล็อก ระบบจะพยายามหยุดการทำงานให้อัตโนมัติ | | ไม่สามารถสร้างรายการโอนย้ายได้ | มีใบแจ้งหนี้ค้างชำระ มีงานที่กำลังทำงานอยู่ หรือผู้รับอยู่คนละไซต์หรือยังไม่ได้ยืนยันตัวตน | แก้ไขเงื่อนไขดังกล่าวแล้วลองใหม่อีกครั้ง | --- # เข้าสู่ระบบในฐานะลูกค้า {#log-in-as-a-customer} > **ตำแหน่งใน admin:** Customers › Customers › List › a customer › header button **Impersonate** (`/customers/`). ## What it does {#what-it-does} **Impersonate** (เข้าสู่ระบบแทน) ช่วยให้ผู้ดูแลระบบฝ่ายสนับสนุนสามารถมองเห็นพอร์ทัลในมุมมองเดียวกับลูกค้า เพื่อจำลองปัญหาหรือช่วยเหลือเรื่องคำสั่งซื้อ เซสชันนี้จะมีอายุหนึ่งชั่วโมงและแยกออกจากเซสชันปกติอย่างชัดเจน โดยการกระทำใดๆ ที่อาจให้สิทธิ์เข้าถึงบัญชีอย่างถาวรจะถูกบล็อก และทุกการใช้งานจะถูกบันทึกประวัติไว้ ## ข้อกำหนด {#requirements} | Item | Requirement | |---|---| | บทบาท | ผู้ดูแลระบบที่เข้าสู่ระบบคอนโซลผู้ดูแลระบบ | | ลูกค้า | บัญชีต้องมีสถานะ **active** หากบัญชีถูกล็อกหรือถูกลบ ระบบจะตอบกลับว่า "account is not active" (HTTP 409) | | เหตุผล | จำเป็นต้องระบุเหตุผลและจะถูกบันทึกไว้ในบันทึกการตรวจสอบ (Audit log) | | เบราว์เซอร์ | อนุญาตป๊อปอัปสำหรับที่อยู่ของผู้ดูแลระบบ: พอร์ทัลจะเปิดขึ้นในหน้าต่างใหม่ | ## ขั้นตอน {#steps} 1. เปิดไปที่ **Customers › List** แล้วคลิกที่ลูกค้า 2. คลิกที่ **Impersonate** จะมีหน้าต่างข้อความอธิบายว่าไซต์ของลูกค้าจะถูกเปิดขึ้นในฐานะลูกค้ารายนั้นเป็นเวลาหนึ่งชั่วโมง และการดำเนินการทุกอย่างจะถูกบันทึกตรวจสอบ 3. พิมพ์ **เหตุผล** (ตัวอย่างเช่น "Ticket 1234 — ไม่สามารถสร้าง VM ได้") แล้วคลิก **Open app** 4. หน้าต่างใหม่จะเปิดขึ้นที่ไซต์ของลูกค้าและแสดงแดชบอร์ดพร้อม `?impersonated=1` หากเบราว์เซอร์บล็อกหน้าต่างดังกล่าว โปรดอนุญาตป๊อปอัปแล้วคลิกใหม่อีกครั้ง ![หน้าต่าง Impersonate ที่กรอกข้อมูลช่องเหตุผลเรียบร้อยแล้ว](https://nexcmp.com/th/docs/images/customers/login-as-01-dialog.webp) สำหรับลูกค้าของผู้จัดจำหน่าย (Reseller) หน้าต่างจะเปิดขึ้นบน **โดเมนของผู้จัดจำหน่ายเอง** เนื่องจากลิงก์จะใช้งานได้บนไซต์ของลูกค้าเท่านั้น ## วิธีการทำงาน {#how-it-works} 1. การดำเนินการของผู้ดูแลระบบจะสร้าง **โทเค็นแบบใช้งานครั้งเดียว** ที่มีอายุการใช้งานหนึ่งชั่วโมง และบันทึก `customer.login_as` (ผู้ดูแลระบบ, ไอพี, เหตุผล, ไซต์) ลงในบันทึกการตรวจสอบ 2. หน้าต่างใหม่จะเปิดขึ้น `https:///v1/portal/impersonate/` คำขอแรกจะแสดงเพียงหน้าขนาดเล็กและ **ไม่** ใช้โทเค็นดังกล่าว (เพื่อป้องกันไม่ให้เบราว์เซอร์ดึงข้อมูลล่วงหน้าทำให้โทเค็นหมดอายุ) จากนั้นหน้าดังกล่าวจะทำการยืนยันด้วยคำขอแบบ POST 3. คำขอแบบ POST จะทำการใช้โทเค็นนั้น หากมีการใช้งานครั้งที่สองหรือใช้งานหลังจากผ่านไปหนึ่งชั่วโมง ระบบจะตอบกลับว่า "The impersonation link has expired or was already used" 4. NexCMP จะสร้างเซสชันลูกค้าที่มีอายุ **หนึ่งชั่วโมง** (เซสชันปกติมีอายุ 30 วัน) บันทึกรายการเข้าสู่ระบบด้วยวิธี `impersonate` และบันทึก `customer.login_as.used` 5. โทเค็นนี้ใช้งานได้เฉพาะบนไซต์ของลูกค้าเท่านั้น หากใช้งานบนโฮสต์อื่นจะแสดงข้อผิดพลาด 404 ## สิ่งที่จะถูกบล็อกในเซสชันสวมรอย {#what-is-blocked-in-an-impersonated-session} การกระทำใดๆ ที่ให้สิทธิ์การเข้าถึงเกินกว่าหนึ่งชั่วโมง หรือเปลี่ยนแปลงความปลอดภัยของลูกค้าเอง จะส่งค่ากลับเป็น HTTP 403 `impersonate_forbidden`: | ถูกบล็อก | เหตุผล | |---|---| | เปลี่ยนรหัสผ่าน, TOTP, เชื่อมต่อหรือยกเลิกการเชื่อมต่อ Google/GitHub, แก้ไข passkeys | ข้อมูลรับรองของลูกค้าเอง | | ลบบัญชี | ไม่สามารถย้อนกลับได้ | | สร้างหรือแก้ไข **API keys** | การเข้าถึงระยะยาว | | อนุมัติการเข้าสู่ระบบ CLI, เดสก์ท็อป หรือ MCP (ลิงก์อุปกรณ์) | การเข้าถึงระยะยาว | | สร้างการเข้าถึง Kubernetes, S3 keys, SSH keys, รหัสผ่าน root, ลิงก์แชร์คอนโซล, ข้อมูลรับรอง VPN หรือพร็อกซี | ข้อมูลลับที่มีอายุเกินกว่าเซสชัน | | แลกโค้ดเติมเงิน | แคมเปญเงิน | | ถอนหรือเปลี่ยนการจ่ายค่าคอมมิชชันพาร์ทเนอร์ | เงินออกจากระบบ | | แก้ไข AI keys, งบประมาณ หรืออีเมลแจ้งเตือน | การกำหนดค่าของลูกค้า | ทุกอย่างนอกเหนือจากนี้ใช้งานได้ปกติ: คุณสามารถอ่านหน้าต่างๆ สร้างหรือจัดการ VM สั่งซื้อ และอื่นๆ การดำเนินการจะทำงานภายใต้ตัวตนของลูกค้าและใช้เงินของลูกค้า รายการบันทึกการตรวจสอบด้านบนคือสิ่งที่แสดงว่ามีผู้ดูแลระบบอยู่เบื้องหลังเซสชันนั้น ## ตรวจสอบ {#verify} 1. สวมรอยเป็นลูกค้าทดสอบ พอร์ทัลจะเปิดขึ้นและแสดงข้อมูลของลูกค้ารายนั้น 2. ลองเปลี่ยนรหัสผ่าน: คุณจะได้รับข้อความ "forbidden" (การสวมรอย) 3. ใน **System › Logs › Admin actions** ให้ค้นหา `customer.login_as` ที่มีชื่อของคุณ เหตุผล และไซต์ ตามด้วย `customer.login_as.used` 4. ปิดหน้าต่างแล้วเปิดลิงก์เดิมซ้ำ: "link expired or already used" ## ขีดจำกัดและหมายเหตุ {#limits-notes} - ขีดจำกัดหนึ่งชั่วโมงเป็นค่าคงที่ (3600 วินาที) หากต้องการดำเนินการต่อ ให้สวมรอยใหม่อีกครั้ง - เน้นการอ่านและทำซ้ำ หลีกเลี่ยงการดำเนินการที่ใช้เงินเว้นแต่ลูกค้าจะร้องขอ - เพิกถอนเซสชันก่อนกำหนดด้วย **Revoke sessions** บนหน้าลูกค้า (การดำเนินการนี้จะออกจากระบบของลูกค้าด้วย) - พาร์ทเนอร์มีระบบสวมรอย **Sign in to partner console** ของตนเอง (60 นาที) จากเมนู Resellers ดูรายละเอียดที่ [Resellers](https://nexcmp.com/th/docs/customers/resellers/) ## การแก้ Problme {#troubleshooting} | อาการ | สาเหตุ | วิธีแก้ปัญหา | |---|---|---| | "บัญชีไม่ใช้งาน" | บัญชีถูกล็อกหรือถูกลบ | ปลดล็อกก่อน หรือดูที่หน้าลูกค้าแทน | | เบราว์เซอร์บล็อกหน้าต่าง | ตัวบล็อกป๊อปอัป | อนุญาตป๊อปอัปสำหรับที่อยู่ผู้ดูแลระบบแล้วลองใหม่อีกครั้ง | | "ลิงก์หมดอายุหรือถูกใช้งานแล้ว" | เกินขีดจำกัดหนึ่งชั่วโมงหรือมีการใช้ซ้ำ | สวมรอยใหม่อีกครั้ง | | เปิดขึ้นมาเป็น "Not found" | ลิงก์ถูกใช้บนโฮสต์ที่ไม่ถูกต้อง | ใช้หน้าต่างที่เปิดจากไดอะล็อก ห้ามวางลิงก์ที่อื่น | | การดำเนินการแสดงข้อความ "forbidden" | ถูกบล็อกในเซสชันสวมรอย | ขอให้ลูกค้าดำเนินการ หรือใช้หน้าจอผู้ดูแลระบบ | --- # Resellers (ไวท์ลาเบล) {#resellers-white-label} > **ตำแหน่งในส่วนผู้ดูแล:** Customers › Resellers › List (`/resellers`), Domains & SSL (`/resellers/domains`), Permissions & wholesale (`/resellers/entitlements`), Defaults (`/resellers/settings`) ช่องตัวแทนจำหน่าย: System › Admin › License & updates (`/license`) ## What it does {#what-it-does} **ตัวแทนจำหน่าย** จะได้รับพอร์ทัลลูกค้าที่ปรับแต่งแบรนด์บน **โดเมนของตนเอง**, พร้อมด้วยลูกค้า, วอลเล็ต, ราคา และ (ถ้ามี) ช่องทางการชำระเงินของตนเอง พวกเขาซื้อจากคุณในราคาขายส่งและขายในราคาของตนเอง ลูกค้าของพวกเขาจะไม่เห็นแบรนด์ของคุณ และโดเมนของตัวแทนจำหน่ายจะไม่สามารถเปิดคอนโซลผู้ดูแลระบบของคุณได้ ตัวแทนจำหน่ายดำเนินธุรกิจจาก **คอนโซลพาร์ทเนอร์** ที่ `https://partner.` ## ข้อกำหนด {#requirements} | Item | Requirement | |---|---| | ไลเซนส์ | หนึ่ง **ช่องโดเมนตัวแทนจำหน่าย** บนไลเซนส์ของคุณสำหรับโดเมนตัวแทนจำหน่ายที่กำหนดเองแต่ละโดเมน หน้าไลเซนส์จะแสดงช่อง `used/max` และลิงก์สำหรับซื้อเพิ่ม หากไม่มีช่องว่างเหลือ การเพิ่มโดเมนจะล้มเหลวด้วยข้อความ "Out of license reseller domain slots" | | DNS | โดเมนตัวแทนจำหน่ายแต่ละโดเมนต้องชี้ไปยังเซิร์ฟเวอร์ของคุณ (ดูด้านล่าง) | | เว็บเซิร์ฟเวอร์และ TLS | ชื่อโฮสต์ต้องเข้าถึงแผง NexCMP ผ่านรีเวิร์สพร็อกซีของคุณพร้อมใบรับรองที่ถูกต้องสำหรับชื่อนั้น | | อีเมล | กำหนดค่า SMTP สำหรับอีเมลเชิญและอีเมลแจ้งเตือน | | สวิตช์หลัก | **Reseller settings › General › `rs_enabled`** ถูกเปิดใช้งานเป็นค่าเริ่มต้น | ## เตรียมโครงสร้างพื้นฐาน {#prepare-the-infrastructure} 1. กำหนดที่อยู่สาธารณะของเซิร์ฟเวอร์: แอดเดรส IPv4 และหากคุณต้องการใช้ CNAME ให้ระบุชื่อโฮสต์ที่ชี้ไปยังแอดเดรสนั้น (เช่น `sites.cloud.example.com`) 2. เปิด **Customers › Resellers › Defaults** (`/resellers/settings`), กลุ่ม **Domains & SSL**, และตั้งค่า: | คีย์ | ความหมาย | |---|---| | `rs_server_ipv4` | IPv4 สาธารณะที่เรคคอร์ด A ของตัวแทนจำหน่ายต้องชี้ไป | | `rs_cname_target` | ชื่อโฮสต์ที่เรคคอร์ด CNAME ของตัวแทนจำหน่ายต้องชี้ไป | | `rs_master_hosts` | ชื่อโฮสต์ที่เป็นของเว็บไซต์หลักของคุณเอง (ไม่สามารถกำหนดให้ตัวแทนจำหน่ายได้) | | `rs_platform_domain` | โดเมนหลักเสริมสำหรับ **แพลตฟอร์มย่อย** (เช่น `partners.cloud.example.com` เพื่อให้ตัวแทนจำหน่ายใช้ `acme.partners.cloud.example.com`) เว้นว่างไว้เพื่อปิดใช้งานตัวเลือกนี้ | | `rs_sites_stale_minutes` | จำนวนนาทีที่รอก่อนจะถือว่าบริการใบรับรองหมดอายุ (ค่าเริ่มต้นคือ 15) | | `rs_ssl_fail_hours` | จำนวนชั่วโมงของความพยายามที่ล้มเหลวก่อนที่จะแจ้งข้อผิดพลาด (ค่าเริ่มต้นคือ 48) | ::: warning ตรวจสอบค่าเหล่านี้ก่อนส่งคำสั่ง `rs_server_ipv4`, `rs_cname_target` และ `rs_master_hosts` มาพร้อมกับค่าตัวอย่าง แทนที่ด้วยเซิร์ฟเวอร์และโดเมนของคุณเอง **ก่อน** ที่จะให้คำแนะนำ DNS แก่ตัวแทนจำหน่าย มิฉะนั้นคำแนะนำบนหน้าจอจะชี้ไปยังตำแหน่งที่ไม่ถูกต้อง ::: 3. คลิก **Save** (ระบบจะขอเหตุผล) 4. ตรวจสอบให้แน่ใจว่ารีเวิร์สพร็อกซี่ของคุณส่งต่อชื่อโฮสต์ของตัวแทนจำหน่ายไปยังพาเนล NexCMP และออกใบรับรองให้แต่ละโฮสต์ ตัวติดตั้งจะกำหนดค่า nginx และ Let's Encrypt เฉพาะสำหรับโดเมนหลัก (และชื่อ `admin.` กับ `partner.` ที่แก้ไขได้) หากคุณใช้ Cloudflare ให้ทำพร็อกซี่ชื่อโฮสต์และใช้โหมด Full SSL ## เชื่อมต่อใน NexCMP {#connect-in-nexcmp} ### สร้างตัวแทนจำหน่าย {#create-the-reseller} 1. เปิด **Customers › Resellers › List** และคลิก **New reseller** วิซาร์ดนี้มี 8 ขั้นตอนและทำการจัดเตรียมทุกอย่างให้ในตอนท้าย แต่ละขั้นตอนสามารถลองใหม่ได้อย่างปลอดภัย | ขั้นตอน | กรอก | |---|---| | **ตัวแทนจำหน่าย** | ชื่อตามกฎหมายหรือชื่อทางการค้า, **สลัก** (4–31 ตัวอักษร a–z, 0–9 หรือ `-`, ขึ้นต้นด้วยตัวอักษร ใช้เป็นคำนำหน้าใบแจ้งหนี้ด้วย), ชื่อผู้ติดต่อ, อีเมลและเบอร์โทร, ภาษาเริ่มต้น, รายละเอียดการเรียกเก็บเงินของตัวแทนจำหน่าย (ในฐานะผู้ซื้อการเติมเงินในวอลเล็ต) | | **บัญชีคอนโซล** | ชื่อผู้ใช้, อีเมลบัญชี, ชื่อเต็ม; **ส่งลิงก์คำเชิญแบบใช้ครั้งเดียวทางอีเมล** (มีอายุ 72 ชั่วโมง, แนะนำ) หรือแสดงรหัสผ่านชั่วคราวหนึ่งครั้ง | | **แบรนด์** | ชื่อแบรนด์, ชื่อย่อ, สโลแกน, สีหลัก, อีเมลและเบอร์โทรสนับสนุน, ชื่อผู้ขายที่พิมพ์บนใบแจ้งหนี้ของลูกค้า, โลโก้ (พื้นหลังสว่างและมืด), เครื่องหมายสี่เหลี่ยมและแฟ비คอน: PNG, JPEG, WEBP หรือ ICO สูงสุด 256 KB, **ห้ามใช้ SVG** | | **โดเมน** | โดเมนลูกค้าพร้อม **also www** โดเมนใดเป็นหลัก **test domain** (sslip.io) และตัวเลือก **dry-run** หรือซับโดเมนของแพลตฟอร์ม วิซาร์ดจะแสดงสถานะ **DNS OK / DNS not ready** และเรคคอร์ดที่ต้องสร้าง | | **ราคาและกระเป๋าเงิน** | ส่วนลดขายส่ง (%), พื้นล่างค้าปลีก (% ของราคาป้าย), ส่วนต่างเริ่มต้น (%), วงเงินเครดิต, ยอดเงินเริ่มต้น, แจ้งเตือนยอดเงินคงเหลือต่ำ, ขีดจำกัดสำหรับลูกค้า, VM และโดเมน, ฟีเจอร์ของเว็บไซต์ (การสมัครใช้งานของลูกค้า, การป้องกัน DDoS, ตั๋วสนับสนุน, แผนกำหนดเอง, ปรับขนาด, Auto Scaling) | | **ช่องทางชำระเงิน** | ผู้จัดเก็บเงินจากลูกค้า (ดูด้านล่าง) และ PayPal ส่วนตัวรวมถึงการโอนผ่านธนาคารเวียดนามส่วนตัวที่เป็นตัวเลือก | | **Email** | ชื่อผู้ส่งและ Reply-To ที่อยู่ From จะยังคงเป็นที่อยู่ของแพลตฟอร์มจนกว่าจะมีการตั้งค่า DKIM สำหรับโดเมนตัวแทนจำหน่าย | | **ตรวจสอบ** | ตรวจสอบทุกอย่างแล้วคลิก **Provision everything** หรือ **Save draft (provision later)** | 2. กระบวนการจัดเตรียมจะดำเนินต่อไปในเบื้องหลัง (ทุกๆ 30วินาที) เปิดตัวแทนจำหน่ายเพื่อดูความคืบหน้าและใช้ **Continue provisioning** หรือ **Retry** หากขั้นตอนใดล้มเหลว ![วิซาร์ดสร้างตัวแทนจำหน่ายใหม่ในขั้นตอนแรกพร้อมค่าตัวอย่าง](https://nexcmp.com/th/docs/images/customers/resellers-01-wizard.webp) ### ชี้ DNS (ตัวแทนจำหน่ายเป็นผู้ดำเนินการนี้) {#point-dns-the-reseller-does-this} ตัวแทนจำหน่าย (หรือคุณ) สร้างเรคคอร์ดที่แสดงบนแท็บ **Domains & SSL**: | เรคคอร์ด | Name | ค่า | |---|---|---| | TXT (ความเป็นเจ้าของ ครั้งแรกเท่านั้น) | `_site-verify.` | `sv=` แสดงบนหน้าจอ | | A (โดเมนรากเช่น `shop.example.net`) | โดเมน | ของคุณ `rs_server_ipv4` | | CNAME (ซับโดเมนเช่น `cloud.example.net`) | โดเมน | ของคุณ `rs_cname_target` (หรือเรคคอร์ด A ไปยัง `rs_server_ipv4`) | | CNAME (ไม่บังคับ) | `www.` | ของคุณ `rs_cname_target` | รวมถึง: - ลบเรคคอร์ด **AAAA** (IPv6) ใดๆ ออก เว้นแต่เซิร์ฟเวอร์ของคุณจะตอบสนองบนที่อยู่ IPv6 นั้น - ปิดพร็อกซี CDN **off** (เมฆสีเทา) ในขณะที่กำลังตรวจสอบโดเมน - หากโดเมนมีเรคคอร์ด **CAA** อนุญาตให้ใช้ `letsencrypt.org` โทเค็นในเรคคอร์ด TXT จะแตกต่างกันสำหรับทุกโดเมน คัดลอกมาจากหน้าจอ ระบบจะตรวจสอบ DNS ซ้ำทุก 5 นาทีในช่วง 48 ชั่วโมงแรก จากนั้นจะตรวจสอบทุกชั่วโมง และจะปล่อยชื่อที่ยังไม่มีเรคคอร์ด TXT หลังจากผ่านไป 72 ชั่วโมง ### สถานะโดเมน {#domain-states} ที่ **Customers › Resellers › Domains & SSL** (ตัวแทนจำหน่ายทั้งหมด) และในแท็บ **Domains & SSL** ของตัวแทนจำหน่ายแต่ละราย: | สถานะ | ความหมาย | |---|---| | `pending_verify` | กำลังรอเรคคอร์ด TXT | | `pending_dns` / `verifying` | กำลังรอให้ A หรือ CNAME ชี้มาที่คุณ | | `issuing` | กำลังออกใบรับรอง | | `active` | ให้บริการเว็บไซต์ของตัวแทนจำหน่าย | | `cert_expiring` | ใบรับรองใกล้หมดอายุ คาดว่าจะมีการต่ออายุ | | `dns_lost` | DNS หยุดชี้มาที่คุณ หลังจาก 30 วันโดเมนจะถูกลบออก | | `error` | ดูรหัสข้อผิดพลาด **Retry** หลังจากแก้ไขแล้ว | | `removing` / `removed` | กำลังถูกเรียกคืน สล็อตไลเซนส์ถูกส่งคืน | การดำเนินการของแถว: **Check now**, **Retry**, **Make primary**, **Test mode** (สำหรับโดเมนทดสอบ), **Remove** ## สิทธิ์และการขายส่ง {#permissions-wholesale} **Customers › Resellers › Permissions & wholesale** (`/resellers/entitlements`) คือเมทริกซ์: หนึ่งแถวต่อหนึ่งรีเซลเลอร์ พร้อมด้วยส่วนลด **discount** และส่วนเพิ่ม **markup** และสวิตช์หนึ่งตัวต่อหนึ่งบริการ (เช่น DDoS Shield และ VPN) สวิตช์จะแก้ไขได้เมื่อฟีเจอร์ทั่วทั้งแพลตฟอร์มเปิดใช้งานอยู่ มิฉะนั้นเซลล์จะเป็นแบบอ่านได้อย่างเดียวและลิงก์ไปยังการตั้งค่า แท็บย่อย **Top-up codes** กำหนดจำนวนโค้ดที่รีเซลเลอร์แต่ละรายออกได้ต่อเดือน (ดูที่ [Promotions](https://nexcmp.com/th/docs/billing/promotions/)) กฎการกำหนดราคา: - ราคาขายส่ง = ราคาป้าย x (1 - ส่วนลด) และสามารถลบล้างได้ตามแผนและตามรอบการเรียกเก็บเงินในแท็บ **Wholesale pricing** ของรีเซลเลอร์ - รีเซลเลอร์เป็นผู้กำหนดราคาปลีกและต้องไม่ต่ำกว่าราคา **floor** (เปอร์เซ็นต์ของราคาป้าย) - กระเป๋าเงิน **wallet** ของรีเซลเลอร์จะเป็นผู้ชำระราคาขายส่งเมื่อลูกค้าของพวกเขาทำการซื้อ กระเป๋าสตางค์มีวงเงินเครดิต ระยะเวลาผ่อนผัน และเพดานการเบิกเงินเกินบัญชี (ดูที่ Defaults) ## Defaults {#defaults} **Customers › Resellers › Defaults** (`/resellers/settings`) คือ `rs_*` keys ที่ใช้กับรีเซลเลอร์ทุกคน ทุกการเปลี่ยนแปลงจะต้องระบุเหตุผลและมีการตรวจสอบย้อนหลัง | Group | คีย์ | ค่าเริ่มต้น | ความหมาย | |---|---|---|---| | General | `rs_enabled` | 1 | เปิดใช้งานโปรแกรมรีเซลเลอร์ | | | `rs_platform_collect_enabled` | 0 | อนุญาตให้แพลตฟอร์มเก็บเงินลูกค้าแทนรีเซลเลอร์ **เปิดใช้งานเฉพาะหลังจากการตรวจสอบทางกฎหมายแล้วเท่านั้น** | | | `rs_totp_required` | 1 | บัญชีคอนโซลของรีเซลเลอร์ต้องใช้การยืนยันตัวตนแบบสองขั้นตอน | | | `rs_agreement_version` | 1 | เวอร์ชันของข้อตกลงรีเซลเลอร์ที่พวกเขาต้องยอมรับ | | Default pricing | `rs_default_discount_bp` | 2000 (20 %) | ส่วนลดขายส่งสำหรับรีเซลเลอร์ใหม่ (หน่วยพื้นฐาน, 0 ถึง 9000) | | | `rs_default_markup_bp` | 2500 (25 %) | ส่วนเพิ่มเริ่มต้น (0 ถึง 50000) | | | `rs_default_floor_bp` | 9000 (90 %) | ราคาปลีกขั้นต่ำ (0 ถึง 20000) | | | `rs_default_max_domains` | 3 | โดเมนที่อนุญาตต่อรีเซลเลอร์หนึ่งราย | | Wallet and payouts | `rs_grace_hours` | 72 | ระยะเวลาผ่อนผันก่อนที่บริการของลูกค้าจะได้รับผลกระทบจากกระเป๋าเงินรีเซลเลอร์ที่ว่างเปล่า | | | `rs_overdraft_cap_cents` | 5000 | การเบิกเงินเกินบัญชีที่อนุญาตบนกระเป๋าเงิน | | | `rs_retention_days` | 14 | จำนวนวันก่อนที่ VM ของรีเซลเลอร์ที่ถูกปิดจะถูกทำลาย | | | `rs_payout_hold_days` | 30 | จำนวนวันที่คอมมิชชันจะถูกระงับไว้ก่อนที่จะถอนได้ | | | `rs_payout_min_cents` | 5000 | จำนวนเงินถอนขั้นต่ำ | | | `rs_topup_min_cents` | 2000 | การเติมเงินกระเป๋าเงินขั้นต่ำโดยรีเซลเลอร์ | | Payments and mail | `rs_webhook_base` | empty | URL ฐานสาธารณะสำหรับ webhook เกตเวย์ของรีเซลเลอร์ (เว้นว่าง = ใช้ URL ของไซต์) | | | `rs_mail_from` | empty | ที่อยู่อีเมลผู้ส่งสำหรับอีเมลของรีเซลเลอร์ | | | `rs_invoice_show_processor` | 1 | แสดงผู้ประมวลผลการชำระเงินบนใบแจ้งหนี้ | | | `rs_gw_stripe_enabled`, `rs_gw_usdt_enabled` | 1 | ว่ารีเซลเลอร์สามารถกำหนดค่า Stripe หรือ USDT ของตนเองได้หรือไม่ | ## ผู้ที่เก็บเงินลูกค้า {#who-collects-customer-payments} | โหมด | ความหมาย | |---|---| | **Reseller collects (own channels)** — ค่าเริ่มต้น | รีเซลเลอร์เชื่อมต่อ Stripe, PayPal, USDT หรือบัญชีธนาคารของตนเอง Webhook ของพวกเขาคือ `https:///v1/billing//webhook/r/` บัตรที่บันทึกไว้และ [auto top-up](https://nexcmp.com/th/docs/billing/auto-top-up/) จะไม่สามารถใช้งานได้สำหรับไซต์เหล่านี้ | | **Platform collects** | ช่องทางของคุณจะแสดงอยู่บนเว็บไซต์ของรีเซลเลอร์ ล็อคไว้จนกว่าจะถึง `rs_platform_collect_enabled = 1` | | **Mixed** | การผสมผสานที่เลือกได้ตามแต่ละช่องทาง | ## สิ่งที่รีเซลเลอร์มองเห็น {#what-the-reseller-sees} คอนโซลพาร์ทเนอร์ที่ `https://partner.` จะมี Overview, Reports, Customers, VMs, Tickets, Orders, Payments, Prices, Brand, Landing & legal, Domains & SSL, Email, Wallet และ Payment channels บัญชีคอนโซลจะมีบทบาทเป็น *reseller* (เต็มรูปแบบ) หรือ *staff* (อ่านอย่างเดียว) หากต้องการตรวจสอบด้วยตนเอง ให้เปิดรีเซลเลอร์แล้วคลิก **Sign in to partner console**: คุณจะเข้าใช้งานได้เป็นเวลา 60 นาที ทุกการเขียนจะถูกบันทึกพร้อมชื่อของคุณทั้งในบันทึกของผู้ดูแลระบบและบันทึกของรีเซลเลอร์ และการทำธุรกรรมทางการเงินจำเป็นต้องมีการยืนยันครั้งที่สอง ## ตรวจสอบ {#verify} 1. หลังจากการจัดสรร แถวรายการของตัวแทนจำหน่ายจะแสดงคำว่า *active* และคอลัมน์ **Provisioning** สีเขียว 2. เปิดโดเมนของตัวแทนจำหน่ายในเบราว์เซอร์: หน้าเข้าสู่ระบบของตัวแทนจำหน่ายเองจะปรากฏขึ้นพร้อมกับแบรนด์ของพวกเขา `https:///admin` แสดงข้อผิดพลาด 404 3. ลงทะเบียนลูกค้าทดสอบบนโดเมนนั้น: ลูกค้าจะปรากฏภายใต้ **Customers › List** โดยมีตัวแทนจำหน่ายอยู่ในคอลัมน์ **Site** 4. หน้าไลเซนส์แสดงจำนวนช่องที่ใช้งานเพิ่มขึ้นหนึ่งช่อง ## ขีดจำกัดและหมายเหตุ {#limits-notes} - หนึ่งช่องไลเซนส์ต่อโดเมนกำหนดเองหรือโดเมนทดสอบ; ซับโดเมนของแพลตฟอร์มจะไม่ใช้ช่องไลเซนส์ - การระงับตัวแทนจำหน่ายจะยังคงข้อมูลไว้; คำสั่ง **Close reseller** จะคืนค่าช่องโดเมนทั้งหมด และการทำลาย VM จะอนุญาตให้ทำได้หลังจากพ้นช่วงเวลาเก็บรักษาเท่านั้น - ลูกค้าของตัวแทนจำหน่ายจะปรากฏในรายการลูกค้าของคุณและสามารถสวมรอยใช้งานได้เช่นเดียวกับรายอื่น (ลิงก์จะเปิดบนโดเมนของตัวแทนจำหน่าย) - ตัวแทนจำหน่ายไม่สามารถมองเห็นหรือเปลี่ยนแปลงช่องทางการชำระเงิน, ค่าโควตาเริ่มต้น หรือตัวแทนจำหน่ายรายอื่นได้ ## การแก้ Problme {#troubleshooting} | อาการ | สาเหตุ | วิธีแก้ปัญหา | |---|---|---| | "ช่องโดเมนตัวแทนจำหน่ายในไลเซนส์หมด" | ช่องไลเซนส์ถูกใช้งานครบแล้ว | ล้างช่อง (ลบโดเมน) หรือซื้อเพิ่มบนหน้าไลเซนส์ | | โดเมนค้างอยู่ที่ `pending_verify` | TXT record ขาดหายไป | สร้าง TXT record ตามที่แสดงทุกประการ จากนั้นใช้ **Check now** | | โดเมนค้างอยู่ที่ `pending_dns` | A/CNAME ไม่ได้ชี้มาที่คุณ, มี record แบบ AAAA, หรือเปิดใช้งาน CDN proxy อยู่ | แก้ไข DNS, ปิดการใช้งานพร็อกซี แล้วคลิก **Check now** | | สถานะ `error` | ดูรหัสที่ปรากฏบนแถว (ตัวอย่างเช่น CAA บล็อก Let's Encrypt, หรืออัตราจำกัด rate limit) | แก้ไขแล้วคลิก **Retry** | | เบราว์เซอร์แจ้งว่าไม่รู้จักโฮสต์หรือแสดง "421" | ชื่อโฮสต์ไม่อยู่ในไลเซนส์ หรือยังไม่ได้เส้นทางมาที่แผงควบคุม | เพิ่มโดเมนผ่านตัวแทนจำหน่าย (ใช้ช่องไลเซนส์ 1 ช่อง) และแก้ไขรีเวอร์สพร็อกซี | | คำแนะนำแสดง IP หรือโฮสต์ที่ไม่ถูกต้อง | `rs_server_ipv4` / `rs_cname_target` ยังคงมีค่าตัวอย่างอยู่ | ตั้งค่าเหล่านี้ในส่วน Defaults | | ตัวแทนจำหน่ายไม่สามารถเปิดใช้งานการเก็บเงินของแพลตฟอร์มได้ | ถูกล็อก | ตั้งค่า `rs_platform_collect_enabled` หลังจากผ่านการตรวจสอบทางกฎหมายแล้ว | --- # การสร้างแบรนด์ {#branding} > **ตำแหน่งในหน้าผู้ดูแลระบบ:** System › Settings › Brand (`/settings/branding`) ที่เกี่ยวข้อง: System › Settings › General (`/settings`) สำหรับ URL และรายละเอียดผู้ขายที่พิมพ์บนใบแจ้งหนี้ ## What it does {#what-it-does} NexCMP เป็นแบบ white-label: ผลิตภัณฑ์ไม่มีชื่อผู้จำหน่าย และทุกสิ่งที่ลูกค้าของคุณเห็นคือแบรนด์**ของคุณ** การตั้งค่าแบรนด์จะมีผลกับหน้าเข้าสู่ระบบและสมัครใช้งาน พอร์ทัล คอนโซลผู้ดูแลระบบ และอีเมล ## ข้อกำหนด {#requirements} | Item | Requirement | |---|---| | บทบาท | ผู้ดูแลระบบ | | ไฟล์ | โลโก้: SVG, PNG, JPEG, WEBP หรือ ICO, **ขนาดไม่เกิน 512 KB ต่อไฟล์** | | Dependencies | ไม่มี | ## ขั้นตอน {#steps} 1. เปิด **System › Settings › Brand** 2. ในการ์ด **Identity** ให้กรอกข้อมูลดังนี้: | ฟิลด์ | หมายเหตุ | |---|---| | **Brand name** (จำเป็น) | สูงสุด 60 ตัวอักษร แสดงในพอร์ทัล อีเมล ใบแจ้งหนี้ และหน้าทางกฎหมาย | | **ชื่อผู้ขายบนใบแจ้งหนี้** | สูงสุด 120 ตัวอักษร หากเว้นว่างไว้จะใช้ชื่อแบรนด์แทน | | **Brand color** | สีแบบ `#rrggbb`; ปุ่มเล็กๆ ถัดจากฟิลด์นี้ใช้สำหรับรีเซ็ตกลับเป็นสีเริ่มต้นของระบบ | | **Site currency** | **USD**: ราคาและยอดเงินคงเหลือจะแสดงเป็นสกุลเงิน USD เท่านั้น โดยไม่มีการสลับสกุลเงิน **VND**: จะแสดงจำนวนเงินที่แปลงแล้วตามอัตราแลกเปลี่ยนที่บันทึกไว้ด้วย (ดูที่ [Currency and exchange rates](https://nexcmp.com/th/docs/catalog/currency-and-exchange-rates/)) | 3. คลิก **Save** 4. ในส่วนการ์ด **Logo & favicon** ให้ทำการอัปโหลดรูปภาพทั้งสามรูป ได้แก่ **Logo (light background)**, **Logo (dark background)** และ **Favicon** ด้วยปุ่ม **Upload** (หรือ **Replace**) ส่วน **Remove** ใช้สำหรับลบรูปภาพออก ![หน้า Brand ที่มีฟิลด์ข้อมูลระบุตัวตนและรูปภาพที่อัปโหลดทั้งสามรูป](https://nexcmp.com/th/docs/images/customers/branding-01-brand.webp) ### การตั้งค่าที่เกี่ยวข้องใน General {#related-settings-in-general} ใน **System › Settings › General** จะมีสองแท็บที่ช่วยเติมเต็มข้อมูลให้สมบูรณ์: | แท็บ | ฟิลด์ | |---|---| | **Branding & URLs** | ชื่อแบรนด์ (อีเมล, ใบแจ้งหนี้), ภาษาเริ่มต้น (อังกฤษหรือเวียดนาม), **Customer app URL**, **Console URL**, **Admin URL** (ลิงก์สวมรอยผู้แทนจำหน่าย) และ **Partner console URL** (ลิงก์คำเชิญ, อีเมลผู้แทนจำหน่าย) ตัวช่วยติดตั้งจะเติมข้อมูลเหล่านี้ด้วย `https://`, `https:///admin` และ `https:///console` | | **Seller & invoicing** | ชื่อนิติบุคคล, หมายเลขผู้เสียภาษี, ที่อยู่, อีเมลติดต่อ และคำนำหน้าหมายเลขใบแจ้งหนี้ ดูเพิ่มเติมที่ [Invoices and ledger](https://nexcmp.com/th/docs/billing/invoices-and-ledger/) | **From name** ของอีเมลจะถูกกำหนดไว้ใน **System › Settings › Email** ([SMTP and e-mails](https://nexcmp.com/th/docs/administration/smtp-and-emails/)) ## การตรวจสอบไฟล์ที่อัปโหลด {#uploaded-files-are-checked} - ภาพแรสเตอร์จะถูกตรวจสอบจากเนื้อหา (ไม่ใช่จากชื่อไฟล์) และมีการวัดขนาด - **ไฟล์ SVG จะถูกสร้างขึ้นใหม่** จากรายการรูปร่างที่ปลอดภัย ไฟล์ที่มีสคริปต์, `foreignObject`, แอตทริบิวต์เหตุการณ์, ลิงก์ภายนอก, `url(...)` ที่ชี้ไปยังภายนอก, DOCTYPE หรือเอนทิตีจะถูก **ปฏิเสธ** (`svg_unsafe`) - ไฟล์ที่มีขนาดใหญ่เกินไปจะถูกปฏิเสธด้วย `asset_too_large`, ประเภทที่ไม่ถูกต้องด้วย `asset_type` และขนาดมิติที่ไม่ถูกต้องด้วย `asset_dimensions` - ไฟล์จะถูกให้บริการจากโดเมนของคุณเองพร้อมส่วนหัวด้านความปลอดภัยที่เข้มงวด ## ตรวจสอบ {#verify} 1. เปิดหน้าเข้าสู่ระบบพอร์ทัลในหน้าต่างส่วนตัว: โลโก้ ชื่อ และสีจะปรากฏขึ้น 2. ตรวจสอบแท็บเบราว์เซอร์สำหรับไอคอน favicon (เบราว์เซอร์จะแคชไอคอนไว้ โปรดรีโหลดแบบล้างแคชหากยังคงเห็นไอคอนเดิม) 3. ทดสอบส่งอีเมล (ตัวอย่างเช่น **Send reset link** สำหรับลูกค้าทดสอบ) และตรวจสอบชื่อแบรนด์ในหัวเรื่องและส่วนท้ายอีเมล ## ขีดจำกัดและหมายเหตุ {#limits-notes} - โลโก้สำหรับพื้นหลังสีเข้มจะถูกใช้งานเมื่อลูกค้าหรือผู้ดูแลระบบสลับไปใช้ธีมมืด - ผู้แทนจำหน่ายจะมีแบรนด์ของตนเอง โดยสามารถอัปโหลดไฟล์ PNG, JPEG, WEBP หรือ ICO ขนาดไม่เกิน 256 KB (ไม่อนุญาต SVG) ดูเพิ่มเติมที่ [Resellers](https://nexcmp.com/th/docs/customers/resellers/) - การเปลี่ยนแปลงสีแบรนด์หรือโลโก้จะมีผลในการโหลดหน้าครั้งถัดไป ส่วนอีเมลที่ส่งไปแล้วจะไม่เปลี่ยนแปลง ## การแก้ Problme {#troubleshooting} | อาการ | สาเหตุ | วิธีแก้ปัญหา | |---|---|---| | ปฏิเสธการอัปโหลด: `svg_unsafe` | ไฟล์ SVG มีสคริปต์ ลิงก์ หรือการอ้างอิงภายนอก | ส่งออกเป็น SVG แบบปกติ (ไม่มีสคริปต์ ไม่มีภาพภายนอก) หรือใช้ไฟล์ PNG | | `asset_too_large` | ไฟล์มีขนาดเกิน 512 KB | บีบอัดหรือปรับขนาดรูปภาพ | | `asset_type` | ไม่ใช่ไฟล์ SVG, PNG, JPEG, WEBP หรือ ICO | แปลงรูปแบบไฟล์ | | `invalid_argument: primary` | สีไม่ถูกต้อง `#rrggbb` | ใช้ค่ารหัสสีแบบฐานสิบหก 6 หลัก | | ยังคงเห็นโลโก้เดิมอยู่ | แคชของเบราว์เซอร์ | รีโหลดแบบฮาร์ดรีโหลด ไอคอน favicon อาจใช้เวลานานกว่าปกติ | | ราคาแสดงเฉพาะในสกุลเงิน USD เท่านั้น | สกุลเงินของเว็บไซต์คือ USD | สลับเป็น VND และตรวจสอบให้แน่ใจว่าได้บันทึกอัตราแลกเปลี่ยนแล้ว | --- # หน้าข้อกำหนดทางกฎหมาย {#legal-pages} > **ตำแหน่งในหน้าผู้ดูแลระบบ:** System › Settings › Legal (`/settings/legal`). **ตำแหน่งที่ลูกค้ามองเห็น:** `https:///terms` และ `/privacy` โดยมีลิงก์จากหน้าสมัครใช้งานและชำระเงิน ## What it does {#what-it-does} ระบบติดตั้งของคุณจะเผยแพร่สองหน้า: **Terms of Service** และ **Privacy Policy** จนกว่าคุณจะเขียนข้อความของคุณเอง NexCMP จะแสดง **ข้อความกลางที่เป็นค่าเริ่มต้น** ซึ่งไม่ระบุถึงผู้ขายซอฟต์แวร์และไม่มีการรับประกันบริการใดเป็นพิเศษ แทนที่ด้วยข้อความที่ตรวจสอบโดยทนายความของคุณก่อนที่คุณจะเริ่มจำหน่าย ## ข้อกำหนด {#requirements} | Item | Requirement | |---|---| | บทบาท | ผู้ดูแลระบบ | | เนื้อหา | Markdown แบบธรรมดา, สูงสุด **50 KB** ต่อหน้าและต่อภาษา | | Dependencies | ชื่อแบรนด์และรายละเอียดผู้ขาย ([Branding](https://nexcmp.com/th/docs/customers/branding/)) จะถูกแทรกลงในข้อความเริ่มต้น | ## ขั้นตอน {#steps} 1. เปิด **System › Settings › Legal** แต่ละหน้าจะมีบัตรของตัวเองพร้อมป้ายกำกับ *Using the default text* หรือ *Using your text* 2. เลือกแท็บภาษา **English** หรือ **Tiếng Việt** 3. พิมพ์ข้อความของคุณ ในขณะที่ช่องว่างเปล่า ข้อความเริ่มต้นจะแสดงจางๆ เป็นข้อความยึดพื้นที่ หากต้องการเริ่มต้นจากข้อความนั้น ให้คลิก **Start from the default text** แล้วทำการแก้ไข 4. คลิก **Save** ตัวนับขนาดจะแสดง `used / 50 KB` 5. คลิก **View on the customer site** เพื่อเปิด `/terms` หรือ `/privacy` 6. หากต้องการกลับไปใช้ค่าเริ่มต้นสำหรับภาษาใดภาษาหนึ่ง ให้คลิก **Clear, back to default** แล้วบันทึก ![การตั้งค่าทางกฎหมายพร้อมบัตรข้อกำหนดในการให้บริการที่แสดงข้อความเริ่มต้นเป็นจุดเริ่มต้น](https://nexcmp.com/th/docs/images/customers/legal-01-terms.webp) ## เนื้อหาภายในหน้าเริ่มต้น {#what-the-default-pages-contain} ข้อความเริ่มต้นจะถูกเก็บไว้ในผลิตภัณฑ์เป็น `legal_default.json` และเติมเต็มด้วยชื่อแบรนด์, ชื่อผู้ขาย, URL เว็บไซต์ และอีเมลติดต่อของคุณ (จาก **Seller & invoicing** ภายใต้ System › Settings › General; หากไม่มีการตั้งค่าอีเมล ระบบจะชี้ไปยังทีมสนับสนุนของคุณ) | หน้า | หัวข้อ | |---|---| | **Terms of Service** | 1 บริการ · 2 บัญชีและการยืนยันตัวตน · 3 ราคาและการเรียกเก็บเงิน · 4 การคืนเงิน · 5 ข้อมูลของคุณ · 6 การใช้งานที่ยอมรับได้ · 7 ความพร้อมใช้งานและการสนับสนุน · 8 การระงับและการยกเลิก · 9 ความรับผิด · 10 การเปลี่ยนแปลงและกฎหมายที่ใช้บังคับ (กฎหมายของสถานที่ประกอบธุรกิจของผู้ขาย) | | **Privacy Policy** | 1 สิ่งที่เราจัดเก็บ · 2 เหตุผลที่เราใช้งาน · 3 คุกกี้และพื้นที่จัดเก็บในเครื่อง · 4 บุคคลอื่นที่เข้าถึงข้อมูล · 5 ระยะเวลาในการเก็บรักษา · 6 สิทธิของคุณ · 7 ติดต่อเรา | ::: warning ไม่ใช่คำแนะนำทางกฎหมาย ข้อความเริ่มต้นเป็นเทมเพลตที่เป็นกลาง โปรดให้ทนายความตรวจสอบก่อนนำไปใช้กับลูกค้าจริง โดยเฉพาะส่วนเกี่ยวกับการคืนเงิน ความรับผิด และกฎหมายที่ใช้บังคับ ::: ## กฎ Markdown {#markdown-rules} - ที่รองรับ: หัวข้อ (`# 1. Title`), ย่อหน้า, รายการแบบมีจุดและตัวเลข, **ตัวหนา**, และลิงก์ `[text](https://example.com)` - ลิงก์ต้องขึ้นต้นด้วย `http://` หรือ `https://` - **ไม่อนุญาต HTML ดิบ** (เช่น ``, ` # ภาพรวมพอร์ทัลลูกค้า {#customer-portal-overview} > **ตำแหน่งในพอร์ทัล:** `https:///` — ลูกค้าเข้าสู่ระบบที่ `/login` ส่วนผู้ดูแลระบบใช้ `/admin` การเข้าสู่ระบบเดียวกันนี้จะสามารถเข้าใช้งานได้ทั้งสองส่วนหากบัญชีเป็นผู้ดูแลระบบ พอร์ทัลคือส่วนที่ลูกค้าของคุณใช้งานเป็นประจำทุกวัน โดยจะติดแบรนด์ด้วยชื่อ โลโก้ และสีของคุณ ([Branding](https://nexcmp.com/th/docs/customers/branding/)) รวมถึงแสดงเฉพาะบริการที่คุณเปิดใช้งานไว้เท่านั้น ([Modules](https://nexcmp.com/th/docs/infrastructure/modules/)) ## แดชบอร์ด {#the-dashboard} หลังจากเข้าสู่ระบบแล้ว **Dashboard** จะแสดง: | บล็อก | ความหมาย | |---|---| | ยอดคงเหลือในกระเป๋าเงิน | ยอดเงินคงเหลือปัจจุบันและการประเมินจำนวนวันที่สามารถใช้งานได้ตามอัตราการใช้เงินในปัจจุบัน | | ยอดใช้จ่ายในเดือนนี้ | ค่าใช้จ่ายจนถึงปัจจุบันและการคาดการณ์ยอดเมื่อสิ้นเดือน | | เครื่องเสมือน | VM แต่ละเครื่องพร้อมสถานะ, IP, CPU และ RAM รวมถึงการดำเนินการด่วน (Console, Restart) | | แบนด์วิดท์ | ทราฟฟิกขาเข้า/ขาออกสำหรับ 1 ชม., 6 ชม., 24 ชม., 7 วัน, 30 วัน | | กิจกรรมล่าสุด | เหตุการณ์ล่าสุดในบัญชี | | เริ่มต้นใช้งานด่วน | รายการตรวจสอบ: สร้าง VM, เพิ่ม SSH key, เติมเงิน, เปิดใช้งานการเติมเงินอัตโนมัติ, ยืนยันอีเมล | ![แดชบอร์ดลูกค้าที่แสดงยอดคงเหลือในกระเป๋าเงิน การคาดการณ์การใช้จ่าย เครื่องเสมือนที่กำลังทำงาน และรายการตรวจสอบการเริ่มต้นใช้งานด่วน](https://nexcmp.com/th/docs/images/portal/overview-01-dashboard.webp) ## การนำทาง {#navigation} เมนูจะจัดกลุ่มบริการตามประเภท บริการที่คุณปิดใช้งาน (หรือที่ไม่ได้เชื่อมต่อกับต้นทาง) จะไม่ปรากฏขึ้น | พื้นที่ | หน้า | |---|---| | Instances | [Virtual machines](https://nexcmp.com/th/docs/portal/virtual-machines/) และหน้ารายละเอียดของแต่ละเครื่อง | | ปรับใช้ | [Ordering](https://nexcmp.com/th/docs/portal/ordering/) — สร้างทรัพยากร | | สตอเรจ | Snapshots, Backups และวอลุ่มเมื่อเปิดใช้งาน — [Snapshots](https://nexcmp.com/th/docs/portal/snapshots/) | | การเรียกเก็บเงิน | [Wallet and top-ups](https://nexcmp.com/th/docs/portal/sign-up-and-wallet/), ใบแจ้งหนี้, คำสั่งซื้อ, โควตา | | บัญชี | โปรไฟล์, การเข้าสู่ระบบและความปลอดภัย, การตั้งค่ากำหนด, การเติมเงินอัตโนมัติ | | ซัพพอร์ต | วิดเจ็ตแชทและตั๋ว — [Support](https://nexcmp.com/th/docs/portal/support/) | | เอกสาร API | `/apidoc` — [API](https://nexcmp.com/th/docs/developers/api/) | ## บัญชี {#account} **Account** มี 4 แท็บ ได้แก่ **Profile** (ชื่อ, อีเมล, รหัสลูกค้า, คำขอลบ บัญชี), **Sign-in & security** (รหัสผ่าน, พาสคีย์, Google/GitHub ที่เชื่อมโยง), **Preferences** (ภาษา, สกุลเงินที่แสดง) และ **Auto top-up** ([Auto top-up](https://nexcmp.com/th/docs/billing/auto-top-up/)) ลูกค้าไม่สามารถลบ บัญชีได้โดยตรง: ให้กด **Request account deletion**; หลังจากลบเครื่องเสมือนทั้งหมดแล้ว ผู้ดูแลระบบจะตรวจสอบคำขอ (Customers › Deletion requests) และลูกค้าสามารถยกเลิกคำขอได้ในขณะที่รอดำเนินการ ## ภาษาและสกุลเงิน {#language-and-currency} พอร์ทัลรองรับ 16 ภาษาและแสดงราคาในสกุลเงินที่เลือกตามภาษา; ดูที่ [Currency and exchange rates](https://nexcmp.com/th/docs/catalog/currency-and-exchange-rates/) ลูกค้าสามารถสลับทั้งสองอย่างได้ใน **Preferences** ## โควตาของลูกค้า {#customer-quotas} **Billing › Quotas** แสดงปริมาณทรัพยากรแต่ละรายการ (CPU, หน่วยความจำ, พื้นที่จัดเก็บ, IP, VM) ที่ลูกค้าใช้งานได้ตามยอดที่ชำระเงินแล้ว — ดูที่ [Quotas](https://nexcmp.com/th/docs/billing/quotas/) --- # การสมัครใช้งาน กระเป๋าเงิน และการเติมเงิน {#sign-up-wallet-and-top-up} > **ตำแหน่งในพอร์ทัล:** `/register`, `/login`, Billing (`/billing`) ## สร้าง บัญชี {#create-an-account} 1. ลูกค้าเปิด `https:///register` และป้อนอีเมลและรหัสผ่าน (อย่างน้อย 10 ตัวอักษรประกอบด้วยตัวอักษรและตัวเลข) หรือใช้ **Google**, **GitHub** หรือ **passkey** เมื่อคุณเปิดใช้งาน — ดูที่ [Security](https://nexcmp.com/th/docs/administration/security/#customer-sign-in) 2. หากเปิดใช้งานแคปชา ให้ทำตามขั้นตอนให้เสร็จสิ้น 3. อีเมลยืนยันจะถูกส่งผ่าน [SMTP](https://nexcmp.com/th/docs/administration/smtp-and-emails/) ของคุณ การยืนยันเป็นสิ่งจำเป็นก่อนสร้าง VM เมื่อการตั้งค่าการขายของคุณกำหนดไว้ ![หน้าลงทะเบียนที่มีช่องกรอกอีเมลและรหัสผ่าน](https://nexcmp.com/th/docs/images/portal/sign-up-and-wallet-01-register.webp) ::: tip หากไม่มี SMTP ที่ใช้งานได้ ลูกค้าจะไม่สามารถยืนยันอีเมลหรือรีเซ็ตรหัสผ่านได้ โปรดกำหนดค่า [SMTP](https://nexcmp.com/th/docs/administration/smtp-and-emails/) ก่อน ::: ## กระเป๋าเงิน {#the-wallet} ทุกรายการจะชำระจากยอดคงเหลือใน **กระเป๋าเงิน** ในสกุลเงินเรียกเก็บเงินของคุณ หน้า **Billing** จะแสดง: | ส่วน | ความหมาย | |---|---| | อำนาจการใช้จ่าย | ยอดคงเหลือรวมกับการเติมเงินที่รอดำเนินการ | | ค่าใช้จ่ายที่สะสม | บริการรายชั่วโมงที่ใช้ไปในรอบปัจจุบันที่ยังไม่ได้ชำระ | | ยอดค้างชำระ | จำนวนเงินค้างชำระใดๆ | | ประวัติการเรียกเก็บเงิน | แท็บ **Invoice History**, **Payment Order**, **Ledger**, **Orders** | ![หน้า Billing ที่แสดงอำนาจการใช้จ่าย ค่าใช้จ่ายที่สะสม และแท็บประวัติ](https://nexcmp.com/th/docs/images/portal/sign-up-and-wallet-02-billing.webp) ## เพิ่มเครดิต {#add-credit} 1. คลิก **Deposit** 2. ป้อนจำนวนเงิน ขั้นต่ำคือ [minimum top-up](https://nexcmp.com/th/docs/billing/minimum-top-up/) ของคุณ 3. เลือกช่องทางการชำระเงิน (บัตร, PayPal, USDT หรือการโอนเงินผ่านธนาคารเมื่อใช้อินเทอร์เฟซภาษาเวียดนาม) — ช่องทางต่างๆ คือสิ่งที่คุณเปิดใช้งานใน [Payment channels](https://nexcmp.com/th/docs/billing/payment-channels/) 4. ชำระเงิน ยอดคงเหลือจะอัปเดตเมื่อผู้ให้บริการชำระเงินยืนยัน บัตรที่บันทึกไว้, Stripe Link และ PayPal สามารถนำกลับมาใช้ใหม่และใช้สำหรับ [auto top-up](https://nexcmp.com/th/docs/billing/auto-top-up/) ได้; ดูที่ [Saved payment methods](https://nexcmp.com/th/docs/billing/saved-payment-methods/) ## แลกโค้ด {#redeem-a-code} **Redeem code** เป็นการเพิ่มเครดิตจากบัตรกำนัลที่คุณออก (Finance › Billing › Vouchers) หรือใช้โค้ดโปรโมชัน — ดูที่ [Promotions](https://nexcmp.com/th/docs/billing/promotions/) ## Invoices {#invoices} คำสั่งซื้อที่ชำระเงินแล้วแต่ละรายการจะสร้างใบแจ้งหนี้ที่แสดงรายละเอียดผู้ขายของคุณ ([General settings](https://nexcmp.com/th/docs/administration/general-settings/)) ลูกค้าเปิดดูได้จาก **Invoice History** และพิมพ์หรือบันทึกเป็น PDF จากเบราว์เซอร์ ## ค่าบริการรายชั่วโมง {#hourly-charges} บริการรายชั่วโมงจะถูกคิดเงินทุกชั่วโมงที่ทรัพยากรนั้นคงอยู่ ยอดเงินจะสะสมและในหนึ่งชั่วโมงอาจปัดเศษเป็น $0.00 ได้ เมื่อยอดเงินคงเหลือไม่เพียงพอ ระบบจะระงับบริการตามกฎการเรียกเก็บเงินของคุณและแจ้งลูกค้าทางอีเมล (`low_balance`) --- # การสั่งซื้อบริการ {#ordering-a-service} > **ตำแหน่งในพอร์ทัล:** Deploy (`/deploy/vm`) **ตำแหน่งในผู้ดูแลระบบ** ที่คุณควบคุมสิ่งที่ปรากฏที่นี่: Services (แพ็กเกจ, ราคา) และ System › Admin › License & updates (โมดูล) หน้าสั่งซื้อคือฟอร์มแบบเลื่อนหน้าเดียวที่มีขั้นตอนเป็นตัวเลข การเลือกบริการอื่นในขั้นตอนที่ 1 จะคงหน้าเดิมไว้และเปลี่ยนขั้นตอนด้านล่าง ## ขั้นตอน {#steps} 1. **Service** — Cloud Servers และบริการอื่น ๆ ที่คุณเปิดใช้งาน (Kubernetes, Object Storage, Images, Private Cloud, VPN …) 2. **Location** — [zone](https://nexcmp.com/th/docs/infrastructure/zones/) ราคาและปริมาณการใช้งานทราฟฟิกที่รวมอยู่สามารถแตกต่างกันไปตามสถานที่ 3. **Plan** — แพ็กเกจแบบคงที่ (vCPU, RAM, ดิสก์ NVMe, ราคาต่อชั่วโมง) หรือ **Custom** (ลูกค้าเลือก vCPU, RAM และดิสก์ โดยคิดราคาตามทรัพยากร) แพ็กเกจมาจาก [Plans](https://nexcmp.com/th/docs/catalog/plans/) 4. **Billing cycle** — แบบ **Hourly** หรือรอบชำระเงินล่วงหน้ารายเดือน/รายปีพร้อมส่วนลด (เช่น 1 ปี −10%, 2 ปี −15%, 3 ปี −20%) 5. **Operating system** — รายการเทมเพลต, **My Images** (สิ่งที่ลูกค้าอัปโหลดเอง) และเวอร์ชัน 6. **Hostname & quantity** — ชื่อ (หรือ **Randomize**) และจำนวนเซิร์ฟเวอร์ ![หน้าสั่งซื้อแสดงขั้นตอนบริการ สถานที่ และแพ็กเกจ](https://nexcmp.com/th/docs/images/portal/ordering-01-plan.webp) ![ขั้นตอนรอบบิลและระบบปฏิบัติการของหน้าสั่งซื้อ](https://nexcmp.com/th/docs/images/portal/ordering-02-cycle-os.webp) ## การดำเนินการสั่งซื้อ {#placing-the-order} หน้าสรุปจะแสดงราคา คำสั่งซื้อจะถูกหักเงินจากกระเป๋าเงิน **ก่อน** การเตรียมใช้งาน หลังจากการตรวจสอบ [quota check](https://nexcmp.com/th/docs/billing/quotas/) และกฎ [minimum balance](https://nexcmp.com/th/docs/billing/minimum-top-up/) โดยทั่วไป VM จะเข้าสู่สถานะ *Running* ภายในเวลาประมาณหนึ่งนาที ลูกค้าจะเห็นขั้นตอนการเตรียมใช้งานในแท็บ **Activity** ของ VM และได้รับอีเมล "VM ready" พร้อมรหัสผ่านเริ่มต้น (แสดงให้เห็นหนึ่งครั้งเป็นเวลา 10 นาที) ## สิ่งที่สามารถหยุดคำสั่งซื้อได้ {#what-can-stop-an-order} | ข้อความ / สาเหตุ | วิธีแก้ปัญหา | |---|---| | ยอดเงินคงเหลือไม่เพียงพอ | เติมเงิน — [Sign-up, wallet and top-up](https://nexcmp.com/th/docs/portal/sign-up-and-wallet/) | | เกินโควตา | เพิ่มโควตา — [Quotas](https://nexcmp.com/th/docs/billing/quotas/) | | ยังไม่ได้ยืนยันอีเมล | ลูกค้ายืนยันอีเมล | | ไม่มีแพ็กเกจสำหรับสถานที่ที่เลือก | ทำให้มีแพ็กเกจในโซนนั้น — [Plans](https://nexcmp.com/th/docs/catalog/plans/) | | ไลเซนส์ไม่ถูกต้อง | ลูกค้าไม่สามารถสร้างบริการใหม่ได้ — [License](https://nexcmp.com/th/docs/getting-started/license-and-purchase/#if-the-license-is-not-valid) | --- # เครื่องเสมือน {#virtual-machines} > **ตำแหน่งในพอร์ทัล:** Instances (`/vms`) และหน้าของ VM (`/vms/`) **Instances** แสดงรายการ VM ของลูกค้า พร้อมชื่อ, OS, สถานะ, IP, สเปก และค่าใช้จ่าย คลิกที่รายการเพื่อเปิดหน้าของ VM นั้น ## หน้า VM {#the-vm-page} แท็บ: **Overview**, **Console**, **AI SSH Agent** (เมื่อเปิดใช้งานโมดูล AI), **Monitoring**, **Storage**, **Network**, **Configuration**, **Billing**, **Activity** ![ภาพรวมของ Virtual Machine พร้อมสถานะ, สเปก, IP, กราฟแบนด์วิดท์ และบันทึกการดำเนินการ](https://nexcmp.com/th/docs/images/portal/virtual-machines-01-overview.webp) ### การดำเนินการ {#actions} | การดำเนินการ | ผลลัพธ์ | |---|---| | คอนโซล | เปิดคอนโซลเบราว์เซอร์ — [Console](https://nexcmp.com/th/docs/portal/console/) | | Restart / Stop / Force stop | การควบคุมพลังงาน | | รีเซ็ตรหัสผ่าน | สร้างรหัสผ่านใหม่ แสดงเพียงครั้งเดียว | | ติดตั้ง OS ใหม่ | สร้างใหม่จากเทมเพลต ข้อมูลจะสูญหาย | | เปลี่ยน IP | เปลี่ยน IP สาธารณะ (หากแหล่งที่มารองรับ) | | เปิดใช้งาน Auto Scaling | ปรับสัดส่วน CPU/RAM ภายใต้ภาระงานเมื่อเปิดใช้งาน | | ลบ | ทำลาย VM การคิดเงินรายชั่วโมงจะหยุดลง | ### ข้อมูลที่แสดง {#information-shown} เวลาทำงาน, ค่าใช้จ่ายในเดือนนี้, vCPU/RAM/ดิสก์พร้อมการใช้งานจริง, IP สาธารณะและส่วนตัว, ชื่อผู้ใช้, กราฟแบนด์วิดท์, บันทึกการดำเนินการ และสรุปการเรียกเก็บเงิน (แพ็กเกจ, รอบ, ชั่วโมง, ที่เหลือ). ::: info ฟิลด์ขึ้นอยู่กับแหล่งที่มา หน้า VM จะแสดงเฉพาะสิ่งที่แหล่งที่มานั้นรองรับ ตัวอย่างเช่น VM ของ Proxmox VE จะไม่มีการส่งต่อพอร์ตหรือเปลี่ยน IP และรายการ OS จะเป็นไปตามชุดเทมเพลตของคลัสเตอร์นั้น ดูตารางความสามารถได้ใน [Proxmox VE](https://nexcmp.com/th/docs/infrastructure/proxmox/). ::: ## แท็บ Billing {#billing-tab} แสดงแพ็กเกจ, รอบ, ชั่วโมงรวม, เวลาที่เหลือ และบันทึกการเรียกเก็บเงิน VM รายชั่วโมงจะสะสมจนกว่าจะถูกลบ ลูกค้าสามารถ **switch cycle** เพื่อชำระเงินล่วงหน้าสำหรับระยะเวลาที่นานขึ้นพร้อมส่วนลด. ## สำหรับผู้ดูแลระบบ {#for-administrators} VM เดียวกันนี้จะปรากฏภายใต้ Services › Virtual Machines ในคอนโซลผู้ดูแลระบบ ซึ่งคุณสามารถดำเนินการแทนลูกค้าหรือ [log in as](https://nexcmp.com/th/docs/customers/login-as/) พวกเขาได้. --- # คอนโซล {#console} > **ตำแหน่งในพอร์ทัล:** หน้าของ VM → แท็บ **Console** **ตำแหน่งในแอดมิน:** System › Admin › License & updates → โมดูล (web SSH). ## What it does {#what-it-does} แท็บ **Console** จะเปิดเซสชันกราฟิก (VNC) ไปยัง VM ในเบราว์เซอร์ แม้ว่าเครือข่ายภายใน VM จะใช้งานไม่ได้ก็ตาม เทอร์มินัล **web SSH** มีให้ใช้งานเป็นตัวเลือกที่สองเมื่อเปิดใช้งานโมดูล SSH. ## ข้อกำหนด {#requirements} | Item | VNC console | Web SSH | |---|---|---| | CloudStack | Console proxy VM (CPVM) ที่เข้าถึงได้โดยพาเนล — ดู [CloudStack](https://nexcmp.com/th/docs/infrastructure/cloudstack/) | พอร์ต SSH ที่เข้าถึงได้บน VM | | Proxmox VE | ทำงานผ่านพาเนล (noVNC ผ่าน Proxmox API; มีการตรึงลายพิมพ์นิ้วมือ TLS) — ดู [Proxmox VE](https://nexcmp.com/th/docs/infrastructure/proxmox/) | เช่นเดียวกัน | | Panel | URL ของคอนโซลที่ตั้งค่าไว้ใน [General settings](https://nexcmp.com/th/docs/administration/general-settings/) | บริการ `ssh-proxy` และแฟล็กโมดูล `feature_ssh_web` ปิดใช้งานโดยค่าเริ่มต้น — ดูที่ [Modules](https://nexcmp.com/th/docs/infrastructure/modules/) | หากโมดูล web SSH ปิดอยู่ แท็บจะแสดง **VNC only**. ## วิธีใช้งาน {#use-it} 1. เปิด VM → **Console**. 2. คลิก **Console** (หรือ **Open in new window**). ระบบจะออกตั๋วที่มีอายุสั้นและเปิดคอนโซลที่ `https:///console`. 3. เข้าสู่ระบบด้วยชื่อผู้ใช้และรหัสผ่านของ VM (มองเห็นได้บนแท็บ Overview; รีเซ็ตหากลืม). ![แท็บ Console ของเครื่องเสมือน](https://nexcmp.com/th/docs/images/portal/console-01-tab.webp) ## การแก้ Problme {#troubleshooting} | อาการ | สาเหตุ | วิธีแก้ปัญหา | |---|---|---| | "Disconnected" ทันที | เบราว์เซอร์เก็ทเส้นทางคอนโซลเก่าไว้ | ล้างข้อมูลเว็บไซต์สำหรับโดเมนนั้นแล้วลองใหม่อีกครั้ง | | หน้าจอดำ | VM ถูกหยุดหรือกำลังบูต | เริ่มการทำงาน VM แล้วรอ | | คอนโซลไม่เปิดบน CloudStack | Console proxy VM ไม่ทำงานหรือไม่สามารถเข้าถึงได้ | ตรวจสอบ VM ระบบใน CloudStack | | ไม่มีตัวเลือก SSH | ปิดใช้งานโมดูล Web SSH | เปิดใช้งานเฉพาะหลังจากติดตั้ง `ssh-proxy` แล้ว | --- # Snapshots and backups {#snapshots-and-backups} > **ตำแหน่งในพอร์ทัล:** Snapshots (`/snapshots`), Snapshot schedules (`/snapshots/schedules`), Backups (`/backups`) จะมองเห็นได้ก็ต่อเมื่อเปิดใช้งานฟีเจอร์นี้ในระบบผู้ดูแล ## What it does {#what-it-does} Snapshot จะบันทึกสถานะของดิสก์ VM เพื่อให้ลูกค้าสามารถย้อนกลับได้หลังจากการเปลี่ยนแปลงที่ผิดพลาด คุณสามารถสร้าง Snapshots ได้ด้วยตนเองหรือตามกำหนดเวลา ## ความพร้อมใช้งาน {#availability} | Source | Snapshots | หมายเหตุ | |---|---|---| | CloudStack | ใช่ | สแนปชอตวอลุม โดยคิดค่าบริการพื้นที่จัดเก็บข้อมูลตามที่กำหนด | | Proxmox VE | ใช่ | สูงสุด **5 รายการต่อ VM**; สร้าง แสดงรายการ กู้คืน และลบ | รายการเมนูจะปรากฏขึ้นเมื่อเปิดใช้งานฟีเจอร์สแนปชอตและลูกค้ามี VM ที่มีแหล่งข้อมูลรองรับเท่านั้น ## วิธีใช้งาน {#use-it} 1. เปิด **Snapshots** คลิก **Create** เลือก VM และตั้งชื่อ 2. รอจนกระทั่งสถานะเป็น *ready* 3. หากต้องการย้อนกลับ ให้เลือก **Restore** บนสแนปชอตแล้วยืนยัน — VM จะกลับสู่สถานะดังกล่าว (และจะรีสตาร์ทเมื่อจำเป็น) 4. ลบสแนปชอตที่คุณไม่ต้องการใช้อีกต่อไป ::: warning การกู้คืนจะทิ้งข้อมูลทั้งหมดที่เขียนขึ้นหลังจากการสแนปชอต VM ที่ถูกป้องกันจะไม่สามารถกู้คืนหรือลบจากพอร์ทัลได้ ::: --- # การสนับสนุนลูกค้า {#support-for-customers} > **ตำแหน่งในพอร์ทัล:** ปุ่มแชททุกหน้า, `/chat` และ Support tickets **ตำแหน่งในผู้ดูแล:** Customers › Support › Tickets (`/support/tickets`), แท็บ **Settings** ## สำหรับลูกค้า {#for-customers} - **ปุ่มแชท** (มุมล่างของทุกหน้า): สอบถามคำถาม ระบบ [AI Chat](https://nexcmp.com/th/docs/ai/ai-chat/) จะตอบโดยอิงจากเอกสารคู่มือและข้อมูลบัญชีของลูกค้าเอง **Expand** จะเปิดบทสนทนาเดียวกันบน `/chat` - **พูดคุยกับเจ้าหน้าที่**: ส่งต่อบทสนทนาให้ทีมงานของคุณ (ผ่านกลุ่ม Telegram สำหรับผู้ดูแลระบบ) - ปุ่ม **Telegram / Zalo**: จะปรากฏขึ้นหลังจากที่คุณตั้งค่าลิงก์ในการตั้งค่าการสนับสนุนแล้ว - **ตั๋วสนับสนุน**: สำหรับปัญหาที่ใช้เวลานาน โดยจะส่งการตอบกลับทางอีเมล (`ticket_reply`) ## สำหรับคุณ {#for-you} 1. เปิด **Customers › Support › Tickets** ตั๋วและแชทใหม่จะปรากฏที่นี่พร้อมกับบทสนทนา 2. ตอบกลับในเธรด ลูกค้าจะได้รับอีเมลผ่าน [SMTP](https://nexcmp.com/th/docs/administration/smtp-and-emails/) ของคุณ 3. ในแท็บ **Settings** ให้เปิดหรือปิดวิดเจ็ตแชท ตั้งค่าลิงก์ Telegram และลิงก์ Zalo (เฉพาะ https) และเลือกว่าจะให้ AI ตอบกลับโดยอัตโนมัติหรือไม่ — ดูที่ [AI Chat](https://nexcmp.com/th/docs/ai/ai-chat/) 4. เชื่อมต่อ [Telegram alerts](https://nexcmp.com/th/docs/administration/telegram-notifications/) เพื่อให้ทีมงานของคุณได้รับการแจ้งเตือนเมื่อมีแชทใหม่ --- # ผู้ให้บริการ AI {#ai-provider} > **ตำแหน่งในผู้ดูแล:** System › Settings › AI provider (`/settings/ai`) สวิตช์โมดูล AI อยู่ที่นั่นและบน System › Admin › License & updates (`/license`) การ์ด **Module** ## What it does {#what-it-does} AI Chat (แชทสนับสนุนอัตโนมัติ) และ AI Agent (การดูแลระบบ VM ด้วยภาษาธรรมชาติ) ไม่ได้มาพร้อมกับโมเดลในตัว คุณต้องเลือก **ผู้ให้บริการของคุณเอง**: บริการใดก็ตามที่มี `chat/completions` API ที่ **รองรับ OpenAI** — ตัวอย่างเช่น OpenAI, OpenRouter, เกตเวย์ LiteLLM หรือเซิร์ฟเวอร์ vLLM ของคุณเอง NexCMP จะจัดเก็บเอนด์พอยต์และ API key (แบบเข้ารหัส) และใช้งานสำหรับฟีเจอร์ AI ทุกรายการ คุณชำระเงินให้กับผู้ให้บริการโดยตรง ## ข้อกำหนด {#requirements} | Item | Requirement | |---|---| | Endpoint | URL พื้นฐานที่รองรับ OpenAI (`https://api.openai.com/v1`, `https://ai.example.com/v1`) NexCMP จะต่อท้าย `/chat/completions` กับ URL ที่ลงท้ายด้วย `/v1` สำหรับ URL อื่นๆ จะต่อท้าย `/v1/chat/completions` ส่วน URL ที่ลงท้ายด้วย `/chat/completions` อยู่แล้วจะถูกนำไปใช้ตามนั้น | | Model | โมเดลที่รองรับการเรียกใช้งาน **tool (function) calling** ทั้ง AI Chat และ Agent ต้องอาศัยสิ่งนี้ | | คีย์ API | คีย์สำหรับปลายทางนั้น ควรใช้คีย์ที่มี**การจำกัดวงเงินใช้จ่าย**ฝั่งผู้ให้บริการ (เช่น คีย์เสมือนของ LiteLLM ที่มีงบประมาณรายเดือน) | | Network | เซิร์ฟเวอร์ของแผงควบคุมต้องเข้าถึงปลายทางผ่าน HTTP(S) ได้ URL ที่พิมพ์ในฟอร์มจะอนุญาตให้ชี้ไปยังอินเทอร์เน็ตบนพอร์ต 80, 443, 8080 หรือ 8443 เท่านั้น หากต้องการใช้อีเมลหรือที่อยู่ภายใน ให้บันทึกผู้ให้บริการก่อนแล้วค่อยทดสอบ | | Dependencies | เปิดใช้งานโมดูล **AI** สำหรับ Agent โปรดดูที่ [AI Agent](https://nexcmp.com/th/docs/ai/ai-agent/#requirements) | ## เตรียมโครงสร้างพื้นฐาน {#prepare-the-infrastructure} 1. ลงทะเบียนกับผู้ให้บริการและสร้าง API key หากผู้ให้บริการรองรับงบประมาณหรืออัตราจำกัด ให้กำหนดขีดจำกัดรายเดือน 2. จดบันทึก **base URL** และ**ชื่อโมเดล**ที่แน่นอน (และเลือกเพิ่มโมเดลสำรองได้สูงสุดสี่โมเดล) 3. ทดสอบจากเซิร์ฟเวอร์ NexCMP ก่อนป้อนข้อมูล: ```bash curl -s https://ai.example.com/v1/chat/completions \ -H "Authorization: Bearer XXXX" -H "Content-Type: application/json" \ -d '{"model":"gpt-4o-mini","messages":[{"role":"user","content":"Reply with one word: OK"}]}' ``` คำตอบ JSON ที่มี `choices[0].message.content` หมายความว่าปลายทางทำงานได้ ## เชื่อมต่อใน NexCMP {#connect-in-nexcmp} 1. เปิด **System › Settings › AI provider** 2. ในการ์ด **Module AI** ให้สลับเปิดโมเดล **on** จนกว่าจะเปิด ลูกค้าจะไม่เห็น AI Chat หรือ AI Agent ในพอร์ตัล (คุณยังสามารถสลับเปิดได้ที่ **License & updates**) 3. ในการ์ด **Connection** ให้กรอกข้อมูล: | ฟิลด์ | ตัวอย่าง | หมายเหตุ | |---|---|---| | Use this provider | on | ต้องระบุ base URL, โมเดล และคีย์ จึงจะสามารถเปิดใช้งานได้ | | ชื่อที่แสดง | `LiteLLM` | สูงสุด 60 ตัวอักษร | | Base URL (OpenAI-compatible) | `https://ai.example.com/v1` | `http://` หรือ `https://` สูงสุด 300 ตัวอักษร ห้ามมีช่องว่าง | | Provider API key | `sk-XXXX` | จัดเก็บแบบเข้ารหัส หลังจากนั้นจะแสดงเฉพาะ 4 ตัวอักษรสุดท้าย เว้นว่างไว้หากต้องการคงคีย์เดิมที่จัดเก็บไว้ | | Default model | `gpt-4o-mini` | ตัวอักษร, ตัวเลข และ `- _ . / : @` | | Fallback models | `gemini-2.5-flash` | คั่นด้วยเครื่องหมายจุลภาค สูงสุด 4 โมเดล ใช้เมื่อโมเดลเริ่มต้นล้มเหลว | | Reasoning effort | Default (not sent) | `Minimal`, `Low`, `Medium` หรือ `High` สำหรับโมเดลการใช้เหตุผล (Gemini, o-series) ระดับต่ำจะตอบกลับได้เร็วกว่ามาก คงค่าเริ่มต้นไว้สำหรับโมเดลปกติ | 4. คลิก **Save** แล้วคลิก **Test connection** การทดสอบจะส่งคำถามสั้นๆ หนึ่งคำถามและแสดง `Connected — , ms` หรือข้อผิดพลาดที่ส่งกลับมาจากผู้ให้บริการ ![หน้า AI provider ที่เปิดใช้งานโมดูล AI แล้วและกรอกฟอร์มการเชื่อมต่อด้วยค่าตัวอย่าง](https://nexcmp.com/th/docs/images/ai/ai-providers-01-connection.webp) ### What saving does {#what-saving-does} - การตั้งค่าผู้ให้บริการจะถูกบันทึกเป็นรายการกำหนดค่าเดียว และคีย์จะถูกเข้ารหัสด้วย AES-256-GCM สำหรับจุดประสงค์นี้โดยเฉพาะ โดยใช้มาสเตอร์คีย์ของการติดตั้ง - การตั้งค่าการสนับสนุน **Primary model** และ **Fallback model** (ที่ใช้โดย AI Chat) จะถูกตั้งค่าเป็นโมเดลเริ่มต้นและโมเดลสำรองแรกของคุณโดยอัตโนมัติ - การเปลี่ยนแปลงจะถูกบันทึกในบันทึกการตรวจสอบ (ปลายทาง, โมเดล, คีย์มีการเปลี่ยนแปลงหรือไม่ — แต่จะไม่บันทึกตัวคีย์) ## ตรวจสอบ {#verify} 1. **Test connection** แสดงเป็นสีเขียว 2. ลงชื่อเข้าใช้พอร์ตัลในฐานะลูกค้าทดสอบ: เมนูจะแสดง **AI Chat** (หรือปุ่มแชท) และ **AI Agent** 3. ถาม AI Chat ว่า "ยอดคงเหลือของฉันคือเท่าไหร่?" คำตอบที่แสดงยอดคงเหลือจริงของคุณจะระบุว่าผู้ให้บริการจัดการกับการเรียกใช้เครื่องมือได้อย่างถูกต้อง ## ขีดจำกัดและหมายเหตุ {#limits-notes} - **ผู้ให้บริการรายเดียว** NexCMP ใช้ผู้ให้บริการที่กำหนดค่าไว้เพียงรายเดียวสำหรับ Chat, Agent และการตรวจสอบตั๋ว โมเดลสำรองช่วยให้มีความยืดหยุ่นภายในผู้ให้บริการรายนั้น - **ความปลอดภัยของคีย์** คีย์ที่บันทึกไว้จะถูกส่งไปยังปลายทางที่บันทึกไว้เท่านั้น หากคุณเปลี่ยน Base URL คุณต้องพิมพ์คีย์ใหม่อีกครั้งก่อนทำการทดสอบ - **Limits per customer.** AI Chat เป็นบริการสำหรับลูกค้าที่เข้าสู่ระบบแล้วเท่านั้น โดยมีขีดจำกัดข้อความต่อนาทีและต่อแชท ตัว Agent มีขีดจำกัดการเรียกใช้งานต่อวันต่อบัญชี ดูข้อมูลเพิ่มเติมที่ [AI Chat](https://nexcmp.com/th/docs/ai/ai-chat/) และ [AI Agent](https://nexcmp.com/th/docs/ai/ai-agent/). - **Privacy.** คำถามของลูกค้าและข้อมูลที่ AI อ่านสำหรับลูกค้านั้น ๆ (แบบอ่านอย่างเดียว) จะถูกส่งไปยังผู้ให้บริการของคุณ โปรดระบุเรื่องนี้ไว้ใน [privacy policy](https://nexcmp.com/th/docs/customers/legal/) ของคุณ. - **Cost control.** NexCMP ไม่ได้คิดค่าใช้จ่าย AI ตามการใช้งานจริง โปรดใช้ฟีเจอร์ควบคุมงบประมาณของผู้ให้บริการ - คุณสามารถปิดใช้งานโมดูลได้ตลอดเวลา: เมนู AI จะหายไป และเราต์ AI จะตอบกลับเป็น 404 `module_disabled` โดย background job บางตัวของ AI Chat (การตรวจสอบทิกเก็ต, การตอบกลับที่ล่าช้า) จะเริ่มใช้การเปลี่ยนแปลงนี้เมื่อรีสตาร์ท panel ในครั้งถัดไป ## การแก้ Problme {#troubleshooting} | อาการ | สาเหตุ | วิธีแก้ปัญหา | |---|---|---| | `base_url must be an http(s) URL` | รูปแบบหรือช่องว่างไม่ถูกต้อง | ใช้ `https://host/v1` | | `api_key is required to enable the provider` | ไม่มีคีย์ที่บันทึกไว้ | ป้อนคีย์และบันทึก | | `base_url and model are required to enable the provider` | ช่องว่าง | กรอกทั้งสองช่อง | | "Base URL ถูกบล็อก: เฉพาะ public http(s) เท่านั้น, พอร์ต 80/443/8080/8443" | กำลังทดสอบที่อยู่ภายในระบบที่ยังไม่ได้บันทึกหรือพอร์ตอื่น | บันทึกข้อมูลผู้ให้บริการก่อน แล้วจึงทำการทดสอบ | | `api_key is required (enter the key again when you change the endpoint)` | Base URL แตกต่างจากที่บันทึกไว้ | พิมพ์คีย์ใหม่อีกครั้ง | | `model: letters, digits and - _ . / : @` | อักขระไม่ถูกต้อง | ใช้รหัสโมเดลที่ถูกต้องของผู้ให้บริการ | | `fallback_models: up to 4 model names` | มีจำนวนมากเกินไป | คงไว้ที่สี่รายการหรือน้อยกว่า | | การทดสอบล้มเหลวด้วยรหัส 401 | Wrong key | ตรวจสอบคีย์และเอ็นด์พอยต์ | | การทดสอบล้มเหลวด้วยรหัส 404 หรือ "model not found" | เส้นทางหรือโมเดลไม่ถูกต้อง | ตรวจสอบ base URL (`/v1`) และรหัสโมเดล | | `Too many tests — wait a minute` (429) | มากกว่า 10 การทดสอบต่อนาที | โปรดรอสักครู่ | | พอร์ทัลยังคงไม่แสดงเมนู AI | โมเดลปิดอยู่ หรือผู้ให้บริการไม่ได้ตั้งค่าเป็น "in use" | เปิดใช้งานโมดูลและเปิดใช้งานผู้ให้บริการ | --- # AI Chat {#ai-chat} > **ตำแหน่งใน Admin:** Customers › Support › Ticket, แท็บ **AI settings** (`/support/tickets?tab=settings`). ผู้ให้บริการและโมดูล: System › Settings › AI provider (`/settings/ai`). **ตำแหน่งใน Portal:** ปุ่มแชตแบบลอยและหน้า `/chat` (โหมด **Ask AI**) ## What it does {#what-it-does} AI Chat ตอบคำถามของลูกค้าได้ตลอด 24 ชั่วโมง ค้นหาข้อมูลบัญชี*ของลูกค้าเอง* (ยอดคงเหลือ, บริการ, การชำระเงิน, ข้อผิดพลาดล่าสุด) และสามารถดำเนินการแทนได้ เช่น สร้าง VM, เปลี่ยนแผน หลังจากที่ลูกค้ายืนยันแล้ว เมื่อผู้ช่วยไม่สามารถช่วยเหลือได้ ลูกค้าสามารถคลิก **Talk to a human** เพื่อส่งแชทไปยังเจ้าหน้าที่ของคุณบน Telegram และหากไม่มีใครตอบภายในเวลาที่กำหนด จะถูกเปลี่ยนเป็นตั๋วสนับสนุน การตั้งค่า AI แบบเดียวกันนี้ยังช่วยให้ระบบ **ตรวจสอบตั๋วสนับสนุน** ให้กับเจ้าหน้าที่ของคุณได้อีกด้วย ## ข้อกำหนด {#requirements} | Item | Requirement | |---|---| | โมดูลและผู้ให้บริการ | เปิดใช้งานโมดูล **AI** และบันทึก [AI provider](https://nexcmp.com/th/docs/ai/ai-providers/) พร้อมใช้งานแล้ว หากไม่มีผู้ให้บริการ ระบบจะแจ้งว่ายังไม่ได้กำหนดค่า | | ลูกค้า | **Signed-in customers only.** ใน NexCMP ที่ติดตั้งแล้วไม่มีเว็บไซต์สาธารณะ ดังนั้นผู้เยี่ยมชมที่ยังไม่ได้เข้าสู่ระบบจะได้รับข้อความ "Sign in to use AI Chat". | | ช่องทางสำหรับเจ้าหน้าที่ (ไม่บังคับ) | บอท Telegram และแชทสำหรับการแจ้งเตือนผู้ดูแลระบบ (ดู [Telegram notifications](https://nexcmp.com/th/docs/administration/telegram-notifications/)) ช่องทางเดียวกันนี้จะได้รับเคสแชทที่ส่งต่อและร่างตั๋วสนับสนุน | | Dependencies | [AI provider](https://nexcmp.com/th/docs/ai/ai-providers/). | ## เตรียมโครงสร้างพื้นฐาน {#prepare-the-infrastructure} ไม่จำเป็นต้องมีสิ่งอื่นนอกเหนือจาก AI provider หากคุณต้องการส่งต่อให้เจ้าหน้าที่: 1. สร้างบอท Telegram ผ่าน @BotFather และบันทึกโทเค็นไว้ 2. สร้างกลุ่มหรือใช้แชทส่วนตัวของคุณกับบอท แล้วจดจำ Chat ID ไว้ 3. ป้อนข้อมูลทั้งสองอย่างใน System › Settings › Admin alerts (ดู [Telegram notifications](https://nexcmp.com/th/docs/administration/telegram-notifications/)) ฟีเจอร์ซัพพอร์ตจะใช้บอทและแชทนั้นซ้ำ ## เชื่อมต่อใน NexCMP {#connect-in-nexcmp} 1. ตรวจสอบให้แน่ใจว่าเปิดใช้งานโมดูล AI แล้วและผู้ให้บริการทดสอบผ่านเป็นสีเขียว ([AI provider](https://nexcmp.com/th/docs/ai/ai-providers/)) 2. เปิด **Customers › Support › Ticket** และเลือกแท็บ **AI settings** ส่วนบนของการ์ดด้านซ้ายจะแสดงป้ายกำกับสามป้าย: *AI provider: configured*, *Telegram: channel present* และ *On shift* หรือ *Off shift* 3. การ์ดด้านซ้าย **AI + Telegram**: | สวิตช์หรือฟิลด์ | ค่าเริ่มต้น | ความหมาย | |---|---|---| | AI ตรวจสอบตั๋วโดยอัตโนมัติ | เปิด | สำหรับตั๋วหรือข้อความใหม่ AI จะอ่านข้อมูลของลูกค้า (แบบอ่านอย่างเดียว) และเขียนสาเหตุที่เป็นไปได้พร้อมร่างคำตอบเป็น**บันทึกภายใน** โดยจะไม่ส่งให้ลูกค้าเด็ดขาด | | การแจ้งเตือน Telegram ถึงผู้ดูแลระบบ | เปิด | บันทึกจะส่งมาที่ Telegram พร้อมปุ่ม Send, Edit และ Skip | | AI ตอบกลับอัตโนมัติ | ปิด | ส่งคำตอบวิธีใช้หรือการขายง่ายๆ ด้วยตนเองเมื่อเงื่อนไขความปลอดภัยทั้งหมดเป็นไปตามกำหนด (ความมั่นใจ 85 % ขึ้นไป, ไม่มีคำเตือน); ส่งหลังจากผ่านไป 3 นาทีและยกเลิกบน Telegram ได้ | | หมวดหมู่ที่อนุญาตให้ตอบกลับอัตโนมัติ | `how_to`, `sales` | เฉพาะหมวดหมู่เหล่านี้เท่านั้น | | โมเดลหลัก, โมเดลสำรอง | ตั้งค่าจากผู้ให้บริการ | โดยปกติให้ปล่อยไว้ตามที่บันทึกไว้โดยหน้าผู้ให้บริการ AI | | User ID ของ Telegram ที่ได้รับอนุญาตให้ดำเนินการ | empty | หากว่างไว้จะหมายถึงแชทของช่องแจ้งเตือน | 4. การ์ดด้านขวา **Live chat (customer widget)**: | ฟิลด์ | ค่าเริ่มต้น | ความหมาย | |---|---|---| | เปิดใช้งานวิดเจ็ตแชท | เปิด | ฟองแชทและหน้า `/chat` | | เวลาทำการซัพพอร์ต (เวลาเวียดนาม) | `08:00-22:00` | เวลาที่คาดว่าพนักงานจะตอบบน Telegram นอกเวลาเหล่านี้ หรือเมื่อไม่มีช่อง Telegram **Talk to a human** จะเปลี่ยนแชทเป็นตั๋วทันที | | เวลารอสูงสุดสำหรับพนักงาน (นาที) จากนั้นแปลงเป็นตั๋ว | 10 | 1 ถึง 240 | | จำนวนครั้งของ AI / วัน / ลูกค้า | 40 | 1 ถึง 1000 เมื่อถึงขีดจำกัด ผู้ช่วยจะเชิญชวนให้ลูกค้าคุยกับมนุษย์ | | แชทใหม่ / ชั่วโมง / IP | 20 | 1 ถึง 1000 | | **ลิงก์ Zalo OA** | empty | `https://zalo.me/...` แสดงปุ่ม **Chat on Zalo** (พร้อมคิวอาร์โค้ด) ในแชท หากเว้นว่างไว้จะซ่อนปุ่มนี้ | | **ลิงก์ Telegram** | empty | `https://t.me/...` แสดงปุ่ม **Telegram** หากเว้นว่างไว้จะซ่อนปุ่มนี้ | | ขีดจำกัดรายวันทั่วทั้งระบบสำหรับรอบการทำงานของ AI สำหรับลูกค้าที่เข้าสู่ระบบ | 2000 | | | ขีดจำกัดรายวันทั่วทั้งระบบสำหรับผู้เยี่ยมชม | 500 | พูลของตัวเอง; ไม่ได้ใช้งานในขณะที่ผู้เยี่ยมชมไม่สามารถแชทได้ | | ขีดจำกัดรายวันทั่วทั้งระบบสำหรับการตรวจสอบตั๋วอัตโนมัติ | 200 | | | เส้นทางผู้ดูแลระบบ (ปุ่ม Telegram "Open admin") | empty | URL ผู้ดูแลระบบของคุณ เช่น `https://cloud.example.com/admin` | สวิตช์หรือฟิลด์แต่ละรายการจะบันทึกอัตโนมัติเมื่อคุณเปลี่ยนแปลง 5. ที่ด้านล่างสุด **Reply templates** (ชื่อ, ภาษา VI/EN/ZH, ข้อความสูงสุด 4,000ตัวอักษร) ช่วยให้พนักงานมีข้อความสำเร็จรูปเตรียมไว้ ![แท็บ AI settings พร้อมสวิตช์ AI และ Telegram รวมถึงขีดจำกัดของไลฟ์แชทและลิงก์ทางลัด](https://nexcmp.com/th/docs/images/ai/ai-chat-01-settings.webp) ![หน้าแชทของลูกค้ากับผู้ช่วย, ปุ่มทางลัด Zalo และ Telegram และตัวเลือกสำหรับคุยกับเจ้าหน้าที่ที่เป็นมนุษย์](https://nexcmp.com/th/docs/images/ai/ai-chat-02-portal.webp) ## สิ่งที่ผู้ช่วยทำได้และทำไม่ได้ {#what-the-assistant-can-and-cannot-do} - **อ่าน:** ค้นหาในฐานความรู้และเอกสารสาธารณะของคุณ และอ่านข้อมูลของลูกค้าที่เข้าสู่ระบบผ่านเครื่องมือแบบอ่านอย่างเดียว โดยจะไม่สามารถมองเห็นข้อมูลของลูกค้ารายอื่นได้ - **ดำเนินการ:** ใช้สิทธิ์ API ของลูกค้าเอง การทำงานแบบ *อ่าน* จะทำงานทันที ส่วนสิ่งใดก็ตามที่มีการเปลี่ยนแปลงหรือมีค่าใช้จ่ายจะสร้าง **การ์ดการยืนยัน** ("ต้องการการยืนยันของคุณ" พร้อมแท็ก *มีค่าใช้จ่าย* หรือ *ลบ*); จะไม่มีการดำเนินการใดๆ จนกว่าลูกค้าจะคลิก **Confirm** แชทหนึ่งรายการสามารถมีการ์ดที่รอดำเนินการได้สูงสุด 3 ใบ และหนึ่งบัญชีสามารถทำ ภารกิจการเขียนที่ได้รับการยืนยันได้สูงสุด 10 ครั้งต่อชั่วโมง - **ไม่อนุญาตเด็ดขาด:** ไม่สามารถเปิดคอนโซล, สร้างโทเค็น SSH หรือคอนโซล, ดาวน์โหลดไฟล์เข้าถึง Kubernetes, รีเซ็ตรหัสผ่าน หรือแสดงข้อมูลลับ เช่น รหัสผ่านพร็อกซี่หรือข้อมูลลับ S3 ข้อมูลลับจะไม่ถูกนำไปใส่ในบริบทของโมเดลหรือประวัติการแชท - **ความปลอดภัย:** คำตอบจะผ่านตัวกรองผลลัพธ์; ข้อความของลูกค้าและผลลัพธ์จากเครื่องมือจะถูกปฏิบัติเสมือนเป็นข้อมูล ไม่ใช่คำสั่ง - **แบนเนอร์แจ้งเตือนความโปร่งใส:** หน้าแชทจะแสดงข้อความ "ตอบโดย AI assistant — อาจมีความคลาดเคลื่อน โปรดติดต่อเจ้าหน้าที่สำหรับเรื่องที่สำคัญ" ## การส่งต่อให้เจ้าหน้าที่ {#staff-hand-off} 1. ลูกค้าคลิก **Talk to a human** และอาจฝากอีเมลไว้ได้ 2. ข้อความพร้อมบทสนทนาจะถูกส่งไปยังแชท Telegram ของเจ้าหน้าที่ เจ้าหน้าที่สามารถตอบกลับได้โดยการตอบกลับข้อความนั้น ซึ่งข้อความตอบกลับจะปรากฏในแชทของลูกค้าในฐานะ "[brand] Support" 3. หากไม่มีใครตอบภายในเวลาที่กำหนด (ค่าเริ่มต้น 10 นาที) แชทจะกลายเป็นตั๋วสนับสนุนภายใต้ **Customers › Support › Ticket** เหตุการณ์เดียวกันนี้จะเกิดขึ้นทันทีนอกเวลาทำการหรือเมื่อไม่ได้กำหนดค่า Telegram และลูกค้าจะได้รับการแจ้งว่าได้เปิดตั๋วเรียบร้อยแล้ว 4. ผู้ดูแลระบบยังสามารถดูแชทที่กำลังดำเนินอยู่ได้ในแท็บ **Live chat** ## ตรวจสอบ {#verify} 1. เข้าสู่ระบบในฐานะลูกค้าทดสอบ เปิดแชท และสอบถามคำถามเกี่ยวกับบริการของคุณ ผู้ช่วยจะตอบกลับ 2. ลองขอให้สร้างบางสิ่งที่ต้องมีค่าใช้จ่าย: การ์ดการยืนยันจะปรากฏขึ้นและจะไม่มีการสร้างสิ่งใดๆ จนกว่าคุณจะคลิก **Confirm** 3. คลิก **Talk to a human** ข้อความจะส่งไปยังแชท Telegram ของคุณ (หากมีการกำหนดค่า) หรือตั๋วจะปรากฏขึ้นหลังพ้นเวลารอ 4. เมื่อใส่ลิงก์ Zalo และ Telegram แล้ว ปุ่มทางลัดทั้งสองจะปรากฏขึ้นในแชท ## ขีดจำกัดและหมายเหตุ {#limits-notes} - **ขีดจำกัดอัตราการใช้งาน (ต่อ IP):** 20 ข้อความต่อนาทีและการส่งต่อจำนวนหนึ่งต่อชั่วโมง; **40 ข้อความต่อหนึ่งบทสนทนา** ค่าเหล่านี้เป็นค่าคงที่ - **ค่าใช้จ่าย:** ทุกรอบการทำงานของ AI จะมีการเรียกไปยังผู้ให้บริการของคุณ ลดค่า **AI turns / day / customer** เพื่อจำกัดค่าใช้จ่าย - **ระบบตอบกลับอัตโนมัติถูกปิดใช้งานไว้โดยค่าเริ่มต้น** ให้เปิดใช้งานก็ต่อเมื่อคุณได้สังเกตการณ์ร่างข้อความมาระยะหนึ่งแล้ว - **ภาษา:** ผู้ช่วยจะตอบกลับในภาษาของลูกค้า โดยระบบจะตรวจจับภาษาเวียดนามจากข้อความ - **ผู้แทนจำหน่าย:** เว็บไซต์ของผู้แทนจำหน่ายจะใช้ระบบตั๋วแทนวิดเจ็ต ## การแก้ Problme {#troubleshooting} | อาการ | สาเหตุ | วิธีแก้ปัญหา | |---|---|---| | ลูกค้าไม่เห็นหน้าแชท | โมดูล AI ปิดอยู่ หรือตัวเลือก **Enable chat widget** ปิดอยู่ | เปิดใช้งานทั้งสองตัวเลือก | | "Sign in to use AI Chat" | ผู้เข้าชมยังไม่ได้เข้าสู่ระบบ | พฤติกรรมปกติใน NexCMP: โปรดเข้าสู่ระบบก่อน | | ผู้ช่วยแจ้งว่าไม่มีการกำหนดค่าผู้ให้บริการ AI | ยังไม่ได้กำหนดผู้ให้บริการ, ไม่ได้ใช้งาน, หรือคีย์หายไป | ตั้งค่า [AI provider](https://nexcmp.com/th/docs/ai/ai-providers/) ให้สมบูรณ์ | | AI ตอบว่า "talk to a human" หลังจากถามไปไม่กี่คำถาม | ถึงขีดจำกัดรายวันต่อลูกค้ารายนั้นแล้ว | เพิ่มค่า **AI turns / day / customer** | | แท็ก Telegram แสดงข้อความ "no channel" | ยังไม่ได้กำหนดค่าบอทหรือ Chat ID | ตั้งค่า [Telegram notifications](https://nexcmp.com/th/docs/administration/telegram-notifications/) | | ปุ่ม Zalo หรือ Telegram หายไป | ช่องลิงก์ว่างอยู่ | กรอกข้อมูลลิงก์ | | "Too many requests" ในแชท | มีการส่งมากกว่า 20 ข้อความต่อนาทีจาก IP เดียวกัน | รอสักครู่ | | การสนทนาในแชทเต็ม | ครบ 40 ข้อความแล้ว | เริ่มการสนทนาใหม่ | --- # AI Agent {#ai-agent} > **ตำแหน่งในแอดมิน:** System › Settings › AI provider (`/settings/ai`) — สวิตช์เปิดปิดโมดูลและผู้ให้บริการ; System › Admin › License & updates (`/license`) — สวิตช์เปิดปิดโมดูล **ตำแหน่งในพอร์ทัล:** AI Agent (`/ai/agent`) และหน้า `/chat/agent` หรือโหมด **Agent** ภายในแชท ## What it does {#what-it-does} AI Agent จะเชื่อมต่อกับ Linux VM ของลูกค้าเองผ่าน SSH และดำเนินงานตามที่อธิบายด้วยภาษาธรรมชาติ เช่น "check system health", "install Docker", "find recent errors", "free up disk space" โดยจะแสดงทุกคำสั่งที่เสนอพร้อมผลลัพธ์ คำสั่งที่เป็นการอ่านอย่างเดียวสามารถรันได้โดยอัตโนมัติ แต่คำสั่งใดๆ ที่เปลี่ยนแปลงเซิร์ฟเวอร์จะต้องรอให้ลูกค้ากดปุ่ม **Run** ก่อน ## ข้อกำหนด {#requirements} | Item | Requirement | |---|---| | โมดูล AI และผู้ให้บริการ | เปิดใช้งานโมดูล **AI** และมี [AI provider](https://nexcmp.com/th/docs/ai/ai-providers/) ที่ใช้งานได้ นอกจากนี้ Agent ยังต้องการโมเดลที่รองรับการเรียกใช้ Tool ด้วย | | `openssh-client` บนเซิร์ฟเวอร์พาเนล | Agent รันคำสั่งด้วยโปรแกรม `ssh` (`/usr/bin/ssh`) ของพาเนลเอง ตัวติดตั้งจะติดตั้ง `openssh-client` ให้ ตรวจสอบได้ด้วย `ssh -V` หากไม่มี Agent จะรายงานว่า "ssh client is not installed on the panel server" | | ไม่ต้องใช้เกตเวย์ SSH แยกต่างหาก | ในการติดตั้งค่าเริ่มต้น ระบบจะใช้ SSH ในตัวและ**ไม่**จำเป็นต้องใช้ `ssh-proxy` web terminal ยกเว้นเมื่อเปิดใช้งานฟีเจอร์ *web SSH* เสริม (`feature_ssh_web`) และติดตั้งบริการ `ssh-proxy` แล้ว Agent จึงจะผ่าน `ssh-proxy` แทน | | Network | เซิร์ฟเวอร์พาเนลต้องสามารถเข้าถึง IP ของ VM บนพอร์ต SSH (ค่าเริ่มต้นคือ 22) ได้ ตรวจสอบไฟร์และเวิร์ลและกลุ่มความปลอดภัยระหว่างพาเนลกับเน็ตเวิร์กของแขก | | VM | เป็นของลูกค้า, **กำลังทำงานอยู่**, ไม่ถูกล็อก, เป็น **Linux** (ปฏิเสธ VM ระบบ Windows) และมี IP address ที่เป็นสาธารณะหรือสามารถติดต่อได้ | | ข้อมูลรับรอง SSH | ชื่อผู้ใช้และรหัสผ่านสำหรับเข้าสู่ระบบ VM ที่ NexCMP จัดเก็บไว้ (บันทึกตอนสร้าง VM หรือตอนรีเซ็ต(รหัสผ่าน โดยเข้ารหัสแล้ว) หรือคีย์ปฏิบัติการของพาเนลหากมีการติดตั้งไว้ หากไม่มีทั้งสองอย่าง Agent จะแจ้งว่าไม่สามารถเข้าสู่ระบบได้ | ## เตรียมโครงสร้างพื้นฐาน {#prepare-the-infrastructure} 1. ตรวจสอบ SSH client บนเซิร์ฟเวอร์พาเนล: ```bash ssh -V sudo apt-get install -y openssh-client # only if missing ``` 2. ตรวจสอบว่าเซิร์ฟเวอร์พาเนลสามารถเปิด SSH ไปยัง guest VM ได้: ```bash nc -vz 198.51.100.10 22 ``` แทนที่ที่อยู่ด้วย IP ของ VM ทดสอบ หากขั้นตอนนี้ล้มเหลว ให้แก้ไขการกำหนดเส้นทางหรือไฟร์วอลล์ก่อน 3. ตรวจสอบให้แน่ใจว่า guest อนุญาตให้เข้าสู่ระบบด้วยรหัสผ่านสำหรับผู้ใช้ที่ NexCMP จัดเก็บไว้ (ภาพอิมเมจระบบคลาวด์บางภาพปิดใช้งานไว้) หรือติดตั้งคีย์ปฏิบัติการของพาเนลบน guest แล้ว ## เชื่อมต่อใน NexCMP {#connect-in-nexcmp} 1. ตั้งค่า [AI provider](https://nexcmp.com/th/docs/ai/ai-providers/) ให้เสร็จสิ้น: เปิดใช้งานโมดูล บันทึกผู้ให้บริการแล้ว และสถานะ **Test connection** เป็นสีเขียว 2. ไม่ต้องกำหนดค่าอื่นใดฝั่งแอดมิน สวิตช์โมดูลจะทำให้รายการ **AI Agent** ปรากฏในพอร์ทัลลูกค้า 3. ในฐานะลูกค้า: เปิด **AI Agent** เลือกเซิร์ฟเวอร์ที่กำลังทำงานอยู่ และคลิก **Choose server** หน้าเว็บจะทดสอบ SSH ด้วยคำสั่งตายตัวที่ไม่เป็นอันตรายก่อน (ไม่มีการเรียก AI) และแสดงสถานะ *SSH connected* หรือสาเหตุที่ล้มเหลว 4. พิมพ์งานที่ต้องการหรือเลือกรายการด่วน (*Check system health*, *Install Docker*, *Install Nginx*, *Find recent errors*, *Security check*, *Free up disk space*) ## วิธีการรันคำสั่ง {#how-it-runs-commands} - **แหล่งที่มา:** เซิร์ฟเวอร์พาเนลพร้อมระบบ `ssh` client รันทีละหนึ่งคำสั่งแบบ non-interactive ปลายทางจะเป็น IP ของ VM **จากฐานข้อมูล** เสมอ ไม่ใช่จากคำขอ โดยจะเข้าถึงได้เฉพาะ VM ที่กำลังทำงานอยู่และไม่ถูกล็อกซึ่งเป็นของผู้ใช้เท่านั้น - **การยืนยันตัวตน:** รหัสผ่านที่จัดเก็บไว้จะถูกส่งผ่านตัวช่วย `SSH_ASKPASS` แบบครั้งเดียวในสภาพแวดล้อมกระบวนการ โดยจะไม่ถูกเขียนลงดิสก์หรือใส่ไว้ในบรรทัดคำสั่ง คีย์โฮสต์จะไม่ถูกพิน (VM จะถูกติดตั้งใหม่พร้อมคีย์ใหม่) ผลลัพธ์ต่อหนึ่งคำสั่งจำกัดไว้ที่ 200 KB และแต่ละคำสั่งจะมีเวลาจำกัด (60 วินาที) - **ลูปของ Agent:** AI จะเสนอคำสั่งและอ่านผลลัพธ์ โดยหนึ่งเทิร์นจะสิ้นสุดหลังจากผ่านไปสูงสุด **10 ขั้นตอน** - **โหมด:** | โหมด | พฤติกรรม | |---|---| | **Confirm** | ทุกคำสั่งจะต้องรอการกด **Run** | | **Auto** | เฉพาะคำสั่งที่ผ่านรายการอนุญาตแบบอ่านอย่างเดียวที่เข้มงวดเท่านั้นที่จะรันได้เอง (เช่น `df -h`, `ps`, `journalctl`) ส่วนคำสั่งอื่น ๆ และคำสั่งที่ตัววิเคราะห์ไม่สามารถระบุได้อย่างแน่ชัด (ตัวแปร, การแทนที่คำสั่ง, การเปลี่ยนเส้นทางไปยังไฟล์) จะต้องรอการกด **Run** | - **ป้ายกำกับความเสี่ยง:** คำสั่งที่เขียนทับหรือลบไฟล์, เขียนลงดิสก์, เปลี่ยนแปลงบัญชีหรือ SSH keys, ส่งข้อมูลไปยังเซิร์ฟเวอร์ภายนอก, เปิดการเชื่อมต่อเครือข่ายดิบ, รันโค้ดที่ถูกแปลงให้อ่านยาก, ดาวน์โหลดและรันสคริปต์, ปิดหรือรีสตาร์ทเครื่อง หรือเข้าถึงเซิร์ฟเวอร์อื่น จะแสดงสถานะ **Needs confirmation** เสมอ แม้ว่าจะอยู่ในโหมด Auto ก็ตาม - **ผลลัพธ์ที่ไม่น่าเชื่อถือ:** ผลลัพธ์ของคำสั่งจะแสดงให้โมเดลเห็นว่าเป็นข้อมูลที่ไม่น่าเชื่อถือ และคำสั่งภายในนั้นจะไม่ถูกทำตาม ## ตรวจสอบ {#verify} 1. เลือก VM ทดสอบที่กำลังทำงานอยู่ หน้าเว็บจะแสดงสถานะ *SSH connected* 2. พิมพ์ว่า "Check CPU, RAM and disk" ในโหมด Auto คำสั่งแบบอ่านอย่างเดียวจะทำงานและคำตอบจะสรุปผลให้ 3. พิมพ์ว่า "Install Nginx" คำสั่งติดตั้งจะปรากฏขึ้นพร้อมกับปุ่ม **Run** และ **Skip** จะไม่มีการรันใด ๆ จนกว่าคุณจะกด **Run** 4. ตัวนับที่ด้านบนจะแสดงจำนวนการเรียกใช้งาน AI ที่ใช้ไปในวันนี้ (เช่น `3/300`) ## ขีดจำกัดและหมายเหตุ {#limits-notes} - **ขีดจำกัดรายวัน:** 300 การเรียกใช้งาน AI ต่อลูกค้าหนึ่งรายต่อวัน (UTC) โดยจะรีเซ็ตในเวลา 00:00 UTC เมื่อใช้ครบโควตา Agent จะตอบว่า "Daily AI quota reached" - **การทำงานพร้อมกัน:** สูงสุด 2 การรัน Agent ต่อลูกค้าหนึ่งรายในเวลาเดียวกัน โดยหนึ่งเซสชันจะรันทีละหนึ่งเทิร์น - **เซสชัน:** สูงสุด 100 ข้อความต่อหนึ่งเซสชัน และ 4,000อักขระต่อข้อความ เซสชันหนึ่งจะเป็นของ VM หนึ่งเครื่อง หาก VM ถูกลบหรือโอนย้าย เซสชันเก่าจะกลายเป็นแบบอ่านอย่างเดียว - **VM ที่ถูกล็อก, หยุดทำงาน หรือ Windows:** VM จะแสดงเป็น *Locked*, *Stopped*, *Windows* หรือ *No address* และจะไม่สามารถเลือกได้ - **การสวมสิทธิ์:** ผู้ดูแลระบบที่สวมสิทธิ์เป็นลูกค้าจะไม่สามารถใช้ฟีเจอร์ข้อมูลประจำตัวของ Agent ได้ (ดูที่ [Log in as a customer](https://nexcmp.com/th/docs/customers/login-as/)) - **ความรับผิดชอบ:** Agent อาจเกิดข้อผิดพลาดได้ พอร์ทัลจะแจ้งให้ลูกค้าตรวจสอบคำสั่งก่อนรัน โปรดระบุไว้ในข้อกำหนดการใช้งานของคุณว่าลูกค้าต้องรับผิดชอบต่อคำสั่งที่ตนเองอนุมัติ - การปิดโมดูล AI จะลบรายการ Agent ออกและเส้นทางจะตอบกลับเป็น 404 `module_disabled`. ## การแก้ Problme {#troubleshooting} | อาการ | สาเหตุ | วิธีแก้ปัญหา | |---|---|---| | "ไม่ได้ติดตั้ง ssh client บนเซิร์ฟเวอร์พาเนล (apt install openssh-client)" | ไม่มีไบนารี `ssh` | `sudo apt-get install -y openssh-client`. | | "Agent ไม่สามารถเข้าสู่ระบบได้" / `ssh: no saved credentials for this VM` | ไม่มีรหัสผ่านที่จัดเก็บไว้และไม่มีคีย์การดำเนินงาน | รีเซ็ตรหัสผ่าน VM ในพอร์ทัลเพื่อให้บันทึกใหม่อีกครั้ง หรือติดตั้งคีย์การดำเนินงาน | | "เซิร์ฟเวอร์ไม่ตอบสนองภายในเวลาที่กำหนด" | ไฟร์วอลล์, SSH ไม่ได้เปิดฟังคำขอ (not listening), VM กำลังยุ่ง | ทดสอบ `nc -vz 22` จากเซิร์ฟเวอร์พาเนล และเริ่ม `sshd` ใน VM | | "ไม่สามารถเชื่อมต่อ SSH บนเซิร์ฟเวอร์นี้ได้" | การกำหนดเส้นทางหรือ Security Group | อนุญาตให้เซิร์ฟเวอร์ของระบบจัดการสามารถเชื่อมต่อกับ VM ผ่านพอร์ต 22 ได้ | | "VM ไม่ได้ทำงานอยู่" / "ไม่อนุญาต" | VM ถูกหยุดการทำงาน ล็อก ถูกลบ หรือไม่ใช่ของลูกค้า | เริ่มการทำงานของ VM ปลดล็อก หรือเลือก VM อื่น | | "ไม่พร้อมใช้งาน: N (หยุดทำงาน, ล็อกอยู่ หรือ Windows)" | สาเหตุตามที่ระบุไว้ด้านบน | VM จะต้องใช้ระบบปฏิบัติการ Linux และกำลังทำงานอยู่ | | "เกตเวย์ SSH ไม่พร้อมใช้งานชั่วคราว" | เปิดใช้งานฟีเจอร์ Web SSH อยู่ แต่ `ssh-proxy` ไม่ทำงาน | เริ่มการทำงานของ `ssh-proxy` หรือปิดใช้งานฟีเจอร์ Web SSH เพื่อใช้ SSH ในตัว | | "AI ตอบสนองช้าเกินไป (เกิน 90 วินาที)" | ผู้ให้บริการทำงานช้า | ใช้โมเดลที่เร็วขึ้นหรือลด **Reasoning effort** ลง | | "โควตา AI ประจำวันหมดแล้ว" | ใช้งานครบ 300 ครั้งแล้ว | รอจนกว่าจะถึงเวลา 00:00 UTC | | "เซสชันนี้ยังคงทำงานอยู่" | กำลังดำเนินการอีกรอบการสนทนาอยู่ | รอหรือกด **Stop** | --- # REST API > **ตำแหน่งในพอร์ทัล:** API reference ที่ `https:///apidoc` (สาธารณะ) และ API keys ที่ `/api-keys` **ตำแหน่งในแอดมิน:** Customers › API keys (`/customers/apikeys`) แสดงรายการคีย์ที่ลูกค้าสร้างขึ้น ## What it does {#what-it-does} ทุกการกระทำที่ลูกค้าสามารถทำได้ในพอร์ทัล ไม่ว่าจะเป็นการแสดงรายการและควบคุม VM อ่านใบแจ้งหนี้ จัดการ SSH Keys, Kubernetes, พื้นที่เก็บข้อมูล หรือตั๋วสนับสนุน ล้วนสามารถทำได้ผ่าน REST API ที่มีระบบจัดเก็บเวอร์ชันภายใต้ `https:///v1/` ลูกค้าเรียกใช้งานผ่านสคริปต์และ CI ด้วย **API key** ที่กำหนดขอบเขตสิทธิ์ไว้ API ตัวเดียวกันนี้ยังขับเคลื่อน [`cmp` command-line tool](https://nexcmp.com/th/docs/developers/cmp-cli/) และ [MCP server](https://nexcmp.com/th/docs/developers/mcp/) อีกทั้งคู่มืออ้างอิงยังถูกสร้างขึ้นจากระบบที่กำลังทำงานอยู่จริง จึงแสดงเฉพาะฟีเจอร์ที่คุณเปิดใช้งานไว้เท่านั้น ## ข้อกำหนด {#requirements} | Item | Requirement | |---|---| | Public HTTPS address | API ให้บริการอยู่บนโดเมนหลักของคุณ (และบนโดเมนของรีเซลเลอร์แต่ละราย) | | API key | สร้างโดยลูกค้าในพอร์ทัล ดูที่ [API keys](https://nexcmp.com/th/docs/developers/api-keys/) | | Dependencies | ไม่มี Endpoint ของโมดูลที่คุณไม่ได้เปิดใช้งาน (เช่น Kubernetes หรือ Object Storage) จะถูกซ่อนจากคู่มืออ้างอิงและปฏิเสธการเข้าถึง | ## เตรียมโครงสร้างพื้นฐาน {#prepare-the-infrastructure} ไม่ต้องติดตั้งอะไร หากมี Reverse Proxy อยู่หน้า NexCMP ให้ส่งต่อ `/v1/`, `/mcp`, `/cli/` และ `/apidoc` ไปยังแผงควบคุม (การกำหนดค่า Nginx ของตัว설치โปรแกรมจะจัดการให้เรียบร้อยแล้ว) ## เชื่อมต่อใน NexCMP {#connect-in-nexcmp} ### คู่มืออ้างอิงแบบอินเทอร์แอกทีฟ {#the-interactive-reference} เปิด `https://cloud.example.com/apidoc` (แทนที่โฮสต์ด้วยโดเมนของคุณ ลูกค้าของรีเซลเลอร์จะเห็นคู่มืออ้างอิงบนโดเมนของรีเซลเลอร์พร้อมชื่อของรีเซลเลอร์) ประกอบด้วยเอกสาร Endpoint พร้อมตัวอย่างคำขอและคำตอบในรูปแบบ curl, `cmp` CLI, JavaScript, Python และ Go ช่องค้นหา (Ctrl หรือ Cmd + K) และแผง **Try it** การทดลองใช้งานจะส่งคำขอไปยังเว็บไซต์เดียวกันเท่านั้น โดยใช้คีย์ที่ผู้เข้าชมวางลงไป (เก็บไว้ในเซสชันเบราว์เซอร์) ค่าเริ่มต้นจะเป็นแบบอ่านอย่างเดียว และการเรียกใช้งานที่มีการเขียนข้อมูลหรือมีค่าใช้จ่ายจะต้องใช้สวิตช์เพิ่มเติมและการยืนยัน ### ไฟล์ดาวน์โหลดและเอกสารที่เครื่องอ่านได้ {#downloads-and-machine-readable-documents} ทั้งหมดเป็นแบบสาธารณะ ไม่ต้องใช้คีย์ และสร้างขึ้นสำหรับแต่ละเว็บไซต์: | URL | เนื้อหา | |---|---| | `/apidoc` | คู่มืออ้างอิงแบบอินเทอร์แอกทีฟ | | `/v1/public/openapi.json` | เอกสาร OpenAPI 3.1 | | `/v1/public/openapi.yaml` | รูปแบบเดียวกัน ในรูปแบบ YAML | | `/v1/public/postman.json` | Postman collection | | `/v1/public/insomnia.json` | Insomnia export | | `/v1/public/api.md` | คู่มืออ้างอิงในรูปแบบไฟล์ Markdown เดี่ยว | | `/v1/public/api-catalog` | JSON ขนาดกะทัดรัด: แบรนด์, base URL, คำนำหน้าคีย์, ทุก scope และทุก endpoint พร้อม method, path, scope และระบุว่าจำเป็นต้องใช้ `Idempotency-Key` หรือไม่ | ```bash curl -s https://cloud.example.com/v1/public/api-catalog | python3 -m json.tool | head -40 curl -sO https://cloud.example.com/v1/public/openapi.yaml ``` ใน Postman ให้เลือก **Import › Link** แล้ววาง `https://cloud.example.com/v1/public/postman.json` หน้ารายการอ้างอิงยังมี API client แบบไฟล์เดียวสำหรับ JavaScript และ Python อีกด้วย ### การยืนยันตัวตน {#authentication} ส่งคีย์ในเฮดเดอร์ `Authorization`: ```bash curl -s https://cloud.example.com/v1/billing/wallet \ -H "Authorization: Bearer vk_XXXX" ``` - คีย์ของลูกค้าจะขึ้นต้นด้วย `vk_` โดยคีย์จะถูก **ผูกกับไซต์ (site-bound)**: คีย์ที่สร้างขึ้นบน `cloud.example.com` จะไม่สามารถใช้งานบนโดเมนของผู้ค้าต่อได้ - โทเค็นเซสชันของเบราว์เซอร์ (`pt_...`) มีไว้สำหรับพอร์ทัลเท่านั้น โปรดใช้คีย์สำหรับงานอัตโนมัติ - สิทธิ์ **scopes** ของคีย์จะเป็นตัวกำหนดสิ่งที่คีย์นั้นสามารถเรียกใช้งานได้ โดยหากไม่มีสิทธิ์จะได้รับข้อผิดพลาด HTTP 403 `scope_required` ดูข้อมูลเพิ่มเติมได้ที่ [API keys](https://nexcmp.com/th/docs/developers/api-keys/). - คุณสามารถตรวจสอบคีย์ได้ด้วย `GET /v1/apikeys/self` ซึ่งจะส่งคืนชื่อสิทธิ์ขอบเขต วันหมดอายุ และโควต้าอัตราการเรียกใช้งานที่เหลือของคีย์นั้น (ทุกคีย์สามารถเรียกใช้งานได้) ### ตัวอย่าง {#examples} ```bash # List virtual machines curl -s "https://cloud.example.com/v1/vm?page=1" -H "Authorization: Bearer vk_XXXX" # Start one (needs vm:write) curl -s -X POST https://cloud.example.com/v1/vm/3f2a1c9e-0000-4000-8000-000000000000/start \ -H "Authorization: Bearer vk_XXXX" # Create a VM (paid: needs vm:create and an Idempotency-Key) curl -s -X POST https://cloud.example.com/v1/vm \ -H "Authorization: Bearer vk_XXXX" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d @vm.json ``` ดูฟิลด์คำขอที่แน่นอนของแต่ละการดำเนินการได้จาก `/apidoc`. ### ข้อผิดพลาด {#errors} ข้อผิดพลาดทุกรายการจะอยู่ในรูปแบบ JSON ซึ่งประกอบด้วยรหัส `code` ที่เสถียรและข้อความอธิบายที่มนุษย์อ่านเข้าใจ `message`: ```json {"error": {"code": "scope_required", "message": "Key lacks scope vm:write"}} ``` | HTTP | ค่าทั่วไป `code` | ความหมาย | |---|---|---| | 401 | `unauthenticated`, `key_invalid`, `key_revoked`, `key_expired`, `key_ip_denied`, `site_mismatch`, `api_keys_disabled` | คีย์ไม่ถูกต้องหรือไม่มีอยู่ ถูกเพิกถอน หมดอายุ IP ของผู้เรียกอยู่นอกรายการที่อนุญาตของคีย์ คีย์จากไซต์อื่น หรือปิดใช้งาน API keys ไว้ | | 403 | `scope_required`, `endpoint_not_public`, `account_blocked`, `quota_exceeded`, `impersonate_forbidden` | คีย์ไม่มีสิทธิ์ที่จำเป็น, ปลายทางไม่เปิดให้คีย์ใช้งาน, บัญชีถูกล็อค, ถึงขีดจำกัด [quota](https://nexcmp.com/th/docs/billing/quotas/) แล้ว, หรือไม่อนุญาตให้ดำเนินการในเซสชันที่มีการสวมสิทธิ์ | | 404 | `not_found` | ไม่พบข้อมูล — รวมถึงส่งคืนสำหรับทรัพยากรที่เป็นของผู้อื่นด้วย | | 422 | `invalid_argument` | ข้อผิดพลาดในการตรวจสอบความถูกต้อง (ระบุชื่อฟิลด์ไว้ในผลลัพธ์) | | 429 | `rate_limited` | มีการส่งคำขอมากเกินไป กรุณารอจนถึง `Retry-After`. | | 503 | `maintenance` | โหมดบำรุงรักษาเปิดใช้งานอยู่: สามารถอ่านข้อมูลได้ แต่จะปฏิเสธการเขียนข้อมูล | ### อัตราการจำกัดคำขอ {#rate-limits} | ขีดจำกัด | ค่าเริ่มต้น | |---|---| | ต่อคีย์ | 120 คำขอต่อนาที | | ต่อบัญชี (รวมคีย์ทั้งหมด) | 300 คำขอต่อนาที | การตอบกลับทุกรายการจะมี `X-RateLimit-Limit`, `X-RateLimit-Remaining` และ `X-RateLimit-Reset` ส่วนข้อผิดพลาด 429 จะเพิ่ม `Retry-After`. ### Idempotency {#idempotency} คำสั่งที่ต้องเสียเงินหรือ000ที่ไม่สามารถทำซ้ำได้ (สร้าง, เปลี่ยนแผน, ซื้อ, ลบ ...) **จำเป็นต้องมี** ส่วนหัว `Idempotency-Key` (สตริงใดก็ได้ที่มีความยาวไม่เกิน 200 ตัวอักษร โดย UUID เหมาะสมที่สุด) หากส่งคีย์เดิมซ้ำหลังจากหมดเวลา เซิร์ฟเวอร์จะส่งคืนผลลัพธ์ **ดั้งเดิม** (พร้อมกับ `Idempotency-Replayed: 1`) แทนที่จะทำซ้ำการดำเนินการนั้น การนำคีย์ไปใช้กับคำสั่งอื่นจะตอบกลับด้วย 422 ส่วนคำขอที่ยังดำเนินการอยู่จะตอบกลับด้วย 409/`Retry-After` หากไม่มีส่วนหัวดังกล่าว การเรียกใช้งานที่มีค่าใช้จ่ายจะถูกปฏิเสธ ## ตรวจสอบ {#verify} 1. สร้างคีย์ที่มีสิทธิ์ `vm:read` ในพอร์ทัล (**API keys › Create key**). 2. รันคำสั่ง: ```bash curl -i https://cloud.example.com/v1/apikeys/self -H "Authorization: Bearer vk_XXXX" ``` คุณจะได้รับ HTTP 200 พร้อมกับส่วนหัวอัตราการจำกัดคำขอ 3. `curl -s https://cloud.example.com/v1/vm -H "Authorization: Bearer vk_XXXX"` แสดงรายการ VM ของบัญชี ในพอร์ทัล คอลัมน์ **Last used** ของคีย์และ **Key usage log** จะแสดงการเรียกใช้งานทั้งหมด ## ขีดจำกัดและหมายเหตุ {#limits-notes} - **ไม่สามารถใช้งานผ่านคีย์ได้:** การเติมเงิน, ถอนเงิน, เปลี่ยนบัตรหรือเติมเงินอัตโนมัติ, เปลี่ยนรหัสผ่าน, อีเมลหรือ 2FA, ลบบัญชี, รวมถึงการสร้าง แก้ไข หรือเพิกถอนคีย์อื่นๆ สิ่งเหล่านี้จำเป็นต้องใช้เซสชันเบราว์เซอร์ที่เข้าสู่ระบบแล้ว - **โมดูลที่ซ่อนอยู่:** คู่มืออ้างอิงและเอกสาร OpenAPI จะแสดงเฉพาะฟีเจอร์ที่เปิดใช้งานบนไซต์นั้นๆ เท่านั้น - **ขนาดการตอบกลับและการแบ่งหน้า:** ปลายทางรายการจะมีการแบ่งหน้า (`page`, `per_page`) โปรดอ่านเอกสาร OpenAPI สำหรับแต่ละปลายทาง - **เวลาและเงิน:** จำนวนเงินจะแสดงเป็นเซนต์ USD เว้นแต่ชื่อฟิลด์จะระบุไว้เป็นอย่างอื่น - **Admin API:** คอนโซลผู้ดูแลระบบมีหน้า **System › Admin › API** ของตัวเองและคีย์ผู้ดูแลระบบ (`ofw_...`) สำหรับการจัดการ ซึ่งจะแยกต่างหากจาก API ของลูกค้าที่อธิบายไว้ที่นี่ - **การจัดการเวอร์ชัน:** คำนำหน้าเส้นทาง `/v1` มีความเสถียร แต่อาจมีการเพิ่มฟิลด์ใหม่ลงในการตอบกลับ ## การแก้ Problme {#troubleshooting} | อาการ | สาเหตุ | วิธีแก้ปัญหา | |---|---|---| | 401 บนคีย์ใหม่ | คีย์มาจากโดเมนอื่น หมดอายุ หรือพิมพ์เว้นวรรค | สร้างคีย์บนโดเมนที่คุณเรียกใช้งาน และตรวจสอบส่วนหัว `Authorization: Bearer vk_...` | | 403 `scope_required` | สิทธิ์การใช้งาน (Scope) ไม่ครบถ้วน | แก้ไขคีย์ในพอร์ทัลและเพิ่มสิทธิ์การใช้งาน | | 401 `key_ip_denied` หรือ `site_mismatch` | คีย์ถูกจำกัดให้ใช้เฉพาะ IP อื่น ("allowed IPs") หรือสร้างบนโดเมนอื่น | เพิ่ม IP ของเซิร์ฟเวอร์คุณไปยัง IP ที่อนุญาตของคีย์ หรือเรียกไปยังโดเมนที่สร้างคีย์นั้นขึ้นมา | | 404 บน VM ที่มีอยู่จริง | VM นี้เป็นของบัญชีอื่น | ใช้คีย์ของเจ้าของบัญชี | | 400/422 ขอ `Idempotency-Key` | การดำเนินการที่มีค่าใช้จ่ายโดยไม่มีส่วนหัว | เพิ่ม `Idempotency-Key: ` | | 429 | เกินขีดจำกัด | หยุดพักการทำงานและใช้ `Retry-After` | | `/apidoc` แสดงผลน้อยกว่าที่คาดไว้ | โมดูลถูกปิดใช้งาน | เปิดใช้งานโมดูลใน License & updates | --- # API keys และ scopes {#api-keys-and-scopes} > **ตำแหน่งในพอร์ทัล:** API keys (`/api-keys`). **ตำแหน่งในหน้าผู้ดูแลระบบ:** Customers › Customers › API keys (`/customers/apikeys`) ## What it does {#what-it-does} **API key** ช่วยให้สคริปต์, งาน CI, [`cmp` CLI](https://nexcmp.com/th/docs/developers/cmp-cli/) หรือผู้ช่วย AI ([MCP](https://nexcmp.com/th/docs/developers/mcp/)) สามารถเรียก [REST API](https://nexcmp.com/th/docs/developers/api/) ในนามของลูกค้าคนใดคนหนึ่งได้ โดยมีเฉพาะสิทธิ์ (**scopes**) ที่ได้รับอนุญาตเท่านั้น คีย์ของลูกค้าจะขึ้นต้นด้วย `vk_` สามารถอ่านและจัดการบริการได้แต่ **ไม่สามารถ** แตะต้องเรื่องเงินหรือตัวบัญชีได้ ## ข้อกำหนด {#requirements} | Item | Requirement | |---|---| | ลูกค้า | เซสชันพอร์ทัลที่เข้าสู่ระบบแล้ว (คีย์ไม่สามารถสร้างหรือแก้ไขคีย์อื่นได้ และผู้ดูแลระบบที่สวมรอยเป็นลูกค้าก็ทำไม่ได้เช่นกัน) | | สวิตช์ | API keys ถูกเปิดใช้งานเป็นค่าเริ่มต้น หากปิดใช้งาน การเรียกใช้งานจะตอบกลับด้วย 401 `api_keys_disabled` | | Dependencies | สิทธิ์การใช้งาน (Scopes) ของผลิตภัณฑ์จะปรากฏขึ้นเมื่อผลิตภัณฑ์นั้นเปิดใช้งานบนเว็บไซต์แล้วเท่านั้น | ## สร้างคีย์ (สำหรับลูกค้า) {#create-a-key-customer} 1. ลงชื่อเข้าใช้พอร์ทัลและเปิด **API keys** 2. คลิก **Create key** 3. กรอกข้อมูลในฟอร์ม: | ฟิลด์ | กฎ | |---|---| | **Key name** | จำเป็นต้องกรอก ความยาวสูงสุด 60 ตัวอักษร ("deploy server", "backup script") | | **สิ่งที่คีย์นี้ทำได้** | ทำเครื่องหมายเลือกสิทธิ์ที่ต้องการอย่างน้อยหนึ่งสิทธิ์ คีย์แบบอ่านอย่างเดียวไม่ควรมีสิทธิ์เขียน โปรดระมัดระวังเกี่ยวกับสิทธิ์ที่มีค่าใช้จ่ายหรือลบข้อมูล | | **Expiry** | ไม่มีวันหมดอายุ, 30 วัน, 90 วัน หรือ 1 ปี (API รองรับ 1 ถึง 3650 วัน) | | **อนุญาตการเรียกเฉพาะจาก IP เหล่านี้** | ระบุหนึ่ง IP หรือช่วง CIDR ต่อบรรทัด สูงสุด 20 รายการ (IPv4 หรือ IPv6) หากเว้นว่างหมายถึงอนุญาตทุก IP ควรกำหนด IP ของเซิร์ฟเวอร์คุณไว้เสมอหากทำได้ | 4. ยืนยันแบบฟอร์ม คีย์จะแสดงขึ้น **ครั้งเดียว** ในหน้าต่าง "Key created — shown ONCE" คัดลอกเก็บไว้แล้วคลิก **I saved the key** ระบบจะจัดเก็บเฉพาะแฮช SHA-256 เท่านั้น ดังนั้นแม้แต่ผู้ดูแลระบบก็ไม่สามารถอ่านคีย์นี้ได้อีก หากทำหาย ให้เพิกถอนและสร้างใหม่ 5. พอร์ทัลยังแสดงคำสั่ง `curl` พร้อมใช้งานสำหรับทดสอบคีย์ด้วย คีย์จะมีลักษณะขึ้นต้นด้วย `vk_` ตามด้วยสตริงสุ่มขนาดยาว รายการจะแสดงเฉพาะอักษรตัวแรก (เช่น `vk_a1b2c3d4`), สิทธิ์ (scopes), วันหมดอายุ, การใช้งานล่าสุด, จำนวนคำขอ และสถานะ (*Active*, *Expired*, *Revoked*) ### แก้ไข, เพิกถอน, ตรวจสอบ {#edit-revoke-audit} - **Edit** ใช้สำหรับเปลี่ยนชื่อ, ขอบเขต (scopes), IP ที่อนุญาต และวันหมดอายุ ซึ่งไม่อนุญาตให้ทำระหว่างเซสชันที่มีการสวมรอย - **Revoke** จะหยุดการทำงานของคีย์ทันทีและไม่สามารถย้อนกลับได้ แถวข้อมูลจะยังคงอยู่เพื่อให้บันทึกการใช้งานยังคงดูได้ - **Key usage log** แสดงคำสั่งเขียนและข้อผิดพลาดทั้งหมดในช่วง 60 วันที่ผ่านมา ได้แก่ เวลา, คำขอ, คีย์, ผลลัพธ์ และ IP ต้นทาง - ตามค่าเริ่มต้น บัญชีหนึ่งสามารถถือ **10 active keys** ได้มากที่สุด - คีย์ที่สร้างผ่าน CLI หรือการเข้าสู่ระบบ MCP จะปรากฏภายใต้ **Connected apps & devices** และสามารถเพิกถอนได้ที่นั่น ## Scopes {#scopes} ชื่อขอบเขตจะมีรูปแบบ `area:action` โดยขอบเขตที่มีให้บริการจะขึ้นอยู่กับผลิตภัณฑ์ที่คุณเปิดใช้งาน | Scope | Allows | |---|---| | `catalog:read` | อ่านแผนบริการและแค็ตตาล็อก | | `vm:read` | อ่านข้อมูล VM, เมตริก และใบแจ้งหนี้ของ VM | | `vm:write` | การดำเนินการด้านพลังงาน, การเปลี่ยนแปลงเล็กน้อย, ไฟร์วอลล์, สแนปชอตด่วน | | `vm:create` | **สร้าง VMs (มีค่าใช้จ่าย)** | | `vm:plan` | **เปลี่ยนแผนบริการหรือปรับขนาด (มีค่าใช้จ่าย)** | | `vm:destroy` | **ลบ VMs** | | `vm:restore` | **กู้คืน VM จากสแนปชอต (จะเขียนทับดิสก์)** | | `vm:console` | เปิดตั๋วคอนโซล VNC | | `sshkey:read`, `sshkey:write` | อ่าน, เพิ่ม และลบ SSH Keys | | `volume:read`, `volume:write`, `volume:create`, `volume:destroy` | โวลุ่มข้อมูล (การสร้างและขยายมีค่าใช้จ่าย การทำลายทำให้ข้อมูลสูญหาย) | | `backup:read`, `backup:write`, `backup:restore` | Backups (การกู้คืนจะเขียนทับดิสก์) | | `billing:read` | กระเป๋าเงิน, ใบแจ้งหนี้, ประวัติการชำระเงิน — **อ่านอย่างเดียว** | | `bandwidth:buy` | **ซื้อแบนด์วิดท์เสริม (มีค่าใช้จ่าย)** | | `account:read`, `account:write` | โปรไฟล์, ภาพรวม, กิจกรรม, การแจ้งเตือน; `account:write` ทำเครื่องหมายการแจ้งเตือนว่าอ่านแล้วเท่านั้น | | `apikey:read` | แสดงรายการคีย์ของบัญชีและบันทึกการใช้งาน (ไม่สามารถสร้าง, แก้ไข หรือเพิกถอนได้) | | `apikey:self` | มีอยู่โดยปริยายสำหรับทุกคีย์: ตรวจสอบคีย์ที่เรียกใช้งาน (`GET /v1/apikeys/self`) | | `ticket:read`, `ticket:write` | ตั๋วสนับสนุน | | `aff:read`, `transfer:read` | โปรแกรมพันธมิตรและการโอนย้ายบริการ — อ่านอย่างเดียว | | `k8s:read`, `k8s:write`, `k8s:create`, `k8s:scale`, `k8s:destroy`, `k8s:kubeconfig` | Kubernetes (การสร้างและการปรับขนาดมีค่าใช้จ่าย; kubeconfig มีสิทธิ์เป็น cluster-admin) | | `vpc:read`, `vpc:write`, `vpc:create`, `vpc:destroy` | Private Cloud | | `image:read`, `image:write` | อิมเมจ OS และ ISO (การจัดเก็บคิดค่าบริการเป็นรายชั่วโมง) | | `s3:read`, `s3:write`, `s3:create`, `s3:destroy`, `s3:keys` | Object Storage (คีย์ลับ S3 จะแสดงเพียงครั้งเดียว) | | `vpn:read`, `vpn:detail`, `vpn:write`, `vpn:create`, `vpn:destroy` | VPN และพร็อกซี IPv6 (รายละเอียดการเชื่อมต่อรวมถึงรหัสผ่านพร็อกซีด้วย) | | `dedicated:read`, `dedicated:write`, `dedicated:console`, `dedicated:create`, `dedicated:destroy` | เซิร์ฟเวอร์เฉพาะ (สร้างคำสั่งซื้อจากกระเป๋าเงิน การทำลายจะติดตั้ง OS ใหม่) | | `shield:read`, `shield:write`, `shield:agent` | DDoS Shield เฉพาะเมื่อเปิดใช้งานโมดูลนั้น | การเรียกใช้งานนอกขอบเขตของคีย์จะตอบกลับด้วย **403 `scope_required`**; เส้นทางที่ไม่มีคีย์ใดได้รับอนุญาตให้เรียกจะตอบกลับด้วย **403 `endpoint_not_public`** ### สิ่งที่คีย์ไม่สามารถทำได้เลย {#what-a-key-can-never-do} ไม่มีขอบเขตใดที่สามารถทำสิ่งเหล่านี้ได้: การเติมเงินหรือถอนเงิน, การเปลี่ยนบัตรหรือการเติมเงินอัตโนมัติ, การเปลี่ยนรหัสผ่าน, อีเมล หรือ 2FA, การลบบัญชี, การสร้าง, แก้ไข หรือเพิกถอนคีย์อื่น ๆ สิ่งเหล่านี้จำเป็นต้องเข้าสู่ระบบผ่านเบราว์เซอร์เสมอ แม้แต่คีย์ที่รั่วไหลก็ไม่สามารถแตะต้องเงินหรือบัญชีของลูกค้าได้ ## กฎที่คุณวางใจได้ {#rules-you-can-rely-on} | กฎ | Detail | |---|---| | Site-bound | คีย์จะใช้งานได้เฉพาะบนเว็บไซต์ (โดเมน) ที่ถูกสร้างขึ้นมาเท่านั้น | | อัตราการจำกัดคำขอ | ต่อคีย์และต่อบัญชี: 120 และ 300 คำขอต่อนาทีตามค่าเริ่มต้น | | Idempotency | การดำเนินการที่มีค่าใช้จ่ายหรือทำซ้ำไม่ได้จำเป็นต้องมีส่วนหัว `Idempotency-Key` | | โควตา | คีย์จะต้องอยู่ภายใต้ [quotas](https://nexcmp.com/th/docs/billing/quotas/) เดียวกันกับลูกค้า | | Locked account | คีย์ของลูกค้าที่ถูกล็อกจะหยุดทำงาน (403 `account_blocked`). | | Audit | การเพิกถอนโดยผู้ดูแลระบบจะถูกบันทึกไว้ในบันทึกการตรวจสอบของผู้ดูแลระบบ | ## มุมมองผู้ดูแลระบบ {#administrator-view} 1. เปิด **Customers › API keys** (`/customers/apikeys`). ตารางจะแสดงชื่อคีย์และอักขระตัวแรก, เจ้าของ, สโคป, สถานะ, การใช้งานล่าสุด (เวลา, จำนวนคำขอ, IP), และวันหมดอายุ. 2. กรองตามไซต์หากคุณมีรี셀러 ค้นหาตามชื่อ, ID หรือจุดเริ่มต้นของคีย์. 3. คลิก **Revoke** เพื่อหยุดคีย์ที่ใช้งานอยู่ หรือ **Log** เพื่อดูการใช้งาน. 4. ผู้ดูแลระบบ**สามารถดูและเพิกถอน**คีย์ได้ แต่ไม่สามารถอ่านหรือสร้างคีย์ให้ลูกค้าได้. ![รายการคีย์ API ของลูกค้าโดยผู้ดูแลระบบ พร้อมสโคป, สถานะ, การใช้งานล่าสุด และปุ่ม Revoke](https://nexcmp.com/th/docs/images/developers/api-keys-02-admin.webp) ## ตรวจสอบ {#verify} 1. สร้างคีย์ที่มีสโคป `vm:read` เท่านั้น. 2. `curl -s https://cloud.example.com/v1/vm -H "Authorization: Bearer vk_XXXX"` จะส่งคืนรายการ VM. 3. `curl -s -X POST .../v1/vm//start -H "Authorization: Bearer vk_XXXX"` จะตอบกลับด้วย 403 `scope_required`. 4. เพิกถอนคีย์; การเรียกครั้งแรกจะตอบกลับด้วย 401 `key_revoked`. ## ขีดจำกัดและหมายเหตุ {#limits-notes} - คีย์จะไม่แสดงขึ้นมาอีก โปรดปฏิบัติต่อคีย์เสมือนรหัสผ่านและจัดเก็บไว้ในตัวจัดการความลับหรือ CI secret. - แนะนำให้ใช้หนึ่งคีย์ต่อหนึ่งสคริปต์, สโคปที่น้อยที่สุด, วันหมดอายุที่สั้น และรายการ IP ที่อนุญาต; หมุนเวียนคีย์โดยการสร้างคีย์ใหม่และเพิกถอนคีย์เก่า. - คีย์จากการเข้าสู่ระบบอุปกรณ์ (CLI, MCP) จะมีค่าเริ่มต้นเป็น 90 วัน. - ทรัพยากรที่ถูกลบหรือโอนย้ายจะไม่ได้รับผลกระทบจากการเพิกถอนคีย์. ## การแก้ Problme {#troubleshooting} | อาการ | สาเหตุ | วิธีแก้ปัญหา | |---|---|---| | ข้อผิดพลาด `too_many_keys` (422) | ถึงขีดจำกัดของคีย์ที่ใช้งานอยู่ (ค่าเริ่มต้นคือ 10) | เพิกถอนคีย์เก่า. | | ข้อผิดพลาด `invalid_argument`: ไม่ได้เลือกสโคป | ไม่ได้เลือกสโคปใดๆ | เลือกสโคปอย่างน้อยหนึ่งรายการ. | | ข้อผิดพลาด `invalid_argument` บน IP ที่อนุญาต | รายการไม่ใช่ IP หรือช่วง, ความยาวคำนำหน้าผิด, หรือมีมากกว่า 20 รายการ | หนึ่ง IP หรือ CIDR ต่อบรรทัด เช่น `203.0.113.0/24`. | | การสร้างถูกปฏิเสธในระหว่างการสวมรอย | `impersonate_forbidden` | ขอให้ลูกค้าสร้างคีย์ดังกล่าว. | | 401 `key_expired` | พ้นกำหนดวันหมดอายุแล้ว | สร้างคีย์ใหม่. | | 401 `key_ip_denied` | IP ของผู้เรียกไม่อยู่ในรายการที่อนุญาต | เพิ่ม IP หรือล้างรายการ. | | 401 `api_keys_disabled` | ฟีเจอร์ถูกปิดใช้งาน | สอบถามผู้ดูแลระบบของคุณ (การตั้งค่า `api_keys_enabled`). | --- # เครื่องมือบรรทัดคำสั่ง `cmp` {#cmp-command-line-tool} > **Where in the portal:** ชุดคำสั่งการติดตั้งจะอยู่บนคู่มือ API reference (`https:///apidoc`, ส่วน Command-line interface) การอนุมัติการเข้าสู่ระบบ: `https:///link` อุปกรณ์ที่เชื่อมต่อ: API keys (`/api-keys`) › Connected apps & devices. ## What it does {#what-it-does} `cmp` คือโปรแกรมบรรทัดคำสั่งขนาดเล็กสำหรับลูกค้าของคุณ (และสำหรับคุณ) ที่เปลี่ยน**ทุกการทำงานของ API ให้เป็นคำสั่ง**: `cmp vm list`, `cmp vm start `, `cmp billing invoice list`. โปรแกรมนี้สร้างขึ้นจากเอกสาร OpenAPI ของการติดตั้ง**ของคุณ** ณ เวลาที่ออก릴ีส ดังนั้นคำสั่งจึงตรงกับฟีเจอร์ที่คุณเปิดใช้งาน โดยเป็นไบนารีแบบสแตติกเดียวสำหรับ Linux, macOS และ Windows (amd64 และ arm64) โดยไม่ต้องติดตั้งสิ่งอื่นเพิ่ม. ## ข้อกำหนด {#requirements} | Item | Requirement | |---|---| | Server | ไม่มีอะไรเพิ่มเติม แพ็กเกจรีลีสอยู่ภายในรีลีสของ NexCMP และให้บริการโดยแผงควบคุมที่ `https:///cli/`. | | เครื่องของลูกค้า | Linux, macOS หรือ Windows (PowerShell 5.1+). จำเป็นต้องมี `ssh-keygen` (OpenSSH 8.0+) เฉพาะสำหรับการตรวจสอบลายเซ็นเท่านั้น. | | ข้อมูลประจำตัว | เข้าสู่ระบบผ่านเบราว์เซอร์ด้วยรหัสใช้ครั้งเดียว หรือ [API key](https://nexcmp.com/th/docs/developers/api-keys/) | | Network | HTTPS ไปยังพาเนลของคุณ CLI จะปฏิเสธการส่งคีย์ผ่าน `http://` ธรรมดา ยกเว้นไปยัง `localhost` | ## เตรียมโครงสร้างพื้นฐาน {#prepare-the-infrastructure} ไม่มีเลย พาเนลจะให้บริการไฟล์เหล่านี้จาก `/cli/` (ไม่ต้องคอมไพล์หรืออัปโหลด): | ไฟล์ | Purpose | |---|---| | `install.sh`, `install.ps1` | ตัวติดตั้งสำหรับ Linux/macOS และ Windows โดยจะระบุที่อยู่ของพาเนลของคุณ | | `latest.json` | เวอร์ชันปัจจุบัน, รายการไฟล์, ขนาด, sha256 | | `v/cmp___.tar.gz` หรือ `.zip` | โปรแกรมสำหรับ: linux amd64/arm64, darwin amd64/arm64/universal, windows amd64/arm64 | | `v/SHA256SUMS`, `SHA256SUMS.sig` | ค่าตรวจสอบความถูกต้องและลายเซ็น ed25519 | | `cmp-cli.pub` | คีย์สาธารณะสำหรับเผยแพร่ | ## การติดตั้ง (สำหรับลูกค้า) {#install-customer} macOS และ Linux: ```bash curl -fsSL https://cloud.example.com/cli/install.sh | sh ``` Windows PowerShell: ```powershell irm https://cloud.example.com/cli/install.ps1 | iex ``` ตัวติดตั้งจะเลือกแพ็กเกจที่ตรงกับ OS และ CPU, ดาวน์โหลด `SHA256SUMS` และลายเซ็น, ตรวจสอบลายเซ็นด้วยคีย์ที่ฝังอยู่ในสคริปต์, ตรวจสอบแฮชของแพ็กเกจ และติดตั้ง `cmp` ลงใน `/usr/local/bin` (ในฐานะ root) หรือ `~/.local/bin`; สำหรับบน Windows จะติดตั้งลงใน `%LOCALAPPDATA%\cmp\bin` (เพิ่มลงใน `PATH` ของผู้ใช้) หากการตรวจสอบล้มเหลว จะไม่มีการติดตั้งใด ๆ | ตัวแปร | ความหมาย | |---|---| | `CMP_VERSION` | ติดตั้งเวอร์ชันนี้แทนเวอร์ชันล่าสุด | | `CMP_INSTALL_DIR` | โฟลเดอร์สำหรับติดตั้ง | | `CMP_REQUIRE_SIGNATURE` | `1` = ยกเลิกเมื่อไม่สามารถตรวจสอบความถูกต้องของลายเซ็นได้ | | `CMP_BASE_URL` | ฐานการดาวน์โหลด (สำหรับมิเรอร์) | การดาวน์โหลดและตรวจสอบความถูกต้องด้วยตนเอง: ```bash curl -fsSLO https://cloud.example.com/cli/latest.json sha256sum --check --ignore-missing SHA256SUMS ``` ![ส่วนอ้างอิง API พร้อมคำสั่งติดตั้ง cmp สำหรับ macOS และ Linux](https://nexcmp.com/th/docs/images/developers/cmp-cli-01-install.webp) ## เข้าสู่ระบบ {#log-in} ```bash cmp login ``` 1. CLI จะแสดง **รหัส** ใช้ครั้งเดียวและลิงก์ (`https://cloud.example.com/link?code=WDJB-MJHT`) จากนั้นจะเปิดเบราว์เซอร์และรอ 2. ในเบราว์เซอร์ ให้ลงชื่อเข้าใช้พอร์ทัล ตรวจสอบชื่อลูกค้า, อุปกรณ์, IP และประเทศ, ทำเครื่องหมายเลือกสิทธิ์ (scopes) และเลือกอายุของคีย์ (ค่าเริ่มต้น 90 วัน) สิทธิ์ที่มีค่าใช้จ่ายหรือลบข้อมูลจะถูกเว้นว่างไว้โดยค่าเริ่มต้น คลิกอนุมัติ 3. CLI จะได้รับ **คีย์ของตัวเอง** ซึ่งแยกต่างหากจากคีย์ที่ลูกค้าสร้างขึ้นเอง และจัดเก็บไว้ใน `~/.config/cmp/config.json` (โหมด `0600`; `%APPDATA%\cmp` บน Windows) คีย์นี้จะปรากฏภายใต้ **API keys › Connected apps & devices** และสามารถเพิกถอนได้ที่นั่น รหัสจะหมดอายุหลังจาก 10 นาที การอนุมัติต้องใช้เซสชันพอร์ทัลที่เข้าสู่ระบบจริงและมีการยืนยันอีเมลแล้ว — ไม่ใช่คีย์อื่นและไม่ใช่เซสชันที่มีการสวมรอย แฟล็กที่มีประโยชน์: `--scopes vm:read,billing:read`, `--name "build server"`, `--no-browser`, `--profile`, `--api-url` สำหรับ CI หรือเซิร์ฟเวอร์ที่ไม่มีเบราว์เซอร์ ให้ใช้คีย์จากพอร์ทัล: ```bash printf %s "$KEY" | cmp login --with-token export CMP_TOKEN=vk_XXXX # nothing is written to disk cmp whoami ``` ## การใช้งานคำสั่ง {#using-commands} ```text cmp [subgroup] [ ...] [flags] ``` - พารามิเตอร์เส้นทางคืออาร์กิวเมนต์ตามตำแหน่ง ส่วนพารามิเตอร์คิวรีและฟิลด์ในบอดี้จะกลายเป็นแฟล็กแบบ kebab-case (`--start-port 443`) - `--data '{"a":1}'`, `--data @file.json` หรือ `--data -` จะส่งบอดี้ JSON ทั้งชุด โดยแฟล็กจะทับฟิลด์เหล่านั้น - `cmp help vm firewall add` (หรือ `--help`) แสดงรายละเอียดของคำสั่งใด ๆ ```bash cmp catalog plans cmp vm list --state active --per-page 50 cmp vm get 3f2a1c9e-0000-4000-8000-000000000000 cmp vm start 3f2a1c9e-0000-4000-8000-000000000000 cmp vm firewall add 3f2a1c9e-... --protocol tcp --start-port 22 --cidr-list 203.0.113.0/24 cmp billing wallet cmp api GET /v1/vm --query page=2 # raw call to any endpoint ``` คำสั่งที่มีมาให้ในตัว: `login`, `logout`, `whoami`, `config`, `api`, `completion`, `version`, `update`, `help` นอกเหนือจากนี้ทั้งหมดมาจากเอกสาร API แฟล็กส่วนกลาง: | แฟล็ก | ความหมาย | |---|---| | `-o, --output json\|table\|yaml` | รูปแบบ ค่าเริ่มต้นคือ `table` บนเทอร์มินัลและ `json` เมื่อส่งออกผ่านไปป์ | | `--profile`, `--api-url` | ข้อมูลการเข้าสู่ระบบที่บันทึกไว้และเว็บไซต์ที่ใช้งาน | | `-y, --yes` | ข้ามการยืนยันสำหรับคำสั่งที่มีการทำลายล้างข้อมูลหรือมีค่าใช้จ่าย | | `--idempotency-key ` | เลือกคีย์สำหรับคำสั่งที่มีค่าใช้จ่าย | | `--retry ` | เมื่อเจอ HTTP 429 ให้รอ `Retry-After` และลองใหม่สูงสุด n ครั้ง | | `--timeout ` | จำนวนวินาทีที่รอส่วนหัวการตอบกลับ (ค่าเริ่มต้น 60) | | `--debug` | แสดงการรับส่งข้อมูล HTTP บน stderr โดยมีการซ่อนคีย์ไว้ | คำสั่งที่**ตัดเงินในกระเป๋าเงินหรือลบข้อมูล**จะขอการยืนยัน และหากมีค่าใช้จ่าย ระบบจะส่ง `Idempotency-Key` ที่สร้างขึ้นโดยอัตโนมัติ (พิมพ์ออกทาง stderr เพื่อให้คุณลองใหม่ได้อย่างปลอดภัยด้วย `--idempotency-key`) หากไม่มีเทอร์มินัล ระบบจะปฏิเสธเว้นแต่จะระบุ `--yes` ### รหัสการออก (Exit codes) {#exit-codes} | รหัส | ความหมาย | |---|---| | 0 | สำเร็จ | | 1 | ข้อผิดพลาดอื่น (เครือข่าย, HTTP 4xx/5xx ที่ไม่ได้ระบุ) | | 2 | ข้อผิดพลาดในการใช้งาน | | 3 | ไม่ได้รับอนุญาต (401/403) | | 4 | ไม่พบข้อมูล (404) | | 5 | เกินขีดจำกัดอัตราคำขอ (429) | | 6 | ต้องมีการยืนยันหรือถูกปฏิเสธ | | 130 | ถูกขัดจังหวะ | ### โปรไฟล์และสภาพแวดล้อม {#profiles-and-environment} `cmp config` แสดงรายการโปรไฟล์; `cmp config use ` สลับโปรไฟล์; ลูกค้าของผู้ให้บริการตัวแทนจำหน่ายใช้โดเมนของตนเอง: `cmp login --api-url https://shop.example.net --profile shop` ลำดับความสำคัญ: แฟล็ก, สภาพแวดล้อม, ไฟล์กำหนดค่า ตัวแปร: `CMP_TOKEN`, `CMP_PROFILE`, `CMP_API_URL`, `CMP_OUTPUT`, `CMP_CONFIG_DIR`, `CMP_ALLOW_HTTP`, `CMP_UPDATE_URL` GitHub Actions: ```yaml - name: Install cmp run: | curl -fsSL https://cloud.example.com/cli/install.sh | CMP_INSTALL_DIR="$RUNNER_TEMP/bin" sh echo "$RUNNER_TEMP/bin" >> "$GITHUB_PATH" - name: List running VMs env: CMP_TOKEN: ${{ secrets.CMP_TOKEN }} # a read-only key run: cmp vm list -o json | jq -r '.items[] | select(.cs_state=="Running") | .hostname' ``` การเติมคำสั่งในเชลล์: `cmp completion bash|zsh|fish|powershell` ## การอัปเดตและการถอนการติดตั้ง {#update-and-uninstall} ```bash cmp version cmp update --check cmp update ``` `cmp update` จะดาวน์โหลด `latest.json`, `SHA256SUMS` และลายเซ็น ตรวจสอบความถูกต้องของลายเซ็นด้วยคีย์สาธารณะที่**ฝังอยู่ในไบนารีที่กำลังทำงาน** ตรวจสอบแฮชของแพ็กเกจ แล้วจึงแทนที่ตัวเอง การดาวน์เกรดต้องใช้ `--force` เมื่อคุณอัปเดต NexCMP พาเนลจะให้บริการรีลีส CLI ที่มาพร้อมกับเวอร์ชันใหม่ หากต้องการถอนการติดตั้ง ให้ลบไบนารี `cmp` และไดเรกทอรีการกำหนดค่า (`cmp config path` แสดงตำแหน่ง) เพิกถอนคีย์ภายใต้ **API keys** หากเครื่องสูญหาย ## ตรวจสอบ {#verify} 1. `cmp version` แสดงเวอร์ชันและเวอร์ชันเอกสาร API 2. `cmp login`,อนุมัติในเบราว์เซอร์ จากนั้น `cmp whoami` แสดงโปรไฟล์และ URL ของพาเนลของคุณ 3. `cmp vm list` แสดงรายการ VM ของคุณ; `cmp vm list -o json | jq .` แสดง JSON ดิบ ## ขีดจำกัดและหมายเหตุ {#limits-notes} - รายการคำสั่งขึ้นอยู่กับบิวด์ของคุณ: แพ็กเกจถูกสร้างขึ้นจากเอกสาร OpenAPI ของการติดตั้งของคุณเมื่อสร้างรีลีส ดังนั้นผลิตภัณฑ์ที่ถูกปิดใช้งานในรีลีสของคุณจะไม่มีคำสั่ง ใช้ `cmp api` สำหรับเส้นทางที่ CLI ไม่รู้จัก - CLI อยู่ภายใต้สัญญาอนุญาต MIT - แต่ละแพ็กเกจลงนามด้วยคีย์ ed25519; คีย์ลายเซ็นจะถูกพินไว้ภายในตัวติดตั้งและไบนารี ไม่ได้ดึงข้อมูลในเวลาที่อัปเดต - คีย์มีขีดจำกัดต่อคีย์และต่อบัญชี (ดู [REST API](https://nexcmp.com/th/docs/developers/api/#rate-limits)) ## การแก้ Problme {#troubleshooting} | อาการ | สาเหตุ | วิธีแก้ปัญหา | |---|---|---| | `curl .../cli/install.sh`คืนค่า 404 | รีลีสบนเซิร์ฟเวอร์ไม่มีโฟลเดอร์ CLI หรือโฮสต์ไม่อยู่ในไลเซนส์ | ตรวจสอบ `https:///cli/latest.json` และโดเมน; อัปเดต NexCMP | | "ไม่สามารถตรวจสอบลายเซ็นได้" | `ssh-keygen` หายไปหรือเก่าเกินไป | ติดตั้ง OpenSSH 8.0+ หรือตั้งค่า `CMP_REQUIRE_SIGNATURE=0` เฉพาะเมื่อคุณยอมรับความเสี่ยงได้ | | `cmp login` แจ้งว่าโค้ดหมดอายุแล้ว | ผ่านไป 10 นาทีแล้ว | เรียกใช้ `cmp login` อีกครั้ง | | รหัสออก 3 | คีย์ไม่มีสโคป, หมดอายุ หรือถูกเพิกถอน | `cmp whoami`; สร้างหรืออนุมัติใหม่ด้วยสโคปที่มากขึ้น | | รหัสออก 6 ในสคริปต์ | คำสั่งที่มีค่าใช้จ่ายหรือทำลายล้างโดยไม่มีเทอร์มินัล | เพิ่ม `--yes` (และ `--idempotency-key` ของคุณเอง) | | "ปฏิเสธการส่งคีย์ผ่าน http" | URL API แบบ http ธรรมดา | ใช้ `https://` หรือใช้ `CMP_ALLOW_HTTP=1` เฉพาะสำหรับห้องทดลอง | | เบราว์เซอร์เปิดเว็บไซต์ผิด | ไม่ได้ตั้งค่า `--api-url` สำหรับผู้ให้บริการตัวแทนจำหน่าย | `cmp login --api-url https://`. | --- # เซิร์ฟเวอร์ MCP {#mcp-server} > **ตำแหน่งในพอร์ทัล:** API reference › Tools (`https:///apidoc`) แสดงเอนด์พอยต์และสนิปเป็ตสำหรับไคลเอนต์ โดยสร้างคีย์ได้ที่ API keys (`/api-keys`) ไม่มีตั้งค่าในส่วนผู้ดูแลระบบ เนื่องจากเอนด์พอยต์นี้เป็นส่วนหนึ่งของแผงควบคุม ## What it does {#what-it-does} **Model Context Protocol (MCP)** ช่วยให้ผู้ช่วย AI สามารถเรียกใช้งานเครื่องมือต่างๆ ได้ NexCMP มีเอนด์พอยต์ MCP ที่ `https:///mcp` การทำงานของ API สาธารณะทุกรายการจะกลายเป็น **เครื่องมือ** หนึ่ง (`vm_list`, `vm_start`, `billing_wallet`, ...) ทำให้ลูกค้าสามารถถามผู้ช่วยได้ว่า "VM ไหนของฉันกำลังทำงานอยู่?" หรือ "หยุดการทำงานของ staging VM ให้หน่อย" โดยผู้ช่วยจะดำเนินการด้วยคีย์ API และสิทธิ์ของตัวลูกค้าเองเท่านั้น ::: tip กำลังกำหนดค่าตัว NexCMP เองด้วย AI อยู่ใช่ไหม หน้านี้คือเอนด์พอยต์ MCP ของ**ลูกค้า** (`/mcp`) หากต้องการให้ผู้ช่วย AI ช่วยกำหนดค่าแผงควบคุมของคุณเองในฐานะผู้ดูแลระบบ โปรดดูที่ [Configure with AI](https://nexcmp.com/th/docs/configure-with-ai/mcp-admin/) (เอนด์พอยต์ `/mcp/admin`, คีย์ของผู้ดูแลระบบ `ak_`) ::: ## ข้อกำหนด {#requirements} | Item | Requirement | |---|---| | Server | ไม่ต้องติดตั้ง: เอนด์พอยต์นี้ให้บริการโดยแผงควบคุมและสามารถเข้าถึงได้ทุกที่ที่แผงควบคุมตั้งอยู่ รีเวิร์สพร็อกซี่ของคุณต้องส่งต่อ `/mcp` ไปยังแผงควบคุม | | ลูกค้า | [API key](https://nexcmp.com/th/docs/developers/api-keys/) (`vk_...`) ที่มีสิทธิ์ (scopes) ตามที่ผู้ช่วยต้องการ | | ไคลเอนต์ | ไคลเอนต์ MCP ที่รองรับการรับส่งข้อมูลแบบ **Streamable HTTP** และส่วนหัว `Authorization` แบบกำหนดเอง เช่น Claude Code, Claude Desktop (ผ่านบริดจ์ `mcp-remote`), Cursor, VS Code ในโหมด Copilot agent และอื่นๆ ที่คล้ายคลึงกัน | | เวอร์ชันโปรโตคอล | 2025-11-25, 2025-06-18 และ 2025-03-26 | ## เตรียมโครงสร้างพื้นฐาน {#prepare-the-infrastructure} ไม่มีอะไรมากไปกว่าการตรวจสอบให้แน่ใจว่า `https:///mcp` ไม่ถูกบล็อกโดยไฟร์วอลล์หรือกฎของพร็อกซี่ ไคลเอนต์ MCP บนเบราว์เซอร์จากต้นทางอื่นจะถูกปฏิเสธเว้นแต่จะได้รับอนุญาตให้ใช้ต้นทางนั้น ส่วนไคลเอนต์บรรทัดคำสั่งและเดสก์ท็อปจะไม่ส่งส่วนหัว `Origin` และสามารถทำงานได้ตามปกติ ## การเชื่อมต่อ (ฝั่งลูกค้า) {#connect-customer-side} 1. สร้างคีย์ API ในพอร์ทัล (**API keys › Create key**) โดยกำหนดเฉพาะสิทธิ์ที่คุณต้องการให้ผู้ช่วยใช้ วันหมดอายุที่สั้น และจำกัด IP หากเป็นไปได้ 2. เพิ่มเซิร์ฟเวอร์ลงในไคลเอนต์ของคุณ แทนที่ `cloud.example.com` และคีย์ **Claude Code** ```bash claude mcp add --transport http cloud https://cloud.example.com/mcp \ --header "Authorization: Bearer vk_XXXX" ``` **Cursor** (`~/.cursor/mcp.json` หรือ `.cursor/mcp.json`; ตั้งค่า `CLOUD_API_KEY` ในสภาพแวดล้อมที่ Cursor เริ่มต้นทำงาน): ```json { "mcpServers": { "cloud": { "url": "https://cloud.example.com/mcp", "headers": { "Authorization": "Bearer ${env:CLOUD_API_KEY}" } } } } ``` **Claude Desktop** (ต้องใช้ Node.js 18+; `claude_desktop_config.json`) ผ่านทางบริดจ์ `mcp-remote`: ```json { "mcpServers": { "cloud": { "command": "npx", "args": ["-y", "mcp-remote", "https://cloud.example.com/mcp", "--header", "Authorization:${CLOUD_AUTH_HEADER}"], "env": { "CLOUD_AUTH_HEADER": "Bearer vk_XXXX" } } } } ``` เขียนส่วนหัวโดยไม่มีเว้นวรรคหลังเครื่องหมายทวิภาค และใส่ค่าทั้งหมดลงในตัวแปรสภาพแวดล้อมดังตัวอย่างด้านบน 3. รีสตาร์ทไคลเอนต์แล้วขอให้แสดงรายการเครื่องมือของคุณ ตรวจสอบการเชื่อมต่อโดยไม่ต้องใช้ไคลเอนต์: ```bash curl -s https://cloud.example.com/mcp \ -H "Authorization: Bearer vk_XXXX" \ -H "Content-Type: application/json" \ -H "Accept: application/json, text/event-stream" \ -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}' ``` ## วิธีการทำงาน {#how-it-works} | Item | Detail | |---|---| | Endpoint | `POST /mcp` พร้อมข้อความ JSON-RPC 2.0 คำตอบคือ `application/json` `GET /mcp` จะตอบกลับด้วย 405 (ไม่มีสตรีมจากเซิร์ฟเวอร์ไปยังไคลเอนต์); `DELETE /mcp` จะสิ้นสุดเซสชัน | | การยืนยันตัวตน | เฉพาะ `Authorization: Bearer vk_...` เท่านั้น (โทเค็นเซสชัน คุกกี้ และคีย์ผู้ดูแลระบบจะถูกปฏิเสธด้วยสถานะ 401 และส่วนหัว `WWW-Authenticate: Bearer`) | | เซสชัน | `Mcp-Session-Id` ออกโดย `initialize` ผูกกับคีย์นั้น และมีอายุการใช้งาน 24 ชั่วโมง โดยมีเซสชันสูงสุด 16 เซสชันต่อคีย์ | | เครื่องมือ | หนึ่งรายการต่อการทำงานของ API สาธารณะที่คีย์มองเห็น ชื่อเครื่องมือคือคำสั่ง CLI ที่ใช้ `_` แทนที่ช่องว่างและขีด (`vm firewall add` กลายเป็น `vm_firewall_add`) และตรงกับ `operationId` ของ OpenAPI เครื่องมือจะแสดงรายการก็ต่อเมื่อคีย์มีสิทธิ์นั้นและเปิดใช้งานโมดูลอยู่ | | ความสามารถ | เฉพาะเครื่องมือเท่านั้น (ไม่มีทรัพยากรหรือพรอมต์) | | ขนาด | เนื้อหาคำขอสูงสุด 1 MB; ข้อความผลลัพธ์ของเครื่องมือสูงสุดประมาณ 100 KB (ส่วนที่เหลือจะถูกตัดทอนพร้อมหมายเหตุ); การเรียกใช้งานแต่ละครั้งใช้เวลาสูงสุด 55วินาที | ### กฎความปลอดภัย {#safety-rules} - **ประตูเดียวกันกับ REST.** แต่ละ `tools/call` จะต้องผ่านท่อส่งคำขอของระบบเอง ทั้งขอบเขต ขอบเขตเว็บไซต์ การจำกัด IP การจำกัดอัตราการเรียกใช้ ความเป็นอิสระ การตรวจสอบความเป็นเจ้าของ (แสดง 404 สำหรับทรัพยากรของผู้อื่น) และโควตาจะมีผลทั้งหมด MCP ไม่สามารถให้สิทธิ์เกินกว่าที่คีย์มีอยู่ - **การยืนยัน.** เครื่องมือที่มีค่าใช้จ่าย มีการลบ หรือส่งคืนข้อมูลรับรอง (ตั๋วคอนโซล, kubeconfig, ข้อมูลลับ S3 หรือ SSH, การรีเซ็ตรหัสผ่าน, คีย์ใหม่) จำเป็นต้องมีอาร์กิวเมนต์ `confirm: true` คำอธิบายเครื่องมือจะบอกให้ผู้ช่วยส่งต่อเมื่อผู้ใช้ได้รับการอนุมัติแล้วเท่านั้น ดังนั้นคำสั่งที่ซ่อนอยู่ในหน้าเว็บหรือบันทึกจึงไม่สามารถเรียกใช้งานได้ด้วยตัวเอง - **ความเป็นอิสระของการทำซ้ำ (Idempotency).** เครื่องมือที่มีค่าใช้จ่ายจะยอมรับ `idempotency_key`; หากละเว้น คีย์เสถียรจะถูกสร้างขึ้นจากชื่อเครื่องมือและอาร์กิวเมนต์ ดังนั้นการลองใหม่ที่เหมือนกันจึงไม่สามารถคิดเงินซ้ำได้ - **ไม่เปิดเผยเป็นเครื่องมือ:** จุดสิ้นสุดสำหรับการสตรีม (แชท AI Agent), ตั๋ว SSH หรือคอนโซล WebSocket แบบใช้ครั้งเดียว, การดาวน์โหลดไบนารี และจุดสิ้นสุดแอป VPN (`/v1/ext/*`) - **เป็นไปไม่ได้อย่างเด็ดขาด:** API ไม่อนุญาตให้เติมเงิน เปลี่ยนรหัสผ่าน ลบ 3 บัญชี หรือสร้างคีย์ ดังนั้นจึงไม่มีผู้ช่วยใดสามารถทำสิ่งเหล่านี้ได้ ### ขีดจำกัด {#limits} | ขีดจำกัด | ค่าเริ่มต้น | |---|---| | การเรียกใช้เครื่องมือต่อคีย์ | 60 ครั้งต่อนาที | | คำขอ MCP ต่อคีย์ | 240 ครั้งต่อนาที | | บวกกับขีดจำกัดคีย์และบัญชีปกติ | ดู [REST API](https://nexcmp.com/th/docs/developers/api/#rate-limits) | หากเกินขีดจำกัด จุดสิ้นสุดจะตอบกลับด้วย HTTP 429 พร้อมข้อผิดพลาด JSON-RPC และ `Retry-After` ## ตรวจสอบ {#verify} 1. คำสั่ง `curl` ด้านบนจะส่งคืนผลลัพธ์ JSON-RPC พร้อมรายการ `tools` โดยจะมีเฉพาะเครื่องมือที่ตรงกับขอบเขตของคีย์เท่านั้นที่ปรากฏ 2. ในไคลเอนต์ของคุณ ให้ถามว่า "list my VMs": ผู้ช่วยจะเรียก `vm_list` และแสดงผลลัพธ์ 3. ในพอร์ทัล เวลา **Last used** ของคีย์จะเปลี่ยนไป และการเรียกที่เขียนข้อมูลจะปรากฏใน **Key usage log** ## ขีดจำกัดและหมายเหตุ {#limits-notes} - **การเข้าสู่ระบบผ่านเบราว์เซอร์ (OAuth).** หน้าอ้างอิงยังอธิบายถึงการเข้าสู่ระบบผ่านเบราว์เซอร์สำหรับไคลเอนต์ที่รองรับ MCP OAuth อีกด้วย สำหรับ NexCMP ที่ติดตั้งแล้ว วิธีการที่รองรับและผ่านการทดสอบคือคีย์ API (หรือ `cmp login` สำหรับ CLI) - **เว็บไซต์ตัวแทนจำหน่าย** จะไม่แสดงส่วน MCP โดยลูกค้าของพวกเขาจะใช้โดเมนของตัวแทนจำหน่ายสำหรับ API - **สิทธิ์น้อยที่สุด (Least privilege).** สร้างคีย์เฉพาะสำหรับผู้ช่วยแต่ละตัวโดยให้ขอบเขตการอ่านก่อน แล้วจึงเพิ่มขอบเขตการเขียนเมื่อจำเป็นเท่านั้น - เพิกถอนคีย์ใน **API keys** เพื่อตัดการเข้าถึงของผู้ช่วยทันที ## การแก้ Problme {#troubleshooting} | อาการ | สาเหตุ | วิธีแก้ปัญหา | |---|---|---| | 401 พร้อม `WWW-Authenticate: Bearer` | ไม่มีคีย์ คีย์ไม่ถูกต้อง หรือโทเค็นเซสชัน | ส่ง `Authorization: Bearer vk_...` | | 403 เกี่ยวกับ `Origin` | หน้าเว็บเบราว์เซอร์บนต้นทางอื่น | ใช้เดสก์ท็อปหรือไคลเอนต์ CLI หรือขอให้ผู้ดูแลระบบของคุณอนุญาตต้นทาง (`mcp_allowed_origins`) | | 404 ในคำขอที่มี `Mcp-Session-Id` | เซสชันเป็นของคีย์อื่นหรือหมดอายุแล้ว | เรียกใช้ `initialize` อีกครั้ง | | 405 บน `GET /mcp` | ที่คาดไว้: เซิร์ฟเวอร์ไม่มีสตรีมเหตุการณ์ | ใช้ POST เท่านั้น (ไคลเอนต์จะทำสิ่งนี้โดยอัตโนมัติ) | | รายการเครื่องมือสั้นเกินไป | ขอบเขตคีย์หรือโมดูล | เพิ่มขอบเขตให้กับคีย์; เปิดใช้งานโมดูล | | เครื่องมือตอบกลับว่าต้องการ `confirm: true` | เครื่องมือที่มีค่าใช้จ่าย การลบ หรือละเอียดอ่อน | ผู้ช่วยต้องตั้งค่า `confirm` หลังจากที่คุณอนุมัติ | | 429 | ขีดจำกัดอัตรา MCP หรือคีย์ | รอ `Retry-After` | | ไคลเอนต์ไม่สามารถเชื่อมต่อด้วยส่วนหัวได้ | ไคลเอนต์ไม่มีการรองรับส่วนหัวแบบกำหนดเอง | ใช้บริดจ์ `mcp-remote` | --- # กำหนดค่าด้วย AI {#configure-with-ai} > **ตำแหน่งในระบบ admin:** AI Chat (`/agent`) และ System › Settings › API & AI agents (`/agent/keys`) ทุกอย่างในหน้านี้สำหรับผู้ดูแลระบบเท่านั้น ## What it does {#what-it-does} ตั้งแต่ NexCMP 1.4.0 คุณสามารถขอให้ผู้ช่วย AI กำหนดค่า panel ให้คุณได้: เชื่อมต่อ Proxmox VE หรือ CloudStack, สร้างโซน, สร้างตารางแพ็กเกจตามต้นทุนของคุณ, ตั้งค่าอีเมล ระบบชำระเงิน และแบรนด์, ค้นหาลูกค้า หรือส่งออกการกำหนดค่าทั้งหมด ผู้ช่วยจะทำงานผ่านชุด **เครื่องมือผู้ดูแลระบบ** ที่กำหนดไว้เท่านั้น โดยจะไม่ได้รับสิทธิ์การเข้าถึงเชลล์ ไม่อ่านไฟล์บนเซิร์ฟเวอร์ และไม่เห็นรหัสผ่านหรือ API key ที่จัดเก็บไว้เลย ใช้ฟีเจอร์นี้เมื่อคุณต้องการตั้งค่าเริ่มต้นให้เสร็จในไม่กี่นาทีแทนที่จะต้องคลิกผ่านหลายสิบหน้า หรือเมื่อคุณดูแลหลายระบบและต้องการเก็บการกำหนดค่าไว้ในไฟล์เดียว ## 3 วิธีในการใช้งาน {#three-ways-to-use-it} | วิธี | ผู้ที่สื่อสารกับ AI | ตำแหน่งที่ทำงาน | เริ่มต้นที่นี่ | |---|---|---|---| | **AI Chat ในระบบผู้ดูแล** | คุณ ในระบบผู้ดูแลของ NexCMP | แหล่งที่มาของ AI ที่คุณเลือก: API key จาก OpenAI, Anthropic, Gemini หรือ OpenRouter, ผู้ให้บริการ AI ของ panel คุณเอง หรือ AI CLI อย่างเป็นทางการที่คุณได้ลงชื่อเข้าใช้ไว้ | [AI Chat ในระบบผู้ดูแล](https://nexcmp.com/th/docs/configure-with-ai/ai-chat-in-admin/) | | **AI client ของคุณเองผ่าน MCP** | คุณ ใน Claude Code, Codex CLI, Gemini CLI, Cursor, Claude Desktop, claude.ai หรือ ChatGPT | บนเครื่องของคุณหรือในแอปของผู้ให้บริการ โดยเชื่อมต่อกับ panel ของคุณที่ `https://cloud.example.com/mcp/admin` | [เชื่อมต่อ AI client](https://nexcmp.com/th/docs/configure-with-ai/mcp-admin/) | | **Configuration as code** | คุณหรือสคริปต์ | ไฟล์ YAML และคำสั่ง `nexcmp config` บนเซิร์ฟเวอร์ (หรือหน้า Import/Export) | [Configuration as code](https://nexcmp.com/th/docs/configure-with-ai/config-as-code/) | ทั้งสามวิธีเรียกใช้เครื่องมือเดียวกันและส่งผ่านเลเยอร์ความปลอดภัยเดียวกัน คุณจึงสามารถผสมผสานการใช้งานได้: ร่างการกำหนดค่าร่วมกับผู้ช่วย ส่งออกเป็น YAML ตรวจทานในโปรแกรมแก้ไขของคุณ แล้วนำไปปรับใช้ในภายหลัง ## โมเดลความปลอดภัย {#safety-model} | กฎ | สิ่งนี้มีความหมายอย่างไรต่อคุณ | |---|---| | **Scopes** | คีย์หรือการเชื่อมต่อจะถูกจำกัดตาม scopes ที่คุณเลือกทำเครื่องหมาย (`admin:read`, `catalog:write`, `infra:write`, `billing:write`, `customers:write`, `settings:write`, `ai:write`, `secrets:write`) หากไม่มี scope การเรียกใช้งานจะถูกปฏิเสธ ดูที่ [Admin API keys](https://nexcmp.com/th/docs/configure-with-ai/admin-api-keys/#scopes) | | **Expiry** | ทุกคีย์และการเชื่อมต่อมีวันหมดอายุ: 1 ถึง 90 วันสำหรับคีย์ที่คุณสร้าง โดยมีค่าเริ่มต้น 30 วัน ส่วน access token ของ OAuth มีอายุ 1 ชั่วโมง | | **การจำกัด IP และ rate limit** | สามารถจำกัดคีย์ให้อยู่ใน IP ranges และจำกัดจำนวนครั้งในการเรียกใช้งานต่อนาทีได้ (ค่าเริ่มต้น 120 ครั้ง) | | **การยืนยันแบบสองขั้นตอน** | การดำเนินการที่เกี่ยวกับธุรกรรมการเงิน ลบข้อมูล เปลี่ยนข้อมูลการชำระเงิน หรือเปลี่ยนความปลอดภัยในการเข้าสู่ระบบ จะแสดงตัวอย่างก่อนเสมอและจะไม่ดำเนินการใดๆ จนกว่าคุณจะอนุมัติ ภายใน AI Chat ทุกการเปลี่ยนแปลงจะเป็นการ์ดยืนยันที่คุณต้องกดด้วยตนเอง | | **สิ่งที่คีย์ไม่สามารถทำได้โดยเด็ดขาด** | สร้างผู้ดูแลระบบ เปลี่ยนแปลง 2FA สร้างหรือเพิกถอนคีย์ เข้าสู่ระบบในฐานะลูกค้า สำรองข้อมูล กู้คืน หรืออัปเดตพาเนล และการดำเนินการอื่นๆ ในลักษณะเดียวกัน ซึ่งจำเป็นต้องทำโดยคุณในส่วนผู้ดูแลระบบ | | **บันทึกกิจกรรม** | ทุกการเรียกใช้งาน ไม่ว่าจะได้รับอนุญาตหรือถูกปฏิเสธ จะถูกบันทึกไว้พร้อมกับคีย์ ไคลเอนต์ เครื่องมือ IP และผลลัพธ์ ดูที่ System › Settings › API & AI agents › Activity | | **ไม่มีการส่งคืนข้อมูลลับ** | รหัสผ่าน API key และโทเค็นสามารถตั้งค่าได้แต่ไม่สามารถอ่านกลับได้ ข้อมูลที่ AI มองเห็นจะแสดงเป็นแบบถูกซ่อนไว้ | | **ระบบเดโมเป็นแบบอ่านได้อย่างเดียว** | บนแผงควบคุมเดโม คำขอเขียนข้อมูลทั้งหมดจะถูกปฏิเสธด้วย `demo_read_only` | ::: important สิ่งที่ AI สามารถอ่านได้ ด้วย `admin:read` ผู้ช่วยสามารถอ่านชื่อลูกค้า ที่อยู่อีเมล ยอดเงินคงเหลือ และบันทึกการเรียกเก็บเงินได้ เมื่อคุณใช้แหล่งข้อมูล AI ที่ทำงานอยู่บนผู้ให้บริการภายนอก (OpenAI, Anthropic, Google, OpenRouter) ข้อมูลนั้นจะถูกส่งไปยังผู้ให้บริการรายนั้นเพื่อให้คำตอบแก่คำถามของคุณ โปรดกำหนดชุดสิทธิ์ (scopes) ที่น้อยที่สุดเท่าที่จำเป็นให้กับผู้ช่วย และเลือกแหล่งข้อมูลที่คุณไว้วางใจในข้อมูลดังกล่าว ::: ## เริ่มต้นใช้งานด่วน {#quick-start} 1. ลงชื่อเข้าใช้ระบบผู้ดูแลระบบและเปิด **AI Chat** หากยังไม่ได้เชื่อมต่อแหล่งข้อมูล AI ให้เปิด **System › Settings › AI accounts** และทำการเชื่อมต่อ (ดูที่ [AI accounts and subscriptions](https://nexcmp.com/th/docs/configure-with-ai/ai-accounts-and-subscriptions/)) 2. พิมพ์ "Check my setup progress" แล้วกด Enter ผู้ช่วยจะอ่านข้อมูลจาก [Setup progress checklist](https://nexcmp.com/th/docs/configure-with-ai/setup-checklist/) และบอกคุณว่ายังมีส่วนใดที่เหลืออยู่ 3. ขอให้ผู้ช่วยดำเนินการในขั้นตอนถัดไป ตรวจสอบการ์ดการยืนยันแต่ละรายการแล้วกด **Confirm** เพื่อนำไปใช้ สำหรับแนวทางเบื้องต้นเกี่ยวกับสิ่งที่สามารถถามได้ โปรดดูที่ [Example prompts](https://nexcmp.com/th/docs/configure-with-ai/example-prompts/) ![หน้า AI Chat พร้อมบทสนทนา ผลลัพธ์ของเครื่องมือ และการ์ดการยืนยัน](https://nexcmp.com/th/docs/images/configure-with-ai/overview-01-ai-chat.webp) ## ขีดจำกัดและหมายเหตุ {#limits-notes} - **เดโมและอ่านได้อย่างเดียว** หน้าต่างๆ จะมองเห็นได้บนแผงควบคุมเดโม แต่จะไม่สามารถบันทึกข้อมูลใดๆ บนนั้นได้ - **ไม่มีเชลล์ (Shell)** ผู้ช่วยสามารถเรียกใช้ได้เฉพาะเครื่องมือของผู้ดูแลระบบที่ระบุไว้ใน [Connect an AI client](https://nexcmp.com/th/docs/configure-with-ai/mcp-admin/#tools) เท่านั้น และไม่สามารถรันคำสั่งบนเซิร์ฟเวอร์ได้ - **โมดูลเน็ตเวิร์กและเราทิง** (BGP, XDP, อินเทอร์เฟซ, NAT และอื่นๆ ที่คล้ายคลึงกัน) จะเป็นแบบอ่านได้อย่างเดียวสำหรับ AI ส่วนพื้นที่ที่มีความละเอียดอ่อน เช่น บัญชีผู้ดูแลระบบ ข้อมูลสำรอง และการอัปเดต จะถูกปิดกั้นไม่ให้เข้าถึงด้วยคีย์โดยสมบูรณ์ - **ราคา** แสดงเป็น USD: ราคาแพ็กเกจเป็นดอลลาร์ต่อชั่วโมง และยอดเงินคงเหลือเป็นเซนต์ - **ค่าใช้จ่าย** คำตอบจาก AI จะมีค่าใช้จ่ายไปยังแหล่งข้อมูล AI ที่คุณเชื่อมต่อ (การใช้งาน API หรือการสมัครสมาชิกของคุณเอง) ใน AI Chat คุณสามารถตั้งค่าขีดจำกัดการใช้จ่ายรายวันได้ สำหรับโมเดลสิทธิ์การใช้งาน NexCMP โปรดดูที่ https://nexcmp.com/pricing ## การแก้ Problme {#troubleshooting} | อาการ | สาเหตุ | วิธีแก้ปัญหา | |---|---|---| | AI Chat แจ้งว่าไม่ได้เชื่อมต่อแหล่งข้อมูล AI | ยังไม่ได้ตั้งค่าแหล่งข้อมูลสำหรับบัญชีผู้ดูแลระบบของคุณ | เปิด System › Settings › AI accounts และทำการเชื่อมต่อ | | ผู้ช่วยตอบกลับว่า `insufficient_scope` | คีย์หรือการเชื่อมต่อไม่มีสิทธิ์ (scope) สำหรับเครื่องมือดังกล่าว | สร้างคีย์ที่มีสิทธิ์ที่จำเป็น หรือเชื่อมต่อใหม่และทำเครื่องหมายเลือกบนหน้าจอขอความยินยอม ดูเพิ่มเติมที่ [Admin API keys](https://nexcmp.com/th/docs/configure-with-ai/admin-api-keys/#errors) | | ทุกการเปลี่ยนแปลงจะแสดงการ์ดการยืนยัน | เป็นพฤติกรรมปกติที่คาด ัดได้ใน AI Chat | กด **Confirm** เพื่อดำเนินการต่อ หรือ **Reject** เพื่อยกเลิก | | การเขียนข้อมูลล้มเหลวด้วย `demo_read_only` | แผงควบคุมอยู่ในโหมดเดโม | โปรดใช้งานบนการติดตั้งที่ไม่ใช่โหมดเดโม | --- # AI Chat ในส่วนผู้ดูแลระบบ {#ai-chat-in-the-admin} > **ตำแหน่งในส่วนผู้ดูแลระบบ:** AI Chat (`/agent`, เมนูแยกต่างหาก) และปุ่มลอย **Ask AI** บนทุกหน้าของผู้ดูแลระบบ การตั้งค่าแหล่งที่มาของคำตอบสามารถทำได้ที่ System › Settings › AI accounts (`/agent/accounts`) ## What it does {#what-it-does} AI Chat คือผู้ช่วยที่สร้างมาเพื่อฝังอยู่ในส่วนผู้ดูแลระบบ คุณสามารถอธิบายสิ่งที่คุณต้องการ (เช่น "connect my Proxmox cluster", "set up email") ผู้ช่วยจะอ่านสถานะปัจจุบันผ่านเครื่องมือผู้ดูแลระบบ เสนอการเปลี่ยนแปลง และแสดงแต่ละรายการในรูปของ **การ์ดการยืนยัน** โดยจะไม่มีการนำไปใช้จริงจนกว่าคุณจะกด **Confirm** แผง **Ask AI** คือหน้าต่างแชทแบบเดียวกันที่อยู่ในแถบด้านข้างขนาดกะทัดรัด ช่วยให้คุณสอบถามได้ในขณะที่กำลังดูหน้าเว็บ ปุ่มต่างๆ เช่น **Do it for me** (ใน [Setup progress checklist](https://nexcmp.com/th/docs/configure-with-ai/setup-checklist/) และในรายการที่ว่างเปล่า) จะเปิดแชทนี้ขึ้นมาพร้อมกับคำถามที่เตรียมไว้ให้พร้อมใช้งาน นี่ไม่ใช่ [AI Chat](https://nexcmp.com/th/docs/ai/ai-chat/) และ [AI Agent](https://nexcmp.com/th/docs/ai/ai-agent/) สำหรับลูกค้า ซึ่งทำหน้าที่ให้บริการลูกค้าของคุณ ## ข้อกำหนด {#requirements} | Item | Requirement | |---|---| | บทบาท | ผู้ดูแลระบบที่เข้าสู่ระบบแล้ว แชต คีย์ และการตั้งค่าต่างๆ เป็นของบัญชีผู้ดูแลระบบของคุณ ผู้ดูแลระบบคนอื่นจะไม่เห็นข้อมูลเหล่านี้ | | แหล่งที่มาของคำตอบ | เชื่อมต่ออย่างน้อยหนึ่งรายการ: API key, การเข้าสู่ระบบ, ผู้ให้บริการ AI ของพาเนลเอง หรือ AI CLI ที่คุณเข้าสู่ระบบไว้ ดูที่ [AI accounts and subscriptions](https://nexcmp.com/th/docs/configure-with-ai/ai-accounts-and-subscriptions/) | | เดโม | บนแผงเดโม คุณสามารถอ่านแชทเก่าได้แต่ไม่สามารถส่งข้อความได้ | ## เลือกแหล่งที่มาของคำตอบ {#choose-where-answers-come-from} เลือกแหล่งที่มาในตัวเลือกใต้ช่องป้อนข้อความ (ซึ่งจะแสดงรายการแหล่งที่มาที่คุณเชื่อมต่อไว้) **System › Settings › AI accounts** ยังช่วยให้คุณกำหนดแหล่งที่มาเริ่มต้น โมเดลเริ่มต้น และขีดจำกัดรายวันได้ด้วย | Source | วิธีเชื่อมต่อ | หมายเหตุ | |---|---|---| | OpenAI (โมเดล ChatGPT) | วาง API key จาก platform.openai.com | เรียกเก็บเงินโดย OpenAI ตามการใช้งาน | | Anthropic (Claude) | วาง API key จาก console.anthropic.com | เรียกเก็บเงินโดย Anthropic ตามการใช้งาน | | Google Gemini | วาง API key จาก aistudio.google.com หรือ **Sign in with Google** | การลงชื่อเข้าใช้ด้วย Google จำเป็นต้องมี OAuth client ที่ **คุณ** สร้างขึ้นในโปรเจกต์ Google Cloud ของคุณเอง | | OpenRouter | วางคีย์ หรือ **Sign in with OpenRouter** | บัญชีเดียวสำหรับหลายโมเดล | | ผู้ให้บริการ AI ของแผง | ตั้งค่าไว้แล้วใน System › Settings › AI provider | ผู้ให้บริการรายเดียวกับที่ AI Chat ของลูกค้าคุณใช้งาน [AI provider](https://nexcmp.com/th/docs/ai/ai-providers/) | | การสมัครใช้งาน Claude, ChatGPT หรือ Gemini | ติดตั้ง CLI อย่างเป็นทางการและลงชื่อเข้าใช้บนเซิร์ฟเวอร์แผงแล้ว | ดูข้อมูลเพิ่มเติมที่ [AI accounts and subscriptions](https://nexcmp.com/th/docs/configure-with-ai/ai-accounts-and-subscriptions/) | คีย์ที่คุณวางจะถูกเข้ารหัสและจัดเก็บไว้สำหรับบัญชีผู้ดูแลระบบของคุณเท่านั้น ระบบจะไม่แสดงคีย์ดังกล่าวอีกและผู้ดูแลระบบรายอื่นจะไม่สามารถถอดรหัสได้ ## ใช้งานแชท {#use-the-chat} 1. เปิด **AI Chat** (หรือคลิก **Ask AI**) 2. คลิก **New chat** หรือเปิดแชทก่อนหน้าจากรายการทางด้านซ้าย 3. พิมพ์คำขอของคุณแล้วกด Enter (Shift+Enter เพื่อขึ้นบรรทัดใหม่) คุณสามารถแนบรูปภาพหรือไฟล์ข้อความ (สูงสุด 4 ไฟล์ต่อข้อความ ขนาดไม่เกิน 3 MB ต่อไฟล์) เพื่อแสดงข้อผิดพลาดหรือวางเอกสารได้ 4. รอดูคำตอบสตรีมเข้ามา เครื่องมือแต่ละตัวที่ผู้ช่วยเรียกใช้จะแสดงเป็นการ์ดที่ยุบได้ พร้อมชื่อเครื่องมือ อาร์กิวเมนต์ และผลลัพธ์ย่อ 5. กด **Stop** เพื่อยกเลิกคำตอบที่กำลังทำงานอยู่ อนุญาตให้ทำงานได้ทีละหนึ่งคำตอบต่อผู้ดูแลระบบหนึ่งท่าน ![AI Chat พร้อมรายการสนทนา คำตอบที่มีการ์ดเครื่องมือ และช่องป้อนข้อมูลพร้อมตัวเลือกแหล่งที่มาและช่อง Secret](https://nexcmp.com/th/docs/images/configure-with-ai/ai-chat-in-admin-01-chat.webp) มีการเรียกใช้เครื่องมือสูงสุด 10 รอบต่อข้อความ ผู้ช่วยจะจดจำข้อความ 30 รายการล่าสุดของแชท ผลลัพธ์จากเครื่องมือจะถูกส่งไปยังโมเดลในฐานะข้อมูล ไม่ใช่ในฐานะคำสั่ง ## การ์ดการยืนยัน {#confirmation-cards} ใน AI Chat **ทุกการเปลี่ยนแปลงจะปรากฏเป็นการ์ด** ไม่ใช่เฉพาะการดำเนินการเกี่ยวกับเงินเท่านั้น ผู้ช่วยเป็นผู้เสนอ ส่วนคุณเป็นผู้ตัดสินใจ การ์ดจะแสดงข้อมูลดังนี้: - ชื่อเรื่องที่ระบุว่าเหตุใดจึงต้องมีการตรวจสอบ เช่น "เปลี่ยนแปลงยอดเงินของลูกค้า" - การเรียกใช้งาน: เมธอดและพาธ - ตารางฟิลด์ที่มีการเปลี่ยนแปลง: ค่าปัจจุบันและค่าใหม่ ค่าที่เป็นความลับจะแสดงเป็น `••••` - การนับถอยหลัง (การ์ดจะหมดอายุหลังจากผ่านไป 5 นาที) - **Confirm** และ **Reject** **Confirm** จะทำให้ตัวแผงควบคุมทำการเปลี่ยนแปลงนั้นด้วยตนเอง จากนั้นจะแจ้งให้ผู้ช่วยทราบว่าเกิดอะไรขึ้น ผู้ช่วยจะไม่สามารถกดปุ่มดังกล่าว อนุมัติผ่าน API ได้ และได้รับคำสั่งว่าห้ามอ้างเด็ดขาดว่าการเปลี่ยนแปลงถูกนำไปใช้แล้วก่อนที่จะได้รับการยืนยัน หากคุณรีโหลดหน้าเว็บ การ์ดที่ยังคงใช้งานได้อยู่จะปรากฏกลับขึ้นมาอีกครั้ง นอกจากนี้ยังแสดงอยู่ที่ด้านบนของ **System › Settings › API & AI agents** ภายใต้หัวข้อ "Waiting for your confirmation" ![การ์ด Crad แสดงการเปลี่ยนแปลงยอดเงิน การนับถอยหลัง และปุ่ม Confirm กับ Reject](https://nexcmp.com/th/docs/images/configure-with-ai/ai-chat-in-admin-02-confirm.webp) ## ข้อมูลลับ {#secrets} ห้ามส่งรหัสผ่านและ API keys ผ่านทางข้อความแชท ให้ใช้ฟิลด์ **Secret** (ไอคอนแม่กุญแจ) ที่อยู่ถัดจากช่องป้อนข้อมูล: 1. คลิกที่ไอคอนแม่กุญแจและป้อน **name** (ตัวอักษร ตัวเลข และขีดล่าง เช่น `smtp_password`) รวมถึง **value** 2. ในข้อความของคุณ ให้้างอิงถึงชื่อนั้น: "use the secret smtp_password as the SMTP password" 3. ผู้ช่วยจะเห็นเพียงตัว placeholder ที่ใช้แทนข้อมูลลับเท่านั้น โดยเขียนในลักษณะนี้: ```text {{secret:smtp_password}} ``` แผงควบคุมจะแทนที่ข้อมูลดังกล่าวด้วยค่าจริงในขณะที่ทำการรันเครื่องมือ ค่านี้จะไม่ถูกบันทึกไว้ในประวัติการแชทและจะไม่ถูกส่งไปยังแหล่งที่มาของ AI หากคุณเผลอวางข้อความที่มีลักษณะเหมือนคีย์ลงในข้อความโดยไม่ได้ตั้งใจ แผงควบคุมจะย้ายข้อความนั้นไปยังที่เก็บข้อมูลที่มีการป้องกันเดียวกันและทำการซ่อนในประวัติการแชท แต่ให้ถือว่าเป็นเพียงมาตรการสำรองด้านความปลอดภัย ไม่ใช่วิธีการใช้งานหลัก ข้อมูลลับจะอยู่ในหน่วยความจำของแผงควบคุมสำหรับการสนทนานั้นๆ และคงอยู่เป็นเวลาสูงสุดหนึ่งชั่วโมงหลังจากข้อความล่าสุดเท่านั้น การรีสตาร์ทแผงควบคุมจะล้างข้อมูลเหล่านี้ด้วยเช่นกัน ให้ป้อนข้อมูลใหม่อีกครั้งหากผู้ช่วยร้องขอ การตั้งค่าข้อมูลลับยังจำเป็นต้องมีสิทธิ์ `secrets:write` สำหรับเซสชันแชทด้วย (ดูรายละเอียดด้านล่าง) ## สิทธิ์ของแชท {#permissions-of-the-chat} ข้อความแต่ละรายการจะทำงานด้วยคีย์ชั่วคราวที่มีอายุเท่ากับระยะเวลาของคำตอบ (สูงสุด 15 นาที) ทำงานจากเซิร์ฟเวอร์ของแผงควบคุมเท่านั้น และสามารถใช้งานผ่านการ์ด Crad ยืนยันได้เท่านั้น สิทธิ์ขอบเขตของคีย์คือรายการที่ทำเครื่องหมายไว้ใน **System › Settings › AI accounts › Chat session permissions** โดย `admin:read` จะเปิดใช้งานอยู่เสมอ สิทธิ์ขอบเขตทั้งหมด ยกเว้น `secrets:write` จะเปิดใช้งานเป็นค่าเริ่มต้น ให้ทำเครื่องหมายที่ `secrets:write` หากคุณต้องการให้ผู้ช่วยสามารถตั้งรหัสผ่านและคีย์ได้ (ผ่านช่อง Secret) ในแผงควบคุมเดโม แชทจะเป็นแบบอ่านอย่างเดียว ## ขีดจำกัดการใช้จ่ายรายวัน {#daily-spending-cap} AI Chat จะรวมต้นทุนโดยประมาณของคำตอบจากแหล่งที่มา API ขีดจำกัดเริ่มต้นคือ **5 USD ต่อผู้ดูแลระบบหนึ่งคนต่อวัน** กำหนดจำนวนเงินอื่น (0 หมายถึงไม่มีขีดจำกัด) ภายใต้ **AI accounts › Defaults for AI Chat** หน้าเว็บจะแสดงข้อความ "used today" เมื่อถึงขีดจำกัด แชทจะปฏิเสธข้อความใหม่ (`daily_cap`) จนถึงวันถัดไปหรือจนกว่าคุณจะเพิ่มขีดจำกัด แหล่งข้อมูลที่เป็นการสมัครสมาชิก AI CLI จะไม่ถูกนับรวม เนื่องจากมีการเรียกเก็บเงินตามการสมัครสมาชิกของคุณ ## ตรวจสอบ {#verify} 1. ใน **AI accounts** ให้คลิก **Test** บนแหล่งข้อมูล ระบบจะตอบกลับด้วยชื่อโมเดลและเวลาเป็นมิลลิวินาที 2. ใน AI Chat ให้พิมพ์ว่า "Check my setup progress" คำตอบจะแสดงรายการขั้นตอนจาก [checklist](https://nexcmp.com/th/docs/configure-with-ai/setup-checklist/) และการ์ดเครื่องมือ `setup_checklist` จะปรากฏขึ้น 3. ขอการเปลี่ยนแปลงเล็กน้อย เช่น "Set the brand name to Example Cloud" การ์ด Crad ยืนยันจะปรากฏขึ้น ให้กด **Confirm** และตรวจสอบหน้า Branding 4. **API & AI agents › Activity** จะแสดงรายการการเรียกใช้งานที่มีช่องสัญญาณ `chat` ## ขีดจำกัดและหมายเหตุ {#limits-notes} - ผู้ช่วยไม่มีเชลล์ (shell) และไม่สามารถอ่านไฟล์บนเซิร์ฟเวอร์ได้ โดยจะเรียกใช้เฉพาะ [admin tools](https://nexcmp.com/th/docs/configure-with-ai/mcp-admin/#tools) เท่านั้น - การเปลี่ยนแปลงที่คีย์ไม่สามารถทำได้เลย ([list](https://nexcmp.com/th/docs/configure-with-ai/admin-api-keys/#what-a-key-can-never-do)) จะไม่สามารถทำได้จาก AI Chat เช่นกัน - ตรวจสอบการทำงานของโมเดล การ์ด Crad ยืนยันจะแสดงสิ่งที่ส่งไปอย่างแม่นยำ ให้อ่านดูให้ละเอียด โดยเฉพาะราคาและจำนวนเงิน - การตอบกลับของ API จะถูกเรียกเก็บเงินโดยผู้ให้บริการ AI ขีดจำกัดดังกล่าวเป็นเพียงการประมาณการเท่านั้น ควรกำหนดขีดจำกัดการใช้จ่ายกับทางผู้ให้บริการด้วย - คำตอบของ CLI จะหยุดทำงานหลังจากผ่านไป 5 นาที ## การแก้ Problme {#troubleshooting} | อาการ | สาเหตุ | วิธีแก้ปัญหา | |---|---|---| | "ถึงขีดจำกัดการใช้จ่าย AI ประจำวันนี้แล้ว" (`daily_cap`) | คุณใช้งานถึงขีดจำกัดรายวันแล้ว | เพิ่มขีดจำกัดใน AI accounts หรือรอจนถึงวันพรุ่งนี้ | | "อีกหนึ่งคำตอบยังคงทำงานอยู่ - โปรดรอหรือกด Stop" (`busy`) | ทำงานทีละหนึ่งคำตอบต่อผู้ดูแลระบบหนึ่งท่าน | กด **Stop** หรือรอ | | ไม่พบแหล่งที่มาในตัวเลือก | ไม่ได้เชื่อมต่อ หรือ (Claude CLI) สวิตช์ "I understand" ปิดอยู่ | เชื่อมต่อในบัญชี AI | | "ดูเหมือนไม่ใช่ API key" | คีย์ที่วางมีช่องว่างหรือยาวเกินไป | วางเฉพาะคีย์เท่านั้น | | การทดสอบล้มเหลว | คีย์ไม่ถูกต้อง, ไม่มีเครดิต หรือผู้ให้บริการล่ม | ตรวจสอบคีย์และการเรียกเก็บเงินกับผู้ให้บริการ | | ผู้ช่วยแจ้งว่าไม่สามารถทำบางอย่างได้ | เซสชันแชทไม่มีขอบเขต หรือการกระทำนั้นถูกปิดไม่ให้ AI ทำ | ทำเครื่องหมายที่ขอบเขตในบัญชี AI หรือดำเนินการในส่วนผู้ดูแลระบบ | | การ์ดแจ้งว่าหมดอายุ | ผ่านไปนานกว่า 5 นาที | ขอให้ผู้ช่วยเสนอการเปลี่ยนแปลงใหม่อีกครั้ง | | แหล่งที่มาของ CLI รายงาน "usage limit" หรือ "not logged in" | ขีดจำกัดการสมัครใช้งานหรือเซสชันของคุณ | ลงชื่อเข้าใช้ใหม่อีกครั้งหรือรอ โปรดดู [บัญชี AI และการสมัครใช้งาน](https://nexcmp.com/th/docs/configure-with-ai/ai-accounts-and-subscriptions/) | --- # บัญชี AI และการสมัครใช้งาน {#ai-accounts-and-subscriptions} > **ตำแหน่งในส่วนผู้ดูแลระบบ:** System › Settings › AI accounts (`/agent/accounts`), แท็บ **Accounts** และ **Use your own AI subscription**. เทอร์มินัลเสริมคือ AI Console (`/agent/console`) ซึ่งจะปรากฏใต้ AI Chat เฉพาะเมื่อเปิดใช้งานเท่านั้น ## What it does {#what-it-does} AI Chat จำเป็นต้องมีแหล่งข้อมูลในการตอบ หน้าต่างนี้ช่วยให้คุณเชื่อมต่อแหล่งข้อมูลดังกล่าวสำหรับบัญชีผู้ดูแลระบบของคุณเอง: - **แหล่งที่มา API**: OpenAI, Anthropic (Claude), Google Gemini และ OpenRouter โดยใช้คีย์ API หรือการลงชื่อเข้าใช้ - **ผู้ให้บริการ AI ของแผงควบคุม** หากคุณตั้งค่าไว้แล้วภายใต้ System › Settings › AI provider - **การสมัครใช้งาน AI ของคุณเอง** (Claude, ChatGPT, Gemini) ผ่าน**เครื่องมือบรรทัดคำสั่งอย่างเป็นทางการ**ของผู้ให้บริการ ไม่ว่าจะบนเซิร์ฟเวอร์แผงควบคุมหรือบนคอมพิวเตอร์ของคุณเอง ทุกสิ่งที่คุณเชื่อมต่อจะเป็นของบัญชีผู้ดูแลระบบของคุณ คีย์และโทเค็นจะถูกจัดเก็บแบบเข้ารหัสสำหรับคุณเพียงผู้เดียว ผู้ดูแลระบบรายอื่นจะไม่สามารถใช้งานได้ ## ข้อกำหนด {#requirements} | Item | Requirement | |---|---| | บทบาท | ผู้ดูแลระบบที่ลงชื่อเข้าใช้แล้ว บนแผงควบคุมทดลองจะไม่สามารถเชื่อมต่อหรือถอดถอนสิ่งใดได้ | | แหล่งที่มา API | บัญชีและคีย์ API ที่ผู้ให้บริการ (การ์ดจะมีลิงก์ **Get API key** เพื่อเปิดหน้าของผู้ให้บริการ) | | CLI บนเซิร์ฟเวอร์แผงควบคุม | เปิดใช้งาน AI Console (ดูด้านล่าง), การเชื่อมต่อ HTTPS ขาออกจากเซิร์ฟเวอร์ไปยังผู้ให้บริการและไปยัง `nodejs.org` รวมถึงรีจิสทรีของ npm และ **RAM 2 GB ขึ้นไป** (CLI ต้องการพื้นที่ว่าง RAM ประมาณ 1 GB ขณะทำงาน ตัวติดตั้งจะแสดงคำเตือนหากต่ำกว่า 2 GB) มีการใช้ Node.js 20 หรือใหม่กว่าหากมีอยู่ มิฉะนั้นตัวติดตั้งจะดาวน์โหลด Node.js 22 พร้อมตรวจสอบเช็คซัม | | CLI บนคอมพิวเตอร์ของคุณ | Node.js 20 หรือใหม่กว่าสำหรับติดตั้ง CLI และการสมัครใช้งานของคุณเอง | ## เชื่อมต่อแหล่งที่มา API {#connect-an-api-source} 1. เปิด **System › Settings › AI accounts** และอยู่ที่แท็บ **Accounts** 2. คลิก **Connect** บนการ์ดของซอร์ส หน้าคีย์ของผู้ให้บริการจะเปิดขึ้นในแท็บใหม่ สร้างคีย์ที่นั่น 3. วางคีย์ลงในฟิลด์แล้วบันทึก การ์ดจะแสดงสถานะเชื่อมต่อพร้อมอักขระสี่ตัวสุดท้าย 4. เลือก **default model** หากคุณต้องการรุ่นอื่น จากนั้นคลิก **Test** ผลลัพธ์ที่ดีจะมีข้อความว่า "Connected - example-model, 850 ms" ![หน้าบัญชี AI ที่แสดงการ์ดแหล่งที่มา API, การ์ด OpenAI ที่เชื่อมต่อแล้ว และการ์ดผู้ให้บริการ AI ของแผงควบคุม](https://nexcmp.com/th/docs/images/configure-with-ai/ai-accounts-and-subscriptions-01-accounts.webp) | Source | ทางเลือกในการลงชื่อเข้าใช้ | |---|---| | OpenRouter | **Sign in with OpenRouter** จะเปิด OpenRouter ในป็อปอัพหรือแท็บใหม่ อนุมัติแล้วคุณจะกลับมาที่หน้านี้ในสถานะเชื่อมต่อ | | Google Gemini | **Sign in with Google** จะปรากฏขึ้นหลังจากที่คุณบันทึกแล้ว ใต้ **Set up Google sign-in (optional)** บนการ์ด โดยต้องสร้าง OAuth client ใน Google Cloud project **ของคุณเอง** (client ID ลงท้ายด้วย `.apps.googleusercontent.com` พร้อมกับ secret ของมัน) NexCMP ไม่ได้ติดตั้ง Google client แบบแชร์ใดๆ | | ผู้ให้บริการ AI ของแผง | ใช้ผู้ให้บริการที่กำหนดค่าไว้แล้วภายใต้ System › Settings › AI provider ([AI provider](https://nexcmp.com/th/docs/ai/ai-providers/)) ไม่ต้องวางอะไร | หากต้องการยกเลิกการเชื่อมต่อซอร์ส ให้คลิก **Remove** บนการ์ดนั้น ระบบจะลบคีย์ที่จัดเก็บไว้สำหรับบัญชีของคุณ ### ค่าเริ่มต้น, ขีดจำกัดรายวัน และสิทธิ์การใช้งาน {#defaults-daily-cap-and-permissions} ที่ด้านล่างของแท็บ **Accounts** ส่วน **Defaults for AI Chat** จะมีการตั้งค่าสามรายการ: | การตั้งค่า | ความหมาย | |---|---| | ซอร์สและโมเดลเริ่มต้น | สิ่งที่แชทใหม่จะใช้งาน คุณยังคงสามารถเปลี่ยนซอร์สได้ต่อข้อความ | | ขีดจำกัดการใช้จ่ายรายวัน (USD, 0 = ไม่จำกัด) | ค่าเริ่มต้นคือ 5 หน้าเว็บจะแสดง "used today" ดูเพิ่มเติมที่ [AI Chat in the admin](https://nexcmp.com/th/docs/configure-with-ai/ai-chat-in-admin/#daily-spending-cap) | | สิทธิ์ของเซสชันแชท | ขอบเขตที่ผู้ช่วยอาจใช้งาน `admin:read` เปิดใช้งานเสมอ; `secrets:write` ปิดใช้งานโดยค่าเริ่มต้น ดู [Admin API keys](https://nexcmp.com/th/docs/configure-with-ai/admin-api-keys/#scopes) | คลิก **Save defaults** ## ใช้การสมัครสมาชิก AI ของคุณเอง {#use-your-own-ai-subscription} คุณสามารถใช้งาน NexCMP ด้วยแพ็กเกจ Claude, ChatGPT หรือ Gemini ที่คุณจ่ายเงินอยู่แล้ว โดยไม่ต้องใช้ API key แยกต่างหาก มีสองวิธีดังนี้ ### วิธีที่ 1 (แนะนำ): ใช้ CLI บนคอมพิวเตอร์ของคุณเอง {#way-1-recommended-the-cli-on-your-own-computer} คุณใช้เครื่องมือของผู้ให้บริการบนคอมพิวเตอร์ของคุณเองและลงชื่อเข้าใช้ด้วยบัญชีปกติของคุณตามปกติ NexCMP จะรับเฉพาะคำขอ MCP ที่ลงนามด้วยคีย์ที่มีอายุสั้นเท่านั้น เปิด **AI accounts › Use your own AI subscription** โดยจะแสดงสามขั้นตอนต่อเครื่องมือหนึ่งตัว 1. คลิก **Create a 7-day key** และเลือกระดับ: **Read only** (`admin:read`) หรือ **Read + configuration** (`admin:read`, `catalog:write`, `infra:write`, `settings:write`) คำสั่งด้านล่างจะใส่คีย์จริงลงไป 2. ติดตั้ง CLI และลงชื่อเข้าใช้ คีย์จะแสดงขึ้นบนหน้านี้เท่านั้นและแสดงเพียงครั้งเดียว | เครื่องมือ | การติดตั้ง | เข้าสู่ระบบ | |---|---|---| | Claude Code | `npm install -g @anthropic-ai/claude-code` | รัน `claude` จากนั้น `/login` | | Codex CLI | `npm install -g @openai/codex` | `codex login` | | Gemini CLI | `npm install -g @google/gemini-cli` | รัน `gemini` เลือก "Login with Google" | 3. เชื่อมต่อเข้ากับแผงควบคุมของคุณด้วยคำสั่งเดียวหรือบล็อกเดียวที่คัดลอกมาจากหน้าเว็บ: ```bash # Claude Code claude mcp add --transport http nexcmp https://cloud.example.com/mcp/admin \ --header "Authorization: Bearer ak_XXXX" ``` ```toml # Codex CLI: ~/.codex/config.toml, then: export NEXCMP_KEY=ak_XXXX [mcp_servers.nexcmp] url = "https://cloud.example.com/mcp/admin" bearer_token_env_var = "NEXCMP_KEY" ``` ```json // Gemini CLI: ~/.gemini/settings.json { "mcpServers": { "nexcmp": { "httpUrl": "https://cloud.example.com/mcp/admin", "headers": { "Authorization": "Bearer ak_XXXX" } } } } ``` 4. เริ่มต้นใช้งานเครื่องมือและถามตัวอย่างเช่น "what is left to set up in nexcmp?" รายละเอียดทั้งหมดของการเชื่อมต่อ MCP อยู่ใน [Connect an AI client](https://nexcmp.com/th/docs/configure-with-ai/mcp-admin/) แท็บเดียวกันนี้จะแสดง URL สำหรับตัวเชื่อมต่อ **claude.ai** และ **ChatGPT** ซึ่งจะลงชื่อเข้าใช้ด้วย OAuth และไม่ต้องใช้คีย์: [OAuth connectors](https://nexcmp.com/th/docs/configure-with-ai/oauth-connectors/) ![แท็บ Use your own AI subscription พร้อมปุ่มคีย์ 7 วัน และคำสั่งสำหรับติดตั้ง, ลงชื่อเข้าใช้ และเชื่อมต่อสำหรับ CLI ทั้งสามรายการ](https://nexcmp.com/th/docs/images/configure-with-ai/ai-accounts-and-subscriptions-02-subscription.webp) ### Way 2: CLI บนเซิร์ฟเวอร์พาเนล (ปุ่ม Install / Login) {#way-2-the-cli-on-the-panel-server-install-login-buttons} การ์ดภายใต้ "Subscription through a CLI (Claude, ChatGPT, Gemini)" ช่วยให้ NexCMP ติดตั้ง CLI อย่างเป็นทางการบนเซิร์ฟเวอร์พาเนลและเปิดขั้นตอนการลงชื่อเข้าใช้ของตัวเอง เพื่อให้ **AI Chat** สามารถตอบคำถามด้วยการสมัครใช้งานของคุณได้ **วิธีแยกการทำงาน (Isolation)** CLI จะทำงานในกระบวนการแยกต่างหาก (`nexcmp-ai.service`) ในฐานะผู้ใช้ระบบของตัวเอง `nexcmp-ai` โดยไม่มีสิทธิ์ sudo, ไม่มีเข้าถึงข้อมูลและโฟลเดอร์การกำหนดค่าของ NexCMP และมีการจำกัดหน่วยความจำ สำหรับทุกข้อความใน AI Chat CLI จะถูกเริ่มโดยอนุญาตเฉพาะเครื่องมือ NexCMP MCP เท่านั้น (ปิดเครื่องมือ shell และ file) และใช้คีย์ที่ทำงานจากเซิร์ฟเวอร์เท่านั้น NexCMP ไม่ได้อ่านหรือคัดลอกข้อมูลการเข้าสู่ระบบของ CLI โดย CLI จะเก็บบันทึกไว้ในโฟลเดอร์ส่วนตัวสำหรับบัญชีผู้ดูแลระบบของคุณ ไม่มีสิ่งใดที่ต้องเปิดใช้งาน: พาเนลจะตั้งค่าผู้ใช้ `nexcmp-ai` และบริการเมื่อมีการติดตั้งหรืออัปเดตเป็น 1.4.0 ดังนั้นการ์ดจึงพร้อมใช้งานได้ทันที **การติดตั้งและลงชื่อเข้าใช้ (ต่อผู้ดูแลระบบหนึ่งท่าน):** 1. บนการ์ดของ CLI ให้คลิก **Login** หากยังไม่ได้ติดตั้ง CLI พาเนลจะทำการติดตั้งให้ก่อน: แถบความคืบหน้าและบันทึกย่อจะแสดงการดาวน์โหลด (Node.js หากจำเป็น ตามด้วย CLI) คำเตือนจะปรากฏขึ้นเมื่อเซิร์ฟเวอร์มีแรม (RAM) น้อยกว่า 2 GB 2. การ์ดจะแสดงสิ่งที่ CLI ขออนุญาต: - **Codex CLI**: คลิก **Open the sign-in page** และพิมพ์รหัสแบบใช้ครั้งเดียวที่แสดงอยู่บนการ์ด (ต้องเปิดใช้งานการลงชื่อเข้าใช้ด้วยอุปกรณ์ของ OpenAI ในการตั้งค่าความปลอดภัยของ ChatGPT) - **Claude Code และ Gemini CLI**: คลิก **Open the sign-in page**, ลงชื่อเข้าใช้ จากนั้นวางรหัสยืนยันที่หน้าของเวนเดอร์แสดงลงใน **Paste the verification code here** แล้วคลิก **Send code** 3. การ์ดจะเปลี่ยนเป็นสถานะ "Signed in" พร้อมระบุบัญชีและเวอร์ชัน การลงชื่อเข้าใช้ที่ไม่เสร็จสิ้นภายใน 10 นาทีจะถูกยกเลิก ให้คลิก **Login** อีกครั้ง 4. ใน **AI Chat** ตอนนี้แหล่งที่มาจะปรากฏในตัวเลือก (เช่น "ChatGPT (via Codex CLI)") 5. **Sign out** จะเป็นการลบการลงชื่อเข้าใช้ของ CLI สำหรับบัญชีของคุณ สำหรับ Claude การ์ดจะมีสวิตช์เพิ่มเติมคือ **I understand and accept the vendor's terms for using a subscription this way** ซึ่งจะปิดอยู่โดยค่าเริ่มต้น แหล่งที่มาจะไม่แสดงใน AI Chat จนกว่าจะเปิดใช้งานสวิตช์นี้ ![การ์ดสมัครใช้งาน CLI พร้อมปุ่ม Install และ Login, รหัสแบบใช้ครั้งเดียวบนการ์ด Codex และสวิตช์ I understand บนการ์ด Claude](https://nexcmp.com/th/docs/images/configure-with-ai/ai-accounts-and-subscriptions-03-cli.webp) ### ข้อกำหนดของเวนเดอร์ AI {#terms-of-the-ai-vendors} การลงชื่อเข้าใช้ด้วยการสมัครใช้งานของผู้บริโภคจะอยู่ภายใต้ข้อกำหนดของเวนเดอร์แต่ละรายซึ่งอาจมีการเปลี่ยนแปลง หมายเหตุสดท้ายนี้เป็นเพียงสรุปสิ่งที่เวนเดอร์เผยแพร่ ณ เดือนตุลาคม 2026 ไม่ใช่คำแนะนำทางกฎหมายและไม่ใช่คำแถลงในนามของเวนเดอร์ โปรดอ่านหน้าเว็บปัจจุบันก่อนเปิดใช้งาน | เวนเดอร์ | สิ่งที่หน้าเว็บของเวนเดอร์ครอบคลุม | Source | |---|---|---| | Anthropic (Claude) | การลงชื่อเข้าใช้ Claude Code แบบดั้งเดิมด้วยแผนของคุณเองนั้นได้รับการครอบคลุม การใช้การสมัครใช้งานผ่านผลิตภัณฑ์อื่น หรือการมีผลิตภัณฑ์ที่รวบรวมหรือส่งต่อการลงชื่อเข้าใช้นั้นจะได้รับการปฏิบัติที่แตกต่างออกไป และขีดจำกัดของแผนจะถือตามการใช้งานส่วนบุคคลปกติ นี่คือเหตุผลว่าทำไมการ์ด Claude จึงมีหมายเหตุและสวิตช์ **I understand** และทำไม Way 1 จึงเป็นตัวเลือกที่สะอาดตากว่า | https://code.claude.com/docs/en/legal-and-compliance | | OpenAI (Codex) | Codex รองรับการลงชื่อเข้าใช้ด้วยบัญชี ChatGPT หรือ API key OpenAI แนะนำให้ใช้ API key สำหรับระบบอัตโนมัติและระบุว่าไม่ควรเปิดเผย Codex ในสภาพแวดล้อมที่ไม่น่าเชื่อถือหรือเป็นสาธารณะ โปรดใช้การ์ดสำหรับตัวคุณเองเท่านั้น | https://developers.openai.com/codex/auth | | Google (Gemini CLI) | รองรับ Sign in with Google, API key และ Vertex AI โดยข้อกำหนดจะขึ้นอยู่กับวิธีที่คุณลงชื่อเข้าใช้ และโควตาของแผนของคุณจะมีผลบังคับใช้ | https://geminicli.com/docs/get-started/authentication | หากคุณต้องการหลีกเลี่ยงปัญหานี้โดยสิ้นเชิง ให้ใช้แหล่งข้อมูล **API key** หรือวิธีที่ 1 บนคอมพิวเตอร์ของคุณเอง ## AI Console {#ai-console} AI Console เป็นหน้าเทอร์มินัลเสริมสำหรับการรัน CLI ตัวใดตัวหนึ่งที่เข้าสู่ระบบแล้วบนเซิร์ฟเวอร์ของพาเนล โดยค่าเริ่มต้นจะ **ปิดอยู่** - เปิดหรือปิดใช้งาน และจัดการ CLI เหล่านี้ได้บนเซิร์ฟเวอร์: ```bash sudo nexcmp ai-console enable # turn on (also creates the nexcmp-ai user and service) sudo nexcmp ai-console disable # turn off sudo nexcmp ai-console status # runner, console state and installed CLIs sudo nexcmp ai-console install claude # or codex, or gemini ``` `status` จะแสดงผลว่าซ็อกเก็ต AI runner พร้อมหรือไม่, AI Console เปิดหรือปิดใช้งานอยู่ และสถานะ "installed" หรือ "not installed" ของแต่ละ CLI นอกจากนี้ `sudo nexcmp status` ยังแสดงคำว่า "AI runner: active" อีกด้วย - เมื่อเปิดใช้งานแล้ว แท็บ **AI Console** จะปรากฏขึ้นใต้ AI Chat เลือก CLI ที่เข้าสู่ระบบแล้ว กรอกรหัสผ่านผู้ดูแลระบบของคุณอีกครั้ง (และรหัส 2FA ของคุณหากใช้งานอยู่) แล้วเปิดเซสชัน แบนเนอร์จะเตือนคุณว่าคำสั่งในนี้สามารถจัดการ NexCMP ได้ผ่านเครื่องมือ MCP เท่านั้น เครื่องมือเกี่ยวกับเชลล์และไฟล์จะถูกปิดใช้งาน - การติดตั้งแบบเดโมจะไม่สร้างผู้ใช้ `nexcmp-ai` ![หน้าจอเริ่มต้นของ AI Console พร้อมตัวเลือก CLI, ฟิลด์รหัสผ่าน และแบนเนอร์แจ้งเตือนเฉพาะ MCP](https://nexcmp.com/th/docs/images/configure-with-ai/ai-accounts-and-subscriptions-04-console.webp) ## ตรวจสอบ {#verify} 1. **Test** บนแหล่งข้อมูล API จะแสดงชื่อโมเดล 2. บนการ์ด CLI สถานะจะแสดงเป็น "Signed in" พร้อมกับบัญชี 3. บนเซิร์ฟเวอร์: `sudo nexcmp ai-console status` แสดงรายการ CLI ว่าติดตั้งแล้ว และ `systemctl is-active nexcmp-ai` พิมพ์ค่า `active` 4. ใน AI Chat ให้เลือกแหล่งข้อมูล ถามว่า "Check my setup progress" แล้วการ์ดเครื่องมือจะปรากฏขึ้น ## ขีดจำกัดและหมายเหตุ {#limits-notes} - คำตอบจาก CLI จะจำกัดเวลาไว้ที่ 5 นาทีและตอบทีละหนึ่งคำตอบต่อผู้ดูแลระบบหนึ่งท่าน โควตารายวันจะไม่นับรวมคำตอบจาก CLI - ทุกการเปลี่ยนแปลงจากแหล่งข้อมูล CLI จะยังคงเป็นการ์ดการยืนยันใน AI Chat โดย CLI ไม่สามารถใช้การเปลี่ยนแปลงได้ด้วยตนเอง - แผนสมาชิกจะมีขีดจำกัดการใช้งานของตนเอง เมื่อผู้ให้บริการแจ้งว่า "usage limit" หรือ "not logged in" แชทจะแสดงข้อความนั้น - การลบแหล่งข้อมูลจะไม่เป็นการลบประวัติการสนทนา - อัปเดตแพตช์เซิร์ฟเวอร์อยู่เสมอ: CLI จะถูกติดตั้งจากแพ็กเกจสาธารณะของผู้ให้บริการ ณ เวลาที่คุณคลิก Install ## การแก้ Problme {#troubleshooting} | อาการ | สาเหตุ | วิธีแก้ปัญหา | |---|---|---| | การเข้าสู่ระบบถูกปิดใช้งานและบนการ์ดแสดงข้อความ "AI tools are not ready on the server yet" | บริการ `nexcmp-ai` ไม่ได้ทำงานอยู่ | อัปเดตพาเนลเป็นเวอร์ชันล่าสุด จากนั้นตรวจสอบ `sudo nexcmp status` สำหรับเดโมแบบอ่านอย่างเดียวถือเป็นเรื่องปกติ | | "ยังไม่ได้ติดตั้งเครื่องมือ AI บนเซิร์ฟเวอร์นี้" | บริการ `nexcmp-ai` ไม่ได้ทำงานอยู่ (พาเนลเวอร์ชันเก่า หรือพาเนลเดโม) | อัปเดตพาเนล จากนั้น `sudo nexcmp ai-console install claude` (หรือ `codex`, `gemini`) | | คำเตือนเกี่ยวกับ RAM น้อยกว่า 2 GB | เซิร์ฟเวอร์มีขนาดเล็ก | การติดตั้งอาจช้าหรือล้มเหลว ให้เพิ่มหน่วยความจำหรือใช้ใช้วิธีที่ 1 | | "Node.js download checksum mismatch" หรือ "download failed" | เซิร์ฟเวอร์ไม่สามารถติดต่อ nodejs.org ได้ หรือมีพร็อกซีเปลี่ยนแปลงการดาวน์โหลด | อนุญาตการเชื่อมต่อ HTTPS ขาออกแล้วลองใหม่อีกครั้ง | | การติดตั้งสิ้นสุดลงด้วยข้อผิดพลาด | npm ไม่สามารถติดตั้งแพ็กเกจได้ | อ่านบันทึก (log) บนการ์ด ตรวจสอบการเข้าถึงเครือข่ายขาออกไปยังรีจิสทรีของ npm แล้วลองใหม่อีกครั้ง | | การเข้าสู่ระบบสิ้นสุดลงด้วยข้อผิดพลาดหรือหมดเวลา | พ้นช่วงเวลา 10 นาทีแล้ว หรือป้อนรหัสไม่ถูกต้อง | คลิก **Login** อีกครั้งและดำเนินการให้เสร็จสิ้นเร็วขึ้น | | แหล่งข้อมูล Claude หายไปใน AI Chat | สวิตช์ **I understand** ปิดอยู่ หรือ CLI ยังไม่ได้เข้าสู่ระบบ | เปิดสวิตช์หลังจากอ่านหน้าของผู้ให้บริการแล้ว จากนั้นจึงเข้าสู่ระบบ | | "Sign in with Google" หายไปบน Gemini | ยังไม่มีการบันทึก Google OAuth client ไว้ | สร้างไคลเอนต์ใน Google Cloud project ของคุณเองและบันทึกไว้ใต้ **Set up Google sign-in (optional)** บนการ์ด หรือวาง API key แทน | | "Sign in with OpenRouter" คืนค่าข้อผิดพลาด | คุณยกเลิก หรือป๊อปอัปถูกบล็อก | อนุญาตป๊อปอัปแล้วลองใหม่อีกครั้ง | | คำตอบจาก CLI แจ้งว่า "usage limit" | โควตาของแพ็กเกจหมดลงแล้ว | รอ หรือสลับซอร์ส | --- # Admin API keys {#admin-api-keys} > **ตำแหน่งในหน้าผู้ดูแลระบบ:** System › Settings › API & AI agents (`/agent/keys`), แท็บ **API keys** หน้าเดียวกันนี้ยังมีแท็บ **Connect an AI**, **Connected apps** และ **Activity** ## What it does {#what-it-does} Admin API key (มีคำนำหน้าว่า `ak_`) ช่วยให้ไคลเอนต์ AI หรือสคริปต์สามารถจัดการแผงควบคุมของคุณด้วยสิทธิ์ที่คุณกำหนดได้อย่างแม่นยำ โดยทำงานบน admin API ที่ `/v1/admin/` และบน admin MCP endpoint `/mcp/admin` ซึ่งจะไม่ทำงานที่อื่น ::: info ไม่เหมือนกับคีย์ของลูกค้า ลูกค้าสร้างคีย์ที่ขึ้นต้นด้วย `vk_` ในพอร์ทัลลูกค้า ([API keys and scopes](https://nexcmp.com/th/docs/developers/api-keys/)) โดยคีย์เหล่านั้นจะเข้าถึงได้เฉพาะ customer API และ `/mcp` เท่านั้น คีย์ `ak_` จะถูกปฏิเสธบน customer API และคีย์ `vk_` จะถูกปฏิเสธบน admin API ::: ## ข้อกำหนด {#requirements} | Item | Requirement | |---|---| | บทบาท | คุณต้องเข้าสู่ระบบในฐานะผู้ดูแลระบบ คีย์ไม่สามารถสร้างคีย์อื่นได้ | | เดโม | บนเดโมแผงควบคุม หน้าดังกล่าวจะเป็นแบบอ่านอย่างเดียว: ไม่สามารถสร้างหรือเพิกถอนคีย์ใดๆ ได้ | | การเข้าถึง | ไคลเอนต์ต้องสามารถเข้าถึง `https://cloud.example.com/mcp/admin` หรือ `/v1/admin/...` บนแผงควบคุมของคุณได้ (โปรดตรวจสอบไฟร์อลของคุณหากมีการใช้ข้อจำกัดด้าน IP) | ## สร้างคีย์ {#create-a-key} 1. เปิด **System › Settings › API & AI agents** และอยู่บนแท็บ **API keys** 2. คลิก **Create new key** 3. กรอกข้อมูลในฟอร์ม: | ฟิลด์ | กฎ | |---|---| | Name | สูงสุด 60 ตัวอักษร เช่น "Claude Code on my laptop" | | Scopes | เลือกอย่างน้อยหนึ่งรายการ ดู [Scopes](#scopes) เริ่มต้นด้วย `admin:read` เท่านั้น | | วันหมดอายุ | 1, 7, 30, 60 หรือ 90 วัน ค่าเริ่มต้นคือ 30 สูงสุด 90 ไม่สามารถสร้างคีย์ที่ไม่มีวันหมดอายุได้ | | ช่วง IP (ไม่บังคับ) | ที่อยู่ IPv4 หรือ IPv6 หรือ CIDR หนึ่งรายการต่อบรรทัด เช่น `203.0.113.0/24` หรือ `2001:db8::/48` สูงสุด 32 รายการ เว้นว่างไว้เพื่ออนุญาตทุก IP | | จำนวนครั้งต่อนาที | 1 ถึง 6000 ค่าเริ่มต้นคือ 120 | 4. คลิก **Create key** หน้าต่างจะแสดงคีย์เพียงครั้งเดียว เช่น `ak_XXXX` **คัดลอกทันที**: NexCMP จะจัดเก็บเฉพาะแฮชและจะไม่สามารถแสดงคีย์นี้ได้อีก 5. คลิก **I have saved the key** เปิดแท็บ **Connect an AI** เพื่อรับคำสั่งที่พร้อมวางซึ่งมีคีย์ที่คุณเพิ่งสร้างเรียบร้อยแล้ว (เฉพาะในหน้านี้จนกว่าคุณจะรีโหลด) ![หน้าต่างสร้างคีย์ใหม่พร้อมชื่อ ช่องทำเครื่องหมายขอบเขต วันหมดอายุ และช่วง IP ที่กรอกแล้ว](https://nexcmp.com/th/docs/images/configure-with-ai/admin-api-keys-01-create.webp) ![หน้าต่างแสดงคีย์ใหม่ครั้งเดียวพร้อมปุ่มคัดลอกและคำเตือน](https://nexcmp.com/th/docs/images/configure-with-ai/admin-api-keys-02-shown-once.webp) ## Scopes {#scopes} คีย์สามารถใช้ได้เฉพาะเครื่องมือและเอนด์พอยต์ที่ขอบเขตของมันอนุญาตเท่านั้น ขอบเขตการเขียนจะไม่รวมสิทธิ์การอ่าน: คีย์ที่ต้องการอ่านและเขียนจึงต้องมี `admin:read` ด้วย | Scope | สิ่งที่อนุญาต | |---|---| | `admin:read` | อ่านการตั้งค่า แคตตาล็อก ลูกค้า การเรียกเก็บเงิน และบันทึกระบบ ข้อมูลลับจะไม่ถูกส่งคืน | | `catalog:write` | แพ็กเกจ เทมเพลต OS โควตา รหัสส่วนลด | | `infra:write` | แหล่งโครงสร้างพื้นฐาน (CloudStack, Proxmox), โซน, เซิร์ฟเวอร์ | | `billing:write` | เกตเวย์การชำระเงิน สกุลเงิน ใบแจ้งหนี้ ยอดคงเหลือ การทำธุรกรรมทางการเงินต้องมีการยืนยัน | | `customers:write` | ลูกค้าและผู้แทนจำหน่าย | | `settings:write` | การตั้งค่าทั่วไป, การสร้างแบรนด์, อีเมล, หน้ากฎหมาย, โมดูล และการแจ้งเตือน | | `ai:write` | ผู้ให้บริการ AI และฟีเจอร์ AI | | `secrets:write` | เขียนรหัสผ่านและ API keys โดยสามารถตั้งค่าได้แต่จะไม่สามารถอ่านค่ากลับมาได้ | ::: tip การตั้งค่าความลับต้องใช้ 2 สโคป ทุกการเรียกใช้งานที่มีรหัสผ่าน, API key หรือค่าโทเค็น (เช่น รหัสผ่าน SMTP, คีย์การชำระเงิน, Telegram bot token, คีย์ผู้ให้บริการ AI, ข้อมูลรับรอง CloudStack หรือ Proxmox) จำเป็นต้องมี `secrets:write` **และ** สโคปของพื้นที่นั้น (ตัวอย่างเช่น `settings:write` สำหรับ SMTP) หากคุณต้องการพิมพ์ข้อมูลลับด้วยตัวเอง ให้เว้น `secrets:write` ไว้แล้วป้อนข้อมูลในหน้าผู้ดูแลระบบ ::: ## การเพิกถอนคีย์ {#revoke-a-key} 1. ค้นหาคีย์ในตาราง (สถานะ **Active**, **Expired** หรือ **Revoked**; **Last used** จะแสดงเวลาและไคลเอนต์) 2. คลิก **Revoke** และยืนยัน คีย์จะหยุดทำงานทันที การเพิกถอนเป็นการดำเนินการถาวร; ให้สร้างคีย์ใหม่หากต้องการใช้งานอีกครั้ง ## สิ่งที่คีย์ไม่สามารถทำได้เลย {#what-a-key-can-never-do} คีย์จะไม่สามารถเข้าถึงพื้นที่เหล่านี้ได้ไม่ว่าจะมีสโคปใดก็ตาม ซึ่งต้องอาศัยการเข้าสู่ระบบในฐานะผู้ดูแลระบบ - สร้างหรือเปลี่ยนแปลงผู้ใช้งานที่เป็นผู้ดูแลระบบ, 2FA และความปลอดภัยในการเข้าสู่ระบบ, เซสชันของผู้ดูแลระบบ และ admin API tokens - สร้าง, แสดงรายการ หรือเพิกถอนคีย์ของผู้ดูแลระบบ, การเชื่อมต่อ OAuth และบัญชี AI หรือใช้งาน AI Console - สำรองข้อมูลหรือกู้คืนพาเนล, อัปเดต หรือเปลี่ยนไลเซนส์ - เข้าสู่ระบบในฐานะลูกค้าหรือผู้แทนจำหน่าย, เปิดคอนโซลของลูกค้า, อ่านข้อมูลรับรอง VM หรือ kubeconfig, ตั้งค่า SSH keys, หรือส่งหรือรีเซ็ตรหัสผ่าน - เปลี่ยนโมดูลเครือข่ายและการกำหนดเส้นทาง (BGP, FRR, RTBH, XDP, อินเทอร์เฟซ, เส้นทางแบบคงที่และนโยบาย, NAT) หรือเอเจนต์ภายนอกและการรวมพอร์ทัล ซึ่งเป็นแบบอ่านอย่างเดียว - เปลี่ยนการตั้งค่าเช่น `demo_*`, `admin_*`, รายชื่อโฮสต์, passkey, การยืนยันตัวตนซ้ำ และความลับของ captcha สิ่งใดก็ตามที่ไม่ได้ครอบคลุมโดยกฎจะถูกปิดกั้นสำหรับการเขียนโดยค่าเริ่มต้น และอ่านได้ด้วย `admin:read` สำหรับการอ่าน ### การดำเนินการที่ต้องได้รับการยืนยันจากคุณ {#actions-that-need-your-confirmation} การดำเนินการเหล่านี้จะสำเร็จก็ต่อเมื่อคุณอนุมัติการแสดงตัวอย่างแล้วเท่านั้น (ดู [Two-step confirmation](#two-step-confirmation)): - การเปลี่ยนยอดเงินของลูกค้าหรือวอลเล็ตของผู้แทนจำหน่าย, การจ่ายเงิน, บันทึกการเรียกเก็บเงิน และอัตราแลกเปลี่ยน - การเปลี่ยนราคา (ราคาแพลน, การสร้างแพลนจำนวนมาก, ราคาภาพและพื้นที่เก็บข้อมูล) และการสร้างส่วนลดหรือโค้ดเงิน - การบันทึกข้อมูลรับรองเกตเวย์การชำระเงินหรือการเชื่อมต่อ CloudStack - การลบสิ่งใดก็ตาม, ระงับหรือลบลูกค้า, เปลี่ยนขีดจำกัดของลูกค้า, ระงับหรือปิดผู้แทนจำหน่าย - การดำเนินการบนเซิร์ฟเวอร์ของลูกค้า หรือการสร้างเซิร์ฟเวอร์แบบชำระเงินให้แก่ลูกค้า - การเปลี่ยนแปลงสวิตช์ทั่วทั้งไซต์, การตั้งค่าความปลอดภัยในการเข้าสู่ระบบ หรือการตั้งค่าการชำระเงินผ่านการตั้งค่าทั่วไป ## การยืนยันแบบสองขั้นตอน {#two-step-confirmation} เมื่อการเรียกใช้งานต้องการการยืนยัน จะยังไม่มีการเปลี่ยนแปลงใดๆ เกิดขึ้น ผลลัพธ์คือ HTTP **428** พร้อมด้วย `confirm_required`, `confirm_token`, `preview` (เมธอด, พาธ, เหตุผล, ค่าใหม่ และค่าปัจจุบันเมื่อมีข้อมูล) และ `expires_in: 300` 1. ไคลเอนต์จะแสดงตัวอย่างให้คุณเห็น 2. หลังจากที่คุณอนุมัติแล้ว ระบบจะทำคำขอ **เดิม** ซ้ำ (เมธอด, พาธ และเนื้อหาเดิม) พร้อมกับส่วนหัว `X-Confirm-Token: ` เครื่องมือ MCP จะใช้าร์กิวเมนต์ `confirm_token` แทน 3. โทเค็นนี้ใช้งานได้หนึ่งครั้งและจะหมดอายุหลังจาก 5 นาที คีย์ที่สร้างขึ้นภายในผู้ดูแลระบบสำหรับ AI Chat สามารถยืนยันได้บนหน้าจอเท่านั้น: ผลลัพธ์จะระบุว่า `confirm_in: "ui"` และการ์ดยืนยันจะปรากฏขึ้นในหน้าผู้ดูแลระบบ AI ไม่สามารถอนุมัติได้ ## ขีดจำกัดอัตราและกฎ IP {#rate-limit-and-ip-rules} - หากเกินขีดจำกัดต่อนาที การเรียกใช้งานจะส่งคืน `rate_limited` (HTTP 429) พร้อมกับ `Retry-After: 60` - หากมีการตั้งค่าช่วง IP การเรียกใช้งานจากที่อยู่ IP อื่นจะส่งคืน `ip_not_allowed` (HTTP 403) ## บันทึกกิจกรรม {#activity-log} แท็บ **Activity** จะแสดงรายการการเรียกใช้งานทั้งหมดที่ใช้คีย์ โดยเรียงจากล่าสุดไปเก่าสุด ได้แก่ เวลา คีย์ ไคลเอนต์ วิธีการส่งคำขอ (`http`, `mcp`, `chat`, `cli`, `confirm`, `preview`) เมธอดและพาธ เครื่องมือ สถานะ HTTP IP และรายละเอียด (แบบซ่อนข้อมูล) คุณสามารถค้นหาตามพาธ เครื่องมือ หรือชื่อคีย์ แสดงเฉพาะข้อผิดพลาด (HTTP 400 ขึ้นไป) หรือเฉพาะการเรียกใช้งานที่รอการยืนยัน (428 ขึ้นไป) และจำกัดช่วงเวลาเป็น 1 ชั่วโมงล่าสุด 24 ชั่วโมง หรือ 7 วันที่ผ่านมา NexCMP จะเก็บบันทึกลงรายการ 200,000 รายการล่าสุด การเปลี่ยนแปลงที่ทำผ่านคีย์จะปรากฏใน Logs › Admin actions ภายใต้ชื่อ `ak:/` ด้วยเช่นกัน ![แท็บ Activity แสดงรายการการเรียกใช้งานพร้อมสถานะ ไคลเอนต์ เครื่องมือ และ IP](https://nexcmp.com/th/docs/images/configure-with-ai/admin-api-keys-03-activity.webp) ## ตรวจสอบ {#verify} ทดสอบคีย์แบบอ่านอย่างเดียวจากเครื่องใดก็ได้ที่อยู่ในช่วง IP: ```bash curl -s https://cloud.example.com/v1/admin/agent/tools \ -H "Authorization: Bearer ak_XXXX" ``` คุณจะได้รับรายการ JSON ของเครื่องมือที่สโคปของคุณอนุญาต ลองรันดูสักหนึ่งรายการ: ```bash curl -s -X POST https://cloud.example.com/v1/admin/agent/tools/system_health \ -H "Authorization: Bearer ak_XXXX" \ -H "Content-Type: application/json" -d '{}' ``` เวลา **Last used** ของคีย์จะถูกอัปเดต และการเรียกใช้งานจะปรากฏใน **Activity** รายการเครื่องมือทั้งหมดและคำอธิบาย OpenAPI (`/v1/admin/openapi.json`) อธิบายไว้ใน [Connect an AI client](https://nexcmp.com/th/docs/configure-with-ai/mcp-admin/) ## ข้อผิดพลาด {#errors} ข้อผิดพลาดจะอยู่ในรูปแบบ JSON: `{"error": {"code": "...", "message": "..."}}` | HTTP | `code` | ความหมาย | วิธีแก้ปัญหา | |---|---|---|---| | 401 | `invalid_key` | คีย์หายไป จัดรูปแบบไม่ถูกต้อง หรือไม่รู้จัก นอกจากนี้ยังแสดงผลเมื่อใช้คีย์ `ak_` กับพาธที่ไม่ใช่ของผู้ดูแลระบบ | ตรวจสอบคีย์ และใช้งานบน `/v1/admin/` และ `/mcp/admin` เท่านั้น | | 401 | `key_expired` | คีย์หมดอายุแล้ว | สร้างคีย์ใหม่. | | 401 | `key_revoked` | คีย์ถูกเพิกถอนแล้ว | สร้างคีย์ใหม่. | | 403 | `ip_not_allowed` | IP ของผู้เรียกใช้งานอยู่นอกช่วง IP ของคีย์ | โทรจาก IP ที่ได้รับอนุญาต หรือสร้างคีย์ด้วยช่วง IP ที่ถูกต้อง | | 403 | `local_only_key` | คีย์ที่สร้างสำหรับ AI Chat หรือ CLI ของเซิร์ฟเวอร์ถูกใช้งานจากเครื่องอื่น | คีย์เหล่านี้ใช้งานได้บนเซิร์ฟเวอร์แผงควบคุมเท่านั้น | | 403 | `insufficient_scope` | คีย์ไม่มีสโคป คำตอบประกอบด้วย `required_scope` | สร้างคีย์ที่มีสโคปดังกล่าว | | 403 | `forbidden_for_keys` | ปลายทางหรือการตั้งค่าที่คุณพยายามเปลี่ยนแปลงถูกปิดกั้นไม่ให้ใช้คีย์ | ดำเนินการดังกล่าวในหน้าผู้ดูแลระบบ | | 403 | `demo_read_only` | แผงควบคุมอยู่ในโหมดทดลองใช้และมีการเรียกใช้งานที่เขียนข้อมูล | ใช้งานแผงควบคุมที่ไม่ได้อยู่ในโหมดทดลองใช้ | | 403 | `confirm_in_ui` | การกระทำนี้ต้องได้รับการยืนยันบนหน้าจอในระบบผู้ดูแลระบบ | อนุมัติการ์ดยืนยัน | | 428 | `confirm_required` | ตัวอย่างพร้อมใช้งานแล้ว ไม่มีอะไรเปลี่ยนแปลง รวมอยู่ด้วย `confirm_token` | แสดงตัวอย่าง จากนั้นทำซ้ำด้วย `X-Confirm-Token` | | 409 | `confirm_expired` | โทเค็นมีอายุมากกว่า 5 นาที | ส่งคำขออีกครั้งเพื่อรับตัวอย่างใหม่ | | 409 | `confirm_mismatch` | โทเค็นเป็นของคำขออื่น (เมธอด พาธ หรือเนื้อหาคำขอแตกต่างกัน) | ทำซ้ำคำขอเดิมอย่างแน่นอน | | 409 | `confirm_invalid` | โทเค็นไม่รู้จักหรือถูกใช้งานไปแล้ว | ส่งคำขออีกครั้งเพื่อรับตัวอย่างใหม่ | | 429 | `rate_limited` | มีการเรียกใช้งานมากเกินไปในนาทีนี้ | รอ `Retry-After` | | 400 | `invalid_path` | พาธมีลำดับอักขระต้องห้าม | ใช้พาธแบบปกติ | | 413 | `too_large` | เนื้อหาคำหมีขนาดใหญ่เกิน 10 MB | ส่งข้อมูลให้น้อยลง | | 400 | `invalid_argument` | อาร์กิวเมนต์ของเครื่องมือขาดหายไป ไม่รู้จัก หรือมีประเภทที่ไม่ถูกต้อง ข้อความจะระบุชื่ออาร์กิวเมนต์ดังกล่าว | แก้ไขอาร์กิวเมนต์ | ## ขีดจำกัดและหมายเหตุ {#limits-notes} - กำหนดให้คีย์มีอายุการใช้งานสั้นและมีสิทธิ์จำกัดแคบที่สุด ควรใช้หนึ่งคีย์ต่อหนึ่งไคลเอนต์เพื่อให้คุณสามารถเพิกถอนเฉพาะคีย์นั้นได้ - คีย์มีความสามารถตามสโคปของมัน `secrets:write` ร่วมกับ `billing:write` คือชุดค่าผสมที่มีความละเอียดอ่อนที่สุด การกระทำเกี่ยวกับเงินจะยังคงหยุดอยู่ที่ขั้นตอนตัวอย่าง - คีย์ที่สร้างขึ้นโดยอัตโนมัติ (สำหรับ AI Chat และ CLI ของเซิร์ฟเวอร์) จะมีอายุใช้งานเพียงไม่กี่นาทีและทำงานจากเซิร์ฟเวอร์แผงควบคุมเท่านั้น - หากต้องการตัดการเชื่อมต่อไคลเอนต์ AI ทันที ให้เพิกถอนคีย์ของไคลเอนต์นั้น การเชื่อมต่อ OAuth สามารถเพิกถอนได้ที่แท็บ **Connected apps** ([OAuth connectors](https://nexcmp.com/th/docs/configure-with-ai/oauth-connectors/)) --- # เชื่อมต่อ AI client (MCP) {#connect-an-ai-client-mcp} > **ตำแหน่งในแอดมิน:** System › Settings › API & AI agents (`/agent/keys`), แท็บ **Connect an AI** แสดง URL เอ็นด์พอยต์และสนิปเพ็ตพร้อมคัดลอกสำหรับแต่ละไคลเอนต์ ซึ่งใส่คีย์ที่คุณเพิ่งสร้างไว้ ## What it does {#what-it-does} **Model Context Protocol (MCP)** ช่วยให้ AI client สามารถเรียกใช้เครื่องมือต่างๆ ได้ พาเนลของคุณทำหน้าที่เป็นแอดมิน MCP เซิร์ฟเวอร์ที่ `https://cloud.example.com/mcp/admin` เชื่อมต่อเครื่องมือ AI ของคุณเองแล้วถามด้วยภาษาธรรมชาติ: "what is left to set up?", "add my Proxmox cluster", "create plans with a 40% margin" ไคลเอนต์จะเรียกใช้เครื่องมือแอดมินด้านล่าง พาเนลจะตรวจสอบสิทธิ์ขอบเขต สอบถามคุณก่อนดำเนินการที่มีความเสี่ยง และบันทึกทุกการเรียกใช้ ::: info MCP เอ็นด์พอยต์สองชุด `/mcp` คือเอ็นด์พอยต์ฝั่ง **ลูกค้า** (คีย์ API ลูกค้า, `vk_`; ดู [MCP server](https://nexcmp.com/th/docs/developers/mcp/)) ส่วน `/mcp/admin` คือเอ็นด์พอยต์ฝั่ง **แอดมิน** ที่อธิบายไว้ที่นี่ (คีย์แอดมิน `ak_` หรือ OAuth) ทั้งสองส่วนนี้จะไม่ปะปนกัน: เครื่องมือแอดมินจะไม่แสดงบน `/mcp` และ `/mcp/admin` จะยอมรับเฉพาะคีย์แอดมินเท่านั้น ::: ## ข้อกำหนด {#requirements} | Item | Requirement | |---|---| | Endpoint | `https://cloud.example.com/mcp/admin` บนโดเมนของพาเนลคุณเอง คัดลอก URL แบบเต็มจากแท็บ **Connect an AI** หน้าเดียวกันนี้จะแสดง URL ท้องถิ่น (`http://127.0.0.1:/mcp/admin`) สำหรับเครื่องมือที่รันบนเซิร์ฟเวอร์เอง | | ข้อมูลประจำตัว | [admin API key](https://nexcmp.com/th/docs/configure-with-ai/admin-api-keys/) (`ak_...`) ที่มีสิทธิ์ขอบเขตที่คุณต้องการ **หรือ** เข้าสู่ระบบผ่าน OAuth สำหรับเว็บคอนเนกเตอร์ ([OAuth connectors](https://nexcmp.com/th/docs/configure-with-ai/oauth-connectors/)) | | ไคลเอนต์ | MCP client ใดๆ ที่รองรับการรับส่งข้อมูลแบบ **Streamable HTTP** และเฮดเดอร์ `Authorization` แบบกำหนดเอง รองรับโปรโตคอลเวอร์ชัน 2025-11-25, 2025-06-18 และ 2025-03-26 | | Network | หากคุณใช้รีเวอร์สพร็อกซี่ของคุณเองหน้าพาเนล รีเวอร์สพร็อกซี่นั้นจะต้องส่งต่อ `/mcp/admin` เว็บคอนเนกเตอร์ (claude.ai, ChatGPT) จะเชื่อมต่อมาจากเซิร์ฟเวอร์ของผู้ให้บริการ ดังนั้น URL จึงต้องเข้าถึงได้จากอินเทอร์เน็ต | ## เตรียมโครงสร้างพื้นฐาน {#prepare-the-infrastructure} ไม่ต้องติดตั้งสิ่งใดบนเซิร์ฟเวอร์ หากคุณจำกัดคีย์ด้วย IP โปรดตรวจสอบว่าไอพีที่ไคลเอนต์ของคุณเชื่อมต่อมานั้นอยู่ในช่วงดังกล่าว ทดสอบการเข้าถึงก่อน: ```bash curl -i -X POST https://cloud.example.com/mcp/admin ``` การตอบกลับด้วย `401` พร้อมเฮดเดอร์ `WWW-Authenticate: Bearer ... resource_metadata=...` หมายความว่าเอ็นด์พอยต์ทำงานอยู่และต้องการข้อมูลรับรอง ## เชื่อมต่อใน NexCMP {#connect-in-nexcmp} 1. สร้างคีย์: **System › Settings › API & AI agents › API keys › New key** สำหรับการใช้งานครั้งแรก ให้ใช้ `admin:read` เท่านั้น แล้วค่อยเพิ่มสิทธิ์การเขียนเมื่อจำเป็น ดูเพิ่มเติมที่ [Admin API keys](https://nexcmp.com/th/docs/configure-with-ai/admin-api-keys/) 2. เปิดแท็บ **Connect an AI** ในขณะที่หน้าต่าง "key created" ยังใช้งานอยู่ สนิปเพ็ตทั้งหมดด้านล่างจะมีคีย์จริงของคุณอยู่แล้ว มิฉะนั้นจะแสดงตัวยึดตำแหน่ง `ak_YOUR_KEY` แทน 3. คัดลอกสนิปเพ็ตสำหรับไคลเอนต์ของคุณ แล้วรันหรือวางตามขั้นตอนถัดไป ![แท็บ Connect an AI พร้อม URL ของ MCP และการ์ดที่มีปุ่มคัดลอกสำหรับแต่ละไคลเอนต์](https://nexcmp.com/th/docs/images/configure-with-ai/mcp-admin-01-connect.webp) ### Claude Code {#claude-code} ```bash claude mcp add --transport http nexcmp https://cloud.example.com/mcp/admin \ --header "Authorization: Bearer ak_XXXX" ``` จากนั้นเริ่ม `claude` และถามว่า "list the tools from nexcmp" หรือ "what is left to set up?" ตรวจสอบเมื่อ 30/10/2026 ด้วย Claude Code 2.1: `claude mcp add --transport http …` เขียนเซิร์ฟเวอร์ (เพิ่ม `-s project` เพื่อเก็บบันทึกไว้ใน `.mcp.json` ของโปรเจกต์ — Claude Code จะขอให้คุณอนุมัติเซิร์ฟเวอร์โปรเจกต์ในครั้งแรก) สำหรับสคริปต์ `claude -p "…" --mcp-config .mcp.json --strict-mcp-config --allowedTools "mcp__nexcmp__*"` สามารถรันได้โดยไม่ต้องมีข้อความขออนุมัติและอนุญาตให้ Claude ใช้เฉพาะเครื่องมือของพาเนลเท่านั้น ### Claude Desktop {#claude-desktop} ต้องใช้ Node.js 18 ขึ้นไป เพิ่มข้อมูลนี้ลงใน `claude_desktop_config.json` (ใช้บริดจ์ `mcp-remote`) แล้วรีสตาร์ท Claude Desktop: ```json { "mcpServers": { "nexcmp": { "command": "npx", "args": ["-y", "mcp-remote", "https://cloud.example.com/mcp/admin", "--header", "Authorization:Bearer ak_XXXX"] } } } ``` หากระบบของคุณจัดการช่องว่างในอาร์กิวเมนต์ของเฮดเดอร์ไม่ถูกต้อง ให้ใส่ค่าทั้งหมดลงในตัวแปรสภาพแวดล้อมแทน เช่นเดียวกับเอ็นด์พอยต์ลูกค้า: `"args": [..., "--header", "Authorization:${NEXCMP_AUTH_HEADER}"]` พร้อม `"env": { "NEXCMP_AUTH_HEADER": "Bearer ak_XXXX" }` ### claude.ai (custom connector) {#claude-ai-custom-connector} ไม่ต้องใช้คีย์: เข้าสู่ระบบด้วย OAuth ใน claude.ai ให้เปิดการตั้งค่าคอนเนกเตอร์ เพิ่ม custom connector วาง `https://cloud.example.com/mcp/admin` จากนั้นเข้าสู่ระบบด้วยบัญชีแอดมิน NexCMP ของคุณและเลือกสิทธิ์บนหน้าจอขอความยินยอม รายละเอียด: [OAuth connectors](https://nexcmp.com/th/docs/configure-with-ai/oauth-connectors/) ### ChatGPT (developer mode) {#chatgpt-developer-mode} ไม่ต้องใช้คีย์ ใน ChatGPT ให้เปิดโหมดนักพัฒนาซอฟต์แวร์ เพิ่ม MCP คอนเนกเตอร์ด้วย URL `https://cloud.example.com/mcp/admin` เลือก OAuth และเข้าสู่ระบบด้วยบัญชีแอดมิน NexCMP ของคุณ รายละเอียด: [OAuth connectors](https://nexcmp.com/th/docs/configure-with-ai/oauth-connectors/) ### Codex CLI {#codex-cli} เพิ่มลงใน `~/.codex/config.toml`: ```toml [mcp_servers.nexcmp] url = "https://cloud.example.com/mcp/admin" bearer_token_env_var = "NEXCMP_KEY" ``` จากนั้นส่งออกคีย์ในเชลล์ที่เริ่ม Codex: ```bash export NEXCMP_KEY=ak_XXXX codex codex mcp list # shows nexcmp with "Bearer token" auth ``` ::: tip โหมดไม่โต้ตอบ `codex exec` ใน `codex exec` (สคริปต์, CI) Codex จะไม่ถามก่อนเรียกใช้เครื่องมือ และจะข้ามเครื่องมือที่เปลี่ยนแปลงข้อมูล เพิ่ม `default_tools_approval_mode = "approve"` ใต้ `[mcp_servers.nexcmp]` เพื่ออนุญาตให้เรียกใช้เครื่องมือเหล่านั้น แผงควบคุมยังคงแสดงตัวอย่างและขอการยืนยันสำหรับการดำเนินการด้านเงิน ความปลอดภัย และการลบ ตรวจสอบแล้วด้วย Codex CLI 0.166 เมื่อ 30/10/2026 ::: ### Gemini CLI {#gemini-cli} เพิ่มลงใน `~/.gemini/settings.json`: ```json { "mcpServers": { "nexcmp": { "httpUrl": "https://cloud.example.com/mcp/admin", "headers": { "Authorization": "Bearer ak_XXXX" } } } } ``` Gemini CLI จะปิดการใช้งานเซิร์ฟเวอร์ MCP ในโฟลเดอร์ที่ไม่เชื่อถือ เริ่มต้นในโฟลเดอร์ที่คุณเชื่อถือ (หรือเชื่อถือโฟลเดอร์เมื่อมี prompt ถาม) จากนั้นตรวจสอบด้วย `gemini mcp list` — ระบบจะแสดง `nexcmp … Connected` คุณสามารถเก็บคีย์ไว้นอกไฟล์ได้โดยใช้ `"Authorization": "Bearer $NEXCMP_KEY"` ตรวจสอบแล้วด้วย Gemini CLI 0.66 เมื่อ 30/10/2026 ### Cursor {#cursor} เพิ่มลงใน `~/.cursor/mcp.json` (หรือ `.cursor/mcp.json` ในโปรเจกต์): ```json { "mcpServers": { "nexcmp": { "url": "https://cloud.example.com/mcp/admin", "headers": { "Authorization": "Bearer ak_XXXX" } } } } ``` ::: tip เก็บคีย์ไว้นอกไฟล์กำหนดค่า ในกรณีที่ไคลเอนต์รองรับ ให้่อ่านคีย์จากตัวแปรสภาพแวดล้อมแทนการเขียนลงในไฟล์โดยตรง โดย Codex รองรับวิธีนี้เป็นค่าเริ่มต้น (`bearer_token_env_var`) และ Cursor รองรับ `"Bearer ${env:NEXCMP_KEY}"` ห้ามคอมมิตไฟล์ที่มีคีย์เก็บไว้เด็ดขาด ::: ### OpenAI Agents SDK (Python) {#openai-agents-sdk-python} ```python from agents.mcp import MCPServerStreamableHttp nexcmp = MCPServerStreamableHttp( params={"url": "https://cloud.example.com/mcp/admin", "headers": {"Authorization": "Bearer ak_XXXX"}}, name="nexcmp", ) ``` การทำงานที่สมบูรณ์ (ตรวจสอบแล้วด้วย `openai-agents` 0.24 เมื่อ 30/10/2026 — เครื่องมืออ่าน จากนั้นการเปลี่ยนแปลงยอดเงินที่ส่งคืนตัวอย่างการยืนยันและถูกนำไปใช้ในการเรียกครั้งที่สองด้วย `confirm_token`): ```python import asyncio from agents import Agent, Runner from agents.mcp import MCPServerStreamableHttp async def main(): async with MCPServerStreamableHttp(params={"url": "https://cloud.example.com/mcp/admin", "headers": {"Authorization": "Bearer ak_XXXX"}}, name="nexcmp") as nexcmp: agent = Agent(name="admin", model="gpt-5", mcp_servers=[nexcmp], instructions="You operate a hosting panel through the nexcmp tools. Ask me before confirming money actions.") result = await Runner.run(agent, "Run system_health and summarise it in one line.") print(result.final_output) asyncio.run(main()) ``` ### OpenAI Responses API {#openai-responses-api} ส่งเซิร์ฟเวอร์เป็นเครื่องมือประเภท `mcp` คง `require_approval` ไว้ที่ `always` เพื่อให้โปรแกรมของคุณถามคุณก่อนการเรียกใช้แต่ละครั้ง: ```json { "type": "mcp", "server_label": "nexcmp", "server_url": "https://cloud.example.com/mcp/admin", "headers": { "Authorization": "Bearer ak_XXXX" }, "require_approval": "always" } ``` ### อื่นๆ (HTTP ทั่วไป) {#anything-else-plain-http} ไคลเอนต์ที่ไม่มี MCP สามารถเรียกใช้เครื่องมือเดียวกันผ่าน HTTP ได้ โดย `GET /v1/admin/agent/tools` ใช้แสดงรายการเครื่องมือ, `POST /v1/admin/agent/tools/` ใช้เรียกใช้เครื่องมือด้วยเนื้อหา JSON ของอาร์กิวเมนต์ และ `GET /v1/admin/openapi.json` จะส่งคืนคำอธิบาย OpenAPI 3.1 (เครื่องมือละหนึ่งการทำงาน) ทั้งหมดต้องใช้ `Authorization: Bearer ak_...` ## ตรวจสอบ {#verify} 1. หากไม่มีไคลเอนต์ ให้แสดงรายการเครื่องมือ: ```bash curl -s https://cloud.example.com/mcp/admin \ -H "Authorization: Bearer ak_XXXX" \ -H "Content-Type: application/json" \ -H "Accept: application/json, text/event-stream" \ -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}' ``` คำตอบคือผลลัพธ์ JSON-RPC พร้อมเครื่องมือที่ขอบเขต (scopes) ของคุณอนุญาต 2. ในไคลเอนต์ของคุณ ให้พิมพ์คำว่า "run system_health" ซึ่งจะแสดงการแจ้งเตือน, สถานะสุขภาพของโครงสร้างพื้นฐานที่เชื่อมต่อ, การชำระเงิน, อีเมล, AI และสถานะไลเซนส์ 3. เปิด **API & AI agents › Activity**: การเรียกใช้จะแสดงรายการพร้อมชื่อไคลเอนต์และ `mcp` 4. บนเซิร์ฟเวอร์ `sudo nexcmp status` จะพิมพ์บรรทัด "MCP admin" ซึ่งระบุว่า `ready` เมื่อเอ็นด์พอยต์ตอบกลับ (HTTP 401 โดยไม่มีคีย์ถือเป็นสถานะปกติ) ## เครื่องมือ {#tools} เซิร์ฟเวอร์มีเครื่องมือให้บริการ 58 รายการ ไคลเอนต์จะมองเห็นเฉพาะเครื่องมือที่ขอบเขตของคีย์อนุญาตเท่านั้น: เครื่องมืออ่านต้องใช้ `admin:read` ส่วนเครื่องมือเขียนต้องใช้ขอบเขตของตนเอง นอกจากนี้ เครื่องมือเขียนยังมีอาร์กิวเมนต์เสริม `confirm_token` (ดู [Confirmation](#confirmation-confirm-token)) อาร์กิวเมนต์จะถูกตรวจสอบกับสีมาของแต่ละเครื่องมือ: อาร์กิวเมนต์ที่ไม่รู้จักหรือพิมพ์ผิดจะถูกปฏิเสธพร้อมข้อความระบุชื่ออาร์กิวเมนต์นั้น ราคาแสดงเป็น USD: ราคาแพ็กเกจเป็นดอลลาร์ต่อชั่วโมง (`hourly_usd`), ยอดเงินคงเหลือเป็นเซนต์ สามารถตั้งค่าข้อมูลลับได้แต่จะไม่ถูกส่งคืนกลับมา ### ภาพรวมและบันทึก {#overview-and-logs} | เครื่องมือ | What it does | Scope | เปลี่ยนแปลงข้อมูล | ถามคุณ | |---|---|---|---|---| | `system_health` | การแจ้งเตือนที่ต้องสนใจ, สถานะสุขภาพของโครงสร้างพื้นฐาน, การชำระเงิน, อีเมล, AI, ไลเซนส์ และสถานะการอัปเดต | `admin:read` | ไม่ | ไม่ | | `setup_checklist` | สิ่งที่กำหนดค่าไว้และสิ่งที่เหลืออยู่: ไลเซนส์, โครงสร้างพื้นฐาน, โซน, เทมเพลต OS, แพ็กเกจ, การชำระเงิน, อีเมล, การสร้างแบรนด์, ข้อกำหนดทางกฎหมาย, คำสั่งซื้อทดสอบ | `admin:read` | ไม่ | ไม่ | | `license_status` | สถานะไลเซนส์และระบุว่ามี NexCMP เวอร์ชันใหม่กว่าหรือไม่ | `admin:read` | ไม่ | ไม่ | | `audit_search` | ค้นหาบันทึกการตรวจสอบของผู้ดูแลระบบและบันทึกคีย์ API | `admin:read` | ไม่ | ไม่ | ### การตั้งค่า, การสร้างแบรนด์, ข้อกำหนดทางกฎหมาย, โมดูล {#settings-branding-legal-modules} | เครื่องมือ | What it does | Scope | เปลี่ยนแปลงข้อมูล | ถามคุณ | |---|---|---|---|---| | `settings_get` | อ่านการตั้งค่าทั่วไป (`keys` ตัวกรอง; อักขระ `*` ต่อท้ายจะจับคู่คำนำหน้า) | `admin:read` | ไม่ | ไม่ | | `settings_update` | เปลี่ยนการตั้งค่าทั่วไปจากออบเจ็กต์ `values` แบบแบน ยอมรับเฉพาะคีย์ที่ระบุโดย `settings_get` เท่านั้น | `settings:write` | ใช่ | เมื่อคีย์เกี่ยวข้องกับการชำระเงิน, ความปลอดภัยในการเข้าสู่ระบบ, สวิตช์ทั่วทั้งไซต์ หรือราคา | | `branding_get` | ชื่อแบรนด์, สี,สกุลเงินที่แสดง, ชื่อผู้ขาย, โลโก้ และ URL ของ favicon | `admin:read` | ไม่ | ไม่ | | `branding_update` | ตั้งค่าชื่อแบรนด์ (สูงสุด 60 ตัวอักษร), สี (`#rrggbb`),สกุลเงินที่แสดง (`usd` หรือ `vnd`) และชื่อผู้ขาย | `settings:write` | ใช่ | ไม่ | | `branding_logo_set` | อัปโหลดโลโก้แบบสว่างหรือมืด หรือฟาฟิคอนจาก HTTPS URL หรือ base64 (PNG, JPEG, WEBP, ICO หรือ SVG สูงสุด 512 KB) | `settings:write` | ใช่ | ไม่ | | `legal_get` | เงื่อนไขการให้บริการและนโยบายความเป็นส่วนตัว (ภาษาอังกฤษและภาษาเวียดนาม) รวมถึงค่าเริ่มต้นที่เป็นกลาง | `admin:read` | ไม่ | ไม่ | | `legal_update` | กำหนดข้อความเงื่อนไขและนโยบายความเป็นส่วนตัว (Markdown อย่างง่าย ไม่มี HTML อย่างละไม่เกิน 50 KB) ค่าว่างจะคืนค่าเริ่มต้น | `settings:write` | ใช่ | ไม่ | | `modules_get` | โมดูลเสริมใดที่เปิดใช้งานอยู่และโมดูลใดที่สามารถสลับได้ | `admin:read` | ไม่ | ไม่ | | `module_set` | เปิดหรือปิดโมดูลเสริม (`key` ต้องเป็นหนึ่งใน `settable`) | `settings:write` | ใช่ | ไม่ | ### อีเมลและการแจ้งเตือน {#email-and-alerts} | เครื่องมือ | What it does | Scope | เปลี่ยนแปลงข้อมูล | ถามคุณ | |---|---|---|---|---| | `smtp_get` | การตั้งค่าอีเมลขาออก (ซ่อนรหัสผ่านไว้) และสถานะคิว | `admin:read` | ไม่ | ไม่ | | `smtp_configure` | ตั้งค่าเซิร์ฟเวอร์ SMTP การเปลี่ยนโฮสต์ พอร์ต หรือความปลอดภัยจะต้องใส่รหัสผ่านใหม่อีกครั้ง | `settings:write` (+ `secrets:write` สำหรับรหัสผ่าน) | ใช่ | ไม่ | | `smtp_test` | ส่งอีเมลทดสอบจริงด้วยการตั้งค่าที่บันทึกไว้ | `settings:write` | ส่งอีเมล | ไม่ | | `telegram_get` | ช่องทางการแจ้งเตือนของผู้ดูแลระบบ (รหัสแชท ส่วนโทเค็นบอทจะไม่แสดงกลับมา) | `admin:read` | ไม่ | ไม่ | | `telegram_configure` | เพิ่มหรืออัปเดตช่องทางการแจ้งเตือนผ่าน Telegram (โทเค็นบอทและรหัสแชท) และเปิดหรือปิดการแจ้งเตือนของผู้ดูแลระบบ | `settings:write` (+ `secrets:write` สำหรับโทเค็น) | ใช่ | ไม่ | | `telegram_test` | ส่งข้อความทดสอบไปยังช่องทาง Telegram | `settings:write` | ส่งข้อความ | ไม่ | ### การชำระเงินและสกุลเงิน {#payments-and-currency} | เครื่องมือ | What it does | Scope | เปลี่ยนแปลงข้อมูล | ถามคุณ | |---|---|---|---|---| | `payments_get` | สถานะของ Stripe, PayPal, คริปโต (USDT) และการโอนเงินผ่านธนาคาร พร้อมทั้งช่องทางและค่าธรรมเนียมที่เปิดใช้งาน | `admin:read` | ไม่ | ไม่ | | `payment_configure` | ตั้งค่าข้อมูลรับรองของเกตเวย์หนึ่งรายการ (`stripe`, `paypal`, `crypto` หรือ `bank`) | `billing:write` (+ `secrets:write`) | ใช่ | เสมอ | | `payment_test` | ตรวจสอบข้อมูลรับรองที่บันทึกไว้ของเกตเวย์กับผู้ให้บริการ | `billing:write` | ไม่ | ไม่ | | `currency_get` | สกุลเงินที่แสดงและอัตราแลกเปลี่ยน USD เป็น VND (แบบอัตโนมัติหรือกำหนดเอง) | `admin:read` | ไม่ | ไม่ | | `currency_set` | กำหนดสกุลเงินที่แสดงและ/หรืออัตราแลกเปลี่ยนแบบกำหนดเอง (0 หมายถึงอัตโนมัติ นอกเหนือจากนั้นคือ 15000 ถึง 50000) | `billing:write` | ใช่ | เมื่อคุณเปลี่ยนอัตราแลกเปลี่ยนแบบกำหนดเอง | ### โครงสร้างพื้นฐานและโซน {#infrastructure-and-zones} | เครื่องมือ | What it does | Scope | เปลี่ยนแปลงข้อมูล | ถามคุณ | |---|---|---|---|---| | `cloudstack_get` | Endpoint ของ CloudStack รวมถึงรหัสโซนและเครือข่ายที่บันทึกไว้ (ซ่อนคีย์ไว้) | `admin:read` | ไม่ | ไม่ | | `cloudstack_test` | ทดสอบ Endpoint ด้วย API key และ secret โดยไม่ต้องบันทึก ระบบจะแสดงรายการโซน | `infra:write` (+ `secrets:write` เนื่องจากคุณส่งคีย์เข้ามา) | ไม่ | ไม่ | | `cloudstack_connect` | บันทึกการเชื่อมต่อ CloudStack | `infra:write` (+ `secrets:write`) | ใช่ | เสมอ | | `proxmox_list` | คลัสเตอร์ Proxmox VE ที่เพิ่มเป็นแหล่งข้อมูล พร้อมสถานะความพร้อมใช้งาน | `admin:read` | ไม่ | ไม่ | | `proxmox_add` | เพิ่มคลัสเตอร์ Proxmox VE ด้วย API token (`user@realm!tokenid`) และ secret ของมัน | `infra:write` (+ `secrets:write`) | ใช่ | ไม่ | | `proxmox_test` | เชื่อมต่อกับคลัสเตอร์ตามรหัส การเชื่อมต่อที่สำเร็จครั้งแรกจะตรึงใบรับรอง TLS ไว้ | `infra:write` | ใช่ | ไม่ | | `proxmox_attach_zone` | ขายคลัสเตอร์ Proxmox ในโซนที่มีอยู่ โดยเลือกโหนดเป็นภูมิภาคได้ | `infra:write` | ใช่ | ไม่ | | `zones_list` | โซน (สถานที่) ที่ลูกค้าสามารถเลือกได้ | `admin:read` | ไม่ | ไม่ | | `zone_create` | สร้างโซน | `infra:write` | ใช่ | ไม่ | ### แคตตาล็อกและแพ็กเกจ {#catalog-and-plans} | เครื่องมือ | What it does | Scope | เปลี่ยนแปลงข้อมูล | ถามคุณ | |---|---|---|---|---| | `templates_list` | เทมเพลต OS ที่ลูกค้าสามารถติดตั้งได้ | `admin:read` | ไม่ | ไม่ | | `templates_sync` | นำเข้าเทมเพลต OS จาก CloudStack | `catalog:write` | ใช่ | ไม่ | | `template_update` | เปิดใช้งานหรือซ่อนเทมเพลต เปลี่ยนชื่อ ตั้งค่าผู้ใช้สำหรับเข้าสู่ระบบ หรือลำดับ | `catalog:write` | ใช่ | ไม่ | | `offerings_list` | Service offering ของ CloudStack (CPU, หน่วยความจำ, ดิสก์รูท) สำหรับใช้สร้างแพ็กเกจ | `admin:read` | ไม่ | ไม่ | | `plans_list` | แพ็กเกจพร้อมราคาต่อชั่วโมงและต่อเดือน ขนาด โซน และจำนวนเซิร์ฟเวอร์ที่ใช้งานอยู่ | `admin:read` | ไม่ | ไม่ | | `plan_create` | สร้างแพ็กเกจ กำหนดราคาในรูปแบบ `hourly_usd` แพ็กเกจ CloudStack ต้องใช้ `cs_offering_id` ส่วนแพ็กเกจ Proxmox ต้องใช้ `backend_id` | `catalog:write` | ใช่ | ไม่ | | `plan_update` | เปลี่ยนชื่อ แสดงหรือซ่อน เปิดหรือปิดใช้งาน หรือเปลี่ยนราคาแพ็กเกจ การเปลี่ยนแปลงขนาดบนแพ็กเกจที่กำลังใช้งานอยู่จำเป็นต้องคัดลอก | `catalog:write` | ใช่ | เมื่อราคาเปลี่ยนแปลง | | `plans_from_offerings` | สร้างตารางแพ็กเกจเริ่มต้นจาก offerings (หรือขนาดของ Proxmox) โดยใช้ต้นทุนและเปอร์เซ็นต์มาร์จินของคุณ ระบบจะแสดงตัวอย่าง เรียกใช้อีกครั้งด้วย `apply=true` เพื่อสร้างแพ็กเกจ | `catalog:write` | ด้วย `apply=true` | เสมอเมื่อปรับใช้ | | `quota_defaults_get` | ขีดจำกัดเริ่มต้นสำหรับลูกค้า | `admin:read` | ไม่ | ไม่ | | `quota_defaults_set` | เปลี่ยนการตั้งค่า `quota_*` | `catalog:write` | ใช่ | ไม่ | | `coupons_list` | ชุดโค้ดส่วนลดและโค้ดของขวัญ | `admin:read` | ไม่ | ไม่ | | `coupon_create` | สร้างชุดโค้ด: ประเภท `money` (มูลค่าหน้าบัตรเป็นหน่วยเซนต์ USD) หรือ `percent` (1 ถึง 100 พร้อมส่วนลดสูงสุด) | `catalog:write` | ใช่ | เสมอ | ### ลูกค้าและตัวแทนจำหน่าย {#customers-and-resellers} | เครื่องมือ | What it does | Scope | เปลี่ยนแปลงข้อมูล | ถามคุณ | |---|---|---|---|---| | `customers_search` | ค้นหาลูกค้าตามอีเมล ชื่อ หรือ IP | `admin:read` | ไม่ | ไม่ | | `customer_get` | บัญชี ยอดคงเหลือ เซิร์ฟเวอร์ และประวัติการเรียกเก็บเงินล่าสุดของลูกค้ารายหนึ่ง | `admin:read` | ไม่ | ไม่ | | `customer_adjust_balance` | เพิ่ม (ค่าบวก) หรือลด (ค่าลบ) เครดิตในหน่วยเซนต์ USD จำเป็นต้องระบุเหตุผล | `billing:write` | ใช่ | เสมอ | | `customer_block` | บล็อกลูกค้า และสามารถเลือกหยุดการทำงานของเซิร์ฟเวอร์ได้ จำเป็นต้องระบุเหตุผล | `customers:write` | ใช่ | เสมอ | | `customer_unblock` | ปลดบล็อกลูกค้า | `customers:write` | ใช่ | ไม่ | | `resellers_list` | ตัวแทนจำหน่ายพร้อมกระเป๋าเงินและสถานะ | `admin:read` | ไม่ | ไม่ | | `reseller_get` | เว็บไซต์ กระเป๋าเงิน ผู้ใช้งาน และเกตเวย์ของตัวแทนจำหน่ายรายหนึ่ง | `admin:read` | ไม่ | ไม่ | ### ผู้ให้บริการ AI {#ai-provider} | เครื่องมือ | What it does | Scope | เปลี่ยนแปลงข้อมูล | ถามคุณ | |---|---|---|---|---| | `ai_provider_get` | ผู้ให้บริการที่เข้ากันได้กับ OpenAI ซึ่งใช้งานโดย AI Chat และ AI Agent ของลูกค้า (มาสก์คีย์ไว้) | `admin:read` | ไม่ | ไม่ | | `ai_provider_set` | ตั้งค่าผู้ให้บริการ: base URL, model, API key, fallback models, reasoning effort, enabled | `ai:write` (+ `secrets:write` สำหรับคีย์) | ใช่ | ไม่ | | `ai_provider_test` | ส่งคำถามหนึ่งข้อไปยังผู้ให้บริการที่บันทึกไว้เพื่อตรวจสอบว่าใช้งานได้หรือไม่ | `ai:write` | ไม่ | ไม่ | ### ไฟล์การกำหนดค่า {#configuration-files} | เครื่องมือ | What it does | Scope | เปลี่ยนแปลงข้อมูล | ถามคุณ | |---|---|---|---|---| | `config_export` | ส่งออกการกำหนดค่าเป็น YAML (ข้อมูลลับจะกลายเป็นการอ้างอิง `secret://`) | `admin:read` | ไม่ | ไม่ | | `config_plan` | เปรียบเทียบการกำหนดค่า YAML กับพาเนลที่ใช้งานจริงและแสดงรายการสิ่งที่จะเปลี่ยนแปลง | `admin:read` | ไม่ | ไม่ | | `config_apply` | ใช้งานการกำหนดค่า YAML ทีละส่วน โดยแต่ละการเปลี่ยนแปลงจะเป็นไปตามกฎขอบเขตและการยืนยันตามปกติ | `admin:read` + ขอบเขตของทุกการเปลี่ยนแปลง | ใช่ | ต่อการเปลี่ยนแปลง | ดูรูปแบบไฟล์ได้ที่ [Configuration as code](https://nexcmp.com/th/docs/configure-with-ai/config-as-code/) ## Prompts {#prompts} เซิร์ฟเวอร์ยังมีพรอมต์สำเร็จรูป 3 รายการที่ไคลเอนต์สามารถแสดงเป็นทางลัดได้: | พรอมต์ | อาร์กิวเมนต์ | สิ่งที่สั่งให้ AI ดำเนินการ | |---|---|---| | `initial-setup` | ไม่มี | เรียกใช้ `setup_checklist`, อธิบายแต่ละขั้นตอนที่ค้างอยู่ในหนึ่งประโยค, ขอข้อมูลที่จำเป็นจากคุณ, ดำเนินการตามขั้นตอนด้วยเครื่องมือที่ตรงกัน, แสดงตัวอย่างการเปลี่ยนแปลงทางการเงินหรือความปลอดภัย และสิ้นสุดด้วย `system_health` | | `add-proxmox` | `endpoint` (ทางเลือก, `https://host:8006`) | ขอ API token จากนั้นเรียกใช้ `proxmox_add`, `proxmox_test`, เครื่องมือโซน และ `proxmox_attach_zone` จากนั้นเสนอแพ็กเกจด้วย `plans_from_offerings` และรอการอนุมัติจากคุณ | | `launch-pricing` | `margin_pct` (ทางเลือก, ค่าเริ่มต้น 40) | สอบถามต้นทุนรายเดือนของคุณต่อ vCPU, ต่อ GB ของ RAM และต่อ GB ของดิสก์ แสดงตารางตัวอย่างพร้อมต้นทุน ราคาต่อเดือน และราคาต่อชั่วโมง แล้วจึงสร้างแพ็กเกจหลังจากที่คุณอนุมัติ | ## การยืนยัน (`confirm_token`) {#confirmation-confirm-token} การดำเนินการที่มีการย้ายเงิน ลบข้อมูล เปลี่ยนข้อมูลการชำระเงิน หรือความปลอดภัยในการเข้าสู่ระบบ จะเป็นแบบ 2 ขั้นตอน: 1. การเรียกใช้ครั้งแรกจะไม่มีการเปลี่ยนแปลงใดๆ ผลลัพธ์ของเครื่องมือจะขึ้นต้นด้วย "CONFIRMATION REQUIRED" และมี **ตัวอย่าง** (สิ่งที่จะถูกเรียกใช้, เหตุผลที่ละเอียดอ่อน, ค่าใหม่และค่าปัจจุบัน) รวมถึง `confirm_token` 2. ไคลเอนต์จะต้องแสดงตัวอย่างให้คุณดู และหลังจากที่คุณอนุมัติแล้วเท่านั้น จึงจะเรียกใช้เครื่องมือเดิมอีกครั้งด้วยอาร์กิวเมนต์เดิมพร้อมกับ `confirm_token` 3. โทเค็นสามารถใช้ได้ครั้งเดียว สำหรับคำขอดังกล่าวโดยเฉพาะเท่านั้น และจะหมดอายุหลังจาก 5 นาที คำสั่งของเซิร์ฟเวอร์จะบอก AI ให้ปฏิบัติกับผลลัพธ์ของเครื่องมือเสมือนเป็นข้อมูล ไม่ใช่คำสั่ง และห้ามทำซ้ำการเรียกด้วยโทเค็นที่คุณยังไม่ได้อนุมัติ คุณคือผู้คอยตรวจสอบ: โปรดอ่านตัวอย่างก่อน ::: warning ไม่อนุมัติอัตโนมัติ ไคลเอนต์บางตัวสามารถอนุมัติการเรียกเครื่องมือทุกรายการได้โดยอัตโนมัติ สำหรับเครื่องมือที่มีการเขียน ให้เปิดการอนุมัติรายครั้งไว้ หรือใช้คีย์แบบอ่านอย่างเดียว เพื่อไม่ให้แผนการที่ผิดพลาดจาก AI เข้าถึงแผงควบคุมของคุณได้โดยไม่ผ่านการตรวจสอบ ::: ## วิธีการทำงาน {#how-it-works} | Item | Detail | |---|---| | การรับส่งข้อมูล | `POST /mcp/admin` ด้วยข้อความ JSON-RPC 2.0; คำตอบคือ `application/json` สูงสุด 20 ข้อความต่อหนึ่งแบทช์ `GET /mcp/admin` ตอบกลับ 405 (ไม่มีสตรีมเซิร์ฟเวอร์); `DELETE /mcp/admin` สิ้นสุดเซสชัน | | การยืนยันตัวตน | `Authorization: Bearer ak_...` (คีย์แบบกำหนดเองหรือโทเค็นการเข้าถึง OAuth) ข้อมูลประจำตัวที่ขาดหายไปหรือไม่ถูกต้องจะส่งคืน 401 พร้อมกับ `WWW-Authenticate: Bearer ... resource_metadata=...` ซึ่งช่วยให้ไคลเอนต์ OAuth สามารถเริ่มเข้าสู่ระบบได้ด้วยตนเอง | | เซสชัน | `Mcp-Session-Id` ออกโดย `initialize` ซึ่งผูกอยู่กับคีย์นั้นและมีอายุใช้งาน 24 ชั่วโมง | | ความสามารถ | เครื่องมือและพรอมต์ ไม่มีทรัพยากร | | ขนาด | เนื้อหาคำขอสูงสุด 1 MB; ผลลัพธ์ของเครื่องมือจะถูกตัดทอนหลังจากประมาณ 100 KB | | ต้นทาง | คำขอที่มีส่วนหัว `Origin` จากเว็บไซต์อื่นจะถูกปฏิเสธ (`origin_not_allowed`) ไคลเอนต์บรรทัดคำสั่งและเดสก์ท็อปจะไม่ส่งข้อมูลนี้ | | เกตเวย์เดียวกับ REST | การเรียกเครื่องมือแต่ละรายการจะถูกส่งผ่านท่อส่งคำขอของแผงควบคุมเองด้วยคีย์ของคุณ เพื่อให้ขอบเขต ช่วง IP ขีดจำกัดอัตรา การยืนยัน และบันทึกกิจกรรมทำงานตรงกันทุกประการเช่นเดียวกับการเรียก API โดยตรง | ## ขีดจำกัดและหมายเหตุ {#limits-notes} - เครื่องมือที่คุณมองไม่เห็นคือขอบเขตที่คุณไม่ได้ให้สิทธิ์ โปรดเพิ่มขอบเขตดังกล่าวลงในคีย์ใหม่ - การตั้งรหัสผ่านหรือ API key ผ่านทาง AI client หมายความว่าข้อมูลลับจะผ่านระบบ AI นั้น หากต้องการ คุณสามารถปิด `secrets:write` ไว้และป้อนข้อมูลลับด้วยตนเองในหน้าผู้ดูแลระบบ หรือใช้ฟิลด์ **Secret** ของ AI Chat ([AI Chat ในระบบผู้ดูแลระบบ](https://nexcmp.com/th/docs/configure-with-ai/ai-chat-in-admin/#secrets)) หรือการอ้างอิง `secret://` ([การกำหนดค่าเป็นโค้ด](https://nexcmp.com/th/docs/configure-with-ai/config-as-code/#secrets)) - ไคลเอนต์ไม่ได้ใช้เซสชันร่วมกัน: แต่ละการเชื่อมต่อเริ่มต้นด้วย `initialize` - เพิกถอนคีย์ใน **API & AI agents** เพื่อตัดการเชื่อมต่อไคลเอนต์ AI ทันที ## การแก้ Problme {#troubleshooting} | อาการ | สาเหตุ | วิธีแก้ปัญหา | |---|---|---| | 401 `invalid_key` | คีย์ที่ไม่ถูกต้อง ถูกตัดทอน หรือไม่ใช่คีย์ผู้ดูแลระบบ (เช่น คีย์ `vk_`) | ใช้คีย์ `ak_` | | 401 `key_expired` หรือ `key_revoked` | คีย์หมดอายุหรือถูกเพิกถอน | สร้างคีย์ใหม่. | | 403 `ip_not_allowed` | IP ของคุณอยู่นอกช่วง IP ของคีย์ | เชื่อมต่อจาก IP ที่ได้รับอนุญาต | | 403 `origin_not_allowed` | หน้าเว็บเบราว์เซอร์จากต้นทางอื่นเรียกใช้เอนด์จุดนี้ | ใช้ไคลเอนต์เดสก์ท็อปหรือ CLI | | 404 ในคำขอที่มี `Mcp-Session-Id` | เซสชันเป็นของคีย์อื่นหรือหมดอายุแล้ว | ส่ง `initialize` อีกครั้ง | | 400 ไม่รองรับ `MCP-Protocol-Version` | ไคลเอนต์ใช้เวอร์ชันที่เซิร์ฟเวอร์ไม่รู้จัก | อัปเดตไคลเอนต์; เวอร์ชันที่รองรับ: 2025-11-25, 2025-06-18, 2025-03-26 | | รายการเครื่องมือสั้นเกินไป | ขอบเขตของคีย์ | สร้างคีย์ที่มีขอบเขตเพิ่มเติม | | `insufficient_scope` ในการเรียกใช้งาน | เครื่องมือต้องการขอบเขตที่สอง เช่น `secrets:write` | เพิ่มขอบเขตดังกล่าวลงในคีย์ใหม่ | | 429 `rate_limited` | จำนวนการเรียกต่อนาทีเกินกว่าที่คีย์อนุญาต | รอ `Retry-After` หรือเพิ่มขีดจำกัดบนคีย์ใหม่ | | claude.ai หรือ ChatGPT ไม่สามารถเชื่อมต่อได้ | ไม่สามารถเข้าถึง URL ได้จากอินเทอร์เน็ต หรือพร็อกซีบล็อก `/mcp/admin` หรือ `/oauth-admin/` | ตรวจสอบ DNS, TLS และรีเวอร์สพร็อกซี | สำหรับรหัสข้อผิดพลาดทั้งหมด โปรดดูที่ [Admin API keys](https://nexcmp.com/th/docs/configure-with-ai/admin-api-keys/#errors) --- # ตัวเชื่อมต่อ claude.ai และ ChatGPT {#claude-ai-and-chatgpt-connectors} > **ตำแหน่งในหน้าผู้ดูแลระบบ:** System › Settings › API & AI agents (`/agent/keys`), แท็บ **Connected apps** หน้าจอให้ความยินยอมจะเปิดขึ้นที่ `/agent/consent` เมื่อมีตัวเชื่อมต่อขอเข้าถึง (ไม่ได้อยู่ในเมนู) ## What it does {#what-it-does} แอป AI บนเว็บไม่สามารถอ่านคีย์จากดิสก์ของคุณได้ แต่จะเชื่อมต่อผ่าน **OAuth**: คุณเพิ่ม URL MCP ของแผงควบคุม แอปจะนำคุณไปยังหน้าผู้ดูแลระบบของคุณเองเพื่อลงชื่อเข้าใช้ คุณเลือกสิ่งที่แอปทำได้และระยะเวลา และแอปจะได้รับโทเค็นที่มีอายุสั้น ไม่มีคีย์ใดถูกคัดลอกหรือวาง คุณสามารถตัดการเชื่อมต่อแอปได้ตลอดเวลา ใช้สิ่งนี้สำหรับตัวเชื่อมต่อแบบกำหนดเองของ claude.ai ตัวเชื่อมต่อโหมดนักพัฒนาของ ChatGPT และไคลเอนต์ MCP อื่นๆ ที่รองรับ OAuth พร้อมการลงทะเบียนไคลเอนต์แบบไดนามิก เครื่องมือบรรทัดคำสั่งสามารถใช้กระแสข้อมูลเดียวกันได้ แต่การใช้ [admin API key](https://nexcmp.com/th/docs/configure-with-ai/admin-api-keys/) จะสะดวกกว่าสำหรับเครื่องมือเหล่านั้น ## ข้อกำหนด {#requirements} | Item | Requirement | |---|---| | URL | `https://cloud.example.com/mcp/admin`, สามารถเข้าถึงได้จากอินเทอร์เน็ต (เซิร์ฟเวอร์ของผู้ให้บริการจะเชื่อมต่อเข้ามา) | | รีเวอร์สพร็อกซี | หากคุณวางพร็อกซีของคุณเองไว้หน้าแผงควบคุม พร็อกซีนั้นจะต้องส่งต่อเส้นทาง `/mcp/admin`, `/oauth-admin/` และ `/.well-known/` ไปยังแผงควบคุม | | คุณ | ลงชื่อเข้าใช้ระบบผู้ดูแลระบบ NexCMP **ในเบราว์เซอร์เดียวกัน** กับที่คุณใช้สำหรับหน้าจอให้ความยินยอม | | ไคลเอนต์ | รองรับ MCP ผ่าน Streamable HTTP, OAuth 2.1 ร่วมกับ PKCE (S256) และการลงทะเบียนไคลเอนต์แบบไดนามิก | ## เชื่อมต่อ {#connect} 1. ในแอป AI ให้เพิ่มตัวเชื่อมต่อ MCP แบบกำหนดเองและวาง `https://cloud.example.com/mcp/admin` ใน claude.ai จะอยู่ภายใต้การตั้งค่าตัวเชื่อมต่อ (เพิ่มตัวเชื่อมต่อแบบกำหนดเอง) ใน ChatGPT จะอยู่ภายใต้โหมดนักพัฒนา (เพิ่มตัวเชื่อมต่อ MCP, การตรวจสอบสิทธิ์ OAuth) 2. เลือก **Sign in** (หรือ "Connect") ในแอป เบราว์เซอร์ของคุณจะเปิดหน้าจอให้ความยินยอมของผู้ดูแลระบบ NexCMP หากคุณยังไม่ได้ลงชื่อเข้าใช้ ให้ลงชื่อเข้าใช้ก่อน หน้าจอจะดำเนินการต่อหลังจากนั้น 3. อ่านการ์ด: "**Example AI app** wants to manage this NexCMP admin" (ชื่อของแอปที่กำลังขอเข้าถึง) พร้อมกับที่อยู่ที่จะนำคุณกลับไป 4. ทำเครื่องหมายที่ช่องสิทธิ์ที่ต้องการให้สิทธิ์ สิทธิ์ที่แอปขอจะถูกทำเครื่องหมายไว้ล่วงหน้า หากแอปไม่ได้ขอ จะมีเพียง `admin:read` เท่านั้นที่ถูกทำเครื่องหมาย ดูข้อมูลเพิ่มเติมที่ [Scopes](https://nexcmp.com/th/docs/configure-with-ai/admin-api-keys/#scopes) 5. เลือก, ระยะเวลาที่การเชื่อมต่อจะมีผล: **7**, **30** หรือ **90** วัน (ค่าเริ่มต้นคือ 30) 6. คลิก **Allow** เบราว์เซอร์จะกลับไปยังแอปซึ่งเชื่อมต่อเรียบร้อยแล้ว คลิก **Deny** เพื่อปฏิเสธ ![หน้าจอให้ความยินยอมที่ขออนุญาตให้แอป AI เข้าถึง พร้อมช่องทำเครื่องหมายสิทธิ์ ตัวเลือกะยะเวลา และปุ่ม Allow กับ Deny](https://nexcmp.com/th/docs/images/configure-with-ai/oauth-connectors-01-consent.webp) ::: important เลือกสิทธิ์เหมือนกับที่คุณทำสำหรับคีย์ ให้สิทธิ์ชุดที่น้อยที่สุดที่จำเป็นสำหรับการทำงาน การดำเนินการเกี่ยวกับเงิน การลบ และความปลอดภัยจะยังคงหยุดที่การแสดงตัวอย่างและต้องได้รับการอนุมัติจากคุณ แต่การเชื่อมต่อที่มี `settings:write` ยังคงสามารถเปลี่ยนการสร้างแบรนด์และอีเมลของคุณได้ ::: ## จัดการและเพิกถอน {#manage-and-revoke} เปิด **System › Settings › API & AI agents › Connected apps** ตารางจะแสดงรายการแอปทั้งหมดที่คุณเชื่อมต่อ: แอปพลิเคชัน สิทธิ์ วันที่เชื่อมต่อ วันหมดอายุ และวันที่ใช้งานล่าสุด หากต้องการตัดการเชื่อมต่อแอป ให้คลิก **Revoke** และยืนยัน โทเค็นของแอปจะหยุดทำงานทันที และแอปจะต้องผ่านหน้าจอให้ความยินยอมอีกครั้งเพื่อเชื่อมต่อใหม่ ![แท็บ Connected apps ที่แสดงรายการแอป AI หนึ่งแอปพร้อมสิทธิ์ วันหมดอายุ และปุ่ม Revoke](https://nexcmp.com/th/docs/images/configure-with-ai/oauth-connectors-02-connected-apps.webp) ## วิธีการทำงานของกระแสข้อมูล {#how-the-flow-works} | ขั้นตอน | Detail | |---|---| | การค้นหา | แอปอ่าน `/.well-known/oauth-protected-resource/mcp/admin` จากนั้นอ่าน `/.well-known/oauth-authorization-server/oauth-admin` ผู้ออกคือ `https://cloud.example.com/oauth-admin` | | การลงทะเบียน | แอปทำการลงทะเบียนตัวเอง (`POST /oauth-admin/register`, RFC 7591) รองรับเฉพาะไคลเอนต์สาธารณะเท่านั้น (ไม่มีรหัสลับไคลเอนต์) ที่อยู่เปลี่ยนเส้นทางต้องเป็น `https` หรือ `http` บนคอมพิวเตอร์เครื่องเดียวกัน (ลูปแบ็ก) | | การให้สิทธิ์ | `GET /oauth-admin/authorize` พร้อมใช้วิธี PKCE `S256` พารามิเตอร์ `resource` เมื่อส่งมา จะต้องเป็น URL `/mcp/admin` ของแผงควบคุมนี้ คำขอจะมีอายุ 10 นาทีและผูกติดอยู่กับเบราว์เซอร์ที่เริ่มต้นคำขอนั้น | | การให้ความยินยอม | คุณเลือกสโคปและระยะเวลา (ด้านบน) รหัสการอนุญาตมีอายุ 60 วินาทีและใช้งานได้ครั้งเดียว | | โทเค็น | `POST /oauth-admin/token` ส่งคืน **access token** (`ak_o...` key ซึ่งใช้งานได้ 1 ชั่วโมงหรือจนกว่าการเชื่อมต่อจะสิ้นสุดลง แล้วแต่อย่างใดถึงก่อน) และ **refresh token** (`akr_...`) ทุกครั้งที่มีการรีเฟรช จะได้รับ refresh token ใหม่ และตัวเก่าจะใช้งานไม่ได้ การเชื่อมต่อจะสิ้นสุดลงตามจำนวนวันที่คุณเลือก | | การเพิกถอน | **Revoke** ใน Connected apps หรือแอปเรียก `POST /oauth-admin/revoke` (RFC 7009) | Access token จะทำงานเสมือนแอดมินคีย์ที่มีสโคปที่คุณให้สิทธิ์: เป็นไปตามกฎสโคป การยืนยันตัวตน อัตราจำกัด และบันทึกกิจกรรมแบบเดียวกัน การเรียกใช้งานจะแสดงบนแท็บ **Activity** ## ตรวจสอบ {#verify} 1. ในแอป ให้พิมพ์ว่า "run system_health" (หรือ "what tools do you have?") แอปจะแสดงรายการเครื่องมือที่สโคปของคุณอนุญาต ([the tool list](https://nexcmp.com/th/docs/configure-with-ai/mcp-admin/#tools)) 2. เปิด **Connected apps**: **Last used** จะมีการอัปเดต 3. เปิด **Activity**: การเรียกใช้งานจะแสดงพร้อมกับชื่อแอปและ `mcp` ## ขีดจำกัดและหมายเหตุ {#limits-notes} - หากแอปขอให้ลงชื่อเข้าใช้ใหม่อีกครั้งหลังจากผ่านไป 1 ชั่วโมง ถือเป็นเรื่องปกติเมื่อไคลเอนต์ไม่ได้ทำการรีเฟรช ให้ทำการเชื่อมต่อใหม่ - Refresh token ที่ถูกนำมาใช้ซ้ำจะถือว่าถูกขโมย: การเชื่อมต่อทั้งหมดจะถูกเพิกถอน ให้เชื่อมต่อใหม่อีกครั้งจากแอป - รหัสการอนุญาตที่ถูกนำมาใช้ซ้ำจะถูกปฏิเสธ (`invalid_grant`) และโทเค็นที่ออกไปแล้วจากรหัสนั้นจะถูกเพิกถอน - สิทธิ์การเข้าถึงผ่าน OAuth จะไม่เกินกว่าที่กฎสโคปอนุญาต: [what a key can never do](https://nexcmp.com/th/docs/configure-with-ai/admin-api-keys/#what-a-key-can-never-do) มีผลกับแอปที่เชื่อมต่อเช่นกัน - ผู้ให้บริการอาจมีการเปลี่ยนแปลงเมนูและการสนับสนุน หากแอปของผู้ให้บริการไม่รองรับคอนเนกเตอร์กำหนดเองในแพ็กเกจของคุณ ให้ใช้ [admin API key](https://nexcmp.com/th/docs/configure-with-ai/admin-api-keys/) กับเดสก์ท็อปหรือคอมมานด์ไลน์ไคลเอนต์แทน ## การแก้ Problme {#troubleshooting} | อาการ | สาเหตุ | วิธีแก้ปัญหา | |---|---|---| | หน้าจอให้ความยินยอมแสดงข้อความ "Wrong browser" | คำขอถูกเริ่มต้นในเบราว์เซอร์อื่นที่ไม่ใช่เบราว์เซอร์ที่คุณใช้ลงชื่อเข้าอยู่ | เริ่มต้นการเชื่อมต่อใหม่อีกครั้งจากแอป AI ในเบราว์เซอร์เดิม | | หน้าจอให้ความยินยอมแสดงข้อความว่าคำขอหมดอายุหรือหายไป | ผ่านไปนานกว่า 10 นาที หรือลิงก์ถูกเปิดซ้ำสองครั้ง | เริ่มต้นการเชื่อมต่อใหม่อีกครั้งจากแอป AI | | หน้า "Unknown client" หรือ "redirect address does not match" | การลงทะเบียนแอปหมดอายุ หรือมีการใช้แอดเดรสเปลี่ยนเส้นทางที่ไม่ได้ลงทะเบียนไว้ | ลบคอนเนกเตอร์ในแอปออกแล้วเพิ่มใหม่อีกครั้ง | | `invalid_target` | `resource` ที่ส่งมาไม่ใช่ URL `/mcp/admin` ของแผงควบคุมนี้ | ใช้ URL ที่แน่นอนซึ่งแสดงอยู่บนแท็บ **Connect an AI** | | `invalid_request` เกี่ยวกับ PKCE | ไคลเอนต์ไม่ได้ส่ง `code_challenge_method=S256` | ใช้ไคลเอนต์ที่รองรับ OAuth 2.1 ร่วมกับ PKCE | | แอปเชื่อมต่อได้แต่การเรียกใช้งานส่งคืน `insufficient_scope` | คุณไม่ได้ทำเครื่องหมายเลือกสโคปนั้น | เพิกถอนการเชื่อมต่อและเชื่อมต่อใหม่อีกครั้งโดยทำเครื่องหมายเลือกสโคป | | แอปไม่สามารถเข้าถึง URL ได้ | DNS, TLS หรือรีเวอร์สพร็อกซีบล็อก `/mcp/admin`, `/oauth-admin/` หรือ `/.well-known/` | ตรวจสอบกฎของพร็อกซี | --- # Configuration as code {#configuration-as-code} > **ตำแหน่งในแอดมิน:** System › Settings › Import/Export (`/agent/config`) บนเซิร์ฟเวอร์: คำสั่ง `nexcmp config export`, `plan` และ `apply` รวมถึง `nexcmp admin ` ## What it does {#what-it-does} คุณสามารถบันทึกการกำหนดค่าพานิลของคุณ (การสร้างแบรนด์, การตั้งค่าทั่วไป, อีเมล, การแจ้งเตือนผ่าน Telegram, โมดูล,สกุลเงิน, เกตเวย์การชำระเงิน, ขีดจำกัด, โซน, แพ็กเกจ, ผู้ให้บริการ AI และหน้าข้อกฎหมาย) ให้เป็นไฟล์ YAML ไฟล์เดียว คุณสามารถแก้ไขไฟล์ได้ด้วยตนเอง, ให้ผู้ช่วย AI ช่วยแก้ไข, เก็บไว้ในระบบควบคุมเวอร์ชัน และนำไปใช้กับพานิลเดิมหรือพานิลอื่นได้ ก่อนที่จะมีการเปลี่ยนแปลงใดๆ คุณจะเห็นรายการความแตกต่างเสมอ ข้อมูลลับจะไม่ถูกเขียนลงในไฟล์เด็ดขาด ใช้เพื่อโคลนการตั้งค่าไปยังการติดตั้งชุดที่สอง, เพื่อตรวจสอบการเปลี่ยนแปลงก่อนนำไปใช้งานจริง, เพื่อกู้คืนการตั้งค่าหลังจากเกิดความผิดพลาด, หรือเพื่อให้ AI เสนอโครงสร้างการกำหนดค่าทั้งหมดที่คุณสามารถอ่านได้เสมือนเป็นเอกสารชุดเดียว ## ข้อกำหนด {#requirements} | Item | Requirement | |---|---| | NexCMP | 1.4.0 หรือใหม่กว่า | | บรรทัดคำสั่ง | คุณคือ `root` บนเซิร์ฟเวอร์พานิล (ใช้ `sudo`) คำสั่งจะขอคีย์ชั่วคราว (15 นาที, สิทธิ์การใช้งานทั้งหมด) จากพานิลโดยอัตโนมัติ หากต้องการใช้คีย์ที่จำกัดสิทธิ์มากกว่าแทน ให้ตั้งค่า `NEXCMP_KEY` เป็น [admin API key](https://nexcmp.com/th/docs/configure-with-ai/admin-api-keys/) และคงสิทธิ์นั้นไว้ผ่าน sudo เช่น `sudo --preserve-env=NEXCMP_KEY nexcmp config plan -f nexcmp.yaml` | | หน้าผู้ดูแลระบบ | เข้าสู่ระบบในฐานะผู้ดูแลระบบแล้ว หน้านี้จะเป็นแบบอ่านอย่างเดียวบนพานิลทดลอง | | ข้อมูลลับ | ค่าที่ระบุในเวลาที่ทำการปรับใช้ (ดู [Secrets](#secrets)); จะไม่มีการเก็บไว้ในไฟล์เด็ดขาด | ## ส่งออก, แก้ไข, ดูตัวอย่าง, ปรับใช้ {#export-edit-preview-apply} 1. ส่งออกการกำหนดค่าปัจจุบัน: ```bash sudo nexcmp config export -o nexcmp.yaml ``` หากไม่มี `-o` โค้ด YAML จะถูกพิมพ์ออกทางหน้าจอ 2. แก้ไข `nexcmp.yaml` (ดู [ตัวอย่าง](#example-file) ด้านล่าง) รักษา `version: 1` ให้อยู่ด้านบน 3. ดูตัวอย่างสิ่งที่จะเปลี่ยนแปลง การดำเนินการนี้จะไม่เปลี่ยนแปลงค่าใดๆ: ```bash sudo nexcmp config plan -f nexcmp.yaml ``` แต่ละบรรทัดจะแสดงส่วน, รายการ, ฟิลด์ และ `old → new` บรรทัดที่มีเครื่องหมาย `$` เป็นส่วนของระบบการเรียกเก็บเงิน (ดู [Billing sections](#billing-sections)) หากพานิลตรงกับไฟล์อยู่แล้ว คุณจะเห็นข้อความ "No changes" 4. ปรับใช้ หากไม่มี `--yes` คำสั่งจะเป็นการ **dry run** และจะพิมพ์เพียงรายการที่เหมือนกันออกมาเท่านั้น: ```bash sudo nexcmp config apply -f nexcmp.yaml --yes ``` 5. อ่านผลลัพธ์: `applied`, `pending` (รอการยืนยันของคุณ), `skipped` และ `errors` | ตัวเลือก | ความหมาย | |---|---| | `-f ` | ไฟล์ YAML (จำเป็นสำหรับ `plan` และ `apply`) | | `--yes` | ปรับใช้จริง หากไม่มีตัวเลือกนี้ `apply` จะเป็นเพียงการ dry run | | `--confirm-billing` | ปรับใช้ส่วนการเรียกเก็บเงินด้วย (`payments`, `currency`, `plans`) หากไม่มีส่วนนี้จะถูกข้ามไป | | `--section ` | ปรับใช้เฉพาะส่วนนี้เท่านั้น ทำซ้ำตัวเลือกนี้สำหรับหลายส่วน | | `-o ` | ด้วย `export`: เขียนโค้ด YAML ลงในไฟล์ | รหัสสถานะการออก (exit code) จะเป็น 0 เมื่อทุกอย่างถูกปรับใช้แล้วหรือไม่มีการเปลี่ยนแปลง, เป็น 1 เมื่อมีข้อผิดพลาดเกิดขึ้น, และเป็น 2 สำหรับข้อผิดพลาดด้านการใช้งานหรือคีย์ ### ข้อมูลลับ {#secrets} ไฟล์จะเก็บข้อมูลอ้างอิงแทนข้อมูลลับ เช่น `password: secret://smtp_password` ในเวลาที่ทำการปรับใช้ ค่าจะดึงมาจากตัวแปรสภาพแวดล้อมที่ชื่อว่า `NEXCMP_SECRET_` ตามด้วยชื่อข้อมูลอ้างอิงที่เป็นตัวพิมพ์ใหญ่: ```bash sudo -i read -rs NEXCMP_SECRET_SMTP_PASSWORD && export NEXCMP_SECRET_SMTP_PASSWORD read -rs NEXCMP_SECRET_STRIPE_SECRET_KEY && export NEXCMP_SECRET_STRIPE_SECRET_KEY nexcmp config apply -f nexcmp.yaml --yes --confirm-billing ``` หากข้อมูลอ้างอิงไม่มีค่า ข้อมูลลับที่บันทึกไว้เดิมในพานิลจะยังคงถูก **เก็บรักษาไว้** ข้อมูลลับที่ไม่เคยถูกบันทึกและไม่ได้ระบุค่าไว้จะถูกปล่อยว่าง | ชื่อข้อมูลอ้างอิง | ตำแหน่งที่จะไป | |---|---| | `smtp_password` | `email.smtp.password` | | `telegram_bot_token` | `telegram.bot_token` | | `stripe_secret_key`, `stripe_webhook_secret` | `payments.stripe` | | `paypal_client_secret` | `payments.paypal.client_secret` | | `binance_api_key`, `binance_api_secret` | `payments.crypto` | | `sepay_api_token`, `sepay_webhook_secret` | `payments.bank` | | `ai_provider_key` | `ai_provider.api_key` | ## ไฟล์ตัวอย่าง {#example-file} ```yaml # NexCMP configuration. Preview: nexcmp config plan -f nexcmp.yaml version: 1 branding: name: Example Cloud primary: "#1677ff" currency: usd seller_name: Example Cloud LLC settings: brand_name: Example Cloud support_email: support@example.com default_lang: en invoice_prefix: EX company_name: Example Cloud LLC company_address: "1 Example Street, New York, NY" min_topup_cents: 500 email: smtp: host: smtp.example.com port: 587 security: starttls username: mailer@example.com password: secret://smtp_password from_email: no-reply@example.com from_name: Example Cloud reply_to: support@example.com telegram: enabled: true chat_id: "123456789" bot_token: secret://telegram_bot_token modules: s3: true k8s: false currency: site_currency: usd manual_rate_vnd: 0 # 0 = automatic payments: stripe: mode: test publishable_key: pk_test_XXXX secret_key: secret://stripe_secret_key webhook_secret: secret://stripe_webhook_secret bank: bank_code: BANK account_number: "0000000000" account_name: EXAMPLE CLOUD LLC prefix: EX api_token: secret://sepay_api_token channels: pay_card_enabled: true quotas: quota_enabled: true quota_max_vms_24h: 5 quota_max_vms_30d: 30 zones: - slug: new-york name: New York country: US city: New York enabled: true is_default: true plans: - slug: vps-1c-1g name: 1 vCPU, 1 GB RAM, 25 GB cpu: 1 ram_mb: 1024 disk_gb: 25 hourly_usd: 0.0112 cs_offering_id: OFFERING_ID enabled: true visible: true ai_provider: enabled: true name: Example AI base_url: https://api.example.com/v1 model: example-model fallback_models: [example-model-mini] reasoning_effort: low api_key: secret://ai_provider_key legal: terms: en: | # Terms of service Your terms in simple markdown (no HTML). privacy: en: | # Privacy policy Your policy in simple markdown (no HTML). ``` ไฟล์หนึ่งอาจประกอบด้วยส่วนย่อยใดๆ ก็ได้ ส่วนที่คุณละไว้จะไม่ถูกแก้ไข ไฟล์ที่มีขนาดใหญ่กว่า 1 MB, ขาด `version: 1`, หมายเลขเวอร์ชันที่แตกต่างกัน หรือส่วนที่ไม่รู้จักจะถูกปฏิเสธก่อนที่กระบวนการใดๆ จะทำงาน ## หัวข้อ {#sections} | ส่วน | สิ่งที่ควบคุม | หมายเหตุ | |---|---|---| | `branding` | ชื่อแบรนด์ (สูงสุด 60 ตัวอักษร), สีหลัก, สุลเงินที่แสดง (`usd` หรือ `vnd`), ชื่อผู้ขาย | โลโก้ไม่ได้เป็นส่วนหนึ่งของไฟล์; ให้ใช้ [branding page](https://nexcmp.com/th/docs/customers/branding/) | | `settings` | รายการการตั้งค่าทั่วไปแบบตายตัว: `brand_name`, `support_email`, `support_telegram_url`, `default_lang`, `require_email_verified`, `min_topup_cents`, `max_topup_cents`, `invoice_prefix`, `company_name`, `company_address`, `company_tax_id`, `auto_destroy_days`, `low_balance_cents` | คีย์อื่นๆ จะถูกเพิกเฉย | | `email.smtp` | โฮสต์ SMTP, พอร์ต, ความปลอดภัย (`starttls`, `tls`, `none`), ผู้ใช้, รหัสผ่าน, ชื่อและที่อยู่ผู้ส่ง, อีเมลตอบกลับ | [SMTP and e-mail templates](https://nexcmp.com/th/docs/administration/smtp-and-emails/) การเปลี่ยนโฮสต์ พอร์ต หรือความปลอดภัยจำเป็นต้องใส่รหัสผ่านใหม่อีกครั้ง | | `telegram` | เปิดหรือปิดช่องทางแจ้งเตือน, chat id, bot token | [Telegram notifications](https://nexcmp.com/th/docs/administration/telegram-notifications/) | | `modules` | เปิดหรือปิดโมดูลเสริม (`key: true/false`) | เฉพาะคีย์ที่พาเนลอนุญาตให้สลับได้ ดูที่ [Modules](https://nexcmp.com/th/docs/infrastructure/modules/) | | `currency` | สกุลเงินที่แสดงและอัตราแลกเปลี่ยน USD เป็น VND แบบกำหนดเอง (`0` แบบอัตโนมัติ มิฉะนั้นคือ 15000 ถึง 50000) | ส่วนการเรียกเก็บเงิน ดูที่ [Currency and exchange rates](https://nexcmp.com/th/docs/catalog/currency-and-exchange-rates/) | | `payments` | ข้อมูลรับรอง `stripe`, `paypal`, `crypto`, `bank` และสวิตช์ `channels` (`pay_card_enabled`, `pay_wallets_enabled`, `pay_alipay_enabled`, `pay_paypal_enabled`, `pay_usdt_enabled`, `pay_sepay_enabled`) | ส่วนการเรียกเก็บเงิน ดูที่ [Payment channels](https://nexcmp.com/th/docs/billing/payment-channels/) | | `quotas` | ขีดจำกัด `quota_*` | ดูที่ [Quotas](https://nexcmp.com/th/docs/billing/quotas/) | | `zones` | โซนตาม `slug` (จำเป็น: `slug`, `name`, `country`; ทางเลือก `city`, `enabled`, `is_default`) | โซนใหม่จะถูกสร้างขึ้น โซนที่มีอยู่แล้วจะ **ไม่ถูกเปลี่ยนแปลง** โดยไฟล์ ดูที่ [Zones](https://nexcmp.com/th/docs/infrastructure/zones/) | | `plans` | แผนบริการตาม `slug` (จำเป็น: `slug`, `name`, `cpu`, `ram_mb`, `disk_gb`, `hourly_usd`; ทางเลือก `cs_offering_id`, `backend_id`, `zone_id`, `enabled`, `visible`, `sort`, `description`) | ส่วนการเรียกเก็บเงิน แผนบริการใหม่จะถูกสร้างขึ้น แผนที่มีอยู่จะถูกอัปเดตตาม slug ราคาเป็น USD ต่อชั่วโมง ดูที่ [Plans](https://nexcmp.com/th/docs/catalog/plans/) | | `ai_provider` | ผู้ให้บริการ AI ของพาเนลที่ใช้งานโดย AI Chat และ AI Agent ของลูกค้า | [AI provider](https://nexcmp.com/th/docs/ai/ai-providers/). | | `legal` | ข้อกำหนดและนโยบายความเป็นส่วนตัวตามแต่ละภาษา (`en`, `vi`) | [Legal pages](https://nexcmp.com/th/docs/customers/legal/) | ลำดับของการนำไปใช้คือลำดับด้านบน: รายการที่มีลักษณะเป็นโครงสร้างพื้นฐานก่อนแผนบริการ ## กฎที่ควรจำ {#rules-to-remember} - **มีคุณสมบัติ Idempotent** การใช้ไฟล์เดิมซ้ำจะไม่เปลี่ยนแปลงสิ่งใดในครั้งที่สอง `plan` จะแสดง "No changes" - **ไม่มีการลบ** ไฟล์จะไม่ลบโซน, แผนบริการ หรือการตั้งค่าใดๆ การลบรายการออกจากไฟล์จะทำให้พาเนลคงอยู่ตามเดิม - **กฎความปลอดภัยปกติยังคงมีผล** จากบรรทัดคำสั่ง การเปลี่ยนแปลงแต่ละครั้งจะถูกส่งผ่านการตรวจสอบเดียวกับการเปลี่ยนแปลง API: ขอบเขตและกฎ IP การเปลี่ยนแปลงที่ต้องมีการยืนยัน (เช่น สวิตช์ทั่วทั้งไซต์) จะถูกรายงานภายใต้ `pending` พร้อมตัวอย่างภาพรวมแทนที่จะถูกนำไปใช้ทันที เว้นแต่คุณจะส่ง `--confirm-billing` ซึ่งจะเป็นการยืนยันทั้งหมด - **ไคลเอนต์ AI ไม่สามารถปลดล็อกการเรียกเก็บเงินได้** เมื่อ `config_apply` ถูกเรียกโดยไคลเอนต์ MCP, `confirm_billing` จะถูกละเว้น การเปลี่ยนแปลงด้านการเงินจะต้องรอให้คุณดำเนินการ - **ตรวจสอบก่อนนำไปใช้** JSON Schema อธิบายทุกฟิลด์ ชี้เครื่องมือแก้ไขของคุณไปที่ไฟล์นั้น หรือส่งให้ AI เพื่อให้มันเขียน YAML ที่ถูกต้อง: `https://cloud.example.com/v1/admin/agent/config/schema.json` (อ่านได้โดยสาธารณะ) ### ส่วนการเรียกเก็บเงิน {#billing-sections} `payments`, `currency` และ `plans` เปลี่ยนแปลงราคาหรือเส้นทางการเงิน `nexcmp config apply --yes` จะ **ข้าม** รายการเหล่านี้เว้นแต่คุณจะเพิ่ม `--confirm-billing`; จากนั้นรายการเหล่านั้นจะถูกแสดงภายใต้ `skipped` ("billing section - pass confirm_billing") แฟล็กนี้คือการยืนยันของคุณ: เมื่อมีแฟล็กนี้ การเปลี่ยนแปลงการเรียกเก็บเงินทั้งหมดในไฟล์ (และการเปลี่ยนแปลงอื่นๆ ที่จะต้องขอการยืนยัน) จะถูกนำไปใช้โดยไม่ต้องมีข้อความแจ้งเตือนครั้งที่สอง รัน `plan` ก่อนและอ่านแต่ละบรรทัดที่มีเครื่องหมาย `$` เมื่อไฟล์เดียวกันถูกนำไปใช้โดย AI (เครื่องมือ `config_apply` ในไคลเอนต์ MCP หรือ AI Chat) แฟล็กนี้จะถูกละเว้น และการเปลี่ยนแปลงด้านการเงินจะต้องรอการอนุมัติจากคุณแทน ## ใช้หน้า Import/Export {#use-the-import-export-page} 1. เปิด **System › Settings › Import/Export** 2. ภายใต้ **Export** คลิก **Get current configuration** จากนั้น **Download .yaml** เพื่อบันทึก `nexcmp.yaml` ข้อมูลลับจะแสดงเป็นตัวยึดตำแหน่ง 3. ภายใต้ **Import** เลือกไฟล์, ลากไฟล์ลงในกล่อง, หรือวางโค้ด YAML 4. ทางเลือก: เปิด **Secrets that come with it (not in the file)** และเพิ่มชื่อและค่าสำหรับแต่ละข้อมูลอ้างอิง เช่น `smtp_password` 5. คลิก **Preview changes** ตารางจะจัดกลุ่มการเปลี่ยนแปลงตามส่วน ส่วนที่เกี่ยวข้องกับการเงินจะมีแท็ก "Money-related" ยกเลิกการเลือกส่วนที่คุณไม่ต้องการ 6. หากมีส่วนที่เกี่ยวกับเงินแสดงอยู่ ให้ทำเครื่องหมายเลือก **Also apply money-related changes (prices, payment gateways, balances)** หากไม่ทำเครื่องหมาย ส่วนเหล่านี้จะถูกข้ามไป 7. คลิก **Apply selected** ผลลัพธ์จะแสดงรายการที่ถูกนำไปใช้ ถูกข้าม หรือล้มเหลว การเปลี่ยนแปลงที่ส่งกลับมาว่ารอการยืนยันจะแสดงเป็นบัตรยืนยัน ให้กด **Confirm** บนบัตรนั้น ปุ่ม **JSON Schema** ที่มุมบนขวาจะเปิดสคีมาขึ้นมา ![หน้า Import/Export ที่มีการ์ด Export และการ์ด Import สำหรับเก็บ YAML ที่ส่งออกแล้ว](https://nexcmp.com/th/docs/images/configure-with-ai/config-as-code-01-import-export.webp) ![ตารางตัวอย่างการเปลี่ยนแปลงจัดกลุ่มตามหมวดหมู่ พร้อมแท็กการเรียกเก็บเงินและปุ่ม Apply selected](https://nexcmp.com/th/docs/images/configure-with-ai/config-as-code-02-preview.webp) ## รันเครื่องมือใดๆ จากบรรทัดคำสั่ง {#run-any-tool-from-the-command-line} `nexcmp admin` รันเครื่องมือเดียวกับที่ผู้ช่วย AI ใช้ ([the tool list](https://nexcmp.com/th/docs/configure-with-ai/mcp-admin/#tools)) และพิมพ์ผลลัพธ์เป็น JSON: ```bash sudo nexcmp admin tools # name, scope and title of every tool sudo nexcmp admin system_health sudo nexcmp admin customers_search q=customer@example.com sudo nexcmp admin settings_update --json '{"values":{"support_email":"support@example.com"}}' ``` อาร์กิวเมนต์คือคู่ `key=value` (ค่าจะถูกอ่านเป็น JSON หากแยกวิเคราะห์ได้ มิฉะนั้นจะอ่านเป็นข้อความ) หรือออยเจกต์ `--json '{...}'` หนึ่งตัว หากการดำเนินการต้องการการยืนยัน คำสั่งจะพิมพ์ตัวอย่างและหยุดทำงานด้วยรหัสออก 3 และ "Nothing changed" ให้อ่านตัวอย่าง จากนั้นรันคำสั่งเดิมอีกครั้งด้วย `--yes` เพื่อนำไปใช้ เมื่อรันในฐานะ root คำสั่งจะได้คีย์ 15 นาทีที่มีสิทธิ์ทั้งหมด ดังนั้นขั้นตอนการยืนยันจึงเป็นมาตรการป้องกันของคุณ และเมื่อใช้ `NEXCMP_KEY` จะใช้สิทธิ์ของคีย์นั้นๆ เอง ## ตรวจสอบ {#verify} 1. `sudo nexcmp config plan -f nexcmp.yaml` ทันทีหลัง `apply --yes` จะพิมพ์ "No changes" 2. ในระบบผู้ดูแล หน้าที่คุณแก้ไขจะแสดงค่าใหม่ และ **Logs › Admin actions** จะแสดงรายการการเปลี่ยนแปลง 3. การนำไฟล์เดิมมาใช้ซ้ำจะไม่ทำให้เกิดการเปลี่ยนแปลงใดๆ ## ขีดจำกัดและหมายเหตุ {#limits-notes} - ไฟล์นี้ครอบคลุมการตั้งค่าด้านบน ไม่รวมถึงลูกค้า เซิร์ฟเวอร์ ใบแจ้งหนี้ หรือแหล่งที่มาของโครงสร้างพื้นฐาน (การเชื่อมต่อ CloudStack และ Proxmox) ให้เชื่อมต่อสิ่งเหล่านี้ด้วย [AI Chat](https://nexcmp.com/th/docs/configure-with-ai/ai-chat-in-admin/) หรือหน้าผู้ดูแล - โซนและแผนจะถูกจับคู่โดย `slug` ห้ามเปลี่ยนชื่อสลัก (slug) ในไฟล์ เพราะจะถูกสร้างเป็นรายการใหม่ - แผนที่ลูกค้าใช้งานอยู่แล้วจะไม่สามารถเปลี่ยนขนาดได้ ให้สร้างแผนใหม่แทน - เก็บรักษาไฟล์ที่ส่งออกไว้เป็นความลับ แม้ว่าจะไม่มีข้อมูลลับก็ตาม เนื่องจากไฟล์ดังกล่าวแสดงรายการราคา ที่อยู่ และชื่อบัญชีของคุณ ## การแก้ Problme {#troubleshooting} | อาการ | สาเหตุ | วิธีแก้ปัญหา | |---|---|---| | `missing version: 1` | ไฟล์ไม่ได้เริ่มต้นด้วย `version: 1` | เพิ่มเข้าไป | | `unsupported version 2` | ไฟล์มีหมายเลขเวอร์ชันอื่น | แผงควบคุมนี้อ่านเฉพาะเวอร์ชัน 1 เท่านั้น | | `unknown section 'x' (known: ...)` | คีย์ระดับบนสุดสะกดผิดหรือไม่รองรับ | ใช้ส่วนต่างๆ ด้านบน | | `YAML error: ...` | YAML ไม่ถูกต้อง (การเยื้อง, แท็บ) | แก้ไขบรรทัดที่ข้อความระบุ | | `config is larger than 1 MB` | ไฟล์มีขนาดใหญ่เกินไป | แบ่งไฟล์แล้วใช้ `--section` | | `no API key: set NEXCMP_KEY=ak_... or run as root on the server` | คำสั่งไม่พบคีย์ | รันด้วย `sudo` หรือส่งออก `NEXCMP_KEY` และคงไว้ผ่าน sudo | | `panel not reachable` | บริการแผงควบคุมไม่ได้ทำงานอยู่บนพอร์ตเริ่มต้น | ตรวจสอบ `sudo nexcmp status` | | รายการเรียกเก็บเงินภายใต้ `skipped` | ส่วนการเรียกเก็บเงินต้องใช้ `--confirm-billing` | เพิ่มแฟล็กและตรวจสอบรายการ `$` ก่อน | | รายการภายใต้ `pending` | การเปลี่ยนแปลงต้องได้รับการยืนยัน | เปิด **API & AI agents** หรือผลลัพธ์การ Import/Export และกด **Confirm** บนบัตร | | ข้อมูลลับไม่ได้รับการอัปเดต | ไม่ได้ตั้งค่า `NEXCMP_SECRET_` จึงยังคงใช้ข้อมูลลับที่บันทึกไว้เดิม | ส่งออกตัวแปรแล้วลองใช้อีกครั้ง | | รายการภายใต้ `errors` พร้อม HTTP 403 `insufficient_scope` | คีย์ขาดสิทธิ์ (scope) สำหรับส่วนนั้น | ใช้คีย์ที่มีสิทธิ์ หรือรันในฐานะ root | | รายการภายใต้ `errors` พร้อม HTTP 403 `demo_read_only` | แผงเดโม | ใช้กับการติดตั้งจริง | --- # ตัวอย่างพรอมต์ {#example-prompts} > **ตำแหน่งในหน้าผู้ดูแลระบบ:** AI Chat (`/agent`) หรือปุ่ม **Ask AI** ที่ลอยอยู่บนหน้าผู้ดูแลระบบใดก็ได้ พรอมต์เดียวกันนี้สามารถใช้งานได้ในไคลเอ็นต์ AI ใดก็ได้ที่เชื่อมต่อผ่าน [MCP](https://nexcmp.com/th/docs/configure-with-ai/mcp-admin/) ## What it does {#what-it-does} พรอมต์เหล่านี้แสดงวิธีป้อนคำถาม แต่ละรายการจะระบุสิ่งที่ผู้ช่วยทำเบื้องหลัง สโคปที่ต้องการ (สำหรับไคลเอ็นต์ภายนอกหรือคีย์) และจุดที่คุณจะต้องอนุมัติ แทนที่ค่าตัวอย่างด้วยค่าของคุณเอง ::: tip ห้ามพิมพ์ข้อมูลลับลงในข้อความแชท สำหรับรหัสผ่าน, API key และโทเค็น ให้ใช้ฟิลด์ **Secret** ที่อยู่ข้างช่องป้อนข้อมูล AI Chat ([รายละเอียด](https://nexcmp.com/th/docs/configure-with-ai/ai-chat-in-admin/#secrets)) AI จะเห็นเพียงตัวยึดพื้นที่ที่แทนข้อมูลลับ ไม่ใช่ค่าจริง หากใช้ไคลเอ็นต์ AI ภายนอก ข้อมูลลับจะผ่านไคลเอ็นต์นั้น ดังนั้นจึงควรป้อนในระบบผู้ดูแลระบบจะดีกว่า ::: ## ตรวจสอบว่าคุณอยู่ที่ไหน {#check-where-you-are} ```text Check my setup progress and tell me the next three things to do, in order. ``` ผู้ช่วยจะเรียกใช้ `setup_checklist` และ `system_health` (สโคป `admin:read`) แล้วตอบกลับจากสถานะจริง ดู [เช็คลิสต์ความคืบหน้าในการตั้งค่า](https://nexcmp.com/th/docs/configure-with-ai/setup-checklist/) ## การตั้งค่าครั้งแรก {#first-setup} ```text Help me finish the initial setup. Go through the checklist, explain each open step in one sentence, ask me for what you need, and show me every change before it is applied. ``` ขั้นตอนนี้เหมือนกับพรอมต์ MCP `initial-setup` โดยต้องใช้ `admin:read` ร่วมกับสโคปของขั้นตอนที่คุณยอมรับ คุณจะเห็นการ์ดขอ Cยืนยันสำหรับการเปลี่ยนแปลงแต่ละรายการใน AI Chat ## เพิ่มคลัสเตอร์ Proxmox VE {#add-a-proxmox-ve-cluster} ```text I want to sell servers from my Proxmox VE cluster at https://pve.example.com:8006. Add it, test the connection, create a zone called "New York" in the US, attach the cluster to it, and then propose starter plans. ``` สิ่งที่จะเกิดขึ้น: 1. ผู้ช่วยจะขอ ID ของ API token (`user@realm!tokenid`) และรหัสลับ ให้ใส่รหัสลับลงในฟิลด์ **Secret** โดยสร้างโทเค็นที่มีสิทธิ์จำกัดก่อนที่: [Proxmox VE](https://nexcmp.com/th/docs/infrastructure/proxmox/) 2. ระบบจะเรียกใช้ `proxmox_add`, `proxmox_test`, `zone_create` และ `proxmox_attach_zone` 3. ระบบจะเสนอแผนบริการด้วย `plans_from_offerings` และรอการอนุมัติจากคุณ (ดูตัวอย่างถัดไป) สโคป: `infra:write`, `secrets:write`, `catalog:write`, `admin:read` ## สร้างตารางแผนด้วยส่วนต่างกำไร 40% {#create-a-plan-table-with-a-40-margin} ```text Suggest a starter plan table from my CloudStack offerings. My costs are $4 per vCPU per month, $2 per GB of RAM per month and $0.08 per GB of disk per month. Use a 40% margin, show me the table with cost, price per month and price per hour, and create the plans only after I approve. ``` ผู้ช่วยจะเรียกใช้ `plans_from_offerings` พร้อมกับ `margin_pct` 40 และต้นทุนของคุณ ส่วนต่างกำไรคือสัดส่วนของราคาขายที่เป็นกำไร: ที่ 40% แผนที่มีต้นทุน $60 จะขายในราคา $100 การเรียกครั้งแรกจะแสดงผลตัวอย่างเท่านั้น เมื่อคุณอนุมัติ ระบบจะเรียกใช้เครื่องมืออีกครั้งด้วย `apply=true` ซึ่งจะสร้างแผนทั้งหมดในขั้นตอนเดียวและขอการยืนยันหนึ่งครั้งเนื่องจากเกี่ยวข้องกับราคา สำหรับ Proxmox ระบบจะใช้ `backend_id` และรายการขนาดเริ่มต้น (1, 2, 2 และ 4 vCPU) สโคป: `catalog:write`, `admin:read` ดู [Plans](https://nexcmp.com/th/docs/catalog/plans/) ![คำตอบของ AI Chat ที่แสดงตารางตัวอย่างของแผนพร้อมต้นทุน, ราคาต่อเดือน และราคาต่อชั่วโมง](https://nexcmp.com/th/docs/images/configure-with-ai/example-prompts-01-plan-preview.webp) ## กำหนดค่าอีเมลและส่งข้อความทดสอบ {#configure-email-and-send-a-test-message} ```text Configure outgoing email with smtp.example.com, port 587, STARTTLS, user "mailer@example.com", sender name "Example Cloud", sender address "no-reply@example.com". Use my Secret field for the password "smtp_password". Then send a test email to admin@example.com. ``` ผู้ช่วยจะเรียกใช้ `smtp_get`, `smtp_configure` และ `smtp_test` พร้อมแจ้งให้คุณทราบว่าข้อความได้รับการยอมรับหรือไม่ สโคป: `settings:write`, `secrets:write` ดู [SMTP and e-mail templates](https://nexcmp.com/th/docs/administration/smtp-and-emails/) ## ตั้งค่า Stripe {#set-up-stripe} ```text Set up Stripe in test mode. My publishable key is pk_test_XXXX. Use the secret key and the webhook secret from my Secret field (names stripe_secret_key and stripe_webhook_secret). Then test the credentials and tell me which webhook URL I must add in Stripe. ``` `payment_configure` มักจะเป็นการดำเนินการสองขั้นตอนเสมอ: คุณจะเห็นตัวอย่างที่มีการซ่อนค่าความลับไว้และทำการอนุมัติ จากนั้น `payment_test` จะตรวจสอบข้อมูลรับรองกับ Stripe สโคป: `billing:write`, `secrets:write` เปลี่ยนเป็นโหมดใช้งานจริงหลังจากทำการชำระเงินทดสอบแล้วเท่านั้น ดู [Stripe](https://nexcmp.com/th/docs/billing/stripe/) ## เปิดใช้งานการแจ้งเตือนทาง Telegram {#turn-on-telegram-alerts} ```text Add my Telegram chat 123456789 for admin alerts. The bot token is in my Secret field as telegram_bot_token. Send a test message. ``` ผู้ช่วยจะเรียกใช้ `telegram_configure` และ `telegram_test` สโคป: `settings:write`, `secrets:write` ดู [Telegram notifications](https://nexcmp.com/th/docs/administration/telegram-notifications/) ## ค้นหาลูกค้าและเพิ่มเครดิต {#find-a-customer-and-add-credit} ```text Find the customer with e-mail customer@example.com, show me their balance and servers, and add $10.00 of credit because of the outage on Monday. ``` ผู้ช่วยจะเรียกใช้ `customers_search` และ `customer_get` (แบบอ่านอย่างเดียว) จากนั้นเรียกใช้ `customer_adjust_balance` พร้อมกับ `delta_cents` 1000 และเหตุผล ขั้นตอนนี้ **จำเป็นต้อง** ได้รับการอนุมัติจากคุณเสมอ: การ์ดการยืนยันจะระบุว่า "เปลี่ยนแปลงยอดเงินของลูกค้า" พร้อมแสดงจำนวนเงินและเหตุผลที่จะถูกบันทึกในบันทึกการตรวจสอบ (audit log) สโคป: `admin:read`, `billing:write` ## ส่งออกการกำหนดค่าของฉัน {#export-my-configuration} ```text Export my whole configuration as YAML. Do not include secrets. Then tell me which settings differ from a typical new installation. ``` ผู้ช่วยจะเรียกใช้ `config_export` ข้อมูลลับจะถูกแทนที่ด้วยข้อมูลอ้างอิง `secret://` บันทึกผลลัพธ์เป็น `nexcmp.yaml` และเก็บไว้ในระบบควบคุมเวอร์ชัน ดู [Configuration as code](https://nexcmp.com/th/docs/configure-with-ai/config-as-code/) สโคป: `admin:read` ## เขียนพรอมต์ที่ดี {#write-good-prompts} - ระบุเป้าหมายและข้อมูลจริง เช่น ชื่อ ราคา และอีเมล อย่าใส่ข้อมูลลับ - ขอตัวดูก่อนเสมอกับสิ่งที่มีค่าใช้จ่ายหรือลบข้อมูล - ขอให้ผู้ช่วย "อ่านค่าปัจจุบันก่อนเปลี่ยนแปลง" ซึ่งคำสั่งในระบบมีระบุไว้แล้ว - หากคำตอบดูไม่ถูกต้อง ให้ถามว่า "คุณเรียกใช้เครื่องมือใดและใช้พารามิเตอร์อะไร?" ซึ่งการ์ดเครื่องมือใน AI Chat จะแสดงทั้งสองอย่าง ## การแก้ Problme {#troubleshooting} | อาการ | สาเหตุ | วิธีแก้ปัญหา | |---|---|---| | ผู้ช่วยแจ้งว่าไม่มีเครื่องมือสำหรับบางสิ่ง | สิทธิ์สำหรับเครื่องมือดังกล่าวไม่ได้รับอนุญาต หรือการดำเนินการถูกปิดกั้นสำหรับ AI | ตรวจสอบ [Admin API keys](https://nexcmp.com/th/docs/configure-with-ai/admin-api-keys/#what-a-key-can-never-do) หรือดำเนินการในหน้าผู้ดูแลระบบ | | ระบบขอให้คุณวางรหัสผ่าน | โมเดลไม่สนใจคำสั่ง | ปฏิเสธ ใช้ฟิลด์ Secret หรือป้อนค่าในหน้าผู้ดูแลระบบ | | ไม่มีการเปลี่ยนแปลงหลังจากกด "ทำเลย" | การเปลี่ยนแปลงกำลังรอการยืนยันของคุณ | เลื่อนไปยังการ์ด confirmation และกด **Confirm** | | แผนถูกสร้างขึ้นด้วยราคาที่คุณไม่ได้คาดคิด | ต้นทุนหรือกำไรในพรอมต์ไม่ถูกต้อง | แก้ไขแผนในหน้า Plans หรือขอให้ผู้ช่วยกำหนดราคาใหม่ โดยการเปลี่ยนแปลงราคาจะต้องมีการยืนยัน | --- # รายการตรวจสอบความคืบหน้าการตั้งค่า {#setup-progress-checklist} > **ตำแหน่งในหน้าผู้ดูแลระบบ:** Overview › Dashboard (`/`) และการ์ด **Setup progress** ที่ด้านบน รายการที่ว่างเปล่าในหน้า Plans, Customers, Zones, Payments และ Infrastructure จะแสดงความช่วยเหลือเดียวกันนี้ ## What it does {#what-it-does} การติดตั้งใหม่ต้องดำเนินการสิบรายการก่อนที่ลูกค้ารายแรกจะสามารถสั่งซื้อและชำระเงินได้ การ์ด **Setup progress** จะตรวจสอบรายการเหล่านี้ให้คุณจากค่าคอนฟิกจริง แสดงจำนวนที่เสร็จสิ้น ระบุ **ขั้นตอนถัดไป** และลิงก์ไปยังหน้าที่ต้องดำเนินการ หากคุณเชื่อมต่อแหล่งข้อมูล AI ไว้ **Do it for me** จะเปิด [AI assistant](https://nexcmp.com/th/docs/configure-with-ai/ai-chat-in-admin/) พร้อมคำถามที่เตรียมไว้สำหรับขั้นตอนนี้ ผู้ช่วย (รวมถึงไคลเอนต์ AI ใดๆ ผ่าน [MCP](https://nexcmp.com/th/docs/configure-with-ai/mcp-admin/)) สามารถอ่านรายการเดียวกันนี้ได้ด้วยเครื่องมือ `setup_checklist` ## สิบขั้นตอน {#the-ten-steps} | # | ขั้นตอน | นับว่าเสร็จสิ้นเมื่อ | สถานที่ดำเนินการ | |---|---|---|---| | 1 | เปิดใช้งานไลเซนส์แล้ว | เปิดใช้งานไลเซนส์สำหรับโดเมนของคุณแล้ว | System › Admin › License & updates (`/license`) ดูเพิ่มเติมที่ [License and purchase](https://nexcmp.com/th/docs/getting-started/license-and-purchase/) | | 2 | เชื่อมต่อแหล่งข้อมูลโครงสร้างพื้นฐาน | เชื่อมต่อ CloudStack แล้ว หรือเพิ่มอย่างน้อยหนึ่ง Proxmox VE คลัสเตอร์แล้ว | Infrastructure › Cloud provider › Providers (`/infra/providers`) ดูเพิ่มเติมที่ [CloudStack](https://nexcmp.com/th/docs/infrastructure/cloudstack/) และ [Proxmox VE](https://nexcmp.com/th/docs/infrastructure/proxmox/) | | 3 | สร้างโซน | มีโซนอย่างน้อยหนึ่งโซน | Infrastructure › Datacenter › Zone (`/infra/zones`) ดูเพิ่มเติมที่ [Zones](https://nexcmp.com/th/docs/infrastructure/zones/) | | 4 | เทมเพลต OS | เปิดใช้งานเทมเพลตอย่างน้อยหนึ่งรายการ | Services › Virtual Machines › Plans & pricing, แท็บ Templates (`/vm/catalog?tab=templates`) ดูเพิ่มเติมที่ [OS templates](https://nexcmp.com/th/docs/infrastructure/templates/) | | 5 | สร้างแผน | เปิดใช้งานแผนอย่างน้อยหนึ่งแผน | Services › Virtual Machines › Plans & pricing (`/vm/catalog`) ดูเพิ่มเติมที่ [Plans and pricing](https://nexcmp.com/th/docs/catalog/plans/) | | 6 | ตั้งค่าการชำระเงิน | กำหนดค่า Stripe, PayPal, คริปโต หรือการโอนเงินผ่านธนาคารแล้ว | Finance › Payment channels (`/payments`). ดูที่ [Payment channels](https://nexcmp.com/th/docs/billing/payment-channels/) | | 7 | Email (SMTP) | ตั้งค่าอีเมลขาออกเรียบร้อยแล้ว | System › Settings › Email (`/settings/email`). ดูที่ [SMTP and e-mail templates](https://nexcmp.com/th/docs/administration/smtp-and-emails/) | | 8 | การสร้างแบรนด์ | อัปโหลดโลโก้แล้ว หรือมีการเปลี่ยนชื่อแบรนด์จากค่าเริ่มต้น | System › Settings › Brand (`/settings/branding`). ดูที่ [Branding](https://nexcmp.com/th/docs/customers/branding/) | | 9 | ข้อกำหนดและนโยบายความเป็นส่วนตัว | กรอกข้อมูลทางกฎหมายอย่างน้อยหนึ่งรายการแล้ว | System › Settings › Legal (`/settings/legal`). ดูที่ [Legal pages](https://nexcmp.com/th/docs/customers/legal/) | | 10 | สร้างคำสั่งซื้อทดสอบ | มีคำสั่งซื้ออย่างน้อยหนึ่งรายการแล้ว | สร้างคำสั่งซื้อในฐานะลูกค้าบนพอร์ทัลลูกค้าเพื่อตรวจสอบว่าทุกอย่างทำงานได้ครบถ้วน การ์ดนี้จะลิงก์ไปยังหน้า Billing (`/billing`) | การ์ดจะแสดง `done/total` (เช่น 6/10) แถบความคืบหน้า ขั้นตอนถัดไปพร้อมปุ่ม **Open** และเมื่อเชื่อมต่อแหล่งข้อมูล AI ไว้ จะแสดงปุ่ม **Do it for me** ด้วย คลิกที่ขั้นตอนเพื่อข้ามไปยังหน้านั้นๆ ถัดจากแต่ละขั้นตอนจะมีลิงก์ขนาดเล็กเพื่อเปิดหน้าเอกสารที่เกี่ยวข้อง และบางขั้นตอนอาจแสดงรายละเอียดเช่น "2 zone(s)" ด้วย ![การ์ดความคืบหน้าการตั้งค่าบนหน้า Overview โดยทำไปแล้วสามจากสิบขั้นตอน พร้อมปุ่ม Open และ Do it for me](https://nexcmp.com/th/docs/images/configure-with-ai/setup-checklist-01-card.webp) ## วิธีใช้งาน {#use-it} 1. เปิดหน้า Overview การ์ดนี้จะอยู่ด้านบนสุด ใช้ลูกศรเพื่อย่อการ์ดได้ โดยแผงควบคุมจะจดจำตัวเลือกของคุณไว้ในเบราว์เซอร์ 2. คลิก **Open** เพื่อไปยังหน้าของขั้นตอนถัดไป หรือคลิก **Do it for me** 3. เมื่อใช้ **Do it for me** ผู้ช่วยจะเปิดขึ้นมาพร้อมคำขอ เช่น "Suggest a starter plan table from my offerings with a 40% margin, show me the preview before creating it." ตอบคำถามจากนั้นตรวจสอบและ **Confirm** แต่ละการ์ด ดูข้อมูลเพิ่มเติมที่ [AI Chat in the admin](https://nexcmp.com/th/docs/configure-with-ai/ai-chat-in-admin/) 4. เมื่อทำครบทั้งสิบขั้นตอนแล้ว การ์ดนี้จะหายไป ### รายการที่ว่างเปล่า {#empty-lists} เมื่อหน้า Plans, Customers, Zones, Payments หรือ Infrastructure ว่างเปล่า หน้าเว็บจะแสดงบล็อก **Next step** พร้อมคำอธิบาย ปุ่มสำหรับดำเนินการ ปุ่ม **Do it for me** และลิงก์ไปยังคู่มือเอกสาร เพื่อให้คุณไม่พบเจอกับตารางว่างเปล่า ![หน้า Plans ที่ว่างเปล่าพร้อมคำอธิบายขั้นตอนถัดไปและปุ่ม Do it for me](https://nexcmp.com/th/docs/images/configure-with-ai/setup-checklist-02-empty.webp) ## ขอความช่วยเหลือด้วยภาษาของคุณเอง {#ask-for-it-in-your-own-words} คุณไม่จำเป็นต้องใช้การ์ดนี้ ใน AI Chat หรือไคลเอนต์ AI ที่เชื่อมต่ออยู่ คุณสามารถถามว่า: ```text Check my setup progress and take me through the open steps, one at a time. ``` นี่คือพรอมต์ MCP แบบ `initial-setup` ด้วย ผู้ช่วยจะเรียกใช้ `setup_checklist` อธิบายว่าเหตุใดแต่ละขั้นตอนที่เปิดอยู่จึงสำคัญ สอบถามข้อมูลที่จำเป็น และใช้เครื่องมือที่ตรงกัน ขอบเขตที่ต้องใช้: `admin:read` เพื่ออ่านรายการ รวมถึงขอบเขตของขั้นตอนที่คุณต้องการทำ ดูข้อมูลเพิ่มเติมที่ [Example prompts](https://nexcmp.com/th/docs/configure-with-ai/example-prompts/) ## ตรวจสอบ {#verify} 1. หลังจากที่คุณทำขั้นตอนหนึ่งเสร็จแล้ว ตัวนับในการ์ดจะเพิ่มขึ้นเมื่อหน้า Overview โหลดใหม่อีกครั้ง 2. ใน AI ชาต์ `setup_checklist` จะคืนค่าตัวเลขเดิม พร้อมกับ `done: true` บนขั้นตอนที่เสร็จสมบูรณ์แล้ว ## ขีดจำกัดและหมายเหตุ {#limits-notes} - การตรวจสอบจะดูจากสิ่งที่บันทึกไว้ ไม่ใช่ว่าใช้งานได้จริงหรือไม่ เกตเวย์ที่กำหนดค่าไว้จะนับว่าเสร็จสิ้นแม้ว่าการทดสอบจะล้มเหลวก็ตาม ให้ใช้ปุ่ม **Test** ในแต่ละหน้า และใช้เครื่องมือ `system_health` เมื่อเกิดปัญหา - การ์ดนี้มีไว้สำหรับผู้ดูแลระบบเท่านั้น - ปุ่ม **Do it for me** ต้องมีการเชื่อมต่อแหล่งข้อมูล AI ภายใต้ System › Settings › AI accounts หากไม่มีจะแสดงเฉพาะปุ่ม **Open** เท่านั้น - สิบขั้นตอนเหล่านี้จะเหมือนกันสำหรับทุกการติดตั้ง ขั้นตอนที่คุณไม่ได้วางแผนจะใช้งาน (เช่น การชำระเงินบนคลาวด์ส่วนตัว) จะยังคงถูกนับว่าเปิดอยู่ ## การแก้ Problme {#troubleshooting} | อาการ | สาเหตุ | วิธีแก้ปัญหา | |---|---|---| | การ์ดหายไป | ทำครบทั้งสิบขั้นตอนแล้ว หรือไม่สามารถโหลดการ์ดได้ | โหลดหน้า Overview ใหม่ สอบถาม `setup_checklist` ใน AI Chat เพื่อดูสถานะ | | ขั้นตอนยังคงค้างว่าเปิดอยู่หลังจากที่คุณทำเสร็จแล้ว | การบันทึกไม่สำเร็จ หรือยังไม่เป็นไปตามเงื่อนไข (เช่น มีเทมเพลตอยู่แล้วแต่ถูกปิดใช้งาน) | เปิดหน้าของขั้นตอนนั้นแล้วตรวจสอบตารางด้านบน | | การสร้างแบรนด์ยังคงเปิดอยู่หลังจากเปลี่ยนโลโก้ | ระบบนับการสร้างแบรนด์เมื่อมีโลโก้หรือชื่อแบรนด์ต่างจากค่าเริ่มต้น "NexCMP" | อัปโหลดโลโก้หรือตั้งค่าชื่อของคุณเอง | | **Do it for me** ไม่ทำงาน | ยังไม่ได้เชื่อมต่อแหล่งข้อมูล AI หรืออยู่ในโหมดเดโม | เชื่อมต่อแหล่งข้อมูลในบัญชี AI | --- # SMTP และเทมเพลตอีเมล {#smtp-and-e-mail-templates} > **ตำแหน่งในหน้าผู้ดูแลระบบ:** System › Settings › Email (`/settings/email`) — แท็บ **SMTP** และ **Email templates** บันทึกการจัดส่ง: Overview › Support › Sent emails (`/support/emails`) ## What it does {#what-it-does} NexCMP จะส่งอีเมลสำหรับการยืนยันการสมัครใช้งาน, การรีเซ็ตรหัสผ่าน, "VM ready" (พร้อมรหัสผ่านเริ่มต้น), ใบแจ้งหนี้, ยอดเงินคงเหลือต่ำ, การต่ออายุ, การเติมเงิน, การตอบกลับฝ่ายสนับสนุน และอื่นๆ ทั้งหมดนี้จะส่งผ่าน **1 บัญชี SMTP ที่คุณระบุ** ข้อความและเทมเพลตมีให้บริการใน 16 ภาษา โดยจะใช้ภาษาตามลูกค้า ## ข้อกำหนด {#requirements} | Item | Requirement | |---|---| | เซิร์ฟเวอร์ SMTP | โฮสต์, พอร์ต และข้อมูลรับรองของPดรวายเดอร์ใดๆ (เซิร์ฟเวอร์ของคุณเอง, Brevo, Amazon SES, Mailgun, Google Workspace …) | | Network | TCP ขาออกจากเซิร์ฟเวอร์ NexCMP ไปยังโฮสต์และพอร์ต SMTP (587 STARTTLS, 465 TLS หรือ 25) | | โดเมนผู้ส่ง | โดเมนที่คุณควบคุม โดยเผยแพร่ **SPF และ DKIM** สำหรับผู้ให้บริการ พร้อมด้วยระเบียน DMARC | | สิทธิ์ | บัญชี SMTP ต้องได้รับอนุญาตให้ส่งในฐานะที่อยู่ **From** | ::: warning ความสามารถในการส่งถึงผู้รับ อีเมลอย่างเช่น "VM ready" จะมีรหัสผ่านรวมอยู่ด้วย หาก SPF/DKIM/DMARC ของโดเมนผู้ส่งไม่ตรงกับผู้ให้บริการ SMTP อีเมลจะตกเป็นสแปม หน้าเว็บนี้จะแจ้งเตือนคุณถึงเรื่องดังกล่าว ::: ## เตรียมผู้ให้บริการอีเมล {#prepare-the-e-mail-provider} 1. ในแผงควบคุมของผู้ให้บริการ ให้เพิ่มและยืนยันโดเมนการส่งของคุณ (ตัวอย่างเช่น `example.com`) 2. เผยแพร่ระเบียน DNS แบบ SPF, DKIM และ DMARC ที่ผู้ให้บริการแสดงขึ้นมา 3. สร้างผู้ใช้ SMTP (หรือคีย์ API-SMTP) และจดบันทึกโฮสต์, พอร์ต, ชื่อผู้ใช้ และรหัสผ่าน ## เชื่อมต่อใน NexCMP {#connect-in-nexcmp} 1. เปิด **System › Settings › Email** ไปที่แท็บ **SMTP** 2. กรอกข้อมูลในฟอร์ม: | ฟิลด์ | ตัวอย่าง | หมายเหตุ | |---|---|---| | โฮสต์ | `smtp.example.net` | เซิร์ฟเวอร์ SMTP | | Port | `587` | | | ความปลอดภัย | STARTTLS (587) | เลือกโหมดที่ผู้ให้บริการของคุณกำหนด | | ชื่อผู้ใช้ | `smtp-user` | | | รหัสผ่าน | (ซ่อนอยู่) | เขียนได้อย่างเดียว: หน้าเว็บจะแสดงเฉพาะว่ามีการตั้งค่าไว้แล้วหรือไม่ | | อีเมลผู้ส่ง | `no-reply@example.com` | ต้องได้รับอนุญาตที่ผู้ให้บริการ | | ชื่อผู้ส่ง | `Example Cloud` | ใช้ชื่อแบรนด์ของคุณเป็นค่าเริ่มต้น | | ตอบกลับไปที่ (ไม่บังคับ) | `support@example.com` | ตำแหน่งที่การตอบกลับของลูกค้าจะถูกส่งไป | ![แท็บ SMTP ของหน้า Settings, Email ที่แสดงโฮสต์, พอร์ต, ความปลอดภัย, ชื่อผู้ใช้, ฟิลด์ผู้ส่ง และปุ่ม Send test](https://nexcmp.com/th/docs/images/administration/smtp-and-emails-01-smtp.webp) 3. คลิก **Save** จากนั้นคลิก **Send test** และป้อนที่อยู่ของคุณเอง การตั้งค่าจะถูกเก็บไว้ในไฟล์ที่จำกัดสิทธิ์การเข้าถึง (`smtp.json`, โหมด 0600) และมีเพียงแบ็กกราวด์เวิร์กเกอร์ `nexcmp-vmd` เท่านั้นที่ส่งเมล ส่วนเว็บเซอร์วิสทำหน้าที่เพียงคิวข้อความไว้ ## ตรวจสอบ {#verify} - ข้อความทดสอบจะมาถึงในกล่องขาเข้า (ให้ตรวจสอบในโฟลเดอร์สแปมด้วยเช่นกัน) ในแหล่งที่มาของข้อความ ให้ยืนยัน `dkim=pass` และ `spf=pass` - เปิด **Support › Sent emails**: ข้อความแต่ละรายการจะมีสถานะ (อยู่ในคิว, ส่งแล้ว, ล้มเหลว) และผลลัพธ์การจัดส่ง ข้อความที่ล้มเหลวจะถูกลองส่งใหม่อีกครั้งสูงสุด 3 ครั้ง - ลงทะเบียนลูกค้าทดสอบในพอร์ทัลและยืนยันว่าอีเมลยืนยันส่งมาถึง ## แก้ไขเทมเพลตอีเมล {#edit-e-mail-templates} แท็บ **Email templates** จะแสดงเทมเพลตทั้งหมดตามคีย์ พร้อมด้วยภาษาที่มีอยู่ (ตัวอย่างเช่น `verify_email`, `reset_password`, `vm_ready`, `invoice_paid`, `low_balance`, `topup_received`, `ticket_reply`, `scale_up` …) 1. คลิกที่เทมเพลตและเลือกภาษา 2. แก้ไขหัวข้อและเนื้อหา ตัวแปรแทนที่จะถูกเติมข้อมูลเมื่อข้อความถูกนำเข้าคิว 3. บันทึก การเปลี่ยนแปลงจะมีผล**ทันที**กับข้อความที่ถูกเข้าคิวหลังจากนั้น ![แท็บ Email templates แสดงรายการคีย์เทมเพลตและภาษาต่างๆ](https://nexcmp.com/th/docs/images/administration/smtp-and-emails-02-templates.webp) ## ข้อจำกัดและหมายเหตุ {#limits-and-notes} - หนึ่งบัญชี SMTP ต่อการติดตั้งหนึ่งชุด ลูกค้าของรีเซลเลอร์จะได้รับอีเมลผ่านบัญชีเดียวกัน เว้นแต่จะมีการกำหนดค่ารีเซลเลอร์ไว้เป็นอย่างอื่น - ขีดจำกัดการส่งของผู้ให้บริการจะมีผลบังคับใช้ โดย NexCMP จะไม่มีการจำกัดความเร็วเพิ่มเติม นอกจากการลองส่งใหม่ - หากไม่มี SMTP แผงควบคุมจะยังคงทำงานได้ แต่ลูกค้าจะไม่สามารถทำการยืนยันการสมัครใช้งานและรีเซ็ตรหัสผ่านให้เสร็จสิ้นได้ ## การแก้ Problme {#troubleshooting} | อาการ | สาเหตุ | วิธีแก้ปัญหา | |---|---|---| | อีเมลทดสอบไม่เคยมาถึง | ข้อมูลรับรองไม่ถูกต้อง, พอร์ตถูกบล็อก, ผู้ส่งไม่ได้รับอนุญาต | ตรวจสอบ `journalctl -u nexcmp-vmd` เพื่อดูข้อผิดพลาดของ SMTP; ลองใช้พอร์ต 587 พร้อม STARTTLS; ตรวจสอบที่อยู่ From กับผู้ให้บริการ | | ข้อความถูกส่งไปยังโฟลเดอร์สแปม | ขาดระเบียน SPF/DKIM/DMARC หรือกำหนดค่าไม่ถูกต้อง | เผยแพร่ระเบียนของผู้ให้บริการและส่งจากโดเมนนั้น | | "failed" ใน Sent emails | ผู้ให้บริการปฏิเสธข้อความ | เปิดแถวเพื่อดูการตอบกลับของผู้ให้บริการ | | ช่องรหัสผ่านดูเหมือนว่างเปล่าหลังจากบันทึก | ตามการออกแบบ (เขียนได้เท่านั้น) | ป้ายกำกับจะแสดง "current: set" เมื่อมีการจัดเก็บรหัสผ่านแล้ว | --- # Telegram และการแจ้งเตือนผู้ดูแลระบบ {#telegram-and-admin-alerts} > **ตำแหน่งในหน้าผู้ดูแลระบบ:** System › Settings › Admin alerts (`/settings/alerts`) ทางลัดการสนับสนุน: Customers › Support › Tickets (`/support/tickets`), แท็บ **Settings** ## What it does {#what-it-does} NexCMP จะแจ้งเตือน**คุณ** ซึ่งเป็นผู้ดูแลระบบ เมื่อมีบางสิ่งที่ต้องให้ความสนใจ และเมื่อมีลูกค้าสมัครใช้งานหรือมีการเติมเงินเข้ามา การแจ้งเตือนจะถูกส่งไปยัง**ช่องทาง**หนึ่งหรือหลายช่องทาง ได้แก่ Telegram, เว็บฮุก หรืออีเมล เหตุการณ์ที่ส่งไปยังช่องทางของผู้ดูแลระบบประกอบด้วย: การปรับใช้ล้มเหลว, VM หายไป,เครือข่ายล่ม, IP ว่างเหลือน้อยกว่า 30, รายการที่กำลังจะหมดอายุ (เตือนล่วงหน้า 1 ชั่วโมง), ข้อพิพาท Stripe, เวิร์กเกอร์หยุดทำงาน, RAM ของคลัสเตอร์เกินเกณฑ์ที่กำหนด, การสมัครใช้งานของลูกค้าใหม่ และการเติมเงินสำเร็จ เหตุการณ์ของลูกค้าจะถูกเข้าคิวไว้อย่างทนทานและลองส่งใหม่ด้วยหน่วงเวลาที่เพิ่มขึ้น (30 วินาทีสูงสุด 1 ชั่วโมง) จนกว่า Telegram จะยอมรับ ## ข้อกำหนด {#requirements} | Item | Requirement | |---|---| | Telegram | บอทที่สร้างขึ้นด้วย **@BotFather** (โทเค็น) และ **chat ID** ของกลุ่มหรือผู้ใช้ที่จะรับข้อความ | | Network | HTTPS ขาออกไปยัง `api.telegram.org` | | Webhook (ทางเลือก) | ปลายทาง HTTPS ที่ยอมรับเพย์โหลดการแจ้งเตือน | ## เตรียม Telegram {#prepare-telegram} 1. ใน Telegram เปิด **@BotFather**, ส่ง `/newbot`, เลือกชื่อ จากนั้นคัดลอก **bot token** (`123456789:AA...`) 2. สร้างกลุ่ม เพิ่มบอทเข้าไปในกลุ่ม และส่งข้อความใดก็ได้ 3. หาค่า **chat ID**: เปิด `https://api.telegram.org/bot/getUpdates` ในเบราว์เซอร์และอ่านค่า `chat.id` (ไอดีกลุ่มจะขึ้นต้นด้วย `-`) ## เชื่อมต่อใน NexCMP {#connect-in-nexcmp} 1. เปิด **System › Settings › Admin alerts** 2. ใน **Add channel** ให้เลือก **Type: Telegram**, ตั้งค่า **Destination** เป็น chat ID และ **Secret (bot token)** เป็นโทเค็น แล้วคลิก **Add** 3. โปรดตรวจสอบให้แน่ใจว่าสวิตช์เปิดปิด **Send admin Telegram (VM module)** เปิดอยู่ โดยบรรทัด *VM module status (read-only)* จะแสดงคำว่า "on" ![หน้า Admin alerts ที่ตั้งค่าฟอร์ม Add channel เป็น Telegram](https://nexcmp.com/th/docs/images/administration/telegram-notifications-01-channel.webp) ## ตรวจสอบ {#verify} ช่องทางดังกล่าวจะแสดงขึ้นภายใต้ **Configured channels** ให้ทด 1 เหตุการณ์ (เช่น ลงทะเบียนลูกค้าทดสอบ) แล้วข้อความจะเข้ามาในกลุ่ม หากไม่มีการกำหนดค่าช่องทาง หน้าเว็บจะแจ้งเตือนว่า "Without a channel, attacks will go unnoticed" และในบันทึกเหตุการณ์ (log) เหตุการณ์ของ Telegram จะถูกบันทึกไว้ในเครื่องเท่านั้น ## ทางลัดซัพพอร์ตสำหรับลูกค้า {#support-shortcuts-for-customers} วิดเจ็ตซัพพอร์ตลูกค้าสามารถแสดงปุ่ม **Telegram** และ **Zalo** ได้ ปุ่มเหล่านี้จะถูกซ่อนไว้จนกว่าจะตั้งค่าในตั้งค่าซัพพอร์ต: ใส่ลิงก์ `https://t.me/...` สำหรับ Telegram และลิงก์หรือ QR ของ Zalo ยอมรับเฉพาะลิงก์ `https://` เท่านั้น แชทซัพพอร์ตยังสามารถแจ้งเตือนกลุ่ม Telegram ของคุณด้วยคำถามและร่างคำตอบได้ — ดูที่ [AI Chat](https://nexcmp.com/th/docs/ai/ai-chat/) ## ข้อจำกัดและหมายเหตุ {#limits-and-notes} - โทเค็นของบอทจะถูกจัดเก็บไว้กับช่องทางและจะไม่แสดงอีกเลย - เหตุการณ์ของ Telegram จะใช้ช่องทาง Telegram ที่เปิดใช้งานช่องทางแรกที่มีทั้งปลายทางและโทเค็น ## การแก้ Problme {#troubleshooting} | อาการ | สาเหตุ | วิธีแก้ปัญหา | |---|---|---| | ไม่มีข้อความส่งมา | Chat ID ไม่ถูกต้อง บอทยังไม่ได้อยู่ในกลุ่ม หรือไม่เคยส่งข้อความหาบอทมาก่อน | ตรวจสอบไอดีอีกครั้งด้วย `getUpdates` ส่งข้อความหาบอทหรือกลุ่มก่อน | | ทำงานได้สักพักแล้วหยุดไป | โทเค็นถูกเพิกถอนใน BotFather | สร้างโทเค็นใหม่และอัปเดตช่องทาง | | `Telegram: no channel` ในบันทึกเหตุการณ์ | ไม่มีช่องทาง Telegram ที่เปิดใช้งาน | เพิ่มช่องทางตามขั้นตอนด้านบน | --- # บันทึกการตรวจสอบและกิจกรรม {#audit-log-and-activity} > **ตำแหน่งในหน้าผู้ดูแลระบบ:** System › Logs › Activity (`/logs`), Admin actions (`/logs/admin`), Console (`/logs/console`), Login (`/logs/logins`), VM events (`/logs/vm-events`); Overview › Support › Sent emails NexCMP บันทึกการกระทำที่สำคัญทุกรายการ ใช้หน้า **Activity** เป็นไทม์ไลน์เดียว และใช้แท็บอื่นๆ เพื่อจำกัดขอบเขตให้แคบลง ## แท็บ {#tabs} | แท็บ | เนื้อหา | |---|---| | **Activity** | ไทม์ไลน์รวมทุกแหล่งที่มา: การดำเนินการของผู้ดูแลระบบ, เหตุการณ์ VM, การเข้าสู่ระบบ, ระบบแนะนำเพื่อน (Affiliate) และข้อผิดพลาดของระบบ | | **Admin actions** | สิ่งที่ผู้ดูแลระบบเปลี่ยนแปลง (เช่น `customer.block`, `customer.delete`) พร้อมด้วย IP ของผู้ดูแลระบบ | | **Console** | การเข้าสู่ระบบ Admin console และคำขอของระบบ เช่น คำขออัปเดต | | **Login** | การเข้าสู่ระบบของลูกค้าและความล้มเหลวในการเข้าสู่ระบบ | | **VM events** | ขั้นตอนการปรับใช้, การสร้าง, รหัสผ่าน, การทำลาย และเหตุการณ์วงจรชีวิตอื่นๆ ต่อเครื่องเสมือน | ## การอ่านแถวข้อมูล {#reading-a-row} คอลัมน์: **Time**, **Source**, **Level**, **Actor** (ผู้ทำ), **Target**, **Services**, **Action** (รหัสเหตุการณ์เช่น `customer.delete`) และ **Details** คลิก **Open** เพื่อดูบันทึกฉบับเต็ม ![หน้า Activity พร้อมตัวกรอง source, site และ service เหนือไทม์ไลน์](https://nexcmp.com/th/docs/images/administration/audit-log-01-activity.webp) ## กรองและค้นหา {#filter-and-search} 1. เลือก **source**, **site** และ **service** จากเมนูดรอปดาวน์ 2. กำหนดช่วงเวลาของ **From date** / **To date** 3. พิมพ์รหัสอีเวนต์ (ตัวอย่างเช่น `customer.block` หรือ `destroy`) ในช่องค้นหา — การค้นหากิจกรรมจะตรงกับรหัสอีเวนต์นั้น ## การเก็บรักษาข้อมูลและการส่งออก {#retention-and-exports} บันทึกข้อมูลจะจัดเก็บอยู่ในฐานข้อมูล NexCMP ใน `/var/lib/nexcmp` และรวมอยู่ในการ [Backups](https://nexcmp.com/th/docs/getting-started/backup-and-restore/) ระยะเวลาการเก็บรักษาขึ้นอยู่กับประเภทบันทึก: ประวัติความพยายามเข้าสู่ระบบของลูกค้าที่เก่ากว่า 180 วัน และบันทึกคำขอ API-key ของลูกค้าที่เก่ากว่า 60 วันจะถูกล้างข้อมูล การตรวจสอบ API-key ของผู้ดูแลระบบจะเก็บข้อมูลล่าสุดไว้ประมาณ 200,000 รายการ ขีดจำกัดเหล่านี้ไม่ได้หมายความว่าจะใช้ระยะเวลาเก็บรักษาเดียวกันสำหรับไทม์ไลน์กิจกรรมแบบรวม ## การใช้งานทั่วไป {#common-uses} | คำถาม | ตำแหน่งที่ค้นหา | |---|---| | ใครเป็นผู้ระงับลูกค้ารายนี้ | การดำเนินการของผู้ดูแลระบบ, ค้นหา `customer.block` | | เหตุใด VM จึงหายไป | อีเวนต์ของ VM, กรองด้วย ID ของ VM; รวมถึง Activity | | ลูกค้าได้รับอีเมลหรือไม่ | Overview › Support › Sent emails | | มีการร้องขอการอัปเดตล่าสุดเมื่อใด | แท็บ Console | --- # ความปลอดภัย {#security} > **ตำแหน่งในหน้าผู้ดูแลระบบ:** System › Admin › Console security (`/account`), Admin users (`/users`); System › Settings › Customer logins (`/settings/login`) ## คอนโซลผู้ดูแล {#admin-console} ### การยืนยันตัวตนแบบสองขั้นตอน (TOTP) {#two-factor-authentication-totp} คอนโซลสามารถเข้าถึงได้จากอินเทอร์เน็ต ดังนั้นโปรดเปิดใช้งาน TOTP 1. เปิด **System › Admin › Console security** 2. ภายใต้หัวข้อ **Two-factor authentication (TOTP)** ให้คลิก **Start setup** 3. สแกน QR code ด้วย Google Authenticator, Authy, 1Password หรือ Bitwarden จากนั้นป้อนรหัส 6 หลัก ### ช่วง IP ของคอนโซลที่ได้รับอนุญาต {#allowed-console-ip-ranges} ภายใต้ **Allowed console IP ranges** ให้ป้อนหนึ่ง IP หรือ CIDR (IPv4 หรือ IPv6) ต่อบรรทัด **หากเว้นว่างไว้จะหมายถึงจากทุกที่** นอกเหนือจากช่วงดังกล่าว ทั้งการเข้าสู่ระบบและ Admin API จะถูกบล็อก ::: warning ระวังการถูกล็อกออกจากระบบ หน้านี้จะแสดง IP ปัจจุบันของคุณและกำหนดให้รายการใหม่ต้องรวม IP นี้ด้วย ให้ใช้ **+ Add my IP** หากคุณถูกล็อกออกจากระบบ ให้ใช้ [emergency access](https://nexcmp.com/th/docs/getting-started/cli-reference/#emergency-access) จากเซิร์ฟเวอร์ ::: ### เปลี่ยนรหัสผ่าน {#change-password} กรอก **Current password**, **New password** และ **Confirm new password** ใช้รหัสผ่านที่คาดเดายากและไม่ซ้ำใคร (12 ตัวอักษรขึ้นไป ตัวติดตั้งกำหนดให้ผู้ดูแลระบบคนแรกต้องใช้ 12 ตัวอักษร) ### บัญชีผู้ดูแลระบบและบทบาท {#administrator-accounts-and-roles} เปิด **System › Admin › Admin users** และใช้ **+ Create account** | บทบาท | สิทธิ์การเข้าถึง | |---|---| | `admin` | เข้าถึง Admin API ได้อย่างเต็มรูปแบบ | | `staff` | ดูได้อย่างเดียวทั่วทั้งระบบ | | `user` | ดูทรัพยากรของลูกค้ารายเดียวได้แบบอ่านอย่างเดียว | บัญชี root คือบัญชีที่สร้างขึ้นใน [setup wizard](https://nexcmp.com/th/docs/getting-started/setup-wizard/) การดำเนินการแถว: **Edit**, **Reset PW**, **Key**, **Delete** รหัสผ่านจะถูกจัดเก็บในรูปแบบแฮชที่มี salt การเปลี่ยนแปลงหรือล็อกบัญชีจะสิ้นสุดเซสชันนั้นทันที ## การเข้าสู่ระบบของลูกค้า {#customer-sign-in} เปิด **System › Settings › Customer logins** | การตั้งค่า | What it does | |---|---| | **Google sign-in** | เปิดใช้งาน จากนั้นป้อน OAuth client ID และ secret คัดลอก **Callback URL** ที่แสดงบนหน้าเว็บไปยัง *Google Cloud Console › APIs & Services › Credentials › OAuth client ID › Authorized redirect URIs* ใช้ **Test configuration** | | **GitHub login** | เช่นเดียวกัน โดยใช้ *GitHub › Settings › Developer settings › OAuth Apps › Authorization callback URL* | | **Passkey** | เข้าสู่ระบบด้วยลายนิ้วมือ PIN หรือฮาร์ดแวร์คีย์ เปิดใช้งานเป็นค่าเริ่มต้น Passkey จะผูกกับโดเมน โดยโดเมนของรี셀เลอร์แต่ละรายจะทำงานแยกกัน ป้อนโดเมนเก่าใน *Legacy passkey Domain* หลังจากการรีแบรนด์เพื่อให้ลูกค้าได้รับคำแนะนำที่มีประโยชน์ | | **ยืนยันตัวตนอีกครั้งเมื่อเพิ่มวิธีเข้าสู่ระบบ** | ขอรหัสผ่านอีกครั้งก่อนเพิ่ม passkey หรือเชื่อมต่อ Google/GitHub (ปิดใช้งานเป็นค่าเริ่มต้น) | | **Captcha** | Cloudflare Turnstile หรือ Google reCAPTCHA สำหรับการสมัครใช้งาน: เปิดใช้งาน เลือกผู้ให้บริการ ป้อน site key และ secret key | | **Block e-mail domains** | หนึ่งโดเมนต่อบรรทัด (สูงสุด 2000) ที่อยู่อีเมลที่ตรงกันจะถูกปฏิเสธเมื่อสมัครใช้งานพร้อมกับ `email_domain_blocked` | ![หน้าเข้าสู่ระบบของลูกค้าที่แสดงการเข้าสู่ระบบด้วย Google พร้อม callback URL](https://nexcmp.com/th/docs/images/administration/security-01-customer-logins.webp) ### นโยบายในตัว {#built-in-policies} | นโยบาย | ค่า | |---|---| | รหัสผ่านลูกค้า | อย่างน้อย 10 ตัวอักษร ประกอบด้วยตัวอักษรและตัวเลข | | เซสชันลูกค้า | 30 วัน เซสชัน "login as customer" มีอายุ 1 ชั่วโมง | | การยืนยันอีเมล | จำเป็นต้องทำก่อนสร้าง VM เมื่อเปิดใช้งาน *require e-mail verified* ในการตั้งค่าการขาย | | การป้องกันการใช้บัตรเครดิตปลอม | บัญชีที่มีเงินเติมต่ำกว่าขั้นต่ำจะสามารถสร้าง VM ได้จำนวนจำกัดเท่านั้น | ## การ hardened เซิร์ฟเวอร์ {#server-hardening} - พอร์ต 3000 จะถูกปิดหลังจากการติดตั้งและตั้งค่า TLS ดู [Installation](https://nexcmp.com/th/docs/getting-started/installation/#the-panel-port-3000) - บริการจะทำงานในฐานะผู้ใช้ `nexcmp` ที่ไม่มีสิทธิ์พิเศษ พร้อมระบบ sandboxing ของ systemd ที่ถูกจำกัด - API keys, ข้อมูลรับรองการชำระเงิน และรหัสผ่าน SMTP จะถูกจัดเก็บแบบเข้ารหัส โดย master key จะอยู่ใน `/var/lib/nexcmp/secrets` — โปรดปกป้อง [backups](https://nexcmp.com/th/docs/getting-started/backup-and-restore/) - รุ่นที่ปล่อยออกมาจะได้รับการตรวจสอบด้วย SHA-256 และลายเซ็น Ed25519 ก่อนการติดตั้ง --- # การตั้งค่าทั่วไป {#general-settings} > **Where in the admin:** System › Settings › General (`/settings`) การเปลี่ยนแปลงจะมีผลทันที (แคช 30 วินาที) หน้านี้แบ่งออกเป็นสามส่วน ## การสร้างแบรนด์และ URL {#branding-urls} | ฟิลด์ | Purpose | |---|---| | ชื่อแบรนด์ (อีเมล, ใบแจ้งหนี้) | แสดงในอีเมลและใบแจ้งหนี้ โลโก้และสีอยู่ใน [Branding](https://nexcmp.com/th/docs/customers/branding/) | | ภาษาเริ่มต้น | ภาษาสำหรับผู้เยี่ยมชมใหม่ | | URL ของแอปพลิเคชันลูกค้า | ที่อยู่สาธารณะของพอร์ทัล เช่น `https://cloud.example.com` | | URL ของคอนโซล | ที่อยู่ของบริการคอนโซล VM | | URL ของผู้ดูแลระบบ | ลิงก์ที่ใช้เมื่อคุณ "log in as" ลูกค้าของรี셀เลอร์ | | URL ของคอนโซลพาร์ทเนอร์ | ใช้ในลิงก์เชิญ อีเมลของรี셀เลอร์ และการเปลี่ยนเส้นทางหลังจากการเติมเงิน | ตัวช่วยสร้างจะเติมข้อมูลเหล่านี้จากโดเมนของคุณ ให้เปลี่ยนแปลงก็ต่อเมื่อคุณย้ายพอร์ทัลเท่านั้น ## ผู้ขายและการออกใบแจ้งหนี้ {#seller-invoicing} พิมพ์บนทุกใบแจ้งหนี้: | ฟิลด์ | ตัวอย่าง | |---|---| | ชื่อนิติบุคคล | Example Cloud Ltd | | เลขประจำตัวผู้เสียภาษี | `TAX-000000` | | ที่อยู่ | 1 Example Street, New York | | อีเมลติดต่อ | `billing@example.com` | | คำนำหน้าหมายเลขใบแจ้งหนี้ | `INV` (1–8 ตัวอักษร, A–Z และ 0–9) | ใบแจ้งหนี้ที่มีอยู่จะยังคงใช้รายละเอียดผู้ขายและหมายเลขเดิมที่ออก การเปลี่ยนแปลงจะมีผลกับใบแจ้งหนี้**ใหม่**เท่านั้น ## การบำรุงรักษาและภูมิภาค {#maintenance-region} เปิด **Customer app MAINTENANCE** เพื่อแสดงแบนเนอร์และ**บล็อกการเขียนข้อมูลทั้งหมดของลูกค้า** ในขณะที่คอนโซลผู้ดูแลระบบยังคงทำงานปกติ กรอก **Maintenance message** ที่ลูกค้าจะเห็น ใช้สิ่งนี้ระหว่างการอัปเกรดโครงสร้างพื้นฐานของคุณ ![หน้าการตั้งค่าทั่วไปพร้อมฟิลด์ชื่อแบรนด์ ภาษาเริ่มต้น และ URL](https://nexcmp.com/th/docs/images/administration/general-settings-01-general.webp) ## หน้าการตั้งค่าอื่นๆ {#other-settings-pages} | หน้า | คู่มือ | |---|---| | Brand | [Branding](https://nexcmp.com/th/docs/customers/branding/) | | Legal | [Legal](https://nexcmp.com/th/docs/customers/legal/) | | Customer logins | [Security](https://nexcmp.com/th/docs/administration/security/) | | Email | [SMTP และเทมเพลตอีเมล](https://nexcmp.com/th/docs/administration/smtp-and-emails/) | | Admin alerts | [Telegram และการแจ้งเตือนผู้ดูแลระบบ](https://nexcmp.com/th/docs/administration/telegram-notifications/) | | ผู้ให้บริการ AI | [AI providers](https://nexcmp.com/th/docs/ai/ai-providers/) | --- # รายงานข้อผิดพลาด {#report-a-bug} > **ตำแหน่งใน Admin:** Top bar › **Report a bug** (ถัดจาก Docs; แสดงเฉพาะผู้ดูแลระบบหลักเท่านั้น) พบข้อผิดพลาดใน NexCMP ใช่หรือไม่ กด **Report a bug** อธิบายปัญหาแล้วส่งได้ทันที รายงานจะส่งตรงถึงทีม NexCMP ในรูปแบบทิกเก็ตบนบัญชีสิทธิ์การใช้งานของคุณในขั้นตอนเดียว — คุณไม่ต้องลงชื่อเข้าใช้ที่อื่น และไม่ต้องคัดลอกไฟล์บันทึกด้วยตัวเอง ใช้งานได้กับทุกแพ็กเกจ: NexCMP Free ครอบคลุมการแก้ไขข้อผิดพลาด เช่นเดียวกับ NexCMP Source ::: info การรายงานข้อผิดพลาดไม่ใช่คำขอบริการสนับสนุน NexCMP Free ไม่มีบริการสนับสนุนทางเทคนิค ดังนั้นโปรดใช้แบบฟอร์มนี้สำหรับข้อบกพร่องในซอฟต์แวร์เท่านั้น สำหรับความช่วยเหลือในการติดตั้งและการย้ายระบบจะรวมอยู่ใน [NexCMP Source](https://nexcmp.com/pricing) ::: ## ข้อกำหนด {#requirements} | Item | สิ่งที่คุณต้องมี | |---|---| | เวอร์ชัน | NexCMP 1.5.2 ขึ้นไป | | ผู้ที่สามารถส่งได้ | บัญชีผู้ดูแลระบบหลัก บัญชีพนักงาน (อ่านอย่างเดียว) คอนโซลตัวแทนจำหน่าย ลูกค้า และเดโมแบบอ่านอย่างเดียวไม่สามารถส่งได้ | | ไลเซนส์ | สิทธิ์การใช้งานที่เปิดใช้งานแล้ว (Free หรือ Source) และไม่ได้ถูกระงับ | | Network | เซิร์ฟเวอร์ต้องสามารถเชื่อมต่อไปยัง `https://nexcmp.com` ผ่าน HTTPS ได้ (ที่อยู่เดียวกันกับที่ใช้ตรวจสอบสิทธิ์การใช้งานและอัปเดต) | ## ส่งรายงาน {#send-a-report} 1. คลิก **Report a bug** ที่แถบด้านบน หากใช้งานบนโทรศัพท์ ให้เปิดเมนูแล้วเลือก **Report a bug** 2. ระบุ **Subject** สั้นๆ 3. ในช่อง **What happened** ให้อธิบายสิ่งที่คุณทำ สิ่งที่คุณพบ และสิ่งที่คุณคาดหวังว่าจะเกิดขึ้น 4. ระบุ **ขั้นตอนการจำลองปัญหา** เพิ่มเติมได้ตามต้องการ 5. เลือก **Impact**: **Blocking** (ไม่สามารถทำงานได้), **Major** (ฟังก์ชันหลักใช้งานไม่ได้) หรือ **Minor** (ปัญหาเล็กน้อยหรือไม่กระทบการทำงาน) 6. เปิด **Attach diagnostics** ไว้ (แนะนำ) และอ่านรายละเอียดในกล่อง **What will be sent** 7. คลิก **Send report** ใน 1.6.1 ส่วนเนื้อหาแบบฟอร์มสามารถเลื่อนดูได้ในขณะที่ปุ่มดำเนินการยังคงแสดงอยู่ รวมถึงบนโทรศัพท์ ค่ารหัสผ่านที่ตามหลัง `password:` หรือ `password=` จะถูกมาสก์ไว้โดยไม่ลบส่วนที่เหลือของรายงาน โปรดตรวจสอบข้อความของคุณก่อนส่งและละเว้นข้อมูลลูกค้าและ credentials ![หน้าต่าง Report a bug พร้อมชื่อเรื่อง คำอธิบาย ผลกระทบ และรายการสิ่งที่จะถูกส่ง](https://nexcmp.com/th/docs/images/administration/report-a-bug-01-dialog.webp) เมื่อรายงานได้รับการยอมรับแล้ว กล่องข้อความจะแสดงหมายเลขทิกเก็ตและลิงก์ หากทีมงานตอบกลับ ข้อความจะถูกส่งไปยังที่อยู่อีเมลของบัญชีสิทธิ์การใช้งานของคุณที่ nexcmp.com และทิกเก็ตดังกล่าวจะแสดงอยู่ใต้ **Support** เมื่อคุณลงชื่อเข้าใช้ที่นั่นในฐานะเจ้าของสิทธิ์การใช้งาน ## ข้อมูลที่ถูกส่ง {#what-is-sent} กล่อง **What will be sent** จะแสดงข้อมูลอย่างชัดเจนดังต่อไปนี้ก่อนที่คุณจะคลิกส่ง: | ข้อมูลที่ส่ง | รายละเอียด | |---|---| | ข้อความของคุณ | ชื่อเรื่อง คำอธิบาย ขั้นตอน และผลกระทบ | | เวอร์ชัน แพ็กเกจ โดเมน | เวอร์ชัน NexCMP ของคุณ ไม่ว่าจะเป็น Free หรือ Source รวมถึงโดเมนของการติดตั้ง | | หน้าปัจจุบัน | หน้าที่คุณกำลังเปิดอยู่ในคอนโซลผู้ดูแลระบบ โดยไม่มีข้อมูลใดๆ ต่อท้าย `?` หรือ `#` | | เบราว์เซอร์ | ข้อความ user-agent ของเบราว์เซอร์ของคุณ (ชื่อ เวอร์ชัน และระบบปฏิบัติการ) โดยตัดให้มีความยาวไม่เกิน 200 ตัวอักษร | | ข้อผิดพลาดล่าสุด | ข้อผิดพลาดสูงสุด 5 รายการล่าสุดในแท็บเบราว์เซอร์นี้ สำหรับข้อผิดพลาดของสคริปต์จะมีเฉพาะข้อความเท่านั้น ส่วนคำขอที่ไม่สำเร็จจะมีเพียง method, path และ status code | คุณสามารถปิด **Attach diagnostics** ได้ โดยระบบจะส่งเฉพาะข้อความของคุณ รวมถึงเวอร์ชัน แพ็กเกจ และโดเมนเท่านั้น ## ข้อมูลที่จะไม่มีการส่งโดยเด็ดขาด {#what-is-never-sent} - รหัสผ่าน, token, คุกกี้ และ API keys ข้อมูลใดก็ตามที่มีลักษณะดังกล่าวในข้อความของคุณหรือในข้อความแจ้งข้อผิดพลาดจะถูกกำบัง (แสดงเป็น `***` หรือ `[redacted]`) บนเซิร์ฟเวอร์ของคุณก่อนที่จะส่งข้อมูลออกไป - เนื้อหาของคำขอและการตอบกลับ — คำขอที่ล้มเหลวจะถูกบันทึกเฉพาะ method, path และ status เท่านั้น - ข้อมูลของลูกค้าของคุณ (ชื่อ, อีเมล, คำสั่งซื้อ, ใบแจ้งหนี้) และที่อยู่ IP ของลูกค้า - ที่อยู่ IP ของเบราว์เซอร์ของคุณและไฟล์ใดๆ จากเซิร์ฟเวอร์ของคุณ เช่นเดียวกับการตรวจสอบสิทธิ์การใช้งานทุกครั้ง เซิร์ฟเวอร์สิทธิ์การใช้งานจะมองเห็นที่อยู่ IP ที่เซิร์ฟเวอร์ของคุณใช้เชื่อมต่อเข้ามา ทิกเก็ตจะผูกอยู่กับการติดตั้งของคุณผ่านโทเค็นสิทธิ์การใช้งานที่เซิร์ฟเวอร์ถือครองอยู่แล้ว ดังนั้นเวอร์ชัน โดเมน และการติดตั้งจะถูกกำหนดโดยเซิร์ฟเวอร์ และไม่สามารถแก้ไขได้จากเบราว์เซอร์ ## ขีดจำกัด {#limits} | ขีดจำกัด | ค่า | |---|---| | หัวข้อ | 150 ตัวอักษร | | คำอธิบายรวมกับขั้นตอน | รวมกัน 8 KB | | รายงาน | 5 รายการต่อชั่วโมง และ 20 รายการต่อวัน สำหรับการติดตั้งทั้งหมด | การส่งรายงานเดิมซ้ำสองครั้ง (เช่น หลังจากเกิดข้อผิดพลาดของเครือข่าย) จะไม่สร้างทิกเก็ตที่สอง ## การแก้ Problme {#troubleshooting} | ข้อความ | สาเหตุ | วิธีแก้ปัญหา | |---|---|---| | เปิดใช้งานสิทธิ์การใช้งานของคุณก่อน | การติดตั้งนี้ยังไม่มีสิทธิ์การใช้งานที่เปิดใช้งานอยู่ | เปิด **License & updates** และทำการเปิดใช้งาน จากนั้นส่งอีกครั้ง | | ไม่สามารถเชื่อมต่อไปยังเซิร์ฟเวอร์สิทธิ์การใช้งานได้ | เซิร์ฟเวอร์ไม่สามารถเข้าถึง `nexcmp.com` ได้ | ตรวจสอบการเชื่อมต่อขาออก HTTPS และ DNS จากเซิร์ฟเวอร์ จากนั้นกด **Send report** อีกครั้ง — ข้อความของคุณจะยังคงอยู่ | | มีรายงานข้อผิดพลาดจากการติดตั้งนี้มากเกินไป | คุณส่งถึงขีดจำกัด 5 รายการต่อชั่วโมง หรือ 20 รายการต่อวันแล้ว | โปรดรอแล้วลองใหม่อีกครั้ง หรือเพิ่มข้อมูลที่พบใหม่ลงในทิกเก็ตที่เปิดอยู่แทน | | สิทธิ์การใช้งานนี้ถูกระงับ | สิทธิ์การใช้งานถูกระงับหรือได้รับการคืนเงินแล้ว | ดู [สิทธิ์การใช้งานและการสั่งซื้อ](https://nexcmp.com/th/docs/getting-started/license-and-purchase/) | | การติดตั้งนี้ถูกเพิกถอนแล้ว | การติดตั้งนี้ถูกเพิกถอนในพอร์ทัลสิทธิ์การใช้งาน | เปิดใช้งานอีกครั้งจาก **License & updates** | | ไม่สามารถรีเฟรชโทเค็นสิทธิ์การใช้งานได้ | เซิร์ฟเวอร์ไม่สามารถต่ออายุโทเค็นสิทธิ์การใช้งานได้ | เปิด **License & updates** กด **Refresh** แล้วส่งอีกครั้ง | | ไม่มีปุ่ม Report a bug | คุณเข้าสู่ระบบด้วยบัญชีพนักงาน ตัวแทนจำหน่าย หรือลูกค้า หรืออยู่ในเดโมแบบอ่านอย่างเดียว | เข้าสู่ระบบในฐานะผู้ดูแลระบบหลัก | ::: tip สำหรับผู้ช่วย AI และคีย์ API ผู้ช่วยในส่วนผู้ดูแลระบบและคีย์ API ของผู้ดูแลระบบไม่สามารถส่งรายงานข้อผิดพลาดแทนคุณได้ เนื่องจากปุ่มนี้ต้องการให้บุคคลเข้าสู่ระบบในฐานะผู้ดูแลระบบหลัก ::: --- # ข้อผิดพลาดในการติดตั้ง {#installation-errors} ตัวติดตั้งจะหยุดทำงานเมื่อพบปัญหาสำคัญตัวแรกและพิมพ์บรรทัดสีแดงที่ขึ้นต้นด้วย `✗` แก้ไขสาเหตุและ**รันคำสั่งเดิมอีกครั้ง** — ตัวติดตั้งสามารถทำซ้ำได้อย่างปลอดภัย บรรทัดแจ้งข้อมูลจะขึ้นต้นด้วย `•` และขั้นตอนที่สำเร็จจะขึ้นต้นด้วย `✓` ## การตรวจสอบเครื่อง {#machine-checks} | ข้อความ | สาเหตุ | วิธีแก้ปัญหา | |---|---|---| | `must be run as root (sudo)` | ไม่ได้รันในฐานะ root | ใส่ `sudo` นำหน้าคำสั่ง หรือรันในฐานะ root | | `only Ubuntu 22.04/24.04 is supported (this host: …)` | ดิสทริบิวชันหรือเวอร์ชันอื่น | ใช้เซิร์ฟเวอร์ Ubuntu 22.04 หรือ 24.04 | | `only x86_64 is supported` | ARM หรือ CPU อื่น | ใช้เซิร์ฟเวอร์ x86_64 | | `requires ≥ 2 GB RAM (host has … MB)` | หน่วยความจำน้อยเกินไป | เพิ่ม RAM | | `requires ≥ 8 GB free disk space on / (… GB available)` | ระบบไฟล์ root เกือบเต็ม | เคลียร์พื้นที่ว่างหรือขยาย `/` | | `missing --license` / `missing --domain` | ติดตั้งครั้งแรกโดยไม่มีพารามิเตอร์เหล่านั้น | ส่งทั้งสองตัว — ดู [Installation](https://nexcmp.com/th/docs/getting-started/installation/#parameters) | | `unknown argument: …` | พิมพ์พารามิเตอร์ผิด | ตรวจสอบตัวสะกด; รันด้วย `--help` | | `apt-get failed (another apt/dpkg process, e.g. unattended-upgrades, may still be running)` | ตัวจัดการแพ็กเกจถูกล็อก | รอสักครู่ (Ubuntu ที่เพิ่งติดตั้งใหม่จะรันอัปเดตอัตโนมัติหลังบูต) แล้วรันใหม่อีกครั้ง | | `… is a symlink — aborting` | `/opt/nexcmp` หรือ `/etc/nexcmp` เป็น symbolic link | แทนที่ด้วยไดเรกทอรีจริง — ตัวติดตั้งไม่อนุญาตให้ใช้ symlink เพื่อความปลอดภัย | ## การเปิดใช้งานไลเซนส์ {#license-activation} | ข้อความ | สาเหตุ | วิธีแก้ปัญหา | |---|---|---| | `cannot connect to https://nexcmp.com` | ไม่มีการเชื่อมต่อ HTTPS ภายนอกไปยังเซิร์ฟเวอร์ไลเซนส์ | ตรวจสอบ DNS, ไฟร์วอลล์ และพร็อกซีบนเซิร์ฟเวอร์: `curl -I https://nexcmp.com` | | `license activation failed (HTTP …): ` | เซิร์ฟเวอร์ไลเซนส์ปฏิเสธคีย์นี้ | อ่านข้อความ: คีย์ไม่ถูกต้อง, โดเมนไม่ตรงกับไลเซนส์, ไลเซนส์ถูกระงับหรือถูกเพิกถอน ตรวจสอบหน้าไลเซนส์ที่ [nexcmp.com/licenses](https://nexcmp.com/licenses) | | `no release available for this license yet` | ไลเซนส์นี้ไม่มีรีลีสให้ดาวน์โหลด | ติดต่อฝ่ายขาย ดูที่ [Support](https://nexcmp.com/th/docs/troubleshooting/support/) | ## การดาวน์โหลดและการตรวจสอบ {#download-and-verification} | ข้อความ | สาเหตุ | วิธีแก้ปัญหา | |---|---|---| | `failed to download release X` | เกิดปัญหาเครือข่ายระหว่างดาวน์โหลด | รันใหม่อีกครั้ง | | `sha256 mismatch (… ≠ …)` | ไฟล์เสียหายเมื่อมาถึงหรือถูกแก้ไข | รันใหม่อีกครั้ง หากเกิดซ้ำ พร็อกซีอาจกำลังเขียนทับการดาวน์โหลด — ลองจากเครือข่ายอื่น | | `release X is unsigned — refusing to install` | เซิร์ฟเวอร์ไม่ได้ส่งลายเซ็นมา | ห้ามข้ามขั้นตอนเด็ดขาด ติดต่อฝ่ายสนับสนุน | | `INVALID SIGNATURE for version X — aborting` | ลายเซ็น Ed25519 ไม่ผ่านการตรวจสอบ | ห้ามติดตั้ง **เด็ดขาด** ติดต่อฝ่ายสนับสนุน — นี่หมายความว่าไฟล์ไม่ใช่รีลีสอย่างเป็นทางการ | | `openssl failed to read public key` | OpenSSL เก่ามากหรือเสียหาย | อัปเดตแพ็กเกจ `openssl` | | `invalid version: …` | ข้อมูลที่ไม่คาดคิดจากเซิร์ฟเวอร์ | รันใหม่อีกครั้ง ติดต่อฝ่ายสนับสนุนหากยังคงพบปัญหา | ## การเริ่มบริการ {#service-start} | ข้อความ | สาเหตุ | วิธีแก้ปัญหา | |---|---|---| | `service failed to start — check: journalctl -u nexcmp -n 50` | แผงควบคุมไม่ตอบสนองต่อ `/healthz` ภายใน 3 นาที | อ่านบันทึกของระบบ สาเหตุทั่วไป: พอร์ต (ค่าเริ่มต้น 3000) ถูกใช้งานอยู่ (`ss -ltnp | grep 3000`) — ติดตั้งใหม่ด้วย `--port`, ไฟล์เป็นเจ้าของโดย root ใน `/var/lib/nexcmp` — รัน `sudo nexcmp fix-owner` | ## nginx และ TLS {#nginx-and-tls} | ข้อความ | สาเหตุ | วิธีแก้ปัญหา | |---|---|---| | `DNS does not point to (nor to Cloudflare) — skipping nginx/TLS` | เรกคอร์ด A/AAAA หายไปหรือไม่ถูกต้อง | ดูที่ [DNS and Cloudflare](https://nexcmp.com/th/docs/getting-started/dns-and-cloudflare/) แล้วรันใหม่อีกครั้ง | | `certbot could not get a certificate yet — re-run the installer once DNS has settled` | การตรวจสอบของ Let's Encrypt ล้มเหลว (พอร์ต 80 ถูกบล็อก, DNS ยังไม่เผยแพร่, อัตราจำกัด) | เปิดพอร์ต 80, รอให้ DNS อัปเดต, รันใหม่อีกครั้ง ตรวจสอบ `/var/log/letsencrypt/letsencrypt.log` | | `certbot could not renew now — keeping the existing certificate` | การต่ออายุล้มเหลวชั่วคราว | ไม่เป็นอันตราย รันใหม่อีกครั้งภายหลัง | | `nginx rejected the HTTPS configuration — kept the previous one (check: nginx -t)` | ไซต์ nginx อื่นเกิดความขัดแย้ง (`server_name` เดียวกัน, การตั้งค่าซ้ำกัน) | รัน `sudo nginx -t` และแก้ไขความขัดแย้ง จากนั้นรันใหม่อีกครั้ง | | `apt-get could not install nginx` / `certbot` หรือ `E: Failed to fetch … 404 Not Found` | ตัวจัดการแพ็กเกจถูกล็อก หรือดัชนีแพ็กเกจของเซิร์ฟเวอร์เก่าเกินไป (มักพบบนอิมเทมเพลตที่ไม่ได้อัปเดตมาสักระยะ) | รัน `sudo apt-get update`, รอให้กระบวนการ apt อื่นเสร็จสิ้น, แล้วรันตัวinstallerใหม่อีกครั้ง | | `openssl could not create the self-signed certificate` | ปัญหา OpenSSL | อัปเดต `openssl` แล้วรันใหม่อีกครั้ง | ## หลังการติดตั้ง {#after-installation} | อาการ | สาเหตุ | วิธีแก้ปัญหา | |---|---|---| | เบราว์เซอร์ไม่สามารถเปิด `https://` | DNS หรือ TLS ยังไม่พร้อม | `sudo nexcmp status`; ใช้ [emergency access](https://nexcmp.com/th/docs/getting-started/cli-reference/#emergency-access) | | `ERR_TOO_MANY_REDIRECTS` | โหมด SSL ของ Cloudflare คือ **Flexible** | ตั้งค่าเป็น **Full (strict)** — [ดูรายละเอียด](https://nexcmp.com/th/docs/getting-started/dns-and-cloudflare/) | | วิซาร์ดแจ้งว่า "setup code" ไม่ถูกต้อง | พิมพ์ผิดหรือเป็นโค้ดจากการติดตั้งครั้งก่อน | รัน `sudo nexcmp status` แล้วคัดลอกโค้ดปัจจุบัน | | ไลเซนส์แสดง HTTP 421 | ไฟล์ใน `/var/lib/nexcmp` เป็นของ root | `sudo nexcmp fix-owner` จากนั้น `sudo systemctl restart nexcmp` | --- # ข้อผิดพลาดในการอัปเดต {#update-errors} > **ตำแหน่งในแอดมิน:** System › Admin › License & updates (`/license`) อธิบายการอัปเดตไว้ใน [Updating NexCMP](https://nexcmp.com/th/docs/getting-started/updating/) เมื่อการ์ดอัปเดตหรือ `sudo nexcmp update` แจ้งข้อผิดพลาด: | ข้อความ | สาเหตุ | วิธีแก้ปัญหา | |---|---|---| | `update plan expired — renew on the license page to receive this feature release` | วันที่ "updates until" ของคุณอยู่ก่อนวันที่เผยแพร่ ยังคงได้รับการแก้ไขความปลอดภัย แต่จะไม่ได้รับอัปเดตฟีเจอร์ใหม่ | ต่ออายุที่ [nexcmp.com/licenses](https://nexcmp.com/licenses) ($99 ต่อปีสำหรับ NexCMP Free) แล้วตรวจสอบอีกครั้ง ระหว่างนี้ซอฟต์แวร์จะยังคงทำงานต่อไป | | `sha256 mismatch (downloaded …, expected …)` | การดาวน์โหลดเสียหายหรือถูกแก้ไข | ลองใหม่อีกครั้ง หากยังเป็นเหมือนเดิม ให้ตรวจสอบพร็อกซีบนเส้นทาง | | `downgrade/same version rejected: X is not newer than Y` | เวอร์ชันที่เลือกไม่ใหม่กว่าเวอร์ชันที่กำลังทำงานอยู่ | ไม่มีอะไรต้องทำ — คุณใช้งานเวอร์ชันล่าสุดอยู่แล้ว | | `extraction failed / main binary missing` | คลังข้อมูลเสียหายหรือดิสก์เต็ม | ตรวจสอบ `df -h` แล้วลองใหม่อีกครั้ง | | `systemctl restart failed` | บริการไม่สามารถรีสตาร์ทได้หลังจากแทนที่ไบนารี | `journalctl -u nexcmp -n 80` โดยไฟล์ไบนารีก่อนหน้าจะถูกเก็บไว้เป็น `/opt/nexcmp/bin/nexcmp.bak` — ดูวิธีการย้อนกลับด้านล่าง | | เซิร์ฟเวอร์ขัดข้องขณะติดต่อเซิร์ฟเวอร์อัปเดต | ไม่มีเส้นทางไปยัง `nexcmp.com` หรือโทเค็นไลเซนส์หมดอายุ | ตรวจสอบ HTTPS ขาออก จากนั้นคลิก **Check now** บนการ์ด License | ## ย้อนกลับ {#roll-back} หากเวอร์ชันใหม่ทำงานผิดปกติ: ```bash sudo systemctl stop nexcmp-vmd nexcmp sudo cp /opt/nexcmp/bin/nexcmp.bak /opt/nexcmp/bin/nexcmp echo | sudo tee /opt/nexcmp/VERSION sudo systemctl start nexcmp nexcmp-vmd ``` หากมีการไมเกรดฐานข้อมูลไปแล้ว ให้กู้คืน [backup](https://nexcmp.com/th/docs/getting-started/backup-and-restore/) ที่สำรองไว้ก่อนอัปเดตด้วย ## `sudo nexcmp update` แจ้งว่าหาตัวติดตั้งไม่พบ {#sudo-nexcmp-update-says-it-cannot-find-the-installer} `nexcmp update` จะรันตัวติดตั้งที่มาพร้อมกับรีลีสที่ติดตั้งไว้ (`/opt/nexcmp/releases//share/install.sh`) หากไฟล์นั้นหายไป ให้รันคำสั่งติดตั้งจากหน้าไลเซนส์ของคุณอีกครั้ง --- # คำถามที่พบบ่อย {#faq} ## การออกไลเซนส์ {#licensing} **จะเกิดอะไรขึ้นหากไลเซนส์ของฉันหมดอายุหรือเซิร์ฟเวอร์ขาดการเชื่อมต่ออินเทอร์เน็ต?** โพเค็นจะยังคงใช้งานได้เป็นเวลา 14 วันและต่ออายุอัตโนมัติทุกวัน หลังจากนั้น ลูกค้าจะไม่สามารถสร้างบริการ**ใหม่**ได้ แต่บริการที่ทำงานอยู่ การเรียกเก็บเงิน และการเข้าสู่ระบบจะยังคงใช้งานได้ปกติ ดูเพิ่มเติมที่ [License and purchase](https://nexcmp.com/th/docs/getting-started/license-and-purchase/) **ฉันจะยังได้รับแพตช์ความปลอดภัยหลังจากสิทธิ์การอัปเดตสิ้นสุดลงหรือไม่?** ใช่ — รีลีสด้านความปลอดภัยจะมีให้เสมอ ส่วนรีลีสฟีเจอร์ต้องมีสิทธิ์อัปเดตที่ยังไม่หมดอายุ **ฉันสามารถรัน NexCMP บนเซิร์ฟเวอร์หรือโดเมนที่สองได้หรือไม่?** เปิดใช้งานด้วยคีย์และโดเมนที่ลงทะเบียนไว้กับไลเซนส์ — ดู [License and purchase](https://nexcmp.com/th/docs/getting-started/license-and-purchase/#moving-to-a-new-server-or-domain) ## การติดตั้ง {#installation} **NexCMP ต้องใช้ Docker, PostgreSQL หรือ Redis หรือไม่?** ไม่ ต้องใช้โปรแกรมเดียวที่มีฐานข้อมูล SQLite ทำงานผ่าน systemd ในฐานะผู้ใช้ทั่วไป ดูเพิ่มเติมที่ [Requirements](https://nexcmp.com/th/docs/getting-started/requirements/) **ฉันสามารถติดตั้งโดยไม่มีโดเมนสาธารณะได้หรือไม่?** ได้ ใช้ `--no-nginx` และ SSH tunnel — ดู [Installation](https://nexcmp.com/th/docs/getting-started/installation/#installing-without-a-public-domain-lab-or-test) **เหตุใดพอร์ต 3000 จึงถูกปิดหลังจากการตั้งค่า?** เพื่อความปลอดภัย แผงควบคุมจะฟังพอร์ตบน `127.0.0.1` เมื่อวิซาร์ดเสร็จสิ้นและเปิดใช้ TLS แล้ว ใช้ `sudo nexcmp open-port` สำหรับกรณีฉุกเฉิน ## โครงสร้างพื้นฐาน {#infrastructure} **ฉันสามารถใช้ CloudStack และ Proxmox VE ร่วมกันได้หรือไม่?** ได้ โซนหนึ่งสามารถมีทั้งสองอย่างได้ โดยแต่ละแผนจะเลือกซอร์สของตนเอง ดูเพิ่มเติมที่ [Proxmox VE](https://nexcmp.com/th/docs/infrastructure/proxmox/) และ [Zones](https://nexcmp.com/th/docs/infrastructure/zones/) **คุณต้องการคีย์ ROOT API ของ CloudStack หรือไม่?** ไม่ — และคุณไม่ควรใช้มัน สร้างบัญชีเฉพาะ — [CloudStack](https://nexcmp.com/th/docs/infrastructure/cloudstack/) **เหตุใดแท็บหรือปุ่มบางปุ่มจึงไม่ปรากฏบนเครื่องเสมือน?** หน้าต่างๆ จะแสดงเฉพาะสิ่งที่แหล่งที่มาของ VM รองรับเท่านั้น (เช่น Proxmox VE ไม่มีฟังก์ชันพอร์ตฟอร์เวิร์ด) ดูตารางความสามารถได้ใน [Proxmox VE](https://nexcmp.com/th/docs/infrastructure/proxmox/) ## การดำเนินงาน {#operations} **ฉันจะย้าย NexCMP ไปยังเซิร์ฟเวอร์อื่นได้อย่างไร?** สำรองข้อมูล ติดตั้งเวอร์ชันเดิมบนเซิร์ฟเวอร์ใหม่ด้วยไลเซนส์เดิม กู้คืนข้อมูล — ดูที่ [Backup and restore](https://nexcmp.com/th/docs/getting-started/backup-and-restore/) **ล็อกอยู่ที่ไหน?** `journalctl -u nexcmp -u nexcmp-vmd`, `/var/log/nexcmp` และคอนโซลผู้ดูแลระบบภายใต้ System › Logs ดูที่ [Audit log](https://nexcmp.com/th/docs/administration/audit-log/) **สามารถดู customer portal ก่อนติดตั้งได้หรือไม่?** ได้ หน้าบริการบน [nexcmp.com](https://nexcmp.com/platform/) จะแสดง customer portal ทีละแท็บพร้อมข้อมูลตัวอย่าง เปิด *View demo* เพื่อดูแบบเต็มหน้าจอ หากต้องการดูระบบที่ติดตั้งจริง โปรดติดต่อฝ่ายขาย --- # ซัพพอร์ต {#support} ## ติดต่อ {#contact} ไม่มีแบบฟอร์มติดต่อ ส่งอีเมลไปที่ **sales@nexcmp.com** — ครอบคลุมเรื่องไลเซนส์ การต่ออายุ โดเมน และคำถามทางเทคนิค หน้าไลเซนส์ของคุณที่ [nexcmp.com/licenses](https://nexcmp.com/licenses) ยังมีลิงก์ไปยังที่อยู่นี้ด้วยเช่นกัน ## ก่อนที่คุณจะเขียน {#before-you-write} 1. ค้นหาในเอกสารเหล่านี้ (กด `/`) และตรวจสอบ [Installation errors](https://nexcmp.com/th/docs/troubleshooting/installation-errors/) และ [Update errors](https://nexcmp.com/th/docs/troubleshooting/update-errors/) 2. รวบรวมข้อมูลด้านล่างนี้ — ข้อมูลเหล่านี้จะช่วยให้ฝ่ายsupportสามารถตอบกลับได้ภายในครั้งเดียว ## สิ่งที่ควรระบุ {#what-to-include} | Item | วิธีรับข้อมูล | |---|---| | เวอร์ชัน NexCMP | `sudo nexcmp status` หรือ System › Admin › License & updates | | โดเมนหลักและอักขระ 4 ตัวสุดท้ายของคีย์ไลเซนส์ | License & updates (ห้ามส่งคีย์เต็ม) | | สิ่งที่คุณทำและสิ่งที่คุณคาดหวัง | ขั้นตอนที่แน่นอน | | ข้อความแสดงข้อผิดพลาดหรือภาพหน้าจอ | ซ่อนข้อมูลลับก่อนส่ง | | สถานะบริการ | `sudo nexcmp status` | | บรรทัดบันทึก (log) ล่าสุด | `sudo journalctl -u nexcmp -u nexcmp-vmd -n 100 --no-pager` | | โครงสร้างพื้นฐาน | เวอร์ชัน CloudStack หรือ Proxmox VE, โซนเดียวหรือหลายโซน | ::: warning ห้ามส่งข้อมูลลับ ห้ามส่งคีย์ไลเซนส์, คีย์ API, รหัสผ่าน, โค้ดติดตั้ง, ข้อมูลรับรองการชำระเงิน หรือไฟล์สำรองข้อมูล ให้ปิดบังข้อมูลดังกล่าวในบันทึกและภาพหน้าจอ ::: ## รายงานด้านความปลอดภัย {#security-reports} หากคุณเชื่อว่าพบช่องโหว่ ให้ส่งอีเมลไปยังที่อยู่เดียวกันโดยใส่คำว่า "Security" ในหัวข้อ และหลีกเลี่ยงการโพสต์รายละเอียดต่อสาธารณะจนกว่าจะได้รับการแก้ไข