Configuration as code
ตำแหน่งในแอดมิน: System › Settings › Import/Export (
/agent/config) บนเซิร์ฟเวอร์: คำสั่งnexcmp config export,planและapplyรวมถึงnexcmp admin <tool>
What it does
คุณสามารถบันทึกการกำหนดค่าพานิลของคุณ (การสร้างแบรนด์, การตั้งค่าทั่วไป, อีเมล, การแจ้งเตือนผ่าน Telegram, โมดูล,สกุลเงิน, เกตเวย์การชำระเงิน, ขีดจำกัด, โซน, แพ็กเกจ, ผู้ให้บริการ AI และหน้าข้อกฎหมาย) ให้เป็นไฟล์ YAML ไฟล์เดียว คุณสามารถแก้ไขไฟล์ได้ด้วยตนเอง, ให้ผู้ช่วย AI ช่วยแก้ไข, เก็บไว้ในระบบควบคุมเวอร์ชัน และนำไปใช้กับพานิลเดิมหรือพานิลอื่นได้ ก่อนที่จะมีการเปลี่ยนแปลงใดๆ คุณจะเห็นรายการความแตกต่างเสมอ ข้อมูลลับจะไม่ถูกเขียนลงในไฟล์เด็ดขาด
ใช้เพื่อโคลนการตั้งค่าไปยังการติดตั้งชุดที่สอง, เพื่อตรวจสอบการเปลี่ยนแปลงก่อนนำไปใช้งานจริง, เพื่อกู้คืนการตั้งค่าหลังจากเกิดความผิดพลาด, หรือเพื่อให้ AI เสนอโครงสร้างการกำหนดค่าทั้งหมดที่คุณสามารถอ่านได้เสมือนเป็นเอกสารชุดเดียว
ข้อกำหนด
| Item | Requirement |
|---|---|
| NexCMP | 1.4.0 หรือใหม่กว่า |
| บรรทัดคำสั่ง | คุณคือ root บนเซิร์ฟเวอร์พานิล (ใช้ sudo) คำสั่งจะขอคีย์ชั่วคราว (15 นาที, สิทธิ์การใช้งานทั้งหมด) จากพานิลโดยอัตโนมัติ หากต้องการใช้คีย์ที่จำกัดสิทธิ์มากกว่าแทน ให้ตั้งค่า NEXCMP_KEY เป็น admin API key และคงสิทธิ์นั้นไว้ผ่าน sudo เช่น sudo --preserve-env=NEXCMP_KEY nexcmp config plan -f nexcmp.yaml |
| หน้าผู้ดูแลระบบ | เข้าสู่ระบบในฐานะผู้ดูแลระบบแล้ว หน้านี้จะเป็นแบบอ่านอย่างเดียวบนพานิลทดลอง |
| ข้อมูลลับ | ค่าที่ระบุในเวลาที่ทำการปรับใช้ (ดู Secrets); จะไม่มีการเก็บไว้ในไฟล์เด็ดขาด |
ส่งออก, แก้ไข, ดูตัวอย่าง, ปรับใช้
ส่งออกการกำหนดค่าปัจจุบัน:
bashsudo nexcmp config export -o nexcmp.yamlหากไม่มี
-oโค้ด YAML จะถูกพิมพ์ออกทางหน้าจอแก้ไข
nexcmp.yaml(ดู ตัวอย่าง ด้านล่าง) รักษาversion: 1ให้อยู่ด้านบนดูตัวอย่างสิ่งที่จะเปลี่ยนแปลง การดำเนินการนี้จะไม่เปลี่ยนแปลงค่าใดๆ:
bashsudo nexcmp config plan -f nexcmp.yamlแต่ละบรรทัดจะแสดงส่วน, รายการ, ฟิลด์ และ
old → newบรรทัดที่มีเครื่องหมาย$เป็นส่วนของระบบการเรียกเก็บเงิน (ดู Billing sections) หากพานิลตรงกับไฟล์อยู่แล้ว คุณจะเห็นข้อความ "No changes"ปรับใช้ หากไม่มี
--yesคำสั่งจะเป็นการ dry run และจะพิมพ์เพียงรายการที่เหมือนกันออกมาเท่านั้น:bashsudo nexcmp config apply -f nexcmp.yaml --yesอ่านผลลัพธ์:
applied,pending(รอการยืนยันของคุณ),skippedและerrors
| ตัวเลือก | ความหมาย |
|---|---|
-f <file> | ไฟล์ YAML (จำเป็นสำหรับ plan และ apply) |
--yes | ปรับใช้จริง หากไม่มีตัวเลือกนี้ apply จะเป็นเพียงการ dry run |
--confirm-billing | ปรับใช้ส่วนการเรียกเก็บเงินด้วย (payments, currency, plans) หากไม่มีส่วนนี้จะถูกข้ามไป |
--section <name> | ปรับใช้เฉพาะส่วนนี้เท่านั้น ทำซ้ำตัวเลือกนี้สำหรับหลายส่วน |
-o <file> | ด้วย export: เขียนโค้ด YAML ลงในไฟล์ |
รหัสสถานะการออก (exit code) จะเป็น 0 เมื่อทุกอย่างถูกปรับใช้แล้วหรือไม่มีการเปลี่ยนแปลง, เป็น 1 เมื่อมีข้อผิดพลาดเกิดขึ้น, และเป็น 2 สำหรับข้อผิดพลาดด้านการใช้งานหรือคีย์
ข้อมูลลับ
ไฟล์จะเก็บข้อมูลอ้างอิงแทนข้อมูลลับ เช่น 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 |
ไฟล์ตัวอย่าง
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, หมายเลขเวอร์ชันที่แตกต่างกัน หรือส่วนที่ไม่รู้จักจะถูกปฏิเสธก่อนที่กระบวนการใดๆ จะทำงาน
หัวข้อ
| ส่วน | สิ่งที่ควบคุม | หมายเหตุ |
|---|---|---|
branding | ชื่อแบรนด์ (สูงสุด 60 ตัวอักษร), สีหลัก, สุลเงินที่แสดง (usd หรือ vnd), ชื่อผู้ขาย | โลโก้ไม่ได้เป็นส่วนหนึ่งของไฟล์; ให้ใช้ branding page |
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 การเปลี่ยนโฮสต์ พอร์ต หรือความปลอดภัยจำเป็นต้องใส่รหัสผ่านใหม่อีกครั้ง |
telegram | เปิดหรือปิดช่องทางแจ้งเตือน, chat id, bot token | Telegram notifications |
modules | เปิดหรือปิดโมดูลเสริม (key: true/false) | เฉพาะคีย์ที่พาเนลอนุญาตให้สลับได้ ดูที่ Modules |
currency | สกุลเงินที่แสดงและอัตราแลกเปลี่ยน USD เป็น VND แบบกำหนดเอง (0 แบบอัตโนมัติ มิฉะนั้นคือ 15000 ถึง 50000) | ส่วนการเรียกเก็บเงิน ดูที่ 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 |
quotas | ขีดจำกัด quota_* | ดูที่ Quotas |
zones | โซนตาม slug (จำเป็น: slug, name, country; ทางเลือก city, enabled, is_default) | โซนใหม่จะถูกสร้างขึ้น โซนที่มีอยู่แล้วจะ ไม่ถูกเปลี่ยนแปลง โดยไฟล์ ดูที่ 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 |
ai_provider | ผู้ให้บริการ AI ของพาเนลที่ใช้งานโดย AI Chat และ AI Agent ของลูกค้า | AI provider. |
legal | ข้อกำหนดและนโยบายความเป็นส่วนตัวตามแต่ละภาษา (en, vi) | Legal pages |
ลำดับของการนำไปใช้คือลำดับด้านบน: รายการที่มีลักษณะเป็นโครงสร้างพื้นฐานก่อนแผนบริการ
กฎที่ควรจำ
- มีคุณสมบัติ 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(อ่านได้โดยสาธารณะ)
ส่วนการเรียกเก็บเงิน
payments, currency และ plans เปลี่ยนแปลงราคาหรือเส้นทางการเงิน nexcmp config apply --yes จะ ข้าม รายการเหล่านี้เว้นแต่คุณจะเพิ่ม --confirm-billing; จากนั้นรายการเหล่านั้นจะถูกแสดงภายใต้ skipped ("billing section - pass confirm_billing") แฟล็กนี้คือการยืนยันของคุณ: เมื่อมีแฟล็กนี้ การเปลี่ยนแปลงการเรียกเก็บเงินทั้งหมดในไฟล์ (และการเปลี่ยนแปลงอื่นๆ ที่จะต้องขอการยืนยัน) จะถูกนำไปใช้โดยไม่ต้องมีข้อความแจ้งเตือนครั้งที่สอง รัน plan ก่อนและอ่านแต่ละบรรทัดที่มีเครื่องหมาย $
เมื่อไฟล์เดียวกันถูกนำไปใช้โดย AI (เครื่องมือ config_apply ในไคลเอนต์ MCP หรือ AI Chat) แฟล็กนี้จะถูกละเว้น และการเปลี่ยนแปลงด้านการเงินจะต้องรอการอนุมัติจากคุณแทน
ใช้หน้า Import/Export
- เปิด System › Settings › Import/Export
- ภายใต้ Export คลิก Get current configuration จากนั้น Download .yaml เพื่อบันทึก
nexcmp.yamlข้อมูลลับจะแสดงเป็นตัวยึดตำแหน่ง - ภายใต้ Import เลือกไฟล์, ลากไฟล์ลงในกล่อง, หรือวางโค้ด YAML
- ทางเลือก: เปิด Secrets that come with it (not in the file) และเพิ่มชื่อและค่าสำหรับแต่ละข้อมูลอ้างอิง เช่น
smtp_password - คลิก Preview changes ตารางจะจัดกลุ่มการเปลี่ยนแปลงตามส่วน ส่วนที่เกี่ยวข้องกับการเงินจะมีแท็ก "Money-related" ยกเลิกการเลือกส่วนที่คุณไม่ต้องการ
- หากมีส่วนที่เกี่ยวกับเงินแสดงอยู่ ให้ทำเครื่องหมายเลือก Also apply money-related changes (prices, payment gateways, balances) หากไม่ทำเครื่องหมาย ส่วนเหล่านี้จะถูกข้ามไป
- คลิก Apply selected ผลลัพธ์จะแสดงรายการที่ถูกนำไปใช้ ถูกข้าม หรือล้มเหลว การเปลี่ยนแปลงที่ส่งกลับมาว่ารอการยืนยันจะแสดงเป็นบัตรยืนยัน ให้กด Confirm บนบัตรนั้น
ปุ่ม JSON Schema ที่มุมบนขวาจะเปิดสคีมาขึ้นมา


รันเครื่องมือใดๆ จากบรรทัดคำสั่ง
nexcmp admin รันเครื่องมือเดียวกับที่ผู้ช่วย AI ใช้ (the tool list) และพิมพ์ผลลัพธ์เป็น 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 จะใช้สิทธิ์ของคีย์นั้นๆ เอง
ตรวจสอบ
sudo nexcmp config plan -f nexcmp.yamlทันทีหลังapply --yesจะพิมพ์ "No changes"- ในระบบผู้ดูแล หน้าที่คุณแก้ไขจะแสดงค่าใหม่ และ Logs › Admin actions จะแสดงรายการการเปลี่ยนแปลง
- การนำไฟล์เดิมมาใช้ซ้ำจะไม่ทำให้เกิดการเปลี่ยนแปลงใดๆ
ขีดจำกัดและหมายเหตุ
- ไฟล์นี้ครอบคลุมการตั้งค่าด้านบน ไม่รวมถึงลูกค้า เซิร์ฟเวอร์ ใบแจ้งหนี้ หรือแหล่งที่มาของโครงสร้างพื้นฐาน (การเชื่อมต่อ CloudStack และ Proxmox) ให้เชื่อมต่อสิ่งเหล่านี้ด้วย AI Chat หรือหน้าผู้ดูแล
- โซนและแผนจะถูกจับคู่โดย
slugห้ามเปลี่ยนชื่อสลัก (slug) ในไฟล์ เพราะจะถูกสร้างเป็นรายการใหม่ - แผนที่ลูกค้าใช้งานอยู่แล้วจะไม่สามารถเปลี่ยนขนาดได้ ให้สร้างแผนใหม่แทน
- เก็บรักษาไฟล์ที่ส่งออกไว้เป็นความลับ แม้ว่าจะไม่มีข้อมูลลับก็ตาม เนื่องจากไฟล์ดังกล่าวแสดงรายการราคา ที่อยู่ และชื่อบัญชีของคุณ
การแก้ Problme
| อาการ | สาเหตุ | วิธีแก้ปัญหา |
|---|---|---|
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_<NAME> จึงยังคงใช้ข้อมูลลับที่บันทึกไว้เดิม | ส่งออกตัวแปรแล้วลองใช้อีกครั้ง |
รายการภายใต้ errors พร้อม HTTP 403 insufficient_scope | คีย์ขาดสิทธิ์ (scope) สำหรับส่วนนั้น | ใช้คีย์ที่มีสิทธิ์ หรือรันในฐานะ root |
รายการภายใต้ errors พร้อม HTTP 403 demo_read_only | แผงเดโม | ใช้กับการติดตั้งจริง |