# NexCMP 1.6.1 — full documentation > Complete NexCMP documentation in one file. Source: https://nexcmp.com/id/docs/ · generated 2026-11-02. --- # Apa itu NexCMP {#what-is-nexcmp} NexCMP adalah perangkat lunak yang Anda pasang di **server Anda sendiri** untuk mengubah infrastruktur cloud menjadi produk yang dapat Anda jual. Ini memberi Anda: - sebuah **portal pelanggan** tempat pengguna mendaftar, menambah saldo, memesan mesin virtual dan layanan lain, membuka konsol, mengambil snapshot, serta menghubungi dukungan; - sebuah **konsol admin** (`/admin`) tempat Anda mengelola pelanggan, paket, harga, pembayaran, infrastruktur, dan pengaturan; - **penagihan**: dompet per pelanggan, penagihan per jam atau per bulan, faktur, promosi, dan kuota sumber daya; - **reseller white-label**: merek lain yang menjual kapasitas Anda di bawah domain mereka sendiri; - sebuah **API**, alat baris perintah (`cmp`), dan server MCP untuk otomatisasi; - fitur opsional **AI Chat** (asisten dukungan) dan **AI Agent** (mengelola VM dengan bahasa sehari-hari). ## Hal yang terhubung dengannya {#what-it-connects-to} NexCMP tidak menghosting mesin virtual sendiri, melainkan mengendalikan platform yang melakukannya. Sebuah *source* (juga disebut penyedia) adalah salah satu dari: | Source | Penggunaan tipikal | Panduan | |---|---|---| | Apache CloudStack | Cloud privat atau publik dengan zona, jaringan, router virtual, dan IP publik | [CloudStack](https://nexcmp.com/id/docs/infrastructure/cloudstack/) | | Proxmox VE | Server tunggal atau klaster yang sudah Anda jalankan | [Proxmox VE](https://nexcmp.com/id/docs/infrastructure/proxmox/) | Modul lain memerlukan infrastrukturnya sendiri: [server bare-metal](https://nexcmp.com/id/docs/infrastructure/dedicated/), [node VPN dan proxy](https://nexcmp.com/id/docs/infrastructure/vpn-proxy-nodes/), [penyimpanan objek S3](https://nexcmp.com/id/docs/infrastructure/s3/), [Kubernetes dan Cloud Privat](https://nexcmp.com/id/docs/infrastructure/kubernetes-and-private-cloud/). Lihat [Infrastructure requirements](https://nexcmp.com/id/docs/infrastructure/requirements/) untuk satu tabel yang mencakup semuanya. ## Cara pembuatannya {#how-it-is-built} NexCMP adalah program tunggal dengan dua layanan systemd pada satu server Ubuntu: - `nexcmp` — server web: portal pelanggan, konsol admin, API, panduan penyiapan; - `nexcmp-vmd` — worker latar belakang: pekerjaan provisi, sinkronisasi dengan CloudStack atau Proxmox Anda, proses penagihan. Data berada di `/var/lib/nexcmp` (database dan file SQLite), konfigurasi di `/etc/nexcmp`, program di `/opt/nexcmp`. Lihat [Architecture](https://nexcmp.com/id/docs/infrastructure/architecture/) untuk gambaran lengkapnya. ## Langkah selanjutnya {#where-to-go-next} 1. Periksa [persyaratan](https://nexcmp.com/id/docs/getting-started/requirements/). 2. Dapatkan lisensi — [License and purchase](https://nexcmp.com/id/docs/getting-started/license-and-purchase/). 3. [Install](https://nexcmp.com/id/docs/getting-started/installation/), lalu jalankan [setup wizard](https://nexcmp.com/id/docs/getting-started/setup-wizard/). 4. Sambungkan platform Anda: [CloudStack](https://nexcmp.com/id/docs/infrastructure/cloudstack/) atau [Proxmox VE](https://nexcmp.com/id/docs/infrastructure/proxmox/). --- # Persyaratan untuk server NexCMP {#requirements-for-the-nexcmp-server} Halaman ini mencakup server yang menjalankan NexCMP. Kebutuhan untuk CloudStack, Proxmox VE, atau infrastruktur Anda lainnya ada di [Infrastructure requirements](https://nexcmp.com/id/docs/infrastructure/requirements/). ## Server {#server} | Item | Persyaratan | Diperiksa oleh penginstal | |---|---|---| | Sistem operasi | Ubuntu **22.04** atau **24.04** | Ya — berhenti dengan galat pada sistem operasi lain | | Arsitektur CPU | x86_64 | Ya | | Memori | Minimum 2 GB (pemasang menolak di bawah sekitar 1.8 GB) | Ya | | Ruang disk kosong | Minimum 8 GB kosong pada `/` | Ya | | Hak akses | root (`sudo`) | Ya | | Paket | `curl`, `ca-certificates`, `zstd`, `tar`, `openssl`, `python3`, `openssh-client` — dipasang secara otomatis | Dipasang jika belum ada | | Dengan HTTPS | `nginx` dan `certbot` — dipasang secara otomatis kecuali Anda meneruskan `--no-nginx` | Dipasang jika belum ada | ::: tip Ukuran Instalasi skala kecil (beberapa ratus pelanggan) dapat berjalan dengan lancar pada 2 vCPU / 4 RAM. Penggunaan disk didominasi oleh basis data SQLite serta salinan pembaruan dan cadangan opsional — siapkan 20 GB atau lebih untuk produksi. ::: ## Jaringan {#network} | Arah | Port | Tujuan | |---|---|---| | Masuk | 80/tcp | Validasi Let's Encrypt dan pengalihan ke HTTPS | | Masuk | 443/tcp | Portal pelanggan, konsol admin, API | | Masuk | 3000/tcp | Wisaya penyiapan saat instalasi pertama dan akses darurat saja — lihat [Installation](https://nexcmp.com/id/docs/getting-started/installation/#the-panel-port-3000) | | Keluar | 443/tcp ke `nexcmp.com` | Aktivasi lisensi, pemeriksaan lisensi harian, pembaruan | | Keluar | ke API CloudStack / API Proxmox Anda | Penyediaan dan sinkronisasi | | Keluar | 443/tcp ke penyedia pembayaran, email, dan AI yang Anda aktifkan | Stripe, PayPal, SMTP, penyedia AI, dan sebagainya | Server memerlukan **alamat IPv4 publik** jika Anda ingin Let's Encrypt menerbitkan sertifikat secara langsung. Jika domain di-proxy oleh Cloudflare, lihat [DNS and Cloudflare](https://nexcmp.com/id/docs/getting-started/dns-and-cloudflare/). ## DNS - Satu **domain utama** (misalnya `cloud.example.com`) — portal berada di `https://cloud.example.com/` dan konsol admin berada di `https://cloud.example.com/admin`. - Opsional: `admin.` dan `partner.`. Jika nama tersebut mengarah ke server (atau ke Cloudflare), penginstal akan menambahkannya ke sertifikat. - Domain harus sama dengan yang terdaftar pada lisensi Anda. ## Tidak wajib pada server ini {#not-required-on-this-server} NexCMP berjalan sebagai pengguna layanan biasa yang tidak memiliki hak istimewa (`nexcmp`). Perangkat lunak ini **tidak** memerlukan akses root saat berjalan, Docker, server basis data terpisah, Redis, atau perangkat lunak hypervisor apa pun. --- # Lisensi dan pembelian {#license-and-purchase} > **Di mana letaknya di admin:** System › Admin › License & updates (`/license`) NexCMP diaktifkan dengan **kunci lisensi** yang Anda kelola di [akun NexCMP Anda](https://nexcmp.com/licenses). Edisi dan harga saat ini tercantum di [nexcmp.com/pricing](https://nexcmp.com/pricing); halaman ini menjelaskan perilaku lisensi setelah Anda memilikinya. ## Dapatkan lisensi {#get-a-license} 1. Buat akun di [nexcmp.com](https://nexcmp.com/register) dan verifikasi alamat e-mail Anda. 2. Pilih edisi: - **NexCMP Free** — untuk operator jaringan yang memiliki ASN sendiri dan subnet yang terdaftar atas nama mereka sendiri. Kirimkan permohonan di [nexcmp.com/deploy](https://nexcmp.com/deploy) (perusahaan, ASN, subnet, domain panel). E-mail akun Anda harus menggunakan domain perusahaan yang tercantum dalam registri publik (WHOIS) untuk ASN atau subnet tersebut. Setiap permohonan akan ditinjau; Anda akan menerima e-mail setelah diputuskan, dan kunci lisensi hanya akan muncul setelah disetujui. - **NexCMP Source** — peningkatan satu kali, tidak memerlukan ASN. Kunjungi [nexcmp.com/pricing](https://nexcmp.com/pricing). 3. Buka halaman lisensi Anda. Halaman tersebut menampilkan **kunci lisensi** (format `NXC-XXXXX-XXXXX-XXXXX-XXXXX`), **domain utama**, dan perintah instalasi siap pakai. ::: warning Jaga kerahasiaan kunci Kunci lisensi mengaktifkan instalasi. Perlakukan kunci ini seperti kata sandi: jangan menempelkannya ke tiket, obrolan, atau tangkapan layar. ::: ## Isi lisensi {#what-a-license-contains} | Kolom | Arti | |---|---| | Domain utama | Nama host tempat portal Anda berjalan. Kunci diikat ke domain ini saat diaktifkan. | | Domain reseller | Nama host tambahan yang disajikan sebagai portal label putih — lihat [Resellers](https://nexcmp.com/id/docs/customers/resellers/). | | Pembaruan hingga | Tanggal hingga kapan Anda menerima **pembaruan dan perbaikan bug**. Lisensi Free dimulai dengan durasi **1 tahun** sejak tanggal disetujui; perpanjang seharga $99 per tahun di halaman lisensi Anda. Perbaikan keamanan selalu diberikan, bahkan setelah tanggal ini. | | Status | `active`, atau ditangguhkan / kedaluwarsa / dicabut. | ## Saat tahun gratis berakhir {#when-the-free-year-ends} Perangkat lunak ini **tetap berjalan** saat tanggal "Updates until" terlewati: pelanggan, layanan, dan penagihan tidak terpengaruh. Anda berhenti menerima rilis fitur baru dan pembaruan perbaikan bug (perbaikan keamanan tetap masuk). Perpanjang seharga $99 per tahun di halaman lisensi Anda di [nexcmp.com/licenses](https://nexcmp.com/licenses) untuk melanjutkan; perpanjangan tersebut akan menambah 12 bulan dari tanggal akhir saat ini. NexCMP Free hanya mencakup perbaikan bug — tanpa dukungan teknis dan tanpa aplikasi. ## Fitur yang ditambahkan NexCMP Source {#what-nexcmp-source-adds} Lisensi Source adalah peningkatan satu kali senilai $1,999 pada lisensi Anda: kode sumber lengkap, semua aplikasi NexCMP (Android, iOS, Windows, macOS, Linux, Chrome / Edge / Brave, dan Firefox) yang dibangun dan diberi merek khusus untuk Anda, serta 30 hari kerja bersama insinyur ahli — migrasi gratis dari VMware, WHMCS, atau panel lain, atau penataan lengkap dari A sampai Z. Rilis sumber baru disertakan selama 12 bulan; memperbaruinya setelah itu ($99 per tahun) bersifat opsional, dan kode sumber yang Anda unduh sepenuhnya menjadi milik Anda. Lihat [Source license terms](https://nexcmp.com/legal/source-license/). ## Cara instalasi memeriksa lisensinya {#how-the-installation-checks-its-license} - Saat instalasi, server mengaktifkan kunci untuk domain Anda dan menerima **token bertandatangan**. - Token diperbarui secara otomatis setiap **24 jam**. Token tetap valid selama **14 hari**, sehingga gangguan internet yang singkat tidak akan menjadi masalah. - Semua rilis dan token diverifikasi dengan tanda tangan Ed25519 yang terintegrasi di dalam program; unduhan yang telah dimodifikasi akan ditolak. Periksa statusnya kapan saja di konsol admin atau dengan `sudo nexcmp status`. ## Jika lisensi tidak valid {#if-the-license-is-not-valid} Ketika token kedaluwarsa, atau lisensi ditangguhkan, atau domain tidak lagi cocok: - pelanggan **tidak dapat membuat layanan baru** dan konsol admin menampilkan banner; - layanan yang sudah berjalan, **penagihan, dan pelanggan yang sudah ada tidak terpengaruh**; - perbaiki penyebabnya (sambungkan kembali server ke internet, perbarui di [nexcmp.com/licenses](https://nexcmp.com/licenses)) dan klik **Check now** di License & updates. ## Pindah ke server atau domain baru {#moving-to-a-new-server-or-domain} Aktifkan di server baru dengan kunci yang sama dan domain terdaftar (lihat [Installation](https://nexcmp.com/id/docs/getting-started/installation/)). Untuk mengubah domain terdaftar, lakukan terlebih dahulu di halaman lisensi Anda di [nexcmp.com/licenses](https://nexcmp.com/licenses), lalu jalankan kembali penginstal dengan `--domain` baru. --- # Pasang NexCMP {#install-nexcmp} Penginstal adalah skrip tunggal yang disediakan oleh server lisensi Anda. Skrip ini memeriksa mesin, mengaktifkan lisensi Anda, mengunduh dan memverifikasi program, memasang layanan, serta (secara opsional) menyiapkan nginx dengan sertifikat Let's Encrypt. ## Sebelum Anda mulai {#before-you-start} - Server yang memenuhi [requirements](https://nexcmp.com/id/docs/getting-started/requirements/), dan akses root. - **Kunci lisensi** dan **domain utama** Anda dari [halaman lisensi](https://nexcmp.com/licenses) Anda — lihat [License and purchase](https://nexcmp.com/id/docs/getting-started/license-and-purchase/). - Catatan DNS untuk domain tersebut — lihat [DNS and Cloudflare](https://nexcmp.com/id/docs/getting-started/dns-and-cloudflare/). Anda juga dapat menginstalnya terlebih dahulu dan memperbaiki DNS nanti; penginstal akan memberi tahu Anda apa yang kurang dan dapat langsung dijalankan kembali. ## Menginstal {#install} 1. Masuk ke server dan jadilah root (atau tambahkan awalan `sudo`). 2. Jalankan perintah dari halaman lisensi Anda. Perintah tersebut terlihat seperti ini: ```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. Tunggu tanda centang selesai. Pemasangan baru memakan waktu beberapa menit; permulaan pertama membuat skema database dan dapat memakan waktu hingga satu menit pada diska yang lambat. 4. Baca ringkasan di bagian akhir. Ringkasan tersebut mencetak URL portal dan admin, **kode penyiapan**, serta langkah berikutnya. ![Penginstal selesai dengan URL portal, URL admin, dan kode penyiapan satu kali](https://nexcmp.com/id/docs/images/getting-started/installation-01-finish.webp) ## Parameter {#parameters} | Parameter | Default | Arti | |---|---|---| | `--license KEY` | wajib pada pemasangan pertama | Kunci lisensi. | | `--domain NAME` | wajib pada pemasangan pertama | Domain utama. Harus cocok dengan lisensi. `https://` dan jalur tambahan di belakang akan dihapus. | | `--email ADDRESS` | tidak ada | Email kontak untuk pemberitahuan kedaluwarsa Let's Encrypt. Tanpa email ini, sertifikat didaftarkan tanpa email. | | `--port N` | `3000` | Port lokal panel (1–65535). | | `--no-nginx` | nonaktif | Jangan instal atau konfigurasi nginx / TLS. Gunakan ini saat Anda menjalankan reverse proxy sendiri atau ingin melihat NexCMP terlebih dahulu. | | `--behind-cloudflare` | terdeteksi otomatis | Paksa mode "domain diproksi oleh Cloudflare". Biasanya terdeteksi dari DNS. | | `--channel NAME` | `stable` | Saluran rilis. | Menjalankan penginstal lagi **tanpa parameter** akan menggunakan kembali parameter yang disimpan (`/etc/nexcmp/install.conf`) dan memperbarui dengan aman, menjaga data, konfigurasi, serta akun. Itulah persisnya fungsi `sudo nexcmp update`. ## Tindakan penginstal {#what-the-installer-does} 1. **Memeriksa mesin** — Ubuntu 22.04/24.04, x86_64, RAM minimal 2 GB, diska kosong 8 GB. 2. **Menginstal paket** yang diperlukan (`curl`, `zstd`, `openssl`, `python3`, `openssh-client` …). 3. **Membuat pengguna servis** `nexcmp` dan direktori: `/opt/nexcmp` (program, dimiliki oleh root, hanya-baca untuk servis), `/etc/nexcmp` (konfigurasi), `/var/lib/nexcmp` (data), `/var/log/nexcmp`. 4. **Mengaktifkan lisensi** untuk domain dan menyimpan ID instans tetap untuk mesin ini. 5. **Mengunduh rilis terbaru yang menjadi hak Anda**, lalu memverifikasi SHA-256 dan tanda tangan Ed25519-nya. Rilis tanpa tanda tangan yang valid akan ditolak. Proses ini tidak akan pernah menurunkan versi yang sedang berjalan ke versi yang lebih lama. 6. **Menulis konfigurasi dan unit systemd** (`nexcmp`, `nexcmp-vmd`, `nexcmp-update`) lalu memulai servis; menunggu `/healthz` memberikan respons. 7. **Menyiapkan nginx dan TLS** (kecuali `--no-nginx`): mendapatkan sertifikat Let's Encrypt dengan certbot (tantangan webroot) untuk domain dan untuk `admin.` / `partner.` ketika nama-nama tersebut juga beresolusi. Jika DNS belum mengarah ke server ini (atau Cloudflare), langkah ini dilewati dan pesan akan ditampilkan. 8. **Menampilkan ringkasan** dengan URL dan, jika belum ada administrator yang dibuat, **kode penyiapan**. ## Port panel (3000) {#the-panel-port-3000} - Selama penginstalan pertama, panel mendengarkan pada `0.0.0.0:3000` sehingga Anda dapat membuka wisaya penyiapan di `http://:3000/setup`. - Setelah wisaya selesai **dan** TLS aktif, panel hanya mendengarkan pada `127.0.0.1`; nginx mem-proxy `https://` ke panel tersebut. - Untuk keadaan darurat (nginx rusak, DNS salah), Anda dapat membuka port untuk waktu terbatas: `sudo nexcmp open-port 30` (30 menit, lalu port akan ditutup secara otomatis) — atau gunakan terowongan SSH: `ssh -L 3000:127.0.0.1:3000 ` dan buka `http://127.0.0.1:3000/`. ::: warning HTTP Polos Port 3000 menggunakan HTTP polos. Gunakan hanya untuk wisaya penyiapan pada jaringan tepercaya, atau melalui terowongan SSH. Jangan biarkan port ini terbuka. ::: ## Menginstal tanpa domain publik (lab atau pengujian) {#installing-without-a-public-domain-lab-or-test} Anda dapat menginstal pada mesin yang belum memiliki DNS: ```bash curl -fsSL https://nexcmp.com/install.sh | sudo bash -s -- \ --license NXC-XXXXX-XXXXX-XXXXX-XXXXX --domain lab.example.com --no-nginx ``` Kemudian buka wisaya melalui terowongan SSH (`ssh -L 3000:127.0.0.1:3000 `, buka `http://127.0.0.1:3000/setup`). Jalankan ulang penginstal tanpa `--no-nginx` setelah DNS tersedia. ## Docker dan Kubernetes {#docker-and-kubernetes} Tidak ada image kontainer yang dipublikasikan. Installer (instalasi systemd bawaan) adalah metode instalasi yang didukung. ## Verifikasi {#verify} ```bash sudo nexcmp status ``` Anda akan melihat versi, `nexcmp: active`, `nexcmp-vmd: active`, `healthz: ok`, dan — hingga wisaya selesai — kode penyiapan. Lanjutkan dengan [setup wizard](https://nexcmp.com/id/docs/getting-started/setup-wizard/). Jika terjadi kegagalan, lihat [Installation errors](https://nexcmp.com/id/docs/troubleshooting/installation-errors/). --- # DNS dan Cloudflare {#dns-and-cloudflare} NexCMP membutuhkan satu nama DNS — **domain utamanya** — dan bekerja dalam dua mode. ## Mode A: DNS mengarah langsung ke server {#mode-a-dns-points-straight-at-the-server} 1. Buat catatan **A** `cloud.example.com → ` (dan catatan **AAAA** jika server memiliki IPv6). 2. Opsional, jika Anda menggunakannya: `admin.cloud.example.com` dan `partner.cloud.example.com` mengarah ke IP yang sama. 3. Jalankan (atau jalankan ulang) [installer](https://nexcmp.com/id/docs/getting-started/installation/). Penginstal akan mendeteksi bahwa nama tersebut beresolusi ke IP publik server itu sendiri dan mendapatkan sertifikat Let's Encrypt melalui tantangan HTTP-01 pada port 80. ## Mode B: domain diproxy oleh Cloudflare {#mode-b-the-domain-is-proxied-by-cloudflare} Buat catatan yang sama dengan awan oranye (**Proxied**). Penginstal mendeteksi bahwa nama tersebut hanya beresolusi ke alamat Cloudflare dan beralih ke mode Cloudflare: - nginx tetap mendengarkan pada port 80/443 di server Anda; - IP asli pengunjung dibaca dari header `CF-Connecting-IP` — **hanya** untuk koneksi yang berasal dari rentang alamat publik Cloudflare, sehingga tidak dapat dipalsukan oleh pihak lain; - sertifikat diperoleh melalui Let's Encrypt (Cloudflare meneruskan tantangan ke origin Anda); jika hal tersebut belum memungkinkan, **sertifikat origin yang ditandatangani sendiri** akan dibuat agar mode "Full" berfungsi, dan instal ulang kemudian akan memperbaruinya ke Let's Encrypt. Anda dapat memaksa mode ini dengan `--behind-cloudflare`. ::: important Atur mode SSL/TLS di Cloudflare Di Cloudflare, buka **SSL/TLS › Overview** dan pilih **Full (strict)** setelah installer melaporkan adanya sertifikat Let's Encrypt. Dengan sertifikat origin yang ditandatangani sendiri, gunakan **Full**. **Flexible** akan menyebabkan perulangan pengalihan (redirect loops). ::: ::: tip Jika "Always Use HTTPS" aktif, Cloudflare mengirimkan permintaan validasi ke port 443 origin Anda. Installer menangani ini dengan membuat sertifikat sementara yang ditandatangani sendiri terlebih dahulu, lalu mencoba ulang Let's Encrypt. ::: ## Pemeriksaan {#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 ``` Sertifikat diperbarui secara otomatis menggunakan pengatur waktu certbot. Pembaruan menggunakan webroot `/var/www/nexcmp-acme`, sehingga port 80 harus tetap dapat diakses (secara langsung maupun melalui Cloudflare). ## Masalah umum {#common-problems} | Gejala | Penyebab | Solusi | |---|---|---| | Installer menyatakan "DNS … does not point to … (nor to Cloudflare) — skipping nginx/TLS" | Catatan DNS hilang, salah, atau belum terpropagasi | Perbaiki catatan DNS, tunggu propagasi selesai, lalu jalankan ulang installer. | | Peramban menampilkan `ERR_TOO_MANY_REDIRECTS` di balik Cloudflare | Mode SSL adalah **Flexible** | Atur ke **Full (strict)** (atau **Full**). | | Kesalahan Cloudflare 525/526 | Sertifikat origin ditolak | Gunakan **Full** dengan sertifikat origin yang ditandatangani sendiri, atau **Full (strict)** dengan Let's Encrypt. | | Semua pengunjung menampilkan IP Cloudflare di log | Tidak berada dalam mode Cloudflare | Jalankan ulang installer dengan `--behind-cloudflare`. | Informasi selengkapnya di [Installation errors](https://nexcmp.com/id/docs/troubleshooting/installation-errors/). --- # Setup wizard {#setup-wizard} > **Letak di admin:** wizard adalah halaman mandiri di `/setup` yang hanya ditampilkan hingga administrator pertama dibuat. Setelah itu, pemeriksaan yang sama dapat diakses melalui System › Admin › Start (`/setup`). Wizard mengubah instalasi baru menjadi panel yang berfungsi dalam empat langkah singkat. Layanan ini berjalan pada port 3000 (`http://:3000/setup`) atau, jika TLS sudah aktif, di `https:///setup`. ::: warning Wizard menghilang setelah langkah 3 Setelah administrator dibuat, wizard ditutup dan kode penyiapan dihapus. Untuk mengakses panel setelahnya, gunakan konsol admin. ::: ## Step 0 — Setup code {#step-0-—-setup-code} Installer mencetak **kode penyiapan satu kali** di bagian akhir. Anda dapat membacanya kembali menggunakan: ```bash sudo nexcmp status ``` Tempelkan kode tersebut ke dalam **Setup code** lalu klik **Continue**. Kode ini melindungi wizard: tidak seorang pun yang menemukan port terbuka dapat membuat administrator tanpa kode tersebut. ![Langkah 0 dari wizard penyiapan yang meminta kode penyiapan satu kali](https://nexcmp.com/id/docs/images/getting-started/setup-wizard-00-code.webp) ## Step 1 — License {#step-1-—-license} | Kolom | Nilai | |---|---| | License key | `NXC-XXXXX-XXXXX-XXXXX-XXXXX` — diaktifkan sebelumnya oleh penginstal, sehingga langkah ini biasanya menampilkan "Activated for cloud.example.com" | | Domain utama | Domain yang terdaftar pada lisensi | Jika penginstal telah mengaktifkan lisensi, wizard akan mengenalinya dan melanjutkan. Jika tidak, masukkan kunci dan domain lalu klik **Activate**. Kesalahan ditampilkan dengan warna merah — lihat [Installation errors](https://nexcmp.com/id/docs/troubleshooting/installation-errors/). ![Langkah 1 wizard penyiapan yang menunjukkan lisensi telah diaktifkan untuk domain utama](https://nexcmp.com/id/docs/images/getting-started/setup-wizard-01-license.webp) ## Langkah 2 — CloudStack (atau Hubungkan nanti) {#step-2-—-cloudstack-or-connect-later} Anda memiliki dua pilihan: - **Hubungkan sekarang.** Masukkan **API URL** (`https://cloudstack.example.com/client/api`), **API key**, dan **Secret key** CloudStack, klik **Test connection**, lalu pilih **Zone**, **Guest network for customer VMs**, **Zone display name**, dan **Country** dua huruf. Klik **Save CloudStack**. - **Hubungkan nanti.** Klik **Connect later**. Segala hal lainnya tetap berfungsi; Anda dapat menghubungkan CloudStack atau Proxmox VE setelahnya di bawah Infrastructure. Sampai saat itu, panel kesehatan akan mengingatkan Anda bahwa belum ada sumber yang terhubung. ![Langkah 2 wizard dengan bidang URL API, kunci API, dan kunci rahasia CloudStack yang diisi dengan nilai contoh](https://nexcmp.com/id/docs/images/getting-started/setup-wizard-02-cloudstack-form.webp) ::: important Gunakan akun CloudStack khusus Jangan gunakan kunci administrator ROOT. Buat domain dan akun khusus untuk NexCMP serta gunakan kunci API-nya — lihat [CloudStack](https://nexcmp.com/id/docs/infrastructure/cloudstack/#create-a-dedicated-account-and-api-key). Wizard memeriksa bahwa jaringan yang dipilih milik zona dan akun dari kunci tersebut. ::: ![Setelah Test connection: daftar zona dan jaringan tamu, nama tampilan zona, serta bidang negara](https://nexcmp.com/id/docs/images/getting-started/setup-wizard-02b-cloudstack-picked.webp) Jika Anda berencana menggunakan **Proxmox VE** saja, pilih **Connect later** dan ikuti [Proxmox VE](https://nexcmp.com/id/docs/infrastructure/proxmox/). ## Langkah 3 — Administrator dan merek {#step-3-—-administrator-and-brand} | Kolom | Aturan | |---|---| | Email admin (masuk) | Alamat email yang valid. Ini adalah nama pengguna administrator Anda. | | Kata sandi | Setidaknya 12 karakter, berisi huruf dan angka. | | Nama merek | Ditampilkan kepada pelanggan Anda (bawaan "Cloud"). Hingga 60 karakter. | | Email dukungan | Secara default menggunakan email admin. | ![Langkah 3 wizard dengan email admin, kata sandi, nama merek, dan email dukungan](https://nexcmp.com/id/docs/images/getting-started/setup-wizard-03-admin.webp) Klik **Finish setup**. Panel akan dimulai ulang (sekitar 1–2 detik) dan halaman mengarahkan Anda ke login admin di `https:///admin/`. Jika alamat tersebut belum merespons (DNS atau TLS tertunda), halaman akan mengarahkan Anda ke `/` pada alamat saat ini. ![Wizard setelah selesai dengan pesan bahwa panel sedang dimulai ulang](https://nexcmp.com/id/docs/images/getting-started/setup-wizard-03-done.webp) ## Yang disiapkan wizard untuk Anda {#what-the-wizard-sets-up-for-you} - Nama merek, URL situs (`https://`), URL admin (`https:///admin`), URL konsol (`https:///console`), email dukungan, dan nama pengirim. - Pengaturan default untuk modul yang disertakan bersama NexCMP: DDoS & BGP, AI, dan web SSH bernilai **off**; pengukuran bandwidth bernilai **on**. Lihat [Modules](https://nexcmp.com/id/docs/infrastructure/modules/). - Jika Anda menghubungkan CloudStack: penyedia #1, zona pertamanya, jaringan tamu, serta pasangan kunci operasi yang dilampirkan ke VM pelanggan sehingga Anda dapat mendukung mereka. Berikutnya: [First login](https://nexcmp.com/id/docs/getting-started/first-login/). --- # Login pertama dan langkah berikutnya {#first-login-and-next-steps} > **Lokasi di admin:** halaman login adalah `/admin`; setelah masuk, halaman utama adalah Overview › Dashboard. ## Alamat {#addresses} | Apa | URL | |---|---| | Portal pelanggan | `https:///` | | Konsol admin | `https:///admin` | | Pengaturan / darurat per IP | `http://:3000/` (lihat [port panel](https://nexcmp.com/id/docs/getting-started/installation/#the-panel-port-3000)) | | Pemeriksaan kesehatan | `https:///healthz` | ## Masuk {#sign-in} 1. Buka `https:///admin`. 2. Masukkan email dan kata sandi administrator yang Anda buat di wizard. 3. Anda akan masuk ke **Dashboard**. Banner di bagian atas akan muncul jika lisensi tidak valid atau tidak ada sumber yang terhubung. ![Halaman login admin](https://nexcmp.com/id/docs/images/getting-started/first-login-01-login.webp) ## Daftar periksa yang disarankan {#recommended-checklist} Kerjakan langkah-langkah ini secara berurutan — masing-masing menautkan ke halamannya. | # | Tugas | Halaman | |---|---|---| | 1 | Aktifkan autentikasi dua faktor untuk akun Anda | [Security](https://nexcmp.com/id/docs/administration/security/) | | 2 | Sambungkan sumber infrastruktur (jika Anda memilih "Connect later") | [CloudStack](https://nexcmp.com/id/docs/infrastructure/cloudstack/) atau [Proxmox VE](https://nexcmp.com/id/docs/infrastructure/proxmox/) | | 3 | Periksa zona dan templat mesin / daftar OS | [Zones](https://nexcmp.com/id/docs/infrastructure/zones/), [Templates](https://nexcmp.com/id/docs/infrastructure/templates/) | | 4 | Tinjau paket dan harga | [Plans](https://nexcmp.com/id/docs/catalog/plans/) | | 5 | Atur logo, warna, dan halaman hukum Anda | [Branding](https://nexcmp.com/id/docs/customers/branding/), [Legal](https://nexcmp.com/id/docs/customers/legal/) | | 6 | Konfigurasikan email keluar dan kirim uji coba | [SMTP and emails](https://nexcmp.com/id/docs/administration/smtp-and-emails/) | | 7 | Aktifkan setidaknya satu kanal pembayaran dan uji coba isi saldo | [Payment channels](https://nexcmp.com/id/docs/billing/payment-channels/) | | 8 | Tentukan modul mana yang Anda jual | [Modules](https://nexcmp.com/id/docs/infrastructure/modules/) | | 9 | Buat pesanan uji coba sebagai pelanggan lalu hapus | [Ordering](https://nexcmp.com/id/docs/portal/ordering/) | | 10 | Buat cadangan pertama | [Backup and restore](https://nexcmp.com/id/docs/getting-started/backup-and-restore/) | ## Buat pesanan pertama Anda (uji asap) {#create-your-first-order-smoke-test} 1. Buka portal pelanggan di jendela penyamaran (private window) dan daftarkan akun uji coba. 2. Tambahkan kredit (voucher atau pembayaran uji coba). 3. Pesan paket terkecil di zona Anda. 4. Perhatikan pesanan tersebut muncul di admin di bawah Services › Virtual Machines, buka konsolnya, lalu hapus. Jika VM tidak mencapai status *running*, buka **Infrastructure › Cloud provider › Sync & errors** dan baca pesannya. --- # Updating NexCMP {#updating-nexcmp} > **Lokasi di admin:** System › Admin › License & updates (`/license`) → kartu *Update*. ## Yang Anda terima {#what-you-receive} | Jenis rilis | Dikirimkan saat | |---|---| | Perbaikan keamanan | **Selalu**, bahkan setelah tanggal "pembaruan hingga" Anda | | Rilis fitur | Hanya jika diterbitkan **pada atau sebelum** tanggal "pembaruan hingga" Anda | Anda dapat melihat kedua tanggal tersebut di **License & updates**. Perbarui hak akses di [nexcmp.com/licenses](https://nexcmp.com/licenses). ## Memperbarui dari konsol admin {#update-from-the-admin-console} 1. Buka **System › Admin › License & updates**. 2. Pada kartu **Update**, klik **Check for update**. Kartu ini menampilkan versi saat ini, versi terbaru yang dapat Anda instal, tag *security* jika relevan, serta daftar perubahan (changelog). 3. Klik **Update to X.Y.Z** dan konfirmasikan. Program akan mengunduh rilis, memverifikasi **tanda tangan SHA-256 dan Ed25519**, mengganti biner secara atomik (menyimpan salinan `.bak`) dan memulai ulang. Perkirakan waktu henti sekitar **10 detik**. 4. Muat ulang halaman dan periksa versi di pojok kanan atas License & updates. ![Kartu pembaruan dengan versi yang berjalan dan tombol Periksa versi baru](https://nexcmp.com/id/docs/images/getting-started/updating-01-card.webp) ## Memperbarui dari baris perintah {#update-from-the-command-line} ```bash sudo nexcmp update ``` Ini menjalankan penginstal yang disertakan *di dalam rilis yang sedang terpasang* (bukan skrip yang diunduh pada saat itu) dengan parameter tersimpan dari `/etc/nexcmp/install.conf`. Ini menyegarkan biner, unit systemd, templat nginx, dan agen node, serta menyimpan data, konfigurasi, dan akun. ::: tip Tidak pernah menurunkan versi Jika server menawarkan versi yang lebih lama daripada versi yang berjalan, penginstal akan tetap menggunakan versi yang berjalan. ::: ## Sebelum Anda memperbarui {#before-you-update} 1. Buat cadangan: `sudo nexcmp backup` — lihat [Backup and restore](https://nexcmp.com/id/docs/getting-started/backup-and-restore/). 2. Baca changelog di kartu Update. Untuk perubahan sejak 1.3, lihat [Catatan rilis hingga 1.6.1](https://nexcmp.com/id/docs/getting-started/release-notes/), termasuk pembaruan agen VPN dan aturan harga Bare Metal. 3. Perbarui selama periode tenang; mesin virtual yang berjalan tidak disentuh, tetapi pelanggan tidak dapat menggunakan portal selama beberapa detik. ## Setelah Anda memperbarui {#after-you-update} - Jalankan `sudo nexcmp status` dan konfirmasikan kedua layanan aktif. - Buka Dasbor admin dan halaman **Needs attention**. - Migrasi database berjalan secara otomatis saat pertama kali memulai versi baru. - Jika Anda menjalankan node VPN, perbarui agennya secara terpisah dan periksa pembacaan penggunaan. Memperbarui panel membuat agen baru tersedia; ini tidak membuktikan bahwa setiap remote node sudah menjalankannya. Lihat [Batas kuota data node VPN](https://nexcmp.com/id/docs/infrastructure/vpn-proxy-nodes/#data-allowance-on-a-vpn-node). Jika pembaruan gagal, lihat [Update errors](https://nexcmp.com/id/docs/troubleshooting/update-errors/). --- # Catatan rilis {#release-notes} > **Lokasi di admin:** System › Admin › License & updates (`/license`), kartu **Update**. Catatan ini mencakup perubahan setelah 1.3 hingga **NexCMP 1.6.1**. Buat cadangan sebelum memperbarui dan gunakan rilis yang ditawarkan kartu **Update** instalasi Anda. Lihat [Memperbarui NexCMP](https://nexcmp.com/id/docs/getting-started/updating/) untuk perintah dan pemeriksaan tanda tangan. ## 1.6.1 - **Metrik Bare Metal:** **Overview** pelanggan menampilkan tile CPU, RAM, aktivitas disk, dan jaringan beserta riwayat terbaru. Pengukuran yang tidak ada menampilkan tanda pisah dan alasannya. Pembacaan jaringan memerlukan penghitung traffic; data ini tidak diambil dari inventaris perangkat keras iDRAC. - **Paket sampel Bare Metal:** nama sampel menggunakan `BM-40C-`. Paket sampel bawaan yang belum Anda edit diberi nama netral. Paket yang diedit tetap dipertahankan, dan paket yang dirujuk tetap mempertahankan kodenya. Periksa perangkat keras server sebenarnya sebelum membuat paket dapat dijual. - **Perubahan paket:** daftar permintaan admin diurutkan di sisi server dan tombol aksinya tetap terlihat saat menggulir secara horizontal. - **Laporkan bug:** formulir dapat digulir dengan tombol yang tetap terlihat. Penyembunyian kata sandi tetap mempertahankan teks diagnostik di sekitarnya. - **Pemuatan:** sumber daya halaman dan data admin yang sering digunakan dimuat lebih awal untuk mengurangi jeda navigasi. Lihat [Penyiapan, penentuan harga, dan kontrol pelanggan Bare Metal](https://nexcmp.com/id/docs/infrastructure/dedicated/) serta [Laporkan bug](https://nexcmp.com/id/docs/administration/report-a-bug/). ## 1.6.0 - **Penyiapan Bare Metal:** masukkan jaringan iDRAC, alamat server ISO, dan alamat callback panel di **Safety › Management network connection**. Nilai sampel memblokir operasi langsung hingga dikonfigurasi. - **Hosting ISO:** `sudo nexcmp dedicated-setup-iso` menyiapkan web server ISO jaringan manajemen. Installer dapat menginstal konsol dan utilitas ISO dengan `--baremetal` atau opsi ISO. Utilitas yang hilang akan memblokir operasi langsung dengan `tools_missing`. - **Harga Bare Metal:** instalasi baru atau yang belum digunakan dimulai dengan harga USD. Instalasi yang sudah memiliki data harga VND tetap mempertahankan VND dan masih memerlukan kurs USD/VND. Memperbarui sistem tidak akan menginterpretasikan ulang harga yang sudah ada tersebut sebagai dolar. - **Halaman server pelanggan:** perpanjang lebih awal, jadwalkan perubahan siklus billing, minta perubahan paket, baca invoice, dan lihat info login OS setelah instalasi. Pemilik baru tidak dapat melihat kata sandi pemilik sebelumnya. - **Profil pelanggan:** delapan tab mengelompokkan overview, services, billing, kuota, keamanan, support, afiliasi, dan log. Layanan digabungkan dalam satu tabel yang dapat dicari dan diurutkan. - **Tindakan layanan:** kunci, buka kunci, batalkan tanpa pengembalian dana, atau batalkan dengan pengembalian dana menggunakan dialog umum. Pengembalian dana dikembalikan ke dompet asli atau alokasi kredit; pemroses pembayaran tidak dikembalikan secara otomatis. Lihat [Server dedicated](https://nexcmp.com/id/docs/infrastructure/dedicated/) dan [Mengelola pelanggan](https://nexcmp.com/id/docs/customers/managing-customers/). BYOIP dan penautan subnet pelanggan ke server Bare Metal tetap belum tersedia di NexCMP. ## 1.5.2 Administrator utama dapat membuka **Report a bug** di sebelah **Docs** dan mengirimkan tiket ke akun lisensi tanpa perlu login terpisah. Diagnostik bersifat opsional. Staf, pelanggan, dan asisten AI tidak dapat mengirimkan laporan melalui tindakan ini. Lihat [Report a bug](https://nexcmp.com/id/docs/administration/report-a-bug/). ## 1.5.1 - **Penggunaan VPN:** node agen melaporkan lalu lintas ke panel. Langganan yang kuota GB-nya habis akan diputus; langganan akan tersedia kembali setelah peningkatan bandwidth atau periode baru. Node tanpa laporan penggunaan menampilkan **Not measured** dan tidak diputus berdasarkan GB. - **Agen VPN:** versi 1.5.1 mencoba ulang pengiriman penggunaan yang belum dikonfirmasi, mengirimkan lalu lintas akhir saat shutdown, dan menutup koneksi terbuka saat endpoint dihentikan. Perbarui agen jarak jauh serta panelnya. - **Add-on VPN yang dihentikan:** High IP Reputation, High Concurrency, dan High Priority Network tidak lagi dijual. Biayanya dihapus dari jumlah perpanjangan mendatang untuk langganan yang ada; periode sebelumnya tidak dikembalikan dananya. Jika sebuah add-on telah dihapus dari katalog, periksa jumlah perpanjangan secara manual. - **Label protokol:** proksi HTTP IPv4 adalah HTTP biasa. Alamat IPv4 tidak dirotasi. Port 443 proksi IPv6 melayani SOCKS5; ini bukan endpoint proksi HTTPS. - **Penyiapan baru:** inisialisasi database mencoba ulang konflik migrasi sementara antara panel dan worker sehingga penyimpanan penyedia pertama tidak memerlukan restart. Lihat [Node VPN dan proksi IPv6](https://nexcmp.com/id/docs/infrastructure/vpn-proxy-nodes/). ## 1.5.0 **AI Models** adalah modul gateway dan penagihan opsional, nonaktif secara default. Tambahkan sumber model yang Anda operasikan atau berwenang untuk dijual kembali, sinkronkan model, tetapkan harga dan rute, aktifkan model, lalu buka penjualan. Tidak ada akun penyedia, model, atau harga bawaan. Modul ini terpisah dari modul AI Chat dan AI Agent. Lihat [AI Models](https://nexcmp.com/id/docs/infrastructure/ai-models/). ## 1.4.2 Penginstalan node proksi IPv6 menggunakan daemon dan skrip jaringan yang disertakan dalam paket rilis. Panel memerlukan `sshpass` untuk penginstalan SSH berbasis kata sandi. Panel menjalankan jadwal rotasi, dan penyiapan node mengecualikan alamat gateway dari alokasi. Branding dapat menetapkan nama tampilan layanan VPN kustom. Lihat [Node VPN dan proksi IPv6](https://nexcmp.com/id/docs/infrastructure/vpn-proxy-nodes/). ## 1.4.0–1.4.1 - **Administrasi AI:** AI Chat admin, akun AI pribadi, kunci API admin, server MCP admin, konektor OAuth, impor/ekspor konfigurasi, dan checklist penyiapan kini tersedia. Lihat [Konfigurasi dengan AI](https://nexcmp.com/id/docs/configure-with-ai/overview/). - **Lisensi:** Alur kerja Free dan Source mencakup build resmi serta build sumber kustom. Akun, lisensi, unduhan, dan dokumentasi menggunakan `nexcmp.com`. Lihat [Lisensi dan pembelian](https://nexcmp.com/id/docs/getting-started/license-and-purchase/). - **Tautan dokumentasi:** **Docs** di admin membuka panduan untuk halaman saat ini. - **Mata uang:** penginstalan baru mengikuti bahasa pelanggan secara default. USD/VND berasal dari tabel nilai tukar publik atau tarif tetap Anda. Lihat [Mata uang dan nilai tukar](https://nexcmp.com/id/docs/catalog/currency-and-exchange-rates/). - **Zona lintas sumber:** harga Cloud Server publik berfungsi saat CloudStack dan Proxmox VE berbagi satu zona. Paket menggunakan sumber infrastrukturnya masing-masing. - **Harga turunan dari offering:** persentasenya merupakan margin pada harga jual. Margin 40% pada biaya $60 menghasilkan $100, sebelum pembulatan apa pun. ## Checklist peningkatan {#upgrade-checklist} 1. Cadangkan data, baca kartu **Update**, lakukan pembaruan, lalu jalankan `sudo nexcmp status`. 2. Perbarui agen VPN dan pastikan node melaporkan lalu lintas yang terukur sebelum mengandalkan pemutusan berbasis GB. 3. Jika menggunakan Bare Metal, periksa bidang jaringan manajemen, alat yang diperlukan, unit harga, template, dan contoh paket sebelum membuka penjualan atau operasi langsung. 4. Buka profil pelanggan dan verifikasi daftar layanannya. Periksa jumlah dan alokasi pembayaran awal sebelum mengonfirmasi pembatalan dengan pengembalian dana. 5. Biarkan modul opsional nonaktif hingga infrastrukturnya siap. Untuk AI Models, verifikasi penyedia, model dengan harga, dan permintaan pelanggan yang berhasil sebelum membuka penjualan. --- # Backup and restore {#backup-and-restore} > **Di mana letaknya di admin:** System › Admin › Backup (`/backup`) hanya muncul bila modul DDoS & BGP diaktifkan; untuk instalasi standar, gunakan baris perintah di bawah ini. ## Data yang dicadangkan {#what-is-backed-up} `sudo nexcmp backup` membuat satu arsip terkompresi yang berisi: | Bagian | Konten | |---|---| | `data/**/*.db` | Setiap database SQLite di `/var/lib/nexcmp`, disalin menggunakan API cadangan online SQLite — konsisten bahkan saat panel sedang berjalan | | `files.tar` | Semua file lain di `/var/lib/nexcmp` (file pengaturan, unggahan branding, `secrets/`), kecuali database dan folder `updates/` | | `etc/` | Salinan `/etc/nexcmp` (pengaturan penginstal, ID instans, port, dan bind) | ::: warning Arsip berisi kunci master Anda `secrets/` menyimpan kunci yang mengenkripsi kunci API, kredensial pembayaran, dan sandi SMTP yang disimpan di dalam database. Arsip dibuat dengan izin `0600`. Simpan dalam keadaan terenkripsi dan di luar server. Tanpa kunci-kunci ini, database yang dipulihkan tidak dapat mendekripsi data rahasianya. ::: ## Membuat cadangan {#take-a-backup} ```bash sudo nexcmp backup # writes to /var/backups/nexcmp sudo nexcmp backup /mnt/nas/nexcmp # or to another directory ``` Perintah ini mencetak jalur arsip, misalnya `/var/backups/nexcmp/nexcmp-backup-20261030-120000.tar.zst`. ### Menjadwalkannya {#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 ``` Salin folder tersebut ke luar mesin (penyimpanan objek, NAS, server lain). ## Memulihkan {#restore} Pulihkan ke server tempat NexCMP dengan **versi yang sama (atau lebih baru)** terinstal. 1. Instal NexCMP menggunakan [pemasang](https://nexcmp.com/id/docs/getting-started/installation/) dengan lisensi dan domain yang sama, tetapi **jangan** jalankan wizard penyiapan. 2. Hentikan layanan: ```bash sudo systemctl stop nexcmp-vmd nexcmp ``` 3. Ekstrak arsip ke dalam direktori sementara: ```bash sudo mkdir /root/restore && sudo tar --zstd -xf nexcmp-backup-20261030-120000.tar.zst -C /root/restore ``` 4. Kembalikan file-file tersebut: ```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. Jalankan kembali layanan dan periksa: ```bash sudo systemctl start nexcmp nexcmp-vmd sudo nexcmp status ``` 6. Masuk ke `https:///admin` menggunakan akun administrator dari sistem yang *dicadangkan*. ::: tip Lakukan uji coba Lakukan langkah 1–6 pada server cadangan satu kali sebelum Anda membutuhkannya. Cadangan yang belum pernah Anda pulihkan hanyalah sebuah harapan. ::: ## Tidak disertakan {#not-included} - Konfigurasi dan sertifikat nginx (dibuat ulang oleh pemasang; sertifikat Let's Encrypt diterbitkan ulang). - Server CloudStack / Proxmox VE Anda dan mesin virtual di dalamnya — cadangkan dengan alat mereka masing-masing. --- # Copot Pemasangan NexCMP {#uninstall-nexcmp} ::: warning Pelanggan kehilangan akses Pencopotan pemasangan akan menghentikan portal dan penagihan. Mesin virtual di CloudStack atau Proxmox VE Anda akan tetap berjalan, tetapi tidak ada yang mengelola atau menagihnya. Buat [cadangan](https://nexcmp.com/id/docs/getting-started/backup-and-restore/) terlebih dahulu. ::: ## Hapus program, simpan data {#remove-the-program-keep-the-data} ```bash sudo nexcmp uninstall ``` Ini menonaktifkan dan menghapus layanan `nexcmp` dan `nexcmp-vmd`, situs dan cuplikan nginx, `/opt/nexcmp`, serta perintah `nexcmp`. **Data tetap tersimpan** di `/var/lib/nexcmp` dan `/etc/nexcmp`, sehingga pemasangan ulang di kemudian hari pada server yang sama akan dilanjutkan dari posisi terakhir Anda. ## Hapus semuanya {#remove-everything} ```bash sudo nexcmp uninstall --purge ``` Selain itu, tindakan ini menghapus `/var/lib/nexcmp`, `/etc/nexcmp`, `/var/log/nexcmp`, dan pengguna sistem `nexcmp`. Tindakan ini tidak dapat dibatalkan. ## Setelah pencopotan pemasangan {#after-uninstalling} - Sertifikat Let's Encrypt dan paket `nginx` / `certbot` dibiarkan tetap ada. Hapus sertifikat dengan `sudo certbot delete --cert-name ` jika Anda mau. - Lepaskan domain pada halaman lisensi Anda di [nexcmp.com/licenses](https://nexcmp.com/licenses) jika Anda ingin mengaktifkannya di tempat lain. - Hapus akun CloudStack / token API Proxmox khusus yang dibuat untuk NexCMP jika Anda tidak lagi membutuhkannya. --- # Referensi perintah `nexcmp` {#nexcmp-command-reference} Pemasang menempatkan alat bantu di `/usr/local/bin/nexcmp`. Jalankan pada server NexCMP. Perintah yang mengubah sistem memerlukan `sudo`. (Alat di sisi pelanggan untuk API adalah program yang berbeda, lihat [cmp CLI](https://nexcmp.com/id/docs/developers/cmp-cli/).) | Perintah | Memerlukan root | Fungsi | |---|---|---| | `nexcmp status` | Tidak (detail lebih lanjut dengan `sudo`) | Versi, status layanan (`nexcmp`, `nexcmp-vmd`), `/healthz`, ringkasan lisensi, status port publik, kode penyiapan jika wizard belum selesai | | `nexcmp update` | Ya | Menjalankan pemasang yang disertakan dalam rilis terinstal dengan parameter yang disimpan — lihat [Updating](https://nexcmp.com/id/docs/getting-started/updating/) | | `nexcmp backup [dir]` | Ya | Cadangkan ke `/var/backups/nexcmp` (atau `dir`) — lihat [Backup and restore](https://nexcmp.com/id/docs/getting-started/backup-and-restore/) | | `nexcmp uninstall [--purge]` | Ya | Hapus layanan dan program; `--purge` juga menghapus data — lihat [Uninstall](https://nexcmp.com/id/docs/getting-started/uninstall/) | | `nexcmp open-port [minutes]` | Ya | **Darurat**: dengarkan port panel (default 3000) di semua antarmuka selama 1–1440 menit (default 30), lalu tutup secara otomatis | | `nexcmp close-port` | Ya | Tutup jendela darurat sekarang | | `nexcmp fix-owner` | Ya | Kembalikan kepemilikan file di `/var/lib/nexcmp` yang milik root ke pengguna `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) ``` Jika file dalam direktori data dimiliki oleh root (misalnya dibuat dengan menjalankan perintah `nexcmp` lain dengan `sudo` sebagai root), `status` mencetak peringatan karena pengguna layanan tidak dapat membacanya — gejala umumnya adalah lisensi yang menampilkan HTTP 421. Perbaiki dengan `sudo nexcmp fix-owner`. Perbaikan yang sama berjalan otomatis pada setiap awal layanan. ## Akses darurat {#emergency-access} Ketika domain, nginx, atau TLS mengalami gangguan, Anda tetap dapat mengakses panel: ```bash sudo nexcmp open-port 30 # http://:3000/ for 30 minutes sudo nexcmp close-port # close it earlier ``` Lebih aman, tanpa membuka apa pun: `ssh -L 3000:127.0.0.1:3000 user@server` dan buka `http://127.0.0.1:3000/`. ## Lingkungan {#environment} | Variabel | Digunakan untuk | |---|---| | `NEXCMP_BASE` | Timpa URL dasar server lisensi (default `https://nexcmp.com`); khusus untuk pengujian | File dan direktori: program `/opt/nexcmp`, konfigurasi `/etc/nexcmp`, data `/var/lib/nexcmp`, log `/var/log/nexcmp` dan `journalctl -u nexcmp -u nexcmp-vmd`. --- # Persyaratan infrastruktur {#infrastructure-requirements} > **Di mana di admin:** Infrastructure (zona menu sebelah kiri) dan System › Admin › License & updates (`/license`) untuk mengaktifkan modul. Halaman ini mencantumkan apa yang dibutuhkan setiap modul **di luar** server NexCMP. Untuk server itu sendiri (Ubuntu, memori, disk, port), lihat [Requirements for the NexCMP server](https://nexcmp.com/id/docs/getting-started/requirements/). Untuk mengaktifkan modul, lihat [Modules](https://nexcmp.com/id/docs/infrastructure/modules/). ## Modul demi modul {#module-by-module} | Modul | Infrastruktur minimum | Detail | |---|---|---| | **Virtual Machines on CloudStack** | Apache CloudStack 4.23 (telah diuji), KVM, zona tingkat lanjut dengan jaringan tamu dan rentang IP publik; domain dan akun khusus dengan kunci API (bukan ROOT); setidaknya satu templat siap pakai dan satu penawaran layanan | [CloudStack](https://nexcmp.com/id/docs/infrastructure/cloudstack/) | | **Virtual Machines on Proxmox VE** | Proxmox VE 9.x (diverifikasi pada 9.2); token API dengan peran kustom; penyimpanan yang dapat melakukan kloning; bridge; blok IPv4 dengan gateway; satu templat cloud-init per OS dan per node | [Proxmox VE](https://nexcmp.com/id/docs/infrastructure/proxmox/) | | **OS templates** | CloudStack: mesin build Linux dengan libguestfs dan server web untuk image tersebut. Proxmox VE: templat cloud-image dengan guest agent | [OS templates](https://nexcmp.com/id/docs/infrastructure/templates/) | | **Bare metal / Dedicated Server** | Server Dell dengan iDRAC 9 yang dapat diakses melalui HTTPS (Redfish) dari panel di jaringan manajemen; server HTTP di jaringan tersebut yang melayani file ISO; folder ISO yang dapat ditulisi untuk layanan NexCMP | [Dedicated servers](https://nexcmp.com/id/docs/infrastructure/dedicated/) | | **AI Models** | Satu atau beberapa sumber model yang Anda diizinkan untuk menjualnya kembali, dengan API yang kompatibel dengan OpenAI atau Anthropic serta kunci Anda sendiri; HTTPS keluar (port 443, nama domain publik) dari panel ke setiap sumber, atau gateway internal yang terdaftar di Allowed internal hosts; tanpa GPU atau perangkat keras khusus | [AI Models](https://nexcmp.com/id/docs/infrastructure/ai-models/) | | **VPN** | Satu atau beberapa host Linux (x86_64, systemd, root) dengan alamat IPv4 publik pada antarmuka atau dirutekan ke sana, HTTPS keluar ke panel Anda | [Node VPN dan proxy](https://nexcmp.com/id/docs/infrastructure/vpn-proxy-nodes/) | | **IPv6 Proxy** | Host Linux (x86_64, systemd, `nft`, `ip`, `ss`, `sysctl`) dengan IPv4 publik, port 80, 443 dan 60001-65535 kosong, serta prefiks IPv6 dari /32 hingga /64 yang berfungsi untuk lalu lintas keluar; akses SSH dengan kata sandi untuk instalasi satu kali | [Node VPN dan proxy](https://nexcmp.com/id/docs/infrastructure/vpn-proxy-nodes/) | | **Object Storage (S3)** | Kluster Ceph dengan RADOS Gateway (RGW), pengguna Admin Ops, dan titik akhir HTTPS publik pada port 443 | [S3](https://nexcmp.com/id/docs/infrastructure/s3/) | | **Kubernetes** | CloudStack dengan Layanan Kubernetes (CKS) diaktifkan, setidaknya satu ISO versi Kubernetes, dan penawaran layanan control-plane gratis berukuran tepat 2 vCPU dan 2048 MB | [Kubernetes dan Private Cloud](https://nexcmp.com/id/docs/infrastructure/kubernetes-and-private-cloud/) | | **Private Cloud** | CloudStack dengan penawaran VPC dan satu penawaran jaringan per paket bandwidth (plus penawaran 1 Mbps yang dikunci) | [Kubernetes dan Private Cloud](https://nexcmp.com/id/docs/infrastructure/kubernetes-and-private-cloud/) | | **OS & ISO Images** | CloudStack yang VM storage sekundernya dapat menjangkau Internet untuk mengunduh gambar pelanggan (tautan langsung, tanpa pengalihan); akun CloudStack dapat mendaftarkan template dan ISO | [Modules](https://nexcmp.com/id/docs/infrastructure/modules/) | | **Bandwidth** | Tidak ada tambahan dengan sumber default: penggunaan dibaca dari statistik VM CloudStack. VM pada Proxmox VE tidak diukur | [Bandwidth](https://nexcmp.com/id/docs/catalog/bandwidth/) | | **AI Chat and AI Agent** | API yang kompatibel dengan OpenAI (URL dasar, model, dan kunci) yang dapat dijangkau oleh server panel. Tidak ada perangkat lunak tambahan di server Anda | [AI providers](https://nexcmp.com/id/docs/ai/ai-providers/) | | **DDoS & BGP** | Paket tambahan yang memerlukan host router edge dengan daemon yang berjalan sebagai root (BGP, pemfilteran, statistik aliran). Ini bukan bagian dari instalasi standar | [Modules](https://nexcmp.com/id/docs/infrastructure/modules/) | | **DDoS Shield** | Add-on DDoS & BGP | [Modules](https://nexcmp.com/id/docs/infrastructure/modules/) | | **Web SSH terminal** | Layanan proxy SSH terpisah dan rute untuknya. Ini bukan bagian dari instalasi standar; AI Agent tidak memerlukannya | [Modules](https://nexcmp.com/id/docs/infrastructure/modules/) | ## Sekilas jalur jaringan {#network-paths-at-a-glance} | Dari | Ke | Port | Tujuan | |---|---|---|---| | Server panel | Server manajemen CloudStack | 443 atau 8080 (seperti yang Anda publikasikan) | API | | Server panel | Node Proxmox VE | 8006/tcp | API dan konsol | | Server panel | Dell iDRAC | 443/tcp (dan port VNC, default 5901) | Redfish dan konsol | | iDRAC | Server web ISO | port HTTP yang Anda pilih (misalnya 8080) | Media virtual | | Server panel | Ceph RGW | 443/tcp | Admin Ops | | Server panel | Node proxy IPv6 | Port SSH yang Anda masukkan | Pemasangan satu kali | | Node VPN dan proxy | Panel (melalui nginx) | 443/tcp | Pendaftaran, detak jantung, konfigurasi | | Pelanggan | Node VPN dan proxy | port per-IP 65001-65535 (VPN); 80, 443, 60001-65535 (proxy IPv6) | Layanan itu sendiri | ::: tip Jaga jaringan manajemen tetap privat Alamat manajemen iDRAC dan hypervisor harus berada di jaringan yang tidak dapat dijangkau oleh pelanggan. NexCMP menolak alamat iDRAC di luar rentang privat yang Anda izinkan. ::: ## Daftar periksa sebelum Anda menjual {#checklist-before-you-sell} 1. Infrastruktur di balik layanan pertama telah terhubung dan **Test connection** berwarna hijau. 2. Sebuah zona siap dijual (lihat [Zones](https://nexcmp.com/id/docs/infrastructure/zones/)): backend aktif, paket, dan templat yang siap. 3. Saluran pembayaran telah dikonfigurasi (lihat [Payment channels](https://nexcmp.com/id/docs/billing/payment-channels/)). 4. Email berfungsi (lihat [SMTP and e-mails](https://nexcmp.com/id/docs/administration/smtp-and-emails/)). 5. Anda telah membuat satu pesanan uji coba dan menghapus VM tersebut. --- # Arsitektur {#architecture} > **Lokasi di admin:** ini adalah halaman referensi. Layanan yang dijelaskan di sini terlihat dengan `sudo nexcmp status`; koneksi dikonfigurasi di Infrastructure dan System › Settings. ## Gambaran umum {#the-picture} ![Arsitektur NexCMP: pelanggan mengakses nginx melalui DNS dan secara opsional Cloudflare, nginx melakukan proksi ke panel pada port 3000, panel dan worker memanggil CloudStack, Proxmox VE, iDRAC, Ceph, gateway pembayaran, SMTP, dan penyedia AI, serta node VPN dan proksi IPv6 berkomunikasi kembali ke panel](https://nexcmp.com/id/docs/images/infrastructure/architecture.svg) ### Penjelasan diagram secara terperinci {#the-same-diagram-in-words} 1. Pelanggan atau administrator membuka `https://cloud.example.com` (portal), `https://cloud.example.com/admin` (konsol admin), atau memanggil REST API. DNS mengarahkan nama domain ke server Anda, atau ke Cloudflare yang memproksikannya. 2. **nginx** pada server panel mendengarkan di port 80 (pengalihan dan pembaruan sertifikat) serta 443 (TLS) dan meneruskan setiap permintaan ke **panel** di `127.0.0.1:3000`. Setelah panduan pengaturan selesai, panel hanya mendengarkan di antarmuka loopback. 3. **panel** (`nexcmp.service`) melayani portal pelanggan, konsol admin, REST API, panduan penyiapan, serta unduhan yang dibutuhkan node (biner agen, skrip penginstalan, alat baris perintah `cmp`). Panel juga memeriksa lisensi Anda sekali sehari. 4. **worker** (`nexcmp-vmd.service`) mendengarkan di `127.0.0.1:8112`, yang hanya bersifat lokal. Worker menjalankan semua hal yang memakan waktu atau harus terjadwal: tugas provisi, sinkronisasi dengan CloudStack dan Proxmox VE, pembaruan penagihan, pengumpulan bandwidth, dan koneksi konsol browser. 5. Dari kedua proses ini NexCMP melakukan panggilan keluar: **CloudStack** (manajemen API), **Proxmox VE** (API di port 8006, sertifikat di-pin), **Dell iDRAC** (Redfish melalui HTTPS pada jaringan manajemen), **Ceph RGW** (S3 dan Admin Ops melalui HTTPS), **gateway pembayaran** (Stripe, PayPal, USDT, dan penyedia transfer bank, yang juga memanggil URL webhook Anda), **server SMTP Anda**, **penyedia AI** dengan API yang kompatibel dengan OpenAI, serta secara opsional **Telegram**. 6. **Node VPN** menjalankan `cmp-agent`. Setiap node mendaftar sekali dengan token sekali pakai, lalu mengirim heartbeat setiap 5 detik melalui HTTPS ke panel dan menerima konfigurasinya dalam balasan. **Node proksi IPv6** diinstal sekali oleh panel melalui SSH, kemudian mengambil konfigurasinya dari panel. 7. Status disimpan di basis data SQLite dan beberapa file di `/var/lib/nexcmp`. Kredensial untuk CloudStack, Proxmox, S3, iDRAC, dan penyedia AI disimpan dalam bentuk terenkripsi (AES-256-GCM) dengan file kunci master di area yang sama. ## Layanan dan proses {#services-and-processes} | Proses | Dijalankan sebagai | Mendengarkan di | Fungsi | |---|---|---|---| | `nginx` | root (worker `www-data`) | 80, 443 | TLS, pengalihan, proksi ke panel | | `nexcmp` | `nexcmp` | 3000 (semua antarmuka saat instalasi pertama, lalu `127.0.0.1`) | Portal, konsol admin, API, wizard, unduhan | | `nexcmp-vmd` | `nexcmp` | `127.0.0.1:8112` | Pekerjaan, sinkronisasi, penagihan, bandwidth, konsol | | `nexcmp-update` | root | tidak ada | Menerapkan pembaruan yang diminta konsol admin (unit path menunggu permintaan) | | `cmp-agent` (pada node VPN) | root | port pendengar VPN | Melaporkan ke panel, menjalankan listener proxy pada IPv4 publik | Panel dan worker berjalan sebagai pengguna biasa tanpa kapabilitas Linux apa pun, dengan sistem file baca-saja kecuali `/var/lib/nexcmp` dan `/var/log/nexcmp`. Keduanya tidak memerlukan root, Docker, database terpisah, maupun Redis. ## File dan lokasinya {#files-and-where-they-are} | Path | Konten | |---|---| | `/opt/nexcmp` | Program: rilis, `bin/`, file bersama seperti pembuat template. Dimiliki oleh root, baca-saja untuk layanan. | | `/etc/nexcmp` | Pengaturan penginstal (`install.conf`), port dan bind (`nexcmp.env`). | | `/var/lib/nexcmp` | Database SQLite, branding yang diunggah, folder unduhan agen, status lisensi, file kunci master. Cadangkan ini. | | `/var/log/nexcmp` | Log. | Lihat [Backup and restore](https://nexcmp.com/id/docs/getting-started/backup-and-restore/). File kunci master harus dicadangkan bersama dengan database, jika tidak, database yang dipulihkan tidak dapat mendekripsi kredensial yang tersimpan. ## Siapa yang terhubung ke siapa {#who-connects-to-whom} | Arah | Path | Port | Catatan | |---|---|---|---| | Pelanggan ke panel | Internet, DNS, Cloudflare opsional, nginx | 443 | Lihat [DNS and Cloudflare](https://nexcmp.com/id/docs/getting-started/dns-and-cloudflare/). | | Panel ke server lisensi | `nexcmp.com` | 443 | Aktivasi, pemeriksaan harian, dan pembaruan. | | Panel ke CloudStack | API | 443 atau 8080 | Konsol VM, bandwidth, dan fitur Kubernetes menggunakan endpoint yang sama. | | Panel ke Proxmox VE | API dan konsol WebSocket | 8006 | Sertifikat di-pin oleh SHA-256. | | Panel ke iDRAC | Redfish | 443, VNC 5901 | Hanya jaringan manajemen. | | iDRAC ke server ISO | HTTP | port Anda | iDRAC menarik ISO. | | Panel ke Ceph RGW | Admin Ops | 443 | | | Panel ke SMTP | SMTP | 587 atau 465 | | | Panel ke penyedia AI | HTTPS | 443 | Hanya saat modul AI aktif. | | Gateway pembayaran ke panel | Webhook | 443 | Stripe dan PayPal melakukan callback. | | Node ke panel | `cmp-agent` | 443 | Pendaftaran, detak jantung, peningkatan. | | Panel ke node proxy IPv6 | SSH | port yang Anda masukkan | Instalasi satu kali saja. | ## Mengapa ini penting {#why-it-matters} - **Panel yang dapat dijangkau adalah panel yang dapat diserang.** Tutup port 3000 setelah wisaya penyiapan selesai. Pemasang sudah melakukan ini saat TLS aktif. - **Worker harus berjalan** agar apa pun dapat dibuat atau ditagih. `sudo nexcmp status` menampilkan kedua layanan dan pemeriksaan kesehatan. - **Rencanakan firewall keluar.** Jika lalu lintas keluar server panel difilter,izinkan tujuan dalam tabel di atas. - **Lalu lintas manajemen tetap di luar jalur publik.** Koneksi ke CloudStack, Proxmox VE, iDRAC, dan Ceph berjalan langsung dari server panel ke sistem tersebut, tidak pernah melalui nginx atau Cloudflare. --- # Modules {#modules} > **Lokasi di admin:** System › Admin › License & updates (`/license`), kartu **Module**. ## Fungsi {#what-it-does} Modul adalah layanan atau fitur yang dapat Anda aktifkan atau nonaktifkan secara utuh. Modul yang **nonaktif** disembunyikan dari menu admin dan pelanggan tidak dapat membelinya; rute API-nya menjawab `404 module_disabled` jika modul tersebut adalah add-on. Mengaktifkan modul hanya menampilkan fitur: infrastruktur di baliknya tetap harus dihubungkan (lihat kolom terakhir). ## Persyaratan {#requirements} | Item | Persyaratan | |---|---| | Akun | Administrator dengan akses tulis. Staf dengan akses baca saja dapat melihat tombol pengaktifan tetapi tidak dapat mengubahnya. | | Infrastruktur | Lihat tabel: setiap modul mencantumkan persyaratannya. | | Bergantung pada | Beberapa modul memerlukan modul lain (DDoS Shield memerlukan DDoS & BGP). | ## Siapkan infrastruktur {#prepare-the-infrastructure} Tidak wajib untuk tombol pengaktifannya sendiri. Hubungkan infrastruktur setiap modul seperti yang dijelaskan pada halaman yang ditautkan di dalam tabel. ## Hubungkan di NexCMP {#connect-in-nexcmp} 1. Buka **System › Admin › License & updates** dan gulir ke kartu **Module**. Dinyatakan bahwa modul yang dinonaktifkan disembunyikan dari menu admin dan tidak dapat dibeli oleh pelanggan. 2. Gunakan tombol pengaktifan modul. Halaman akan mengonfirmasi **Saved: reloading menu** dan memuat ulang, sehingga menu berubah seketika. ![Kartu Module di License & updates dengan tombol pengaktifan untuk setiap modul](https://nexcmp.com/id/docs/images/infrastructure/modules-01-license-modules.webp) ### Modul-modul {#the-modules} | Modul (seperti yang ditampilkan) | Default | Yang ditambahkan | Kebutuhan | Halaman | |---|---|---|---|---| | **Virtual Machines** | selalu aktif | Katalog VM, pesanan, konsol, snapshot | CloudStack atau Proxmox VE | [CloudStack](https://nexcmp.com/id/docs/infrastructure/cloudstack/), [Proxmox VE](https://nexcmp.com/id/docs/infrastructure/proxmox/) | | **Bandwidth** | **aktif** | Kuota, add-on, peringatan, dan tindakan kelebihan batas untuk VM, Kubernetes, dan S3 | Tidak ada tambahan (statistik VM CloudStack) | [Bandwidth](https://nexcmp.com/id/docs/catalog/bandwidth/) | | **OS & ISO Images** | nonaktif | Pelanggan mendaftarkan image OS dan ISO mereka sendiri, ditagih per GB | CloudStack; Akses internet untuk VM penyimpanan sekundernya | [Requirements](https://nexcmp.com/id/docs/infrastructure/requirements/) | | **Kubernetes** | nonaktif | Kluster Kubernetes (CKS) | CloudStack dengan CKS diaktifkan | [Kubernetes dan Private Cloud](https://nexcmp.com/id/docs/infrastructure/kubernetes-and-private-cloud/) | | **Private Cloud** | nonaktif | VPC dengan paket bandwidth dedikasi | VPC CloudStack dan penawaran jaringan | [Kubernetes dan Private Cloud](https://nexcmp.com/id/docs/infrastructure/kubernetes-and-private-cloud/) | | **Object Storage** | nonaktif | Akun S3 pada Ceph RGW, bayar sesuai pemakaian | Ceph RGW dan zone dengan layanan S3 | [S3](https://nexcmp.com/id/docs/infrastructure/s3/) | | **VPN** | nonaktif | VPN di node Anda sendiri | Node yang menjalankan `cmp-agent` | [Node VPN dan proxy](https://nexcmp.com/id/docs/infrastructure/vpn-proxy-nodes/) | | **IPv6 Proxy** | nonaktif | Proxy IPv6 di node Anda sendiri | Node proxy dengan prefix IPv6 | [Node VPN dan proxy](https://nexcmp.com/id/docs/infrastructure/vpn-proxy-nodes/) | | **Bare Metal** | nonaktif | Server Dell melalui iDRAC: pesanan, instalasi OS, konsol, daya | iDRAC 9 pada jaringan manajemen | [Dedicated servers](https://nexcmp.com/id/docs/infrastructure/dedicated/) | | **AI Models** | nonaktif | Gateway untuk menjual akses ke model AI: satu kunci untuk banyak model, harga per model, batas penggunaan, log, penagihan dompet | Sumber model yang Anda bawa: API yang kompatibel dengan OpenAI atau Anthropic dengan kunci Anda sendiri | [AI Models](https://nexcmp.com/id/docs/infrastructure/ai-models/) | | **AI** | nonaktif | AI Chat (dukungan otomatis) dan AI Agent (administrasi VM dengan bahasa sehari-hari) | Provider yang kompatibel dengan OpenAI | [AI providers](https://nexcmp.com/id/docs/ai/ai-providers/) | | **DDoS Shield** | nonaktif | Perlindungan IP untuk pelanggan; memerlukan DDoS & BGP, sehingga switch-nya tetap nonaktif tanpanya | Add-on DDoS & BGP | di bawah | | **DDoS & BGP** | nonaktif, **add-on** | Konsol router edge: BGP, RTBH, XDP, sesi, dan trafik edge | Host edge dengan daemon root | di bawah | ### Fungsi setiap switch {#which-switch-does-what} - **Bare Metal** memiliki dua lapisan. Switch modul menampilkan menu admin dan API. Penjualan ke pelanggan adalah switch terpisah dengan konfirmasi bertetik di bawah **Services › Dedicated Server**, dan setiap penulisan ke iDRAC diblokir sampai Anda mengaktifkan **live ops** di bawah **Infrastructure › Bare Metal › Safety**. Lihat [Dedicated servers](https://nexcmp.com/id/docs/infrastructure/dedicated/). - Untuk **Kubernetes**, **Private Cloud**, **VPN**, **IPv6 Proxy**, dan **Images**, switch modul dan switch penjualan pada halaman layanan berlaku untuk pengaturan yang sama. - **AI** juga memerlukan provider yang dikonfigurasi di bawah **System › Settings › AI provider**. - **AI Models** memiliki dua lapisan. Sakelar modul menampilkan menu admin dan API. Penjualan ke pelanggan menggunakan sakelar penjualan terpisah di bagian atas halaman AI Models, nonaktif secara default. Lihat [AI Models](https://nexcmp.com/id/docs/infrastructure/ai-models/). ### Modul yang dibaca saat mulai {#modules-read-at-start-up} Tiga fitur bukan merupakan switch biasa. Fitur-fitur tersebut dibaca **sekali saat layanan dimulai** dan memerlukan infrastruktur yang tidak disertakan dalam instalasi standar. | Fitur | Pengaturan | Status | Kebutuhan | |---|---|---|---| | DDoS & BGP | `module_ddos` | Ditampilkan sebagai **Add-on package** saat nonaktif, **Installed** saat aktif. Tidak ada switch di konsol. | Daemon router edge (BGP, RTBH, XDP, statistik aliran) yang berjalan sebagai root. Panel berjalan sebagai pengguna tanpa hak istimewa dan tidak dapat menjalankannya. | | AI | `module_ai` | Switch normal. Rute langsung mengikutinya; pekerjaan latar belakang AI Chat (investigasi tiket, balasan terjadwal) dimulai pada restart layanan berikutnya. Konsol menyatakan bahwa restart disarankan. | Provider AI. | | Web SSH terminal | `feature_ssh_web` | Nonaktif secara default, tanpa switch di konsol | Layanan proxy SSH terpisah dan rutenya. Tanpanya, tab Console pada portal hanya menampilkan VNC. **AI Agent tidak membutuhkannya**: agen menjalankan perintah melalui koneksi SSH yang dibuat sendiri oleh panel. | Setelah mengubah pengaturan saat mulai, restart layanan: `sudo systemctl restart nexcmp nexcmp-vmd`. ## Verifikasi {#verify} 1. Entri menu modul akan muncul (atau hilang) setelah pemuatan ulang. 2. Untuk modul yang menghadap pelanggan, portal menampilkan entri menu baru bagi pelanggan yang masuk. Modul yang nonaktif tidak menampilkan apa pun atau "coming soon". ## Batasan dan catatan {#limits-and-notes} - Menonaktifkan modul tidak menghapus apa pun. VM, klaster, akun S3, dan langganan yang berjalan akan terus berjalan dan ditagih; pelanggan hanya tidak dapat membuat yang baru. - Halaman kuota hanya mencantumkan layanan yang modulnya aktif. ## Pemecahan Masalah {#troubleshooting} | Gejala | Penyebab | Solusi | |---|---|---| | Entri menu tidak muncul | Halaman tidak dimuat ulang | Muat ulang konsol admin. | | Tombol DDoS Shield dinonaktifkan | DDoS & BGP belum terpasang | DDoS Shield memerlukan pengaya DDoS & BGP. | | "Modul ini adalah paket pengaya dan tidak dapat dialihkan di sini" (HTTP 409 atau 422) | Anda (atau sebuah skrip) mencoba mengalihkan DDoS & BGP | Ini adalah paket pengaya; tidak ada tombol pengalih. | | "DDoS Shield memerlukan pengaya DDoS & BGP" | Sama, untuk DDoS Shield | Pasang pengaya tersebut terlebih dahulu. | | Rute modul merespons 404 `module_disabled` | Modul dalam keadaan mati | Nyalakan modul tersebut. | | AI Chat merespons tetapi investigasi tiket tidak pernah dimulai | Modul AI dinyalakan tanpa memulai ulang | `sudo systemctl restart nexcmp nexcmp-vmd`. | | Staf baca-saja tidak dapat menyimpan | Peran mereka adalah baca-saja | Gunakan akun administrator. | --- # Zona {#zones} > **Di mana di admin:** Infrastructure › Datacenter › Zone (`/infra/zones`). Halaman detail zona adalah `/infra/zones/`. ## Fungsi {#what-it-does} **Zona** adalah lokasi yang dipilih pelanggan saat memesan: negara dan kota dengan bendera, beserta layanan yang dijual di sana. Ini adalah konsep penjualan, terpisah dari zona, kluster, dan node pada platform di belakangnya. Di balik zona, Anda melampirkan **infrastruktur**: zona CloudStack, kluster Proxmox VE, node VPN dengan rentang IP, backend S3. Zona 1 dibuat oleh [pemandu penyiapan](https://nexcmp.com/id/docs/getting-started/setup-wizard/), dengan nama tampilan dan negara yang Anda masukkan. Tambahkan lebih banyak zona saat Anda memiliki infrastruktur di lebih banyak tempat, atau untuk memberikan lokasi tersendiri pada VPN dan S3. ## Persyaratan {#requirements} | Item | Persyaratan | |---|---| | Izin | Akun administrator. Peran staf baca-saja hanya dapat melihat tetapi tidak dapat mengubah. | | Infrastruktur | Sebuah zona tidak menjual apa pun sampai sesuatu dilampirkan ke zona tersebut (lihat "Layanan mana yang dijual di mana" di bawah). | | Bergantung pada | [CloudStack](https://nexcmp.com/id/docs/infrastructure/cloudstack/) atau [Proxmox VE](https://nexcmp.com/id/docs/infrastructure/proxmox/) untuk VM, [node VPN dan proksi](https://nexcmp.com/id/docs/infrastructure/vpn-proxy-nodes/) untuk VPN, [S3](https://nexcmp.com/id/docs/infrastructure/s3/) untuk penyimpanan objek. | ## Siapkan infrastruktur {#prepare-the-infrastructure} Tidak wajib. Zona adalah catatan di dalam NexCMP. ## Hubungkan di NexCMP {#connect-in-nexcmp} ### Membuat zona {#create-a-zone} 1. Buka **Infrastructure › Datacenter › Zone** dan klik **Add zone**. 2. Isi formulir berikut: | Kolom | Contoh nilai | Catatan | |---|---|---| | Negara | `United States` | Memilih bendera. | | Kota | `New York` | Opsional. | | Name (Vietnamese), Name (English) | `New York` | Nama yang dilihat pelanggan dalam setiap bahasa. | | Slug | `us-new-york` | a-z, 0-9, tanda hubung, 2-32 karakter. Diisi otomatis dari negara dan kota hingga Anda mengetiknya sendiri. | | Visibilitas | Public | Zona **Public** terlihat oleh setiap pelanggan; zona **Hidden** hanya diberikan oleh administrator. | | Urutan | `0` | Angka yang lebih kecil muncul lebih dahulu dalam daftar. | | Layanan yang dijual di zona ini | Virtual Machines (VM), VPN, Object Storage (S3) | Centang setidaknya satu. | | Aktif | On | **Off** menyembunyikan zona dari pelanggan. | | Default | nonaktif | Zona yang dipilih otomatis untuk pelanggan yang belum menentukan pilihan. Tepat satu zona menjadi default. | ![Dialog penambahan zona dengan negara, kota, slug, dan layanan yang dicentang](https://nexcmp.com/id/docs/images/infrastructure/zones-01-add-zone.webp) 3. Klik **Create zone**. Daftar akan menampilkan zona beserta benderanya, pemilik, layanan, status, serta jumlah VM, paket, dan infrastruktur yang terhubung. ![Daftar zona dengan zona default dan zona kedua](https://nexcmp.com/id/docs/images/infrastructure/zones-02-list.webp) ### Melihat infrastruktur yang terhubung {#look-at-what-is-attached} Klik baris untuk membuka zona. Tab **Provider infrastructure** mencantumkan setiap backend yang terhubung beserta penyedia, jenis (CloudStack atau Proxmox VE), wilayah, status, dan prioritasnya. Tab **VPN infrastructure** mencantumkan rentang dan node VPN zona tersebut serta menautkan ke pool VPN. ![Detail zona dengan tab Provider infrastructure](https://nexcmp.com/id/docs/images/infrastructure/zones-03-detail.webp) ### Lokasi penjualan setiap layanan {#which-service-sells-where} | Layanan | Cara dimasukkan ke dalam zona | |---|---| | Virtual Machines di CloudStack | Wizard (atau **Infrastructure › Cloud provider › CloudStack**) menghubungkan CloudStack ke zona 1. | | Virtual Machines di Proxmox VE | Pada tab **Clusters** kluster, klik **Attach cluster to zone**. Kluster akan bergabung ke zona yang **sudah ada**, biasanya zona yang menjual melalui CloudStack. | | VPN | Node VPN yang melaporkan rentang IP publiknya akan membuat (atau bergabung dengan) zona untuk negaranya dan memasukkan rentang tersebut ke pool VPN. Anda juga dapat menetapkan zona dan node dari suatu rentang di bawah **VPN IP pools**. | | IPv6 Proxy | Node IPv6 proxy baru membuat zonanya dalam status **off**. Aktifkan zona di sini agar pelanggan dapat memilihnya. | | Object Storage (S3) | Centang layanan S3 pada zona, lalu hubungkan backend di bawah **Ceph S3 (RGW)**. | ### Kapan zona dapat menjual virtual machine? {#when-can-a-zone-sell-virtual-machines} Sebuah zona menampilkan tag **not ready to sell VMs** hingga memiliki setidaknya satu backend aktif yang dapat dijual **dan** setidaknya satu paket yang terlihat **dan** setidaknya satu template siap pakai pada backend tersebut. Formulir pemesanan pelanggan hanya mencantumkan zona yang sudah siap. ## Verifikasi {#verify} 1. Zona muncul dalam daftar sebagai **On**, dengan bendera yang sesuai. 2. Halaman detailnya menampilkan backend atau rentang VPN yang Anda harapkan. 3. Untuk VM: tag **not ready to sell VMs** sudah hilang. Di portal pelanggan, mulai pemesanan dan pastikan zona tersebut ditawarkan. ## Batasan dan catatan {#limits-and-notes} - Pada rilis NexCMP ini, pelanggan memesan mesin virtual di **default zone** (zona 1). Zona lain digunakan untuk VPN, IPv6 Proxy, dan Object Storage, atau untuk menyiapkan lokasi sebelum memiliki infrastruktur; catatan di bawah daftar zona menyatakan hal yang sama. - Zona hanya dapat dihapus jika tidak ada yang terhubung: tidak ada backend, VM, paket, atau rentang VPN. Default zone tidak dapat dihapus; jadikan zona lain sebagai default terlebih dahulu. - Zona yang dimiliki oleh reseller hanya dapat diaktifkan atau dinonaktifkan serta disembunyikan atau ditampilkan oleh Anda; bidang lainnya terkunci. - Slug adalah bagian dari referensi internal. Pilih sekali saja. ## Pemecahan Masalah {#troubleshooting} | Gejala | Penyebab | Solusi | |---|---|---| | "Nama zona wajib diisi" / "Pilih negara" / "Pilih minimal 1 layanan" | Kolom wajib diisi kosong | Isi nama, pilih negara, dan centang sebuah layanan. | | "Slug tidak valid (a-z 0-9 -, 2-32 karakter)" | Slug memiliki karakter lain atau panjang yang salah | Gunakan huruf kecil, angka, dan tanda hubung saja. | | Tag "belum siap menjual VM" | Tidak ada backend aktif yang dapat dijual, tidak ada plan, atau tidak ada templat siap di zona tersebut | Lampirkan infrastruktur, lalu tambahkan plan dan templat. Lihat [Plans](https://nexcmp.com/id/docs/catalog/plans/) dan [Templates](https://nexcmp.com/id/docs/infrastructure/templates/). | | Delete dinonaktifkan dengan "still attached" | Zona memiliki backend, VM, plan, atau rentang VPN | Hapus atau pindahkan terlebih dahulu. | | Delete dinonaktifkan dengan "Default zone" | Zona adalah zona default | Atur zona lain sebagai default. | | Pelanggan tidak melihat zona | Zona disembunyikan, tidak aktif, atau tidak ada layanan yang dicentang | Atur Visibility ke Public, Active ke On, dan centang layanan tersebut. | | Zona S3 tidak ada dari formulir backend | Layanan S3 tidak dicentang pada zona | Edit zona dan centang **Object Storage (S3)**. | --- # CloudStack > **Where in the admin:** Infrastructure › Cloud provider › CloudStack › API connection (`/infra/cloudstack?tab=connect`). Koneksi pertama juga dapat dibuat di [setup wizard](https://nexcmp.com/id/docs/getting-started/setup-wizard/), langkah 2. ## Fungsi {#what-it-does} NexCMP menjual mesin virtual yang berjalan di cloud Apache CloudStack Anda. Software ini mendeploy, memulai, menghentikan, mengubah ukuran, mengambil snapshot, dan menghapus VM melalui API CloudStack, membagikan alamat IP publik dari zona, membaca penggunaan untuk penagihan dan bandwidth, serta menampilkan kapasitas dan status kesehatan di konsol admin. CloudStack tetap menjadi sumber kebenaran untuk hypervisor; NexCMP adalah etalase, penagihan, dan portal di atasnya. Gunakan halaman ini jika CloudStack adalah (atau akan menjadi) sumber VM utama Anda. Untuk sumber kedua di sampingnya, lihat [Proxmox VE](https://nexcmp.com/id/docs/infrastructure/proxmox/). ## Persyaratan {#requirements} | Item | Persyaratan | |---|---| | Versi CloudStack | 4.23 adalah rilis yang telah diuji. Konsol VM memerlukan 4.18 atau yang lebih baru, dan scaling CPU/RAM langsung dari VM yang berjalan memerlukan 4.23 dengan KVM. | | Tipe zona | Zona dengan setidaknya satu jaringan tamu untuk VM pelanggan dan rentang IP publik dengan alamat gratis. | | Hypervisor | KVM adalah hypervisor yang telah diuji. | | Akun | Sebuah **domain dan akun khusus** yang dibuat untuk NexCMP. Jangan pernah menggunakan kunci administrator ROOT. | | Keterjangkauan API | Server panel harus dapat menjangkau URL API server manajemen (`https://cloudstack.example.com/client/api`) melalui HTTP(S). Konsol VM, bandwidth, dan fitur Kubernetes menggunakan endpoint yang sama. | | Kunci baca-saja opsional | Kunci kedua yang bersifat baca-saja memungkinkan konsol admin menampilkan host, penyimpanan, VM sistem, dan rentang IP publik. Tidak diperlukan untuk menjual VM. | | IP publik | Alamat IPv4 publik gratis di zona. Awalan yang dapat dijual oleh NexCMP dikonfigurasi di bawah Sales IP pools. | | Templat | Setidaknya satu templat yang siap dan mendukung kata sandi serta satu penawaran layanan yang dapat dilihat oleh akun Anda. Lihat [Templates](https://nexcmp.com/id/docs/infrastructure/templates/). | | Storage | Storage primer untuk volume akun dan, jika Anda menjual snapshot atau image, storage sekunder. | | Bergantung pada | Tidak ada. Kubernetes, Private Cloud, Images, dan Bandwidth bergantung pada halaman ini. | ::: warning Jangan gunakan kunci administrator ROOT Buat domain dan akun khusus untuk NexCMP. Kunci tersebut kemudian hanya menjangkau domain itu, dan kunci yang bocor tidak dapat menyentuh seluruh cloud Anda. Wizard penyiapan juga memeriksa apakah jaringan yang Anda pilih milik zona **serta** akun yang memiliki kunci tersebut. ::: ## Siapkan infrastruktur {#prepare-the-infrastructure} Perintah-perintah ini menggunakan [CloudMonkey](https://cloudstack.apache.org/) (`cmk`) yang masuk sebagai administrator CloudStack. Ganti nama contoh dan placeholder di dalam tanda kurung siku. ### Buat akun dan kunci API khusus {#create-a-dedicated-account-and-api-key} 1. Buat domain yang akan menampung semua hal yang dimiliki NexCMP. ```bash cmk create domain name=nexcmp ``` Catat `id` pada output; itu digunakan sebagai `` di bawah ini. 2. Cari peran yang ingin Anda berikan ke akun tersebut. ```bash cmk list roles type=DomainAdmin filter=id,name ``` | Role | Kapan harus memilihnya | |---|---| | **Domain Admin** (disarankan) | Fitur lengkap: VM, jaringan, proyek untuk Kubernetes, VPC, image. Jangkauannya berhenti di domain `nexcmp`. | | User | Hanya siklus hidup VM. Pengguna biasa tidak dapat menghapus permanen (expunge) VM kecuali pengaturan global `allow.user.expunge.recover.vm` bernilai true; NexCMP kemudian menghentikan VM dan CloudStack menghapusnya setelah `expunge.delay`. | 3. Buat akun dan pengguna pertamanya. Gunakan kata sandi acak yang panjang; kata sandi ini tidak akan pernah diketik lagi. ```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. Buat pasangan kunci API untuk pengguna baru. ```bash cmk list users domainid= username=nexcmp-api filter=id,username cmk generate userkeys id= ``` Salin `apikey` dan `secretkey`. Keduanya adalah **API key** dan **Secret key** yang Anda masukkan di NexCMP. NexCMP menyimpannya dalam keadaan terenkripsi dan hanya menampilkan empat karakter terakhir setelahnya. 5. Pastikan domain tidak memiliki batasan sumber daya yang ketat (instance, volume, IP publik, jaringan, snapshot, templat, proyek). ```bash cmk list resourcelimits domainid= ``` ### Buat jaringan tamu untuk VM pelanggan {#create-the-guest-network-for-customer-vms} VM pelanggan disebarkan ke dalam satu jaringan tamu milik akun baru. Jaringan terisolasi dengan virtual router (VR) serta layanan Static NAT, Firewall, dan Port Forwarding bekerja dengan baik, karena NexCMP menautkan IP publik ke setiap VM menggunakan 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= ``` Periksa kebijakan egress default dari penawaran: jika bernilai "deny", VM pelanggan tidak memiliki akses keluar hingga aturan egress firewall ditambahkan. ### Buat penawaran dan templat agar dapat dilihat {#make-offerings-and-templates-visible} - **Service offerings** dan **network offerings** harus bersifat publik atau ditetapkan ke domain `nexcmp`, jika tidak, akun tidak dapat mencantumkan atau menggunakannya. - Daftarkan atau bagikan setidaknya satu templat (lihat [Templates](https://nexcmp.com/id/docs/infrastructure/templates/)). NexCMP mencantumkan templat yang sudah siap dan berstatus featured. ### Opsional: kunci baca-saja untuk halaman infrastruktur {#optional-read-only-key-for-infrastructure-pages} Tab **Capacity**, **Host**, **Storage**, dan **System VM** serta daftar rentang IP publik menggunakan kunci kedua yang hanya memerlukan akses baca ke enam perintah. Buat peran terbatas alih-alih menggunakan kembali kunci administrator penuh: ```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 ``` Lalu buat akun dengan peran tersebut (di domain ROOT, karena akun tersebut membaca data di seluruh zona), buat kuncinya seperti langkah 4, dan masukkan sebagai **RO API key** di bagian berikutnya. ### Periksa jalur jaringan {#check-the-network-path} Dari server panel: ```bash curl -fsS -o /dev/null -w '%{http_code}\n' https://cloudstack.example.com/client/api ``` Respon HTTP apa pun (bahkan 4xx) membuktikan port dapat dijangkau. Timeout berarti ada masalah firewall atau DNS di sisi Anda. ## Hubungkan di NexCMP {#connect-in-nexcmp} ### Dalam wizard penyiapan {#in-the-setup-wizard} Langkah 2 dari [setup wizard](https://nexcmp.com/id/docs/getting-started/setup-wizard/) meminta nilai yang sama. **Test connection** mencantumkan zona dan jaringan yang dapat dilihat oleh kunci tersebut; pilih zona dan jaringan tamu, nama tampilan untuk zona dan negara, lalu klik **Save CloudStack**. Wizard menolak jaringan yang tidak berada di zona tersebut atau tidak terlihat oleh kunci. ![Langkah 2 wizard dengan URL API CloudStack dan kunci yang terisi serta zona dan jaringan yang dipilih setelah Test connection](https://nexcmp.com/id/docs/images/infrastructure/cloudstack-01-wizard-step.webp) ### Nanti, di konsol admin {#later-in-the-admin-console} 1. Buka **Infrastructure › Cloud provider › CloudStack** dan pilih tab **API connection**. 2. Isi kartu **Connection**: | Kolom | Contoh nilai | |---|---| | Endpoint API | `https://cloudstack.example.com/client/api` | | Kunci API (akses tulis) | `XXXX` (biarkan kosong untuk mempertahankan kunci yang disimpan) | | Kunci rahasia | `XXXX` | | Kunci API RO / Kunci rahasia RO | opsional, dari akun baca-saja | | ID Zona | UUID zona Anda | ![Tab koneksi API dengan contoh endpoint dan kunci yang disamarkan](https://nexcmp.com/id/docs/images/infrastructure/cloudstack-02-connect-form.webp) 3. Klik **Test connection** sebelum menyimpan. Ini menguji kunci yang Anda ketik tanpa menyimpannya: kunci tulis dengan `listZones` dan `listCapabilities`, serta kunci baca-saja dengan `listSystemVms`. 4. Klik **Save connection**. Biarkan **Enable CloudStack connection** tetap aktif; mematikannya akan membuat worker menghentikan semua tugas CloudStack tanpa kehilangan data. 5. Buka **Services › Virtual Machines › Policy › Provisioning** untuk mengatur jaringan tamu default, penawaran kustom, dan pasangan kunci default untuk VM baru. ![Kebijakan VM, tab Provisioning, dengan ID jaringan default](https://nexcmp.com/id/docs/images/infrastructure/cloudstack-04-provisioning.webp) 6. Buka **Infrastructure › Cloud provider › Sales IP pools** dan, di bawah **Configure sales ranges**, atur **Sellable IP range prefixes** (misalnya `203.0.113.`) dan **Excluded IP prefixes** jika beberapa alamat di zona tidak boleh dijual sama sekali. Biarkan prefiks kosong untuk mengizinkan setiap alamat gratis. ![Kumpulan IP Penjualan dengan prefiks yang dapat dijual 203.0.113. diset](https://nexcmp.com/id/docs/images/infrastructure/cloudstack-05-sales-ip-pool.webp) ### Yang dibaca dan ditulis oleh NexCMP {#what-nexcmp-reads-and-writes} | Area | Pembacaan | Perubahan | |---|---|---| | VMs | daftar, status, riwayat penggunaan, endpoint konsol | menerapkan, memulai, menghentikan, memuat ulang, menginstal ulang, menghancurkan, menskalakan, mereset kata sandi dan kunci SSH | | Disk dan snapshot | volume, snapshot VM, cadangan | membuat, melampirkan, melepaskan, mengubah ukuran, menghapus, mengambil snapshot, memulihkan | | Jaringan | jaringan, router, IP publik, firewall, penerusan port, aturan penyeimbang beban | menghubungkan dan merilis IP publik, NAT statis, firewall, penerusan port, aturan egress, jaringan dan ACL untuk Private Cloud | | Katalog | layanan, penawaran disk dan jaringan, templat, ISO, jenis OS | mendaftarkan dan menghapus templat dan ISO (Gambar), penawaran layanan saat membuat paket kustom | | Kubernetes | versi yang didukung, kluster, konfigurasi | proyek, batas sumber daya, jaringan, kluster (modul Kubernetes) | | Kunci baca-saja | host, klaster, storage pool, system VM, kapasitas, rentang IP VLAN | tidak ada | ### CPU dan RAM langsung, serta bandwidth {#live-cpu-and-ram-and-bandwidth} - **Hot-plug.** VM yang sedang berjalan dapat diubah ukurannya tanpa reboot hanya jika template-nya mengizinkan (dapat diskalakan secara dinamis) dan sistem tamu membawa CPU serta RAM baru secara online. NexCMP mengaktifkan Auto Scaling untuk template yang namanya berakhiran `vN` dengan N bernilai 6 atau lebih, atau saat Anda menyetelnya secara manual di bidang **vCPU/RAM hot-plug** pada template. Lihat [Templates](https://nexcmp.com/id/docs/infrastructure/templates/). - **Sumber bandwidth.** Dengan pengaturan default, NexCMP mengukur lalu lintas dari statistik VM CloudStack (`listVirtualMachinesUsageHistory`, diambil setiap 5 menit dan dijumlahkan per antarmuka jaringan VM). Angka-angka tersebut mencakup lalu lintas antar-VM, sehingga bisa sedikit lebih tinggi daripada yang dihitung oleh router edge. Tetap aktifkan pengumpulan statistik VM CloudStack; jeda yang lebih lama dari retensi statistik akan dilewati. Lihat [Bandwidth](https://nexcmp.com/id/docs/catalog/bandwidth/). ## Verifikasi {#verify} 1. **Test connection** mengembalikan "Write key: OK" beserta zona Anda dan versi CloudStack. 2. **Infrastructure › Cloud provider › Providers** menampilkan penyedia sebagai aktif dengan waktu pengujian baru-baru ini. Panel kesehatan dasbor tidak lagi menampilkan "CloudStack: not connected". 3. **Sales IP pools** mencantumkan alamat bebas (ini diperbarui sekitar sekali seminggu/menit). 4. Pesan VM kecil dari portal pelanggan atau konsol admin dan pastikan statusnya mencapai Running, memiliki IP publik, serta Anda dapat membuka konsol tersebut. ## Batasan dan catatan {#limits-and-notes} - Satu klaster CloudStack dapat dihubungkan dalam rilis NexCMP ini. Dialog **Add cloud provider** dapat menguji kunci klaster kedua tetapi tidak dapat menyimpannya. - Satu zona CloudStack dilampirkan ke zona default NexCMP; CloudStack dengan beberapa zona dicakupkan ke zona yang Anda masukkan, sehingga VM, IP, dan jaringan dari zona lain akan diabaikan. - Menghapus jaringan tamu di CloudStack akan membuat setiap deployment baru gagal. Konsol admin menampilkan pemberitahuan berwarna merah saat jaringan tersebut hilang. - Kredensial tidak pernah meninggalkan server. API hanya mengembalikan empat karakter terakhir. ## Pemecahan Masalah {#troubleshooting} | Gejala | Penyebab | Solusi | |---|---|---| | `listCapabilities: cloudstack 401: unable to verify user credentials and/or request signature` | Kunci atau secret API salah, kunci dari pengguna lain, atau masalah jam pada server panel | Buat ulang kunci dengan `cmk generate userkeys` dan tempelkan keduanya. Periksa waktu server panel. | | Pengujian: `listZones: …` atau waktu habis (timeout) | Server panel tidak dapat menjangkau URL API | Periksa DNS, firewall, dan jalur `/client/api` yang tepat. | | Wizard: "jaringan tidak ditemukan di zona tersebut untuk API key ini" | Jaringan yang dipilih milik akun atau zona lain | Buat jaringan di akun khusus (lihat di atas) dan jalankan **Test connection** sekali lagi. | | Wizard: "pilih zona dan jaringan" | Pengujian belum dijalankan, atau tidak ada zona maupun jaringan yang dipilih | Klik **Test connection** dan pilih kedua daftar tersebut. | | Banner "kunci CloudStack belum dikonfigurasi" | Belum ada kunci yang disimpan ("Connect later") | Isi kartu Connection, **Save connection**, lalu **Test connection**. | | Banner "CloudStack connection is OFF" | Tombol sakelar **Enable CloudStack connection** dalam posisi mati | Nyalakan dan simpan. | | Kunci baca-saja: "unusable …" dalam pengujian | Izin peran hilang atau akun salah | Periksa keenam perintah yang diizinkan dan pastikan akun berada di domain ROOT. | | "Zone public IP ranges not measured yet" atau "no public IP ranges declared" | Tidak ada kunci baca-saja, atau zona tersebut memang tidak memiliki rentang publik | Tambahkan kunci baca-saja, atau tambahkan rentang IP publik di CloudStack. | | "Pool kosong — tunggu 60 dtk untuk sinkronisasi vmd" | Daftar IP disegarkan oleh pekerja sekali setiap menit | Tunggu sebentar dan muat ulang. | | "kehabisan IP Bebas dalam rentang 203.0.113." | Setiap alamat dalam prefiks yang dapat dijual telah digunakan | Tambahkan alamat ke zona, perluas prefiks, atau lepaskan IP yang tidak digunakan. | | "Gagal mengambil data jaringan (CloudStack tidak merespons atau kunci kurang izin)" | Kunci kehilangan akses, atau CloudStack sedang mati | Jalankan **Test connection**; pastikan akun diaktifkan. | | "Jaringan tamu TIDAK ada" | Jaringan dihapus di CloudStack | Buat kembali jaringan tersebut dan tetapkan sebagai default di bawah Provisioning. | --- # Proxmox VE > **Where in the admin:** Infrastructure › Cloud provider › Providers (`/infra/providers`), lalu halaman penyedia (`/infra/providers/`) dengan tab Overview, Clusters, VMs, Servers, dan Credentials. Paket diatur di bawah Services › Virtual Machines › Plans & pricing (`/vm/catalog`). ## Fungsi {#what-it-does} NexCMP dapat menjual mesin virtual yang berjalan di satu atau beberapa kluster Proxmox VE, bersamaan dengan atau menggantikan CloudStack. VM dibuat dengan mengklon templat OS menggunakan klon penuh, lalu dikonfigurasi melalui cloud-init: ukuran, alamat IP dari kumpulan yang Anda tentukan, kata sandi root, dan kunci SSH. Pelanggan mendapatkan kontrol daya, konsol, snapshot, instal ulang, pengaturan ulang kata sandi, dan metrik di portal. Mereka tidak akan pernah melihat nama kluster, node, atau sumber. Gunakan ini saat Anda sudah menjalankan Proxmox VE, atau untuk menawarkan kumpulan VM kedua dengan harga yang berbeda. ## Persyaratan {#requirements} | Item | Persyaratan | |---|---| | Proxmox VE | PVE 9.x. Integrasi ini diverifikasi pada 9.2. Ini memerlukan konten penyimpanan `import` dan opsi diska `import-from` (PVE 8.2 atau lebih baru). | | Jaringan dari panel | HTTPS ke API kluster, `https://:8006`. Tanpa jalur, nama pengguna, atau kueri. Panel dan pekerja sama-sama terhubung; konsol peramban diproksi melalui panel. | | Akun | Pengguna PVE khusus dengan **API token** dan peran kustom dengan hak istimewa yang tercantum di bawah ini. Jangan pernah menggunakan `root@pam`. | | Storage | Penyimpanan untuk diska VM yang mendukung klon (misalnya `local-lvm`). Untuk pembangun templat bawaan, penyimpanan bernama `local` dengan jenis konten `import` dan `snippets`. | | Jaringan | Jembatan Linux (misalnya `vmbr0`) yang menjangkau jaringan tempat IP pelanggan berada. Gunakan jembatan yang mendukung VLAN jika Anda memasukkan tag VLAN. | | IPs | Blok IPv4 (/16 hingga /30) yang dirutekan ke jembatan tersebut, dengan gateway. NexCMP menetapkan alamatnya sendiri; Proxmox tidak memiliki manajemen IP. | | Templat | Satu VM templat cloud-init per OS, pada setiap node tempat Anda melakukan deployment, dengan agen tamu QEMU. | | Zone | Zona yang ada untuk melampirkan kluster. Lihat [Zones](https://nexcmp.com/id/docs/infrastructure/zones/). | | Bergantung pada | Tidak ada. | ## Siapkan infrastruktur {#prepare-the-infrastructure} Jalankan perintah sebagai root pada node kluster mana pun. ### 1. Buat peran hak istimewa terendah, pengguna, dan token API {#_1-create-a-least-privilege-role-user-and-api-token} 1. Buat peran. Daftar hak istimewa adalah persis apa yang digunakan oleh NexCMP; tidak ada isinya yang mengedit pengguna, definisi penyimpanan, atau pusat data. ```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` diperlukan oleh pengunduhan citra awan. PVE 9 tidak memiliki hak istimewa `VM.Monitor`; jangan menambahkannya. 2. Buat pengguna dan token. `--privsep 1` berarti hak token adalah **irisan** dari izin pengguna dan izin token itu sendiri. ```bash pveum user add nexcmp@pve --comment "NexCMP" pveum user token add nexcmp@pve api --privsep 1 ``` Perintah tersebut mencetak token **secret sekali saja** (berupa UUID). Salin sekarang. ID token adalah `nexcmp@pve!api`. 3. Berikan peran tersebut kepada **kedua-duanya**, baik pengguna maupun token. Ini adalah langkah yang sering terlewat: dengan pemisahan hak akses, hanya token yang akan mendapatkan error 403 seperti `Datastore.Audit` jika pengguna tidak memiliki izin. ```bash pveum acl modify / --roles NexCMP --users nexcmp@pve pveum acl modify / --roles NexCMP --tokens 'nexcmp@pve!api' ``` 4. Uji dari server panel: ```bash curl -sk -H 'Authorization: PVEAPIToken=nexcmp@pve!api=' https://192.0.2.10:8006/api2/json/version ``` Dokumen JSON dengan isi `version` menandakan token berfungsi. (`-k` hanya untuk pemeriksaan cepat ini; NexCMP menyematkan sertifikatnya sendiri, lihat di bawah.) ### 2. Periksa jembatan (bridge) dan penyimpanan {#_2-check-the-bridge-and-the-storage} ```bash pvesm status # storages, type, content and free space ip -br link show type bridge ``` - VM pelanggan mendapatkan `virtio` antarmuka jaringan pada jembatan yang Anda masukkan di NexCMP. Jika Anda menyetel VLAN, jembatan tersebut harus mendukung VLAN (VLAN-aware). - Tempatkan VM pelanggan pada jembatan atau VLAN yang **terpisah dari alamat manajemen node**. Jika mereka berbagi jaringan, perangkat aturan IP manajemen otomatis pada firewall Proxmox akan membuka port 22, 8006, 3128, 5900-5999, dan 60000-60050 dari node ke setiap VM di jaringan tersebut. Jika Anda tidak dapat memisahkannya, tambahkan aturan DROP eksplisit untuk subnet VM ke port-port tersebut di atas aturan ACCEPT manajemen. ### 3. Catatan penyimpanan (LVM-thin) {#_3-storage-notes-lvm-thin} - Biarkan **zeroing pada pengaturan default** untuk thin-pool. Menonaktifkannya (`lvchange -Zn`) dapat meninggalkan data lama pada chunk yang baru dialokasikan dan merusak tabel partisi atau sistem file dari VM yang dikloning. - Disk yang melaporkan "write cache: disabled" hanya dapat dikloning dengan kecepatan beberapa MB/s. Periksa dengan `hdparm -W /dev/sdX` dan aktifkan write cache jika disk tersebut memiliki perlindungan dari kehilangan daya. ### 4. Aktifkan konten `import` (hanya untuk pembuat templat bawaan) {#_4-enable-the-import-content-only-for-the-built-in-template-builder} Pembuat bawaan mengunduh citra cloud ke dalam penyimpanan bernama `local` dan membuat templat darinya. Tambahkan `import` (dan `snippets`) ke daftar konten penyimpanan tersebut. Pertahankan jenis yang sudah Anda gunakan; `--content` menggantikan seluruh daftar: ```bash pvesm status --storage local # note the current content pvesm set local --content iso,vztmpl,backup,import,snippets ``` ### 5. Membuat templat OS dari citra cloud {#_5-build-an-os-template-from-a-cloud-image} Templat adalah VM cloud-init yang dikloning oleh NexCMP. Masing-masing terdaftar di bawah **OS key** pendek seperti `ubuntu-24.04` beserta ID VM-nya. Buat satu templat per OS **pada setiap node yang akan menerima VM**, karena proses kloning berjalan pada node yang dipilih. **Opsi A, disarankan: bangun sendiri.** Citra cloud Ubuntu dan Debian bawaan tidak berisi guest agent serta tidak mengizinkan login root, dan NexCMP menyetel kata sandi root melalui cloud-init. Siapkan citranya terlebih dahulu: ```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' ``` Kemudian buat VM templat (ID 9000 adalah contoh; jaga agar ID templat tetap di bawah nilai `vmid from`, default 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 ``` **Opsi B: pembangun bawaan.** Kartu **Create OS template from cloud image** pada tab Clusters (lihat di bawah) mengunduh citra qcow2, membangun templat, dan mendaftarkannya. Fitur ini membuat VM dengan cloud-init dan flag guest agent, namun tidak mengubah isi di dalam citra tersebut. Gunakan hanya dengan citra yang telah mengizinkan login root dan menjalankan guest agent, atau ketika Anda juga menyediakan cuplikan vendor-data cloud-init. Guest agent diperlukan untuk **Reset password** dan untuk menampilkan alamat IP VM. ### 6. Ketahui sidik jari sertifikat (opsional) {#_6-know-the-certificate-fingerprint-optional} NexCMP mempercayai klaster dengan menyematkan sidik jari SHA-256 dari sertifikat TLS-nya, sehingga sertifikat mandiri (self-signed) dapat digunakan. Untuk melihat nilai yang akan disematkan oleh NexCMP: ```bash openssl x509 -in /etc/pve/local/pve-ssl.pem -noout -fingerprint -sha256 ``` ## Hubungkan di NexCMP {#connect-in-nexcmp} 1. Buka **Infrastructure › Cloud provider › Providers** dan klik **Add cloud provider**. Pilih **Proxmox VE** dan isi: | Kolom | Contoh nilai | |---|---| | Name | `Proxmox cluster 1` | | Endpoint | `https://192.0.2.10:8006` | | Token id | `nexcmp@pve!api` | | Token secret | `XXXX` (UUID yang dicetak pada langkah 1) | | Slug | `pve-1` (a-z, 0-9, tanda hubung, 2-32 karakter) | | Default node | `pve1` (kosong: node online dengan RAM bebas terbanyak) | | Storage | `local-lvm` | | Bridge | `vmbr0` | ![Dialog tambah penyedia cloud dengan Proxmox VE dipilih serta contoh endpoint, token, dan nilai storage](https://nexcmp.com/id/docs/images/infrastructure/proxmox-01-add-provider.webp) 2. Klik **Save & open provider**, masukkan alasan saat diminta. Token dienkripsi sebelum disimpan. 3. Pada tab **Overview**, klik **Test connection**. Pengujian sukses pertama **akan menyematkan (pin) sidik jari TLS kluster**; setelah itu sertifikat yang berbeda akan ditolak. 4. Buka tab **Clusters**. Kartu **Node · storage · bridge** mencantumkan apa yang dilihat oleh API; kartu **Cluster configuration** berisi pengaturan: | Kolom | Arti | |---|---| | Default node | Node yang digunakan untuk VM baru. Kosong berarti node online dengan RAM bebas terbanyak. | | Storage, Bridge, VLAN | Storage disk, bridge NIC, dan tag VLAN opsional (0 berarti tidak ada). | | CPU type | `host` secara default. Gunakan `x86-64-v2-AES` saat node memiliki generasi CPU yang berbeda. | | vmid from | ID VM pertama yang diberikan ke VM pelanggan (default 1000). | | Storage ISO, Storage backup | Biarkan kosong kecuali Anda menggunakannya; kosong berarti fitur ISO dan backup tidak ditawarkan. | | Template OS | Satu per baris, `os-key=vmid`, misalnya `ubuntu-24.04=9000`. | | Pinned TLS fingerprint (SHA-256) | Diisi oleh pengujian pertama. Kosongkan dan uji kembali setelah Anda mengganti sertifikat kluster. | ![Tab Clusters, kartu Cluster configuration dengan contoh node, storage, bridge, dan daftar template OS](https://nexcmp.com/id/docs/images/infrastructure/proxmox-03-cluster-config.webp) 5. Opsional: jika Anda menggunakan Opsi B di atas, isi **Create OS template from cloud image** (kunci OS `ubuntu-24.04`, vmid `9000`, node `pve1`, URL citra qcow2) lalu klik **Create template**. Ini berjalan di latar belakang selama beberapa menit; hasilnya ada di Audit log. ![Kartu Create OS template from cloud image dengan contoh URL citra Ubuntu](https://nexcmp.com/id/docs/images/infrastructure/proxmox-04-template-from-image.webp) 6. Klik **Add pool** di **Cluster IP pool** dan buat pool tempat VM mengambil alamat: | Kolom | Contoh nilai | |---|---| | Name | `customers-1` | | CIDR | `198.51.100.0/24` | | Gateway | `198.51.100.1` (tidak pernah diberikan ke VM) | | DNS | `1.1.1.1,8.8.8.8` (1 hingga 4 alamat IPv4) | | Bridge, VLAN | `vmbr0`, `0` | | Already used IPs | satu per baris, `ip note`, misalnya `198.51.100.10 monitoring` | NexCMP tidak pernah menetapkan alamat jaringan, alamat siaran (broadcast), gateway, atau alamat yang dicadangkan. Pool dari kluster yang sama tidak boleh tumpang tindih. Pool hanya dapat dihapus jika tidak ada alamatnya yang sedang digunakan. ![Dialog Add IP pool dengan contoh /24 dan gateway](https://nexcmp.com/id/docs/images/infrastructure/proxmox-05-ip-pool.webp) 7. Dalam **Attach cluster to zone**, pilih zona dan, secara opsional, nama node, lalu klik **Attach to zone**. Kluster bergabung dengan zona yang sudah menjual VM, sehingga satu zona dapat memiliki CloudStack dan Proxmox secara bersamaan. Sumber baru ini **tidak dijual secara default** dan tidak mengubah perilaku paket yang sudah ada. ![Kartu Attach cluster to zone dengan zona yang sudah ada dipilih](https://nexcmp.com/id/docs/images/infrastructure/proxmox-06-attach-zone.webp) 8. Buka **Services › Virtual Machines › Plans & pricing** dan klik **Add plan**. Di **Infrastructure source**, pilih kluster Proxmox, lalu atur CPU, RAM, disk, dan harga. Paket Proxmox tidak memerlukan offering CloudStack. Untuk menjual konfigurasi yang sama dari kedua sumber, gunakan **Clone** pada sebuah paket dan pilih sumber lainnya. Disk paket harus setidaknya sebesar disk template; Proxmox tidak dapat memperkecil disk. ### Impor VM yang sudah ada {#import-a-vm-that-already-exists} Buka tab **Servers** untuk membuat daftar VM pada klaster. **Import** menetapkan VM yang sudah ada ke akun pelanggan tanpa biaya: tidak ada yang ditagih untuk jam, waktu mati, atau lalu lintas. Pelanggan dapat memulai, menghentikan, me-reboot, dan membuka konsol tetapi tidak dapat menghapusnya; hanya administrator yang dapat melakukannya. NexCMP hanya membaca dari klaster saat melakukan impor. - Klaster harus dilampirkan ke zona **dengan nama node** dari VM tersebut (biarkan node kosong dan impor akan melaporkan bahwa wilayah belum disiapkan). - Untuk membuat VM **dilindungi** (penghentian, reboot, instal ulang, pemulihan snapshot, penghancuran, dan perubahan paket ditolak), impor dari baris perintah dengan `--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 ``` ### Fitur yang didukung dan tidak didukung pada Proxmox {#what-is-and-is-not-supported-on-proxmox} | Fitur | Proxmox VE | |---|---| | Membuat, menyalakan/mematikan/reboot, menghapus | Ya | | Mengubah ukuran CPU dan RAM, memperbesar disk | Ya, tetapi VM dihentikan, diubah, dan dinyalakan kembali (tanpa perubahan ukuran langsung) | | Snapshots | Ya, hingga 5 per VM: membuat, mencantumkan, memulihkan, menghapus | | Menginstal ulang | Ya: VM dibangun ulang dari templat dan mempertahankan id, IP, serta pengaturan miliknya, dengan kata sandi baru | | Reset kata sandi | Ya, melalui guest agent | | Konsol | Ya, konsol peramban yang diproksi oleh panel | | Metrik | Ya: CPU, memori, jaringan, dan disk | | Pemasangan ISO, cadangan, firewall, IPv6, penerusan port, ubah IP, volume tambahan, Auto Scaling, DDoS Shield, VPC, pengukuran bandwidth | Tidak tersedia. Halaman VM pelanggan menyembunyikan hal yang tidak dapat dilakukan oleh suatu sumber. | ## Verifikasi {#verify} 1. **Test connection** menampilkan OK dan status penyedia aktif. 2. **Clusters** mencantumkan node Anda sebagai online, beserta penyimpanan dan bridge-nya. 3. **Cluster IP pool** menampilkan jumlah alamat yang bebas, digunakan, dan ditahan. 4. Kunci OS muncul di bawah templat zone di **Services › Virtual Machines › Template** setelah cluster dilampirkan. 5. Pesan VM uji dari paket yang menggunakan cluster tersebut. VM seharusnya mendapatkan alamat dari pool, kata sandi root, dan konsol yang berfungsi; pool menampilkan satu alamat yang terpakai. ## Batasan dan catatan {#limits-and-notes} ::: tip Zona sumber campuran Sejak NexCMP 1.4.0, daftar harga publik Cloud Server juga berfungsi saat CloudStack dan Proxmox VE berbagi satu zona. Setiap paket menggunakan **Infrastructure source** miliknya sendiri. Setelah memasang kluster, periksa daftar harga publik dan buat pesanan uji coba untuk masing-masing sumber. ::: - Beberapa cluster Proxmox dapat ditambahkan. Masing-masing bertindak sebagai satu penyedia. - Sebuah zone menawarkan satu sumber default; paket dengan **Infrastructure source** sendiri akan dideploy secara persis ke cluster tersebut, selama cluster aktif dan berada di zone paket. - Cluster di balik zone yang sama dengan CloudStack mempertahankan paket lama mereka di CloudStack. Uji pesanan dari awal hingga akhir sebelum peluncuran. - Token API hanya dapat diganti, tidak pernah dilihat. Ganti token tersebut di tab **Credentials**: buat token baru di Proxmox terlebih dahulu, masukkan token tersebut, jalankan **Test connection**, lalu cabut token lama. - Tindakan Test, Sync, dan cluster-info dibatasi hingga enam panggilan per menit per administrator. - NexCMP menagih pelanggan Anda; biaya perangkat keras dan lisensi cluster ditanggung oleh Anda. ## Pemecahan Masalah {#troubleshooting} | Gejala | Penyebab | Solusi | |---|---|---| | Test: "Key rejected (wrong access key / secret, or revoked)" atau HTTP 401/403 | ID token atau secret salah, atau ACL hanya diberikan ke token tersebut | Jalankan ulang kedua perintah `pveum acl modify` (pengguna **dan** token) dan periksa apakah id token adalah `user@realm!tokenid`. | | Pengujian: "Could not connect to the provider" atau "Timed out" | Firewall, host atau port salah | Periksa `https://host:8006` dari server panel. | | Pengujian: "Invalid endpoint or not on the allowlist" | Endpoint memiliki path, pengguna, kueri, atau bukan HTTPS | Gunakan secara tepat `https://host:8006`. | | "sertifikat TLS klaster TIDAK cocok dengan fingerprint yang disematkan" | Sertifikat kluster telah diganti | Kosongkan **Pinned TLS fingerprint** pada tab Clusters, simpan, lalu jalankan kembali **Test connection**. | | Slug ditolak | Bukan a-z, 0-9, tanda hubung, atau panjangnya bukan 2-32 karakter | Gunakan sesuatu seperti `pve-1`. | | "Format ID token: user@realm!tokenid dan secret wajib diisi" | ID token atau secret tidak ada | Masukkan keduanya; secret adalah UUID yang dicetak saat token dibuat. | | "Baris templat tidak valid: …" | Sebuah baris dalam **Template OS** bukan `key=vmid` | Gunakan huruf, angka, `.`, `_`, `-` pada kunci dan vmid minimal 100. | | "Kunci OS: a-z 0-9 . _ - dan vmid ≥ 100" | Kunci atau id tidak valid dalam **Create template** | Perbaiki kunci OS dan gunakan vmid yang kosong. | | "vmid … already exists" saat membuat templat | vmid tersebut sudah digunakan | Pilih id yang lain. | | "url mengarah ke alamat internal" | URL gambar adalah IP internal | Gunakan URL publik; nama diselesaikan oleh Proxmox. | | Tugas templat gagal saat mengunduh | Penyimpanan `local` tidak memiliki konten `import` | `pvesm set local --content …,import,snippets`, lalu coba lagi. Nama file harus berakhiran `.qcow2`, `.raw`, `.vmdk`, `.ova` atau `.ovf`. | | "cluster has no online nodes" atau "node … is not online" | Node default sedang mati atau salah eja | Perbaiki **Default node** atau biarkan kosong. | | "image bukan milik klaster" | OS pada paket tidak ada di **Template OS** | Tambahkan kunci ke daftar lalu simpan. | | Penyebaran menunggu, kemudian gagal saat melakukan kloning | VM templat tidak berada di node yang dipilih | Buat templat pada node tersebut, atau atur **Default node** ke node yang memilikinya. | | Pelanggan tidak dapat masuk sebagai root | Gambar memblokir login root | Bangun ulang templat seperti pada Opsi A. | | Atur ulang kata sandi tidak berdampak apa pun | Tidak ada guest agent di dalam guest | Install and enable `qemu-guest-agent` pada templat. | | "Nama, CIDR, dan gateway wajib diisi" | Kolom pool hilang | Isi ketiga kolom tersebut. | | Pool create: "overlaps with pool …", "gateway must be within range (not network/broadcast address)" atau "cidr: network address must be …" | Pool tumpang tindih, gateway salah, atau CIDR bukan di batas jaringan | Gunakan rentang bebas, gateway di dalamnya, dan CIDR yang ditulis sebagai alamat jaringan (misalnya `198.51.100.0/24`). | | Impor: "region belum diatur" | Kluster dilampirkan tanpa nama node VM | Lampirkan kluster ke zona dengan nama node tersebut. | --- # Templat OS dan ISO {#os-templates-and-isos} > **Lokasi di admin:** Services › Virtual Machines › Template (`/vm/templates`). Template Proxmox tercantum per kluster di Infrastructure › Cloud provider › Providers › (cluster) › Clusters. ## Fungsi {#what-it-does} Templat adalah citra sistem operasi yang digunakan VM baru saat pertama kali dimulai. NexCMP tidak menyimpan citra sendiri: ia membaca laporan dari CloudStack (siap, templat unggulan) atau yang Anda daftarkan untuk kluster Proxmox, lalu membiarkan Anda memilih mana yang dijual, lengkap dengan nama, ikon, dan pengguna login yang dilihat pelanggan. Halaman ini menunjukkan cara menyiapkan citra yang berfungsi optimal dengan NexCMP: login sandi, penskalaan CPU dan RAM langsung, file swap, dan disk root yang ukurannya menyesuaikan paket. ## Persyaratan {#requirements} | Item | Persyaratan | |---|---| | Pembangun templat CloudStack | Mesin Linux dengan `libguestfs-tools` (`virt-customize`, `virt-sparsify`, `guestfish`), `qemu-utils`, `curl`, dan ruang disk kosong sekitar 5 GB. Tidak memerlukan KVM maupun root. Akses internet untuk instalasi paket (atau bangun dengan `--offline`). | | Lokasi builder | Fitur ini disertakan di setiap rilis dalam `/opt/nexcmp/releases//share/templates/` di server panel. Anda tidak harus menjalankannya di sana: salin folder tersebut ke mesin Linux mana pun. | | Server web | Server HTTP(S) apa pun yang dapat dijangkau oleh VM penyimpanan sekunder CloudStack untuk memublikasikan file `.qcow2` yang sudah jadi. Server tidak harus dapat dijangkau dari internet. | | CloudStack | Akun yang memiliki izin untuk mendaftarkan templat, serta ID zona Anda dan jenis OS yang cocok. Lihat [CloudStack](https://nexcmp.com/id/docs/infrastructure/cloudstack/). | | Proxmox VE | VM templat cloud-init dengan agen tamu QEMU, masing-masing satu per OS dan per node. Lihat [Proxmox VE](https://nexcmp.com/id/docs/infrastructure/proxmox/). | | Bergantung pada | [CloudStack](https://nexcmp.com/id/docs/infrastructure/cloudstack/) atau [Proxmox VE](https://nexcmp.com/id/docs/infrastructure/proxmox/) harus dihubungkan terlebih dahulu. | ## Siapkan infrastruktur {#prepare-the-infrastructure} ### CloudStack: membangun templat {#cloudstack-build-a-template} Citra dasar yang didukung (citra vendor diunduh dan checksum-nya diverifikasi sebelum ada perubahan yang dibuat): | Citra | `--distro` | Pengguna login | |---|---|---| | 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` | Distribusi lainnya: tambahkan baris ke `distros.conf` (URL citra, file checksum, famili `deb` atau `rpm`). 1. Salin builder ke mesin pengebangun dan jalankan: ```bash cp -r /opt/nexcmp/releases//share/templates ~/templates && cd ~/templates ./build-template.sh --distro ubuntu-24.04 --version v7 --work ./out ``` Tambahkan `--panel-url https://cloud.example.com` untuk menyematkan agen pemantauan boot pertama opsional yang mendaftar ke panel Anda (hanya HTTPS). Tanpa ini, tidak ada agen yang ditambahkan. Opsi lain: `--base ` untuk menggunakan citra yang Anda unduh, `--offline` untuk melewati instalasi paket. 2. Hasilnya adalah `out/ubuntu-24.04-v7.qcow2` beserta `.sha256` miliknya. Proses build diakhiri dengan menjalankan `verify-image.sh`, yang memeriksa citra jadi secara hulu-baca (read-only) dan menolak citra yang buruk (disimpan sebagai `.unverified`). Anda dapat menjalankannya kembali kapan saja: `./verify-image.sh out/ubuntu-24.04-v7.qcow2 --no-agent`. Apa saja yang dimasukkan builder ke dalam citra: | Item | Alasan | |---|---| | `qemu-guest-agent` | CloudStack dapat meminta informasi CPU dan IP pada VM, serta melakukan quiesce VM untuk pembuatan snapshot. | | cloud-init dengan sumber data CloudStack, `set_passwords` pada setiap booting, login kata sandi SSH | Kata sandi yang dihasilkan diambil dari virtual router dan **Reset password** berfungsi. | | Aturan udev untuk CPU dan RAM yang ditambahkan secara hot-plug | vCPU dan RAM yang ditambahkan secara hot-plug langsung aktif dengan sendirinya, sehingga live scaling dan Auto Scaling dapat berfungsi. | | Layanan file swap | Membuat `/swapfile` sebesar nilai terkecil antara 50% dari RAM dan 4 GiB setelah disk diperbesar. `touch /etc/cmp-swap.disabled` menonaktifkannya. | | cloud-init `growpart` dan `resizefs` | Root disk yang kecil akan diperbesar ke ukuran disk paket pada boot pertama. | | machine-id kosong, tidak ada kunci host SSH | Setiap VM mendapatkan identitasnya sendiri. | ::: warning Beri nama templat ` ` NexCMP mengaktifkan **Auto Scaling** untuk templat yang namanya diakhiri dengan `vN` atau `vN.M` dengan **N of 6 or more** (`Ubuntu 24.04 v7`, `Rocky Linux 9 v7.1`). Builder menegakkan aturan ini untuk `--version`. Daftarkan templat dengan nama persis seperti yang tercetak. ::: 3. Publikasikan file tersebut dan daftarkan di CloudStack. Gunakan SHA-256 yang dicetak oleh builder, dan daftarkan hanya setelah file selesai ditulis sepenuhnya: ```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` memungkinkan CloudStack menghasilkan kata sandi VM. - `isdynamicallyscalable=true` mengizinkan live scaling. - `host-passthrough` diperlukan agar gambar Rocky dan Alma saat ini dapat melakukan boot; `osdefault` menjaga pengontrol disk tetap portabel. 4. Tunggu hingga templat mencapai status **Download Complete / Ready**. Image vendor tetap mempertahankan ukuran virtualnya yang kecil (sekitar 3.5 GiB untuk Ubuntu dan Debian, 10 GiB untuk Rocky). Ingat bahwa disk paket tidak boleh lebih kecil daripada disk templat. ### Proxmox VE: membuat templat {#proxmox-ve-make-a-template} Buat templat VM cloud-init per OS pada setiap node tempat Anda melakukan deployment, dengan guest agent terpasang dan login root diaktifkan, lalu daftarkan sebagai `os-key=vmid`. Perintah lengkapnya ada di [Proxmox VE](https://nexcmp.com/id/docs/infrastructure/proxmox/). Builder CloudStack di atas **bukan** untuk Proxmox: builder tersebut mengonfigurasikan cloud-init untuk sumber data CloudStack. ### ISO {#isos} Pelanggan dapat memasang ISO mereka sendiri melalui modul **Images** (CloudStack) atau modul Dedicated Server. Hal tersebut terpisah dari templat OS di halaman ini. Lihat [Modules](https://nexcmp.com/id/docs/infrastructure/modules/) dan [Dedicated servers](https://nexcmp.com/id/docs/infrastructure/dedicated/). ## Hubungkan di NexCMP {#connect-in-nexcmp} 1. Buka **Services › Virtual Machines › Template**. Klik **Sync now** atau tunggu hingga 15 menit. Sinkronisasi ini akan menambahkan templat yang siap dan berstatus unggulan di CloudStack. ![Halaman Templat yang mencantumkan templat yang disinkronkan beserta status kesiapan dan kolom hot-plug CPU-nya](https://nexcmp.com/id/docs/images/infrastructure/templates-01-list.webp) 2. Klik **Edit** pada templat baru dan atur apa yang dilihat oleh pelanggan: | Kolom | Contoh nilai | |---|---| | Nama tampilan untuk pelanggan | `Ubuntu 24.04 LTS` | | Keluarga OS | `ubuntu` (ikon dan pengguna default) | | Versi | `24.04` | | Nama pengguna login | `ubuntu` (Windows: `Administrator`; lainnya: `root`) | | Ikon | URL image, jalur (path), atau nama | | Urutan | `10` | | Aktif | On | | Hot-plug vCPU/RAM (live scale) | **Auto by name (v6 or later)**, **Yes**, atau **No (needs a restart)** | ![Dialog edit templat dengan nama yang dilihat pelanggan, keluarga OS, pengguna login, dan opsi hot-plug](https://nexcmp.com/id/docs/images/infrastructure/templates-02-edit.webp) 3. Aktifkan templat tersebut. Templat yang tidak lagi dicantumkan oleh CloudStack akan disembunyikan secara otomatis (dan Anda akan diberi peringatan di Telegram jika dikonfigurasi); templat tidak akan pernah dihapus dari NexCMP. ### Ganti templat dengan build yang lebih baru {#replace-a-template-with-a-newer-build} Gunakan **More › Replace with new version** pada templat yang dijual. Pilih templat baru yang siap dan saat ini dinonaktifkan. Entri yang dijual kemudian akan mengarah ke build baru dan tetap mempertahankan nama, urutan, serta ikonnya; yang lama dinonaktifkan sebagai jalur kembali (untuk kembali, gunakan **Replace** pada entri baru). VM yang sedang berjalan tidak disentuh. Jika build baru berasal dari keluarga OS yang berbeda, centang konfirmasi terlebih dahulu. ## Verifikasi {#verify} 1. Baris menunjukkan **ready** dan, untuk build bernama `vN` dengan N 6 atau lebih, **CPU hot-plug: supported**. 2. Deploy satu VM uji dari templat dan periksa di dalam VM: - Anda dapat masuk dengan kata sandi yang ditampilkan di portal; - `df -h /` menunjukkan ukuran disk paket; - setelah scale langsung (**Change plan** tanpa reboot), `nproc` dan `free -m` bertambah; - `swapon --show` mencantumkan `/swapfile` (disk dengan ruang kosong kurang dari swap ditambah 2 GiB akan dilewati); - `systemctl is-active qemu-guest-agent` mencetak `active`. 3. Jika Anda menyertakan agen di dalamnya, VM akan muncul di host yang dipantau panel satu menit setelah booting pertama. VM memerlukan IP publiknya sendiri: panel mengenalinya dari IP sumber publiknya. ## Batasan dan catatan {#limits-and-notes} - Builder ini khusus untuk Linux dan membangun citra Linux. Citra lain (misalnya Windows) dapat didaftarkan di CloudStack melalui cara lain; NexCMP mencantumkan apa yang dilaporkan oleh CloudStack. - Hanya agen amd64 yang disertakan; arsitektur lain akan melewati instalasi agen. - Citra diperiksa dengan `guestfish` tetapi tidak pernah di-boot oleh builder. Selalu deploy satu VM uji sebelum menjual citra baru. - Lewati agen pada satu VM dengan `touch /etc/cmp-agent.disabled` sebelum booting pertama. Hapus nanti dengan `systemctl disable --now cmp-agent cmp-agent-install; rm -rf /etc/cmp-agent /usr/local/bin/cmp-agent`, lalu hapus agen di konsol admin. ## Pemecahan Masalah {#troubleshooting} | Gejala | Penyebab | Solusi | |---|---|---| | `virt-customize` gagal mengunduh paket | Mesin build tidak memiliki jaringan keluar | Perbaiki DNS atau proksi pada mesin tersebut, atau bangun dengan `--offline` pada citra dasar yang sudah memiliki paket-paket tersebut. | | `libguestfs: error: /usr/bin/supermin exited with error status 1` | Kernel host tidak dapat dibaca oleh pengguna saat ini (Ubuntu) | `sudo chmod +r /boot/vmlinuz*`, atau jalankan build sebagai root. | | Checksum berbeda, atau citra vendor tidak lagi ada | Vendor memindahkan file "latest" mereka | Unduh sendiri citranya, periksa terhadap file checksum vendor, dan teruskan dengan `--base`. | | Rocky: XFS yang lebih baru tidak dapat dimount | Kernel host terlalu lama | Bangun pada mesin dengan kernel yang baru. | | `--version must be v6 or higher` | Nama harus berupa `vN` dengan N 6 atau lebih | Gunakan `--version v7`. | | `--panel-url must be a plain https:// URL` | Agen diunduh dan dijalankan sebagai root, sehingga HTTP biasa ditolak | Gunakan URL `https://` tanpa spasi, tanda kutip, atau string kueri. | | Templat tetap **not ready** | CloudStack belum selesai mengunduh | Tunggu **Download Complete**, periksa apakah VM penyimpanan sekunder dapat menjangkau URL tersebut. | | Baris menunjukkan **no-pass** | Templat didaftarkan tanpa `passwordenabled=true` | Daftarkan kembali dengan flag tersebut. | | CPU hot-plug menunjukkan **unsupported** | Nama tidak berakhiran `vN` (N 6 atau lebih) | Ganti nama templat, atau tetapkan **vCPU/RAM hot-plug** ke **Yes** di Edit jika citra memiliki aturan udev. | | "Empty template list" setelah koneksi pertama | Sinkronisasi belum berjalan | Klik **Sync now** (memerlukan worker yang berjalan) atau tunggu siklus 15 menit. | --- # Server khusus (bare metal) {#dedicated-servers-bare-metal} > **Lokasi di admin:** Infrastructure › Bare Metal (Servers `/infra/baremetal`, IP Pools, Stock / iDRAC import, Operations, Templates, Customer ISOs, Safety). Paket dan langganan: Services › Dedicated Server (`/dedicated`). Aktifkan modul di bawah System › Admin › License & updates (`/license`). ## Fungsi {#what-it-does} NexCMP mengelola server fisik **secara langsung melalui iDRAC** mereka melalui Redfish API. Pelanggan menyewa seluruh server: mereka menghidupkan dan mematikannya, membuka konsol peramban, memasang ISO, atau menginstal sistem operasi dari templat, serta melihat perangkat keras dan metrik. Mereka tidak akan pernah melihat alamat iDRAC, nama pengguna, atau kata sandi. Gunakan untuk menjual kembali server dedikasi dari rak Anda sendiri. ## Persyaratan {#requirements} | Item | Persyaratan | |---|---| | Perangkat keras | Server Dell dengan **iDRAC 9** dan Redfish API. | | Jaringan manajemen | **Anda yang menyediakannya.** Server panel harus dapat menjangkau setiap iDRAC melalui **HTTPS 443** (dan port VNC iDRAC, default **5901**, untuk konsol), dan setiap iDRAC harus dapat menjangkau server web ISO di bawah. Alamat iDRAC harus berupa **alamat IPv4 dalam rentang privat** (RFC 1918, prefiks /16 atau lebih kecil) yang Anda cantumkan pada pengaturan `dedicated_bmc_cidrs`. Nama DNS dan IPv6 ditolak. NexCMP tidak membuat jaringan ini dan tidak dapat mengujinya untuk Anda. | | Akun iDRAC | Satu akun dengan hak istimewa **Administrator** di setiap iDRAC. NexCMP menggunakannya untuk membaca server dan mengirimkan beberapa perintah yang diizinkannya (daya, media virtual, one-time boot, konsol). NexCMP tidak pernah membuat akun iDRAC untuk pelanggan Anda. | | Alat di server panel | `xorriso` dan `genisoimage` (membuat ISO instalasi untuk setiap server) serta `novnc` (halaman konsol browser). Instal dengan `sudo apt-get install -y xorriso genisoimage novnc`, atau biarkan installer melakukannya: jalankan dengan `--baremetal`, atau berikan opsi server ISO; pembaruan juga akan menginstalnya jika modul Bare Metal sudah aktif. Jika ada yang kurang, **Safety** akan mencantumkannya dalam pemberitahuan merah, **live ops** menolak untuk aktif (error `tools_missing`), dan konsol serta penginstalan OS akan menginformasikan bahwa alat tidak ditemukan alih-alih gagal di kemudian waktu. | | Server web ISO | Server **HTTP** standar di jaringan manajemen yang menyajikan folder ISO NexCMP ke iDRAC. Alamatnya berupa alamat IPv4 privat dan port opsional, misalnya `http://10.20.0.2:8080`, **tanpa path**, yang disimpan di `dedicated_iso_base_url`. Server harus mendukung byte ranges. Folder ini ditulis oleh worker panel, sehingga server web biasanya berjalan di **server panel itu sendiri**, mendengarkan pada alamat yang dimiliki server tersebut di jaringan manajemen. NexCMP menyertakan situs nginx siap pakai dan perintah satu langkah untuknya (lihat di bawah). | | Folder ISO | Folder untuk file ISO dan, di dalamnya, `pub` (yang dibaca oleh iDRAC) dan `server` (ISO pelanggan). Perintah satu langkah menggunakan `/srv/nexcmp-iso`; tanpanya, nilai default mengikuti penginstalan (pengaturan `dedicated_iso_lib_dir`, `dedicated_iso_pub_dir`, `dedicated_iso_server_dir`). Worker NexCMP harus dapat **menulis** ke direktori tersebut. Worker berjalan dengan sistem file read-only kecuali `/var/lib/nexcmp`, sehingga folder di lokasi lain memerlukan drop-in systemd (perintah satu langkah akan menginstalnya). | | Alamat callback | `dedicated_callback_base`, sebuah `https://` yang dapat dijangkau oleh server yang sedang menginstal dan mengarah ke panel Anda. | | Storage | Ruang disk kosong untuk pustaka ISO dan ISO yang disediakan pelanggan. | | Bergantung pada | Modul **Bare Metal**, zona, dan kumpulan IP server. | ::: warning Nilai contoh bukanlah konfigurasi Instalasi baru menyertakan nilai contoh di `dedicated_bmc_cidrs`, `dedicated_iso_base_url`, dan `dedicated_callback_base` (jaringan contoh privat dan `https://example.com`). Nilai tersebut bukanlah jaringan Anda. Selama salah satunya masih berupa nilai contoh, halaman Bare Metal menampilkan pemberitahuan merah **Management network not configured**, pengimporan iDRAC gagal dalam pemeriksaan allow-list, dan switch **live ops** menolak untuk aktif (error `config_placeholder`). Atur ketiga nilai tersebut di bawah **Infrastructure › Bare Metal › Safety › Management network connection** (lihat di bawah). ::: ## Siapkan infrastruktur {#prepare-the-infrastructure} 1. **Letakkan setiap iDRAC pada jaringan manajemen** yang tidak dapat dijangkau oleh pelanggan, dan berikan alamat IPv4 privat tetap pada masing-masing. Periksa Redfish API dari server panel: ```bash curl -sk -u 'nexcmp-admin:XXXX' https://10.20.0.11/redfish/v1/Systems | head ``` 2. **Buat akun administrator pada iDRAC** untuk NexCMP (melalui antarmuka web iDRAC atau `racadm`). Gunakan kata sandi yang kuat dan unik. Jangan pernah menggunakan ulang akun bawaan iDRAC. 3. **Publikasikan folder ISO ke iDRAC - satu perintah.** Pada server panel, sebagai root, dengan alamat yang dimiliki server tersebut di jaringan manajemen dan jaringan iDRAC: ```bash sudo nexcmp dedicated-setup-iso --listen 10.20.0.2:8080 --allow 10.20.0.0/24 ``` `--listen` harus berupa alamat server ini (IPv4 privat, port 8080 jika diabaikan). `--allow` mencantumkan jaringan iDRAC (CIDR privat, /16 atau lebih kecil, hingga 8, dipisahkan koma); hanya jaringan tersebut yang dapat mengunduh, dan perintah ini juga menggunakannya sebagai `dedicated_bmc_cidrs` saat pengaturan tersebut masih bernilai contoh. `--dir /path` memilih folder ISO lain (default `/srv/nexcmp-iso`). Perintah ini: - membuat folder dengan `pub` dan `server` di dalamnya, yang dimiliki oleh pengguna layanan NexCMP; - membuat grup `nexcmp-iso` dan memasukkan pengguna nginx ke dalamnya, sehingga nginx dapat membaca ISO saat di-mount oleh iDRAC dan tidak dapat diakses oleh pihak lain; - menginstal situs nginx `nexcmp-iso` (hanya dipertahankan jika `nginx -t` menerimanya, nginx akan diinstal jika belum ada) dan drop-in systemd `nexcmp-vmd.service.d/iso.conf` (`ReadWritePaths` untuk folder tersebut, `SupplementaryGroups=nexcmp-iso`); - menuliskan pengaturan ISO (`dedicated_iso_base_url`, ketiga folder, grup) dan me-restart worker NexCMP. Perintah ini dapat dijalankan kembali dengan nilai lain, dan `sudo nexcmp dedicated-setup-iso --remove` akan menghapus situs nginx serta drop-in tersebut (file ISO tetap ada). Perintah ini juga dapat dijalankan saat penginstalan: tambahkan `--iso-listen`, `--iso-allow` (dan `--iso-dir`) ke perintah penginstalan. Perintah ini **tidak** membuat jaringan manajemen dan tidak menghubungi iDRAC mana pun; jika nilainya salah, alamat tidak ada di server ini, atau port sudah terpakai, proses akan berhenti dengan sebuah pesan sebelum mengubah apa pun, dan situs nginx yang ditolak oleh `nginx -t` tidak akan dipertahankan. 4. **Apa yang dilayani server web ISO.** Situs nginx melayani `GET` (dan `HEAD`, dengan rentang byte) untuk `/pub/.iso` dan tidak ada yang lain: tidak ada daftar direktori, tidak ada jalur lain di bawah folder tersebut (library dan `server/` tidak dapat dijangkau), tidak ada metode lain, dan hanya dari jaringan `--allow` (selain itu akan menerima 403). NexCMP mengekspos setiap ISO yang harus dibaca iDRAC sebagai berkas atau tautan berumur pendek di `pub`; nginx mengikuti tautan hanya jika tautan dan targetnya memiliki pemilik yang sama (pengguna layanan), sehingga tautan ke berkas sistem akan ditolak. Periksa dari host lain di jaringan manajemen: ```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 ``` Berkas uji di `pub` seharusnya merespons permintaan `Range` dengan 206. *Jika melakukannya secara manual:* situs nginx dan drop-in disertakan sebagai templat dalam paket rilis (`share/dedicated/nginx-iso.conf` dan `share/dedicated/vmd-iso.conf` di bawah `/opt/nexcmp/releases//`). Salin keduanya, ganti penanda `__...__` (alamat listen, folder, baris allow, grup) dan pertahankan aturan di atas. 5. **Siapkan citra OS.** Letakkan ISO yang dapat menginstal sendiri di folder pustaka (lihat **Templates** di bawah). Pelanggan juga dapat menambahkan ISO dari tautan; file tersebut akan diunduh ke server, tidak pernah diberikan ke iDRAC sebagai URL. ## Hubungkan di NexCMP {#connect-in-nexcmp} ### 1. Aktifkan modul {#_1-turn-the-module-on} Pada **System › Admin › License & updates**, aktifkan sakelar **Bare Metal**. Kategori **Bare Metal** akan muncul di bawah Infrastructure. Lihat [Modules](https://nexcmp.com/id/docs/infrastructure/modules/). ### 2. Atur koneksi jaringan manajemen {#_2-set-the-management-network-connection} Buka **Infrastructure › Bare Metal › Safety**. Kartu **Management network connection** memuat tiga nilai yang menentukan apakah semuanya dapat berfungsi: | Kolom | Pengaturan | Yang harus dimasukkan | |---|---|---| | Jaringan iDRAC (CIDR) | `dedicated_bmc_cidrs` | Jaringan privat iDRAC Anda, contohnya `10.20.0.0/24`. Hanya CIDR privat, /16 atau lebih kecil, hingga 8, dipisahkan koma. Hanya iDRAC dalam rentang ini yang dapat diimpor. | | Server ISO untuk iDRAC | `dedicated_iso_base_url` | `http://[:port]`, tanpa path: alamat server web ISO dari bagian sebelumnya, contohnya `http://10.20.0.2:8080`. Perintah satu langkah akan mengisikannya untuk Anda. | | Alamat callback panel | `dedicated_callback_base` | `https://`, tanpa path: alamat yang dipanggil oleh server yang sedang diinstal untuk melaporkan penyelesaian. Alamat ini harus dapat dijangkau dari jaringan server tersebut. `example.com`, `localhost`, dan semacamnya akan ditolak. | Formulir memeriksa format saat Anda mengetik dan server memeriksanya kembali saat menyimpan; nilai yang salah akan ditolak disertai alasannya dan nilai yang tersimpan tetap seperti semula. Bidang yang masih memuat nilai contoh bawaan memiliki label merah **Not configured**, dan setiap halaman Bare Metal menampilkan pemberitahuan merah **Management network not configured** hingga ketiganya terisi nilai sebenarnya. Perubahan dicatat ke audit log bersama alasan Anda. Menyimpan kembali nilai contoh tidak dianggap sebagai mengonfigurasikannya kecuali Anda mengetiknya sendiri. ### 3. Periksa safety gate (biarkan tertutup untuk saat ini) {#_3-check-the-safety-gate-leave-it-closed-for-now} Buka **Infrastructure › Bare Metal › Safety**. **Live ops** adalah tombol switch berskala sistem untuk setiap perintah tulis ke iDRAC (daya, virtual media, konsol, dan instalasi OS). Status awalnya adalah **off**, dan tidak dapat diaktifkan selama koneksi jaringan manajemen di atas masih memuat nilai contoh (tombol tersebut merespons `config_placeholder` dan menyebutkan nama bidangnya). Perintah tulis ditolak pada API dan sekali lagi di dalam worker, sementara pembacaan status tetap berfungsi. Kunci kedua, **ops_locked**, melindungi setiap server: server yang baru diimpor selalu terkunci, bahkan saat live ops aktif. ![Halaman Safety dengan Live ops dalam kondisi off dan daftar tindakan yang diblokir](https://nexcmp.com/id/docs/images/infrastructure/dedicated-01-safety.webp) ### 4. Impor server {#_4-import-servers} 1. Buka **Infrastructure › Bare Metal › Stock / iDRAC import**. 2. Di bawah **Add one server**, masukkan alamat iDRAC, akun, dan kata sandi, lalu klik **Test connection**. Pengujian ini hanya mengirimkan perintah baca dan tidak menyimpan apa pun. | Kolom | Contoh nilai | |---|---| | Alamat iDRAC (URL atau host) | `10.20.0.11` | | Akun | `nexcmp-admin` | | Kata sandi | `XXXX` | | Label | `rack1-01` (kosong: dihasilkan otomatis) | | Menetapkan IP dari kumpulan | opsional; pilih pool IP layanan server | | Sertakan dalam daftar penjualan | nonaktif sampai Anda siap | ![Impor stok dan iDRAC dengan alamat contoh dan uji baca-saja yang berhasil](https://nexcmp.com/id/docs/images/infrastructure/dedicated-02-import-server.webp) 3. Klik **Save to stock**. NexCMP membaca model, CPU, RAM, disk, NIC, dan service tag dari iDRAC. Server masuk ke stok dalam status **locked**. 4. Untuk banyak server, gunakan **Bulk import**: satu server per baris, field dipisahkan koma, titik koma, atau Tab. **Preview** memeriksa daftar izin, duplikat alamat iDRAC atau service tag, serta membaca perangkat keras (hingga empat server sekaligus). ### 5. ISO pelanggan dan alamat web ISO {#_5-customer-isos-and-the-iso-web-address} Buka **Infrastructure › Bare Metal › Customer ISOs**. - **HTTP address serving ISOs to iDRAC** adalah `dedicated_iso_base_url`, nilai yang sama seperti pada kartu Safety (dapat diedit di salah satu tempat). Masukkan alamat jaringan manajemen dari server web ISO Anda. - **Customer ISO limits** mengatur ukuran satu ISO, total penyimpanan ISO, ruang kosong minimum, durasi penyimpanan ISO (dalam jam), waktu unduh maksimum, dan jumlah unduhan bersamaan. ![ISO pelanggan dengan alamat HTTP untuk iDRAC dan batas ISO](https://nexcmp.com/id/docs/images/infrastructure/dedicated-03-iso-settings.webp) ### 6. Templat OS {#_6-os-templates} Buka **Infrastructure › Bare Metal › Templates**. Halaman ini mencantumkan ISO penginstalan mandiri yang ditemukan di folder pustaka. Klik **Register** pada file untuk mengisi keluarga OS, versi, dan akun (terisi otomatis dari nama file), lalu aktifkan sakelar templat **Enable**. Mengaktifkan templat tidak memulai apa pun: setiap penginstalan tetap melalui gerbang keselamatan. **Unregister** hanya menghapus baris templat, tidak pernah filenya. ![Templat Bare Metal dengan ISO yang terdaftar dan belum terdaftar](https://nexcmp.com/id/docs/images/infrastructure/dedicated-04-os-templates.webp) ### 7. IP pool {#_7-ip-pools} Buka **Infrastructure › Bare Metal › IP Pools** dan tambahkan rentang IPv4 yang diterima server sebagai alamat layanan. Setiap server mendapatkan satu alamat; **Assign an IP from a pool** saat impor akan mengambil alamat kosong berikutnya. Alamat kosong dihitung per pool. ![Pool IP Bare Metal dengan contoh rentang dan jumlah alamat kosong](https://nexcmp.com/id/docs/images/infrastructure/dedicated-05-ip-pools.webp) ### 8. Paket dan penjualan {#_8-plans-and-sale} 1. Buka **Services › Dedicated Server › Plans & pricing**. Edit empat paket contoh (bernama `BM-40C-` di 1.6.1) atau buat paket Anda sendiri: harga, siklus, dan biaya set-up. **Pada instalasi baru, harga dimasukkan dalam dolar AS, hingga digit sen, dan wallet akan ditagih persis sejumlah itu: kurs tidak diperlukan.** Penginstalan yang sudah memiliki paket dengan harga dalam dong Vietnam akan mempertahankan dong dan tetap memerlukan kurs di pengaturannya (tanpa kurs, pesanan ditolak dengan `dedicated_fx_unavailable`). Paket contoh dimulai dengan harga 0 dan **dinonaktifkan**: paket yang dijual memerlukan harga di atas 0. Periksa setiap paket terhadap perangkat keras yang sebenarnya Anda impor; nama paket contoh tidak mendeteksi atau mengubah perangkat keras server. 2. Buka server (Infrastructure › Bare Metal › server tersebut › **Sales**), **attach the plan**, dan aktifkan **Sellable**. 3. Aktifkan **live ops** (halaman Safety, dengan konfirmasi ketik) dan buka kunci server yang ingin Anda operasikan (tab **Lock** pada server, beserta alasan yang masuk ke log audit). 4. Pada **Services › Dedicated Server**, aktifkan penjualan. Ini membutuhkan dua langkah: baca konsekuensinya, lalu ketik `ENABLE SALES`. Hingga saat itu, pelanggan tidak melihat halaman pesanan dan tidak dikenai biaya. ![Paket Dedicated Server dengan tombol penjualan nonaktif](https://nexcmp.com/id/docs/images/infrastructure/dedicated-06-plans.webp) ### Hal yang dapat dilakukan pelanggan di halaman server mereka {#what-customers-can-do-on-their-server-page} Halaman server pelanggan memiliki enam belas tab dalam tujuh grup (Overview, Control, Network, Hardware, Billing, Activity, Settings). Grup **Billing** memuat: - **Paket & perpanjangan**: bayar 1 hingga 24 bulan di muka dalam satu langkah; tanggal baru dihitung dari tanggal perpanjangan saat ini dan saldo dompet didebit sekali. Perpanjangan otomatis dapat diaktifkan atau dinonaktifkan. - **Billing cycle**: pilih siklus lain (misalnya triwulanan); perubahan berlaku mulai perpanjangan **berikutnya**, dan tidak ada biaya atau pengembalian dana saat ini. - **Change plan**: pelanggan dapat **meminta** paket lain. Permintaan ini tidak membebankan biaya apa pun. Anda menyetujui atau menolaknya di **Services › Dedicated Server › Plan changes** setelah Anda meningkatkan perangkat keras atau memindahkan server. Peningkatan paket yang disetujui membebankan selisih biaya untuk sisa periode yang telah dibayar pelanggan; penurunan paket tidak mengembalikan dana dan mulai berlaku sejak periode berikutnya. - **Invoices**: setiap faktur untuk server tersebut (pesanan, perpanjangan, peningkatan). Pada **Plan changes**, urutkan permintaan berdasarkan ID, tanggal, status, paket, atau server; pengurutan mencakup seluruh hasil di server. Kolom tindakan tetap terlihat saat Anda menggulir secara horizontal di layar sempit. Di bagian atas **Overview**, empat tile langsung menampilkan **CPU**, **RAM**, **Disk**, dan **Network**, disertai grafik kecil untuk 24 jam terakhir. CPU, RAM, dan Disk adalah persentase penggunaan dari polling iDRAC terakhir (Disk merupakan aktivitas I/O, bukan ruang kosong); Network adalah kecepatan masuk dan keluar saat ini ditambah total bulanan, yang diambil dari penghitung traffic. Tile menampilkan **—** dan alasan singkat ketika server mati, iDRAC tidak dapat dijangkau, atau mesin tidak melaporkan nilai tersebut; tile tidak pernah menampilkan angka 0 buatan. Pembacaan ini berasal dari Dell iDRAC, dan tanpa penghitung traffic, tile Network tetap menampilkan **—**. Tile diperbarui setiap menit saat halaman terbuka, dan klik akan membuka tab **Hardware** atau **Bandwidth**. Pada **Overview**, kartu **Access** menampilkan nama pengguna dan kata sandi sistem operasi yang Anda instal, tersembunyi secara default dengan tombol **Show** dan **Copy**. Informasi ini tersedia setelah setiap penginstalan, tidak hanya sekali, dan pemilik baru server tidak akan pernah melihat kata sandi pemilik sebelumnya. Jika kata sandi OS diubah di dalam server, kartu tetap menampilkan kata sandi yang disetel saat penginstalan. Tab **Bandwidth** hanya muncul jika agen penghitung lalu lintas mengirimkan data (lihat Batasan). Tidak ada tab **Subnet**: membawa prefiks IP Anda sendiri ke server sewaan bukan bagian dari NexCMP. ### Apa yang dapat dan tidak dapat dilakukan pelanggan {#what-customers-can-and-cannot-do} | Pelanggan dapat | Tidak pernah mungkin | |---|---| | Melihat inventaris, status kesehatan, status daya, dan metrik | Melihat alamat iDRAC, nama pengguna, atau kata sandi | | Menyalakan, mematikan dengan anggun (graceful shutdown), memulai ulang, mematikan paksa, mereset | Mengubah akun iDRAC atau pengaturan jaringan iDRAC | | Membuka konsol peramban (satu sesi dalam satu waktu) | Mengubah BIOS atau RAID, menghapus log, memperbarui firmware, mereset iDRAC | | Memasang ISO atau tautan ISO sendiri, menyetel boot sekali, menginstal ulang OS dari templat yang diaktifkan | Menjalankan panggilan Redfish mentah (fungsi tersebut tidak ada di dalam NexCMP) | NexCMP tidak membuat akun iDRAC untuk pelanggan: mereka hanya menggunakan kontrol di portal, dan alamat serta login iDRAC tidak pernah diperlihatkan kepada mereka. ## Verifikasi {#verify} 0. Pada **Safety**, kartu **Management network connection** tidak menampilkan label merah dan halaman Bare Metal tidak menampilkan pemberitahuan merah. Dari host di jaringan manajemen, `curl -I http:///` tidak mencantumkan daftar file. 1. **Test connection** pada formulir impor mengembalikan model, CPU, RAM, dan service tag. 2. Server muncul di **Servers** beserta perangkat kerasnya. Dengan **live ops off**, tindakan daya ditolak dengan pesan "Server control is temporarily disabled system-wide". 3. Setelah mengaktifkan live ops dan membuka kunci satu server pengujian, matikan dan nyalakan kembali server dari **Operations** atau halaman server, lalu buka konsol. 4. Buat pesanan pengujian dengan paket pengujian: server ditetapkan, OS terinstal, dan instalasi berakhir dengan server melaporkan kembali ke panel. ## Batasan dan catatan {#limits-and-notes} - Setiap server fisik memiliki paling banyak satu langganan aktif. - Perintah tulis dikirim hanya ketika **baik** live ops aktif **maupun** kunci server dalam keadaan terbuka. Pemeriksaan diulang di dalam worker sesaat sebelum setiap perintah. - Status **Installing** menunggu OS baru merespons pada port-nya (SSH 22, Windows 3389, Proxmox 8006) sebelum pesanan selesai; instalasi memiliki batas waktu (`dedicated_install_timeout_min`, default 150 menit). - Bandwidth untuk server dedicated dihitung dari agen penghitung lalu lintas yang bukan bagian dari penginstalan standar. Tanpa agen ini, tidak ada yang dicatat, portal menyembunyikan tab Bandwidth, dan API melaporkan `capabilities.bandwidth` sebagai `false`. - Tindakan admin pada sewa (kunci, buka kunci, batalkan dengan atau tanpa pengembalian dana) adalah tindakan terpadu yang sama seperti untuk layanan lainnya, dengan pengembalian dana dikembalikan ke saldo asalnya. - Server tidak dijual kembali di antara reseller: Dedicated hanya dijual dari situs utama. ## Pemecahan Masalah {#troubleshooting} | Gejala | Penyebab | Solusi | |---|---|---| | Uji gagal dengan galat alamat | Alamat tersebut bukan literal IPv4 di `dedicated_bmc_cidrs` (privat, /16 atau lebih kecil) atau port tidak diizinkan | Gunakan alamat IPv4 milik iDRAC dan tambahkan jaringannya di Safety › Management network connection (`dedicated_bmc_cidrs`). Nama DNS dan IPv6 ditolak. | | Pemberitahuan merah "Management network not configured", atau switch live ops merespons `config_placeholder` | Salah satu dari `dedicated_bmc_cidrs`, `dedicated_iso_base_url`, `dedicated_callback_base` masih menggunakan nilai contoh bawaan | Masukkan nilai sebenarnya di Safety › Management network connection. | | Kolom ditolak saat menyimpan | Format salah (CIDR bukan privat atau lebih luas dari /16, alamat ISO bukan `http://[:port]`, callback bukan `https://`), atau alamat contoh seperti `example.com` | Baca pesan di bawah kolom; nilai yang tersimpan tidak berubah. | | `nexcmp dedicated-setup-iso` berhenti sebelum mengubah apa pun | `--listen` bukan alamat dari server ini, port sudah digunakan, atau nilai tidak valid | Gunakan alamat yang dimiliki server ini pada jaringan manajemen, port lain, atau perbaiki nilai yang tercantum dalam pesan. | | "Sertifikat TLS iDRAC berbeda dari sertifikat yang disematkan - polling dan tindakan tulis telah dihentikan" | Sertifikat iDRAC diganti (sertifikat baru, iDRAC diganti) | Buka server, tab **Access**, bandingkan kedua sidik jari tersebut dan, jika perubahan tersebut disengaja, klik **Repin certificate**. | | "Kontrol server dinonaktifkan sementara di seluruh sistem" | Live ops nonaktif | Aktifkan di **Safety**. | | "Server ini dikunci untuk operasi" | Kunci per-server tertutup | Buka kunci di tab **Lock** server dengan menyertakan alasan. | | "Operasi lain masih berjalan di server ini" | Operasi sebelumnya belum selesai | Tunggu; periksa **Operations**. | | "Sesi konsol lain sudah terbuka di server ini" | Satu konsol dalam satu waktu | Tutup sesi yang lain. | | "Kontroler server tidak tersedia untuk sementara" | iDRAC tidak merespons | Periksa jaringan manajemen dan iDRAC. | | Pemuatan ISO gagal dengan kode 403 atau 404 dari iDRAC | Server web tidak dapat membaca file atau alamat dasar salah | Periksa izin server web ISO dan **HTTP address serving ISOs to iDRAC**. | | "Paket ini habis di lokasi yang dipilih" | Tidak ada server yang dapat dijual dengan paket tersebut di zona ini | Tautkan paket ke server dan aktifkan **Sellable**. | | "Alamat IPv4 tidak tersedia untuk ditetapkan saat ini" | Kumpulan IP kosong | Tambahkan alamat ke dalam kumpulan. | | "Instalasi OS otomatis tidak tersedia saat ini" | Prasyarat instalasi belum terpenuhi | Periksa apakah templat diaktifkan dan folder ISO dapat ditulis; pelanggan masih dapat menginstal melalui ISO dan konsol. | | Instalasi terhenti | Server yang menginstal tidak dapat menjangkau alamat callback | Periksa `dedicated_callback_base` dan pastikan jaringan server dapat menjangkau panel Anda melalui HTTPS. | --- # Node VPN dan proksi IPv6 {#vpn-and-ipv6-proxy-nodes} > **Di admin:** Infrastructure › VPN & Proxy nodes › Agents & external nodes (`/agents`), VPN IP pools (`/vpn/pool`), IPv6 Proxy nodes (`/vpn/proxy6/nodes`). Layanan itu sendiri berada di bawah Services › VPN dan Services › IPv6 Proxy. Kedua modul diaktifkan di System › Admin › License & updates. ## Fungsi {#what-it-does} NexCMP menjual akses VPN dan proksi yang keluar dari **alamat IP milik Anda**, pada server yang Andaoperasikan. Terdapat dua jenis node: - **Node VPN.** Program Go kecil, `cmp-agent`, berjalan di host Linux Anda. Program ini mendeteksi alamat IPv4 publik pada host, membuka pendengar SOCKS5, HTTP, dan UDP pada setiap alamat yang dijual, serta mengirimkan lalu lintas keluar dari **IP yang sama** tempat pelanggan terhubung (keluar IP yang sama). Layanan ini melaporkan status ke panel setiap beberapa detik. - **Node proksi IPv6.** Layanan proksi yang memberi pelanggan alamat dari prefiks IPv6 yang Anda rutingkan ke host. Panel menginstalnya untuk Anda melalui SSH. Gunakan node ini untuk menjual kembali alamat IP bersih di negara tempat Anda memiliki server. ## Persyaratan {#requirements} ### Node VPN {#vpn-node} | Item | Persyaratan | |---|---| | Sistem operasi | Distribusi Linux dengan systemd dan kernel versi 4.15 atau yang lebih baru (dukungan free-bind IPv6). Biner agen yang disertakan hanya untuk **x86_64** (amd64). | | Hak akses | root, untuk instalasi. Layanan ini hanya mempertahankan `CAP_NET_ADMIN`, `CAP_NET_RAW`, dan `CAP_DAC_READ_SEARCH`. | | Peralatan | `curl` atau `wget`, dan `sha256sum` (pemasang menolak untuk melanjutkan tanpa memeriksa file tersebut). | | Alamat publik | Alamat IPv4 publik yang ditetapkan pada antarmuka host (masing-masing satu `/32`), **atau** prefiks yang dirutekan ke host yang Anda tambahkan sebagai subnet tambahan (IPv4 /16 hingga /32, IPv6 /48 hingga /128). Rentang privat, CGNAT, dan dokumentasi diabaikan. | | Jaringan, masuk | Pelanggan terhubung ke setiap IP publik yang dijual pada **port 65001-65535** (TCP untuk SOCKS5 dan HTTP, UDP untuk asosiasi UDP). Setiap endpoint menggunakan serangkaian tiga port berurutan. | | Jaringan, keluar | HTTPS (443) ke domain panel Anda. Agen ini juga memeriksa negaranya sendiri di `ip-api.com` (HTTP) dan `ipinfo.io` (HTTPS), dengan batas waktu 3.5 detik. | | Email | Koneksi outbound ke port 25 selalu diblokir; tidak ada pengaturan untuk membukanya. | | Docker, VPN, dan antarmuka virtual | Antarmuka bernama `docker*`, `veth*`, `br-*`, `cni*`, `flannel*`, `virbr*`, `cali*`, `tun*`, `tap*`, `wg*`, dan `tailscale*` tidak menyumbangkan alamat. | | Bergantung pada | Modul **VPN**, zona (dibuat secara otomatis dari negara host), dan panel NexCMP yang dapat dijangkau melalui HTTPS. | ### Node proxy IPv6 {#ipv6-proxy-node} | Item | Persyaratan | |---|---| | Sistem operasi | Linux dengan systemd pada **x86_64**. Perintah `systemctl`, `nft`, `ip`, `ss`, `sysctl`, dan `useradd` harus ada; jika tidak, penginstalan akan berhenti dan menyebutkan perintah yang hilang. | | Akses untuk penginstalan | Alamat IPv4 publik (alamat privat, loopback, dan CGNAT ditolak), port SSH, akun dengan hak akses root atau `sudo` serta **kata sandi**-nya. Kata sandi hanya digunakan untuk penginstalan dan tidak disimpan. | | Port kosong | **80, 443, dan setiap port di atas 60000** harus kosong. Pemasang tidak pernah menghentikan atau mengubah layanan yang sudah berjalan; pemasang melaporkan port yang sibuk dan berhenti. | | IPv6 | Prefiks publik antara **/32 dan /64** di dalam `2000::/3` yang dapat digunakan host sebagai sumber untuk lalu lintas keluar, yang dikirimkan baik **dirutekan** ke host maupun **on-link** dengan proksi NDP (lihat di bawah). | | Jaringan | Pelanggan terhubung ke IPv4 node pada port 80 (HTTP proxy), port 443 (SOCKS5), dan port 60001-65535 (satu port per IP statis). Node tidak memiliki sertifikat, sehingga tidak ada HTTPS proxy. Lalu lintas hanya keluar melalui IPv6, dan hanya ke tujuan yang memiliki alamat IPv6. Node mengambil konfigurasinya dari panel melalui HTTPS. | | Perangkat lunak node di server panel | Daemon node dan skrip jaringannya disertakan dalam paket rilis NexCMP. Panel menyalinnya dari folder instalasinya (`/opt/nexcmp/releases//bin`, atau `/opt/nexcmp/bin` pada build kustom) ke setiap node selama instalasi. Server panel juga memerlukan `sshpass` dan klien SSH; installer menambahkan `sshpass`, dan pada server yang diinstal sebelum 1.4.2 Anda menambahkannya dengan `sudo apt-get install -y sshpass`. | | Bergantung pada | Modul **IPv6 Proxy**, serta URL panel yang dihubungi kembali oleh node (**IPv6 Proxy › Settings › Panel URL for nodes**, default `https://`). | ## Siapkan infrastruktur {#prepare-the-infrastructure} ### Node VPN {#vpn-node-1} 1. **Sediakan host** dengan Linux yang didukung dan alamat IPv4 publik yang ingin Anda jual, yang dikonfigurasikan pada antarmuka jaringan atau dirutekan ke host. 2. **Jika Anda menjual blok routed**, rencanakan untuk memasukkannya sebagai **Extra subnet** saat Anda menambahkan node. Agent memasang rute `local dev lo` agar host menerima lalu lintas untuk setiap alamat di dalam blok, lalu melaporkan alamat yang ditemukannya. Agent juga membaca tabel perutean asli host dan tidak pernah menjual atau mengambil alamat **gateway**: jika blok tersebut berisi next-hop dari salah satu rute host (misalnya alamat router dari blok on-link), agent hanya memasang rute `local` untuk bagian blok di sekitarnya, melaporkan gateway ke panel, dan panel menjaga alamat tersebut tetap di luar pool serta di luar setiap alokasi. Agent akan menghapus rute yang dipasangnya saat extra subnet berubah atau agent berhenti. 3. **Buka firewall.** Izinkan TCP dan UDP masuk **65001-65535** pada alamat publik, dan HTTPS keluar ke panel. 4. **Opsional: penghitung byte per IP.** Akuntansi Conntrack (`net.netfilter.nf_conntrack_acct = 1`) memungkinkan peran pemantauan menghitung byte per IP. Panel dapat mengaktifkannya dengan mengirimkan perintah `acct` ke agen, yang juga menulis `/etc/sysctl.d/99-cmp-agent.conf`. Peran VPN itu sendiri tidak memerlukannya. 5. **Periksa panel dari node:** ```bash curl -fsS -o /dev/null -w '%{http_code}\n' https://cloud.example.com/install.sh ``` ### Node proxy IPv6 {#ipv6-proxy-node-1} Prefiks IPv6 mencapai node melalui salah satu dari dua cara. Pemasang menguji keduanya dengan koneksi keluar nyata dan mempertahankan yang berfungsi. | Jenis | Artinya | Yang Anda konfigurasikan | |---|---|---| | **Dirutekan** | Upstream Anda merutekan prefiks (misalnya /48 atau /56) **ke alamat node itu sendiri**. Paket keluar dapat menggunakan alamat apa pun dalam prefiks sebagai sumbernya dan balasan akan kembali ke node. | Minta prefiks terutekan kepada penyedia Anda yang next hop-nya adalah node tersebut. Tidak ada lagi yang perlu diatur di node: layanan proksi menggunakan soket transparan, tabel policy-routing tetap, dan `nft`. | | **On-link** | /64 berada di LAN yang sama dengan node. Balasan hanya berfungsi jika node merespons neighbour discovery untuk setiap alamat yang digunakan (**NDP proxy**). | Layanan ini menetapkan, khusus pada antarmuka tersebut, `net.ipv6.conf..accept_ra=2`, `forwarding=1`, dan `proxy_ndp=1`, mengingat nilai lama, memulihkannya saat berhenti, dan memblokir penerusan alamat pool agar node tidak bertindak sebagai router untuk pool tersebut. | Cara kerja pemeriksaan: node mencoba koneksi TCP ke alamat IPv6 publik (port 443) dari alamat acak prefiks kandidat, dalam waktu 6 detik. Kandidat adalah alamat global pada antarmuka dengan prefiks /64 atau lebih pendek, ditambah rute jenis `local`, `unreachable`, atau `blackhole` antara /16 dan /64. Prefiks yang lebih pendek dari /64 diterima sebagai **routed** jika /64 acak di dalamnya berfungsi. ::: warning Jangan gunakan prefiks yang sama dua kali Prefiks tidak boleh tumpang tindih dengan prefiks node lain, dan tidak boleh lebih luas dari prefiks yang sudah menjadi bagian dari pool IPv6 milik panel. Sebuah /64 **di dalam** pool panel diizinkan. Tumpang tindih dilaporkan sebagai "assign range … (node …)" pada hasil instalasi, dan prefiks tersebut akan dilewati. ::: Batasan yang diterapkan node secara otomatis: pelanggan tidak dapat mengirim email (port 25, 465, 587, 2525) dari alamat pool, dan lalu lintas IPv4 milik daemon dibatasi hanya untuk balasan serta komunikasi ke panel dan DNS. ## Hubungkan di NexCMP {#connect-in-nexcmp} ### Node VPN {#vpn-node-2} 1. Pada **System › Admin › License & updates**, aktifkan **VPN**. Lihat [Modules](https://nexcmp.com/id/docs/infrastructure/modules/). ![Kartu Module dengan sakelar VPN dan IPv6 Proxy](https://nexcmp.com/id/docs/images/infrastructure/vpn-proxy-nodes-01-modules.webp) 2. Buka **Infrastructure › VPN & Proxy nodes › Agents & external nodes**. Anda memiliki dua cara untuk menambahkan node. **a. Install over SSH.** Klik **+ Add server (SSH)** dan isi: | Kolom | Contoh nilai | |---|---| | Server IPv4 address | `192.0.2.50` | | SSH port | `22` | | SSH user | `root` | | SSH password | `XXXX` | | Display name | `node-ny-1` (kosong: dinamai berdasarkan IP) | | Server role | External VPN / Proxy Node | | Zone assignment | Auto by GeoIP (create / assign Zone), atau zona yang sudah ada | | Extra subnet (optional) | kosongkan untuk memindai antarmuka secara otomatis, atau blok yang dirutekan seperti `203.0.113.0/24` | | Aktifkan untuk dijual setelah instalasi | on untuk menandai setiap alamat yang terdeteksi dapat dijual | Klik **Connect & install**. Panel akan terhubung melalui SSH, menjalankan penginstal satu baris pada node dengan tiket sekali pakai, lalu menampilkan nama node, lokasi GeoIP, serta rentang yang terdeteksi. ![Dialog Add Node via SSH dengan contoh alamat server dan role](https://nexcmp.com/id/docs/images/infrastructure/vpn-proxy-nodes-02-add-server-ssh.webp) **b. Instal secara manual.** Klik **Generate manual install token**. Perintah hanya muncul **sekali**; salin dan jalankan pada node: ```bash curl -fsSL https://cloud.example.com/install.sh | sudo sh -s -- --token XXXX --name node-ny-1 ``` Instalasi via token hanya mendaftarkan mesin untuk pemantauan: demi keamanan, panel tidak mengizinkan mesin yang memegang token bersama untuk memberikan peran VPN kepada dirinya sendiri (menambahkan `--roles vpn` ke perintah tidak berpengaruh). Setelah mesin muncul di daftar, buka mesin tersebut dan tambahkan sendiri peran **VPN**. Menginstal melalui SSH (opsi a) memberikan peran VPN kepada node sejak awal. Token baru membatalkan token lama; host yang sudah terdaftar tetap berfungsi karena menggunakan kuncinya sendiri. ![Dialog perintah penginstalan yang menampilkan perintah token sekali pakai](https://nexcmp.com/id/docs/images/infrastructure/vpn-proxy-nodes-03-install-command.webp) Yang dilakukan penginstal: mengunduh `cmp-agent-linux-amd64` dari panel Anda, **memverifikasi SHA-256-nya**, memasangnya ke `/usr/local/bin/cmp-agent`, mendaftar dengan token tersebut, menulis `/etc/cmp-agent/agent.json`, lalu memulai layanan systemd `cmp-agent`. Untuk menghapusnya: `curl -fsSL https://cloud.example.com/install.sh | sudo sh -s -- --uninstall`. 3. Setelah heartbeat pertama, node akan muncul di daftar. Negaranya terdeteksi oleh GeoIP (pencarian node itu sendiri terlebih dahulu, kemudian basis data panel); sebuah **zona** untuk negara tersebut akan dibuat dan disetel publik jika belum ada, dan alamat yang ditemukan di host akan menjadi rentang pool. 4. Buka **Infrastructure › VPN & Proxy nodes › VPN IP pools** untuk melihat rentang, zona, serta nodenya, dan untuk mengubah zona, node, atau tombol **Sellable** dari setiap rentang. **Enable range** memungkinkan pesanan baru menggunakan IP yang tersedia; **Disable range** hanya menghentikan alokasi baru, IP yang sedang disewa tetap berjalan. ![Pool IP VPN dengan rentang yang dilaporkan oleh sebuah node](https://nexcmp.com/id/docs/images/infrastructure/vpn-proxy-nodes-04-vpn-pool.webp) 5. Buka **Services › VPN**, atur daftar harga, dan aktifkan penjualan. Sakelar **Sell VPN** pada **Subscriptions** merupakan sakelar yang sama dengan modul VPN di License & updates. 6. **Opsional: ubah nama layanan.** Di **Settings › Branding**, **VPN service display name** mengubah penamaan layanan VPN pada menu pelanggan, halaman pemesanan, halaman detail, dan daftar deploy (misalnya `IPv4 Proxy`, `Datacenter Proxy`, atau `Static Residential Proxy`; hingga 40 karakter, jika kosong akan tetap `VPN`). Ini hanya mengubah label: rute, data, dan API tidak berubah. ### Node proxy IPv6 {#ipv6-proxy-node-2} 1. Pada **System › Admin › License & updates**, aktifkan **IPv6 Proxy**. 2. Buka **Infrastructure › VPN & Proxy nodes › IPv6 Proxy nodes** dan klik **Add node (SSH)**. Masukkan alamat IPv4, port SSH, user, password node, nama opsional, dan **Reason** (akan dicatat di log audit), lalu klik **Install**. ![Dialog Add IPv6 node dengan contoh alamat dan alasan](https://nexcmp.com/id/docs/images/infrastructure/vpn-proxy-nodes-05-proxy6-add-node.webp) 3. Panel kemudian secara berurutan: memeriksa mesin dan port, menyalin daemon, skrip jaringan, unit layanan, dan file lingkungan khusus node (token node dan kunci penandatanganan kata sandi), menjalankan **probe** untuk prefiks yang dapat digunakan, mencatat prefiks di dalam pool, memulai layanan, dan menunggu hingga 90 detik untuk laporan pertama. **Install log** menampilkan setiap langkah. 4. Node baru membuat zona dalam status **off** (dari GeoIP IPv4 node tersebut). Aktifkan zona di bawah **Infrastructure › Datacenter › Zone** agar pelanggan dapat memilihnya. 5. Atur total **Mbps cap** per node (10 hingga 100000 per arah). Di bawah **Services › IPv6 Proxy**, atur daftar harga dan aktifkan penjualan. 6. Periksa **IPv6 Proxy › Settings › Panel URL for nodes**. Node memanggil alamat ini (`https://host`, tanpa path) untuk mengambil konfigurasinya dan mengirim laporan. Jika kosong, berarti `https://`. Alamat tersebut harus berupa host yang mengarah langsung ke panel, sehingga IPv4 milik node itu sendiri mencapainya tanpa perubahan. ::: tip Jadwal rotasi Pelanggan dapat mengatur interval rotasi otomatis dari 30 hingga 600 detik. Di NexCMP, panel menjalankan jadwal tersebut (serta pembersihan log koneksi setiap jam); node mengambil alamat baru dalam waktu sekitar 5 detik. ::: ### Cara kerja pelaporan node {#how-a-node-reports} | | Node VPN (`cmp-agent`) | Node proxy IPv6 | |---|---|---| | Pendaftaran | Tiket atau token satu kali melalui HTTPS, kemudian kuncinya sendiri | Instalasi SSH satu kali, lalu token node | | Detak jantung | Setiap **5 detik** (10 detik untuk agen khusus pemantau); panel dapat mengatur dari 3 hingga 300 detik. Setelah kegagalan, jeda ditingkatkan bertahap sebesar 5 detik hingga 60 detik | Node mengirimkan laporan setiap sekitar 60 detik dan menarik konfigurasi | | Ditampilkan sebagai online | Detak jantung dalam **60 detik** terakhir | **alive** dalam **120 detik** terakhir, jika tidak maka **missed heartbeat** | | Perubahan konfigurasi | Diterapkan pada detak jantung berikutnya | Diterapkan dalam waktu sekitar 5 detik | | Pembaruan | Panel dapat mengirim perintah `upgrade` dengan versi, URL, dan SHA-256 yang baru | Instal ulang dari baris node | ### Kuota data pada node VPN {#data-allowance-on-a-vpn-node} Mulai NexCMP **1.5.1**, agent node VPN mengirimkan lalu lintas yang dibawanya pada setiap heartbeat, dan panel menambahkannya ke penggunaan paket untuk periode berjalan. Angka yang sama ditampilkan kepada pelanggan (tab Overview dan Bandwidth) serta kepada Anda (VPN › Subscriptions, kolom Used, dan baris node). - **Pemutusan.** Ketika suatu paket telah menghabiskan kuota GB-nya untuk periode tersebut, panel berhenti mengirimkan endpoint paket tersebut ke agent, sehingga koneksi baru ditolak dan koneksi yang sedang terbuka ditutup. Pemutusan terjadi dalam satu heartbeat, sehingga paket dapat berjalan sedikit melampaui batasnya. Paket dengan tier Unlimited tidak pernah diputus. - **Dibuka kembali.** Paket akan dilayani kembali dalam satu heartbeat setelah pelanggan membeli lebih banyak bandwidth atau saat periode berikutnya dimulai. - **Not measured.** Node yang agent-nya belum mengirimkan penggunaan (misalnya agent versi lama) ditampilkan sebagai **Not measured**, dan paketnya tidak pernah diputus karena kuota GB. - **Perbarui agen.** Gunakan agen **1.5.1** pada node. Agen versi lama masih tetap dihitung, tetapi dapat kehilangan byte dari heartbeat yang gagal, endpoint yang dihentikan, atau restart, serta tidak menutup koneksi terbuka saat paket diputus. Perbarui dari baris node (Reinstall) atau dengan perintah `upgrade`. - Penghitungan dilakukan terhadap payload yang melewati proxy, sehingga nilainya sedikit lebih rendah (sekitar 1 %) daripada byte di jaringan. ### Add-on VPN yang dihentikan {#retired-vpn-add-ons} High IP Reputation, High Concurrency, dan High Priority Network tidak lagi ditawarkan pada pesanan baru. Langganan yang sudah ada mempertahankan pilihan add-on mereka, tetapi biaya add-on yang dihentikan dihapus dari jumlah pembaruan mereka. Tidak ada pengembalian dana untuk periode yang telah dibayar. Penyesuaian menggunakan harga katalog add-on saat ini; jika Anda mengubah harga tersebut atau menghapus add-on, tinjau jumlah pembaruan langganan sebelum pembaruan berikutnya. ## Verifikasi {#verify} 1. Baris node berstatus online. Untuk node VPN, **Agents & external nodes** menampilkan zona, negara, peran, dan rentang yang terdeteksi. 2. **VPN IP pools** mencantumkan rentang dengan IP kosong; halaman detail zona menampilkan infrastruktur VPN. 3. Pesan paket VPN atau proxy uji coba. Pelanggan akan mendapatkan endpoint `ip:port`, nama pengguna, dan kata sandi; sambungkan melaluinya dan periksa bahwa IP publik yang terlihat adalah IP node tersebut (misalnya `curl --proxy socks5h://USER:XXXX@IP:PORT https://ifconfig.me`). 4. Pada node IPv6, jalankan perintah ini di host: ```bash systemctl is-active nft list tables | grep proxy6 ss -ltn | grep -E ':(80|443|6[0-9]{4})\b' ``` ## Batasan dan catatan {#limits-and-notes} - Host Windows dapat menjalankan agen pemantau tetapi tidak peran VPN. - Kuota data (GB per periode) untuk paket VPN: mulai dari NexCMP 1.5.1, panel menjumlahkan lalu lintas yang dilaporkan oleh agen node VPN dan memutus proxy paket saat kuota GB periode tersebut habis (lihat "Kuota data pada node VPN" di bawah). Paket IPv6 Proxy tidak memiliki kuota GB; paket ini membatasi kecepatan dalam Mbps per paket. - Alamat IPv4 pada paket VPN tidak dirotasi. Pelanggan melaporkan IP yang masuk blacklist; Anda atau reseller menyetujui penggantian dari zona yang sama. Hanya IPv6 Proxy yang dirotasi. - Sebanyak-banyaknya 64 rentang dilaporkan per detak jantung. - Satu set endpoint VPN menggunakan tiga port per IP yang dijual. Dengan port 65001-65535, setiap IP melayani sejumlah endpoint terbatas (178 set port); panel akan melewati set yang sebelumnya pernah digunakan. - Penghapusan node proxy IPv6 hanya diizinkan jika tidak ada paket yang memegang IP di atasnya. Tindakan ini menghapus rentang dan token node tersebut; perangkat lunak pada host tidak dihapus. - Menjual kembali rentang yang juga digunakan oleh VM Anda sendiri adalah mungkin: VPN hanya menggunakan port 65001-65535, sehingga rentang IP tersebut dibagi dengan layanan lain. ## Pemecahan Masalah {#troubleshooting} | Gejala | Penyebab | Solusi | |---|---|---| | "pendaftaran gagal (token tidak valid atau server tidak dapat dijangkau)" | Token salah atau sudah digunakan, atau panel tidak dapat dijangkau | Buat token baru, atau coba lagi penginstalan SSH. | | "ketidakcocokan tanda tangan file - STOP" | Agen yang diunduh berbeda dari SHA-256 yang dipublikasikan | Periksa folder `/dl/` pada panel dan pastikan tidak ada yang menulis ulang unduhan di tengah jalan. | | "penginstal ini hanya untuk Linux" / "arsitektur … belum didukung" | Windows, atau arsitektur selain x86_64 (rilis ini hanya menyertakan agen untuk x86_64) | Gunakan host Linux x86_64. | | Node tidak pernah muncul | Node tidak dapat menjangkau panel melalui HTTPS | Uji `curl https:///install.sh` dari node; periksa DNS dan firewall. | | Node muncul dengan negara yang salah | Pencarian negara gagal, sehingga basis data alamat panel digunakan | Izinkan akses keluar ke `ip-api.com` dan `ipinfo.io`, atau pilih zona secara eksplisit di formulir SSH. | | Tidak ada rentang yang terdeteksi | Tidak ada IPv4 publik pada antarmuka non-virtual | Tambahkan alamat publik, atau masukkan blok yang dirutekan sebagai **Extra subnet**. | | VPN berfungsi, lalu lintas keluar dari IP lain | IP yang dijual tidak ditetapkan atau dirutekan ke host | Pastikan IP berada di antarmuka atau dicakup oleh `local … dev lo`. | | "server panel tidak memiliki sshpass" | Host panel tidak dapat login ke node dengan kata sandi | Jalankan `sudo apt-get install -y sshpass openssh-client` pada server panel, lalu instal kembali node tersebut. | | "not found in the installed package" saat menginstal node IPv6 | Versi panel lebih lama dari 1.4.2, atau custom build tanpa file node | Perbarui NexCMP ke 1.4.2 atau lebih baru; untuk custom build gunakan `build.sh`, yang sekarang menyertakan `brandy-proxy6d` dan `brandy-proxy6-net`. | | "SSH: …" pada awal penginstalan IPv6, atau "SSH to internal/loopback addresses is not allowed" | Port, pengguna, atau kata sandi salah, SSH diblokir, atau alamat bersifat privat | Gunakan IPv4 publik node dan periksa akses secara manual dengan `ssh -p PORT USER@IP`. | | "arsitektur … tidak didukung (hanya x86_64)" | Node bukan x86_64 | Gunakan host x86_64. | | "node tidak memiliki perintah: …" | `nft`, `ip`, `ss`, `sysctl`, `systemctl`, atau `useradd` tidak terinstal | Instal paket tersebut, lalu jalankan kembali penginstalan. | | "port sedang digunakan oleh layanan lain pada node: … — 80, 443, 60001-65535 harus bebas" | Port 80, 443, atau port di atas 60000 sedang sibuk | Pindahkan layanan lain; penginstal tidak menghentikannya. | | "tidak ada prefiks IPv6 dengan akses Internet yang ditemukan dari node (pemeriksaan egress nyata gagal)" | Tidak ada prefiks terutekan, proxy NDP tidak memungkinkan, atau tidak ada IPv6 keluar | Periksa apakah prefiks dirutekan ke node, antarmuka memiliki konektivitas IPv6, dan tidak ada yang memfilter lalu lintas keluar. | | "semua rentang yang terdeteksi sudah menjadi milik node lain" | Prefiks sudah digunakan oleh node lain | Hapus dari node lain atau pilih prefiks lain. | | Penginstalan diakhiri dengan "no initial report received from node" | Layanan dimulai tetapi tidak mencapai panel dalam 90 detik | Periksa URL panel yang diberikan ke node dan jalur HTTPS node ke sana; lihat **Install log**. | | Baris node menunjukkan **missed heartbeat** | Tidak ada laporan selama 120 detik | Periksa layanan pada node, jamnya, dan jalurnya ke panel. | | Pelanggan tidak melihat lokasi IPv6 | Zona nonaktif | Aktifkan zona di bawah **Zone**. | --- # AI Models {#ai-models} > **Lokasi di admin:** System › Admin › License & updates (`/license`) untuk mengaktifkan modul. Lalu Services › AI Models: Providers (`/ai/providers`), Models (`/ai/models`), Profit (`/ai/profit`), dan Audit (`/ai/audit`). Pelanggan menggunakan AI › API di portal pelanggan. ## Fungsi {#what-it-does} AI Models adalah layer gateway dan penagihan pada panel Anda sendiri. Pelanggan Anda mendapatkan API key dan memanggil **satu endpoint pada domain Anda**, dalam format yang kompatibel dengan OpenAI atau Anthropic. Anda memilih model mana saja yang ditawarkan beserta biayanya per 1 juta token. NexCMP memeriksa kunci, batasan, dan wallet, meneruskan permintaan ke penyedia yang Anda tambahkan, menghitung token, lalu memotong wallet prabayar pelanggan. **Anda menyediakan sumber model sendiri.** NexCMP hadir tanpa penyedia, tanpa model, tanpa alamat default, dan tanpa harga. NexCMP tidak menyediakan model, API key, token, maupun akun penyedia. ::: warning Periksa ketentuan sumber Anda terlebih dahulu Banyak sumber model membatasi penjualan kembali atau penerusan akses ke pihak ketiga. Gunakan hanya sumber yang izin penggunaannya dan penjualan kembalinya Anda miliki, serta patuhi ketentuan mereka dan hukum yang berlaku bagi Anda. Halaman ini bukan nasihat hukum. ::: AI Models adalah produk terpisah dari **AI Chat and AI Agent** (modul **AI**, lihat [Penyedia AI](https://nexcmp.com/id/docs/ai/ai-providers/)). Kedua modul ini tidak saling bergantung. ## Persyaratan {#requirements} | Item | Persyaratan | |---|---| | Modul | **AI Models** diaktifkan pada License & updates, Modules. Fitur ini dinonaktifkan secara default. | | Penyedia | Satu atau beberapa sumber model yang berwenang Anda jual kembali, masing-masing dengan API yang kompatibel dengan OpenAI (`/chat/completions`), API yang kompatibel dengan Anthropic (`/messages`), atau keduanya. Masing-masing memerlukan base URL dan API key. | | Jaringan | Panel harus dapat menjangkau setiap penyedia melalui **HTTPS pada port 443** di nama domain publik. Penyedia pada host internal, port lain, atau plain HTTP harus tercantum di bawah **Allowed internal hosts** (pengaturan `ai_endpoint_allow`). | | Pelanggan | Akun pelanggan dengan alamat email terverifikasi dan saldo dompet. | | Perangkat keras | Tidak ada. NexCMP hanya meneruskan permintaan: tanpa GPU dan tanpa file model. | ## Siapkan infrastruktur {#prepare-the-infrastructure} 1. Dapatkan API key dari setiap sumber model yang akan Anda gunakan, dan catat base URL miliknya (misalnya `https://api.example.com/v1`). 2. Periksa ketentuan sumber terkait penjualan kembali. 3. Jika sumber berjalan di dalam jaringan Anda, tentukan alamatnya, misalnya `http://10.0.0.5:8000/v1`. Anda akan mendaftarkan `10.0.0.5:8000` di bawah **Allowed internal hosts**. ## Hubungkan di NexCMP {#connect-in-nexcmp} ### 1. Aktifkan modul {#_1-turn-the-module-on} Buka **System › Admin › License & updates**, temukan kartu **Module**, dan aktifkan **AI Models**. Menu akan dimuat ulang dan **Services › AI Models** muncul. Selama modul nonaktif, halaman pelanggan, halaman admin, dan gateway semuanya merespons `404 module_disabled`, serta tidak ada penyedia yang dihubungi. ![Kartu Module dengan sakelar AI Models aktif](https://nexcmp.com/id/docs/images/infrastructure/ai-models-01-modules.webp) ### 2. Tambahkan penyedia {#_2-add-a-provider} 1. Buka **AI Models › Providers** dan pilih **Add provider**. 2. Masukkan **slug** pendek, **name** (hanya Anda yang melihatnya), **type** (OpenAI-compatible, Anthropic-compatible, atau Both), **base URL** dan **API key**, serta **priority** (angka lebih kecil dicoba lebih dulu). 3. Simpan. Kunci disimpan terenkripsi dan hanya empat karakter terakhirnya yang ditampilkan setelahnya. Kunci hanya dapat dimasukkan dari sesi administrator yang telah masuk. Gunakan **Both** hanya untuk gateway yang benar-benar melayani kedua format. NexCMP **tidak** menerjemahkan di antara kedua format: model yang dilayani oleh penyedia yang kompatibel dengan OpenAI dijangkau di `/ai/v1/chat/completions`, dan yang dilayani oleh penyedia yang kompatibel dengan Anthropic di `/ai/v1/messages`. ![Halaman Providers yang mencantumkan tiga contoh penyedia beserta jenis, prioritas, dan statusnya](https://nexcmp.com/id/docs/images/infrastructure/ai-models-02-providers.webp) ### 3. Uji koneksi {#_3-test-the-connection} Pilih **Test connection** pada penyedia. NexCMP membaca `GET /models` dengan kunci tersebut dan melaporkan **ok**, atau alasan kegagalannya: **auth** (kunci salah), **blocked**, **billing**, atau **unreachable**. Pengujian dibatasi 6 kali per menit. ### 4. Sinkronkan model {#_4-sync-the-models} Pilih **Sync models**. NexCMP membaca daftar model penyedia dan menambahkan setiap model baru dalam kondisi **nonaktif tanpa harga**. Model yang tidak lagi dicantumkan oleh penyedia akan ditandai. Selama modul aktif, daftar ini juga disinkronkan secara otomatis setiap 6 jam (pengaturan `ai_models_sync_hours`). ### 5. Tetapkan harga dan aktifkan model {#_5-set-prices-and-switch-models-on} 1. Buka **AI Models › Models**. 2. Untuk setiap model yang ingin Anda jual, tetapkan **harga jual** dalam dolar AS per 1 juta token: **input**, **cached input**, dan **output**. 3. Secara opsional masukkan **biaya** Anda untuk model tersebut. Kemudian **Profit** menampilkan pendapatan dibandingkan biaya per hari dan per model, serta harga jual di bawah biaya Anda ditambah margin minimum (pengaturan `ai_min_margin_pct`, 10 secara default) akan ditolak kecuali Anda mengonfirmasi kerugian yang disengaja. **Set price from cost** menggunakan markup yang Anda pilih; tidak ada markup default. 4. Aktifkan model. Model tanpa harga jual tidak dapat diaktifkan. Harga cached input yang dibiarkan nol akan ditagih sesuai harga input. ![Halaman Models dengan harga jual input, cached input, dan output serta sakelar on-off](https://nexcmp.com/id/docs/images/infrastructure/ai-models-03-models.webp) ### 6. Routes dan failover {#_6-routes-and-failover} Pada suatu model, **Routes** mencantumkan penyedia yang melayaninya secara berurutan. Tambahkan penyedia kedua sebagai fallback, atur urutannya, dan secara opsional berikan nama model yang berbeda untuk setiap penyedia (nama yang dikirim ke penyedia dapat berbeda dari nama yang Anda publikasikan). Ketika suatu penyedia mengembalikan kesalahan server, kesalahan otorisasi atau penagihan, model tidak ditemukan, atau batas kuota (rate limit), NexCMP akan mencoba route berikutnya. Jika pembacaan mengalami batas waktu (timeout) setelah permintaan dikirim, permintaan tersebut **tidak** dikirim ke penyedia lain, sehingga Anda tidak membayar dua kali. Setiap penyedia dibatasi kecepatannya pada `ai_provider_rpm` permintaan per menit (default 50). Jika penyedia terus-menerus mengembalikan kesalahan otorisasi atau penagihan, NexCMP akan memperingatkan administrator melalui Telegram jika Telegram telah dikonfigurasi. ### 7. Buka sakelar penjualan {#_7-open-the-sale-switch} Di bagian atas halaman AI Models, **sakelar penjualan** (pengaturan `feature_ai_models`) nonaktif secara default. Saat nonaktif, pelanggan melihat bahwa layanan belum dibuka dan daftar harga publik melaporkannya sebagai tidak tersedia. Pastikan setidaknya satu model aktif, memiliki harga jual, dan route dengan kunci, lalu aktifkan sakelar tersebut. ### Apa yang dapat dilakukan pelanggan {#what-customers-can-do} Di portal pelanggan, **AI › API**: - **Models** menampilkan model dan harga Anda, URL dasar, serta contoh perintah siap pakai. - **API Keys**: buat, ganti nama, rotasi, nonaktifkan, dan hapus kunci. Rahasia hanya ditampilkan sekali; hanya hash yang disimpan. Per kunci: model yang diizinkan, kedaluwarsa, anggaran batas lunak (memberi peringatan) dan anggaran batas keras (memblokir dengan `402`), permintaan per menit, serta token per menit. - **Usage** berdasarkan model, kunci, dan hari, disertai fitur ekspor. - **Logs**: catatan permintaan yang dapat difilter (waktu, kunci, model, token, biaya, status, latensi). **Prompt dan respons tidak dicatat.** Log disimpan selama 90 hari secara default (`ai_log_retention_days`). - **Settings**: anggaran akun dan alamat email untuk peringatan anggaran. - **Playground**: mengobrol dengan model, membandingkan model secara berdampingan, dan menyalin kode yang sesuai. ![Halaman API Keys pelanggan dengan URL dasar untuk kedua format API](https://nexcmp.com/id/docs/images/infrastructure/ai-models-04-keys.webp) Endpoint gateway, pada domain Anda: ```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 dan penagihan {#wallet-and-billing} Penggunaan AI dibebankan ke wallet prabayar yang sama seperti layanan lainnya. Sebelum permintaan diteruskan ke penyedia, NexCMP mencadangkan dana untuk biaya maksimum yang mungkin terjadi; jika saldo di bawah batas minimum (`ai_min_balance_cents`, default 20 sen) atau terlalu kecil, permintaan akan ditolak dengan `402 insufficient_balance` dan **tidak ada penyedia yang dipanggil**. Penggunaan dikumpulkan per akun dan diselesaikan ke dalam entri buku besar wallet setiap jam, dengan pembersihan (sweep) setiap 5 menit; penggunaan yang belum diselesaikan sudah dipotong dari saldo yang terbaca oleh gateway. Reseller dapat menjual AI Models di domain mereka sendiri: markup atau diskon mereka berlaku untuk harga jual Anda dan wallet grosir mereka ditagih harga grosir. Sakelar AI per-reseller, aktif secara default, mengontrol siapa yang menjualnya. ## Verifikasi {#verify} 1. Setelah langkah 3, **Test connection** menampilkan **ok** dan jumlah model. 2. Setelah langkah 4, model baru tercantum dalam keadaan nonaktif tanpa harga. 3. Sebagai pelanggan dengan saldo wallet yang mencukupi, buat kunci dan panggil gateway: ```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"}]}' ``` Respons `200` memuat jawaban model. **Usage** menampilkan permintaan tersebut, dan **Profit** menampilkannya jika Anda memasukkan biaya. 4. Dengan saldo wallet nol, panggilan yang sama mengembalikan `402 insufficient_balance`. ## Batasan dan catatan {#limits-and-notes} - Modul ini tidak menyertakan penyedia, model, atau harga bawaan, dan daftar harga tidak pernah dibaca dari penyedia. - Alat yang berjalan di sisi penyedia dan ditagih per panggilan, seperti pencarian web, ditolak karena tidak dapat diukur pemakaiannya. Hanya daftar singkat parameter permintaan yang diteruskan. - Penggunaan token diambil dari balasan provider; jika balasan tidak memilikinya, NexCMP memperkirakannya dan menandai catatan tersebut sebagai diestimasi. - Error dari provider dibersihkan sebelum sampai ke pelanggan (nama, host, alamat, dan nama model milik provider dihapus). Pelanggan tidak pernah melihat provider mana yang melayani permintaan. - Pelanggan mengakses gateway melalui domain panel Anda, sehingga TLS domain tersebut harus berfungsi. - NexCMP tidak menyediakan perjanjian tingkat layanan (SLA), fine-tuning, atau hosting GPU untuk modul ini. ## Pemecahan Masalah {#troubleshooting} | Gejala | Penyebab dan perbaikan | |---|---| | Setiap halaman AI Models dan gateway merespons `404 module_disabled` | Modul nonaktif. Aktifkan **AI Models** di bawah License & updates, Modules. | | Penambahan provider gagal dengan `endpoint_host_not_allowed`, `endpoint_must_be_https`, atau `invalid_endpoint_port` | URL dasar harus berupa HTTPS pada port 443 dengan nama domain publik. Untuk host internal, port lain, atau HTTP biasa, cantumkan `host:port` di bawah **Allowed internal hosts**. | | `blocked_endpoint` | Alamat berupa IP, atau namanya me-resolve ke alamat privat. Cantumkan di bawah **Allowed internal hosts** jika itu yang Anda inginkan. | | **Test connection** menampilkan `auth` | Kunci salah atau tidak memiliki akses. Masukkan kunci kembali. | | Model tidak dapat diaktifkan (`no_price`) | Tetapkan harga jual terlebih dahulu. | | Pelanggan menerima `503 ai_unavailable` | Tombol penjualan nonaktif, atau tombol AI reseller nonaktif. | | Pelanggan menerima `503 upstream_unavailable` | Tidak ada rute aktif dengan kunci yang melayani model tersebut dalam format yang diminta. Periksa rute model dan tipe provider. | | Pelanggan menerima `402 insufficient_balance` | Saldo wallet di bawah batas minimum atau terlalu kecil untuk permintaan tersebut. Minta pelanggan melakukan top up. | --- # Object Storage (S3, Ceph RGW) {#object-storage-s3-ceph-rgw} > **Di mana di admin:** Infrastructure › Cloud provider › Ceph S3 (RGW) (`/infra/s3`). Akun: Services › Object Storage › S3 accounts (`/s3`). Harga: Services › Object Storage › PAYG pricing (`/s3/policy`). Nyalakan modul di bawah System › Admin › License & updates. ## Fungsi {#what-it-does} Pelanggan membuat akun S3 dari portal dan mendapatkan kunci akses. NexCMP membuat dan menghapus pengguna yang cocok di **Ceph RADOS Gateway (RGW) Anda** melalui RGW Admin Ops API, membaca penggunaan untuk penagihan, dan menagih biaya bayar-sesuai-pemakaian: penyimpanan di atas tingkatan gratis per GB per bulan (dihagih per jam) dan trafik unduhan per GB. Unggahan gratis. Gunakan ini saat Anda menjalankan kluster Ceph dengan RGW dan ingin menjual kembali penyimpanan objek. ## Persyaratan {#requirements} | Item | Persyaratan | |---|---| | Ceph | Kluster dengan setidaknya satu daemon RGW, dengan **Admin Ops API** diaktifkan (bawaan `rgw_enable_apis` mencakup `admin`). | | Pengguna admin | Pengguna RGW untuk NexCMP dengan kapabilitas yang tercantum di bawah ini. Jangan gunakan pengguna yang memiliki data pelanggan. | | Titik akhir | Titik akhir S3 yang digunakan pelanggan, dan titik akhir Admin Ops. Keduanya ditulis sebagai `https://host` **tanpa jalur, hanya port 443**, dan harus menyelesaikan ke alamat **publik**: loopback, link-local, multicast, alamat privat dan unique-local ditolak. | | Sertifikat | Sertifikat yang valid untuk host titik akhir. | | Log penggunaan | Pencatatan penggunaan RGW aktif (`rgw_enable_usage_log = true`), sehingga API penggunaan dapat melaporkan trafik. | | Zone | Zona master dengan layanan **Object Storage (S3)** dicentang. Lihat [Zones](https://nexcmp.com/id/docs/infrastructure/zones/). | | Storage | Kapasitas di Ceph untuk kuota yang Anda jual. | | Bergantung pada | Modul **Object Storage**. Trafik unduhan juga dihitung ke [Bandwidth](https://nexcmp.com/id/docs/catalog/bandwidth/). | ## Siapkan infrastruktur {#prepare-the-infrastructure} Pada node admin Ceph: 1. Buat pengguna admin dan berikan kapabilitas Admin Ops yang dibutuhkannya: ```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 ``` Salin `access_key` dan `secret_key` dari keluaran. Keduanya adalah **Admin access key** dan **Admin secret key** di NexCMP. 2. Nyalakan log penggunaan dan mulai ulang gateway: ```bash ceph config set client.rgw rgw_enable_usage_log true ``` 3. Letakkan gateway di belakang HTTPS pada port 443 (proksi terbalik atau TLS RGW sendiri), publikasikan nama DNS, dan uji dari server panel: ```bash curl -fsS -o /dev/null -w '%{http_code}\n' https://s3.example.com/ ``` Anda seharusnya mendapatkan respons XML S3 (HTTP 200 atau 403), bukan waktu habis (timeout). ## Hubungkan di NexCMP {#connect-in-nexcmp} 1. **Berikan layanan S3 pada zona.** Buka **Infrastructure › Datacenter › Zone**, edit zona tersebut, dan centang **Object Storage (S3)**. Hanya zona master dengan layanan S3 yang muncul di formulir backend. 2. Buka **Infrastructure › Cloud provider › Ceph S3 (RGW)** dan klik **Add backend**: | Kolom | Contoh nilai | |---|---| | Nama backend | `Ceph RGW 1` | | Zone | zona dari langkah 1 | | Titik akhir RGW Admin Ops | `https://s3.example.com` | | Endpoint S3 pelanggan | `https://s3.example.com` | | Wilayah penandatanganan S3 | `default` | | Kunci akses admin | `XXXX` | | Kunci rahasia admin | `XXXX` | | Aktif | aktif | | Aktifkan penjualan (wajib uji koneksi terlebih dahulu) | **nonaktif** untuk saat ini | | Alasan perubahan | `initial setup` | ![Dialog S3 backend dengan contoh endpoint, wilayah, dan kunci yang disamarkan](https://nexcmp.com/id/docs/images/infrastructure/s3-02-backend-dialog.webp) 3. Klik **OK** (simpan), lalu **Check** pada baris tersebut. NexCMP memanggil API Admin Ops dengan kunci admin. **Ceph connection successful** dan tag **Verified** menandakan hal tersebut berfungsi. 4. Klik **Edit**, aktifkan sakelar **Enable sales**, lalu simpan. NexCMP menolak membuka penjualan hingga pemeriksaan berhasil. 5. Buka **Services › Object Storage › PAYG pricing** dan tentukan penetapan harga: | Kolom | Arti | |---|---| | Penyimpanan di atas tingkat gratis (VND/GB/bulan) | Harga penyimpanan; ditagih per jam sebagai harga bulanan dibagi 730. | | Unduh (VND/GB) | Harga untuk lalu lintas keluar. | | Unggah (VND/GB) | Selalu 0. | | Tingkat gratis dengan VM Aktif (GB) | Tetap sebesar 100 GB per akun selama pelanggan memiliki setidaknya satu VM aktif, dibagikan di antara akun S3 mereka berdasarkan ukuran. | | Batas utang (VND) | Berapa banyak penggunaan yang belum dibayar yang diizinkan. | | Ambang batas penagihan (VND) | Penggunaan dikumpulkan menjadi satu tagihan setelah melewati jumlah ini. | | Saldo minimum untuk membuat S3 (VND) | Saldo dompet yang diperlukan untuk membuat akun. | | Maks akun S3 per pelanggan, Kuota teknis default (GB) | Batasan untuk akun baru. | ![Formulir harga S3 PAYG](https://nexcmp.com/id/docs/images/infrastructure/s3-04-pricing.webp) Harga S3 dimasukkan dalam VND. Harga tersebut dikonversi untuk tampilan dan pemotongan dompet pada nilai tukar yang berlaku; lihat [Currency and exchange rates](https://nexcmp.com/id/docs/catalog/currency-and-exchange-rates/). ## Verifikasi {#verify} 1. **Check** menghasilkan "Ceph connection successful". 2. Sebagai pelanggan (atau dengan akun uji), buat akun S3. Pada Ceph, `radosgw-admin user list` menampilkan pengguna baru, dan **S3 accounts** mencantumkannya. 3. Buat bucket dengan klien S3 apa pun menggunakan kunci pelanggan terhadap endpoint pelanggan. Unggah sebuah file. 4. Setelah penagihan jam berikutnya, **S3 accounts** menampilkan penggunaan. ## Batasan dan catatan {#limits-and-notes} - Backend yang sudah terhubung dengan akun tetap mempertahankan **zone, endpoint, dan region** miliknya; untuk mengubahnya, buat backend baru. - Satu zona dapat memiliki backend-nya sendiri; akun dan backend terikat secara permanen pada suatu zona. - Tingkat gratis dan "unggah gratis" adalah aturan tetap, bukan opsi. - Kunci disimpan secara terenkripsi; konsol hanya menampilkan bidang "biarkan kosong untuk mempertahankan kunci saat ini". Pasangan kunci selalu dimasukkan bersama-sama. - Kunci rahasia pelanggan ditampilkan sekali saat pembuatan, dan tidak akan ditampilkan lagi. Kunci yang hilang diganti dengan merotasinya. ## Pemecahan Masalah {#troubleshooting} | Gejala | Penyebab | Solusi | |---|---|---| | "Endpoint requires HTTPS" | Endpoint menggunakan HTTP biasa | Publikasikan HTTPS pada port 443. | | "Port endpoint tidak diizinkan" | Port selain 443 | Gunakan port HTTPS standar. | | "Alamat endpoint tidak diizinkan" | Nama menyelesaikan ke alamat privat, loopback, link-local, atau unique-local | Gunakan alamat publik. | | "Endpoint hanya boleh berisi protokol dan host" | URL memiliki jalur (path), kueri, atau informasi pengguna | Gunakan `https://host` saja. | | "Gagal me-resolve endpoint" | DNS tidak dapat diselesaikan dari server panel | Perbaiki DNS. | | "Failed to connect to Ceph" | Kesalahan firewall atau TLS | Uji dengan `curl` dari server panel. | | "Ceph returned HTTP 403 AccessDenied" | Kunci salah atau kapabilitas kurang | Periksa kunci dan jalankan ulang `radosgw-admin caps add`. | | "Invalid Ceph response" | Endpoint bukan API RGW Admin Ops | Arahkan ke RGW, bukan ke halaman web. | | "Uji koneksi harus berhasil sebelum mengaktifkan penjualan" | Anda mengaktifkan penjualan sebelum **Check** berhasil | Jalankan **Check**, lalu aktifkan penjualan. | | "Semua kunci baru untuk endpoint wajib diisi" | Endpoint diubah tanpa menyertakan kedua kunci | Masukkan kunci akses dan kunci rahasia secara bersamaan. | | "Backend sudah memiliki resource terlampaui; buat backend baru untuk mengubah zone atau endpoint" | Akun sudah ada pada backend ini | Buat backend baru. | | "Pilih master zone dengan layanan S3" | Zona bukan zona master atau tidak memiliki layanan S3 | Centang **Object Storage (S3)** pada zona. | | "Invalid region" | Region berisi karakter selain huruf, digit, `-`, dan `_` | Gunakan `default` atau nama zonegroup RGW Anda. | | "Ringkasan penggunaan Ceph tidak ada; tidak ditagih" | Log penggunaan dinonaktifkan | Aktifkan `rgw_enable_usage_log`. | --- # Kubernetes dan Private Cloud {#kubernetes-and-private-cloud} > **Where in the admin:** Kubernetes: Infrastructure › Cloud provider › CloudStack › Kubernetes (CKS) (`/infra/cloudstack?tab=k8s`), lalu Services › Kubernetes (Overview, Clusters, Versions, Policy). Private Cloud: Services › Private Cloud (Overview `/vpc`, VPC `/vpc/list`, Plans & pricing `/vpc/plans`). Aktifkan kedua modul di bawah System › Admin › License & updates. ## Fungsi {#what-it-does} - **Kubernetes.** Pelanggan membuat klaster Kubernetes terkelola di CloudStack Anda dengan CloudStack Kubernetes Service (CKS). Control plane gratis; pelanggan membayar untuk node **worker**. NexCMP membuat jaringan terpisah dan IP publik untuk setiap klaster serta memisahkan klaster tiap pelanggan. - **Private Cloud.** Pelanggan mendapatkan jaringan privat (CloudStack VPC) dengan router, subnet (tier), aturan firewall (network ACL), dan mesin virtual di dalamnya. Ini dijual berdasarkan **paket bandwidth** dengan kecepatan dedikasi tanpa meteran (misalnya 50, 100, 500 Mbps, 1 dan 3 Gbps). Setiap pelanggan dapat memiliki satu VPC secara default. Keduanya dibangun di atas [CloudStack](https://nexcmp.com/id/docs/infrastructure/cloudstack/) dan menggunakan API-nya melalui koneksi yang sama. ## Persyaratan {#requirements} ### Kubernetes {#kubernetes} | Item | Persyaratan | |---|---| | CloudStack | 4.23 (diuji). CKS harus **diaktifkan** (`cloud.kubernetes.service.enabled = true`). | | Akun | Akun **Domain Admin** di domain khusus, agar NexCMP dapat membuat project CloudStack untuk setiap pelanggan dan batas sumber daya di dalamnya. Lihat [CloudStack](https://nexcmp.com/id/docs/infrastructure/cloudstack/#create-a-dedicated-account-and-api-key). | | `endpoint.url` | Setelan global CloudStack harus mengarah ke API manajemen Anda, yang dapat dijangkau dari VM cluster. NexCMP menampilkan nilai dan hasil pemeriksaan endpoint. | | Versi | Setidaknya satu entri versi Kubernetes yang didukung beserta ISO binernya, dalam status **Enabled**. Versi yang sudah melewati batas akhir masa pakai (end of life) tidak dapat dijual. | | Offering control-plane | Service offering gratis dengan **tepat 2 vCPU, 2048 MB RAM dan batasan CPU** (`limitcpuuse = true`), yang terlihat oleh akun tersebut. Server menolak hal lainnya dengan `cp_offering_invalid`. | | Jaringan | Network offering terisolasi yang mendukung CKS dan dalam keadaan aktif. | | IPs | Alamat IPv4 publik gratis dalam rentang yang dapat dijual; setiap cluster menggunakan satu. | | Kapasitas | Setiap cluster memakan 2 hingga 4 GB RAM untuk control plane dan satu VM router kecil. Perhatikan tab kapasitas. | ### Private Cloud {#private-cloud} | Item | Persyaratan | |---|---| | CloudStack | 4.23 (diuji) dengan VPC diaktifkan. | | VPC offering | Satu VPC offering. Offering dual-stack juga memberikan IPv6 /64 ke setiap tier. | | Network offering tier | **Satu network offering per paket bandwidth**, dibuat untuk VPC, dengan **network rate** (Mbps) yang sama dengan paket tersebut, ditambah satu offering **terkunci** sebesar **1 Mbps** yang diterapkan saat VPC dikunci karena keterlambatan pembayaran. | | Akun | Akun khusus (disarankan Domain Admin). Jaringan VPC berada di dalam akun, bukan di dalam project. | | IPs | Alamat IPv4 publik gratis (setiap VPC menggunakan satu untuk NAT sumber). | | Ruang alamat | Setiap VPC menerima /16 dari `10.128.0.0/9`. Jaga agar rentang tersebut tetap tidak digunakan pada jaringan Anda sendiri. | | Bergantung pada | CloudStack terhubung; modul **Private Cloud**. | ## Siapkan infrastruktur {#prepare-the-infrastructure} ### Kubernetes: aktifkan CKS dan tambahkan versi {#kubernetes-enable-cks-and-add-versions} 1. Aktifkan service dan tetapkan endpoint, lalu mulai ulang server manajemen: ```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` dipanggil kembali oleh controller cluster, sehingga harus berupa alamat yang dapat dijangkau oleh VM cluster. 2. Bangun ISO biner Kubernetes untuk versi yang ingin Anda jual, dengan skrip `create-kubernetes-binaries-iso.sh` dari pohon sumber CloudStack, host di web server, dan daftarkan: ```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 ``` Tunggu hingga status ISO menjadi **Ready** dan versinya menjadi **Enabled**. 3. Buat control-plane offering, dibatasi untuk domain 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. Periksa apakah network offering CKS sudah diaktifkan: ```bash cmk list networkofferings state=Enabled forvpc=false filter=id,name ``` ### Private Cloud: buat offering {#private-cloud-create-the-offerings} Di UI CloudStack (**Service Offerings › Network Offerings › Add network offering**) atau dengan `cmk`: 1. Daftar apa yang Anda miliki: ```bash cmk list vpcofferings filter=id,name,state cmk list networkofferings forvpc=true filter=id,name,networkrate,state ``` 2. Gunakan VPC offering yang aktif (dual-stack jika Anda ingin IPv6). Jika Anda memerlukan yang baru, klon VPC offering default CloudStack dan aktifkan. 3. Untuk **setiap** paket bandwidth yang Anda jual, buat network offering **untuk VPC** (klon "isolated network offering for VPC networks" default) dan tetapkan **Network rate (Mb/s)** ke kecepatan paket tersebut: `50`, `100`, `500`, `1000`, `3000`. Aktifkan setiap offering. 4. Buat satu offering lagi dengan **network rate 1** (`VPC-LOCKED-1M`) untuk VPC yang dikunci: pelanggan masih dapat menjangkau server mereka melalui SSH, tetapi kecepatannya dibatasi. 5. Catat UUID dari setiap offering. NexCMP membutuhkannya pada bagian berikutnya. ::: warning ID offering yang disertakan tidak ada di cloud Anda Formulir Private Cloud telah terisi sebelumnya dengan UUID offering yang milik instalasi CloudStack lain. Ganti **setiap** bagian dengan milik Anda sendiri, atau pesanan VPC pertama akan gagal. ::: ## Hubungkan di NexCMP {#connect-in-nexcmp} ### Kubernetes {#kubernetes-1} 1. Buka **Infrastructure › Cloud provider › CloudStack** dan pilih tab **Kubernetes (CKS)**. Kartu di sebelah kanan **CKS status on CloudStack (read-only)** menampilkan `kubernetesserviceenabled`, `endpoint.url` dengan **Endpoint check**, offering jaringan CKS, pengaturan `cloud.kubernetes.*` serta daftar ISO dan versi. Klik **Recheck** setelah Anda memperbaiki sesuatu. 2. Di **Sales config**, pilih **Control plane Offering** (peringatan akan muncul jika tidak persis 2 vCPU / 2048 MB / batas CPU), tentukan **Max workers per cluster** (1 hingga 9: CKS mengizinkan 10 node termasuk node kontrol), aktifkan tombol **Enable CKS for this backend** dan klik **Save**. Tombol akan tetap nonaktif hingga offering dipilih. ![Tab Kubernetes (CKS) dengan offering control plane yang dipilih dan kartu status CKS](https://nexcmp.com/id/docs/images/infrastructure/kubernetes-and-private-cloud-01-cks.webp) 3. Buka **Services › Kubernetes › Versions** dan klik **Sync from CloudStack**. Aktifkan tombol **Available for new clusters** untuk versi yang Anda jual, tentukan versi default dan, jika Anda mau, tanggal **End of life (EOL)**. 4. Buka **Services › Kubernetes › Policy**. Di **Worker plans** tambahkan paket dengan **Plan code** (A-Z, 0-9, tanda hubung, maksimal 16 karakter). Tentukan **NVMe per worker (GB)**, **Min and max workers** serta batas cluster (cluster aktif per akun, pembuatan per 24 jam, batas global, operasi CKS bersamaan). Kemudian aktifkan tombol **Sell Kubernetes (CKS)**. Setidaknya satu paket harus tetap dijual. ![Kebijakan Kubernetes dengan paket worker dan tombol penjualan](https://nexcmp.com/id/docs/images/infrastructure/kubernetes-and-private-cloud-03-policy.webp) ### Private Cloud {#private-cloud-1} 1. Buka **Services › Private Cloud** (Ikhtisar). Di kartu kebijakan, ganti **VPC offering** dan **Locked offering tier** dengan UUID Anda sendiri. Periksa batas (VPC per akaun, tier, VM, dan aturan ACL per VPC, saldo dalam jam biaya paket yang diperlukan untuk membuat, perubahan paket per 24 jam, operasi bersamaan di mana 0 adalah penghentian darurat) serta server DNS. Klik **Save** (alasan akan diminta). ![Ikhtisar Private Cloud dengan kolom offering VPC dan offering terkunci](https://nexcmp.com/id/docs/images/infrastructure/kubernetes-and-private-cloud-04-vpc-policy.webp) 2. Buka **Services › Private Cloud › Plans & pricing**. Untuk setiap paket, klik **Edit** dan tentukan **VND price per month**, **On sale**, serta UUID **CloudStack tier offering** yang nilai bandwidth-nya setara dengan Mbps paket tersebut. Baris ini menampilkan biaya dan keuntungan pada penggunaan penuh, sehingga Anda dapat melihat paket mana yang berada di bawah biaya Anda. ![Dialog edit paket untuk paket bandwidth Private Cloud](https://nexcmp.com/id/docs/images/infrastructure/kubernetes-and-private-cloud-05-vpc-plan.webp) 3. Aktifkan tombol **Sell Private Cloud**. Untuk mencobanya terlebih dahulu, tambahkan ID akun pengujian ke **Beta accounts**: akun tersebut dapat menggunakan layanan saat tombol penjualan nonaktif. ## Verifikasi {#verify} 1. Kubernetes: kartu status menampilkan `kubernetesserviceenabled: true`, pemeriksaan endpoint yang baik, dan versi yang diaktifkan. Buat cluster uji coba satu worker sebagai pelanggan; cluster tersebut harus mencapai status berjalan dan `kubectl get nodes` harus menunjukkan status siap. Hapus setelahnya: jaringan dan IP akan dikembalikan ke pool. 2. Private Cloud: buat VPC dengan paket terkecil sebagai pelanggan uji coba. VPC menampilkan status aktif, tier mendapatkan subnet-nya, VM dalam tier dapat mengakses internet melalui router VPC, dan **Change plan** ke paket yang lebih besar akan diterapkan dalam sekitar 20 detik tanpa memutus koneksi. ## Batasan dan catatan {#limits-and-notes} - Kubernetes: worker ditagih seperti VM berdasarkan harga paket dan dihitung sebagai VM dalam batas VM. Sebuah cluster dapat memiliki maksimal 9 worker karena batasan CKS yang membatasi hingga 10 node. - Kubernetes: control plane, router, dan IP publik dari sebuah cluster digratiskan untuk pelanggan; Anda yang menanggung biayanya. - Private Cloud: semua paket bersifat **unmetered**. Harga dalam formulir adalah Dong Vietnam per bulan; kolom biaya menggunakan harga referensi yang bukan milik Anda, jadi gunakan angka Anda sendiri. - VPC yang terkunci dibatasi hingga 1 Mbps, tidak ditagih, dan tidak dihapus secara otomatis. - Private Cloud menggunakan satu router per VPC, bukan pasangan redundan. Jika host-nya gagal, CloudStack akan membangunnya kembali dalam beberapa menit. ## Pemecahan Masalah {#troubleshooting} | Gejala | Penyebab | Solusi | |---|---|---| | `cp_offering_invalid` / "Offering ini bukan 2 vCPU / 2048 MB / limitcpuuse" | Offering control-plane memiliki ukuran lain atau tidak memiliki batas CPU | Buat offering seperti pada langkah 3 dan pilih kembali. | | Tombol **Enable CKS** nonaktif | Tidak ada offering control-plane yang dipilih | Pilih salah satu terlebih dahulu. | | `kubernetesserviceenabled: false` | CKS nonaktif di CloudStack | Aktifkan dan mulai ulang management server. | | Pemeriksaan endpoint gagal | `endpoint.url` tidak dapat dijangkau dari VM kluster | Atur URL yang dapat dijangkau, mulai ulang management server, klik **Recheck**. | | "EOL: tidak dapat diaktifkan untuk dijual" | Tanggal akhir masa pakai versi telah lewat | Daftarkan versi yang lebih baru. | | "Tidak ada versi: klik Sync dari CloudStack" | Tidak ada versi Kubernetes yang terdaftar | Daftarkan versi dan lakukan sinkronisasi. | | "Backend CKS MATI: pelanggan tidak dapat membuat klaster meskipun flag penjualan diaktifkan" | Tombol penjualan aktif tetapi backend CKS nonaktif | Aktifkan CKS pada tab CloudStack. | | "Setidaknya 1 plan harus dijual" | Plan pekerja terakhir dihapus | Pertahankan setidaknya satu plan, atau nonaktifkan penjualan Kubernetes. | | Kluster macet saat dibuat | Kapasitas tidak mencukupi atau ISO tidak ada | Periksa tab kapasitas dan status ISO versi tersebut. | | VPC baru gagal pada langkah pertama | Offering VPC atau offering tier ID tidak valid | Ganti setiap UUID offering dengan yang ada di CloudStack Anda. | | "cs_offering_id harus berupa UUID" | ID offering bukan berupa UUID | Tempel ID dari `cmk list networkofferings`. | | Perubahan plan gagal | Offering tier baru tidak ada atau network rate salah | Periksa UUID offering dan network rate-nya. | --- # Plan dan harga {#plans-and-pricing} > **Di mana letaknya di admin:** Services › Virtual Machines › Plans & pricing (`/vm/catalog`), dengan tab Plan, Custom plan, Cycle, dan Offering CloudStack. Template berada di halaman terpisah Services › Virtual Machines › Template (`/vm/templates`). ## Fungsi {#what-it-does} Sebuah **plan** adalah ukuran yang dapat dibeli pelanggan: vCPU, RAM, disk root, dan harga, di suatu zona, dari satu sumber (CloudStack atau kluster Proxmox VE). Pelanggan memilih plan, sistem operasi, dan **siklus penagihan** (per jam, bulanan, atau jangka waktu prabayar yang lebih panjang). Plan dijual di portal pelanggan, melalui API, dan di situs reseller. ## Persyaratan {#requirements} | Item | Persyaratan | |---|---| | Source | CloudStack terhubung (plan mengarah ke service offering CloudStack) atau kluster Proxmox VE yang ditautkan ke zona. Lihat [CloudStack](https://nexcmp.com/id/docs/infrastructure/cloudstack/) dan [Proxmox VE](https://nexcmp.com/id/docs/infrastructure/proxmox/). | | Zone | Zona yang menjual mesin virtual. Lihat [Zones](https://nexcmp.com/id/docs/infrastructure/zones/). | | Templat | Setidaknya satu template yang diaktifkan dan siap. Lihat [OS templates](https://nexcmp.com/id/docs/infrastructure/templates/). | | Nilai tukar | Hanya jika Anda memasukkan harga dalam VND. Lihat [Currency and exchange rates](https://nexcmp.com/id/docs/catalog/currency-and-exchange-rates/). | | Izin | Seorang administrator; setiap perubahan harga memerlukan alasan. | ## Siapkan infrastruktur {#prepare-the-infrastructure} - **CloudStack:** buat offering layanan yang ingin Anda jual (publik, atau dibagikan dengan domain NexCMP). Sebuah plan mengarah ke satu offering. Tab **Offering CloudStack** mencantumkan offering dan disk offering secara langsung dari CloudStack (di-cache selama 60 detik). Ketika tabel plan kosong, worker akan membuat enam plan dari offering asli Anda secara otomatis. - **Proxmox VE:** tidak ada di Proxmox; sebuah plan membawa CPU, RAM, dan disk-nya sendiri. Disk tidak boleh lebih kecil dari disk template. ## Hubungkan di NexCMP {#connect-in-nexcmp} ### Cara penyimpanan harga {#how-prices-are-stored} NexCMP menyimpan setiap harga sebagai **mikro-dolar per jam** (µ$/hour; 1 µ$ bernilai 1/1,000,000 USD). Anda dapat mengetikkan harga dalam unit yang Anda inginkan dan formulir akan mengonversinya: | Unit | Catatan | |---|---| | USD / jam (6 desimal) | Disimpan apa adanya. | | USD / bulan | Dibagi dengan pengaturan jam per bulan (730). | | VND / bulan | Dikonversi sekali pada nilai tukar saat ini, kemudian disimpan dalam µ$/jam. Hanya muncul ketika nilai tukar tersedia. | Formulir menampilkan hasilnya: µ$/jam, USD/jam, harga bulanan, dan setiap siklus penagihan. **Harga bulanan = harga per jam × 730**; siklus yang lebih panjang adalah **harga bulanan × bulan × (1 − diskon)**. ### Menambahkan plan {#add-a-plan} 1. Buka **Services › Virtual Machines › Plans & pricing** dan klik **Add plan**. 2. Isi formulir berikut: | Kolom | Contoh nilai | |---|---| | Nama plan | `VM-2-4` | | Slug | kosong: dibuat dari nama | | Zone | zona default Anda | | Sumber infrastruktur | kosong untuk CloudStack, atau kluster Proxmox | | Offering layanan CloudStack (langsung) | pilih salah satu (hanya ditampilkan untuk CloudStack) | | CPU (inti), RAM (MB), Disk root (GB) | `2`, `4096`, `40` | | Disk offering | opsional, untuk ukuran root kustom | | Masukkan harga berdasarkan / Harga | `USD / month`, `12` | | Deskripsi singkat | `2 vCPU, 4 GB RAM, 40 GB NVMe` | | Urutan | `10` | | Aktif | Aktif: pelanggan dapat membeli | | Visibilitas | Terlihat di katalog | | Alasan perubahan harga | `initial price` | 3. Klik **OK**. Plan akan muncul di dalam tabel beserta harga per jam dan bulanan, serta kolom untuk setiap siklus yang diaktifkan. ![Tabel plan dengan harga per jam, bulanan, dan per siklus](https://nexcmp.com/id/docs/images/catalog/plans-02-list.webp) ### Siklus penagihan {#billing-cycles} Buka tab **Cycle** untuk mengatur siklus mana yang dapat dipilih oleh pelanggan beserta diskonnya. | Siklus | Default | Catatan | |---|---|---| | Per jam | selalu aktif | Ditagih jam demi jam. | | Bulanan | aktif, 0% | | | 1 tahun | aktif, 10% | | | 2 tahun | aktif, 15% | | | 3 tahun | aktif, 20% | | Anda dapat mengubah nama siklus, mengubah diskonnya (0 hingga 90%) dan mengaktifkan atau menonaktifkannya. Perubahan berlaku untuk VM yang dibeli atau diperpanjang **setelah** Anda menyimpan; VM yang berjalan mempertahankan harga terkunci mereka. ![Tab siklus dengan diskon per siklus penagihan](https://nexcmp.com/id/docs/images/catalog/plans-03-cycles.webp) ### Tetapkan plan dasar dan turunkan plan lainnya {#set-a-base-plan-and-derive-the-others} **Tetapkan plan dasar + turunkan plan lain** menghitung ulang harga seluruh tabel dari satu harga. Pilih plan dasar dan harganya, lalu pilih apakah akan mempertahankan **rasio harga saat ini** antar plan atau menghitung dari **harga komponen** (µ$/jam per vCPU, per GB RAM, dan per GB NVMe, dengan diskon bundel opsional 0 hingga 50%). Tabel pratinjau menunjukkan harga lama dan baru sebelum ada yang disimpan. Klik **Apply**, dan berikan alasan. Saat Anda menerapkan harga baru: VM **per jam** yang berjalan mendapatkan harga yang **lebih rendah** mulai jam penagihan berikutnya, dan VM prabayar mendapatkannya saat perpanjangan. Jika harga **naik**, VM yang berjalan tetap mempertahankan harga lamanya. ### Plan kustom {#custom-plans} Tab **Custom plan** memungkinkan pelanggan memilih ukuran vCPU, RAM, dan NVMe mereka sendiri. Atur harga satuan per jam untuk satu vCPU, satu GB RAM, dan satu GB NVMe (biarkan kosong untuk menurunkan dari diskon persentase), nilai minimum, maksimum, dan langkah untuk masing-masing, serta siklus penagihan apa saja yang berlaku. Plan **kustom** seharusnya berharga lebih tinggi daripada plan tetap dengan ukuran yang sama, jika tidak, pelanggan akan melewatkan plan tetap tersebut; halaman ini menandai baris di mana plan kustom lebih murah. Aktifkan **Enable custom plans for customers** untuk menjualnya; dalam posisi mati, portal akan menampilkan "Coming soon". Setiap VM kustom mendapatkan baris plan tersembunyinya sendiri; baris tersebut tidak dapat diedit atau dihapus selama VM tersebut masih ada. ### Ubah, sembunyikan, kloning, hapus {#change-hide-clone-delete} | Action | Fungsi | |---|---| | **Edit** | Mengubah nama, deskripsi, urutan, harga, status aktif, dan visibilitas. | | **On/Off** | **Off**: pelanggan tidak dapat membeli; VM yang berjalan tidak terpengaruh. | | **Hide / Show** | Plan tersembunyi tidak ada di katalog tetapi VM yang sudah ada tetap menggunakannya dan administrator dapat menetapkannya. | | **Clone** | Membuat plan baru di zone yang sama dengan sumber, ukuran, atau harga baru, dengan opsi menyembunyikan plan lama. Untuk menjual konfigurasi yang sama dari CloudStack dan Proxmox, kloning plan tersebut dan pilih sumber lainnya. | | **Move up/down** | Mengubah urutan. | | **Delete** | Menghapus plan dari penjualan dan dari tabel. VM yang sudah menggunakannya akan tetap mempertahankannya. | ::: warning Plan yang sedang digunakan terkunci Setelah suatu paket memiliki VM, **zone, offering, CPU, RAM, disk and source** miliknya akan dikunci agar VM yang berjalan tidak berubah tiba-tiba. Gunakan **Clone** untuk membuat konfigurasi baru; paket lama tetap mempertahankan VM-nya. ::: ## Verifikasi {#verify} 1. Paket muncul di tabel dengan harga per jam dan bulanan yang sesuai. 2. Di portal pelanggan, mulai pemesanan: zone menawarkan paket tersebut dan harga siklus sesuai dengan tab **Cycle**. 3. Lakukan pesanan uji coba, periksa pemotongan saldo wallet terhadap harga yang ditampilkan, lalu hapus VM tersebut. ## Batasan dan catatan {#limits-and-notes} - Satu paket terikat pada **satu** zone dan **satu** source. - Harga disimpan dalam µ$/hour; harga VND yang ditampilkan merupakan turunan dan dibulatkan berdasarkan **VND rounding step** (lihat halaman mata uang). Wallet selalu dalam USD. - Reseller mendapatkan harga grosir dan ritel yang diturunkan dari harga jual resmi; perubahan harga pada paket yang sudah ada tidak menyalin harga kustom reseller ke kloning yang konfigurasinya telah Anda ubah. - Batas min, maks, dan step pada paket kustom diverifikasi terhadap batasan CloudStack sendiri; disk maksimum di atas `storage.max.volume.size` CloudStack menyebabkan deploy gagal dan dana dikembalikan. ## Pemecahan Masalah {#troubleshooting} | Gejala | Penyebab | Solusi | |---|---|---| | "Nama paket wajib diisi" / "Service offering wajib diisi" | Missing field | Isi nama; untuk CloudStack pilih offering. | | "CPU/RAM/disk harus > 0" | Ukuran kosong atau nol | Enter all three. | | "Harga tidak valid (µ$/hr harus 1 … 100,000,000)" | Harga di luar rentang | Periksa satuan dan jumlahnya. | | "Perubahan harga memerlukan alasan" | Alasan kosong saat mengedit | Ketik alasan (3 karakter atau lebih). | | "Offering "X" adalah 4c/8192 tetapi paket menentukan 2c/4096 - CloudStack akan memprovisi berdasarkan offering. Simpan?" | Angka pada plan berbeda dari offering | Samakan keduanya, atau konfirmasi untuk mempertahankan ukuran CloudStack. | | "Gagal mengambil offering dari CloudStack" | Koneksi terputus atau API key tidak memiliki izin | See [CloudStack](https://nexcmp.com/id/docs/infrastructure/cloudstack/). | | "Template belum siap di CloudStack - deployment akan gagal. Tetap aktifkan?" | Anda mengaktifkan template yang belum selesai | Tunggu hingga template siap. | | Plan tidak dapat diedit ("has VMs - locked") | VM sedang menggunakan plan tersebut | Clone it. | | Plan tidak muncul untuk pelanggan | Mati, tersembunyi, atau zone belum siap | Periksa **Active**, **Visibility**, dan tag zone. Lihat [Zones](https://nexcmp.com/id/docs/infrastructure/zones/). | | "Pilih setidaknya 1 siklus penagihan" | Tidak ada siklus yang dicentang untuk custom plan | Centang setidaknya satu. | | "Diskon bundel harus 0–50%" | Out of range | Use 0 to 50. | | Opsi harga VND tidak ada | Belum ada kurs | Perbarui kurs terlebih dahulu. | --- # Kuota bandwidth dan add-on {#bandwidth-quotas-and-add-ons} > **Lokasi di admin:** Services › Bandwidth: Summary (`/bandwidth`), Add-on (`/bandwidth/addons`), serta Quotas, pricing & policy (`/bandwidth/policy`). Sakelar modul ada di System › Admin › License & updates. ## Fungsi {#what-it-does} Bandwidth memberikan **kuota** trafik bulanan untuk setiap layanan terukur. NexCMP memantau penggunaan, memperingatkan pelanggan di 80% dan 100%, serta bertindak sesuai **kebijakan overage** Anda saat kuota terlampaui. Pelanggan dapat membeli **add-on** terabyte tambahan dari wallet mereka; Anda juga dapat memberikan add-on secara gratis. | Layanan | Kuota | |---|---| | Virtual Machines | Per VM per bulan (default 2048 GB, yaitu 2 TB) | | Kubernetes | Kuota VM dikalikan dengan jumlah worker | | Object Storage | Trafik unduhan per pelanggan per bulan (default 100 GB); selebihnya berlaku harga pay-as-you-go normal | | VPN | Mengikuti kuota dari plan-nya; tingkatkan bandwidth di halaman VPN | | Private Cloud | **Unmetered** | ## Persyaratan {#requirements} | Item | Persyaratan | |---|---| | Modul | **Bandwidth** aktif secara default. Nonaktifkan di bawah License & updates untuk menyembunyikannya. | | Sumber pengukuran | Dengan sumber default, **CloudStack VM statistics**. Jaga agar pengumpulan statistik VM tetap aktif di CloudStack; retensi default 720 menit sudah cukup. | | Proxmox VE | VM pada Proxmox VE **tidak diukur**. | | Nilai tukar | Harga add-on dimasukkan dalam VND. Lihat [Currency and exchange rates](https://nexcmp.com/id/docs/catalog/currency-and-exchange-rates/). | | Bergantung pada | [CloudStack](https://nexcmp.com/id/docs/infrastructure/cloudstack/) untuk lalu lintas VM dan Kubernetes, [S3](https://nexcmp.com/id/docs/infrastructure/s3/) untuk unduhan penyimpanan. | ## Siapkan infrastruktur {#prepare-the-infrastructure} Tidak diperlukan selain CloudStack yang terhubung. NexCMP membaca `listVirtualMachinesUsageHistory` untuk semua VM akun dalam satu panggilan, setiap 5 menit, dalam jendela waktu maksimal dua hari. Setiap sampel mencakup satu menit dan **ditambahkan**. Sampel diambil tiga menit di masa lalu agar memiliki waktu untuk tiba. Kesenjangan yang lebih lama dari retensi CloudStack (sekitar 12 jam) akan dilewati dan dicatat. ::: info Arti angka-angka tersebut Penggunaan dihitung pada antarmuka jaringan setiap VM, sehingga mencakup lalu lintas antar-VM, bukan hanya lalu lintas ke Internet. Jumlah ini bisa sedikit lebih tinggi daripada yang dihitung oleh router tepi. ::: ## Hubungkan di NexCMP {#connect-in-nexcmp} 1. Buka **Services › Bandwidth › Quotas, pricing & policy**. 2. Atur nilai dan klik **Save**; alasan akan diminta dan dicatat. Worker menerapkan perubahan dalam waktu sekitar 30 detik. | Kolom | Default | Arti | |---|---|---| | Aktifkan Bandwidth (menu pelanggan dan pembelian add-on) | aktif | Tombol untuk sisi penjualan modul. | | VM, GB/bulan (Kubernetes = nilai ini × worker) | 2048 | Kuota per VM per periode. | | S3, unduhan GB/bulan per pelanggan | 100 | Di luar itu, berlaku pay-as-you-go S3 normal. | | Arah kuota (VM, Kubernetes) | Masuk + keluar | Atau **Outbound only**. | | Harga +1 TB (VND) | 100,000 | Dikonversi ke sen pada kurs kuotasi. | | Maks per pembelian (TB) | 50 | | | Kebijakan kelebihan batas | suspend | **notify**, **throttle** atau **suspend** (di bawah). | | Terapkan penangguhan aktual dari | tanggal migrasi + 24 jam | Sebelum tanggal ini tidak ada yang ditangguhkan; pelanggan hanya diperingatkan. | | Batas tingkat throttle (Mbps) | | Hanya digunakan oleh throttle. | ![Kebijakan bandwidth: kuota default, harga add-on, dan kebijakan overage](https://nexcmp.com/id/docs/images/catalog/bandwidth-01-policy.webp) ### Kebijakan kelebihan batas {#overage-policies} | Kebijakan | Apa yang terjadi ketika layanan melewati 100% | |---|---| | **notify** | Pelanggan diberi tahu. Tidak ada yang lain. | | **throttle** | Seperti notify untuk saat ini: pembatas kecepatan belum terhubung dalam rilis ini. | | **suspend** (default) | VM, kluster, atau akun S3 ditangguhkan hingga pelanggan membeli add-on atau periode berikutnya dimulai. Hanya berlaku sejak tanggal **suspend-from**. | Peringatan 80% dan 100% (lonceng dan email) selalu berjalan, sekali per ambang batas, periode, dan layanan. Jika Anda membuka kunci layanan yang ditangguhkan karena bandwidth sementara masih melebihi kuota, pemeriksaan berikutnya (dalam waktu 5 menit) akan menangguhkannya lagi. Agar tetap berjalan, **berikan add-on**. ### Pantau penggunaan dan berikan add-on {#watch-usage-and-grant-add-ons} Buka **Services › Bandwidth › Summary**. Di sini tercantum setiap layanan beserta penggunaannya pada periode berjalan, kuota termasuk add-on, sisa kuota, serta batas 80% dan 100%. Kotak KPI menampilkan jumlah layanan, add-on yang terjual dalam 30 hari terakhir, serta status kolektor (berjalan, kursor). Tabel **Daily** menampilkan periode berjalan hari demi hari. ![Ringkasan Bandwidth dengan status kolektor dan penggunaan per layanan](https://nexcmp.com/id/docs/images/catalog/bandwidth-02-summary.webp) Untuk memberikan kelonggaran kepada pelanggan, gunakan **Grant** pada layanan (add-on berupa terabita penuh tanpa biaya). Buka **Add-on** untuk melihat riwayat pembelian dan pemberian, dari yang terbaru, beserta filter jenis. ![Riwayat add-on yang menampilkan pembelian dan pemberian gratis](https://nexcmp.com/id/docs/images/catalog/bandwidth-03-addons.webp) ### Yang dilihat pelanggan {#what-customers-see} Portal pelanggan menyediakan menu **Bandwidth** berisi penggunaan, sisa kuota, serta tindakan **buy +1 TB** yang dibayar dari dompet (hingga batas maksimum per pembelian). Add-on berlaku untuk periode berjalan. ## Verifikasi {#verify} 1. Kolektor pada **Summary** berjalan dan kursornya bergerak maju setiap beberapa menit. 2. VM dengan trafik akan menampilkan penggunaan setelah sekitar 10 hingga 15 menit. 3. Untuk melihat peringatan, kurangi kuota VM menjadi beberapa GB pada instalasi **uji coba** dan hasilkan sedikit trafik. Jangan lakukan ini pada sistem produksi: kuota berlaku untuk setiap VM. ## Batasan dan catatan {#limits-and-notes} - Penggunaan dihitung per periode (satu bulan). Add-on dan kuota berlaku untuk periode berjalan. - "Enforce actual suspend from" melindungi Anda agar tidak menangguhkan pelanggan tepat saat modul pertama kali diaktifkan. - Kebijakan throttle hanya memberikan pemberitahuan pada rilis ini. - Perubahan kuota berlaku untuk setiap situs, termasuk situs reseller. Harga add-on eceran dan grosir reseller mengikuti diskon atau markup mereka. - Bandwidth untuk **Dedicated servers** adalah hal terpisah; lihat [Dedicated servers](https://nexcmp.com/id/docs/infrastructure/dedicated/). ## Pemecahan Masalah {#troubleshooting} | Gejala | Penyebab | Solusi | |---|---|---| | Penggunaan tetap nol untuk VM yang berjalan | Worker dihentikan, CloudStack terputus, atau statistik VM dinonaktifkan | Periksa `sudo nexcmp status` dan **Test connection** di [CloudStack](https://nexcmp.com/id/docs/infrastructure/cloudstack/); aktifkan statistik VM CloudStack. | | Penggunaan memiliki jeda kosong | Retensi CloudStack terlampaui, atau worker mati selama lebih dari sekitar 12 jam | Tidak dapat dipulihkan; celah tersebut terekam. | | Penggunaan sedikit lebih tinggi dari perkiraan | Trafik antar-VM dan trafik antarmuka lainnya ikut dihitung | Wajar; jelaskan hal ini kepada pelanggan. | | Layanan yang ditangguhkan kembali berstatus ditangguhkan setelah Anda membuka kunci | Layanan tersebut masih melebihi kuota | Berikan add-on atau tingkatkan kuota. | | Tidak ada yang ditangguhkan meskipun kebijakan diatur ke **suspend** | Tanggal mulai penangguhan berada di masa mendatang | Atur ke sekarang (halaman menampilkan "ACTIVE" saat berlaku). | | "bw_over_policy harus berupa notify, throttle, atau suspend" | Kebijakan tidak valid dikirim melalui API | Gunakan salah satu dari ketiga nilai tersebut. | | VM Proxmox tidak menampilkan penggunaan | VM tersebut tidak diukur | Wajar. | | Pelanggan tidak dapat membeli add-on | Bandwidth dimatikan, atau dompet kosong | Periksa tombol pengaktifan dan dompet. | --- # Mata uang dan nilai tukar {#currency-and-exchange-rates} > **Di panel admin:** Finance › Payment channels › Exchange rates (`/payments/fx`) untuk kurs. System › Settings › Brand (`/settings/branding`) untuk tombol **Site currency**. ## Fungsi {#what-it-does} NexCMP menyimpan dompet dan faktur dalam USD. Harga paket VM disimpan sebagai mikro-dolar per jam. Mata uang tampilan memungkinkan pelanggan melihat jumlah USD dalam mata uang mereka sendiri berdasarkan kurs yang dipublikasikan; mata uang tampilan tidak mengubah saldo dompet. Beberapa layanan menerima harga yang dimasukkan dalam VND, termasuk add-on bandwidth, S3, Private Cloud, dan paket Bare Metal yang sudah ada yang mempertahankan harga VND. Transfer bank melalui Sepay dibayarkan dalam VND. Kurs **dipublikasikan oleh administrator**. Tidak ada pembaruan otomatis, sehingga kurs yang Anda simpan akan tetap sama persis hingga Anda menekan tombol pembaruan. ## Persyaratan {#requirements} | Item | Persyaratan | |---|---| | Akses internet | Server panel harus dapat menjangkau `open.er-api.com` (untuk USD/VND) dan `api.frankfurter.dev` (untuk mata uang lainnya) saat Anda menekan **Update exchange rates**. | | Izin | Administrator untuk perubahan; setiap perubahan mewajibkan pengisian alasan. | | Bergantung pada | Tidak ada. [Plans](https://nexcmp.com/id/docs/catalog/plans/), [Bandwidth](https://nexcmp.com/id/docs/catalog/bandwidth/), [S3](https://nexcmp.com/id/docs/infrastructure/s3/), dan transfer bank VND menggunakan kurs tersebut. | ## Siapkan infrastruktur {#prepare-the-infrastructure} Tidak wajib. Jika server Anda memfilter lalu lintas keluar, izinkan HTTPS ke dua layanan di atas. ## Hubungkan di NexCMP {#connect-in-nexcmp} ### 1. Pilih mata uang situs {#_1-choose-the-site-currency} Buka **System › Settings › Brand** dan atur **Site currency**: | Pilihan | Yang dilihat pelanggan | |---|---| | **Language-based (auto)** (bawaan pada instalasi baru) | Portal memilih mata uang tampilan berdasarkan bahasa (tabel di bawah). Pelanggan dapat memilih USD sebagai gantinya. | | **USD** | Harga dan saldo hanya dalam USD. Tanpa tombol pilihan mata uang dan tanpa jumlah yang dikonversi. | | **VND** | Pengaturan lawas; mengikuti aturan tampilan berbasis bahasa yang sama seperti Auto. | Simpan. Halaman pelanggan akan diperbarui dalam waktu sekitar satu menit. Saat situs mengikuti bahasa pelanggan: | Bahasa | Mata uang tampilan | |---|---| | Bahasa Inggris | USD | | Bahasa Vietnam | VND | | Bahasa Mandarin (sederhana / tradisional) | CNY / TWD | | Bahasa Jepang, Korea | JPY, KRW | | Bahasa Prancis, Jerman, Spanyol, Italia | EUR | | Bahasa Portugis, Rusia | BRL, RUB | | Bahasa Arab, Hindi | SAR, INR | | Bahasa Indonesia, Thai | IDR, THB | Mata uang yang kursnya belum dipublikasikan tidak akan tersedia: portal beralih kembali ke USD. ### 2. Publikasikan kurs {#_2-publish-the-rates} 1. Buka **Finance › Payment channels › Exchange rates**. 2. Kartu **Currency by language** mencantumkan 11 mata uang tampilan beserta kurs per USD, sumber (Frankfurter), dan waktu pembaruan terakhir. Klik **Update exchange rates**. Tombol ini melakukan dua hal sekaligus dalam satu langkah: membaca tabel pasar publik untuk **USD/VND** dan membaca 11 nilai tukar lainnya. Keduanya diperiksa sebelum salah satunya disimpan. Jika salah satu gagal, tidak ada yang diubah dan kurs sebelumnya tetap berlaku. 3. Kartu **Active exchange rate** menampilkan kurs USD/VND yang berlaku, label sumbernya (pasar publik atau tetap), margin, dan angka referensi pasar beserta stempel waktunya. 4. Kartu **Config** (simpan dengan alasan): | Kolom | Arti | Rentang | |---|---|---| | Margin (bp, 100 = 1 %) | Ditambahkan di atas kurs referensi pasar. Kurs efektif adalah kurs referensi ditambah margin, dibulatkan ke atas. | 0 hingga 1000 | | Kurs tetap (VND per USD, 0 = ikuti pasar) | Kurs yang Anda tentukan sendiri. Ini menggantikan angka pasar. | 0 atau 15,000 hingga 50,000 | | Ambang batas lonjakan (bp) | Kurs pasar baru yang berbeda lebih dari batas ini dari kurs saat ini akan **ditahan** hingga Anda mengonfirmasinya. | 50 hingga 2000 (default 500) | | Langkah pembulatan VND | Membulatkan harga VND dan jumlah transfer bank. | 1, 100, 1,000 (default), atau 10,000 | 5. Jika kurs pasar baru melonjak lebih dari ambang batas, kartu **Pending exchange rate** akan muncul dan kurs **tidak diterapkan**. Periksa terhadap referensi pilihan Anda dan klik **Apply this rate**. Kurs pasar di luar 15,000 hingga 50,000 VND per USD akan ditolak karena dianggap tidak wajar. Pembaruan manual dibatasi satu permintaan per lima menit, sehingga tombol mungkin meminta Anda untuk menunggu. 6. Tabel **Exchange rate history** mencantumkan setiap kurs yang diambil atau dikonfirmasi beserta waktunya, kurs efektif, referensi pasar, sumber, status penerapan, pelaksana, dan catatan (lonjakan yang ditahan ditandai **held**). ## Cara penggunaan kurs {#how-a-rate-is-used} | Lokasi | Aturan | |---|---| | Dompet dan faktur | Sen USD. Kurs tidak pernah mengubah saldo. | | Paket VM yang dimasukkan dalam VND | Dikonversi **satu kali** pada kurs yang berlaku saat Anda menyimpan, lalu disimpan dalam USD. Perubahan kurs berikutnya tidak mengubah harga paket VM tersebut. | | Transfer bank melalui SePay | Pelanggan membayar `ceil(USD × rate)`, dibulatkan ke atas ke langkah pembulatan. SePay **dibatasi** hingga kurs USD/VND tersedia. | | Paket Bare Metal | Instalasi baru menggunakan USD secara langsung. Paket VND yang sudah ada tetap mempertahankan unit harganya dan memerlukan kurs saat penagihan; lihat [Dedicated servers](https://nexcmp.com/id/docs/infrastructure/dedicated/). | | Pembayaran internasional lain yang dimasukkan dalam VND | Dibulatkan ke sen terdekat. | | Tampilan di portal | USD dikalikan dengan kurs mata uang tampilan yang dipublikasikan, diformat untuk bahasa tersebut. | ## Verifikasi {#verify} 1. **Active exchange rate** menampilkan nilai USD/VND dengan waktu "fetched" terbaru. 2. Grid **Currency by language** menampilkan kurs yang tidak kosong. 3. Di portal pelanggan, alihkan bahasa ke bahasa Vietnam (mata uang situs Auto): harga ditampilkan dalam dong; alihkan ke bahasa Jepang: yen. Dengan mata uang situs USD, hanya dolar yang ditampilkan. 4. Pada formulir paket (Plans & pricing), daftar **Enter price by** menyediakan opsi **VND / month**. ## Batasan dan catatan {#limits-and-notes} - Tidak ada pembaruan otomatis. Tekan **Update exchange rates** saat Anda menginginkan kurs baru, dan atur pengingat jika kurs penting bagi Anda. - Kurs pasar publik digunakan untuk USD/VND; ini merupakan kurs acuan, bukan kuotasi beli atau jual bank. Mata uang tampilan lainnya berasal dari Frankfurter; tanggal yang lebih lama dari 14 hari atau tabel yang tidak lengkap akan ditolak. - Margin dan tarif tetap hanya memengaruhi USD/VND. Ke-11 mata uang tampilan tidak memiliki margin. - Setiap bahasa pelanggan memiliki satu mata uang. Mengubah bahasa akan mereset ke mata uang bahasa tersebut kecuali pelanggan memilih USD untuk bahasa yang sama. - Situs reseller mengikuti tarif yang sama. ## Pemecahan Masalah {#troubleshooting} | Gejala | Penyebab | Solusi | |---|---|---| | "Nilai tukar baru menyimpang melampaui batas — DITAHAN, memerlukan konfirmasi manual" | Lonjakan lebih besar daripada ambang batas | Verifikasi dan klik **Apply this rate**, atau ubah ambang batas. | | "Server menolak nilai tukar baru" | Angka pasar berada di luar 15,000 hingga 50,000 atau formatnya salah | Tunggu dan coba lagi, atau tetapkan tarif tetap. | | Pembaruan meminta Anda menunggu sebelum mencoba lagi | Pembaruan terlalu sering | Tunggu dan coba lagi. | | "tidak dapat mengambil nilai tukar: …" | Server panel tidak dapat menjangkau layanan tarif | Izinkan HTTPS keluar dan coba lagi. | | Tag **Sepay blocked** | Belum ada tarif USD/VND yang dipublikasikan | Tekan **Update exchange rates** atau tetapkan tarif tetap. | | Mata uang tidak ada di portal | Tarifnya tidak ada | Tekan **Update exchange rates**. | | Pelanggan melihat harga hanya dalam USD | Mata uang situs adalah USD, atau tarif tidak ada | Atur **Site currency** ke Auto dan publikasikan kurs. | | "Tabel nilai tukar Fx tidak lengkap; nilai tukar sebelumnya dipertahankan" | Frankfurter mengembalikan kurang dari 11 mata uang | Coba lagi nanti; tidak ada yang diubah. | | Opsi VND tidak ada di formulir paket | Tidak ada tarif USD/VND | Publikasikan tarif terlebih dahulu. | --- # Saluran pembayaran {#payment-channels} > **Di mana di panel admin:** Finance › Payment channels (`/payments`). Switch dan biaya: Finance › Payment channels › Fees & limits (`/payments/fees`). NexCMP menggunakan **dompet USD prabayar**. Pelanggan menambahkan uang ke dompet melalui saluran pembayaran; setiap layanan kemudian dibayar dari dompet. Saluran hanya ditampilkan kepada pelanggan bila **diaktifkan** dan **dikonfigurasi**. ## Fungsi {#what-it-does} Saluran pembayaran menghubungkan akun pembayaran Anda (Stripe, PayPal, Binance, bank Vietnam) ke dompet pelanggan. Pembayaran yang dikonfirmasi menjadi tepat satu kredit dompet — setiap kredit dikunci oleh ID pembayaran gateway, sehingga webhook berulang tidak akan pernah menambahkan uang dua kali. Gunakan halaman ini untuk melihat saluran mana yang siap, kinerjanya selama 30 hari terakhir, dan mana yang memerlukan perhatian. ## Persyaratan {#requirements} | Item | Persyaratan | |---|---| | Alamat HTTPS publik | Gateway mengirim webhook ke `https:///v1/billing/...`, sehingga panel Anda harus dapat dijangkau dari Internet melalui TLS yang valid (lihat [DNS and Cloudflare](https://nexcmp.com/id/docs/getting-started/dns-and-cloudflare/)). | | Akun | Akun Anda sendiri dengan setiap penyedia yang ingin Anda gunakan. Kredensial dimasukkan di admin dan tidak pernah ditampilkan lagi (hanya 4 karakter terakhir). | | Peran admin | Sebuah akun administrator. | | Dependensi | Tidak ada. Saluran bank VN memerlukan tambahan [nilai tukar](https://nexcmp.com/id/docs/catalog/currency-and-exchange-rates/). | ## Saluran pembayaran {#the-channels} | Saluran | Tampilan pelanggan | Diatur di | Artikel | |---|---|---|---| | Kartu (Stripe) | Formulir kartu, kartu tersimpan | Payment channels › Stripe | [Stripe](https://nexcmp.com/id/docs/billing/stripe/) | | Apple Pay, Google Pay, Link | Tombol dompet (Stripe Express Checkout) | Stripe, ditambah pendaftaran domain | [Stripe](https://nexcmp.com/id/docs/billing/stripe/#apple-pay-google-pay-and-link) | | Alipay | Alihkan ke Alipay (dikenakan biaya dalam JPY oleh Stripe) | Stripe, ditambah Biaya & batas | [Stripe](https://nexcmp.com/id/docs/billing/stripe/#alipay) | | PayPal | Tombol PayPal, akun PayPal tersimpan | Payment channels › PayPal | [PayPal](https://nexcmp.com/id/docs/billing/paypal/) | | USDT | Alamat deposit dan jumlah pasti | Payment channels › USDT | [USDT](https://nexcmp.com/id/docs/billing/usdt/) | | Transfer bank VN | Kode QR dan detail transfer (antarmuka bahasa Vietnam saja) | Payment channels › VN bank transfer | [Transfer bank (Vietnam)](https://nexcmp.com/id/docs/billing/bank-transfer-vn/) | ## Siapkan infrastruktur {#prepare-the-infrastructure} Tidak diperlukan. Semuanya dikonfigurasi di admin; tidak ada yang perlu diinstal di server. ## Hubungkan di NexCMP {#connect-in-nexcmp} 1. Buka **Finance › Payment channels** (`/payments`). Tabel ikhtisar mencantumkan setiap saluran beserta statusnya. 2. Buka tab masing-masing saluran (**Stripe**, **PayPal**, **USDT**, **VN bank transfer**) dan ikuti artikelnya. Setiap tab diakhiri dengan tombol **Save** dan, jika tersedia, tombol **Test**. 3. Buka **Fees & limits** (`/payments/fees`), temukan kartu **Payment gateways & fees (wallet top-up)**, aktifkan saluran dengan sakelarnya, lalu klik **Save channels & fees**. ![Ikhtisar saluran pembayaran yang mencantumkan gateway beserta status aktif, terkonfigurasi, dan statistik 30 hari](https://nexcmp.com/id/docs/images/billing/payment-channels-01-overview.webp) ![Halaman biaya dan batas dengan tombol sakelar saluran dan kolom biaya](https://nexcmp.com/id/docs/images/billing/payment-channels-02-fees.webp) ### Sakelar dan biaya (Fees & limits) {#switches-and-fees-fees-limits} | Pengaturan | Default | Arti | |---|---|---| | Kartu (Stripe) | On | Formulir kartu pada layar deposit. Disembunyikan hingga Stripe memiliki kunci rahasia. | | Apple Pay, Google Pay, Link | On | Tombol dompet. Tombol ini hanya muncul saat domain diverifikasi di Stripe. | | Alipay | Nonaktif | Memerlukan Alipay yang diaktifkan di Dasbor Stripe. | | PayPal | Nonaktif | Ditampilkan hanya saat PayPal dikonfigurasi. | | USDT (Binance) | Nonaktif | Sakelar terkunci hingga alamat deposit diverifikasi terhadap Binance. | | Biaya Stripe % / tetap (sen) | 3.6 % dan 0 | Digunakan untuk menampilkan biaya kepada pelanggan dan menghitung jumlah yang dikreditkan. Atur ke tarif Stripe asli Anda. | | Biaya PayPal % / tetap | 4.4 % dan 30 sen | Sama, untuk PayPal. | | Biaya USDT % | 1 % | Sama, untuk USDT. | | Pelanggan membayar biaya top-up | Nonaktif | **On**: pelanggan membayar jumlah + biaya dan dompet menerima jumlah penuh. **Off**: biaya dipotong dan dompet menerima jumlah dikurangi biaya. | Pelanggan selalu melihat biaya dan kredit dompet akhir sebelum membayar. Menonaktifkan kanal akan menyembunyikan tombol dan server menolak pembayaran baru dengan `method_disabled` (HTTP 403). ::: tip Batas top-up Jumlah minimum dan maksimum per top-up berada di halaman yang sama — lihat [Minimum top-up](https://nexcmp.com/id/docs/billing/minimum-top-up/). ::: ## Verifikasi {#verify} 1. Pada tabel ikhtisar, kanal menampilkan **Enabled** dan **Configured**; kolom **Last test** terisi setelah Anda mengeklik **Test** pada tab kanal. 2. Masuk ke portal sebagai pelanggan uji dan buka **Billing › Deposit**. Tombol kanal tersedia. 3. Lakukan pembayaran kecil (lihat artikel kanal untuk kartu uji atau akun sandbox). Saldo bertambah, notifikasi **Top-up received** muncul, dan pembayaran tercantum di **Finance › Billing › Top-ups** (`/billing/deposits`). ## Batas & catatan {#limits-notes} - **Kolom ikhtisar:** *30 days* (jumlah pembayaran, keberhasilan, kegagalan, dan volume), *Stuck 24h* (pembayaran yang masih tertunda setelah satu hari), dan *Unmatched* (USDT atau transfer bank yang masuk tetapi tidak cocok dengan pesanan). Baris KPI menambahkan volume 30 hari, jumlah kanal bermasalah (diaktifkan tetapi tidak dikonfigurasi, atau pembayaran macet), dan total yang tidak cocok. - **Webhook events** tercantum di **Payment channels › Gateway events** (`/payments/events`). Stripe memiliki tab tersendiri; PayPal dan USDT berbagi tab yang sama. Event yang gagal dapat diputar ulang — buku besar dompet bersifat idempoten, sehingga pemutaran ulang tidak akan pernah memberikan kredit dua kali. - **Resellers** dapat memiliki kanal Stripe, PayPal, USDT, dan bank mereka sendiri. Baris mereka juga muncul di sini, dan pemilih situs di tajuk memfilternya. Lihat [Resellers](https://nexcmp.com/id/docs/customers/resellers/). - **Refunds:** Pembayaran Stripe dan PayPal dapat direfund dari daftar pembayaran; pembayaran USDT tidak dapat direfund ke sumbernya (server menjawab `usdt_no_refund`). - **Maintenance mode** tetap menerima webhook gateway, sehingga pembayaran yang dilakukan tepat sebelum pemeliharaan tidak akan hilang. ## Pemecahan Masalah {#troubleshooting} | Gejala | Penyebab | Solusi | |---|---|---| | Kanal tidak ada di layar deposit pelanggan | Dimatikan, belum dikonfigurasi, atau (bank VN) antarmuka bukan bahasa Vietnam | Periksa **Fees & limits** dan tab kanal; lihat [Bank transfer (Vietnam)](https://nexcmp.com/id/docs/billing/bank-transfer-vn/). | | KPI **Faulty channels** berada di atas 0 | Kanal diaktifkan tanpa kredensial, atau pembayaran tertunda selama lebih dari 24 jam | Buka baris dan klik **Configure**; untuk pembayaran macet, buka **Gateway events** dan putar ulang. | | Pelanggan membayar tetapi saldo tidak berubah | Webhook tidak tiba | Periksa URL webhook pada tab kanal, lalu putar ulang event di **Gateway events**. | | Server menjawab `method_disabled` | Tombol sakelar mati | Nyalakan di **Fees & limits** dan simpan. | | Tombol USDT berwarna abu-abu | Alamat deposit belum diverifikasi | Klik **Test & verify address** pada tab USDT. | --- # Stripe > **Di admin:** Finance › Payment channels › Stripe (`/payments/stripe`). Sakelar dan biaya: Finance › Payment channels › Fees & limits (`/payments/fees`). ## Fungsi {#what-it-does} Stripe menerima pembayaran kartu untuk top-up wallet. Dengan akun yang sama, Anda juga dapat menawarkan **Apple Pay**, **Google Pay**, **Link**, dan **Alipay**, serta memungkinkan pelanggan **menyimpan kartu** untuk [top-up otomatis](https://nexcmp.com/id/docs/billing/auto-top-up/). Gunakan ini sebagai saluran utama untuk pelanggan internasional. ## Persyaratan {#requirements} | Item | Persyaratan | |---|---| | Akun Stripe | Akun Stripe yang dapat menerima pembayaran dalam **USD**. Alipay ditagihkan dalam JPY dan harus diaktifkan oleh Stripe untuk akun Anda. | | Kunci | Secret key (`sk_live_...` atau `sk_test_...`) dan publishable key (`pk_live_...` atau `pk_test_...`). Formulir hanya menerima kunci dengan prefiks tersebut. | | Jaringan | Panel Anda harus dapat dijangkau melalui HTTPS dari internet (Stripe memanggil webhook) dan harus dapat menjangkau `api.stripe.com` pada port 443. | | Domain (hanya wallet) | Domain sisi pelanggan harus menyajikan `/.well-known/apple-developer-merchantid-domain-association` — NexCMP menanganinya untuk Anda. | | Dependensi | Tidak ada. | ::: info Akun Stripe bersama NexCMP hanya memproses event webhook untuk pembayaran yang dibuatnya sendiri, sehingga Anda dapat menggunakan akun Stripe yang juga melayani aplikasi lain. ::: ## Siapkan infrastruktur {#prepare-the-infrastructure} Di sisi Stripe: 1. Masuk ke [Stripe Dashboard](https://dashboard.stripe.com). Aktifkan atau nonaktifkan **Test mode** untuk menentukan apakah Anda sedang melakukan uji coba atau beralih ke live. Kunci dari satu mode tidak akan pernah berfungsi pada mode lainnya. 2. Buka **Developers › API keys**. Salin **Publishable key** serta tampilkan dan salin **Secret key**. Jaga kerahasiaan secret key tersebut. 3. (Opsional) Buka **Settings › Payment methods** dan aktifkan **Alipay** jika Anda ingin menawarkannya. 4. Anda **tidak** harus membuat webhook secara manual — NexCMP dapat membuatnya untuk Anda (lihat langkah 5 di bawah). Jika Anda lebih memilih untuk membuatnya secara manual, buat endpoint di **Developers › Webhooks** dengan URL dan event yang tercantum di [Webhook](#webhook). ## Hubungkan di NexCMP {#connect-in-nexcmp} 1. Buka **Finance › Payment channels › Stripe** (`/payments/stripe`). 2. Pada kartu **API keys**, pilih **Mode** (`live` atau `test`), tempel **Secret key** dan **Publishable key**. 3. Klik **Save**. Kunci tersebut ditulis ke file konfigurasi di server yang hanya dapat dibaca oleh akun layanan NexCMP. Kunci tidak pernah dikirim kembali ke browser; setelahnya halaman hanya menampilkan 4 karakter terakhir. 4. Klik **Check**. Dialog akan melaporkan koneksi, mode, saldo yang tersedia dan tertunda, ID akun, apakah pembebanan diaktifkan, apakah webhook ada, dan apakah Alipay tersedia. Garis merah menandakan bagian tersebut memerlukan perhatian. 5. Pada kartu **Webhook**, klik **Create webhook** dan konfirmasi. NexCMP meminta Stripe untuk membuat endpoint dengan setiap event yang diperlukan dan mengisi **Webhook signing secret** (`whsec_...`) secara otomatis. URL yang telah terisi sebelumnya di dalam field adalah `https:///v1/billing/stripe/webhook`, misalnya `https://cloud.example.com/v1/billing/stripe/webhook`. 6. Buka **Fees & limits** (`/payments/fees`), biarkan **Card (Stripe)** tetap aktif, atur **Stripe fee %** dan **Stripe fixed fee (cents)** sesuai tarif asli Anda, lalu klik **Save channels & fees**. Lihat [Payment channels](https://nexcmp.com/id/docs/billing/payment-channels/#switches-and-fees-fees-limits). ![Halaman Stripe dengan mode, kunci rahasia, dan kunci publik yang diisi dengan nilai contoh](https://nexcmp.com/id/docs/images/billing/stripe-01-keys.webp) ### Webhook {#webhook} Banner merah "Missing webhook_secret" akan tetap muncul sampai signing secret disimpan. Tanpa itu, isi ulang Stripe **tidak dicatat**, meskipun Stripe telah mengambil uangnya. | Item | Nilai | |---|---| | URL | `https:///v1/billing/stripe/webhook` | | Event | `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` | | Tanda Tangan | Header Stripe `Stripe-Signature`, HMAC-SHA256, toleransi 300 detik. Permintaan dengan tanda tangan yang buruk akan mendapatkan HTTP 400. | | Idempotensi | Setiap ID event disimpan sekali; pengiriman berulang tidak akan pernah mengkreditkan saldo dua kali. | Jika Anda meningkatkan dari rilis yang mendaftarkan lebih sedikit event, klik **Create webhook** lagi — endpoint lama akan tetap disimpan, jadi hapus secara manual di Stripe Dashboard setelahnya. Baris **24h events** dan **Latest event** pada kartu Webhook memberi tahu Anda apakah Stripe menjangkau panel. Event individual dicantumkan di **Payment channels › Gateway events** (`/payments/events`, tab Stripe), di mana setiap event dapat dilihat (**Payload**) atau diputar ulang (**Replay**). ### Apple Pay, Google Pay, dan Link {#apple-pay-google-pay-and-link} 1. Pada kartu **Wallets (Apple Pay · Google Pay · Link) & Alipay**, field **Customer app Domain registered with Stripe** telah terisi otomatis dengan nama host situs Anda (misalnya `cloud.example.com`). 2. Klik **Register / verify domain** dan konfirmasi. NexCMP mendaftarkan domain di domain metode pembayaran Stripe dan meminta Stripe untuk memvalidasinya. 3. Hasilnya menampilkan status dari **Apple Pay**, **Google Pay**, dan **Link**. Apple Pay hanya ditampilkan ketika statusnya adalah `active`. 4. Di **Fees & limits**, biarkan **Apple Pay · Google Pay · Link** tetap aktif. ![Kartu Wallet yang menampilkan domain terdaftar serta status Apple Pay, Google Pay, dan Link](https://nexcmp.com/id/docs/images/billing/stripe-03-wallets.webp) ::: tip Apple Pay tetap tidak aktif Apple Pay memerlukan file asosiasi domain untuk merespons HTTP 200 pada domain publik Anda. Jika Anda menggunakan Cloudflare atau proksi lain di depan, jangan blokir `/.well-known/`. ::: ### Alipay {#alipay} Alipay bersifat opsional. Aktifkan di **Stripe Dashboard › Settings › Payment methods**, klik **Check** dan tunggu hingga dialog menunjukkan bahwa Alipay tersedia, lalu aktifkan **Alipay (Stripe, JPY display)** di **Fees & limits**. Atur **Alipay fee %**, **Alipay fixed fee**, **¥/USD rate** (50–500), dan **FX spread %** (0–20). Perbarui nilai tukar ¥/USD secara berkala; halaman akan memperingatkan saat usianya lebih dari 7 hari. ## Verifikasi {#verify} 1. Dalam mode pengujian, masuk ke portal sebagai pelanggan uji, buka **Billing**, klik **Deposit**, pilih **Card**, dan bayar minimum menggunakan kartu uji Stripe `4242 4242 4242 4242` (tanggal masa depan apa pun, CVC apa pun). 2. Saldo bertambah dalam hitungan detik dan pembayaran muncul di bawah **Finance › Billing › Top-ups** dengan status *Completed*. 3. Buka **Payment channels › Gateway events › Stripe**: Anda seharusnya melihat `checkout.session.completed` atau `payment_intent.succeeded` beserta waktu pemrosesan. 4. Kembali ke halaman Stripe, **24h events** bernilai di atas 0. Sebelum beralih ke mode produksi, ubah **Mode** ke `live`, tempelkan kunci produksi, dan klik **Create webhook** lagi (webhook untuk mode uji dan mode produksi terpisah). ## Batas & catatan {#limits-notes} - **Jumlah dan mata uang.** Dompet menggunakan USD. Pembayaran kartu, dompet, dan tautan ditagihkan dalam USD; Alipay ditampilkan kepada pelanggan dalam JPY dan dikonversi sesuai kurs Anda. - **Biaya.** Biaya asli Stripe tidak terbaca kembali secara otomatis; persentase biaya yang Anda tetapkan menentukan apa yang dilihat pelanggan dan berapa yang dikreditkan ke dompet. Pilih **Customer pays top-up fee** di *Fees & limits* untuk membebankan biaya di luar jumlah pengisian. - **Kartu tersimpan.** Saat pelanggan mencentang *Save card for auto top-up*, kartu disimpan di Stripe, bukan di server Anda. Lihat [Saved payment methods](https://nexcmp.com/id/docs/billing/saved-payment-methods/). - **Pengembalian dana.** Mengembalikan dana ke kartu adalah proses dua langkah: admin membuat permintaan pengembalian dana untuk pembayaran yang telah selesai (**Finance › Billing › Top-ups**, tindakan pengembalian dana pada pembayaran) lalu menyetujuinya di bawah **Finance › Payouts › Card refunds** (`/billing/payouts`). Pengembalian dana Alipay bersifat asinkron; yang gagal (`refund.failed`) akan mengembalikan jumlah yang ditahan ke dompet. - **Sengketa.** Pada `charge.dispute.created` NexCMP memblokir akun pelanggan, menghentikan layanan prabayar mereka (tidak ada yang dihapus) dan mengirimkan peringatan admin. Jika Anda menang (`charge.dispute.closed`), jumlah tersebut dikreditkan kembali ke dompet. - **Pembayaran tertunda.** Jika webhook tidak pernah tiba, NexCMP memeriksa sendiri pembayaran yang tetap tertunda selama lebih dari 10 menit terhadap Stripe dan menyelesaikannya. Pembayaran yang lebih lama dari 7 hari akan diabaikan. - **Resellers** dapat menghubungkan akun Stripe mereka sendiri (webhook `https:///v1/billing/stripe/webhook/r/`); lihat [Resellers](https://nexcmp.com/id/docs/customers/resellers/). ## Pemecahan Masalah {#troubleshooting} | Gejala | Penyebab | Solusi | |---|---|---| | "Secret key harus diawali dengan sk_live_/sk_test_" | Kunci yang ditempel salah | Tempel kunci rahasia dari **Developers › API keys**. | | "Secret key tidak cocok dengan mode live/test" | Mode dan kunci tidak cocok | Buat **Mode** agar cocok dengan awalan kunci tersebut. | | "Publishable key harus diawali dengan pk_" | Kunci salah | Gunakan publishable key. | | Pemeriksaan menyatakan koneksi gagal | Kunci salah, kunci dicabut, atau server tidak dapat menjangkau `api.stripe.com` | Tempel ulang kunci; uji dengan `curl -I https://api.stripe.com` dari server. | | Banner merah "Missing webhook_secret" | Signing secret belum disimpan | Klik **Create webhook** atau tempel `whsec_...` secret dari Stripe Dashboard dan **Save**. | | Uang terpotong tetapi saldo tidak berubah | Webhook tidak dikirim atau tanda tangan gagal | Periksa apakah URL berakhiran `/v1/billing/stripe/webhook`, secret cocok dengan endpoint, dan putar ulang event di **Gateway events**. Di Stripe, buka endpoint dan lihat percobaan pengiriman (HTTP 400 berarti signing secret salah). | | "Create webhook" gagal | URL bukan HTTPS atau tidak dapat dijangkau | Gunakan domain publik `https://` Anda. | | Status Apple Pay tidak aktif | Domain belum divalidasi | Klik **Register / verify domain** lagi setelah file asosiasi domain merespons 200. | | Alipay tidak tersedia di dialog Check | Belum diaktifkan di Stripe | Aktifkan di Stripe Dashboard, lalu klik **Check**. | | Pelanggan tidak melihat formulir kartu | **Card (Stripe)** nonaktif atau tidak ada secret key | Nyalakan di **Fees & limits** dan simpan kunci. | --- # PayPal > **Lokasi di admin:** Finance › Payment channels › PayPal (`/payments/paypal`). Tombol aktif/nonaktif dan biaya terdapat di Finance › Payment channels › Fees & limits (`/payments/fees`). ## Fungsi {#what-it-does} Memungkinkan pelanggan mengisi saldo USD mereka menggunakan saldo PayPal, rekening bank, atau kartu yang disimpan di PayPal. Pelanggan juga dapat mengizinkan NexCMP mengingat akun PayPal mereka untuk [automatic top-up](https://nexcmp.com/id/docs/billing/auto-top-up/). Gunakan bersamaan dengan [Stripe](https://nexcmp.com/id/docs/billing/stripe/) bagi pelanggan yang lebih menyukai PayPal. ## Persyaratan {#requirements} | Item | Persyaratan | |---|---| | Akun PayPal | Akun **Business** PayPal yang dapat menerima USD. | | Aplikasi REST | Satu aplikasi REST di PayPal Developer Dashboard (**Apps & Credentials**) yang menyediakan **Client ID** dan **Client secret**. Gunakan tab **Sandbox** untuk pengujian, **Live** untuk produksi. | | Jaringan | HTTPS dapat dijangkau dari Internet (PayPal memanggil webhook) dan akses keluar ke `api-m.paypal.com` (live) atau `api-m.sandbox.paypal.com` (sandbox), port 443. | | Izin | Aplikasi REST memerlukan kemampuan refund dan webhooks. Dialog **Check** menunjukkan apakah kedua cakupan tersebut ada. | | Dependensi | Tidak ada. | ## Siapkan infrastruktur {#prepare-the-infrastructure} 1. Masuk ke [developer.paypal.com](https://developer.paypal.com) dengan akun Business Anda dan buka **Apps & Credentials**. 2. Pilih **Sandbox** (pengujian) atau **Live**, lalu **Create App**. Beri nama misalnya "NexCMP". 3. Salin **Client ID** dan **Secret** dari aplikasi tersebut. 4. Untuk pengujian, gunakan **Testing Tools › Sandbox Accounts** untuk menemukan atau membuat akun sandbox *Personal* (pembeli). 5. Anda tidak perlu membuat webhook sendiri; NexCMP membuatnya dengan tombol **Create webhook**. ## Hubungkan di NexCMP {#connect-in-nexcmp} 1. Buka **Finance › Payment channels › PayPal** (`/payments/paypal`). 2. Di **API keys**, pilih **Mode**: `live` (uang riil, `api-m.paypal.com`) atau `sandbox` (`api-m.sandbox.paypal.com`). 3. Tempel **Client ID** (setidaknya 20 karakter) dan **Client secret**. 4. Klik **Check**. Ini menguji kredensial yang Anda ketik (penyimpanan tidak diperlukan) dan melaporkan koneksi, App ID, mode, apakah cakupan pengembalian dana dan webhook tersedia, serta berapa lama masa aktif token. 5. Klik **Save**. 6. Pada kartu **Webhook**, konfirmasikan bahwa URL-nya adalah `https:///v1/billing/paypal/webhook` (harus berupa `https`), lalu klik **Create webhook** dan konfirmasikan. NexCMP meminta PayPal untuk membuat atau memperbarui webhook dengan 11 peristiwa dan menyimpan **Webhook ID** yang dikembalikan. Tombol ini menggunakan kunci yang **disimpan** — simpan terlebih dahulu jika Anda baru saja mengubahnya. 7. Klik **Check** lagi: baris **Webhook** seharusnya bertuliskan "exists, 11 events". 8. Buka **Fees & limits**, aktifkan **PayPal**, atur **PayPal fee %** (default 4.4) dan **PayPal fixed fee (cents)** (default 30) sesuai tarif Anda, lalu klik **Save channels & fees**. ![Halaman PayPal dengan mode sandbox dan kredensial contoh yang dimasukkan](https://nexcmp.com/id/docs/images/billing/paypal-01-keys.webp) ### Webhook events {#webhook-events} NexCMP mendaftarkan 11 peristiwa berikut: `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`. Setiap webhook diverifikasi dengan memanggil API verifikasi tanda tangan PayPal, disimpan sekali, dan diproses secara idempoten. NexCMP tidak pernah mempercayai jumlah dalam badan webhook: sebelum mengkreditkan tangkapan, ia mengambil data tangkapan dari PayPal. ## Verifikasi {#verify} 1. Biarkan **Mode** pada `sandbox`. Di portal, buka **Billing › Deposit**, pilih **PayPal**, klik **Continue on PayPal** (atau tombol PayPal) dan masuk dengan akun pembeli sandbox. 2. Setujui pembayaran tersebut. Anda akan kembali ke portal, saldo akan bertambah, dan pembayaran akan muncul di bawah **Finance › Billing › Top-ups** sebagai *Completed*. 3. Buka **Payment channels › Gateway events › PayPal & USDT**: `PAYMENT.CAPTURE.COMPLETED` tercantum di sana. 4. Jika semuanya berjalan lancar, ubah **Mode** ke `live`, masukkan kredensial live, **Save**, lalu **Create webhook** kembali (webhook sandbox dan live terpisah). ## Batas & catatan {#limits-notes} - **Bagaimana pembayaran diselesaikan.** Pesanan dibuat dalam USD; setelah pelanggan menyetujuinya, **server** akan mengambilnya (ID permintaan idempoten) dan mengkreditkan dompet tepat satu kali. Webhook dan pekerjaan rekonsiliasi yang berjalan setiap 10 menit bertindak sebagai jaring pengaman jika pelanggan menutup peramban. - **Pesanan tertunda dan terbengkalai.** Pesanan dapat tetap terbuka selama 12 jam. Seorang pelanggan dapat memiliki paling banyak 5 pesanan tertunda (server merespons `too_many_pending`, HTTP 429). Pesanan yang masih belum diambil setelah 24 jam ditandai gagal. - **Tidak ada webhook yang dikonfigurasi.** Panel merespons HTTP 503 untuk setiap webhook PayPal hingga ID Webhook disimpan. Pengambilan yang dilakukan melalui portal dan rekonsiliasi 10 menit tetap mengkreditkan dompet, tetapi tidak ada yang dilaporkan oleh webhook PayPal (sengketa, pembatalan, pengambilan terlambat) yang akan diterapkan — klik **Create webhook**. - **Akun PayPal tersimpan.** Ketika pelanggan memilih untuk menyimpan PayPal (atau menyelesaikan deposit pertama, yang mengaktifkan [automatic top-up](https://nexcmp.com/id/docs/billing/auto-top-up/)), PayPal menyimpan token pembayaran di brankasnya. NexCMP hanya menyimpan pengenal dan email PayPal. Lihat [Saved payment methods](https://nexcmp.com/id/docs/billing/saved-payment-methods/). - **Pengembalian dana dan sengketa** ditangani seperti Stripe: permintaan pengembalian dana disetujui di bawah **Finance › Payouts › Card refunds**; sengketa akan memblokir akun pelanggan dan menghentikan layanan prabayar mereka hingga Anda menyelesaikannya. - **Biaya.** Biaya PayPal tidak dibaca kembali; persentase dan biaya tetap yang Anda konfigurasikan menentukan apa yang dilihat pelanggan dan apa yang dikreditkan. Tarif sebenarnya bergantung pada negara Anda (formulir menyarankan 4.4 % untuk Vietnam dan 3.49 % untuk AS). ## Pemecahan Masalah {#troubleshooting} | Gejala | Penyebab | Solusi | |---|---|---| | "Client ID terlalu pendek" | Kurang dari 20 karakter ditempelkan | Salin Client ID lengkap tersebut. | | "URL webhook harus https" | URL diketik dengan `http://` | Gunakan domain publik `https://` Anda. | | Pemeriksaan melaporkan galat koneksi | Mode salah (kunci live di sandbox atau sebaliknya), secret salah, tidak ada akses keluar | Sesuaikan **Mode** dengan jenis kunci; uji `curl -I https://api-m.paypal.com` dari server. | | Cakupan pengembalian dana / webhook menampilkan "no" | Aplikasi REST tidak memiliki fitur tersebut | Aktifkan fitur pada aplikasi di PayPal Developer Dashboard. | | Banner "Kunci PayPal disetel, TANPA webhook" | Webhook ID hilang | Klik **Create webhook**. | | "Webhook not found" dalam Pemeriksaan | Webhook telah dihapus di PayPal atau milik aplikasi lain | Klik **Create webhook** lagi. | | Pelanggan diberitahu bahwa PayPal menolak pembayaran | PayPal menolak sumber pendanaan tersebut | Minta pelanggan untuk memilih sumber pembayaran lain. | | Pelanggan melihat "Too many pending requests" | 5 pesanan aktif | Tunggu hingga kedaluwarsa atau selesaikan pesanan tersebut. | | Tombol PayPal tidak ada | PayPal nonaktif di **Fees & limits** atau belum dikonfigurasi | Aktifkan dan simpan kredensial. | --- # USDT (Binance) {#usdt-binance} > **Di mana letaknya di admin:** Finance › Payment channels › USDT (`/payments/usdt`). Tombol dan biaya: Finance › Payment channels › Fees & limits (`/payments/fees`). Deposit tak cocok: Finance › Payment channels › Gateway events › PayPal & USDT (`/payments/events?tab=gateways`). ## Fungsi {#what-it-does} Pelanggan mengirim USDT ke **alamat deposit Binance Anda**; NexCMP membaca riwayat deposit melalui kunci API Binance yang **hanya-baca** (read-only) dan mengisi saldo dompet ketika deposit cocok dengan permintaan terbuka. Tidak ada biaya pemrosesan pembayaran di sisi Anda selain yang dikenakan oleh Binance, dan tidak ada kunci privat yang disimpan oleh NexCMP. ## Persyaratan {#requirements} | Item | Persyaratan | |---|---| | Akun Binance | Akun Binance terverifikasi dengan deposit USDT yang diaktifkan pada jaringan pilihan Anda. | | Kunci API | Kunci API Binance dengan **Enable Reading** saja. Opsi Enable Withdrawals, Internal Transfer, dan Spot/Margin Trading harus **nonaktif** (off). | | Pembatasan IP | Sangat disarankan: batasi kunci ke IP keluar server (dialog **Test & verify address** menampilkannya). | | Jaringan | HTTPS keluar ke `api.binance.com`. Tidak ada port masuk yang diperlukan. | | Jaringan yang didukung | `TRX` (Tron, TRC20), `BSC` (BNB Smart Chain, BEP20), `SOL` (Solana), `ETH` (Ethereum, ERC20). Koin dikunci ke USDT. | | Dependensi | Tidak ada. | ::: warning Pilih jaringan sekali saja Pelanggan yang mengirim melalui jaringan yang salah akan kehilangan dana tersebut. Pilih jaringan dengan biaya rendah yang didukung oleh bursa pelanggan Anda (TRX dan BSC adalah pilihan umum), dan jangan sering mengubahnya. ::: ## Siapkan infrastruktur {#prepare-the-infrastructure} 1. Di Binance, buka **Account › API Management** dan buat kunci API baru (dibuat oleh sistem). Berikan label seperti "NexCMP". 2. Sunting izin: biarkan hanya **Enable Reading** yang dicentang. Jangan aktifkan penarikan (withdrawals), transfer, atau trading. 3. Di bawah **Restrict access to trusted IPs only** tambahkan alamat IP publik server NexCMP Anda. Jika Anda belum mengetahuinya, buat kunci tanpa pembatasan, jalankan pengujian pertama di NexCMP (yang mencetak IP keluar) lalu tambahkan IP tersebut. 4. Salin **API key** dan **Secret key** (secret hanya ditampilkan sekali). 5. Buka **Wallet › Deposit › Crypto**, pilih **USDT** dan **network** yang akan Anda gunakan, lalu salin **deposit address** (misalnya alamat `T...` di TRX atau `0x...` di BSC/ETH). ## Hubungkan di NexCMP {#connect-in-nexcmp} 1. Buka **Finance › Payment channels › USDT** (`/payments/usdt`). 2. Di **API key (Binance › API Management)** tempel **API key** dan **API secret**. Keduanya harus dimasukkan bersamaan. 3. Di **Deposit address** pilih **Network** dan tempel **USDT deposit address on the selected network**. Format divalidasi terhadap network (`T` + 33 karakter untuk TRX, `0x` + 40 karakter hex untuk BSC dan ETH, base58 untuk SOL). 4. Klik **Save**. Mengubah alamat atau network akan mereset verifikasi dan menjeda channel hingga Anda memverifikasinya kembali; halaman akan meminta konfirmasi Anda. 5. Klik **Test & verify address**. (Perubahan yang belum disimpan akan ditolak — pemeriksaan berjalan pada konfigurasi yang tersimpan.) Dialog menampilkan: - izin kunci (membaca, penarikan, transfer internal, trading, pembatasan IP) — peringatan merah untuk izin yang berbahaya; - IP keluar server (untuk dimasukkan ke Binance); - network (deposit dibuka atau ditutup, konfirmasi yang diperlukan, debu/dust); - alamat yang dikeluarkan Binance untuk network tersebut dan apakah **cocok** dengan milik Anda. 6. Ketika alamat cocok, NexCMP mencatat waktu verifikasi. Barulah Anda dapat membuka **Fees & limits**, mengaktifkan **USDT (Binance)**, memeriksa **USDT fee %** (default 1) dan **USDT request expires after (mins)** (5–180, default 30), lalu klik **Save channels & fees**. ## Cara pembayaran dicocokkan {#how-a-payment-is-matched} 1. Pelanggan memasukkan jumlah di **Billing › Deposit › USDT** dan mengklik **Get deposit address**. 2. NexCMP membuat permintaan dan menampilkan alamat, network, serta **jumlah pasti** dengan enam desimal — misalnya `19.173742`. Empat desimal terakhir adalah nonce acak yang membuat jumlah tersebut unik untuk permintaan itu. 3. Pelanggan harus mengirimkan **persis** jumlah tersebut pada network yang sesuai. Pembayaran yang tidak cocok (jumlah dibulatkan, salah network) tidak dapat ditetapkan secara otomatis. 4. Setiap 60 detik NexCMP membaca deposit Binance selama 24 jam terakhir. Deposit yang cocok memindahkan permintaan ke status *confirming* dan, setelah Binance mendapatkan konfirmasi yang diperlukan, mengkredit dompet. Permintaan yang telah mendeteksi dana tidak akan pernah kedaluwarsa selama konfirmasi masih tertunda. 5. Permintaan yang tidak dibayar dalam waktu kedaluwarsa (default 30 menit) akan ditandai kedaluwarsa. ## Verifikasi {#verify} 1. Setelah alamat diverifikasi dan USDT diaktifkan, masuklah sebagai pelanggan uji dan minta deposit kecil (top-up minimum). 2. Kirim jumlah yang pas dari dompet atau bursa lain. Tunggu beberapa menit. 3. Portal menampilkan *Transfer seen — confirming*, lalu *USDT received — balance updated*. 4. Halaman USDT menampilkan waktu **Last poll** terbaru dan **Unmatched** pada angka 0. ## Batas & catatan {#limits-notes} - **Rate.** 1 USDT = 1.00 USD. Biaya di **USDT fee %** ditampilkan kepada pelanggan dan dikurangi dari atau ditambahkan ke jumlah tersebut bergantung pada **Customer pays top-up fee**. - **No refunds.** Pembayaran USDT tidak pernah dikembalikan ke sumber oleh NexCMP (HTTP 409 `usdt_no_refund`). Lakukan pengembalian dana secara manual di luar sistem jika Anda harus melakukannya. - **Pending limit.** Pelanggan memiliki jumlah permintaan terbuka yang terbatas; melebihi itu server akan merespon `too_many_pending` (HTTP 429). - **Resellers** dapat menggunakan akun Binance mereka sendiri; lihat [Resellers](https://nexcmp.com/id/docs/customers/resellers/). - **Jika Anda membagikan akun Binance** dengan sistem lain, berikan jaringan yang berbeda ke setiap sistem agar dua poller tidak pernah melihat deposit yang sama. ### Deposit yang tidak cocok {#unmatched-deposits} Deposit yang tidak cocok dengan permintaan apa pun (jumlah salah, jaringan salah, permintaan kedaluwarsa) akan membuat event `deposit.unmatched` dan peringatan admin. Buka **Payment channels › Gateway events › PayPal & USDT**, cari event tersebut, periksa transaksi di Binance, dan klik tindakan penugasan untuk mengkredit pelanggan yang benar. Penghitung **Unmatched** pada halaman USDT dan ringkasan kanal akan turun menjadi 0 setelahnya. ## Pemecahan Masalah {#troubleshooting} | Gejala | Penyebab | Solusi | |---|---|---| | "API key dan secret harus dimasukkan bersamaan" | Hanya satu kolom yang diisi | Isi keduanya. | | "Alamat tidak dalam format jaringan ..." | Alamat tidak sesuai dengan jaringan yang dipilih | Salin ulang dari Binance untuk jaringan yang sama. | | "Perubahan belum disimpan — Simpan terlebih dahulu lalu Uji" | Uji berjalan pada pengaturan yang disimpan | Klik **Save**, lalu uji. | | Peringatan "key has Enable Withdrawals" | Izin berlebih | Hapus di Binance API Management. | | Peringatan "key not restricted to IP" | `ipRestrict` nonaktif | Tambahkan IP keluar server yang ditampilkan dalam dialog. | | Peringatan "key lacks Enable Reading" | Izin tidak ada | Aktifkan Reading. | | Peringatan "Binance has deposits disabled for USDT on the network" | Jaringan ditangguhkan | Pilih jaringan lain atau tunggu. | | "BAHAYA: alamat yang dikonfigurasi berbeda dari alamat yang diterbitkan Binance" | Alamat atau jaringan salah | Salin ulang alamat dari Binance untuk jaringan tersebut. | | Tombol USDT berwarna abu-abu di Fees & limits | Alamat belum diverifikasi | Jalankan **Test & verify address** hingga cocok. | | Pelanggan membayar, tidak ada yang dikreditkan | Jumlah dibulatkan atau jaringan salah | Cari event di Gateway events dan tetapkan secara manual. | | Deposit terlihat tetapi menunggu lama | Konfirmasi belum cukup | Tunggu; permintaan tidak kedaluwarsa saat melakukan konfirmasi. | --- # Transfer bank (Vietnam) {#bank-transfer-vietnam} > **Di mana letaknya di admin:** Finance › Payment channels › VN bank transfer (`/payments/bank`). Nilai tukar: Finance › Payment channels › Exchange rates (`/payments/fx`). ## Fungsi {#what-it-does} Memungkinkan pelanggan mengisi ulang dompet USD melalui transfer bank normal dalam dong Vietnam. NexCMP menampilkan kode VietQR, detail akun, dan **transfer memo** yang unik; [Sepay](https://sepay.vn) memantau rekening bank Anda dan memanggil webhook saat uang tiba, lalu NexCMP mengkredit dompet tersebut. Gunakan ini jika Anda menjual kepada pelanggan di Vietnam. ::: info Hanya ditampilkan dalam antarmuka bahasa Vietnam Opsi bank VN ditawarkan kepada pelanggan hanya ketika portal ditampilkan dalam bahasa **Vietnamese**. Pelanggan dengan bahasa lain tidak akan pernah melihatnya. ::: ## Persyaratan {#requirements} | Item | Persyaratan | |---|---| | Akun bank | Sebuah rekening bank Vietnam (atau akun virtual Sepay, **VA**) yang terhubung ke akun Sepay di [my.sepay.vn](https://my.sepay.vn). | | Sepay | Akun Sepay dengan integrasi webhook yang diaktifkan. | | Nilai tukar | Kurs USD ke VND harus ada: perbarui terlebih dahulu di bawah **Exchange rates**. Tanpa kurs, kanal akan menjawab `fx_unavailable` dan pelanggan tidak dapat memulai transfer. | | Jaringan | Panel Anda harus dapat diakses melalui HTTPS agar Sepay dapat memanggil `https:///v1/billing/sepay/webhook`. | | Dependensi | [Mata uang dan nilai tukar](https://nexcmp.com/id/docs/catalog/currency-and-exchange-rates/). | ## Siapkan infrastruktur {#prepare-the-infrastructure} Di sisi Sepay: 1. Di [my.sepay.vn](https://my.sepay.vn), hubungkan rekening bank Anda (atau buat VA) dan pastikan transaksi muncul. 2. Tentukan **prefix memo** — 2 hingga 5 huruf kapital, misalnya `PAY`. NexCMP menghasilkan memo sebagai prefix yang diikuti oleh 8 digit acak (misalnya `PAY48210937`). Prefix tidak boleh mengandung `ORD`, dan sebaiknya tidak digunakan oleh sistem lain yang menerima uang ke rekening yang sama. 3. Jika akun Sepay Anda menggunakan *struktur kode pembayaran*, daftarkan prefix yang sama di sana agar Sepay mengenali memo tersebut. 4. Buat webhook nanti, setelah halaman NexCMP memberi Anda URL dan kunci (langkah 7 di bawah). ## Hubungkan di NexCMP {#connect-in-nexcmp} 1. Buka **Finance › Payment channels › Exchange rates** dan klik **Update exchange rates** jika belum ada kurs yang tersimpan. 2. Buka **Finance › Payment channels › VN bank transfer** (`/payments/bank`). 3. Di **Receiving account** isi: | Kolom | Contoh | Aturan | |---|---|---| | Bank | `VCB` Vietcombank | Pilih dari daftar; BIN akan terisi secara otomatis. | | Nomor rekening | `0123456789` | 4–24 digit atau huruf kapital. | | Akun virtual (VA — opsional) | | Jika disetel, pelanggan mentransfer ke VA dan QR akan menampilkannya. | | Nama pemilik rekening | `NGUYEN VAN A` | Tanpa aksen, HURUF BESAR, 2–60 karakter. | | Prefix memo transfer | `PAY` | 2–5 huruf kapital, tanpa `ORD`. | 4. Di **Webhook authentication** pilih **Auth method**: **HMAC-SHA256** (disarankan) atau **API key**, dan masukkan **Webhook key / HMAC secret** (8–200 karakter). Secara opsional, masukkan **userapi token** dari Sepay; ini hanya digunakan untuk mencocokkan kembali transfer yang webhook-nya hilang. 5. Di **Channel & limits** atur batas (bawaan dalam tanda kurung): **Min / order** (10,000 VND), **Max / order** (200,000,000 VND), **Order expiry** (120 menit, 15–1440), **Max pending orders / account** (3, 1–10), **Reconcile every** (10 menit) dan, secara opsional, **Allowed webhook IPs** (dipisahkan koma; kosong berarti IP hanya dicatat). 6. Klik **Save**. Spanduk merah "Sepay not configured" akan hilang setelah akun, nama, prefix, dan kunci valid. 7. Salin **Webhook URL to paste into my.sepay.vn** (tertulis `https:///v1/billing/sepay/webhook`) dengan **Copy**. Di Sepay, buka integrasi webhook, tempel URL tersebut, pilih jenis autentikasi dan key yang sama, lalu aktifkan event "money in". 8. Klik **Test connection**. Kemudian aktifkan **Enable Sepay for clients (main site)** dan **Save**. ![Halaman transfer bank VN dengan rekening penerima, prefix memo, dan autentikasi webhook yang terisi nilai contoh](https://nexcmp.com/id/docs/images/billing/bank-transfer-vn-01-config.webp) ![Kartu kanal dan batasan dengan tombol Sepay dinyalakan dan batasan default](https://nexcmp.com/id/docs/images/billing/bank-transfer-vn-02-limits.webp) ### Keamanan webhook {#webhook-security} | Metode | Apa yang harus dikirim oleh Sepay | |---|---| | HMAC-SHA256 | Header `X-SePay-Signature: sha256=`, dihitung dari `"."`; stempel waktu mungkin berbeda paling lama 300 detik. | | Kunci API | Header `Authorization: Apikey `. | Hanya header yang diperiksa (tidak pernah isi atau string kueri) dan perbandingan dilakukan dalam waktu-konstan. Hanya transfer masuk (`transferType = in`) ke akun atau VA yang Anda konfigurasikan yang digunakan. Setiap transaksi Sepay disimpan sekali, sehingga webhook yang dicoba ulang tidak pernah mengkreditkan dua kali. NexCMP merespons `200 {"success":true}` bahkan ketika dengan sengaja mengabaikan suatu transaksi, dan HTTP 5xx hanya untuk kesalahan sementara agar Sepay mencoba ulang. ## Cara pelanggan membayar {#how-the-customer-pays} 1. Di **Billing › Deposit** (antarmuka berbahasa Vietnam), pelanggan memilih opsi transfer bank VN dan memasukkan jumlah, lalu mengklik tombol buat-transfer. 2. NexCMP mengonversi jumlah USD pada kurs yang disimpan (termasuk margin dan langkah pembulatan yang Anda atur di **Exchange rates**) dan **membulatkan jumlah VND ke atas** ke langkah pembulatan tersebut. 3. Pelanggan melihat kode QR (VietQR, dibuat secara lokal) yang berisi nomor rekening, bank, jumlah, dan berita transfer. 4. Setelah transfer, Sepay memanggil webhook, NexCMP mengkreditkan `floor(VND received × 100 / rate)` sen. Nilai tukar dikunci saat pesanan dibuat; jika dana tiba setelah pesanan kedaluwarsa, nilai tukar yang lebih tinggi antara nilai yang dikunci dan nilai saat ini akan digunakan. 5. Pesanan kedaluwarsa setelah **Order expiry**; rekonsiliasi berjalan setiap **Reconcile every** menit sebagai jaring pengaman (memerlukan token userapi). ## Verifikasi {#verify} 1. Buat pesanan uji sebagai pelanggan pada antarmuka bahasa Vietnam. Periksa apakah jumlah, rekening, dan berita transfer sudah benar. 2. Transfer jumlah minimum yang diizinkan dengan berita transfer yang tepat. 3. Dalam waktu satu menit, portal menampilkan setoran sebagai selesai dan saldo dompet bertambah; kartu **State** pada halaman bank menunjukkan waktu webhook terakhir. 4. Buka **Finance › Billing › Top-ups** dan periksa apakah pembayaran terdaftar dengan jumlah VND yang diterima. ## Batas & catatan {#limits-notes} - **Minimum.** Minimum VND yang dilihat pelanggan adalah nilai yang lebih besar antara **Min / order** dan nilai VND dari [minimum top-up](https://nexcmp.com/id/docs/billing/minimum-top-up/). - **Pesanan tertunda.** Pelanggan hanya dapat memiliki pesanan terbuka sejumlah **Max pending orders / account** (default 3). - **Berita transfer sama dua kali.** Melakukan transfer dua kali dengan berita transfer yang sama akan membuat pembayaran kedua yang selesai pada nilai tukar saat ini. - **Tidak ada pengembalian dana otomatis** ke rekening bank. - **Biaya.** Kanal ini tidak memiliki baris biaya tetap di **Fees & limits**; margin nilai tukar adalah satu-satunya penyesuaian. - **Resellers** dapat mengonfigurasi akun mereka sendiri; URL webhook mereka diakhiri dengan `/v1/billing/sepay/webhook/r/`. ### Transfer yang tidak cocok {#unmatched-transfers} Dana yang masuk ke rekening namun tidak membawa berita transfer yang valid akan muncul di **Unmatched transactions** di bagian bawah halaman (filter *All channel owners* atau *Master*). Periksa referensi bank dengan pelanggan, lalu klik **Assign** dan pilih akun. Dompet dikreditkan pada nilai tukar saat ini. ## Pemecahan Masalah {#troubleshooting} | Gejala | Penyebab | Solusi | |---|---|---| | Banner "Sepay belum dikonfigurasi" | Bank, akun, nama pemilik, prefiks, atau kunci hilang atau tidak valid | Lengkapi kartu **Receiving account** dan **Webhook authentication**. | | Banner "Kurs USD/VND diblokir" (`fx_unavailable`) | Tidak ada nilai tukar yang disimpan | Buka **Exchange rates › Update exchange rates**. | | `prefix: 2–5 capital letters, no ORD` | Prefiks tidak valid | Gunakan 2–5 huruf kapital tanpa `ORD`. | | Kesalahan `account_name` | Aksen atau huruf kecil | Gunakan huruf HURUF BESAR tanpa aksen, angka, spasi, titik, atau tanda hubung. | | `webhook_secret: 8–200 characters` | Kunci terlalu pendek | Gunakan setidaknya 8 karakter cetak. | | Pelanggan tidak dapat melihat opsi | Tidak ada dalam antarmuka bahasa Vietnam, dinonaktifkan, atau tidak ada tarif | Periksa bahasa, sakelar, dan tarif. | | Pelanggan sudah membayar tetapi saldo tidak masuk | Webhook tidak sampai, memo berubah, jumlah salah | Periksa log webhook Sepay; transfer akan masuk ke **Unmatched transactions** jika memo salah. | | Webhook mengembalikan respons 401 atau 403 | Ketidakcocokan metode otentikasi atau kunci | Gunakan metode dan kunci yang sama di Sepay dan NexCMP. | | Pelanggan melihat "Too many pending requests" | Batas pesanan tertunda tercapai | Selesaikan pesanan tersebut atau tunggu hingga kedaluwarsa. | --- # Minimum top-up {#minimum-top-up} > **Letak di admin:** Finance › Payment channels › Fees & limits (`/payments/fees`), kartu **Wallet & top-up (Billing › Policy)**. ## Fungsi {#what-it-does} Setiap kanal pembayaran menolak jumlah di bawah **minimum top-up** atau di atas **maximum top-up per transaction**. Nilai default-nya adalah **$10.00** dan **$5,000.00**. Gunakan minimum ini untuk menghindari pembayaran sangat kecil yang biaya gateway-nya melebihi nilainya. ## Persyaratan {#requirements} | Item | Persyaratan | |---|---| | Role | Seorang administrator. | | Dependensi | Tidak ada. | ## Set the limits {#set-the-limits} 1. Buka **Finance › Payment channels › Fees & limits** (`/payments/fees`). 2. Di kartu **Wallet & top-up (Billing › Policy)** edit **Min top-up (USD)** dan **Max top-up per transaction (USD)**. 3. Click **Save Wallet & top-up**. ![Kartu dompet dan top-up dengan minimum top-up 10.00 dan maksimum 5000.00](https://nexcmp.com/id/docs/images/billing/minimum-top-up-01-limits.webp) | Pengaturan | Default | Allowed range | Aturan | |---|---|---|---| | Min top-up (USD) | $10.00 | $0 to $10,000 | Harus kurang dari atau sama dengan maksimum. | | Top-up maksimum per transaksi (USD) | $5,000.00 | $1 to $1,000,000 | Harus setidaknya sebesar minimum. | Nilai disimpan dalam bentuk sen (`min_topup_cents`, `max_topup_cents`). ## Tempat batas berlaku {#where-the-limits-apply} | Lokasi | Behaviour | |---|---| | Card, Apple/Google Pay, Link, Alipay, PayPal, USDT | Jumlah di luar rentang ditolak oleh server. Portal menampilkan "Enter an amount between {min} and {max}". | | Transfer bank VN | Jumlah VND harus berada dalam batas Sepay **dan** nilai USD-nya (yang diterima dompet) berada di antara minimum dan maksimum. Portal menampilkan nilai minimum VND yang lebih besar. Lihat [Bank transfer (Vietnam)](https://nexcmp.com/id/docs/billing/bank-transfer-vn/). | | [Automatic top-up](https://nexcmp.com/id/docs/billing/auto-top-up/) | Setiap penagihan otomatis bernilai setidaknya minimum dan paling banyak maksimum. Dalam mode tetap, jumlah pelanggan harus berada di antara minimum dan $1,000. | | Top-up codes ([Vouchers](https://nexcmp.com/id/docs/billing/promotions/)) | Not affected. | | Kredit / debit admin | Not affected. | | Reseller wallet top-up | Minimum terpisah (`rs_topup_min_cents`, default $20) di bawah Resellers › Defaults. | ## Related floors {#related-floors} Minimum top-up bukan satu-satunya aturan saldo. Ini ada di **Services › Virtual Machines › Policy** (`/vm/policy`): | Aturan | Default | Arti | |---|---|---| | Minimum balance (`min_balance_cents`) | $5.00 | Saldo dompet minimum yang dibutuhkan pelanggan untuk membuat VM. | | Quotas | Nonaktif | Saat **Quotas** aktif, pembuatan VM juga memerlukan saldo yang mencakup sejumlah jam untuk VM tersebut. Lihat [Quotas](https://nexcmp.com/id/docs/billing/quotas/). | ## Verifikasi {#verify} 1. Di portal, buka **Billing › Deposit** dan ketik jumlah yang sedikit di bawah minimum Anda. Tombol pembayaran dinonaktifkan dan pesan rentang akan muncul. 2. Masukkan jumlah minimum dan konfirmasikan pembayaran dimulai. ## Batas & catatan {#limits-notes} - Perubahan berlaku untuk pembayaran baru. Pesanan yang sudah dibuat tetap menggunakan jumlah saat pesanan tersebut dibuat. - Petunjuk untuk pelanggan ("Minimum $10.00, maximum $5,000.00") dan tombol jumlah cepat mengikuti batas baru secara otomatis. - Jika Anda menampilkan VND (halaman **Exchange rates**), minimum dikonversi pada kurs yang tersimpan hanya untuk tampilan; dompet dan batas tetap dalam USD. ## Pemecahan Masalah {#troubleshooting} | Gejala | Penyebab | Solusi | |---|---|---| | "Top-up minimum harus kurang dari atau sama dengan maksimum" | Nilai bersilangan | Turunkan minimum atau naikkan maksimum. | | Pelanggan tidak dapat membayar jumlah kecil melalui transfer bank VN | Minimum VND Sepay atau minimum USD lebih tinggi | Turunkan **Min / order** pada halaman bank atau minimum USD. | | Error server `invalid_argument` saat melakukan top-up | Jumlah di luar rentang | Minta jumlah yang berada di dalam rentang yang ditampilkan. | --- # Saved payment methods {#saved-payment-methods} > Lokasi **di portal:** Billing › Settings (`/billing?settings=1`). **Lokasi di admin:** Customers › List › a customer › Overview (`/customers/`), kartu **Payment**, menampilkan metode yang tersimpan dan riwayat top-up otomatis. ## Fungsi {#what-it-does} Metode pembayaran tersimpan memungkinkan NexCMP menagih pelanggan **tanpa kehadiran mereka**, sehingga layanan mereka tidak pernah berhenti karena dompet habis. Ini hanya digunakan oleh [automatic top-up](https://nexcmp.com/id/docs/billing/auto-top-up/). Terdapat dua jenis: **kartu** yang disimpan di Stripe (termasuk kartu yang digunakan melalui Apple Pay, Google Pay, atau Link ketika Stripe mengembalikan kartu yang dapat digunakan kembali) dan **akun PayPal** yang disimpan di vault PayPal. ## Persyaratan {#requirements} | Item | Persyaratan | |---|---| | Saluran | [Stripe](https://nexcmp.com/id/docs/billing/stripe/) dan/atau [PayPal](https://nexcmp.com/id/docs/billing/paypal/) dikonfigurasi dan diaktifkan. | | Situs | Situs utama, atau situs reseller yang saluran pembayarannya dikumpulkan oleh platform. Situs reseller yang menggunakan akun Stripe sendiri tidak dapat menyimpan kartu. | | Pelanggan | Akun pelanggan yang melakukan top-up dengan kartu atau PayPal. | ## Cara metode tersimpan {#how-a-method-gets-saved} 1. Pelanggan membuka **Billing**, mengklik **Deposit**, dan membayar dengan **Card** atau **PayPal**. 2. Pembayaran dibuat agar metode dapat digunakan kembali nanti: Stripe menyimpan kartu bersama pelanggan di Stripe (penggunaan off-session), PayPal menyimpan token vault. NexCMP hanya menyimpan referensi (ID metode pembayaran dan ID pelanggan Stripe, atau ID vault PayPal) serta label tampilan seperti `visa •••• 4242` atau email PayPal. **Nomor kartu tidak pernah menyentuh server Anda.** 3. Saat pembayaran selesai, [top-up otomatis](https://nexcmp.com/id/docs/billing/auto-top-up/) diaktifkan sekali jika pelanggan belum pernah menentukan pengaturan sebelumnya. Tidak ada kotak centang atau pesan tambahan di layar. Server mencatat waktu, alamat IP pelanggan, dan metode sebagai bukti. 4. Berikutnya, layar deposit menawarkan **Saved card ...** pada dropdown kartu, dan **Saved PayPal ...** untuk PayPal. ## Kelola dan hapus {#manage-and-remove} 1. Di portal, buka **Billing** dan klik **Settings**. Panel akan menampilkan metode tersimpan (kartu Stripe dan/atau PayPal) serta opsi top-up otomatis. 2. Untuk menghapus kartu, klik **Remove card** lalu konfirmasikan. Stripe akan melepas kartu tersebut dan **pengisian otomatis dinonaktifkan**. 3. Untuk menghapus PayPal, klik **Remove saved PayPal** lalu konfirmasikan. ### Tampilan admin {#admin-view} Buka pelanggan di **Customers › List**. Kartu **Payment** pada tab **Overview** menampilkan label metode yang disimpan (**Saved cards**), gateway yang digunakan untuk tagihan otomatis, bukti persetujuan yang disimpan (waktu, IP, metode), serta 20 percobaan tagihan otomatis terakhir beserta status dan alasannya (**Auto top-up history**). ## Verifikasi {#verify} 1. Sebagai pelanggan uji, lakukan deposit minimum menggunakan kartu. Setelah pembayaran selesai, buka **Billing › Settings**: kartu dan tombol pengisian otomatis (aktif) akan terlihat. 2. Mulai deposit lain: menu dropdown akan menawarkan kartu yang tersimpan. 3. Di panel admin, kartu **Payment** pelanggan menampilkan label kartu yang sama. ## Batas & catatan {#limits-notes} - **Stripe Link dan dompet.** Link, Apple Pay, dan Google Pay adalah fitur Stripe. NexCMP tidak menyimpan apa pun yang spesifik untuk Link; NexCMP hanya menyimpan referensi kartu yang dikembalikan oleh Stripe. - **PayPal.** Setiap pengisian saldo PayPal yang dimulai pelanggan memerlukan konfirmasi klik; PayPal yang tersimpan hanya digunakan oleh pengisian otomatis, tidak pernah untuk fitur lainnya. - **Situs reseller.** Jika reseller menggunakan akun Stripe atau PayPal miliknya sendiri, metode yang disimpan akan disembunyikan dan pengisian otomatis tidak tersedia untuk situs tersebut. - **Sengketa.** Sengketa pada pembayaran apa pun akan memblokir akun dan menghentikan layanan prabayarnya; lihat [Stripe](https://nexcmp.com/id/docs/billing/stripe/). - **Menghapus metode terakhir** akan menonaktifkan pengisian otomatis; pelanggan tetap mempertahankan saldo dompetnya. - **Bukti.** Catatan persetujuan dicatat oleh server (tidak dapat diedit oleh pelanggan) dan disimpan untuk penanganan sengketa. ## Pemecahan Masalah {#troubleshooting} | Gejala | Penyebab | Solusi | |---|---|---| | Pelanggan tidak melihat tombol Settings atau kartu tersimpan | Situs menggunakan kanal pembayaran milik reseller, atau belum ada pembayaran kartu | Lakukan deposit kartu atau PayPal melalui kanal platform. | | "Saved card" tidak muncul setelah pembayaran Stripe | Pembayaran dilakukan dengan metode yang tidak dapat digunakan ulang (misalnya Alipay) | Bayar kembali menggunakan kartu. | | PayPal: "belum dapat menyimpan akun ini" | PayPal tidak mengembalikan token vault | Lanjutkan dengan pembayaran satu kali, atau coba akun PayPal lain. | | Pengisian otomatis berhenti setelah kartu dihapus | Harapan: menghapus kartu akan menonaktifkannya | Simpan metode baru pada deposit berikutnya. | --- # Auto top-up {#auto-top-up} > **Lokasi di admin:** Finance › Payment channels › Fees & limits (`/payments/fees`), kartu **Wallet & top-up (Billing › Policy)**, bagian **Auto top-up (Stripe / PayPal)**. **Lokasi di portal:** Billing › Settings (`/billing?settings=1`). ## Fungsi {#what-it-does} Saat saldo dompet pelanggan turun terlalu rendah, NexCMP menagih [saved payment method](https://nexcmp.com/id/docs/billing/saved-payment-methods/) milik mereka dan mengkreditkannya ke dompet, sehingga layanan yang berjalan tidak ditangguhkan karena kekurangan dana. Pekerjaan latar belakang memeriksa semua pelanggan yang diaktifkan **setiap 5 menit**. ## Persyaratan {#requirements} | Item | Persyaratan | |---|---| | Saluran | [Stripe](https://nexcmp.com/id/docs/billing/stripe/) dan/atau [PayPal](https://nexcmp.com/id/docs/billing/paypal/) dikonfigurasi. | | Saved method | Pelanggan memiliki kartu atau akun PayPal yang tersimpan. | | Situs | Situs utama, atau situs reseller yang kanal Stripe/PayPal-nya dikumpulkan oleh platform. | | Global switch | **Auto top-up enabled** dalam keadaan aktif (default aktif). | ## Cara kerja {#how-it-works} Setelah **pengisian saldo Stripe atau PayPal pertama** pelanggan, server akan menyimpan metode pembayaran tersebut dan mengaktifkan pengisian saldo otomatis dalam mode **By usage** — hanya jika pelanggan tersebut belum pernah mengatur pengisian otomatis sendiri. Tidak ada kotak centang tambahan di layar deposit; server mencatat waktu, alamat IP, dan metode sebagai bukti. Jika pelanggan menonaktifkan pengisian otomatis nanti, fitur ini tidak akan pernah diaktifkan kembali secara otomatis. | Mode | Pemicu (saat saldo di bawah ...) | Jumlah yang ditagihkan | |---|---|---| | **By usage** (default setelah pengisian saldo pertama) | biaya untuk menjalankan layanan selama 24 jam ke depan (VM per jam ditambah perpanjangan prabayar yang jatuh tempo dalam 24 jam), namun tidak pernah di bawah **$5** | biaya 24 jam yang dibulatkan ke dolar terdekat, setidaknya sebesar [minimum top-up](https://nexcmp.com/id/docs/billing/minimum-top-up/), paling banyak sebesar maksimum top-up dan batas harian | | **Fixed amount** | ambang batas milik pelanggan sendiri ($1 hingga $500) | jumlah milik pelanggan sendiri (dari minimum top-up hingga $1,000, dan lebih besar dari ambang batas) | Tanpa layanan yang berjalan dalam mode **By usage**, tidak ada biaya yang ditagihkan. Saldo yang dibandingkan dengan ambang batas adalah **uang riil di dompet**. Kredit layanan dari kode promosi disimpan secara terpisah dan tidak dihitung (lihat [Promotions](https://nexcmp.com/id/docs/billing/promotions/)). Biaya ditangani seperti pengisian saldo normal: dengan **Customer pays top-up fee** aktif, kartu akan ditagih sebesar jumlah ditambah biaya dan dompet mendapatkan jumlah penuh; jika nonaktif, dompet mendapatkan jumlah dikurangi biaya. ## Mengonfigurasi batas global {#configure-the-global-limits} 1. Buka **Finance › Payment channels › Fees & limits** (`/payments/fees`). 2. Di bagian **Auto top-up (Stripe / PayPal)**, atur: | Pengaturan | Default | Rentang | Arti | |---|---|---|---| | Auto top-up enabled | On | on atau off | Off akan menghentikan setiap pembebanan latar belakang seketika. | | Ambang batas pengisian otomatis default (USD, cadangan mode tetap) | $5.00 | $0 to $10,000 | Hanya digunakan sebagai ambang batas awal dalam mode tetap. | | Maksimal pengisian otomatis per 24 jam per pelanggan | 3 | 1 hingga 50 | Menghitung percobaan yang berhasil dan tertunda. | | Batas jumlah pengisian otomatis per 24 jam per pelanggan (USD) | $500.00 | $0 hingga $1,000,000 | Total tagihan otomatis dalam satu hari berjalan. | 3. Click **Save Wallet & top-up**. ![Bagian auto top-up pada halaman Fees and limits dengan sakelar global dan batas harian](https://nexcmp.com/id/docs/images/billing/auto-top-up-01-limits.webp) ## Tampilan pelanggan {#what-the-customer-sees} 1. Di portal, pelanggan membuka **Billing** dan mengklik **Settings**. 2. Panel menampilkan metode yang disimpan, sakelar on/off, mode (**By usage** atau **Fixed amount**), perkiraan penggunaan saat ini dan tagihan berikutnya, serta **Recent automatic top-ups**. 3. Beralih ke **Fixed amount** memungkinkan mereka memasukkan ambang batas dan jumlahnya. Mematikan sakelar akan menghentikan penagihan. ![Pengaturan penagihan pelanggan dengan pengisian otomatis dalam mode By usage dan riwayat pengisian otomatis terbaru](https://nexcmp.com/id/docs/images/billing/auto-top-up-02-portal.webp) ## Verifikasi {#verify} 1. Sebagai pelanggan uji, lakukan pengisian saldo pertama dengan kartu uji ([Stripe](https://nexcmp.com/id/docs/billing/stripe/#verify)). Buka **Billing › Settings**: pengisian otomatis dalam keadaan aktif. 2. Jalankan VM kecil agar ada penggunaan, dan kurangi saldo di bawah ambang batas (misalnya dengan **Customers › customer › Credit / debit**). 3. Dalam waktu sekitar 5 menit, penagihan akan dilakukan. Pada kartu **Overview › Payment** milik pelanggan, **Auto top-up history** menunjukkan percobaan dengan status *Done*, dan notifikasi *Top-up received* dikirimkan. ## Batas & catatan {#limits-notes} - **Satu tagihan per penurunan.** Setelah penagihan, job menunggu hingga saldo kembali di atas ambang batas atau waktu tunggu berakhir: 1 jam setelah berhasil, 24 jam setelah tagihan tertunda, 30 menit setelah error sistem. - **Batas harian.** Ketika salah satu batas harian tercapai, tidak ada penagihan yang dilakukan dan baris *Daily limit reached* dicatat (paling sering sekali setiap 6 jam). - **Kegagalan.** Kartu yang ditolak, kartu kedaluwarsa, atau saldo tidak mencukupi dihitung sebagai kegagalan kartu. Job mencoba kembali setelah 1 jam, lalu 6 jam, lalu 24 jam. **Setelah 3 kegagalan kartu berturut-turut, auto top-up dinonaktifkan** dan pelanggan akan diberi tahu (*Auto top-up failed*). Pembayaran yang memerlukan konfirmasi pelanggan (misalnya 3-D Secure) tidak dihitung sebagai kegagalan; pelanggan diminta untuk mengonfirmasinya. - **Tidak ada penagihan ganda.** Setiap tagihan diklaim secara atomik per penurunan di bawah ambang batas dan menggunakan idempotency key di gateway. - **Menghapus kartu** akan menonaktifkan auto top-up. - **Reseller.** Jika reseller menggunakan saluran pembayarannya sendiri, pelanggan tidak dapat mengaktifkan auto top-up (HTTP 403 `feature_disabled`). ## Pemecahan Masalah {#troubleshooting} | Gejala | Penyebab | Solusi | |---|---|---| | Pelanggan tidak dapat mengaktifkannya: "Top up once with a card or PayPal" | Tidak ada metode tersimpan | Lakukan top-up kartu atau PayPal satu kali terlebih dahulu. | | Error `no_card` (422) | Gateway yang dipilih tidak memiliki metode tersimpan | Pilih gateway yang memilikinya, atau simpan metode. | | Error `invalid_argument` pada nominal | Mode tetap di luar rentang yang diizinkan | Ambang batas $1–$500, nominal antara minimum top-up dan $1,000, nominal lebih besar dari ambang batas. | | Tidak ada penagihan meskipun saldo rendah | Sakelar global nonaktif, tidak ada layanan berjalan dalam mode By usage, batas harian tercapai, atau penagihan sebelumnya masih menunggu | Periksa sakelar, riwayat, dan batasnya. | | "N percobaan gagal berturut-turut — top-up otomatis nonaktif setelah 3 kali" | Kartu terus-menerus gagal | Pelanggan mengganti kartu dengan deposit baru. | | Status *Perlu konfirmasi Anda* | Bank memerlukan 3-D Secure | Pelanggan menyelesaikan satu kali top-up normal. | --- # Faktur dan buku besar {#invoices-and-ledger} > **Lokasi di admin:** Finance › Billing (`/billing`) dengan tab Overview, Transactions (`/billing/ledger`), Invoices (`/billing/invoices`), Top-ups (`/billing/deposits`), Payouts (`/billing/payouts`), Vouchers (`/billing/vouchers`), dan Reports (`/billing/reports`). **Lokasi di portal:** Billing (`/billing`). ## Fungsi {#what-it-does} Setiap nominal di NexCMP disimpan sebagai sen USD dan dicatat satu kali. Konsep utamanya: **wallet ledger** adalah acuan utama untuk saldo; invoice, pembayaran top-up, dan laporan merupakan tampilan yang dibangun darinya. Ledger ini bersifat **append-only** — kesalahan diperbaiki dengan menambahkan entri pembalik, bukan dengan mengedit riwayat. ## Persyaratan {#requirements} | Item | Persyaratan | |---|---| | Role | Seorang administrator. | | Detail penjual | Atur nama resmi, ID pajak, alamat, email kontak, dan prefiks nomor invoice di **System › Settings › General**, tab **Seller & invoicing** (`/settings?tab=seller`), kartu **Seller details (printed on invoices)**. | | Dependensi | [Payment channels](https://nexcmp.com/id/docs/billing/payment-channels/) untuk dana masuk. | ## Komponen {#the-pieces} | Tab admin | Yang dicantumkan | Penggunaan tipikal | |---|---|---| | **Overview** | Pendapatan hari ini dan bulan ini, total buku besar berdasarkan jenis (deposit, biaya, pengembalian dana, penyesuaian, voucher), faktur berdasarkan status, pengembalian dana tertunda, pintasan, pengeluaran per layanan dalam 30 hari terakhir | Pemeriksaan harian | | **Transactions** | Buku besar dompet, satu baris per mutasi | Menjelaskan saldo pelanggan | | **Invoices** | Faktur, dan tampilan kedua **Orders** yang memuat setiap pembelian dari setiap layanan | Mencari dokumen, mengirim ulang, menandai lunas | | **Top-ups** | Pembayaran yang diterima melalui gateway | Memeriksa pembayaran, mengembalikan dana | | **Payouts** | Pengembalian dana kartu, pembayaran afiliasi, penarikan reseller | Menyetujui pengeluaran uang | | **Vouchers** | Kode top-up | Lihat [Promotions](https://nexcmp.com/id/docs/billing/promotions/) | | **Reports** | Pendapatan, berdasarkan layanan, berdasarkan reseller | Akuntansi | ### Transactions (buku besar) {#transactions-ledger} Kolom: waktu, pelanggan, **jenis**, layanan, jumlah (bertanda), VM, referensi, aktor, catatan. Filter: jenis, layanan, ID pelanggan, situs (jika Anda memiliki reseller), rentang tanggal, dan tautan VM. | Jenis | Arti | |---|---| | `deposit` | Top-up dari gateway | | `charge` | Uang yang diambil untuk layanan (pesanan, pembaruan, penggunaan per jam ...) | | `refund` | Uang yang dikembalikan ke dompet | | `adjust` | Kredit atau debit administrator, serta kode top-up (referensi dimulai dengan `vch:`) — ikhtisar menampilkan voucher sebagai baris tersendiri | Setiap baris memiliki referensi seperti `dep:stripe:`; referensi yang sama tidak pernah dapat ditulis dua kali, itulah sebabnya webhook yang berulang tidak dapat memberikan kredit dua kali. Gunakan **Customers › List › customer › Credit / debit** untuk menambahkan penyesuaian manual: alasan wajib diisi, jumlah positif juga berupaya membuka kunci VM yang dikunci karena kurangnya dana, dan tindakan dikonfirmasi dalam dua langkah. ![Tab Transactions yang menampilkan baris buku besar dompet dengan jenis, layanan, jumlah, dan referensi](https://nexcmp.com/id/docs/images/billing/invoices-and-ledger-01-ledger.webp) ### Invoices {#invoices} Faktur dibuat secara otomatis saat pelanggan membeli atau memperbarui sesuatu yang dibayar dari dompet, atau untuk top-up. Format nomor tampak seperti `-<000001>` (misalnya `NX202610-000042`); situs reseller menggunakan awalan dan urutannya sendiri. Nomor yang ada tidak pernah berubah saat Anda mengubah awalan. | Kolom | Nilai | |---|---| | Jenis | Receipt, Renewal, Top-up, Manual, Refund | | Status | Unpaid, Paid, Overdue, Cancelled, Refunded | Tindakan pada baris: | Action | Efek | |---|---| | **View** / **Print** | Membuka faktur; portal juga dapat mencetak atau menyimpan sebagai PDF. | | **Mark paid** (hanya untuk belum dibayar atau lewat waktu) | Menandainya sebagai lunas **tanpa memindahkan uang dompet** — gunakan saat pelanggan membayar Anda di luar NexCMP. Alasan wajib diisi. Untuk faktur pembaruan, ini juga memperpanjang dan membuka kunci VM yang dikunci. | | **Cancel** (hanya untuk belum dibayar atau lewat waktu) | Membatalkan faktur. Alasan wajib diisi. | | **Resend** | Mengirim ulang faktur melalui email. | **Create manual invoice** (tombol di bagian atas tab): ID pelanggan, 1 hingga 50 baris (deskripsi, jumlah, harga satuan), ID VM opsional, tenggat hari opsional (0 hingga 365, default 7), catatan opsional. Dibuat dengan status unpaid; pelanggan dapat melihatnya di **Billing › Invoice History**. Invoice layanan yang belum dibayar akan **dilunasi secara otomatis dari wallet** begitu dana tersedia, sehingga tindakan pelanggan cukup melakukan top-up. ### Top-up (pembayaran) {#top-ups-payments} Satu baris per percobaan: waktu, pelanggan, **gateway dan metode**, jenis (top-up atau auto top-up), status (pending, completed, failed, refunded, disputed, canceled), jumlah yang dibayar pelanggan, fee, jumlah yang masuk ke wallet, referensi gateway, dan waktu penyelesaian. Pembayaran Stripe dan PayPal yang berstatus completed memiliki tindakan **Refund**. Gunakan halaman Gateway events untuk melihat webhook ([Payment channels](https://nexcmp.com/id/docs/billing/payment-channels/)). ### Payouts {#payouts} Tiga sub-tab: **Card refunds** (setujui atau tolak permintaan refund; permintaan dibuat dari pembayaran yang telah selesai), **Affiliate payouts** (penarikan komisi), dan **Reseller withdrawals**. Setiap keputusan diaudit. ### Reports {#reports} **Revenue** (tren 30 hari, bulan ke bulan, pelanggan teratas), **By service**, dan **By reseller**. ![Tab Reports yang menampilkan KPI revenue dan tren tiga puluh hari](https://nexcmp.com/id/docs/images/billing/invoices-and-ledger-03-reports.webp) ## Tampilan pelanggan {#what-the-customer-sees} Di **Billing** pelanggan memiliki **Balance**, **Deposit**, **Redeem code**, **Settings** (auto top-up), dan riwayat dengan tab **Invoice History**, **Payment Order**, **Ledger**, serta **Orders** (semua layanan dalam satu daftar dengan filter berdasarkan layanan dan tipe). Setiap invoice memiliki **View**, **Print**, dan **Save as PDF**; nominal dalam USD, secara opsional ditampilkan dalam mata uang tampilan. ## Verifikasi {#verify} 1. Lakukan top-up kecil sebagai pelanggan uji coba. 2. **Transactions** menampilkan baris `deposit`, **Top-ups** menampilkan pembayaran sebagai *Completed*, dan revenue **Overview** bertambah. 3. Beli sesuatu: baris `charge` muncul, dan **Invoices** menampilkan invoice *Receipt* atau *Renewal* dengan detail penjual yang telah Anda konfigurasikan. ## Batas & catatan {#limits-notes} - **Append-only.** Tidak ada cara untuk mengedit atau menghapus baris ledger; tambahkan penyesuaian beserta alasannya. - **Mata uang.** Nominal dalam USD; mata uang tampilan bersifat kosmetik (lihat [Mata uang dan nilai tukar](https://nexcmp.com/id/docs/catalog/currency-and-exchange-rates/)). - **Refund to card** memerlukan dua langkah (permintaan, lalu persetujuan di bawah Payouts); USDT dan transfer bank tidak dikembalikan ke sumber asal. - **Semua hal diaudit** di bawah System › Logs › Admin actions beserta alasan yang Anda masukkan. - **Orders vs invoices.** Penggunaan per jam tidak ditagih per jam; tampilan Orders mengelompokkannya per hari agar Anda tetap dapat melihatnya. ## Pemecahan Masalah {#troubleshooting} | Gejala | Penyebab | Solusi | |---|---|---| | Saldo pelanggan tampak keliru | Biaya, adjustment, atau voucher yang tidak Anda duga | Filter **Transactions** berdasarkan ID pelanggan lalu periksa referensi dan catatannya. | | "Tagihan sudah dibayar" (409) | Tandai dibayar pada tagihan yang sudah dibayar | Tidak ada yang perlu dilakukan. | | Tidak dapat membatalkan tagihan | Hanya tagihan yang belum dibayar atau sudah jatuh tempo yang dapat dibatalkan | Untuk tagihan yang sudah dibayar, gunakan pengembalian dana atau penyesuaian. | | Detail penjual tidak ada pada tagihan | Belum diisi | Lengkapi **Seller details** di System › Settings › General › Seller & invoicing. | | Kartu kredit / debit ditolak | Jumlah bernilai nol atau lebih dari $100,000 | Gunakan jumlah antara 1 sen dan $100,000. | | Pembayaran menampilkan status *Pending* untuk waktu yang lama | Webhook tidak ada | Lihat **Gateway events** dan lakukan pemutaran ulang (replay). | --- # Promosi {#promotions} > **Di mana letaknya di admin:** Finance › Billing › Vouchers (`/billing/vouchers`). **Di mana letaknya di portal:** Billing › Redeem code (juga di dalam laci Deposit). ## Fungsi {#what-it-does} **Kode isi ulang** (voucher) adalah rahasia sekali pakai yang Anda berikan kepada pelanggan. Bergantung pada cara Anda membuatnya, kode ini dapat: | Jenis | Yang didapat pelanggan | Kemana nilai tersebut masuk | |---|---|---| | **Bonus credit** untuk semua layanan | Uang ditambahkan ke dompet | Saldo dompet. Dapat digunakan untuk apa saja. | | **Bonus credit** untuk layanan pilihan | Kredit layanan | Kantong terpisah yang hanya dapat membayar layanan tersebut. | | **Discount %** | Potongan persentase dari pesanan pertama layanan pilihan | Tidak ada kredit yang dikreditkan; diskon diterapkan saat pembayaran. | Gunakan untuk kampanye, kredit permohonan maaf, penawaran mitra, atau diskon pesanan pertama. ## Persyaratan {#requirements} | Item | Persyaratan | |---|---| | Role | Seorang administrator. | | Pelanggan | Pelanggan menukarkan kode saat masuk ke portal (bukan sebagai tamu). Secara default, pelanggan harus memiliki email yang terverifikasi. | | Kode VND | Kode yang dibuat dalam VND dikonversi ke USD saat penukaran menggunakan nilai tukar yang disimpan (lihat [Currency and exchange rates](https://nexcmp.com/id/docs/catalog/currency-and-exchange-rates/)). | ## Membuat batch {#create-a-batch} 1. Buka **Finance › Billing › Vouchers** dan klik **Create vouchers**. 2. Isi formulir. Contoh nilai berada di dalam kurung siku. | Kolom | Catatan | |---|---| | Nama batch | 1–80 karakter (`Spring welcome`). | | Target | **Main site clients**, **Single reseller's customers** (memerlukan daftar pelanggan) atau **Reseller wallet**. | | Pengguna yang memenuhi syarat | **All in target audience** atau **Specified** — satu email atau ID pelanggan per baris, hingga 1,000. Untuk pelanggan reseller harus *Specified*. | | 1 kode per target | Dengan *Specified*, membuat satu kode per pelanggan yang terdaftar. | | Jenis kode | **Bonus credit** atau **Discount %**. | | Berlaku untuk | Pilih satu atau beberapa layanan; kosong = **All services**. | | Mata uang, Nilai nominal | USD mulai dari $1.00, atau VND mulai dari 10,000 dalam kelipatan 1,000 (hanya kredit bonus). | | Diskon (%) | 1 hingga 100 (khusus Diskon %). | | Batas diskon maksimum (USD) | Diperlukan untuk Diskon %, mulai dari $1.00. Ini juga merupakan jumlah maksimum yang dapat Anda kurangi per penukaran. | | Pesanan minimum (USD) | `0` = tidak ada. Pesanan pertama harus minimal sebesar jumlah ini. | | Jumlah kode | 1 hingga 1,000 kode acak. | | Penggunaan per kode | 1 hingga 100,000. `1` berarti satu orang per kode; tingkatkan untuk kode bersama. | | Maks. penggunaan per akun | Minimal 1. Untuk % Diskon harus `1`. | | Waktu mulai (opsional), Kedaluwarsa | Masa kedaluwarsa harus setelah hari ini dan setelah waktu mulai, maksimal 2 tahun ke depan. | | Prefiks kode (0–6 kar) | Hanya huruf; kosong berarti menggunakan prefiks situs. | | Kode kustom (hanya jika jumlah = 1) | 6 hingga 32 karakter A–Z dan 0–9. Mudah dibagikan tetapi mudah ditebak: batasi penggunaannya. | | Wajibkan email terverifikasi | Aktif secara default. | | Catatan internal, Alasan | Alasan wajib diisi dan dicatat dalam log audit. | 3. Formulir menampilkan **Maksimum eksposur** (nilai nominal x kode x penggunaan) sehingga Anda tahu risiko terburuknya. Klik **Generate codes**. 4. **Salin kode sekarang.** Kode hanya ditampilkan sekali: NexCMP hanya menyimpan hash dan 4 karakter terakhir. Gunakan **Copy all** atau **Download CSV**, centang konfirmasi, lalu tutup kotak. ## Cara kerja setiap jenis {#how-each-type-behaves} ### Bonus dompet (tidak ada layanan yang dipilih) {#wallet-bonus-no-service-selected} Dompet akan dikreditkan dengan entri **penyesuaian** (referensi `vch:...`). Tidak dapat dikembalikan ke kartu, tidak menghasilkan komisi afiliasi, tidak membuat faktur, dan dihitung sebagai saldo dompet untuk kuota. Kode VND menggunakan kurs pada saat penukaran. ### Kredit layanan (layanan dipilih) {#service-credit-services-selected} - Kredit tersimpan di **kantong terpisah**, hanya dapat membayar tagihan layanan yang dipilih (pesanan baru, perpanjangan, biaya per jam atau harian, peningkatan) dan digunakan **sebelum** dompet. - Tidak dapat ditarik, ditransfer, atau diuangkan, serta kedaluwarsa bersama kodenya. - Buku besar menunjukkan total tagihan ditambah baris kredit yang sesuai, sehingga pendapatan per layanan tetap akurat sementara dompet hanya berkurang sebesar yang benar-benar dibayar oleh pelanggan. - Ini **tidak** menaikkan tingkat [quota](https://nexcmp.com/id/docs/billing/quotas/) dan diabaikan oleh [auto top-up](https://nexcmp.com/id/docs/billing/auto-top-up/). - Jika tagihan yang dibayar dengan kredit atau diskon dikembalikan, bagian yang dibayar oleh kode akan diambil kembali dari pengembalian dana dompet dan dikembalikan ke kantong kredit. ### % Diskon {#discount} 1. Pelanggan memasukkan kode: kode tersebut menjadi **aktif**. Kode persentase hanya dapat digunakan sekali per akun. 2. **Tagihan pertama** dari layanan terpilih yang bukan merupakan biaya per jam, dan setidaknya mencapai **Minimum order**, didiskon berdasarkan persentase, tidak pernah melebihi **Maximum discount cap**. 3. Diskon dihitung ulang oleh server pada saat penagihan; jumlah di peramban diabaikan. Baris penukaran dicatat saat kode benar-benar digunakan, beserta diskon aktualnya. 4. Biaya penggunaan per jam tidak pernah menggunakan kode. ## Tindakan pelanggan {#what-the-customer-does} 1. Buka **Billing** di portal lalu klik **Redeem code**, atau gunakan **Have a top-up code?** di laci Deposit. 2. Ketik kode (tidak sensitif huruf besar-kecil; tanda hubung opsional) dan klik **Check**. Portal akan menampilkan informasi benefitnya, misalnya *Valid code: +$5.00*, *$5.00 credit for VPN* atau *20% off voucher for Virtual Machines (up to $5.00)*, dan *Valid for orders from $10.00*. 3. Klik **Redeem** dan konfirmasi. Setiap kode dapat digunakan sekali per akun. Kode terikat pada situs: kode dari satu situs "tidak valid" di situs lain, tanpa petunjuk apa pun bahwa kode tersebut ada di tempat lain. Tebakan yang salah akan dibatasi dan, setelah beberapa kali percobaan, akun akan dikunci selama beberapa menit ("N attempts left before a temporary lock"). ## Lacak dan hentikan {#track-and-stop} - **Batches** mencantumkan setiap batch beserta statusnya (*active*, *disabled*, *expired*, *used up*), jumlah penukaran, dan eksposur. Buka batch untuk melihat tab **Codes** (disamarkan) dan **Redemptions**, serta **Export CSV**. - **Redemptions** mencantumkan setiap penukaran di semua batch; **Reseller quotas** menunjukkan seberapa banyak batas penerbitan bulanan setiap reseller yang telah digunakan; **Settings** mengaktifkan atau menonaktifkan kode reseller dan menetapkan batas bulanan default. - **Disable batch** menghentikan semua kode yang belum digunakan; penukaran yang sudah dilakukan tetap berlaku. Satu kode tunggal juga dapat dinonaktifkan. ## Verifikasi {#verify} 1. Buat batch berisi 1 kode: Discount % 20, batasan (cap) $5, pesanan minimum $10, layanan Virtual Machines. 2. Sebagai pelanggan uji coba, tukarkan kode tersebut. Portal menyatakan kode berhasil diaktifkan. 3. Pesan VM yang berharga setidaknya $10 (siklus bulanan): tagihan menunjukkan diskon (maksimal $5). 4. Di dalam batch, kode tersebut menunjukkan 1 kali penukaran dengan diskon riil. ## Batas & catatan {#limits-notes} - Kode terikat pada **audience** dan **site** saat pembuatan; kode tidak dapat dipindahkan setelahnya. - Reseller dapat menerbitkan kode untuk pelanggan mereka sendiri dalam batas eksposur bulanan; lihat [Resellers](https://nexcmp.com/id/docs/customers/resellers/). - Slide promo sidebar untuk pelanggan (**Marketing › Promo slides**) adalah fitur terpisah dan tidak memberikan diskon apa pun. - Karena kode dalam teks biasa tidak pernah disimpan, batch yang hilang tidak dapat dipulihkan: nonaktifkan dan buat yang baru. ## Pemecahan Masalah {#troubleshooting} | Gejala | Penyebab | Solusi | |---|---|---| | "Kode persen: satu penggunaan per akun" (`percent_one_per_account`) | Batas penggunaan maksimum per akaun di atas 1 untuk Discount % | Atur ke `1`. | | Formulir menyatakan bahwa batasan (cap) wajib diisi | Discount % tanpa Maximum discount cap | Masukkan setidaknya $1.00. | | Pelanggan tidak ditemukan | Email atau ID dalam daftar tidak ada | Perbaiki daftar tersebut (pesan error menyebutkan entri yang tidak dikenal). | | Pelanggan mengatakan "kode tidak valid" | Salah situs, kedaluwarsa, dinonaktifkan, habis, bukan pelanggan target, atau email belum diverifikasi | Periksa batch dan pelanggan tersebut. | | Kredit tidak digunakan | Biaya tersebut milik layanan lain | Kredit hanya membayar layanan yang dipilih pada batch. | | Diskon tidak diterapkan | Pesanan di bawah minimum, biaya per jam, atau kode diaktifkan untuk layanan lain | Buat pesanan pertama yang memenuhi syarat. | | Pelanggan terkunci dari penukaran | Terlalu banyak percobaan yang salah | Tunggu hingga penguncian berakhir. | --- # Quotas {#quotas} > **Di mana di admin:** Services › Virtual Machines › Policy › Quota tab (`/vm/policy?tab=quota`). Per pelanggan: Customers › List › a customer › Overview (`/customers/`), kartu **Quota**. **Di mana di portal:** Client › Quotas (`/client/quotas`). ## Fungsi {#what-it-does} Kuota melindungi Anda dari penyalahgunaan oleh akun baru: semakin banyak uang nyata yang dimasukkan pelanggan ke dalam dompet, semakin banyak sumber daya yang dapat mereka buat. Ada dua lapisan: - **Sumber daya VM dan Kubernetes**: total vCPU, RAM, dan disk, serta jumlah VM. Tingkatan adalah paket tetap Anda. - **Kuota layanan**: berapa banyak IP, kluster, VPC, GB penyimpanan, dan sebagainya, dalam lima tingkatan (L0 hingga L4) yang didorong oleh uang yang disetorkan. Kuota diperiksa **sebelum** apa pun dibebankan. Permintaan yang melebihi batas akan ditolak dengan HTTP 403 `quota_exceeded` dan pesan yang memberi tahu pelanggan berapa banyak yang harus diisi ulang. ## Persyaratan {#requirements} | Item | Persyaratan | |---|---| | Role | Seorang administrator. | | Switch | **Enable quota** (`quota_enabled`) secara default adalah **off**. Tidak ada hal di bawah ini yang berlaku sampai Anda mengaktifkannya. | | Paket tetap | Setidaknya satu paket non-kustom (lihat [Plans](https://nexcmp.com/id/docs/catalog/plans/)) — tingkat sumber daya adalah paket tetap Anda. Tanpa paket apa pun, hanya aturan jumlah VM yang berlaku. | | Dependensi | Baris kuota layanan hanya ada untuk produk yang diaktifkan di instalasi Anda (VPN, proksi IPv6, Kubernetes, Private Cloud, Images, Object Storage, Dedicated). | ## Bagaimana basis dihitung {#how-the-basis-is-calculated} NexCMP tidak melihat pembayaran kartu saja. **Basis** adalah **saldo dompet yang dibukukan** pelanggan: top-up gateway, kredit administrator (**Credit / debit**), dan voucher dompet yang ditukarkan semuanya dihitung sekali, melalui buku besar dompet. Diskon pesanan dan kredit layanan dari kode promosi bukanlah uang dompet dan tidak dihitung. Basis tertinggi yang pernah dicapai pelanggan **disimpan** (per situs) — pengeluaran atau pengembalian dana tidak akan pernah menurunkan tingkat yang sudah terbuka. ### Sumber daya VM dan Kubernetes {#vm-and-kubernetes-resources} 1. Tingkatan adalah paket tetap situs, diurutkan berdasarkan biaya menjalankannya selama 24 jam. 2. Pelanggan berada pada tingkat tertinggi yang biaya 24 jamnya tidak melebihi basis mereka. Batasannya adalah vCPU, RAM, dan disk paket tersebut. Pelanggan yang bahkan tidak mampu membeli paket termurah tetap mendapatkan sumber daya paket termurah. 3. Penggunaan yang dihitung terhadap batas adalah setiap VM yang aktif (termasuk yang terkunci), volume data yang dibeli (bahkan saat dilepas), serta worker dan control plane Kubernetes (worker juga dihitung sebagai VM). 4. **Jumlah VM:** hingga **Max VMs at 24h tier** (default 2). Mulai VM berikutnya dan seterusnya, saldo dompet *saat ini* milik pelanggan harus mencakup **30 hari (720 jam)** dari semua VM mereka yang sudah ada ditambah yang baru, hingga **Max VMs when meeting 30-day threshold** (default 10). 5. **Membuat VM** juga memerlukan saldo minimal **N jam** dari VM tersebut (**Create VM: balance ≥ N hours**, default 2) dan saldo minimum platform. 6. Pembuatan VM yang lebih kecil tidak pernah diblokir. Hanya dimensi yang bertambah yang diperiksa, sehingga pelanggan yang berada di atas batas disk tetap dapat menambahkan vCPU jika batas vCPU mengizinkan. ## Konfigurasi {#configure} 1. Buka **Services › Virtual Machines › Policy** dan pilih tab **Quota**. 2. Aktifkan **Enable quota**. 3. Tinjau tiga angka (semuanya dapat diedit): | Kolom | Default | Rentang | |---|---|---| | Buat VM: saldo ≥ N jam | 2 | 1 hingga 720 | | Max VMs at 24h tier | 2 | 1 hingga 100 | | Maks VM saat memenuhi ambang 30 hari | 10 | 1 hingga 1000 (tidak boleh di bawah bidang sebelumnya) | 4. Dalam **Tier-based service quotas** sunting tabel (di bawah). 5. Klik **Save**. NexCMP akan meminta **reason**, yang dicatat ke log audit beserta nilai lama dan baru. Perubahan ini berlaku untuk semua pelanggan. ![Tab Quota dengan tombol pengaktifan, batas VM, dan tabel kuota layanan berbasis tier](https://nexcmp.com/id/docs/images/billing/quotas-01-policy.webp) ### Tabel kuota layanan {#service-quota-table} Tabel ini memiliki lima tier. Sel header **L0** hingga **L4** memuat **ambang batas deposit dalam sen**: nilai default `0, 1000, 5000, 20000, 100000` berarti L0 untuk akun baru, L1 mulai dari $10, L2 mulai dari $50, L3 mulai dari $200, dan L4 mulai dari $1,000. Ambang batas pertama harus tetap `0`. Setiap baris menetapkan kuota satu kunci per tier; **-1 berarti tidak terbatas**. | Kunci | Arti | L0 | L1 | L2 | L3 | L4 | |---|---|---|---|---|---|---| | `vpn.ips` | IP VPN | 2 | 10 | 30 | 100 | 500 | | `proxy6.ips` | IP proksi IPv6 | 500 | 2000 | 10000 | 50000 | -1 | | `dedicated.servers` | Server bare-metal | 1 | 2 | 5 | 20 | 50 | | `s3.storage_gb` | GB Object Storage yang dialokasikan | 2048 | 4096 | 10240 | 51200 | -1 | | `k8s.clusters` | Kluster Kubernetes | 1 | 2 | 5 | 10 | 30 | | `k8s.workers` | Node pekerja Kubernetes | 3 | 9 | 18 | 50 | 200 | | `vpc.count` | Jaringan Private Cloud | 1 | 2 | 5 | 10 | 30 | | `images.gb` | GB penyimpanan gambar kustom | 50 | 100 | 200 | 500 | 2000 | Tabel ini juga mencantumkan beberapa baris untuk produk yang bukan bagian dari rilis ini; biarkan tidak berubah. Kunci yang produknya dinonaktifkan akan disembunyikan dan tidak pernah ditegakkan. Nilai harus berupa `-1` atau antara `0` dan `10,000,000`. Kuota layanan mengikuti **dasar dana**, seperti tingkat VM: saldo dompet tertinggi yang dicapai, bukan total pembayaran kartu. Pelanggan reseller menggunakan default yang sama dan reseller hanya dapat melihatnya. ## Penggantian per pelanggan {#per-customer-overrides} 1. Buka **Customers › List**, lalu pilih pelanggan tersebut. Di **Overview** temukan kartu **Quota**. 2. **Sumber daya VM:** klik **Quota override** dan pilih salah satu dari - **Berdasarkan saldo top-up (hapus penggantian)** — perilaku default; - **Tak terbatas (termasuk jumlah VM)** — menghapus setiap batasan untuk pelanggan ini; - **tingkat paket (plan tier)** — menetapkan batas atas sumber daya ke paket tersebut; aturan jumlah VM tetap berlaku. Masukkan alasan. Administrator platform dapat menetapkan tingkat apa pun; penggantian yang ditetapkan oleh reseller tidak dapat melebihi basis tertahan pelanggan. 3. **Layanan:** tabel di bawah *Service quotas* menunjukkan setiap kunci dengan *In use*, batas efektif, dan *Source*-nya (tingkat atau penggantian). Klik **Edit** pada sebuah baris, ketik **New quota** (`-1` = tak terbatas, kosong = kembali ke default tingkat) dan alasannya. ![Kartu Customer Quota dengan tier, penggunaan sumber daya, dan tabel kuota layanan dengan override](https://nexcmp.com/id/docs/images/billing/quotas-02-customer.webp) Setiap penggantian dicatat dalam log audit beserta administrator, alasan, dan nilai sebelum/sesudah. ## Tampilan pelanggan {#what-the-customer-sees} **Client › Quotas** (`/client/quotas`) menampilkan **tier saat ini** pelanggan, jumlah vCPU, RAM, disk, dan VM yang digunakan serta total (dibagi antara VM dan Kubernetes), **saldo dompet yang memenuhi syarat**, **dasar sumber daya yang ditahan** (tidak berkurang saat mereka membelanjakan), dan jumlah yang harus diisi ulang untuk tier berikutnya. Sebuah penggeser memungkinkan mereka memilih tier target dan langsung menuju ke layar deposit. Kartu **Service Quotas** mencantumkan setiap layanan beserta kuota, jumlah yang digunakan, tier mereka (L0 hingga L4), berapa banyak lagi yang harus didepositkan untuk tier berikutnya, dan tombol **Request increase** yang membuka draf tiket dukungan. Tombol **Quota policy** menjelaskan aturan-aturannya. ![Halaman Quota Portal dengan tier saat ini, penggunaan sumber daya, dan kuota layanan](https://nexcmp.com/id/docs/images/billing/quotas-03-portal.webp) ## Verifikasi {#verify} 1. Aktifkan **Enable quota** dan gunakan pelanggan uji baru dengan saldo $0. 2. Coba buat VM yang lebih besar dari paket termurah Anda. Permintaan ditolak dengan `quota_exceeded` dan pesan "Exceeds the resources of tier ... Top up $X more to unlock tier ...". 3. Isi ulang jumlah yang ditampilkan. Tier akan langsung berubah dan permintaan yang sama berhasil. 4. Beli IP VPN di atas batas L0: HTTP 403 `quota_exceeded` dengan `"scope":"service"` dan tautan ke `/client/quotas`. 5. Di kartu Quota pelanggan, **Source** menampilkan *tier*; tetapkan penggantian dan lihat perubahannya menjadi *override*. ## Batas & catatan {#limits-notes} - **Nonaktif berarti nonaktif.** Dengan `quota_enabled` nonaktif, aturan lama `new_account_max_vms` (**Services › Virtual Machines › Policy › Sales**) membatasi akun baru pada 2 VM hingga deposit mereka mencapai $10. Saat kuota aktif, aturan tersebut tidak lagi berlaku. - **VM yang dibuat admin tidak diblokir.** - **Galeri gagal dalam keadaan tertutup.** Jika status kuota tidak dapat dibaca, permintaan ditolak dengan `quota_unavailable` alih-alih diizinkan. - **Permintaan API, CLI, dan MCP** menggunakan handler yang sama, sehingga batasan yang sama berlaku. - **Kredit promosi** tidak menaikkan tingkat (lihat [Promotions](https://nexcmp.com/id/docs/billing/promotions/)). - **Ambang batas tingkat adalah sen**, bukan dolar. ## Pemecahan Masalah {#troubleshooting} | Gejala | Penyebab | Solusi | |---|---|---| | `quota_exceeded`, alasan `resources` | Total vCPU/RAM/disk baru berada di atas tingkat | Lakukan top up sejumlah nominal dalam pesan atau tetapkan pengesampingan. | | `quota_exceeded`, alasan `vm_30d` | Melebihi jumlah VM tingkat 24j dan dompet belum mencakup 30 hari penggunaan armada | Lakukan top up sejumlah nominal yang ditampilkan. | | `quota_exceeded`, alasan `vm_max` | Batas maksimum VM mutlak tercapai | Naikkan **Max VMs when meeting 30-day threshold** atau gunakan pengesampingan. | | `quota_exceeded`, `scope: service` | Batasan per layanan tercapai | Naikkan nilai tabel atau kesampingkan kunci tersebut untuk pelanggan. | | `quota_unavailable` | Status kuota tidak dapat diverifikasi | Coba lagi; periksa log server jika masalah berlanjut. | | "quota_max_vms_30d must be >= quota_max_vms_24h" saat disimpan | Nilai terbalik | Buat angka 30 hari setidaknya sama dengan angka 24 jam. | | Pelanggan melaporkan tingkat turun | Tingkat tidak turun; bandingkan **Held resource basis** dengan biaya paket | Periksa daftar harga paket: kenaikan harga paket dapat mengubah ambang batas. | --- # Mengelola pelanggan {#managing-customers} > **Di admin:** Customers › Customers › List (`/customers`), Deletion requests (`/customers/requests`), Service transfers (`/customers/transfers`) dan API keys (`/customers/apikeys`). ## Fungsi {#what-it-does} Area Customers adalah tempat staf dukungan mencari akun, melihat dompet, layanan, tiket, dan riwayat masuk, serta mengambil tindakan: mengunci, membuka kunci, memverifikasi email, menyetel ulang kata sandi, menambah atau menghapus kredit, menyamar, membuat VM, atau menutup akun. ## Persyaratan {#requirements} | Item | Persyaratan | |---|---| | Role | Seorang administrator. Setiap tindakan tulis meminta alasan dan dicatat ke log audit (System › Logs › Admin actions). | | Email | Kata sandi baru dan email undangan memerlukan [SMTP configuration](https://nexcmp.com/id/docs/administration/smtp-and-emails/) yang berfungsi. | ## Daftar pelanggan {#the-customer-list} Buka **Customers › List**. Pelanggan adalah akun dari situs utama Anda; akun dari reseller juga akan muncul dan dapat difilter berdasarkan situs. ![Daftar pelanggan dengan filter serta kolom negara, sumber rujukan, saldo, dan jumlah VM](https://nexcmp.com/id/docs/images/customers/managing-customers-01-list.webp) | Kolom | Arti | |---|---| | **Email** (dan nama) | Klik untuk membuka pelanggan. | | **State** | *Active*, *Locked*, atau *Deleted*, ditambah email *verified* atau *unverified*. Arahkan kursor ke tag kunci untuk membaca alasannya. | | **Login** | Metode masuk yang dimiliki pelanggan: kata sandi, Google, GitHub, passkey. | | **Country** | Bendera dan nama yang berasal dari **IP address**: negara dari IP pendaftaran, atau jika tidak diketahui, dari IP masuk terakhir. Tooltip menunjukkan mana yang digunakan. | | **Sumber rujukan** | *Referral* dengan tautan ke perujuk dan kode referensi saat pelanggan mendaftar melalui tautan afiliasi; jika tidak, "Not recorded". | | **Balance**, **VM** | Saldo dompet (nilai negatif berwarna merah) dan jumlah VM yang aktif. | | **IP terdaftar / terakhir** | IP yang digunakan saat pendaftaran dan saat masuk terakhir dengan negara dua huruf. Gunakan untuk mendeteksi beberapa akun dari satu alamat. | | **Tenant** | ID tenant internal pelanggan. | | **Dibuat**, **Login terakhir** | Waktu relatif. | | **Site** | Ditampilkan jika Anda memiliki reseller. | **Search** menerima e-mail, nama, atau IP. **Filters:** status (semua, aktif, dikunci, dihapus), metode login (apa pun, Google, GitHub, passkey, belum ada kata sandi) dan site. Filter disimpan di URL, sehingga daftar yang difilter dapat di-bookmark atau dibagikan kepada rekan kerja. **Penyortiran bersifat global.** Mengeklik header *Email*, *State*, *Balance*, *VMs*, *Created*, atau *Last login* menyortir **seluruh** basis data pelanggan di server, bukan hanya halaman yang sedang Anda lihat, dan nomor halaman akan kembali ke 1. **Daftar diperbarui secara otomatis.** Daftar disegarkan setiap beberapa detik saat Anda melihatnya (dijeda saat dialog terbuka atau saat Anda mengetik), sehingga pendaftaran baru dan perubahan saldo langsung muncul tanpa perlu memuat ulang halaman. Halaman pelanggan disegarkan sekitar setiap 30 detik saat terlihat; setiap tab memuat datanya sendiri saat pertama kali dibuka. ### Membuat pelanggan {#create-a-customer} 1. Klik **Create customer**. 2. Masukkan **e-mail**, **nama tampilan** opsional, **kata sandi** opsional (kosong = pelanggan menetapkannya melalui tautan undangan), dan pilih apakah akan **mengirim e-mail undangan**. 3. Konfirmasi. Akun yang dibuat secara manual dihitung sebagai terverifikasi saat Anda mengirim undangan. ## Halaman pelanggan {#a-customer-s-page} Klik sebuah baris. Halaman ini memiliki delapan tab; tab yang dipilih tersimpan di URL sehingga Anda dapat mem-bookmark-nya. Tab dimuat saat pertama kali dibuka dan mempertahankan statusnya saat Anda berpindah. | Tab | Konten | |---|---| | **Overview** | Identitas, informasi pendaftaran dan proses masuk terakhir, ringkasan dompet serta layanan | | **Services** | Satu tabel untuk layanan pelanggan, dengan filter tipe dan status, pencarian, pengurutan sisi server, serta paginasi | | **Billing** | Dompet dan kredit, buku besar, faktur, pembayaran, pengembalian dana, metode pembayaran tersimpan, dan auto top-up | | **Quota** | Batas dan penimpaan sumber daya; lihat [Quotas](https://nexcmp.com/id/docs/billing/quotas/) | | **Security** | Sesi, autentikasi, metode masuk, riwayat masuk, dan kunci API; lihat [API keys](https://nexcmp.com/id/docs/developers/api-keys/) | | **Support** | Tiket terbaru | | **Affiliate** | Status program referensi | | **Log** | Riwayat audit dan aktivitas | Tombol tindakan di header (disembunyikan untuk akun yang dihapus): | Tombol | Fungsi | |---|---| | **Lock account** / **Unlock** | Memblokir akses masuk dan API. Secara opsional juga menghentikan semua VM (tanpa menghapusnya). Layanan prabayar yang bukan VM (Kubernetes, Private Cloud, VPN, dan sebagainya) juga dihentikan. VM yang dikunci oleh administrator harus dibuka secara terpisah di halaman VM. | | **Verify email** | Menandai e-mail sebagai terverifikasi tanpa pelanggan harus mengeklik tautan. | | **Send reset link** | Mengirimkan tautan setel ulang kata sandi melalui email (berlaku 1 jam, sekali pakai). Jika SMTP tidak dikonfigurasi, tautan akan ditampilkan sekali agar Anda dapat mengirimkannya sendiri. Administrator tidak akan pernah melihat kata sandi tersebut. | | **Impersonate** | Masuk sebagai pelanggan selama satu jam. Lihat [Log in as a customer](https://nexcmp.com/id/docs/customers/login-as/). | | **Credit / debit** | Menambahkan atau menghapus dana dompet melalui penyesuaian buku besar. Lihat [Invoices and ledger](https://nexcmp.com/id/docs/billing/invoices-and-ledger/). | | **Revoke sessions** | Mengeluarkan pelanggan dari semua perangkat; token aplikasi berhenti berfungsi. | | **Create VM** | Membuat VM untuk pelanggan. | | **Soft delete** | Menutup akun. Anda harus mengetikkan alamat email untuk mengonfirmasi. | ### Mengelola layanan individual {#manage-an-individual-service} Buka tab **Services** pelanggan, temukan layanan berdasarkan nama, ID, IP, atau konfigurasi, lalu gunakan tindakan pada barisnya. Tindakan yang sama tersedia di daftar admin layanan itu sendiri. Kotak dialog hanya menawarkan tindakan yang didukung oleh layanan tersebut dan statusnya saat ini. | Action | Efek | |---|---| | **Lock** | Menghentikan layanan sambil tetap mempertahankan datanya. Pelanggan melihatnya terkunci dan tidak dapat mengoperasikannya. Melakukan top-up tidak menghapus penguncian administrator; perpanjangan otomatis diblokir saat terkunci. | | **Unlock** | Membatalkan penguncian administrator. Tindakan ini tidak menghapus penguncian akibat abuse yang tidak terkait atau penguncian perlindungan lainnya. | | **Cancel without refund** | Membatalkan layanan tanpa entri buku besar pengembalian dana. Konfirmasi memperingatkan bahwa pembatalan tidak dapat diurungkan. | | **Cancel and refund** | Menampilkan pembayaran asli, alokasi dompet/kreditnya, pengembalian dana sebelumnya, dan jumlah maksimum yang dapat dikembalikan. Tinjau jumlahnya sebelum mengonfirmasi. | Masukkan alasan untuk setiap tindakan. Alasan ini ditujukan bagi administrator; pelanggan menerima peristiwa layanan atau notifikasi netral. Dana dompet yang di-refund kembali ke dompet, dan alokasi kredit atau promosi kembali ke kredit. Tindakan ini tidak mengirim kembali uang melalui Stripe, transfer bank, atau PayPal. Untuk beberapa layanan dari jenis yang sama, pilih hingga 50 baris dan pilih tindakan massal. Hasilnya mencantumkan keberhasilan atau kegagalan untuk setiap baris. Refund massal menggunakan jumlah yang disarankan untuk masing-masing layanan; layanan dengan saran refund nol akan dilewati dalam mode refund dan memerlukan peninjauan individual atau pembatalan tanpa refund. DDoS Shield, disk, dan backups adalah baris read-only di sini. Add-on bandwidth mengikuti layanan induknya. Akses AI Models dapat dikunci, tetapi tidak memiliki langganan untuk dibatalkan. Untuk mengunci server Bare Metal yang disewa, lakukan tindakan pada langganannya, bukan pesanannya. ### Menutup akun (soft delete) {#closing-an-account-soft-delete} Akun diatur ke status *deleted*, diblokir, sesinya dicabut, dan komisi referensi yang belum dibayar dibatalkan. Faktur dan buku besar tetap disimpan untuk keperluan akuntansi. Tindakan ini ditolak jika pelanggan masih memiliki **layanan aktif apa pun** (VM, Kubernetes, Private Cloud, Dedicated, VPN, proxy IPv6), akun S3, atau penggunaan S3 yang belum diselesaikan. Hapus layanan tersebut terlebih dahulu. ## Permintaan penghapusan {#deletion-requests} Pelanggan dapat meminta penghapusan dari halaman akun mereka. Permintaan akan muncul di bawah **Customers › Deletion requests** (filter default: tertunda) beserta informasi pelanggan, alasan, jumlah VM aktif, saldo, dan waktu permintaan. - **Approve deletion** hanya dapat dilakukan jika pelanggan tidak memiliki VM aktif. Ketikkan email untuk mengonfirmasi. Akun akan dihapus secara soft-delete; **sisa saldo dompet tidak dikembalikan secara otomatis** — buat pengembalian dana terlebih dahulu jika Anda memiliki tanggungan. - **Reject** memerlukan alasan. ## Transfer layanan {#service-transfers} **Customers › Service transfers** mencantumkan permintaan untuk memindahkan **VM atau langganan VPN** dari satu akun ke akun lain **di situs yang sama**. - Layar ini bersifat hanya-baca-dan-buat: Anda dapat membuat permintaan atas nama pelanggan atau membatalkannya. Sengaja **tidak ada** tombol untuk menyetujuinya bagi pemilik maupun penerima. - Alur: pemilik mengonfirmasi melalui tautan email sekali pakai (berlaku 30 menit, dengan TOTP jika diaktifkan), kemudian penerima masuk dan menerima (penerima mengambil alih kewajiban pembayaran). Permintaan yang tidak diterima dalam waktu 7 hari akan kedaluwarsa. - Aturan: layanan harus aktif, tanpa faktur yang belum dibayar dan tanpa tugas yang berjalan; penerima harus menjadi pelanggan aktif dengan email terverifikasi di situs yang sama. Transfer VM akan menghapus kunci SSH dan mematikan perpanjangan otomatis; transfer VPN akan mengubah kata sandi koneksi. - Faktur yang sudah diterbitkan tetap berada di pemilik sebelumnya; pemilik baru dapat membaca riwayat penagihan layanan dengan data pemilik sebelumnya disembunyikan. - Pelanggan dapat membuat permintaan mereka sendiri di bawah **Transfers** di portal (maksimal 5 permintaan per jam dan 3 permintaan aktif dalam satu waktu). ## Verifikasi {#verify} 1. Buat pelanggan dengan email undangan. Akun baru akan muncul di bagian atas daftar dalam beberapa detik. 2. Urutkan berdasarkan **Balance**: urutan mencakup semua pelanggan. 3. Kunci pelanggan: tag status berubah menjadi *Locked* dan pelanggan tidak dapat lagi masuk. Buka kuncinya. ## Batas & catatan {#limits-notes} - Kolom negara adalah panduan berdasarkan IP, bukan bukti tempat tinggal. Alamat pribadi atau yang tidak diketahui tidak menampilkan negara. - Mengunci akun tidak mengembalikan apa pun dan tidak menghapus VM kecuali Anda juga memilih untuk menghentikannya. - Membuka kunci akun tidak membuka kunci VM yang dikunci oleh administrator; buka secara terpisah di halaman VM. ## Pemecahan Masalah {#troubleshooting} | Gejala | Penyebab | Solusi | |---|---|---| | "Pelanggan masih memiliki layanan aktif... hentikan/hapus terlebih dahulu" | Pelanggan memiliki layanan atau akun S3 | Hapus layanan tersebut, lalu lakukan soft delete. | | Persetujuan penghapusan mengatakan "N VM aktif" | Alasan yang sama | Hapus VM terlebih dahulu. | | Tautan setel ulang ditampilkan alih-alih "email dalam antrean" | SMTP belum dikonfigurasi | Konfigurasikan email, atau kirim tautan sendiri. | | Tidak dapat menghapus metode masuk (`last_login_method`) | Metode tersebut adalah satu-satunya cara pelanggan masuk | Tambahkan metode lain terlebih dahulu. | | Penguncian tidak menghentikan layanan prabayar | Galat penghentian dilaporkan | Baca pesan setelah penguncian; sistem mencoba ulang penghentian secara otomatis. | | Transfer tidak dapat dibuat | Tagihan belum dibayar, pekerjaan sedang berjalan, penerima di situs lain atau belum diverifikasi | Perbaiki kondisinya dan coba lagi. | --- # Masuk sebagai pelanggan {#log-in-as-a-customer} > **Lokasi di admin:** Customers › Customers › List › a customer › header button **Impersonate** (`/customers/`). ## Fungsi {#what-it-does} **Impersonate** (login-as) memungkinkan administrator dukungan melihat portal persis seperti yang dilihat oleh pelanggan, untuk mereproduksi masalah atau membantu pesanan. Sesi ini berlangsung selama satu jam dan dipisahkan secara jelas dari sesi normal: segala hal yang dapat memberikan akses permanen ke akun diblokir, dan setiap penggunaan dicatat. ## Persyaratan {#requirements} | Item | Persyaratan | |---|---| | Role | Administrator masuk ke konsol admin. | | Pelanggan | Akun harus **aktif**. Akun yang dikunci atau dihapus akan merespons "akun tidak aktif" (HTTP 409). | | Alasan | Alasan wajib diisi; ini akan dicatat ke log audit. | | Peramban | Izinkan pop-up untuk alamat admin: portal terbuka di jendela baru. | ## Langkah-langkah {#steps} 1. Buka **Customers › List** dan klik pelanggan tersebut. 2. Klik **Impersonate**. Sebuah dialog menjelaskan bahwa situs pelanggan akan dibuka sebagai pelanggan tersebut selama satu jam dan bahwa setiap tindakan diaudit. 3. Ketik **alasan** (misalnya "Tiket 1234 — tidak dapat membuat VM") dan klik **Open app**. 4. Jendela baru terbuka di situs pelanggan dan menampilkan dasbor dengan `?impersonated=1`. Jika peramban memblokir jendela tersebut, izinkan pop-up lalu klik lagi. ![Dialog Impersonate dengan kolom alasan yang sudah diisi](https://nexcmp.com/id/docs/images/customers/login-as-01-dialog.webp) Untuk pelanggan dari reseller, jendela terbuka di **domain reseller itu sendiri**, karena tautan hanya berfungsi di situs pelanggan sendiri. ## Cara kerja {#how-it-works} 1. Tindakan admin membuat **token sekali pakai** yang berlaku selama satu jam dan mencatat `customer.login_as` (administrator, IP, alasan, situs) ke log audit. 2. Jendela baru terbuka `https:///v1/portal/impersonate/`. Permintaan pertama hanya menampilkan halaman kecil dan **tidak** menggunakan token (sehingga prapemuatan peramban tidak dapat menghabiskannya); halaman tersebut kemudian dikonfirmasi dengan POST. 3. POST menggunakan token tersebut. Penggunaan kedua, atau penggunaan setelah satu jam, akan merespons "Tautan peniruan identitas telah kedaluwarsa atau sudah digunakan". 4. NexCMP membuat sesi pelanggan yang berlangsung selama **satu jam** (sesi normal berlangsung 30 hari), mencatat entri masuk dengan metode `impersonate`, dan mencatat `customer.login_as.used`. 5. Token hanya berfungsi di situs pelanggan sendiri; di host lain akan merespons 404. ## Yang diblokir dalam sesi yang disamar {#what-is-blocked-in-an-impersonated-session} Segala hal yang memberikan akses melebihi waktu satu jam, atau mengubah keamanan pelanggan itu sendiri, mengembalikan HTTP 403 `impersonate_forbidden`: | Diblokir | Alasan | |---|---| | Mengubah kata sandi, TOTP, menautkan atau membatalkan tautan Google/GitHub, mengedit passkey | Kredensial pelanggan sendiri | | Menghapus akun | Tidak dapat dibatalkan | | Membuat atau mengedit **API keys** | Akses jangka panjang | | Menyetujui login CLI, desktop, atau MCP (tautan perangkat) | Akses jangka panjang | | Membuat akses Kubernetes, kunci S3, kunci SSH, kata sandi root, tautan berbagi konsol, VPN, atau kredensial proxy | Rahasia yang bertahan melebihi sesi | | Menukarkan kode isi ulang | Kampanye uang | | Menarik atau mengubah pembayaran komisi afiliasi | Uang meninggalkan sistem | | Mengedit kunci AI, anggaran, atau email pemberitahuan | Konfigurasi pelanggan | Semua hal lainnya berfungsi: Anda dapat membaca halaman, membuat atau mengelola VM, membuat pesanan, dan sebagainya. Tindakan berjalan dengan identitas pelanggan dan menggunakan uang pelanggan; entri audit di atas adalah bukti bahwa seorang administrator berada di balik sesi tersebut. ## Verifikasi {#verify} 1. Menyamar sebagai pelanggan uji. Portal terbuka dan menampilkan data pelanggan tersebut. 2. Coba ubah kata sandi: Anda mendapatkan "forbidden" (penyamaran). 3. Di **System › Logs › Admin actions**, temukan `customer.login_as` dengan nama Anda, alasan, dan situs, diikuti oleh `customer.login_as.used`. 4. Tutup jendela, buka kembali tautan yang sama: "link expired or already used". ## Batas & catatan {#limits-notes} - Batas waktu satu jam bersifat tetap (3600 detik). Untuk melanjutkan, lakukan penyamaran lagi. - Utamakan membaca dan mereproduksi; hindari tindakan yang menghabiskan uang kecuali diminta oleh pelanggan. - Cabut sesi lebih awal dengan **Revoke sessions** pada halaman pelanggan (ini juga mengeluarkan pelanggan dari sesi). - Reseller memiliki penyamaran **Sign in to partner console** mereka sendiri (60 menit) dari Resellers; lihat [Resellers](https://nexcmp.com/id/docs/customers/resellers/). ## Pemecahan Masalah {#troubleshooting} | Gejala | Penyebab | Solusi | |---|---|---| | "Akun tidak aktif" | Akun terkunci atau dihapus | Buka kunci terlebih dahulu, atau lihat halaman pelanggan sebagai gantinya. | | Peramban memblokir jendela | Pemblokir pop-up | Izinkan pop-up untuk alamat admin dan coba lagi. | | "Tautan kedaluwarsa atau sudah digunakan" | Batas waktu satu jam atau penggunaan ulang | Lakukan penyamaran lagi. | | Membuka "Not found" | Tautan digunakan pada host yang salah | Gunakan jendela yang dibuka oleh dialog; jangan tempel tautan di tempat lain. | | Suatu tindakan menampilkan "forbidden" | Diblokir dalam sesi yang disamar | Minta pelanggan untuk melakukannya, atau gunakan layar admin. | --- # Resellers (white-label) {#resellers-white-label} > **Lokasi di admin:** Customers › Resellers › List (`/resellers`), Domains & SSL (`/resellers/domains`), Permissions & wholesale (`/resellers/entitlements`), Defaults (`/resellers/settings`). Slot reseller: System › Admin › License & updates (`/license`). ## Fungsi {#what-it-does} Seorang **reseller** mendapatkan salinan portal pelanggan dengan merek mereka sendiri di **domain mereka sendiri**, dengan pelanggan, dompet, harga, dan (opsional) saluran pembayaran mereka sendiri. Mereka membeli dari Anda dengan harga grosir dan menjual dengan harga mereka sendiri. Pelanggan mereka tidak akan pernah melihat merek Anda, dan domain reseller tidak akan pernah dapat membuka konsol admin Anda. Reseller menjalankan bisnis mereka dari **konsol mitra** di `https://partner.`. ## Persyaratan {#requirements} | Item | Persyaratan | |---|---| | License | Satu **slot domain reseller** pada lisensi Anda untuk setiap domain reseller kustom. Halaman lisensi menampilkan slot `used/max` dan tautan untuk membeli lebih banyak. Tanpa slot gratis, penambahan domain akan gagal dengan "Out of license reseller domain slots". | | DNS | Setiap domain reseller harus diarahkan ke server Anda (lihat di bawah). | | Web server dan TLS | Nama host harus dapat mencapai panel NexCMP melalui reverse proxy Anda dengan sertifikat yang valid untuk nama tersebut. | | Email | SMTP dikonfigurasi untuk email undangan dan pemberitahuan. | | Master switch | **Reseller settings › General › `rs_enabled`** aktif secara default. | ## Siapkan infrastruktur {#prepare-the-infrastructure} 1. Tentukan alamat publik server: alamat IPv4-nya dan, jika Anda lebih menyukai CNAME, nama host yang mengarah ke sana (misalnya `sites.cloud.example.com`). 2. Buka **Customers › Resellers › Defaults** (`/resellers/settings`), grup **Domains & SSL**, dan atur: | Kunci | Arti | |---|---| | `rs_server_ipv4` | IPv4 publik yang harus dituju oleh record A reseller. | | `rs_cname_target` | Nama host yang harus dituju oleh record CNAME reseller. | | `rs_master_hosts` | Nama host milik situs utama Anda sendiri (tidak dapat diberikan kepada reseller). | | `rs_platform_domain` | Domain induk opsional untuk **sub-domain platform** (misalnya `partners.cloud.example.com` untuk memberi reseller `acme.partners.cloud.example.com`). Kosong berarti menonaktifkan opsi. | | `rs_sites_stale_minutes` | Menit sebelum layanan sertifikat dianggap kedaluwarsa (default 15). | | `rs_ssl_fail_hours` | Jam percobaan yang gagal sebelum kesalahan dinaikkan (default 48). | ::: warning Periksa nilai-nilai ini sebelum mengirimkan instruksi `rs_server_ipv4`, `rs_cname_target`, dan `rs_master_hosts` dikirimkan dengan nilai contoh. Ganti dengan server dan domain Anda sendiri **sebelum** Anda memberikan instruksi DNS kepada reseller, jika tidak, instruksi di layar akan mengarah ke tempat yang salah. ::: 3. Klik **Save** (alasan diperlukan). 4. Pastikan reverse proxy Anda meneruskan nama host reseller ke panel NexCMP dan menyajikan sertifikat untuk masing-masing host. Installer mengonfigurasi nginx dan Let's Encrypt hanya untuk domain utama (serta nama `admin.` dan `partner.` yang ter-resolve). Jika Anda menggunakan Cloudflare, proxy nama host tersebut dan gunakan mode Full SSL. ## Hubungkan di NexCMP {#connect-in-nexcmp} ### Membuat reseller {#create-the-reseller} 1. Buka **Customers › Resellers › List** dan klik **New reseller**. Wizard ini memiliki 8 langkah dan menyediakan semuanya di akhir; setiap langkah dapat dicoba ulang dengan aman. | Langkah | Isi | |---|---| | **Reseller** | Nama resmi atau dagang, **slug** (4–31 karakter a–z, 0–9 atau `-`, diawali dengan huruf; ini juga menjadi prefiks faktur), nama kontak, email dan telepon, bahasa default, detail penagihan reseller (sebagai pembeli top-up saldo). | | **Akun konsol** | Nama pengguna, email akun, nama lengkap; **Send a one-time invite link by e-mail** (berlaku 72 jam, disarankan) atau tampilkan kata sandi sementara satu kali. | | **Merek** | Nama merek, nama pendek, tagline, warna primer, email dan telepon dukungan, nama penjual yang tercetak pada invoice pelanggan, logo (latar belakang terang dan gelap), tanda persegi, dan favicon: PNG, JPEG, WEBP, atau ICO hingga 256 KB, **tanpa SVG**. | | **Domain** | Domain pelanggan beserta **juga www**, mana yang utama, **domain uji** (sslip.io) dan opsi **dry-run**, atau sub-domain platform. Wizard menampilkan **DNS OK / DNS not ready** beserta record yang harus dibuat. | | **Harga & dompet** | Diskon grosir (%), batas bawah ritel (% dari daftar), mark-up default (%), batas kredit, saldo awal, peringatan saldo rendah, batasan pelanggan, VM, dan domain, fitur situs (pendaftaran pelanggan, perlindungan DDoS, tiket dukungan, paket kustom, ubah ukuran, Auto Scaling). | | **Saluran pembayaran** | Pihak yang menagih pembayaran pelanggan (lihat di bawah) serta opsi PayPal mandiri dan transfer bank VN mandiri. | | **Email** | Nama pengirim dan Reply-To. Alamat From akan tetap menggunakan alamat platform hingga DKIM disiapkan untuk domain reseller. | | **Tinjauan** | Periksa semuanya lalu klik **Provision everything**, atau **Save draft (provision later)**. | 2. Provisioning berlanjut di latar belakang (setiap 30 detik). Buka reseller untuk melihat progresnya dan gunakan **Continue provisioning** atau **Retry** jika suatu langkah gagal. ![Wizard reseller baru pada langkah pertama dengan nilai contoh](https://nexcmp.com/id/docs/images/customers/resellers-01-wizard.webp) ### Arahkan DNS (dilakukan oleh reseller) {#point-dns-the-reseller-does-this} Reseller (atau Anda) membuat record yang ditampilkan pada tab **Domains & SSL**: | Record | Name | Nilai | |---|---|---| | TXT (kepemilikan, kali pertama saja) | `_site-verify.` | `sv=` ditampilkan di layar | | A (domain apex seperti `shop.example.net`) | domain | `rs_server_ipv4` Anda | | CNAME (sub-domain seperti `cloud.example.net`) | domain | `rs_cname_target` Anda (atau record A ke `rs_server_ipv4`) | | CNAME (opsional) | `www.` | `rs_cname_target` Anda | Juga: - Hapus record **AAAA** (IPv6) apa pun kecuali server Anda merespons pada alamat IPv6 tersebut. - Matikan proxy CDN **off** (awan abu-abu) saat domain sedang diverifikasi. - Jika domain memiliki record **CAA**, izinkan `letsencrypt.org`. Token dalam record TXT berbeda untuk setiap domain; salin dari layar. Sistem memeriksa ulang DNS setiap 5 menit selama 48 jam pertama, lalu setiap jam, dan melepaskan nama yang record TXT-nya masih belum ada setelah 72 jam. ### Status domain {#domain-states} Pada **Customers › Resellers › Domains & SSL** (semua reseller) dan di tab **Domains & SSL** milik reseller: | Status | Arti | |---|---| | `pending_verify` | Menunggu record TXT. | | `pending_dns` / `verifying` | Menunggu A atau CNAME mengarah ke Anda. | | `issuing` | Sertifikat sedang diterbitkan. | | `active` | Melayani situs reseller. | | `cert_expiring` | Sertifikat hampir kedaluwarsa; pembaruan diharapkan. | | `dns_lost` | DNS berhenti mengarah ke Anda; setelah 30 hari domain dihapus. | | `error` | Lihat kode error; **Retry** setelah memperbaiki. | | `removing` / `removed` | Sedang ditarik; slot lisensi dikembalikan. | Tindakan baris: **Check now**, **Retry**, **Make primary**, **Test mode** (untuk domain uji), **Remove**. ## Izin & grosir {#permissions-wholesale} **Customers › Resellers › Permissions & wholesale** (`/resellers/entitlements`) adalah matriks: satu baris per reseller, dengan **diskon** dan **markup** grosir serta satu tombol untuk setiap layanan (misalnya DDoS Shield dan VPN). Tombol dapat diedit saat fitur tingkat platform aktif; jika tidak, sel tersebut bersifat baca-saja dan menautkan ke pengaturan. Sub-tab **Top-up codes** menentukan berapa banyak kode yang dapat dikeluarkan oleh setiap reseller per bulan (lihat [Promotions](https://nexcmp.com/id/docs/billing/promotions/)). Aturan harga: - Harga grosir = harga daftar x (1 - diskon), dan dapat ditimpa per paket dan per siklus penagihan di tab **Wholesale pricing** milik reseller. - Reseller menetapkan harga eceran dan tidak boleh lebih rendah dari batas **floor** (persentase dari harga daftar). - **Wallet** reseller membayar harga grosir saat pelanggan mereka melakukan pembelian. Wallet memiliki batas kredit, masa tenggang, dan batas cerukan (lihat Defaults). ## Defaults {#defaults} **Customers › Resellers › Defaults** (`/resellers/settings`) adalah kunci `rs_*` yang berlaku untuk setiap reseller. Setiap perubahan memerlukan alasan dan akan diaudit. | Grup | Kunci | Default | Arti | |---|---|---|---| | Umum | `rs_enabled` | 1 | Program reseller aktif. | | | `rs_platform_collect_enabled` | 0 | Memungkinkan platform untuk mengumpulkan pembayaran pelanggan untuk reseller. **Aktifkan hanya setelah tinjauan hukum.** | | | `rs_totp_required` | 1 | Akun konsol reseller wajib menggunakan autentikasi dua faktor. | | | `rs_agreement_version` | 1 | Versi perjanjian reseller yang harus mereka setujui. | | Harga default | `rs_default_discount_bp` | 2000 (20 %) | Diskon grosir untuk reseller baru (basis poin, 0 hingga 9000). | | | `rs_default_markup_bp` | 2500 (25 %) | Markup default (0 hingga 50000). | | | `rs_default_floor_bp` | 9000 (90 %) | Batas eceran (0 hingga 20000). | | | `rs_default_max_domains` | 3 | Domain yang diizinkan per reseller. | | Wallet dan pembayaran | `rs_grace_hours` | 72 | Masa tenggang sebelum layanan pelanggan terpengaruh oleh wallet reseller yang kosong. | | | `rs_overdraft_cap_cents` | 5000 | Cerukan diizinkan pada wallet. | | | `rs_retention_days` | 14 | Hari sebelum VM dari reseller yang ditutup dihapus. | | | `rs_payout_hold_days` | 30 | Hari komisi ditahan sebelum dapat ditarik. | | | `rs_payout_min_cents` | 5000 | Penarikan terkecil. | | | `rs_topup_min_cents` | 2000 | Top-up wallet terkecil oleh reseller. | | Pembayaran dan email | `rs_webhook_base` | kosong | URL dasar publik untuk webhook gateway reseller (kosong = gunakan URL situs). | | | `rs_mail_from` | kosong | Alamat pengirim untuk email reseller. | | | `rs_invoice_show_processor` | 1 | Tampilkan pemroses pembayaran pada faktur. | | | `rs_gw_stripe_enabled`, `rs_gw_usdt_enabled` | 1 | Apakah reseller diizinkan mengonfigurasi Stripe atau USDT mereka sendiri. | ## Siapa yang mengumpulkan pembayaran pelanggan {#who-collects-customer-payments} | Mode | Arti | |---|---| | **Reseller mengumpulkan (saluran sendiri)** — default | Reseller menghubungkan akun Stripe, PayPal, USDT, atau rekening bank mereka sendiri. Webhook mereka adalah `https:///v1/billing//webhook/r/`. Kartu yang disimpan dan [auto top-up](https://nexcmp.com/id/docs/billing/auto-top-up/) tidak tersedia untuk situs-situs ini. | | **Platform mengumpulkan** | Saluran Anda ditampilkan di situs reseller. Dikunci hingga `rs_platform_collect_enabled = 1`. | | **Campuran** | Kombinasi yang dipilih per saluran. | ## Apa yang dilihat reseller {#what-the-reseller-sees} Konsol mitra di `https://partner.` memiliki menu Overview, Reports, Customers, VMs, Tickets, Orders, Payments, Prices, Brand, Landing & legal, Domains & SSL, Email, Wallet, dan Payment channels. Akun konsol memiliki peran *reseller* (penuh) atau *staff* (baca-saja). Untuk melihatnya sendiri, buka reseller dan klik **Sign in to partner console**: Anda masuk selama 60 menit, setiap penulisan dicatat dengan nama Anda di log admin dan log reseller, serta operasi keuangan memerlukan konfirmasi kedua. ## Verifikasi {#verify} 1. Setelah provisioning, baris daftar reseller menunjukkan *active* dan kolom **Provisioning** berwarna hijau. 2. Buka domain reseller di browser: halaman login milik reseller sendiri akan muncul dengan brand mereka. `https:///admin` mengembalikan 404. 3. Daftarkan pelanggan uji coba pada domain tersebut: pelanggan akan muncul di bawah **Customers › List** dengan reseller pada kolom **Site**. 4. Halaman lisensi menunjukkan penambahan satu slot yang digunakan. ## Batas & catatan {#limits-notes} - Satu slot lisensi per domain kustom atau uji coba; sub-domain platform tidak menggunakan slot. - Menangguhkan reseller akan mempertahankan data; **Close reseller** mengembalikan semua slot domain, dan penghapusan VM hanya diizinkan setelah masa retensi. - Pelanggan reseller muncul dalam daftar pelanggan Anda dan dapat di-impersonate seperti pelanggan lainnya (tautan terbuka pada domain reseller). - Reseller tidak dapat melihat atau mengubah saluran pembayaran Anda, default kuota, atau reseller lainnya. ## Pemecahan Masalah {#troubleshooting} | Gejala | Penyebab | Solusi | |---|---|---| | "Slot domain reseller kehabisan lisensi" | Semua slot terpakai | Kosongkan slot (hapus domain) atau beli lebih banyak di halaman lisensi. | | Domain mandek di `pending_verify` | Catatan TXT hilang | Buat catatan TXT persis seperti yang ditunjukkan; gunakan **Check now**. | | Domain mandek di `pending_dns` | A/CNAME tidak mengarah ke Anda, catatan AAAA aktif, atau proxy CDN aktif | Perbaiki DNS, matikan proxy, lalu **Check now**. | | Status `error` | Lihat kode pada baris (misalnya CAA memblokir Let's Encrypt, batas tarif) | Perbaiki dan klik **Retry**. | | Browser mengatakan host tidak dikenal atau "421" | Nama host tidak ada pada lisensi, atau tidak dirutekan ke panel | Tambahkan domain melalui reseller (menghabiskan slot) dan perbaiki reverse proxy. | | Instruksi menunjukkan IP atau host yang salah | `rs_server_ipv4` / `rs_cname_target` masih memiliki nilai sampel | Atur nilainya di Defaults. | | Reseller tidak dapat mengaktifkan platform collection | Terkunci | Atur `rs_platform_collect_enabled` setelah tinjauan hukum. | --- # Branding {#branding} > **Di mana letaknya di admin:** System › Settings › Brand (`/settings/branding`). Terkait: System › Settings › General (`/settings`) untuk URL dan detail penjual yang dicetak pada faktur. ## Fungsi {#what-it-does} NexCMP bersifat white-label: produk tidak membawa nama vendor, dan semua yang dilihat pelanggan Anda adalah brand **Anda**. Pengaturan brand berlaku untuk halaman login dan pendaftaran, portal, konsol admin, dan email. ## Persyaratan {#requirements} | Item | Persyaratan | |---|---| | Role | Seorang administrator. | | File | Logo: SVG, PNG, JPEG, WEBP, atau ICO, **masing-masing hingga 512 KB**. | | Dependensi | Tidak ada. | ## Langkah-langkah {#steps} 1. Buka **System › Settings › Brand**. 2. Di kartu **Identity**, isi: | Kolom | Catatan | |---|---| | **Brand name** (wajib) | Hingga 60 karakter. Ditampilkan di portal, email, faktur, dan halaman legal. | | **Nama penjual pada faktur** | Hingga 120 characters. Kosong berarti menggunakan nama brand. | | **Brand color** | Warna `#rrggbb`; tombol kecil di sebelah field akan meresetnya ke warna bawaan. | | **Site currency** | **USD**: harga dan saldo hanya ditampilkan dalam USD, tanpa tombol pengalih mata uang. **VND**: juga menampilkan jumlah yang dikonversi pada nilai tukar yang tersimpan (lihat [Currency and exchange rates](https://nexcmp.com/id/docs/catalog/currency-and-exchange-rates/)). | 3. Klik **Save**. 4. Di kartu **Logo & favicon**, unggah ketiga gambar — **Logo (latar belakang terang)**, **Logo (latar belakang gelap)**, dan **Favicon** — dengan tombol **Upload** (atau **Replace**); **Remove** menghapus salah satunya. ![Halaman merek dengan bidang identitas dan ketiga gambar yang diunggah](https://nexcmp.com/id/docs/images/customers/branding-01-brand.webp) ### Pengaturan terkait di General {#related-settings-in-general} **System › Settings › General** memiliki dua tab yang melengkapi keseluruhan: | Tab | Bidang | |---|---| | **Branding & URLs** | Nama merek (email, faktur), bahasa default (Bahasa Inggris atau Vietnam), **Customer app URL**, **Console URL**, **Admin URL** (tautan peniruan identitas reseller), dan **Partner console URL** (tautan undangan, email reseller). Wizard penyiapan mengisi ini dengan `https://`, `https:///admin`, dan `https:///console`. | | **Seller & invoicing** | Nama badan hukum, NPWP/ID pajak, alamat, email kontak, dan awalan nomor faktur. Lihat [Invoices and ledger](https://nexcmp.com/id/docs/billing/invoices-and-ledger/). | **Nama Pengirim (From name)** untuk email diatur di **System › Settings › Email** ([SMTP and e-mails](https://nexcmp.com/id/docs/administration/smtp-and-emails/)). ## File yang diunggah akan diperiksa {#uploaded-files-are-checked} - Gambar raster dikenali dari kontennya (bukan dari nama file) dan diukur ukurannya. - **File SVG disusun ulang** dari daftar bentuk yang aman. File yang berisi skrip, `foreignObject`, atribut kejadian, tautan eksternal, `url(...)` yang mengarah ke luar, DOCTYPE, atau entitas akan **ditolak** (`svg_unsafe`). - File yang terlalu besar akan ditolak dengan `asset_too_large`, tipe yang salah dengan `asset_type`, dan dimensi yang buruk dengan `asset_dimensions`. - File disajikan dari domain Anda sendiri dengan header keamanan yang ketat. ## Verifikasi {#verify} 1. Buka halaman login portal di jendela inkognito: logo, nama, dan warna akan muncul. 2. Periksa tab browser untuk favicon (browser menyimpan cache favicon; muat ulang dengan membersihkan cache jika Anda masih melihat yang lama). 3. Memicu email uji (misalnya **Send reset link** untuk pelanggan uji) dan periksa nama merek di subjek serta footer. ## Batas & catatan {#limits-notes} - Logo untuk latar belakang gelap digunakan ketika pelanggan atau admin beralih ke tema gelap. - Reseller memiliki merek mereka sendiri; mereka mengunggah PNG, JPEG, WEBP, atau ICO hingga 256 KB (tanpa SVG). Lihat [Resellers](https://nexcmp.com/id/docs/customers/resellers/). - Perubahan warna atau logo merek akan langsung terlihat pada pemuatan halaman berikutnya; email yang sudah dikirim tidak akan berubah. ## Pemecahan Masalah {#troubleshooting} | Gejala | Penyebab | Solusi | |---|---|---| | Pengunggahan ditolak: `svg_unsafe` | SVG memiliki skrip, tautan, atau referensi eksternal | Ekspor SVG biasa (tanpa skrip, tanpa gambar eksternal) atau gunakan PNG. | | `asset_too_large` | File lebih dari 512 KB | Kompres atau ubah ukuran gambar. | | `asset_type` | Bukan SVG, PNG, JPEG, WEBP, atau ICO | Konversi file tersebut. | | `invalid_argument: primary` | Warna bukan `#rrggbb` | Gunakan nilai heksadesimal enam digit. | | Logo lama masih terlihat | Cache browser | Muat ulang secara paksa (hard-reload); favicon mungkin membutuhkan waktu lebih lama. | | Harga hanya ditampilkan dalam USD | Mata uang situs adalah USD | Beralih ke VND dan pastikan nilai tukar telah disimpan. | --- # Halaman hukum {#legal-pages} > **Di mana di admin:** System › Settings › Legal (`/settings/legal`). **Di mana pelanggan melihatnya:** `https:///terms` dan `/privacy`, ditautkan dari pendaftaran dan pembayaran. ## Fungsi {#what-it-does} Instalasi Anda mempublikasikan dua halaman: **Terms of Service** dan **Privacy Policy**. Hingga Anda menulis milik Anda sendiri, NexCMP menampilkan **teks default netral** yang tidak menyebutkan vendor perangkat lunak dan tidak menjanjikan layanan tertentu. Ganti dengan teks yang ditinjau oleh pengacara Anda sebelum Anda mulai menjual. ## Persyaratan {#requirements} | Item | Persyaratan | |---|---| | Role | Seorang administrator. | | Konten | Markdown biasa, hingga **50 KB** per halaman dan bahasa. | | Dependensi | Nama merek dan detail penjual ([Branding](https://nexcmp.com/id/docs/customers/branding/)) dimasukkan ke dalam teks default. | ## Langkah-langkah {#steps} 1. Buka **System › Settings › Legal**. Masing-masing dari kedua halaman memiliki kartu sendiri dengan tag *Using the default text* atau *Using your text*. 2. Pilih tab bahasa, **English** atau **Tiếng Việt**. 3. Ketik teks Anda. Selama kotak kosong, teks default akan ditampilkan samar-samar sebagai placeholder. Untuk mulai darinya, klik **Start from the default text**, lalu edit. 4. Klik **Save**. Penghitung ukuran menunjukkan `used / 50 KB`. 5. Klik **View on the customer site** untuk membuka `/terms` atau `/privacy`. 6. Untuk kembali ke default untuk satu bahasa, klik **Clear, back to default** dan simpan. ![Pengaturan legal dengan kartu Ketentuan Layanan yang menampilkan teks default sebagai titik awal](https://nexcmp.com/id/docs/images/customers/legal-01-terms.webp) ## Isi halaman default {#what-the-default-pages-contain} Teks default disimpan dalam produk sebagai `legal_default.json` dan diisi dengan nama merek, nama penjual, URL situs, dan email kontak Anda (dari **Seller & invoicing** di bawah System › Settings › General; jika tidak ada email yang disetel, email tersebut mengarah ke tim dukungan Anda). | Halaman | Bagian | |---|---| | **Terms of Service** | 1 Layanan · 2 Akun dan verifikasi · 3 Harga dan penagihan · 4 Pengembalian dana · 5 Data Anda · 6 Penggunaan yang dapat diterima · 7 Ketersediaan dan dukungan · 8 Penangguhan dan penghentian · 9 Tanggung jawab · 10 Perubahan dan hukum yang berlaku (hukum tempat bisnis penjual) | | **Privacy Policy** | 1 Yang kami kumpulkan · 2 Mengapa kami menggunakannya · 3 Cookie dan penyimpanan lokal · 4 Siapa lagi yang melihatnya · 5 Retensi · 6 Hak Anda · 7 Kontak | ::: warning Bukan saran hukum Teks default adalah templat netral. Mintalah ulasan sebelum menggunakannya dengan pelanggan nyata, terutama bagian tentang pengembalian dana, tanggung jawab, dan hukum yang berlaku. ::: ## Aturan markdown {#markdown-rules} - Didukung: heading (`# 1. Title`), paragraf, daftar berpoin dan bernomor, **teks tebal**, dan tautan `[text](https://example.com)`. - Tautan harus dimulai dengan `http://` atau `https://`. - **HTML mentah ditolak** (apa pun ``, ` # Ikhtisar portal pelanggan {#customer-portal-overview} > **Di mana letaknya di portal:** `https:///` — pelanggan masuk di `/login`. Administrator menggunakan `/admin`; login yang sama membuka keduanya bila akun tersebut adalah administrator. Portal adalah tempat yang digunakan pelanggan Anda setiap hari. Portal ini diberi merek dengan nama, logo, dan warna Anda ([Branding](https://nexcmp.com/id/docs/customers/branding/)) dan hanya menampilkan layanan yang telah Anda aktifkan ([Modules](https://nexcmp.com/id/docs/infrastructure/modules/)). ## Dasbor {#the-dashboard} Setelah masuk, **Dashboard** menampilkan: | Blok | Arti | |---|---| | Saldo dompet | Kredit saat ini dan perkiraan berapa hari kredit tersebut akan bertahan pada tingkat penggunaan saat ini | | Pengeluaran bulan ini | Biaya sejauh ini dan perkiraan untuk akhir bulan | | Mesin virtual | Setiap VM beserta status, IP, CPU, dan RAM, serta tindakan cepat (Console, Restart) | | Bandwidth | Lalu lintas masuk/keluar selama 1 jam, 6 jam, 24 jam, 7 hari, 30 hari | | Aktivitas terbaru | Kejadian terbaru pada akun | | Mulai cepat | Daftar periksa: buat VM, tambahkan kunci SSH, isi saldo, aktifkan isi saldo otomatis, verifikasi e-mail | ![Dasbor pelanggan dengan saldo dompet, perkiraan pengeluaran, mesin virtual yang sedang berjalan, dan daftar periksa mulai cepat](https://nexcmp.com/id/docs/images/portal/overview-01-dashboard.webp) ## Navigasi {#navigation} Menu mengelompokkan layanan menurut jenisnya. Layanan yang Anda nonaktifkan (atau yang sumbernya tidak terhubung) tidak akan muncul. | Area | Halaman | |---|---| | Instances | [Virtual machines](https://nexcmp.com/id/docs/portal/virtual-machines/) dan halaman detailnya | | Penyebaran | [Ordering](https://nexcmp.com/id/docs/portal/ordering/) — membuat sumber daya | | Storage | Snapshot, cadangan, dan volume saat diaktifkan — [Snapshots](https://nexcmp.com/id/docs/portal/snapshots/) | | Penagihan | [Wallet and top-ups](https://nexcmp.com/id/docs/portal/sign-up-and-wallet/), faktur, pesanan, kuota | | Akun | Profil, masuk dan keamanan, preferensi, isi saldo otomatis | | Dukungan | Widget chat dan tiket — [Support](https://nexcmp.com/id/docs/portal/support/) | | Dokumentasi API | `/apidoc` — [API](https://nexcmp.com/id/docs/developers/api/) | ## Akun {#account} **Account** memiliki empat tab: **Profile** (nama, e-mail, ID pelanggan, permintaan hapus akun), **Sign-in & security** (sandi, passkey, Google/GitHub yang ditautkan), **Preferences** (bahasa, mata uang tampilan), dan **Auto top-up** ([Auto top-up](https://nexcmp.com/id/docs/billing/auto-top-up/)). Pelanggan tidak dapat menghapus akun secara langsung: mereka menekan **Request account deletion**; setelah semua mesin virtual dihapus, operator meninjau permintaan tersebut (Customers › Deletion requests) dan pelanggan dapat membatalkannya selama masih tertunda. ## Bahasa dan mata uang {#language-and-currency} Portal tersedia dalam 16 bahasa dan menampilkan harga dalam mata uang tampilan yang dipilih berdasarkan bahasa; lihat [Currency and exchange rates](https://nexcmp.com/id/docs/catalog/currency-and-exchange-rates/). Pelanggan dapat mengganti keduanya di **Preferences**. ## Kuota pelanggan {#customer-quotas} **Billing › Quotas** menunjukkan berapa banyak dari setiap sumber daya (CPU, memori, penyimpanan, IP, VM) yang dapat digunakan pelanggan, berdasarkan apa yang telah dibayar — lihat [Quotas](https://nexcmp.com/id/docs/billing/quotas/). --- # Pendaftaran, dompet, dan pengisian saldo {#sign-up-wallet-and-top-up} > **Di mana letaknya di portal:** `/register`, `/login`, Billing (`/billing`). ## Membuat akun {#create-an-account} 1. Pelanggan membuka `https:///register` dan memasukkan e-mail serta sandi (minimal 10 karakter dengan huruf dan angka), atau menggunakan **Google**, **GitHub**, atau **passkey** jika Anda mengaktifkannya — lihat [Security](https://nexcmp.com/id/docs/administration/security/#customer-sign-in). 2. Jika captcha diaktifkan, mereka menyelesaikannya. 3. E-mail verifikasi dikirimkan melalui [SMTP](https://nexcmp.com/id/docs/administration/smtp-and-emails/) Anda. Verifikasi diperlukan sebelum membuat VM jika pengaturan penjualan Anda mewajibkannya. ![Halaman pendaftaran dengan kolom e-mail dan sandi](https://nexcmp.com/id/docs/images/portal/sign-up-and-wallet-01-register.webp) ::: tip Tanpa SMTP yang berfungsi, pelanggan tidak dapat memverifikasi e-mail atau mengatur ulang sandi. Konfigurasikan [SMTP](https://nexcmp.com/id/docs/administration/smtp-and-emails/) terlebih dahulu. ::: ## Dompet {#the-wallet} Semuanya dibayar dari saldo **dompet** dalam mata uang penagihan Anda. Halaman **Billing** menunjukkan: | Bagian | Arti | |---|---| | Daya belanja | Saldo ditambah isi ulang tertunda | | Biaya berjalan | Layanan per jam yang dikonsumsi dalam siklus saat ini, belum diselesaikan | | Saldo terutang | Jumlah apa pun yang terutang | | Riwayat penagihan | Tab **Invoice History**, **Payment Order**, **Ledger**, **Orders** | ![Halaman penagihan dengan daya belanja, biaya berjalan, dan tab riwayat](https://nexcmp.com/id/docs/images/portal/sign-up-and-wallet-02-billing.webp) ## Menambah kredit {#add-credit} 1. Klik **Deposit**. 2. Masukkan jumlahnya. Minimumnya adalah [minimum top-up](https://nexcmp.com/id/docs/billing/minimum-top-up/) Anda. 3. Pilih saluran pembayaran (kartu, PayPal, USDT, atau transfer bank jika antarmukanya bahasa Vietnam) — saluran adalah yang Anda aktifkan di [Payment channels](https://nexcmp.com/id/docs/billing/payment-channels/). 4. Bayar. Saldo diperbarui saat penyedia pembayaran mengonfirmasi. Kartu tersimpan, Stripe Link, dan PayPal dapat digunakan kembali dan dipakai untuk [auto top-up](https://nexcmp.com/id/docs/billing/auto-top-up/); lihat [Saved payment methods](https://nexcmp.com/id/docs/billing/saved-payment-methods/). ## Menukar kode {#redeem-a-code} **Redeem code** menambahkan kredit dari voucher yang Anda terbitkan (Finance › Billing › Vouchers) atau menerapkan kode promo — lihat [Promotions](https://nexcmp.com/id/docs/billing/promotions/). ## Invoices {#invoices} Setiap pesanan yang dibayar menghasilkan faktur yang menampilkan detail penjual Anda ([General settings](https://nexcmp.com/id/docs/administration/general-settings/)). Pelanggan membukanya dari **Invoice History** dan mencetak atau menyimpannya sebagai PDF dari peramban. ## Biaya per jam {#hourly-charges} Layanan per jam ditagihkan setiap jam sumber daya tersebut ada; jumlahnya terakumulasi dan satu jam dapat dibulatkan ke $0.00. Ketika saldo tidak mencukupi, layanan ditangguhkan sesuai dengan aturan penagihan Anda dan pelanggan diberitahu melalui e-mail (`low_balance`). --- # Memesan layanan {#ordering-a-service} > **Di mana di portal:** Deploy (`/deploy/vm`). **Di mana di admin** Anda mengontrol apa yang muncul di sini: Services (paket, harga) dan System › Admin › License & updates (modul). Halaman pesanan adalah satu formulir gulir dengan langkah-langkah bernomor. Memilih layanan lain pada langkah 1 mempertahankan halaman dan mengubah langkah-langkah di bawahnya. ## Langkah-langkah {#steps} 1. **Service** — Cloud Servers, dan layanan lain yang Anda aktifkan (Kubernetes, Object Storage, Images, Private Cloud, VPN …). 2. **Location** — [zone](https://nexcmp.com/id/docs/infrastructure/zones/) tersebut. Harga dan lalu lintas yang disertakan dapat berbeda menurut lokasi. 3. **Plan** — paket tetap (vCPU, RAM, disk NVMe, harga per jam) atau **Custom** (pelanggan memilih vCPU, RAM, dan disk; diberi harga per sumber daya). Paket berasal dari [Plans](https://nexcmp.com/id/docs/catalog/plans/). 4. **Billing cycle** — Siklus **Hourly** atau prabayar bulanan/tahunan dengan diskon (misalnya 1 tahun −10%, 2 tahun −15%, 3 tahun −20%). 5. **Operating system** — daftar templat, **My Images** (unggahan pelanggan sendiri), dan versinya. 6. **Hostname & quantity** — nama (atau **Randomize**) dan berapa banyak server. ![Halaman pesanan yang menampilkan langkah layanan, lokasi, dan paket](https://nexcmp.com/id/docs/images/portal/ordering-01-plan.webp) ![Langkah siklus penagihan dan sistem operasi pada halaman pesanan](https://nexcmp.com/id/docs/images/portal/ordering-02-cycle-os.webp) ## Membuat pesanan {#placing-the-order} Ringkasan menampilkan harga. Pesanan dibebankan ke dompet **sebelum** provisioning, setelah aturan [quota check](https://nexcmp.com/id/docs/billing/quotas/) dan [minimum balance](https://nexcmp.com/id/docs/billing/minimum-top-up/). VM biasanya mencapai *Running* dalam sekitar satu menit; pelanggan melihat langkah deploy di tab **Activity** VM dan menerima e-mail "VM ready" dengan kata sandi awal (terlihat sekali selama 10 menit). ## Hal yang dapat menghentikan pesanan {#what-can-stop-an-order} | Pesan / penyebab | Solusi | |---|---| | Saldo tidak mencukupi | Isi ulang — [Sign-up, wallet and top-up](https://nexcmp.com/id/docs/portal/sign-up-and-wallet/) | | Kuota terlampaui | Naikkan kuota — [Quotas](https://nexcmp.com/id/docs/billing/quotas/) | | E-mail belum diverifikasi | Pelanggan memverifikasi e-mail | | Tidak ada paket untuk lokasi yang dipilih | Buat paket tersedia di zona tersebut — [Plans](https://nexcmp.com/id/docs/catalog/plans/) | | Lisensi tidak valid | Pelanggan tidak dapat membuat layanan baru — [License](https://nexcmp.com/id/docs/getting-started/license-and-purchase/#if-the-license-is-not-valid) | --- # Mesin virtual {#virtual-machines} > **Di mana di portal:** Instances (`/vms`) dan halaman VM (`/vms/`). **Instances** mencantumkan VM pelanggan dengan nama, OS, status, IP, spesifikasi, dan biaya. Klik salah satu untuk membuka halamannya. ## Halaman VM {#the-vm-page} Tab: **Overview**, **Console**, **AI SSH Agent** (saat modul AI aktif), **Monitoring**, **Storage**, **Network**, **Configuration**, **Billing**, **Activity**. ![Ringkasan mesin virtual dengan status, spesifikasi, IP, grafik bandwidth, dan log tindakan](https://nexcmp.com/id/docs/images/portal/virtual-machines-01-overview.webp) ### Tindakan {#actions} | Action | Efek | |---|---| | Konsol | Membuka konsol browser — [Console](https://nexcmp.com/id/docs/portal/console/) | | Restart / Stop / Force stop | Kontrol daya | | Reset kata sandi | Menghasilkan kata sandi baru, ditampilkan sekali | | Instal ulang OS | Membangun ulang dari templat; data akan hilang | | Ubah IP | Mengganti IP publik (jika sumber mendukungnya) | | Aktifkan Auto Scaling | Menskalakan CPU/RAM saat berada di bawah beban jika diaktifkan | | Hapus | Menghancurkan VM; penagihan per jam berhenti | ### Informasi yang ditampilkan {#information-shown} Uptime, biaya bulan ini, vCPU/RAM/disk dengan penggunaan langsung, IP publik dan privat, nama pengguna, grafik bandwidth, log tindakan, dan ringkasan penagihan (paket, siklus, jam, sisa). ::: info Bidang bergantung pada sumber Halaman VM hanya menampilkan apa yang didukung oleh sumbernya. Misalnya, VM Proxmox VE tidak memiliki penerusan port atau ubah-IP, dan daftar OS-nya mengikuti kumpulan templat clusternya. Lihat tabel kapabilitas di [Proxmox VE](https://nexcmp.com/id/docs/infrastructure/proxmox/). ::: ## Tab Penagihan {#billing-tab} Menampilkan paket, siklus, total jam, sisa waktu, dan log penagihan. VM per jam terus terakumulasi hingga dihapus. Pelanggan dapat **switch cycle** untuk membayar dimuka periode yang lebih lama dengan diskon. ## Untuk administrator {#for-administrators} VM yang sama terlihat di bawah Services › Virtual Machines di konsol admin, tempat Anda dapat bertindak atas nama pelanggan atau [log in as](https://nexcmp.com/id/docs/customers/login-as/) mereka. --- # Konsol {#console} > **Di mana letaknya di portal:** halaman VM → tab **Console**. **Di mana letaknya di admin:** System › Admin › License & updates → modul (web SSH). ## Fungsi {#what-it-does} Tab **Console** membuka sesi grafis (VNC) ke VM di peramban, bahkan ketika jaringan di dalam VM mengalami gangguan. Terminal **web SSH** tersedia sebagai opsi kedua ketika modul SSH diaktifkan. ## Persyaratan {#requirements} | Item | Konsol VNC | Web SSH | |---|---|---| | CloudStack | VM proxy konsol (CPVM) yang dapat dijangkau oleh panel — lihat [CloudStack](https://nexcmp.com/id/docs/infrastructure/cloudstack/) | Port SSH yang dapat dijangkau pada VM | | Proxmox VE | Bekerja melalui panel (noVNC melalui API Proxmox; sidik jari TLS disematkan) — lihat [Proxmox VE](https://nexcmp.com/id/docs/infrastructure/proxmox/) | Sama | | Panel | URL konsol yang disetel di [General settings](https://nexcmp.com/id/docs/administration/general-settings/) | Layanan `ssh-proxy` dan tanda modul `feature_ssh_web`; nonaktif secara default — lihat [Modules](https://nexcmp.com/id/docs/infrastructure/modules/) | Jika modul web SSH nonaktif, tab akan menampilkan **VNC only**. ## Gunakan {#use-it} 1. Buka VM → **Console**. 2. Klik **Console** (atau **Open in new window**). Tiket berumur pendek diterbitkan dan konsol terbuka pada `https:///console`. 3. Masuk dengan nama pengguna dan kata sandi VM (terlihat pada tab Overview; setel ulang jika hilang). ![Tab Konsol dari mesin virtual](https://nexcmp.com/id/docs/images/portal/console-01-tab.webp) ## Pemecahan Masalah {#troubleshooting} | Gejala | Penyebab | Solusi | |---|---|---| | "Disconnected" segera | Peramban menyimpan jalur konsol lama | Hapus data situs untuk domain tersebut dan coba lagi | | Layar hitam | VM dihentikan atau sedang melakukan booting | Nyalakan VM dan tunggu | | Konsol tidak terbuka di CloudStack | VM proxy konsol tidak berjalan atau tidak dapat dijangkau | Periksa VM sistem di CloudStack | | Tidak ada opsi SSH | Modul Web SSH nonaktif | Aktifkan hanya setelah `ssh-proxy` terpasang | --- # Snapshots and backups {#snapshots-and-backups} > **Di dalam portal:** Snapshots (`/snapshots`), Snapshot schedules (`/snapshots/schedules`), Backups (`/backups`). Hanya terlihat jika fitur diaktifkan di admin. ## Fungsi {#what-it-does} Sebuah Snapshots menyimpan status disk VM agar pelanggan dapat melakukan rollback setelah perubahan yang keliru. Snapshots dapat dibuat secara manual maupun sesuai jadwal. ## Ketersediaan {#availability} | Source | Snapshots | Catatan | |---|---|---| | CloudStack | Ya | Volume snapshots; penyimpanan ditagih sesuai konfigurasi | | Proxmox VE | Ya | Hingga **5 per VM**; membuat, mencatat, memulihkan, dan menghapus | Menu tersebut hanya muncul jika fitur snapshot aktif dan pelanggan memiliki VM yang sourcenya mendukung. ## Gunakan {#use-it} 1. Buka **Snapshots**, klik **Create**, pilih VM lalu berikan nama. 2. Tunggu hingga statusnya menjadi *ready*. 3. Untuk kembali, pilih **Restore** pada snapshot dan konfirmasi — VM akan kembali ke status tersebut (dan direstart jika diperlukan). 4. Hapus snapshot yang tidak lagi Anda perlukan. ::: warning Pemulihan akan membuang semua data yang ditulis setelah snapshot. VM yang dilindungi tidak dapat dipulihkan atau dihapus dari portal. ::: --- # Support for customers {#support-for-customers} > **Di dalam portal:** gelembung obrolan di setiap halaman, `/chat`, dan Support tickets. **Di dalam admin:** Customers › Support › Tickets (`/support/tickets`), tab **Settings**. ## Untuk pelanggan {#for-customers} - **Gelembung obrolan** (sudut bawah setiap halaman): ajukan pertanyaan; [AI Chat](https://nexcmp.com/id/docs/ai/ai-chat/) menjawab menggunakan dokumentasi Anda dan data akun pelanggan sendiri. **Expand** membuka percakapan yang sama pada `/chat`. - **Talk to staff**: meneruskan percakapan ke tim Anda (melalui grup Telegram admin Anda). - **Tombol Telegram / Zalo**: hanya muncul setelah Anda mengatur tautan di pengaturan dukungan. - **Tiket**: untuk masalah yang lebih panjang; balasan dikirim melalui email (`ticket_reply`). ## Untuk Anda {#for-you} 1. Buka **Customers › Support › Tickets**; tiket dan obrolan baru beserta percakapannya akan muncul di sini. 2. Balas di dalam thread. Pelanggan akan dikirimi email melalui [SMTP](https://nexcmp.com/id/docs/administration/smtp-and-emails/) Anda. 3. Pada tab **Settings**, aktifkan atau nonaktifkan widget obrolan, atur tautan Telegram dan tautan Zalo (hanya https), serta pilih apakah AI menjawab secara otomatis — lihat [AI Chat](https://nexcmp.com/id/docs/ai/ai-chat/). 4. Hubungkan [Telegram alerts](https://nexcmp.com/id/docs/administration/telegram-notifications/) agar tim Anda mendapatkan pemberitahuan saat ada obrolan baru. --- # AI provider {#ai-provider} > **Di dalam admin:** System › Settings › AI provider (`/settings/ai`). Sakelar modul AI berada di sana dan di System › Admin › License & updates (`/license`), kartu **Module**. ## Fungsi {#what-it-does} AI Chat (obrolan dukungan otomatis) dan AI Agent (administrasi VM dengan bahasa sehari-hari) tidak disertakan dengan model bawaan. Anda memilih **provider Anda sendiri**: layanan apa pun yang menawarkan `chat/completions` API yang **kompatibel dengan OpenAI** — misalnya OpenAI, OpenRouter, gateway LiteLLM, atau server vLLM Anda sendiri. NexCMP menyimpan endpoint dan API key (terenkripsi) serta menggunakannya untuk setiap fitur AI. Anda membayar langsung kepada provider tersebut. ## Persyaratan {#requirements} | Item | Persyaratan | |---|---| | Endpoint | Base URL yang kompatibel dengan OpenAI (`https://api.openai.com/v1`, `https://ai.example.com/v1`). NexCMP menambahkan `/chat/completions` ke URL yang berakhiran `/v1`; untuk URL lainnya, NexCMP menambahkan `/v1/chat/completions`; URL yang sudah berakhiran `/chat/completions` digunakan apa adanya. | | Model | Model yang mendukung **pemanggilan alat (fungsi)**. Baik AI Chat maupun Agent mengandalkannya. | | Kunci API | Kunci untuk endpoint tersebut. Sebaiknya gunakan kunci dengan **batas pengeluaran** di sisi penyedia (misalnya kunci virtual LiteLLM dengan anggaran bulanan). | | Jaringan | Server panel harus dapat menjangkau endpoint melalui HTTP(S). URL yang diketik dalam formulir hanya diizinkan mengarah ke Internet pada port 80, 443, 8080, atau 8443; untuk menggunakan alamat internal, simpan penyedia terlebih dahulu lalu uji. | | Dependensi | Modul **AI** aktif. Untuk Agent, lihat [AI Agent](https://nexcmp.com/id/docs/ai/ai-agent/#requirements). | ## Siapkan infrastruktur {#prepare-the-infrastructure} 1. Daftar dengan penyedia dan buat kunci API. Jika penyedia mendukung anggaran atau batasan tarif, tetapkan batas bulanan. 2. Catat **base URL** dan **nama model** yang tepat (serta, secara opsional, hingga empat model cadangan). 3. Uji dari server NexCMP sebelum memasukkannya: ```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"}]}' ``` Jawaban JSON dengan `choices[0].message.content` berarti endpoint berfungsi. ## Hubungkan di NexCMP {#connect-in-nexcmp} 1. Buka **System › Settings › AI provider**. 2. Pada kartu **Module AI**, aktifkan modul (**on**). Sebelum diaktifkan, pelanggan tidak dapat melihat AI Chat atau AI Agent di portal. (Anda juga dapat mengaktifkannya di **License & updates**.) 3. Pada kartu **Connection**, isi: | Kolom | Contoh | Catatan | |---|---|---| | Gunakan penyedia ini | aktif | Memerlukan base URL, model, dan kunci untuk diaktifkan. | | Display name | `LiteLLM` | Hingga 60 karakter. | | Base URL (yang kompatibel dengan OpenAI) | `https://ai.example.com/v1` | `http://` atau `https://`, hingga 300 karakter, tanpa spasi. | | Kunci API penyedia | `sk-XXXX` | Disimpan secara terenkripsi; setelah itu hanya 4 karakter terakhir yang ditampilkan. Biarkan kosong untuk tetap menggunakan kunci yang tersimpan. | | Model default | `gpt-4o-mini` | Huruf, angka, dan `- _ . / : @`. | | Model cadangan | `gemini-2.5-flash` | Dipisahkan dengan koma, hingga 4. Digunakan saat model default gagal. | | Upaya penalaran | Default (tidak dikirim) | `Minimal`, `Low`, `Medium`, atau `High`. Untuk model penalaran (Gemini, seri o), tingkat rendah merespons jauh lebih cepat. Biarkan pada Default untuk model normal. | 4. Klik **Save**, lalu **Test connection**. Pengujian mengirimkan satu pertanyaan singkat dan menampilkan `Connected — , ms` atau error yang dikembalikan oleh penyedia. ![Halaman AI provider dengan modul AI diaktifkan dan formulir koneksi terisi dengan nilai contoh](https://nexcmp.com/id/docs/images/ai/ai-providers-01-connection.webp) ### Yang dilakukan penyimpanan {#what-saving-does} - Pengaturan penyedia disimpan sebagai satu entri konfigurasi dan kunci dienkripsi dengan AES-256-GCM, yang terikat pada tujuan ini, menggunakan kunci utama instalasi. - Pengaturan dukungan **Primary model** dan **Fallback model** (digunakan oleh AI Chat) diatur secara otomatis ke model default dan model cadangan pertama Anda. - Perubahan dicatat ke log audit (endpoint, model, apakah kunci berubah — tidak pernah kuncinya). ## Verifikasi {#verify} 1. **Test connection** berwarna hijau. 2. Masuk ke portal sebagai pelanggan uji: menu sekarang menyediakan **AI Chat** (atau gelembung obrolan) dan **AI Agent**. 3. Tanyakan kepada AI Chat "What is my balance?". Jawaban yang menyebutkan saldo nyata Anda menunjukkan bahwa penyedia menangani pemanggilan alat dengan benar. ## Batas & catatan {#limits-notes} - **Satu penyedia.** NexCMP menggunakan satu penyedia yang dikonfigurasi untuk Chat, Agent, dan penelusuran tiket. Model cadangan memberikan ketahanan dalam penyedia tersebut. - **Keamanan kunci.** Kunci yang disimpan hanya dikirim ke endpoint yang disimpan. Jika Anda mengubah Base URL, Anda harus mengetikkan ulang kunci sebelum menguji. - **Batasan per pelanggan.** AI Chat hanya untuk pelanggan yang sudah masuk, dengan batasan pesan per menit dan per obrolan. Agen memiliki batasan panggilan harian per akun. Lihat [AI Chat](https://nexcmp.com/id/docs/ai/ai-chat/) dan [AI Agent](https://nexcmp.com/id/docs/ai/ai-agent/). - **Privasi.** Pertanyaan pelanggan dan data yang dibaca oleh AI untuk pelanggan tersebut (hanya-baca) dikirim ke penyedia Anda. Nyatakan hal ini dalam [kebijakan privasi](https://nexcmp.com/id/docs/customers/legal/) Anda. - **Kontrol biaya.** NexCMP tidak mengenakan meteran biaya AI; gunakan fitur anggaran dari penyedia. - Modul ini dapat dimatikan kapan saja: menu AI akan hilang dan rute AI memberikan respons 404 `module_disabled`. Beberapa job latar belakang AI Chat (investigasi tiket, balasan tertunda) akan mendeteksi perubahan tersebut pada saat panel direstart berikutnya. ## Pemecahan Masalah {#troubleshooting} | Gejala | Penyebab | Solusi | |---|---|---| | `base_url must be an http(s) URL` | Skema hilang atau ada spasi | Gunakan `https://host/v1`. | | `api_key is required to enable the provider` | Tidak ada kunci yang disimpan | Masukkan kunci lalu simpan. | | `base_url and model are required to enable the provider` | Kolom kosong | Isi keduanya. | | "Base URL diblokir: hanya http(s) publik, port 80/443/8080/8443" | Menguji alamat internal yang belum disimpan atau port lain | Simpan penyedia terlebih dahulu, lalu uji. | | `api_key is required (enter the key again when you change the endpoint)` | Base URL berbeda dengan yang disimpan | Ketik ulang kunci. | | `model: letters, digits and - _ . / : @` | Karakter tidak valid | Gunakan ID model yang persis dari penyedia. | | `fallback_models: up to 4 model names` | Terlalu banyak | Simpan empat atau kurang. | | Pengujian gagal dengan 401 | Kunci salah | Periksa kunci dan endpoint. | | Pengujian gagal dengan 404 atau "model not found" | Jalur atau model salah | Periksa base URL (`/v1`) dan ID model. | | `Too many tests — wait a minute` (429) | Lebih dari 10 pengujian per menit | Tunggu. | | Portal tetap tidak menampilkan menu AI | Modul nonaktif, atau penyedia tidak "in use" | Nyalakan modul dan aktifkan penyedia. | --- # AI Chat {#ai-chat} > **Lokasi di admin:** Customers › Support › Ticket, tab **AI settings** (`/support/tickets?tab=settings`). Penyedia dan modul: System › Settings › AI provider (`/settings/ai`). **Lokasi di portal:** tombol obrolan melayang dan halaman `/chat` (mode **Ask AI**). ## Fungsi {#what-it-does} AI Chat menjawab pertanyaan pelanggan setiap saat, mencari data akun *mereka sendiri* (saldo, layanan, pembayaran, error terbaru), dan dapat bertindak atas nama mereka — membuat VM, mengubah paket — setelah pelanggan mengonfirmasi. Ketika asisten tidak dapat membantu, pelanggan mengklik **Talk to a human**: obrolan diteruskan ke staf Anda di Telegram dan, jika tidak ada yang menjawab tepat waktu, akan menjadi tiket. Pengaturan AI yang sama juga memungkinkan sistem **menginvestigasi tiket** untuk staf Anda. ## Persyaratan {#requirements} | Item | Persyaratan | |---|---| | Modul dan penyedia | Modul **AI** aktif dan [AI provider](https://nexcmp.com/id/docs/ai/ai-providers/) disimpan serta digunakan. Tanpa penyedia, asisten akan menyatakan bahwa modul belum dikonfigurasi. | | Pelanggan | **Hanya untuk pelanggan yang masuk.** Pada instalasi NexCMP tidak ada situs publik, sehingga pengunjung yang belum masuk akan mendapati "Sign in to use AI Chat". | | Saluran staf (opsional) | Bot dan obrolan Telegram untuk peringatan admin (lihat [Telegram notifications](https://nexcmp.com/id/docs/administration/telegram-notifications/)). Saluran yang sama menerima pengalihan obrolan dan draf tiket. | | Dependensi | [AI provider](https://nexcmp.com/id/docs/ai/ai-providers/). | ## Siapkan infrastruktur {#prepare-the-infrastructure} Tidak diperlukan di luar penyedia AI. Jika Anda ingin pengalihan ke staf: 1. Buat bot Telegram dengan @BotFather dan catat tokennya. 2. Buat grup atau gunakan chat pribadi Anda dengan bot tersebut, lalu catat ID chat-nya. 3. Masukkan keduanya di bawah System › Settings › Admin alerts (lihat [Telegram notifications](https://nexcmp.com/id/docs/administration/telegram-notifications/)). Fitur dukungan menggunakan kembali bot dan chat tersebut. ## Hubungkan di NexCMP {#connect-in-nexcmp} 1. Pastikan modul AI aktif dan penyedia menguji hijau ([AI provider](https://nexcmp.com/id/docs/ai/ai-providers/)). 2. Buka **Customers › Support › Ticket** dan pilih tab **AI settings**. Bagian atas kartu kiri menampilkan tiga tag: *AI provider: configured*, *Telegram: channel present* serta *On shift* atau *Off shift*. 3. Kartu kiri **AI + Telegram**: | Tombol atau kolom | Default | Arti | |---|---|---| | AI menyelidiki tiket secara otomatis | On | Untuk tiket atau pesan baru, AI membaca data pelanggan (hanya-baca) dan menulis kemungkinan penyebab serta draf balasan sebagai **catatan internal**. AI tidak pernah mengirimkannya ke pelanggan. | | Peringatan Telegram ke admin | On | Catatan tiba di Telegram dengan tombol Send, Edit, dan Skip. | | Balasan otomatis AI | Nonaktif | Mengirimkan jawaban cara-penggunaan atau penjualan sederhana secara mandiri ketika semua kondisi keselamatan terpenuhi (tingkat keyakinan 85% atau lebih, tanpa peringatan); dikirim setelah 3 menit dan dapat dibatalkan di Telegram. | | Kategori yang diizinkan untuk membalas otomatis | `how_to`, `sales` | Hanya kategori-kategori ini. | | Model primer, Model cadangan | ditetapkan dari penyedia | Biasanya biarkan seperti yang disimpan oleh halaman penyedia AI. | | ID pengguna Telegram yang diizinkan untuk bertindak | kosong | Kosong berarti chat dari saluran peringatan. | 4. Kartu kanan **Live chat (customer widget)**: | Kolom | Default | Arti | |---|---|---| | Aktifkan widget chat | On | Gelembung chat dan halaman `/chat`. | | Jam dukungan (waktu Vietnam) | `08:00-22:00` | Saat staf diharapkan menjawab di Telegram. Di luar jam tersebut, atau saat tidak ada saluran Telegram, **Talk to a human** langsung mengubah chat menjadi tiket. | | Waktu tunggu maks untuk staf (menit), lalu ubah menjadi tiket | 10 | 1 hingga 240. | | Putaran AI / hari / pelanggan | 40 | 1 hingga 1000. Setelah batas tercapai, asisten mengundang pelanggan untuk berbicara dengan manusia. | | Chat baru / jam / IP | 20 | 1 hingga 1000. | | **Tautan Zalo OA** | kosong | `https://zalo.me/...` Menampilkan tombol **Chat on Zalo** (dengan kode QR) di dalam chat. Dikosongkan untuk menyembunyikannya. | | **Tautan Telegram** | kosong | `https://t.me/...` Menampilkan tombol **Telegram**. Dikosongkan untuk menyembunyikannya. | | Batas harian putaran AI seluruh sistem, pelanggan yang masuk | 2000 | | | Batas harian seluruh sistem, tamu | 500 | Kumpulan tersendiri; tidak digunakan selama tamu tidak dapat melakukan chat. | | Batas harian penyelidikan tiket otomatis seluruh sistem | 200 | | | Path admin (tombol Telegram "Open admin") | kosong | URL admin Anda, misalnya `https://cloud.example.com/admin`. | Setiap tombol atau kolom akan tersimpan saat Anda mengubahnya. 5. Di bagian bawah, **Reply templates** (judul, bahasa VI/EN/ZH, teks hingga 4,000 karakter) menyediakan jawaban siap pakai bagi staf. ![Tab AI settings dengan tombol AI dan Telegram serta batas live chat dan tautan pintasan](https://nexcmp.com/id/docs/images/ai/ai-chat-01-settings.webp) ![Halaman obrolan pelanggan dengan asisten, tombol pintas Zalo dan Telegram, serta opsi untuk berbicara dengan manusia](https://nexcmp.com/id/docs/images/ai/ai-chat-02-portal.webp) ## Yang dapat dan tidak dapat dilakukan oleh asisten {#what-the-assistant-can-and-cannot-do} - **Membaca:** mencari basis pengetahuan dan dokumentasi publik Anda, serta membaca data pelanggan yang sedang masuk melalui alat baca-saja. Asisten tidak dapat melihat pelanggan lain. - **Bertindak:** menggunakan izin API pelanggan itu sendiri. Tindakan *read* langsung dijalankan. Apa pun yang mengubah atau mengenakan biaya akan membuat **kartu konfirmasi** (dengan tulisan "Needs your confirmation", serta tag *Costs money* atau *Delete*); tidak ada yang terjadi hingga pelanggan mengklik **Confirm**. Obrolan dapat menampung paling banyak 3 kartu tertunda dan satu akun paling banyak 10 tindakan tulis terkonfirmasi per jam. - **Tidak pernah:** tidak dapat membuka konsol, membuat token SSH atau konsol, mengunduh file akses Kubernetes, mengatur ulang kata sandi, atau menampilkan rahasia seperti kata sandi proxy atau rahasia S3. Rahasia tidak pernah dimasukkan ke dalam konteks model atau riwayat obrolan. - **Keamanan:** jawabannya melewati filter keluaran; teks pelanggan dan hasil alat diperlakukan sebagai data, bukan sebagai instruksi. - **Spanduk kejujuran:** obrolan menampilkan "Answered by an AI assistant — it may be imperfect. Talk to a human for anything critical." ## Peralihan ke staf {#staff-hand-off} 1. Pelanggan mengklik **Talk to a human** dan dapat meninggalkan alamat email. 2. Pesan beserta percakapan tersebut masuk ke obrolan Telegram staf. Staf menjawab dengan membalas pesan tersebut; balasan akan muncul di obrolan pelanggan sebagai "[brand] Support". 3. Jika tidak ada yang menjawab dalam waktu tunggu (default 10 menit), obrolan akan menjadi tiket di bawah **Customers › Support › Ticket**. Hal yang sama terjadi seketika di luar jam dukungan atau saat Telegram tidak dikonfigurasi, dan pelanggan diberi tahu bahwa tiket telah dibuka. 4. Admin juga dapat melihat obrolan yang sedang berjalan di tab **Live chat**. ## Verifikasi {#verify} 1. Masuk sebagai pelanggan uji coba, buka obrolan, dan ajukan pertanyaan tentang layanan Anda. Asisten akan menjawab. 2. Minta asisten membuat sesuatu yang berbayar: kartu konfirmasi akan muncul dan tidak ada yang dibuat hingga Anda mengklik **Confirm**. 3. Klik **Talk to a human**. Pesan akan sampai ke obrolan Telegram Anda (jika dikonfigurasi) atau, setelah waktu tunggu berlalu, sebuah tiket akan muncul. 4. Dengan tautan Zalo dan Telegram yang terisi, kedua tombol pintas tersebut akan muncul di dalam obrolan. ## Batas & catatan {#limits-notes} - **Batasan laju (per IP):** 20 pesan per menit dan beberapa kali peralihan per jam; **40 pesan per percakapan**. Ini adalah batas tetap. - **Biaya:** setiap giliran AI memanggil penyedia Anda. Turunkan **AI turns / day / customer** untuk membatasi pengeluaran. - **Balasan otomatis nonaktif secara default.** Nyalakan hanya setelah Anda mengamati draf untuk beberapa waktu. - **Bahasa:** asisten menjawab dalam bahasa pelanggan; bahasa Vietnam dideteksi dari teks. - **Reseller:** situs reseller menggunakan tiket alih-alih widget. ## Pemecahan Masalah {#troubleshooting} | Gejala | Penyebab | Solusi | |---|---|---| | Pelanggan tidak dapat melihat obrolan | Modul AI nonaktif, atau **Enable chat widget** nonaktif | Nyalakan keduanya. | | "Sign in to use AI Chat" | Pengunjung belum masuk | Diharapkan di NexCMP: masuk terlebih dahulu. | | Asisten menyatakan tidak ada penyedia AI yang dikonfigurasi | Penyedia tidak ada, tidak digunakan, atau kunci tidak ada | Lengkapi [AI provider](https://nexcmp.com/id/docs/ai/ai-providers/). | | AI membalas "talk to a human" setelah beberapa pertanyaan | Batas harian per pelanggan telah tercapai | Naikkan **AI turns / day / customer**. | | Tag Telegram menampilkan "no channel" | Bot atau chat ID belum dikonfigurasi | Atur [Telegram notifications](https://nexcmp.com/id/docs/administration/telegram-notifications/). | | Tombol Zalo atau Telegram tidak ada | Kolom tautan kosong | Isi tautannya. | | "Too many requests" di dalam chat | Lebih dari 20 pesan per menit dari satu IP | Tunggu sebentar. | | Percakapan chat penuh | Mencapai 40 pesan | Mulai percakapan baru. | --- # AI Agent {#ai-agent} > **Di mana letaknya di admin:** System › Settings › AI provider (`/settings/ai`) — sakelar modul dan provider; System › Admin › License & updates (`/license`) — sakelar modul. **Di mana letaknya di portal:** AI Agent (`/ai/agent`) dan halaman `/chat/agent`, atau mode **Agent** di dalam chat. ## Fungsi {#what-it-does} AI Agent terhubung ke VM Linux milik pelanggan via SSH dan menjalankan tugas yang dideskripsikan dalam bahasa alami: "check system health", "install Docker", "find recent errors", "free up disk space". Agent menampilkan setiap perintah yang diusulkan beserta outputnya. Perintah baca-saja dapat berjalan secara otomatis; apa pun yang mengubah server memerlukan konfirmasi pelanggan yang menekan tombol **Run**. ## Persyaratan {#requirements} | Item | Persyaratan | |---|---| | Modul dan penyedia AI | Modul **AI** aktif dan [AI provider](https://nexcmp.com/id/docs/ai/ai-providers/) berfungsi. Agen juga memerlukan model yang mendukung tool calling. | | `openssh-client` di server panel | Agent menjalankan perintah dengan program `ssh` milik panel sendiri (`/usr/bin/ssh`). Penginstal memasang `openssh-client`; periksa dengan `ssh -V`. Tanpanya, Agent melaporkan "ssh client is not installed on the panel server". | | Tidak ada gateway SSH terpisah | Dalam instalasi default, SSH bawaan digunakan dan terminal web `ssh-proxy` **tidak** diperlukan. Hanya ketika fitur opsional *web SSH* (`feature_ssh_web`) diaktifkan dan layanan `ssh-proxy` dipasang, Agent akan melewati `ssh-proxy`. | | Jaringan | Server panel harus dapat mencapai IP VM pada port SSH-nya (default 22). Periksa firewall dan grup keamanan antara panel dan jaringan tamu. | | VM | Dimiliki pelanggan, **berjalan**, tidak terkunci, **Linux** (VM Windows ditolak), dengan alamat IP publik atau yang dapat dijangkau. | | Kredensial SSH | Nama pengguna dan sandi login VM yang disimpan oleh NexCMP (disimpan saat VM dibuat atau sandinya disetel ulang, dalam keadaan terenkripsi), atau kunci operasi panel jika terpasang. Jika keduanya tidak ada, Agent menyatakan tidak dapat masuk. | ## Siapkan infrastruktur {#prepare-the-infrastructure} 1. Periksa klien SSH di server panel: ```bash ssh -V sudo apt-get install -y openssh-client # only if missing ``` 2. Pastikan server panel dapat membuka SSH ke VM tamu: ```bash nc -vz 198.51.100.10 22 ``` Ganti alamat tersebut dengan IP VM uji. Jika gagal, perbaiki perutean atau firewall terlebih dahulu. 3. Pastikan tamu mengizinkan login kata sandi untuk pengguna yang disimpan NexCMP (beberapa image cloud menonaktifkannya), atau kunci operasi panel telah dipasang di tamu. ## Hubungkan di NexCMP {#connect-in-nexcmp} 1. Lengkapi [AI provider](https://nexcmp.com/id/docs/ai/ai-providers/): modul aktif, penyedia tersimpan, **Test connection** berwarna hijau. 2. Tidak ada hal lain yang dikonfigurasi di sisi admin. Tombol modul membuat entri **AI Agent** muncul di portal pelanggan. 3. Sebagai pelanggan: buka **AI Agent**, pilih server yang berjalan dan klik **Choose server**. Halaman ini pertama-tama menguji SSH dengan perintah aman tetap (tanpa panggilan AI) dan menampilkan *SSH connected* atau alasan kegagalannya. 4. Ketik tugas atau pilih mulai cepat (*Check system health*, *Install Docker*, *Install Nginx*, *Find recent errors*, *Security check*, *Free up disk space*). ## Cara perintah dijalankan {#how-it-runs-commands} - **Dari mana:** server panel, dengan sistem klien `ssh`, satu perintah non-interaktif pada satu waktu. Targetnya selalu IP VM **dari database**, bukan dari permintaan; hanya VM milik pemilik sendiri yang berjalan dan tidak terkunci yang dapat diakses. - **Autentikasi:** kata sandi yang disimpan diteruskan melalui pembantu `SSH_ASKPASS` satu kali di lingkungan proses — kata sandi tidak ditulis ke disk atau dimasukkan ke baris perintah. Kunci host tidak disematkan (VM diinstal ulang dengan kunci baru). Output per perintah dibatasi hingga 200 KB dan setiap perintah memiliki batas waktu (60 detik). - **Perulangan agen:** AI mengusulkan perintah dan membaca output; satu giliran berakhir setelah paling banyak **10 langkah**. - **Mode:** | Mode | Behaviour | |---|---| | **Confirm** | Setiap perintah menunggu **Run**. | | **Auto** | Hanya perintah yang lolos dari daftar izin baca-saja yang ketat yang berjalan sendiri (misalnya `df -h`, `ps`, `journalctl`). Segala hal lainnya, dan apa pun yang tidak dapat dianalisis oleh parser dengan pasti (variabel, substitusi perintah, pengalihan ke file), menunggu **Run**. | - **Label risiko:** perintah yang menimpa atau menghapus file, menulis ke disk, mengubah akun atau SSH keys, mengirim data ke server luar, membuka koneksi jaringan mentah, menjalankan kode yang dikaburkan, mengunduh dan menjalankan skrip, mematikan atau memulai ulang mesin, atau menjangkau server lain selalu menampilkan **Needs confirmation**, bahkan dalam mode Auto. - **Output tidak tepercaya:** output perintah ditampilkan ke model sebagai data tidak tepercaya; instruksi di dalamnya tidak diikuti. ## Verifikasi {#verify} 1. Pilih VM pengujian yang sedang berjalan. Halaman akan menampilkan *SSH connected*. 2. Ajukan pertanyaan "Check CPU, RAM and disk". Dalam mode Auto, perintah baca-saja akan berjalan dan jawabannya merangkumnya. 3. Ajukan pertanyaan "Install Nginx". Perintah instalasi akan muncul dengan tombol **Run** dan **Skip**; tidak ada yang berjalan hingga Anda menekan **Run**. 4. Penghitung di bagian atas menunjukkan jumlah panggilan AI yang digunakan hari ini (misalnya `3/300`). ## Batas & catatan {#limits-notes} - **Batas harian:** 300 panggilan AI per pelanggan per hari (UTC); direset pada pukul 00:00 UTC. Ketika habis, Agen akan menjawab "Daily AI quota reached". - **Konkurensi:** paling banyak 2 Agen berjalan per pelanggan pada waktu yang sama; satu sesi menjalankan satu giliran dalam satu waktu. - **Sesi:** hingga 100 pesan per sesi, 4,000 karakter per pesan. Satu sesi terkait dengan satu VM; jika VM dihapus atau ditransfer, sesi lama menjadi read-only. - **VM terkunci atau berhenti, atau Windows:** VM ditampilkan sebagai *Locked*, *Stopped*, *Windows* atau *No address* dan tidak dapat dipilih. - **Peniruan identitas:** seorang administrator yang meniru identitas pelanggan tidak dapat menggunakan fitur kredensial Agen (lihat [Log in as a customer](https://nexcmp.com/id/docs/customers/login-as/)). - **Tanggung jawab:** Agen dapat membuat kesalahan. Portal memberi tahu pelanggan untuk meninjau perintah sebelum menjalankannya. Beritahu pelanggan dalam ketentuan Anda bahwa mereka bertanggung jawab atas perintah yang mereka setujui. - Mematikan modul AI akan menghapus entri Agen dan rute akan merespons dengan 404 `module_disabled`. ## Pemecahan Masalah {#troubleshooting} | Gejala | Penyebab | Solusi | |---|---|---| | "ssh client tidak terinstal di server panel (apt install openssh-client)" | Tidak ada biner `ssh` | `sudo apt-get install -y openssh-client`. | | "Agent tidak dapat masuk" / `ssh: no saved credentials for this VM` | Tidak ada kata sandi yang disimpan dan tidak ada kunci operasi | Setel ulang kata sandi VM di portal agar disimpan kembali, atau instal kunci operasi. | | "Server tidak merespons tepat waktu" | Firewall, SSH tidak mendengarkan, VM sibuk | Uji `nc -vz 22` dari server panel; mulai `sshd` di dalam VM. | | "Tidak dapat menjangkau SSH di server ini" | Routing atau security group | Izinkan server panel untuk mencapai VM pada port 22. | | "VM tidak berjalan" / "Forbidden" | VM berhenti, terkunci, dihapus, atau bukan milik pelanggan | Nyalakan, buka kunci, atau pilih yang lain. | | "Tidak tersedia: N (dihentikan, dikunci, atau Windows)" | Alasan yang tercantum di atas | VM harus ber-OS Linux dan sedang berjalan. | | "Gateway SSH sementara tidak tersedia" | Fitur Web SSH diaktifkan tetapi `ssh-proxy` sedang mati | Nyalakan `ssh-proxy`, atau matikan fitur web SSH untuk menggunakan SSH bawaan. | | "AI merespons terlalu lambat (lebih dari 90 detik)" | Provider lambat | Gunakan model yang lebih cepat atau **Reasoning effort** yang lebih rendah. | | "Kuota AI harian telah tercapai" | 300 panggilan digunakan | Tunggu hingga 00:00 UTC. | | "Sesi ini masih berjalan" | Putaran lain sedang berlangsung | Tunggu atau tekan **Stop**. | --- # REST API > **Where in the portal:** Referensi API di `https:///apidoc` (publik) dan kunci API di `/api-keys`. **Where in the admin:** Customers › API keys (`/customers/apikeys`) mencantumkan kunci yang dibuat oleh pelanggan. ## Fungsi {#what-it-does} Setiap tindakan yang dapat dilakukan pelanggan di portal — mencantumkan dan mengontrol VM, membaca faktur, mengelola SSH Keys, Kubernetes, storage, tiket dukungan — tersedia melalui REST API berversi di bawah `https:///v1/`. Pelanggan memanggilnya dari skrip dan CI dengan **API key** yang dibatasi cakupannya. API yang sama memberi daya pada [`cmp` command-line tool](https://nexcmp.com/id/docs/developers/cmp-cli/) dan [MCP server](https://nexcmp.com/id/docs/developers/mcp/), dan referensinya dihasilkan dari instalasi yang sedang berjalan, sehingga selalu mencantumkan persis fitur yang telah Anda aktifkan. ## Persyaratan {#requirements} | Item | Persyaratan | |---|---| | Alamat HTTPS publik | API disajikan pada domain utama Anda (dan pada domain masing-masing reseller). | | Sebuah kunci API | Dibuat oleh pelanggan di portal; lihat [API keys](https://nexcmp.com/id/docs/developers/api-keys/). | | Dependensi | Tidak ada. Endpoint modul yang tidak Anda aktifkan (misalnya Kubernetes atau Object Storage) disembunyikan dari referensi dan ditolak. | ## Siapkan infrastruktur {#prepare-the-infrastructure} Tidak ada yang perlu diinstal. Jika reverse proxy berada di depan NexCMP, teruskan `/v1/`, `/mcp`, `/cli/`, dan `/apidoc` ke panel (konfigurasi nginx penginstal sudah melakukannya). ## Hubungkan di NexCMP {#connect-in-nexcmp} ### Referensi interaktif {#the-interactive-reference} Buka `https://cloud.example.com/apidoc` (ganti host dengan domain Anda; pelanggan reseller melihat referensi pada domain reseller, dengan nama reseller). Halaman ini memiliki dokumentasi endpoint dengan contoh permintaan dan respons dalam curl, `cmp` CLI, JavaScript, Python, dan Go, kotak pencarian (Ctrl atau Cmd + K), dan panel **Try it**. Try it mengirimkan permintaan ke situs yang sama saja, dengan kunci yang ditempel oleh pengunjung (disimpan dalam sesi browser); secara default bersifat baca-saja, dan panggilan tulis atau berbayar memerlukan sakelar tambahan dan konfirmasi. ### Unduhan dan dokumen yang dapat dibaca mesin {#downloads-and-machine-readable-documents} Semua bersifat publik, tidak memerlukan kunci, dan dihasilkan per situs: | URL | Konten | |---|---| | `/apidoc` | Referensi interaktif. | | `/v1/public/openapi.json` | Dokumen OpenAPI 3.1. | | `/v1/public/openapi.yaml` | Sama, YAML. | | `/v1/public/postman.json` | Koleksi Postman. | | `/v1/public/insomnia.json` | Ekspor Insomnia. | | `/v1/public/api.md` | Referensi sebagai satu file Markdown. | | `/v1/public/api-catalog` | JSON Ringkas: merek, URL dasar, awalan kunci, setiap cakupan dan setiap titik akhir dengan metode, jalur, cakupan, dan apakah memerlukan `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 ``` Di Postman, pilih **Import › Link** dan tempel `https://cloud.example.com/v1/public/postman.json`. Halaman referensi juga menyediakan klien API satu berkas untuk JavaScript dan Python. ### Autentikasi {#authentication} Kirimkan kunci dalam header `Authorization`: ```bash curl -s https://cloud.example.com/v1/billing/wallet \ -H "Authorization: Bearer vk_XXXX" ``` - Kunci pelanggan dimulai dengan `vk_`. Kunci **terikat situs**: kunci yang dibuat di `cloud.example.com` tidak berfungsi di domain pengecer. - Token sesi peramban (`pt_...`) hanya untuk portal; gunakan kunci untuk otomatisasi. - **Cakupan** kunci menentukan apa saja yang boleh dipanggil; cakupan yang hilang akan membalas HTTP 403 `scope_required`. Lihat [API keys](https://nexcmp.com/id/docs/developers/api-keys/). - Periksa kunci dengan `GET /v1/apikeys/self`: perintah ini mengembalikan nama kunci pemanggil, cakupan, masa kedaluwarsa, dan sisa batas laju yang diizinkan (setiap kunci dapat memanggilnya). ### Contoh {#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 ``` Ambil bidang permintaan persis dari setiap operasi dari `/apidoc`. ### Galat {#errors} Setiap galat berupa JSON dengan `code` yang stabil and `message` yang mudah dibaca manusia: ```json {"error": {"code": "scope_required", "message": "Key lacks scope vm:write"}} ``` | HTTP | Khas `code` | Arti | |---|---|---| | 401 | `unauthenticated`, `key_invalid`, `key_revoked`, `key_expired`, `key_ip_denied`, `site_mismatch`, `api_keys_disabled` | Kunci hilang atau tidak dikenal, dicabut, kedaluwarsa, IP pemanggil di luar daftar izin kunci, kunci dari situs lain, atau kunci API dimatikan. | | 403 | `scope_required`, `endpoint_not_public`, `account_blocked`, `quota_exceeded`, `impersonate_forbidden` | Kunci tidak memiliki cakupan; titik akhir tidak tersedia untuk kunci; akun terkunci; [kuota](https://nexcmp.com/id/docs/billing/quotas/) tercapai; tindakan tidak diizinkan dalam sesi yang disamar. | | 404 | `not_found` | Tidak ditemukan — juga dikembalikan untuk sumber daya milik orang lain. | | 422 | `invalid_argument` | Galat validasi (bidang disebutkan dalam respons). | | 429 | `rate_limited` | Terlalu banyak permintaan; tunggu selama `Retry-After`. | | 503 | `maintenance` | Mode pemeliharaan aktif: pembacaan berfungsi, penulisan ditolak. | ### Batas laju {#rate-limits} | Batas | Default | |---|---| | Per kunci | 120 permintaan per menit | | Per akun (semua kunci digabungkan) | 300 permintaan per menit | Setiap respons membawa `X-RateLimit-Limit`, `X-RateLimit-Remaining`, dan `X-RateLimit-Reset`; kode 429 menambahkan `Retry-After`. ### Idempotensi {#idempotency} Perintah yang memakan biaya atau tidak dapat diulang (membuat, mengubah paket, membeli, menghapus ...) **memerlukan** header `Idempotency-Key` (string apa pun hingga 200 karakter; UUID sangat cocok). Kirim kunci yang sama lagi setelah waktu habis dan server akan mengembalikan hasil **asli** (dengan `Idempotency-Replayed: 1`) alih-alih mengulangi operasi. Menggunakan kembali kunci untuk perintah yang berbeda akan menjawab 422; permintaan yang masih berjalan menjawab 409/`Retry-After`. Tanpa header tersebut, panggilan berbayar akan ditolak. ## Verifikasi {#verify} 1. Buat kunci dengan cakupan `vm:read` di portal (**API keys › Create key**). 2. Jalankan: ```bash curl -i https://cloud.example.com/v1/apikeys/self -H "Authorization: Bearer vk_XXXX" ``` Anda mendapatkan HTTP 200 dan header batas laju. 3. `curl -s https://cloud.example.com/v1/vm -H "Authorization: Bearer vk_XXXX"` mencantumkan VM akun. Di portal, kolom **Last used** milik kunci dan **Key usage log** menampilkan panggilan tersebut. ## Batas & catatan {#limits-notes} - **Tidak pernah tersedia untuk kunci:** isi ulang, tarik dana, ubah kartu atau isi ulang otomatis, ubah sandi, email atau 2FA, hapus akun, buat, edit, atau cabut kunci lainnya. Tindakan tersebut memerlukan sesi peramban yang masuk. - **Modul tersembunyi:** referensi dan dokumen OpenAPI hanya mencantumkan fitur yang diaktifkan di situs tersebut. - **Ukuran respons dan penomoran halaman:** titik akhir daftar menggunakan penomoran halaman (`page`, `per_page`); baca dokumen OpenAPI untuk setiap titik akhir. - **Waktu dan uang:** mata uang dalam sen USD kecuali nama bidang menyatakan sebaliknya. - **API Admin:** konsol admin memiliki halaman **System › Admin › API** sendiri dan kunci administrator (`ofw_...`) untuk administrasi; keduanya terpisah dari API pelanggan yang dijelaskan di sini. - **Pengartian versi:** awalan jalur `/v1` bersifat stabil; bidang baru dapat ditambahkan ke respons. ## Pemecahan Masalah {#troubleshooting} | Gejala | Penyebab | Solusi | |---|---|---| | 401 pada kunci baru | Kunci dari domain lain, Kedaluwarsa, atau diketik dengan spasi | Buat kunci pada domain yang Anda panggil; periksa header `Authorization: Bearer vk_...`. | | 403 `scope_required` | Cakupan tidak ada | Edit kunci di portal dan tambahkan cakupan tersebut. | | 401 `key_ip_denied` atau `site_mismatch` | Kunci dibatasi ke IP lain ("IP yang diizinkan") atau dibuat di domain lain | Tambahkan IP server Anda ke IP yang diizinkan pada kunci, atau panggil domain tempat kunci dibuat. | | 404 pada VM yang ada | VM tersebut milik akun lain | Gunakan kunci milik pemiliknya. | | 400/422 meminta `Idempotency-Key` | Operasi berbayar tanpa header | Tambahkan `Idempotency-Key: `. | | 429 | Melebihi batas | Kurangi permintaan; gunakan `Retry-After`. | | `/apidoc` menampilkan hasil yang lebih sedikit dari perkiraan | Modul dimatikan | Aktifkan modul di License & updates. | --- # Kunci API dan cakupan {#api-keys-and-scopes} > **Di mana di portal:** API keys (`/api-keys`). **Di mana di admin:** Customers › Customers › API keys (`/customers/apikeys`). ## Fungsi {#what-it-does} Sebuah **API key** memungkinkan skrip, pekerjaan CI, [`cmp` CLI](https://nexcmp.com/id/docs/developers/cmp-cli/), atau asisten AI ([MCP](https://nexcmp.com/id/docs/developers/mcp/)) memanggil [REST API](https://nexcmp.com/id/docs/developers/api/) atas nama pelanggan, hanya dengan izin (**cakupan**) yang diberikan. Kunci pelanggan dimulai dengan `vk_`. Mereka dapat membaca dan mengelola layanan tetapi **tidak pernah** dapat menyentuh keuangan atau akun itu sendiri. ## Persyaratan {#requirements} | Item | Persyaratan | |---|---| | Pelanggan | Sesi portal yang sedang masuk (kunci tidak dapat membuat atau mengedit kunci lain, dan administrator yang menyamar sebagai pelanggan juga tidak dapat melakukannya). | | Switch | Kunci API diaktifkan secara default. Jika dimatikan, panggilan akan merespons 401 `api_keys_disabled`. | | Dependensi | Cakupan produk hanya akan muncul jika produk tersebut diaktifkan di situs. | ## Membuat kunci (pelanggan) {#create-a-key-customer} 1. Masuk ke portal dan buka **API keys**. 2. Klik **Create key**. 3. Isi formulir berikut: | Kolom | Aturan | |---|---| | **Key name** | Wajib diisi, hingga 60 karakter ("deploy server", "backup script"). | | **Apa yang dapat dilakukan kunci ini** | Centang cakupan yang Anda perlukan — minimal satu. Kunci baca-saja sebaiknya tidak memiliki cakupan tulis. Harap berhati-hati dengan cakupan yang memerlukan biaya atau menghapus data. | | **Expiry** | Tidak pernah, 30 hari, 90 hari, atau 1 tahun (API menerima 1 hingga 3650 hari). | | **Hanya izinkan panggilan dari IP ini** | Satu IP atau rentang CIDR per baris, hingga 20 (IPv4 atau IPv6). Kosong berarti IP apa pun. Sematkan IP server Anda jika memungkinkan. | 4. Konfirmasikan formulir. Kunci hanya ditampilkan **sekali** dalam jendela "Key created — shown ONCE". Salin kunci tersebut dan klik **I saved the key**. Hanya hash SHA-256 yang disimpan, sehingga administrator pun tidak dapat membacanya kembali; jika Anda Kehilangan kunci tersebut, cabut dan buat yang baru. 5. Portal juga menampilkan perintah `curl` siap pakai untuk menguji kunci tersebut. Kunci akan terlihat seperti `vk_` diikuti oleh string acak yang panjang. Daftar hanya menampilkan karakter pertama (misalnya `vk_a1b2c3d4`), cakupan, masa berlaku, penggunaan terakhir, jumlah permintaan, dan status (*Active*, *Expired*, *Revoked*). ### Edit, cabut, audit {#edit-revoke-audit} - **Edit** mengubah nama, cakupan, IP yang diizinkan, dan masa kedaluwarsa. Tidak diizinkan selama sesi yang ditiru. - **Revoke** segera menghentikan kunci dan tidak dapat dibatalkan. Baris tetap disimpan agar log penggunaannya tetap tersedia. - **Key usage log** menampilkan perintah tulis dan setiap kesalahan dari 60 hari terakhir: waktu, permintaan, kunci, hasil, dan IP sumber. - Sebuah akun secara default dapat memiliki paling banyak **10 active keys**. - Kunci yang dibuat melalui CLI atau login MCP akan muncul di bawah **Connected apps & devices** dan dapat dicabut di sana. ## Cakupan {#scopes} Nama cakupan memiliki bentuk `area:action`. Cakupan mana yang ditawarkan bergantung pada produk yang Anda aktifkan. | Cakupan | Mengizinkan | |---|---| | `catalog:read` | Membaca paket dan katalog. | | `vm:read` | Membaca VM, metrik, dan invoice VM. | | `vm:write` | Tindakan daya, perubahan kecil, firewall, snapshot cepat. | | `vm:create` | **Membuat VM (berbayar).** | | `vm:plan` | **Mengubah paket atau mengubah ukuran (berbayar).** | | `vm:destroy` | **Menghapus VM.** | | `vm:restore` | **Memulihkan VM dari snapshot (menimpa disk).** | | `vm:console` | Membuka tiket konsol VNC. | | `sshkey:read`, `sshkey:write` | Membaca, menambahkan, dan menghapus SSH Keys. | | `volume:read`, `volume:write`, `volume:create`, `volume:destroy` | Volume data (pembuatan dan penambahan ukuran berbayar; penghancuran menghilangkan data). | | `backup:read`, `backup:write`, `backup:restore` | Backups (pemulihan menimpa disk). | | `billing:read` | Dompet, invoice, riwayat pembayaran — **hanya baca**. | | `bandwidth:buy` | **Membeli add-on bandwidth (berbayar).** | | `account:read`, `account:write` | Profil, ringkasan, aktivitas, notifikasi; `account:write` hanya menandai notifikasi sebagai sudah dibaca. | | `apikey:read` | Menampilkan kunci akun dan log penggunaan (tidak dapat membuat, mengedit, atau mencabut). | | `apikey:self` | Implisit pada setiap kunci: memeriksa kunci yang memanggil (`GET /v1/apikeys/self`). | | `ticket:read`, `ticket:write` | Tiket dukungan. | | `aff:read`, `transfer:read` | Program afiliasi dan transfer layanan — hanya baca. | | `k8s:read`, `k8s:write`, `k8s:create`, `k8s:scale`, `k8s:destroy`, `k8s:kubeconfig` | Kubernetes (pembuatan dan penskalaan berbayar; kubeconfig adalah cluster-admin). | | `vpc:read`, `vpc:write`, `vpc:create`, `vpc:destroy` | Cloud Pribadi. | | `image:read`, `image:write` | Image OS dan ISO (penyimpanan ditagih per jam). | | `s3:read`, `s3:write`, `s3:create`, `s3:destroy`, `s3:keys` | Object Storage (rahasia S3 ditampilkan sekali). | | `vpn:read`, `vpn:detail`, `vpn:write`, `vpn:create`, `vpn:destroy` | VPN dan proksi IPv6 (detail koneksi menyertakan kata sandi proksi). | | `dedicated:read`, `dedicated:write`, `dedicated:console`, `dedicated:create`, `dedicated:destroy` | Dedicated servers (buat pesanan dari dompet; hancurkan instal ulang OS). | | `shield:read`, `shield:write`, `shield:agent` | DDoS Shield, hanya jika modul tersebut diaktifkan. | Panggilan di luar cakupan kunci akan menjawab **403 `scope_required`**; jalur yang tidak boleh dipanggil oleh kunci mana pun akan menjawab **403 `endpoint_not_public`**. ### Hal yang tidak boleh dilakukan oleh kunci {#what-a-key-can-never-do} Tidak ada cakupan yang membuka: mengisi ulang atau menarik uang, mengubah kartu atau pengisian ulang otomatis, mengubah kata sandi, email atau 2FA, menghapus akun, membuat, mengedit, atau mencabut kunci lain. Tindakan ini selalu memerlukan peramban yang masuk. Bahkan kunci yang bocor tidak dapat menyentuh uang atau akun pelanggan. ## Aturan yang dapat Andaandalkan {#rules-you-can-rely-on} | Aturan | Detail | |---|---| | Terikat situs | Kunci hanya berfungsi di situs (domain) tempat kunci tersebut dibuat. | | Batas laju | Per kunci dan per akun: 120 dan 300 permintaan per menit secara default. | | Idempotensi | Operasi yang memerlukan biaya atau tidak dapat diulang memerlukan header `Idempotency-Key`. | | Quotas | Kunci tunduk pada [quotas](https://nexcmp.com/id/docs/billing/quotas/) yang sama dengan pelanggan. | | Akun terkunci | Kunci pelanggan yang dikunci berhenti berfungsi (403 `account_blocked`). | | Audit | Pencabutan oleh administrator dicatat ke dalam log audit admin. | ## Tampilan administrator {#administrator-view} 1. Buka **Customers › API keys** (`/customers/apikeys`). Tabel menampilkan nama dan karakter pertama kunci, pemilik, cakupan, status, penggunaan terakhir (waktu, jumlah permintaan, IP), kedaluwarsa. 2. Filter berdasarkan situs jika Anda memiliki reseller. Cari berdasarkan nama, ID, atau awalan kunci. 3. Klik **Revoke** untuk menghentikan kunci aktif, atau **Log** untuk melihat penggunaannya. 4. Administrator **melihat dan mencabut** kunci tetapi tidak dapat membaca atau membuatkannya untuk pelanggan. ![Daftar kunci API pelanggan oleh administrator dengan cakupan, status, penggunaan terakhir, dan tombol Revoke](https://nexcmp.com/id/docs/images/developers/api-keys-02-admin.webp) ## Verifikasi {#verify} 1. Buat kunci dengan cakupan `vm:read` saja. 2. `curl -s https://cloud.example.com/v1/vm -H "Authorization: Bearer vk_XXXX"` mengembalikan daftar VM. 3. `curl -s -X POST .../v1/vm//start -H "Authorization: Bearer vk_XXXX"` merespons 403 `scope_required`. 4. Cabut kunci tersebut; panggilan pertama kini merespons 401 `key_revoked`. ## Batas & catatan {#limits-notes} - Kunci tidak akan pernah ditampilkan lagi. Perlakukan seperti kata sandi dan simpan di pengelola rahasia atau rahasia CI. - Lebih baik gunakan satu kunci per skrip, cakupan minimal, masa kedaluwarsa singkat, dan daftar izin IP; lakukan rotasi dengan membuat kunci baru dan mencabut yang lama. - Kunci dari login perangkat (CLI, MCP) secara default berlaku selama 90 hari. - Sumber daya yang dihapus atau ditransfer tidak terdampak oleh pencabutan kunci. ## Pemecahan Masalah {#troubleshooting} | Gejala | Penyebab | Solusi | |---|---|---| | Error `too_many_keys` (422) | Batas kunci aktif (default 10) tercapai | Cabut kunci lama. | | Error `invalid_argument`: tidak ada cakupan yang dipilih | Tidak ada cakupan yang dicentang | Centang setidaknya satu cakupan. | | Error `invalid_argument` pada IP yang diizinkan | Entri bukan berupa IP atau rentang, panjang prefiks salah, atau lebih dari 20 entri | Satu IP atau CIDR per baris, contohnya `203.0.113.0/24`. | | Pembuatan ditolak selama peniruan identitas | `impersonate_forbidden` | Minta pelanggan untuk membuat kunci tersebut. | | 401 `key_expired` | Tanggal kedaluwarsa telah lewat | Buat kunci baru. | | 401 `key_ip_denied` | IP pemanggil tidak ada dalam daftar izin | Tambahkan IP atau kosongkan daftarnya. | | 401 `api_keys_disabled` | Fitur dimatikan | Tanyakan kepada administrator Anda (pengaturan `api_keys_enabled`). | --- # Alat baris perintah `cmp` {#cmp-command-line-tool} > **Di mana letaknya di portal:** perintah instalasi berada di referensi API (`https:///apidoc`, bagian Antarmuka baris perintah). Menyetujui login: `https:///link`. Perangkat terhubung: API keys (`/api-keys`) › Connected apps & devices. ## Fungsi {#what-it-does} `cmp` adalah program baris perintah kecil untuk pelanggan Anda (dan Anda) yang mengubah **setiap operasi API menjadi sebuah perintah**: `cmp vm list`, `cmp vm start `, `cmp billing invoice list`. Program ini dibangun dari dokumen OpenAPI instalasi **Anda** pada saat rilis, sehingga perintahnya cocok dengan fitur yang Anda aktifkan. Ini adalah satu biner statis untuk Linux, macOS, dan Windows (amd64 serta arm64) tanpa ada hal lain yang perlu dipasang. ## Persyaratan {#requirements} | Item | Persyaratan | |---|---| | Server | Tidak ada tambahan. Paket rilis berada di dalam rilis NexCMP dan disajikan oleh panel di `https:///cli/`. | | Mesin pelanggan | Linux, macOS, atau Windows (PowerShell 5.1+). `ssh-keygen` (OpenSSH 8.0+) hanya diperlukan untuk memverifikasi tanda tangan. | | Kredensial | Login browser dengan kode sekali pakai, atau [API key](https://nexcmp.com/id/docs/developers/api-keys/). | | Jaringan | HTTPS ke panel Anda. CLI menolak mengirim kunci melalui `http://` biasa kecuali ke `localhost`. | ## Siapkan infrastruktur {#prepare-the-infrastructure} Tidak ada. Panel menyajikan file-file ini dari `/cli/` (tidak perlu build atau unggah): | File | Tujuan | |---|---| | `install.sh`, `install.ps1` | Installer untuk Linux/macOS dan Windows; berisi alamat panel Anda. | | `latest.json` | Versi saat ini, daftar file, ukuran, sha256. | | `v/cmp___.tar.gz` atau `.zip` | Program: linux amd64/arm64, darwin amd64/arm64/universal, windows amd64/arm64. | | `v/SHA256SUMS`, `SHA256SUMS.sig` | Checksum dan tanda tangan ed25519-nya. | | `cmp-cli.pub` | Kunci publik rilis. | ## Instal (pelanggan) {#install-customer} macOS dan Linux: ```bash curl -fsSL https://cloud.example.com/cli/install.sh | sh ``` Windows PowerShell: ```powershell irm https://cloud.example.com/cli/install.ps1 | iex ``` Installer memilih paket untuk OS dan CPU, mengunduh `SHA256SUMS` beserta tanda tangannya, memverifikasi tanda tangan dengan kunci yang disematkan dalam skrip, memverifikasi hash paket, dan menginstal `cmp` ke `/usr/local/bin` (sebagai root) atau `~/.local/bin`; pada Windows ke `%LOCALAPPDATA%\cmp\bin` (ditambahkan ke `PATH` pengguna). Jika pemeriksaan gagal, tidak ada yang diinstal. | Variabel | Arti | |---|---| | `CMP_VERSION` | Instal versi ini alih-alih versi terbaru. | | `CMP_INSTALL_DIR` | Folder instalasi. | | `CMP_REQUIRE_SIGNATURE` | `1` = batalkan ketika tanda tangan tidak dapat diverifikasi. | | `CMP_BASE_URL` | Basis unduhan (untuk mirror). | Unduh dan verifikasi manual: ```bash curl -fsSLO https://cloud.example.com/cli/latest.json sha256sum --check --ignore-missing SHA256SUMS ``` ![Bagian referensi API dengan perintah cmp install untuk macOS dan Linux](https://nexcmp.com/id/docs/images/developers/cmp-cli-01-install.webp) ## Masuk {#log-in} ```bash cmp login ``` 1. CLI mencetak **kode** sekali pakai dan tautan (`https://cloud.example.com/link?code=WDJB-MJHT`), membuka browser, lalu menunggu. 2. Di browser, masuk ke portal, periksa nama klien, perangkat, IP, dan negara, centang izin (scope) dan pilih masa aktif kunci (default 90 hari). Izin yang berbayar atau menghapus data tidak dicentang secara default. Klik setujui. 3. CLI menerima **kuncinya sendiri**, terpisah dari kunci yang dibuat pelanggan secara manual, dan menyimpannya di `~/.config/cmp/config.json` (mode `0600`; `%APPDATA%\cmp` pada Windows). Kunci ini muncul di bawah **API keys › Connected apps & devices** dan dapat dicabut di sana. Kode kedaluwarsa setelah 10 menit. Persetujuan memerlukan sesi portal masuk yang valid dengan email yang terverifikasi — bukan kunci lain dan bukan sesi tiruan. Flag yang berguna: `--scopes vm:read,billing:read`, `--name "build server"`, `--no-browser`, `--profile`, `--api-url`. Untuk CI atau server tanpa browser, gunakan kunci dari portal: ```bash printf %s "$KEY" | cmp login --with-token export CMP_TOKEN=vk_XXXX # nothing is written to disk cmp whoami ``` ## Menggunakan perintah {#using-commands} ```text cmp [subgroup] [ ...] [flags] ``` - Parameter jalur adalah argumen posisional; parameter kueri dan field body menjadi flag berformat kebab-case (`--start-port 443`). - `--data '{"a":1}'`, `--data @file.json`, atau `--data -` mengirim seluruh body JSON; flag akan menimpa field-nya. - `cmp help vm firewall add` (atau `--help`) menampilkan detail perintah apa pun. ```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 ``` Perintah bawaan: `login`, `logout`, `whoami`, `config`, `api`, `completion`, `version`, `update`, `help`. Selebihnya berasal dari dokumen API. Flag global: | Flag | Arti | |---|---| | `-o, --output json\|table\|yaml` | Format. Default `table` pada terminal dan `json` saat di-pipe. | | `--profile`, `--api-url` | Login dan situs tersimpan yang digunakan. | | `-y, --yes` | Lewati konfirmasi untuk perintah destruktif atau berbayar. | | `--idempotency-key ` | Pilih kunci untuk perintah berbayar. | | `--retry ` | Pada HTTP 429, tunggu selama `Retry-After` dan coba lagi hingga n kali. | | `--timeout ` | Detik untuk menunggu header respons (default 60). | | `--debug` | Tampilkan pertukaran HTTP pada stderr, dengan kunci yang disamarkan. | Perintah yang **mengisi dompet atau menghapus data** akan meminta konfirmasi dan, jika berbayar, mengirimkan `Idempotency-Key` yang dibuat secara otomatis (dicetak di stderr, sehingga Anda dapat mencoba ulang dengan aman menggunakan `--idempotency-key`). Tanpa terminal, perintah akan menolak kecuali jika `--yes` disertakan. ### Kode keluar {#exit-codes} | Kode | Arti | |---|---| | 0 | Berhasil | | 1 | Error lain (jaringan, HTTP 4xx/5xx yang tidak tercantum) | | 2 | Error penggunaan | | 3 | Tidak diotorisasi (401/403) | | 4 | Tidak ditemukan (404) | | 5 | Terkena batasan laju (429) | | 6 | Konfirmasi diperlukan atau ditolak | | 130 | Diinterupsi | ### Profil dan lingkungan {#profiles-and-environment} `cmp config` mencantumkan profil; `cmp config use ` beralih profil; pelanggan reseller menggunakan domain mereka sendiri: `cmp login --api-url https://shop.example.net --profile shop`. Prioritas: flag, lingkungan, file konfigurasi. Variabel: `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' ``` Penyelesaian shell: `cmp completion bash|zsh|fish|powershell`. ## Pembaruan dan uninstal {#update-and-uninstall} ```bash cmp version cmp update --check cmp update ``` `cmp update` mengunduh `latest.json`, `SHA256SUMS` beserta tanda tangannya, memverifikasi tanda tangan menggunakan kunci publik yang **disematkan di dalam biner yang berjalan**, memverifikasi hash paket, lalu mengganti dirinya sendiri. Downgrade memerlukan `--force`. Saat Anda memperbarui NexCMP, panel akan menyediakan rilis CLI yang disertakan bersama versi baru. Untuk mengosongkan/menghapus instalasi, hapus biner `cmp` dan direktori konfigurasi (`cmp config path` menunjukkannya). Cabut kunci di bawah **API keys** jika mesin hilang. ## Verifikasi {#verify} 1. `cmp version` mencetak versi serta versi dokumen API. 2. `cmp login`, setujui di browser, lalu `cmp whoami` menampilkan profil dan URL panel Anda. 3. `cmp vm list` mengembalikan VM Anda; `cmp vm list -o json | jq .` menampilkan JSON mentah. ## Batas & catatan {#limits-notes} - Daftar perintah bergantung pada build Anda: paket dihasilkan dari dokumen OpenAPI instalasi Anda saat rilis dibuild, sehingga produk yang dinonaktifkan pada rilis Anda tidak memiliki perintah. Gunakan `cmp api` untuk jalur yang tidak dikenali oleh CLI. - CLI berada di bawah lisensi MIT. - Setiap paket ditandatangani dengan kunci ed25519; kunci tanda tangan disematkan di dalam penginstal dan biner, tidak diambil pada saat pembaruan. - Kunci dibatasi per kunci dan per akun (lihat [REST API](https://nexcmp.com/id/docs/developers/api/#rate-limits)). ## Pemecahan Masalah {#troubleshooting} | Gejala | Penyebab | Solusi | |---|---|---| | `curl .../cli/install.sh` mengembalikan 404 | Rilis pada server tidak memiliki folder CLI, atau host tidak tercakup dalam lisensi | Periksa `https:///cli/latest.json` dan domain; perbarui NexCMP. | | "tanda tangan tidak dapat diverifikasi" | `ssh-keygen` hilang atau terlalu lama | Instal OpenSSH 8.0+, atau tetapkan `CMP_REQUIRE_SIGNATURE=0` hanya jika Anda menerima risikonya. | | `cmp login` menyatakan kode kedaluwarsa | 10 menit telah berlalu | Jalankan `cmp login` lagi. | | Kode keluar 3 | Kunci tidak memiliki cakupan, sudah kedaluwarsa, atau dicabut | `cmp whoami`; buat atau setujui ulang dengan cakupan yang lebih luas. | | Kode keluar 6 dalam skrip | Perintah berbayar atau destruktif tanpa terminal | Tambahkan `--yes` (serta `--idempotency-key` Anda sendiri). | | "menolak mengirim kunci melalui http" | URL API HTTP biasa | Gunakan `https://`, atau `CMP_ALLOW_HTTP=1` hanya untuk keperluan lab. | | Browser membuka situs yang salah | `--api-url` tidak diatur untuk reseller | `cmp login --api-url https://`. | --- # MCP server {#mcp-server} > **Di mana letaknya di portal:** API reference › Tools (`https:///apidoc`) menampilkan snippet endpoint dan klien; kunci dibuat di API keys (`/api-keys`). Tidak ada pengaturan di admin: endpoint ini merupakan bagian dari panel. ## Fungsi {#what-it-does} **Model Context Protocol (MCP)** memungkinkan asisten AI memanggil tool. NexCMP menyediakan endpoint MCP di `https:///mcp`. Setiap operasi API publik menjadi satu **tool** (`vm_list`, `vm_start`, `billing_wallet`, ...), sehingga pelanggan dapat bertanya kepada asisten mereka "VM mana saja milik saya yang sedang berjalan?" atau "hentikan VM staging". Asisten bertindak hanya dengan kunci API dan izin milik pelanggan itu sendiri. ::: tip Mengonfigurasi NexCMP itu sendiri dengan AI? Halaman ini adalah endpoint MCP **pelanggan** (`/mcp`). Untuk membiarkan asisten AI mengonfigurasi panel Anda sendiri sebagai administrator, lihat [Configure with AI](https://nexcmp.com/id/docs/configure-with-ai/mcp-admin/) (endpoint `/mcp/admin`, kunci admin `ak_`). ::: ## Persyaratan {#requirements} | Item | Persyaratan | |---|---| | Server | Tidak ada yang perlu diinstal: endpoint dilayani oleh panel dan dapat dijangkau di mana pun panel berada. Reverse proxy Anda harus meneruskan `/mcp` ke panel. | | Pelanggan | Sebuah [API key](https://nexcmp.com/id/docs/developers/api-keys/) (`vk_...`) dengan cakupan (scope) yang dibutuhkan oleh asisten. | | Klien | Klien MCP yang mendukung transpor **Streamable HTTP** dan header kustom `Authorization`: Claude Code, Claude Desktop (melalui bridge `mcp-remote`), Cursor, VS Code dengan mode agen Copilot, dan sejenisnya. | | Versi protokol | 2025-11-25, 2025-06-18, dan 2025-03-26. | ## Siapkan infrastruktur {#prepare-the-infrastructure} Tidak ada, selain memastikan `https:///mcp` tidak diblokir oleh firewall atau aturan proxy. Klien MCP berbasis browser dari origin lain akan ditolak kecuali origin tersebut diizinkan; klien command-line dan desktop tidak mengirim header `Origin` dan berfungsi sebagaimana mestinya. ## Menghubungkan (sisi pelanggan) {#connect-customer-side} 1. Buat kunci API di portal (**API keys › Create key**) hanya dengan cakupan yang ingin Anda gunakan untuk asisten, masa kedaluwarsa yang singkat, dan jika memungkinkan, pembatasan IP. 2. Tambahkan server ke klien Anda. Ganti `cloud.example.com` dan kuncinya. **Claude Code** ```bash claude mcp add --transport http cloud https://cloud.example.com/mcp \ --header "Authorization: Bearer vk_XXXX" ``` **Cursor** (`~/.cursor/mcp.json` atau `.cursor/mcp.json`; tetapkan `CLOUD_API_KEY` di environment tempat Cursor dijalankan): ```json { "mcpServers": { "cloud": { "url": "https://cloud.example.com/mcp", "headers": { "Authorization": "Bearer ${env:CLOUD_API_KEY}" } } } } ``` **Claude Desktop** (memerlukan Node.js 18+; `claude_desktop_config.json`), melalui bridge `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" } } } } ``` Tulis header tanpa spasi setelah titik dua dan masukkan seluruh nilai ke dalam variabel environment, seperti di atas. 3. Muat ulang klien dan minta untuk mencantumkan tool Anda. Periksa koneksi tanpa klien: ```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"}' ``` ## Cara kerja {#how-it-works} | Item | Detail | |---|---| | Endpoint | `POST /mcp` dengan pesan JSON-RPC 2.0; jawabannya adalah `application/json`. `GET /mcp` menjawab 405 (tidak ada stream server-to-client); `DELETE /mcp` mengakhiri sesi. | | Autentikasi | Hanya `Authorization: Bearer vk_...` (token sesi, cookie, dan kunci admin ditolak dengan 401 dan header `WWW-Authenticate: Bearer`). | | Sesi | `Mcp-Session-Id` diterbitkan oleh `initialize`, terikat ke kunci tersebut, berlaku selama 24 jam; maksimal 16 sesi per kunci. | | Peralatan | Satu untuk setiap operasi API publik yang terlihat oleh kunci. Nama tool adalah perintah CLI dengan `_` sebagai pengganti spasi dan tanda hubung (`vm firewall add` menjadi `vm_firewall_add`) dan sama dengan `operationId` pada OpenAPI. Tool dicantumkan hanya jika kunci memiliki cakupannya dan modul diaktifkan. | | Kapabilitas | Hanya tool (tidak ada resource atau prompt). | | Ukuran | Body request hingga 1 MB; teks hasil tool hingga sekitar 100 KB (sisanya dipotong dengan catatan); panggilan memakan waktu paling lama 55 detik. | ### Aturan keamanan {#safety-rules} - **Gerbang yang sama seperti REST.** Setiap `tools/call` melalui pipeline permintaan panel sendiri: cakupan, situs, pembatasan IP, batas laju, idempotensi, pemeriksaan kepemilikan (404 untuk sumber daya milik orang lain), dan kuota semuanya berlaku. MCP tidak dapat memberikan apa pun yang tidak dimiliki oleh kunci tersebut. - **Konfirmasi.** Alat yang memerlukan biaya, menghapus, atau mengembalikan kredensial (tiket konsol, kubeconfig, rahasia S3 atau SSH, pengaturan ulang kata sandi, kunci baru) memerlukan argumen `confirm: true`. Deskripsi alat menginstruksikan asisten untuk meneruskannya hanya setelah pengguna menyetujui, sehingga instruksi yang disembunyikan di halaman web atau log tidak dapat memicunya sendiri. - **Idempotensi.** Alat berbayar menerima `idempotency_key`; jika diabaikan, kunci yang stabil akan turunan dari nama alat dan argumennya, sehingga percobaan ulang yang identik tidak dapat menagih dua kali. - **Tidak diekspos sebagai alat:** titik akhir streaming (obrolan AI Agent), tiket WebSocket SSH atau konsol satu kali, unduhan biner, dan titik akhir aplikasi VPN (`/v1/ext/*`). - **Tidak pernah diizinkan:** API tidak pernah mengizinkan isi ulang, perubahan kata sandi, penghapusan akun, atau pembuatan kunci, sehingga tidak ada asisten yang dapat melakukannya. ### Batas {#limits} | Batas | Default | |---|---| | Pemanggilan alat per kunci | 60 per menit | | Permintaan MCP per kunci | 240 per menit | | Ditambah batas kunci dan akun normal | Lihat [REST API](https://nexcmp.com/id/docs/developers/api/#rate-limits) | Melebihi batas, titik akhir akan menjawab HTTP 429 dengan galat JSON-RPC dan `Retry-After`. ## Verifikasi {#verify} 1. Perintah `curl` di atas mengembalikan hasil JSON-RPC dengan daftar `tools`. Hanya alat yang cocok dengan cakupan kunci yang akan muncul. 2. Di klien Anda, tanyakan "list my VMs": asisten memanggil `vm_list` dan menampilkan hasilnya. 3. Di portal, waktu **Last used** pada kunci akan bergeser, dan panggilan tulis akan muncul di **Key usage log**. ## Batas & catatan {#limits-notes} - **Masuk peramban (OAuth).** Halaman referensi juga menjelaskan cara masuk melalui peramban untuk klien yang mendukung MCP OAuth. Pada instalasi NexCMP yang didukung dan teruji adalah kunci API (atau `cmp login` untuk CLI). - **Situs reseller** tidak menampilkan bagian MCP; pelanggan mereka menggunakan domain reseller untuk API. - **Hak istimewa minimum.** Buat kunci khusus untuk setiap asisten dengan cakupan baca terlebih dahulu; tambahkan cakupan tulis hanya bila diperlukan. - Cabut kunci di **API keys** untuk memutus akses asisten secara instan. ## Pemecahan Masalah {#troubleshooting} | Gejala | Penyebab | Solusi | |---|---|---| | 401 dengan `WWW-Authenticate: Bearer` | Tidak ada kunci, kunci salah, atau token sesi | Kirim `Authorization: Bearer vk_...`. | | 403 tentang `Origin` | Halaman peramban pada asal yang berbeda | Gunakan klien desktop atau CLI; atau minta administrator Anda untuk mengizinkan asal tersebut (`mcp_allowed_origins`). | | 404 pada permintaan dengan `Mcp-Session-Id` | Sesi milik kunci lain atau kedaluwarsa | Jalankan `initialize` lagi. | | 405 pada `GET /mcp` | Harapan: server tidak memiliki alur peristiwa | Gunakan POST saja (klien melakukan ini secara otomatis). | | Daftar alat terlalu pendek | Cakupan kunci atau modul | Tambahkan cakupan ke kunci; aktifkan modul. | | Alat menjawab bahwa ia membutuhkan `confirm: true` | Alat berbayar, hapus, atau sensitif | Asisten harus menyetel `confirm` setelah Anda menyetujui. | | 429 | Batas laju MCP atau kunci | Tunggu hingga `Retry-After`. | | Klien tidak dapat terhubung dengan tajuk | Klien tanpa dukungan tajuk kustom | Gunakan jembatan `mcp-remote`. | --- # Configure with AI {#configure-with-ai} > **Di mana letaknya di admin:** AI Chat (`/agent`) dan System › Settings › API & AI agents (`/agent/keys`). Segala hal di halaman ini khusus untuk administrator. ## Fungsi {#what-it-does} Mulai NexCMP 1.4.0 Anda dapat meminta asisten AI untuk mengonfigurasi panel untuk Anda: menghubungkan Proxmox VE atau CloudStack, membuat zona, menyusun tabel paket dari biaya Anda, menyiapkan email, pembayaran, dan branding, mencari pelanggan, atau mengekspor seluruh konfigurasi. Asisten bekerja melalui sekumpulan **admin tools** tetap. Asisten tidak pernah mendapatkan shell, tidak pernah membaca file di server, dan tidak pernah melihat kata sandi atau API key yang disimpan. Gunakan saat Anda ingin pengaturan awal selesai dalam hitungan menit alih-alih mengklik selusin halaman, atau saat Anda mengelola beberapa instalasi dan ingin menjaga konfigurasinya dalam sebuah file. ## Tiga cara menggunakannya {#three-ways-to-use-it} | Cara | Siapa yang berbicara dengan AI | Tempat berjalannya | Mulai di sini | |---|---|---|---| | **AI Chat di admin** | Anda, di admin NexCMP | Sumber AI yang Anda pilih: API key dari OpenAI, Anthropic, Gemini, atau OpenRouter, penyedia AI panel Anda sendiri, atau CLI AI resmi tempat Anda masuk | [AI Chat di admin](https://nexcmp.com/id/docs/configure-with-ai/ai-chat-in-admin/) | | **Klien AI Anda sendiri melalui MCP** | Anda, di Claude Code, Codex CLI, Gemini CLI, Cursor, Claude Desktop, claude.ai, atau ChatGPT | Di mesin Anda atau di aplikasi vendor, terhubung ke panel Anda di `https://cloud.example.com/mcp/admin` | [Connect an AI client](https://nexcmp.com/id/docs/configure-with-ai/mcp-admin/) | | **Konfigurasi sebagai kode** | Anda atau sebuah skrip | File YAML dan perintah `nexcmp config` di server (atau halaman Import/Export) | [Configuration as code](https://nexcmp.com/id/docs/configure-with-ai/config-as-code/) | Ketiganya memanggil alat yang sama dan melewati lapisan keamanan yang sama, sehingga Anda dapat menggabungkannya: menyusun draf konfigurasi dengan asisten, mengekspornya sebagai YAML, meninjaunya di editor Anda, dan menerapkannya nanti. ## Model keamanan {#safety-model} | Aturan | Artinya bagi Anda | |---|---| | **Cakupan (Scopes)** | Key atau koneksi dibatasi pada cakupan yang Anda centang (`admin:read`, `catalog:write`, `infra:write`, `billing:write`, `customers:write`, `settings:write`, `ai:write`, `secrets:write`). Tanpa cakupan, panggilan akan ditolak. Lihat [Admin API keys](https://nexcmp.com/id/docs/configure-with-ai/admin-api-keys/#scopes). | | **Expiry** | Setiap key dan koneksi memiliki masa kedaluwarsa: 1 hingga 90 hari untuk key yang Anda buat, 30 hari secara default. Token akses OAuth berlaku selama satu jam. | | **Pembatasan IP dan batas laju (Rate limit)** | Key dapat dibatasi ke rentang IP dan ke jumlah panggilan tertentu per menit (120 secara default). | | **Konfirmasi dua langkah** | Tindakan yang memindahkan dana, menghapus data, mengubah kredensial pembayaran, atau mengubah keamanan masuk akan menampilkan pratinjau terlebih dahulu dan tidak melakukan apa pun hingga Anda menyetujuinya. Di dalam AI Chat, setiap perubahan adalah kartu konfirmasi yang Anda tekan sendiri. | | **Hal yang tidak boleh dilakukan oleh key** | Membuat administrator, mengubah 2FA, membuat atau mencabut key, masuk sebagai pelanggan, mencadangkan, memulihkan, atau memperbarui panel, dan sejenisnya. Hal-hal ini memerlukan kehadiran Anda di admin. | | **Log aktivitas** | Setiap panggilan, baik yang diizinkan maupun yang ditolak, dicatat beserta key, klien, alat, IP, dan hasilnya. Lihat System › Settings › API & AI agents › Activity. | | **Informasi rahasia tidak pernah dikembalikan** | Kata sandi, kunci API, dan token dapat diatur tetapi tidak pernah dapat dibaca kembali. Jawaban yang dilihat oleh AI menampilkan hal tersebut dalam keadaan disamarkan. | | **Instalasi demo bersifat hanya-baca** | Pada panel demo, setiap penulisan ditolak dengan `demo_read_only`. | ::: important Apa yang dapat dibaca oleh AI Dengan `admin:read`, asisten dapat membaca nama pelanggan, alamat e-mail, saldo, dan catatan penagihan. Saat Anda menggunakan sumber AI yang berjalan di vendor (OpenAI, Anthropic, Google, OpenRouter), data tersebut dikirim ke vendor tersebut untuk menjawab pertanyaan Anda. Berikan set cakupan terkecil yang dibutuhkannya kepada asisten, dan pilih sumber yang Anda percayai untuk data tersebut. ::: ## Mulai cepat {#quick-start} 1. Masuk ke admin dan buka **AI Chat**. Jika belum ada sumber AI yang terhubung, buka **System › Settings › AI accounts** dan hubungkan satu (lihat [AI accounts and subscriptions](https://nexcmp.com/id/docs/configure-with-ai/ai-accounts-and-subscriptions/)). 2. Ketik "Check my setup progress" dan tekan Enter. Asisten akan membaca [Setup progress checklist](https://nexcmp.com/id/docs/configure-with-ai/setup-checklist/) dan memberi tahu Anda apa saja yang belum selesai. 3. Minta asisten untuk melakukan langkah berikutnya. Tinjau setiap kartu konfirmasi dan tekan **Confirm** untuk menerapkannya. Untuk melihat contoh pertanyaan yang dapat diajukan, lihat [Example prompts](https://nexcmp.com/id/docs/configure-with-ai/example-prompts/). ![Halaman AI Chat dengan percakapan, hasil alat, dan kartu konfirmasi](https://nexcmp.com/id/docs/images/configure-with-ai/overview-01-ai-chat.webp) ## Batas & catatan {#limits-notes} - **Demo dan hanya-baca.** Halaman-halaman tersebut terlihat pada panel demo, tetapi tidak ada yang dapat disimpan di sana. - **Tidak ada shell.** Asisten hanya dapat memanggil alat admin yang tercantum dalam [Connect an AI client](https://nexcmp.com/id/docs/configure-with-ai/mcp-admin/#tools). Asisten tidak dapat menjalankan perintah di server. - **Modul jaringan dan perutean** (BGP, XDP, antarmuka, NAT, dan sejenisnya) hanya-baca untuk AI, dan area sensitif seperti akun administrator, cadangan, serta pembaruan tertutup sepenuhnya dari kunci. - **Harga** dalam USD: harga paket dalam dolar per jam, saldo dalam sen. - **Biaya.** Jawaban AI dibayarkan ke sumber AI yang Anda hubungkan (penggunaan API, atau langganan Anda sendiri). Di AI Chat, Anda dapat mengatur batas pengeluaran harian. Untuk model lisensi NexCMP, lihat https://nexcmp.com/pricing. ## Pemecahan Masalah {#troubleshooting} | Gejala | Penyebab | Solusi | |---|---|---| | AI Chat mengatakan tidak ada sumber AI yang terhubung | Tidak ada sumber yang disiapkan untuk akun admin Anda | Buka System › Settings › AI accounts dan hubungkan satu. | | Asisten menjawab `insufficient_scope` | Kunci atau koneksi tidak memiliki cakupan untuk alat tersebut | Buat kunci dengan cakupan yang diperlukan, atau hubungkan ulang dan centang pada layar izin. Lihat [Admin API keys](https://nexcmp.com/id/docs/configure-with-ai/admin-api-keys/#errors). | | Setiap perubahan menampilkan kartu konfirmasi | Diharapkan dalam AI Chat | Tekan **Confirm** untuk menerapkan atau **Reject** untuk membatalkan. | | Penulisan gagal dengan `demo_read_only` | Panel berada dalam mode demo | Gunakan instalasi non-demo. | --- # AI Chat di admin {#ai-chat-in-the-admin} > **Di mana letaknya di admin:** AI Chat (`/agent`, entri menu tersendiri) dan tombol mengapung **Ask AI** di setiap halaman admin. Sumber jawaban diatur di System › Settings › AI accounts (`/agent/accounts`). ## Fungsi {#what-it-does} AI Chat adalah asisten yang dibangun ke dalam admin. Anda mendeskripsikan apa yang Anda inginkan ("connect my Proxmox cluster", "set up email"), asisten akan membaca status saat ini dengan alat admin, mengusulkan perubahan, dan menampilkan masing-masing perubahan sebagai **kartu konfirmasi**. Tidak ada yang diterapkan hingga Anda menekan **Confirm**. Panel **Ask AI** adalah obrolan yang sama dalam panel samping yang sempit, sehingga Anda dapat bertanya sambil melihat halaman. Tombol seperti **Do it for me** (di [Setup progress checklist](https://nexcmp.com/id/docs/configure-with-ai/setup-checklist/) dan di daftar kosong) membukanya dengan pertanyaan yang sudah siap. Fitur ini berbeda dari [AI Chat](https://nexcmp.com/id/docs/ai/ai-chat/) dan [AI Agent](https://nexcmp.com/id/docs/ai/ai-agent/) yang menghadap ke pelanggan dan melayani para pengguna Anda. ## Persyaratan {#requirements} | Item | Persyaratan | |---|---| | Role | Administrator yang masuk. Obrolan, kunci, dan preferensi milik akun admin Anda; administrator lain tidak dapat melihatnya. | | Sumber jawaban | Setidaknya satu yang terhubung: kunci API, masuk, penyedia AI panel itu sendiri, atau AI CLI tempat Anda masuk. Lihat [AI accounts and subscriptions](https://nexcmp.com/id/docs/configure-with-ai/ai-accounts-and-subscriptions/). | | Demo | Pada panel demo, Anda dapat membaca obrolan lama tetapi tidak dapat mengirim pesan. | ## Memilih asal jawaban {#choose-where-answers-come-from} Pilih sumber pada pemilih di bawah kolom masukan (yang mencantumkan sumber yang telah Anda hubungkan). **System › Settings › AI accounts** juga memungkinkan Anda mengatur sumber default, model default, dan batas harian. | Source | Cara menghubungkannya | Catatan | |---|---|---| | OpenAI (model ChatGPT) | Tempel kunci API dari platform.openai.com | Ditagih oleh OpenAI per penggunaan. | | Anthropic (Claude) | Tempel kunci API dari console.anthropic.com | Ditagih oleh Anthropic per penggunaan. | | Google Gemini | Tempel kunci API dari aistudio.google.com, atau **Sign in with Google** | Masuk dengan Google memerlukan klien OAuth yang **Anda** buat di project Google Cloud Anda sendiri. | | OpenRouter | Tempel kunci, atau **Sign in with OpenRouter** | Satu akun untuk berbagai model. | | Penyedia AI panel | Sudah diatur di System › Settings › AI provider | Penyedia yang sama yang digunakan oleh AI Chat pelanggan Anda. [AI provider](https://nexcmp.com/id/docs/ai/ai-providers/). | | Langganan Claude, ChatGPT, atau Gemini | CLI resmi terpasang dan masuk di server panel | Lihat [AI accounts and subscriptions](https://nexcmp.com/id/docs/configure-with-ai/ai-accounts-and-subscriptions/). | Kunci yang Anda tempel disimpan secara terenkripsi khusus untuk akun admin Anda. Kunci tersebut tidak akan pernah ditampilkan lagi dan administrator lain tidak dapat mendekripsinya. ## Menggunakan obrolan {#use-the-chat} 1. Buka **AI Chat** (atau klik **Ask AI**). 2. Klik **New chat**, atau buka obrolan sebelumnya dari daftar di sebelah kiri. 3. Ketik permintaan Anda dan tekan Enter (Shift+Enter memulai baris baru). Anda dapat melampirkan gambar atau file teks (hingga 4 per pesan, masing-masing 3 MB) untuk menunjukkan error atau menempelkan dokumen. 4. Perhatikan jawaban yang mengalir masuk. Setiap alat yang dipanggil oleh asisten akan muncul sebagai kartu yang dapat diciutkan berisi nama alat, argumennya, dan hasil singkat. 5. Tekan **Stop** untuk membatalkan jawaban yang sedang berjalan. Hanya satu jawaban yang berjalan dalam satu waktu per administrator. ![AI Chat dengan daftar percakapan, jawaban yang berisi kartu alat, serta kolom masukan dengan pemilih sumber dan kolom Secret](https://nexcmp.com/id/docs/images/configure-with-ai/ai-chat-in-admin-01-chat.webp) Hingga 10 putaran alat terjadi per pesan. Asisten mengingat 30 pesan terakhir dari obrolan. Hasil dari alat diteruskan ke model yang ditandai sebagai data, bukan sebagai instruksi. ## Kartu konfirmasi {#confirmation-cards} Dalam AI Chat **setiap perubahan adalah kartu**, bukan hanya tindakan uang. Asisten mengusulkan; Anda yang memutuskan. Kartu menampilkan: - Judul yang menyatakan mengapa kartu tersebut memerlukan perhatian, misalnya "mengubah saldo pelanggan". - Panggilan: metode dan jalur. - Tabel bidang yang berubah: nilai saat ini dan nilai baru. Nilai rahasia muncul sebagai `••••`. - Hitung mundur (kartu kedaluwarsa setelah 5 menit). - **Confirm** dan **Reject**. **Confirm** membuat panel itu sendiri menerapkan perubahan, kemudian memberi tahu asisten apa yang terjadi. Asisten tidak dapat menekan tombol, tidak dapat menyetujui melalui API, dan diperintahkan untuk tidak pernah mengklaim bahwa perubahan telah diterapkan sebelum dikonfirmasi. Jika Anda memuat ulang halaman, kartu yang masih valid akan muncul kembali. Kartu tersebut juga muncul di bagian atas **System › Settings › API & AI agents** di bawah "Waiting for your confirmation". ![Kartu konfirmasi yang menunjukkan perubahan saldo, hitung mundur, serta tombol Confirm dan Reject](https://nexcmp.com/id/docs/images/configure-with-ai/ai-chat-in-admin-02-confirm.webp) ## Rahasia {#secrets} Kata sandi dan kunci API tidak boleh melalui teks obrolan. Gunakan bidang **Secret** (ikon gembok) di sebelah input: 1. Klik ikon gembok dan masukkan **nama** (huruf, digit, dan garis bawah, misalnya `smtp_password`) serta **nilai**. 2. Dalam pesan Anda, merujuklah pada nama tersebut: "gunakan rahasia smtp_password sebagai kata sandi SMTP". 3. Asisten hanya melihat placeholder yang mewakili rahasia tersebut, yang ditulis seperti ini: ```text {{secret:smtp_password}} ``` Panel menggantinya dengan nilai sebenarnya pada saat panel menjalankan alat tersebut. Nilai tidak disimpan dalam riwayat obrolan dan tidak dikirim ke sumber AI. Jika Anda tidak sengaja menempelkan sesuatu yang terlihat seperti kunci ke dalam pesan, panel akan memindahkannya ke penyimpanan terlindung yang sama dan menutupinya dalam riwayat, tetapi anggap itu sebagai jaring pengaman, bukan metode. Rahasia hanya disimpan dalam memori panel, untuk percakapan saat rahasia tersebut dimasukkan dan hingga satu jam setelah pesan terakhirnya; mulai ulang panel juga akan menghapusnya. Masukkan kembali jika asisten memintanya. Menyetel rahasia juga memerlukan izin `secrets:write` untuk sesi obrolan (lihat di bawah). ## Izin obrolan {#permissions-of-the-chat} Setiap pesan berjalan dengan kunci sementara yang ada selama durasi jawaban (maksimal 15 menit), hanya berfungsi dari server panel dan hanya dapat digunakan melalui kartu konfirmasi. Cakupannya adalah yang dicentang di **System › Settings › AI accounts › Chat session permissions**. `admin:read` selalu aktif. Semua cakupan kecuali `secrets:write` aktif secara default; centang `secrets:write` jika Anda ingin asisten dapat menyetel kata sandi dan kunci (melalui bidang Secret). Pada panel demo, obrolan bersifat hanya-baca. ## Batas pengeluaran harian {#daily-spending-cap} AI Chat menghitung perkiraan biaya jawaban dari sumber API. Batas defaultnya adalah **5 USD per administrator per hari**. Tetapkan jumlah lain (0 berarti tanpa batas) di bawah **AI accounts › Defaults for AI Chat**. Halaman menunjukkan "used today". Ketika batas tercapai, obrolan menolak pesan baru (`daily_cap`) hingga hari berikutnya atau hingga Anda menaikkan batas. Sumber yang berupa langganan AI CLI tidak dihitung, karena ditagih melalui langganan Anda. ## Verifikasi {#verify} 1. Di **AI accounts** klik **Test** pada sumber. Sumber tersebut menjawab dengan nama model dan waktu dalam milidetik. 2. Di AI Chat, tanyakan "Check my setup progress". Jawaban mencantumkan langkah-langkah dari [checklist](https://nexcmp.com/id/docs/configure-with-ai/setup-checklist/) dan kartu alat `setup_checklist` akan muncul. 3. Minta perubahan kecil, misalnya "Set the brand name to Example Cloud". Kartu konfirmasi akan muncul; tekan **Confirm** dan periksa halaman Branding. 4. **API & AI agents › Activity** mencantumkan panggilan dengan saluran `chat`. ## Batas & catatan {#limits-notes} - Asisten ini tidak memiliki akses shell dan tidak dapat membaca file di server. Asisten hanya memanggil [alat admin](https://nexcmp.com/id/docs/configure-with-ai/mcp-admin/#tools). - Perubahan yang tidak pernah bisa dilakukan oleh key ([daftar](https://nexcmp.com/id/docs/configure-with-ai/admin-api-keys/#what-a-key-can-never-do)) juga tidak dapat dibuat dari AI Chat. - Periksa hasil kerja model. Kartu konfirmasi menampilkan secara tepat apa yang akan dikirim; baca dengan cermat, terutama harga dan jumlah nominal. - Respons API ditagihkan oleh vendor AI. Batas tersebut berupa perkiraan; tetapkan juga batas pengeluaran di vendor Anda. - Respons CLI akan berhenti setelah 5 menit. ## Pemecahan Masalah {#troubleshooting} | Gejala | Penyebab | Solusi | |---|---|---| | "Batas pengeluaran AI hari ini telah tercapai" (`daily_cap`) | Anda telah mencapai batas harian | Tingkatkan di akun AI, atau tunggu hingga besok. | | "Jawaban lain masih berjalan - tunggu atau tekan Stop" (`busy`) | Satu jawaban dalam satu waktu per administrator | Tekan **Stop** atau tunggu. | | Sumber tidak muncul di pemilih | Tidak terhubung, atau (Claude CLI) tombol "I understand" nonaktif | Sambungkan di akun AI. | | "itu tidak terlihat seperti kunci API" | Kunci yang ditempel memiliki spasi atau terlalu panjang | Tempel kuncinya saja. | | Pengujian gagal | Kunci salah, kredit habis, atau vendor sedang gangguan | Periksa kunci dan penagihan di vendor. | | Asisten menyatakan tidak dapat melakukan sesuatu | Sesi obrolan tidak memiliki cakupan, atau tindakan ditutup untuk AI | Centang cakupan di akun AI atau lakukan di admin. | | Kartu menyatakan telah kedaluwarsa | Lebih dari 5 menit telah berlalu | Minta asisten untuk mengusulkan perubahan lagi. | | Sumber CLI melaporkan "usage limit" atau "not logged in" | Batas langganan atau sesi Anda | Masuk kembali atau tunggu; lihat [AI accounts and subscriptions](https://nexcmp.com/id/docs/configure-with-ai/ai-accounts-and-subscriptions/). | --- # Akun dan langganan AI {#ai-accounts-and-subscriptions} > **Di mana letaknya di admin:** System › Settings › AI accounts (`/agent/accounts`), tab **Accounts** dan **Use your own AI subscription**. Terminal opsional adalah AI Console (`/agent/console`), yang muncul di bawah AI Chat hanya saat diaktifkan. ## Fungsi {#what-it-does} AI Chat memerlukan sesuatu untuk memberikan jawaban. Halaman ini memungkinkan Anda menghubungkan sumber tersebut untuk akun admin Anda sendiri: - **Sumber API**: OpenAI, Anthropic (Claude), Google Gemini, dan OpenRouter, dengan kunci API atau login. - **Penyedia AI panel**, jika Anda sudah menyetelnya di bawah System › Settings › AI provider. - **Langganan AI Anda sendiri** (Claude, ChatGPT, Gemini) melalui **alat baris perintah resmi** vendor, baik di server panel maupun di komputer Anda sendiri. Semua yang Anda hubungkan adalah milik akun admin Anda. Kunci dan token disimpan secara terenkripsi khusus untuk Anda; administrator lain tidak dapat menggunakannya. ## Persyaratan {#requirements} | Item | Persyaratan | |---|---| | Role | Administrator yang masuk. Pada panel demo, tidak ada yang dapat dihubungkan atau dihapus. | | Sumber API | Akun dan kunci API di vendor (kartu memiliki tautan **Get API key** yang membuka halaman vendor). | | CLI di server panel | AI Console diaktifkan (lihat di bawah), HTTPS keluar dari server ke vendor dan ke `nodejs.org` serta registri npm, dan **RAM 2 GB atau lebih** (CLI memerlukan sekitar 1 GB kosong saat berjalan; penginstal memperingatkan di bawah 2 GB). Node.js 20 atau yang lebih baru digunakan jika ada, jika tidak, penginstal akan mengunduh Node.js 22 dengan pemeriksaan checksum. | | CLI di komputer Anda | Node.js 20 atau yang lebih baru untuk menginstal CLI, serta langganan Anda sendiri. | ## Menghubungkan sumber API {#connect-an-api-source} 1. Buka **System › Settings › AI accounts** dan tetap berada di tab **Accounts**. 2. Pada kartu sumber, klik **Connect**. Halaman key vendor akan terbuka di tab baru; buat key di sana. 3. Tempel key ke dalam kolom dan simpan. Kartu akan menampilkan status terhubung beserta empat karakter terakhir. 4. Pilih **default model** jika Anda menginginkan model lain, lalu klik **Test**. Hasil yang berhasil terbaca seperti "Connected - example-model, 850 ms". ![Halaman akun AI dengan kartu sumber API, kartu OpenAI yang terhubung, dan kartu penyedia AI panel](https://nexcmp.com/id/docs/images/configure-with-ai/ai-accounts-and-subscriptions-01-accounts.webp) | Source | Alternatif masuk | |---|---| | OpenRouter | **Sign in with OpenRouter** membuka OpenRouter dalam jendela popup atau tab; setujui dan Anda akan kembali ke halaman ini dalam kondisi terhubung. | | Google Gemini | **Sign in with Google** muncul setelah Anda menyimpan, di bawah **Set up Google sign-in (optional)** pada kartu, klien OAuth yang dibuat di proyek Google Cloud **Anda sendiri** (ID klien berakhiran `.apps.googleusercontent.com`, beserta secret-nya). NexCMP tidak menyediakan klien Google bersama. | | Penyedia AI panel | Menggunakan penyedia yang telah dikonfigurasi pada System › Settings › AI provider ([AI provider](https://nexcmp.com/id/docs/ai/ai-providers/)). Tidak ada yang perlu ditempelkan. | Untuk memutuskan sambungan sumber, klik **Remove** pada kartunya. Tindakan ini menghapus kunci yang tersimpan untuk akun Anda. ### Default, batas harian, dan izin {#defaults-daily-cap-and-permissions} Di bagian bawah tab **Accounts**, **Defaults for AI Chat** memiliki tiga pengaturan: | Pengaturan | Arti | |---|---| | Sumber dan model default | Apa yang digunakan oleh obrolan baru. Anda tetap dapat mengubah sumber per pesan. | | Batas pengeluaran harian (USD, 0 = tanpa batas) | Default 5. Halaman menampilkan "used today". Lihat [AI Chat in the admin](https://nexcmp.com/id/docs/configure-with-ai/ai-chat-in-admin/#daily-spending-cap). | | Izin sesi obrolan | Scope yang dapat digunakan oleh asisten. `admin:read` selalu aktif; `secrets:write` dinonaktifkan secara default. Lihat [Admin API keys](https://nexcmp.com/id/docs/configure-with-ai/admin-api-keys/#scopes). | Klik **Save defaults**. ## Gunakan langganan AI Anda sendiri {#use-your-own-ai-subscription} Anda dapat mengoperasikan NexCMP menggunakan paket Claude, ChatGPT, atau Gemini yang sudah Anda bayar, tanpa kunci API terpisah. Ada dua cara. ### Cara 1 (disarankan): CLI di komputer Anda sendiri {#way-1-recommended-the-cli-on-your-own-computer} Anda menggunakan alat bawaan vendor di komputer Anda sendiri dan masuk dengan akun Anda sendiri melalui alur normal vendor. NexCMP hanya menerima panggilan MCP yang ditandatangani dengan kunci berumur pendek. Buka **AI accounts › Use your own AI subscription**; halaman ini menampilkan tiga langkah per alat. 1. Klik **Create a 7-day key** dan pilih tingkatannya: **Read only** (`admin:read`) atau **Read + configuration** (`admin:read`, `catalog:write`, `infra:write`, `settings:write`). Perintah di bawahnya kemudian akan memuat kunci yang sebenarnya. 2. Instal CLI dan masuk. Kunci hanya ditampilkan di halaman ini dan hanya satu kali. | Alat | Menginstal | Masuk | |---|---|---| | Claude Code | `npm install -g @anthropic-ai/claude-code` | jalankan `claude`, lalu `/login` | | Codex CLI | `npm install -g @openai/codex` | `codex login` | | Gemini CLI | `npm install -g @google/gemini-cli` | jalankan `gemini`, pilih "Login with Google" | 3. Hubungkan ke panel Anda dengan satu perintah atau satu blok, yang disalin dari halaman: ```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. Mulai alat tersebut dan tanyakan, misalnya, "what is left to set up in nexcmp?". Semua detail koneksi MCP ada di [Connect an AI client](https://nexcmp.com/id/docs/configure-with-ai/mcp-admin/). Tab yang sama menampilkan URL untuk konektor **claude.ai** dan **ChatGPT**, yang masuk dengan OAuth dan tidak memerlukan kunci: [OAuth connectors](https://nexcmp.com/id/docs/configure-with-ai/oauth-connectors/). ![Tab Gunakan langganan AI Anda sendiri dengan tombol kunci 7 hari serta perintah instalasi, masuk, dan koneksi untuk tiga CLI](https://nexcmp.com/id/docs/images/configure-with-ai/ai-accounts-and-subscriptions-02-subscription.webp) ### Cara 2: CLI di server panel (tombol Install / Login) {#way-2-the-cli-on-the-panel-server-install-login-buttons} Kartu di bawah "Subscription through a CLI (Claude, ChatGPT, Gemini)" memungkinkan NexCMP menginstal CLI resmi di server panel dan membuka alur masuknya sendiri, sehingga **AI Chat** dapat merespons menggunakan langganan Anda. **Cara isolasinya.** CLI berjalan dalam proses terpisah (`nexcmp-ai.service`) sebagai pengguna sistemnya sendiri `nexcmp-ai`, tanpa sudo, tanpa akses ke folder data serta konfigurasi NexCMP, dan dengan batas memori. Untuk setiap pesan AI Chat, CLI dijalankan hanya dengan tool MCP NexCMP yang diizinkan (tool shell dan file dinonaktifkan) serta key yang hanya berfungsi dari server. NexCMP tidak membaca atau menyalin data masuk CLI: CLI menyimpannya di folder privat untuk akun admin Anda. Tidak ada yang perlu diaktifkan: panel menyiapkan pengguna dan layanan `nexcmp-ai` saat diinstal atau diperbarui ke 1.4.0, sehingga kartu langsung siap digunakan. **Instal dan masuk (per administrator):** 1. Pada kartu CLI, klik **Login**. Jika CLI belum diinstal, panel akan menginstalnya terlebih dahulu: bilah progres dan log singkat menampilkan proses unduhan (Node.js jika diperlukan, kemudian CLI). Peringatan akan muncul jika server memiliki RAM kurang dari 2 GB. 2. Kartu menampilkan apa yang diminta oleh CLI: - **Codex CLI**: klik **Open the sign-in page** dan ketik kode satu kali yang ditampilkan kartu. (Fitur masuk perangkat OpenAI harus diaktifkan di pengaturan keamanan ChatGPT Anda.) - **Claude Code and Gemini CLI**: klik **Open the sign-in page**, masuk, lalu tempel kode verifikasi yang ditampilkan halaman vendor ke dalam **Paste the verification code here** dan klik **Send code**. 3. Status kartu berubah menjadi "Signed in" beserta akun dan versi. Proses masuk yang tidak selesai dalam 10 menit akan dibatalkan; klik **Login** lagi. 4. Di **AI Chat**, sumber kini muncul pada menu pemilih (misalnya "ChatGPT (via Codex CLI)"). 5. **Sign out** menghapus data masuk CLI untuk akun Anda. Untuk Claude, kartu ini memiliki tombol switch tambahan, **I understand and accept the vendor's terms for using a subscription this way**, yang nonaktif secara default. Sumber tidak akan ditawarkan di AI Chat sampai switch ini diaktifkan. ![Kartu langganan CLI dengan Install dan Login, kode satu kali pada kartu Codex, serta switch I understand pada kartu Claude](https://nexcmp.com/id/docs/images/configure-with-ai/ai-accounts-and-subscriptions-03-cli.webp) ### Ketentuan vendor AI {#terms-of-the-ai-vendors} Masuk menggunakan langganan konsumen tunduk pada ketentuan masing-masing vendor yang dapat berubah sewaktu-waktu. Catatan di bawah ini merupakan ringkasan dari apa yang dipublikasikan vendor per Oktober 2026, bukan nasihat hukum, dan bukan pernyataan atas nama vendor. Bacalah halaman resmi terbaru sebelum Anda mengaktifkan opsi ini. | Vendor | Cakupan halaman vendor | Source | |---|---|---| | Anthropic (Claude) | Masuk ke Claude Code yang tidak dimodifikasi dengan paket Anda sendiri sudah tercakup. Menggunakan langganan melalui produk lain, atau meminta produk mengumpulkan atau meneruskan proses masuk tersebut, diperlakukan berbeda, dan batas paket mengasumsikan penggunaan perorangan biasa. Inilah sebabnya kartu Claude memuat catatan dan tombol **I understand**, dan mengapa Cara 1 menjadi pilihan yang lebih bersih. | https://code.claude.com/docs/en/legal-and-compliance | | OpenAI (Codex) | Codex mendukung masuk dengan akun ChatGPT atau kunci API. OpenAI menyarankan kunci API untuk otomatisasi dan menyatakan agar tidak mengekspos Codex di lingkungan yang tidak aman atau publik. Gunakan kartu ini hanya untuk diri Anda sendiri. | https://developers.openai.com/codex/auth | | Google (Gemini CLI) | Mendukung Masuk dengan Google, kunci API, dan Vertex AI; ketentuan bergantung pada cara Anda masuk, dan kuota paket Anda akan berlaku. | https://geminicli.com/docs/get-started/authentication | Jika Anda ingin menghindari masalah tersebut sepenuhnya, gunakan sumber **API key**, atau Cara 1 di komputer Anda sendiri. ## AI Console {#ai-console} AI Console adalah halaman terminal opsional untuk menjalankan salah satu CLI yang sudah masuk di server panel. Fitur ini **nonaktif secara default**. - Aktifkan atau nonaktifkan, serta kelola CLI di server: ```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` mencetak status apakah soket runner AI sudah siap, apakah AI Console diaktifkan atau dinonaktifkan, dan untuk setiap CLI "installed" atau "not installed". `sudo nexcmp status` juga menampilkan "AI runner: active". - Setelah diaktifkan, tab **AI Console** akan muncul di bawah AI Chat. Pilih CLI yang sudah masuk, masukkan kembali kata sandi admin Anda (dan kode 2FA Anda jika menggunakannya) dan buka sesi. Banner pengingat akan memberi tahu bahwa perintah di sini hanya dapat mengelola NexCMP melalui alat MCP-nya; alat shell dan file dinonaktifkan. - Instalasi demo tidak pernah membuat pengguna `nexcmp-ai`. ![Layar mulai AI Console dengan pemilih CLI, kolom kata sandi, dan banner peringatan khusus MCP](https://nexcmp.com/id/docs/images/configure-with-ai/ai-accounts-and-subscriptions-04-console.webp) ## Verifikasi {#verify} 1. **Test** pada sumber API akan mengembalikan nama model. 2. Pada kartu CLI, status terbaca "Signed in" beserta akunnya. 3. Di server: `sudo nexcmp ai-console status` mencantumkan CLI sebagai terinstal, dan `systemctl is-active nexcmp-ai` mencetak `active`. 4. Di AI Chat, pilih sumbernya, ajukan pertanyaan "Check my setup progress", dan kartu alat akan muncul. ## Batas & catatan {#limits-notes} - Jawaban CLI dibatasi hingga 5 menit dan satu jawaban dalam satu waktu per administrator. Batas harian tidak menghitung jawaban CLI. - Setiap perubahan dari sumber CLI tetap berupa kartu konfirmasi di AI Chat; CLI tidak dapat menerapkan perubahan dengan sendirinya. - Paket langganan memiliki batasan penggunaannya sendiri. Saat vendor menyatakan "usage limit" atau "not logged in", obrolan akan menampilkan pesan tersebut. - Menghapus sumber tidak akan menghapus percakapan. - Tetap perbarui server: CLI diinstal dari paket publik vendor pada saat Anda mengklik Install. ## Pemecahan Masalah {#troubleshooting} | Gejala | Penyebab | Solusi | |---|---|---| | Login dinonaktifkan dan kartu menampilkan "AI tools are not ready on the server yet" | Layanan `nexcmp-ai` tidak berjalan | Perbarui panel ke versi terbaru, lalu periksa `sudo nexcmp status`. Pada demo baca-saja, hal ini wajar. | | "Alat AI belum terpasang di server ini" | Layanan `nexcmp-ai` tidak berjalan (panel versi lama, atau panel demo) | Perbarui panel, lalu `sudo nexcmp ai-console install claude` (atau `codex`, `gemini`). | | Peringatan tentang RAM di bawah 2 GB | Server berukuran kecil | Instalasi mungkin lambat atau gagal; tambahkan memori atau gunakan Cara 1. | | "Node.js download checksum mismatch" atau "download failed" | Server tidak dapat menjangkau nodejs.org, atau proksi mengubah unduhan tersebut | Izinkan HTTPS keluar dan coba lagi. | | Instalasi berakhir dengan galat | npm tidak dapat menginstal paket | Baca log pada kartu, periksa akses keluar ke registri npm, lalu coba lagi. | | Login berujung pada error atau waktu habis (timeout) | Jangka waktu 10 menit telah lewat, atau kode yang dimasukkan salah | Klik **Login** lagi dan selesaikan lebih cepat. | | Sumber Claude tidak ada di AI Chat | Tombol **I understand** nonaktif, atau CLI belum masuk (signed in) | Nyalakan tombol setelah membaca halaman vendor, lalu masuk. | | "Sign in with Google" tidak ada di Gemini | Belum ada klien Google OAuth yang disimpan | Buat klien di project Google Cloud Anda sendiri dan simpan di bawah **Set up Google sign-in (optional)** pada kartu, atau tempel API key sebagai gantinya. | | "Sign in with OpenRouter" mengembalikan error | Anda membatalkan, atau pop-up diblokir | Izinkan pop-up dan coba lagi. | | Jawaban CLI mengatakan "usage limit" | Kuota paket telah habis | Tunggu, atau ganti sumber. | --- # Admin API keys {#admin-api-keys} > **Di mana letaknya di admin:** System › Settings › API & AI agents (`/agent/keys`), tab **API keys**. Halaman yang sama memiliki tab **Connect an AI**, **Connected apps**, dan **Activity**. ## Fungsi {#what-it-does} Admin API key (awalan `ak_`) memungkinkan klien AI atau skrip mengelola panel Anda dengan izin yang persis Anda berikan. Kunci ini berfungsi pada admin API di bawah `/v1/admin/` dan pada endpoint admin MCP `/mcp/admin`. Kunci ini tidak berfungsi di tempat lain. ::: info Tidak sama dengan kunci pelanggan Pelanggan membuat kunci yang dimulai dengan `vk_` di portal pelanggan ([API keys and scopes](https://nexcmp.com/id/docs/developers/api-keys/)). Kunci tersebut hanya menjangkau customer API dan `/mcp`. Kunci `ak_` ditolak pada customer API, dan kunci `vk_` ditolak pada admin API. ::: ## Persyaratan {#requirements} | Item | Persyaratan | |---|---| | Role | Anda harus masuk sebagai admin. Kunci tidak dapat membuat kunci lain. | | Demo | Pada panel demo, halaman ini bersifat baca-saja (read-only): tidak ada kunci yang dapat dibuat atau dicabut. | | Keterjangkauan | Klien harus dapat mencapai `https://cloud.example.com/mcp/admin` atau `/v1/admin/...` pada panel Anda (periksa firewall Anda jika menggunakan pembatasan IP). | ## Create a key {#create-a-key} 1. Buka **System › Settings › API & AI agents** dan tetap berada di tab **API keys**. 2. Klik **Create new key**. 3. Isi formulir berikut: | Kolom | Aturan | |---|---| | Name | Hingga 60 karakter, misalnya "Claude Code on my laptop". | | Cakupan | Centang setidaknya satu. Lihat [Scopes](#scopes). Mulai dengan `admin:read` saja. | | Expiry | 1, 7, 30, 60, atau 90 hari. Default 30. Maksimum 90. Kunci tanpa masa kedaluwarsa tidak dapat dibuat. | | IP ranges (optional) | Satu alamat IPv4/IPv6 atau CIDR per baris, misalnya `203.0.113.0/24` atau `2001:db8::/48`. Maksimal 32. Kosongkan untuk mengizinkan semua IP. | | Calls per minute | 1 hingga 6000. Default 120. | 4. Klik **Create key**. Sebuah kotak akan menampilkan kunci satu kali, misalnya `ak_XXXX`. **Salin sekarang**: NexCMP hanya menyimpan hash dan tidak akan pernah menampilkannya lagi. 5. Klik **I have saved the key**. Buka tab **Connect an AI** untuk mendapatkan perintah siap tempel yang sudah berisi kunci yang baru saja Anda buat (hanya di halaman ini, hingga Anda memuat ulang). ![Dialog kunci baru dengan nama, kotak centang cakupan, masa kedaluwarsa, dan rentang IP terisi](https://nexcmp.com/id/docs/images/configure-with-ai/admin-api-keys-01-create.webp) ![Dialog yang menampilkan kunci baru satu kali beserta tombol Salin dan peringatan](https://nexcmp.com/id/docs/images/configure-with-ai/admin-api-keys-02-shown-once.webp) ## Cakupan {#scopes} Kunci hanya dapat menggunakan alat dan titik akhir yang diizinkan oleh cakupannya. Cakupan tulis tidak menyertakan akses baca: kunci yang perlu membaca dan menulis juga memerlukan `admin:read`. | Cakupan | Apa yang diizinkannya | |---|---| | `admin:read` | Membaca pengaturan, katalog, pelanggan, penagihan, dan log. Rahasia tidak pernah dikembalikan. | | `catalog:write` | Paket, templat OS, kuota, kode diskon. | | `infra:write` | Sumber infrastruktur (CloudStack, Proxmox), zona, server. | | `billing:write` | Gateway pembayaran, mata uang, faktur, saldo. Tindakan keuangan memerlukan konfirmasi. | | `customers:write` | Pelanggan dan reseller. | | `settings:write` | Pengaturan umum, branding, email, halaman legal, modul, notifikasi. | | `ai:write` | Penyedia AI dan fitur AI. | | `secrets:write` | Menulis kata sandi dan API keys. Dapat diatur tetapi tidak pernah dapat dibaca kembali. | ::: tip Menetapkan rahasia memerlukan dua cakupan Setiap panggilan yang membawa kata sandi, API key, atau nilai token (kata sandi SMTP, kunci pembayaran, token bot Telegram, kunci penyedia AI, kredensial CloudStack atau Proxmox) memerlukan `secrets:write` **dan** cakupan area tersebut (misalnya `settings:write` untuk SMTP). Jika Anda lebih suka mengetik rahasia sendiri, biarkan `secrets:write` nonaktif dan masukkan di admin. ::: ## Mencabut key {#revoke-a-key} 1. Temukan key dalam tabel (status **Active**, **Expired**, atau **Revoked**; **Last used** menunjukkan waktu dan klien). 2. Klik **Revoke** lalu konfirmasikan. Key langsung berhenti berfungsi. Pencabutan bersifat permanen; buat key baru jika Anda membutuhkannya lagi. ## Hal yang tidak boleh dilakukan oleh kunci {#what-a-key-can-never-do} Key tidak akan pernah dapat mencapai area ini, apa pun cakupannya. Area tersebut memerlukan Anda masuk ke admin. - Membuat atau mengubah pengguna administrator, 2FA dan keamanan masuk, sesi admin, dan token admin API. - Membuat, mencantumkan, atau mencabut kunci admin, koneksi OAuth, dan akun AI, atau menggunakan AI Console. - Membuat cadangan atau memulihkan panel, memperbaruinya, atau mengubah lisensinya. - Masuk sebagai pelanggan atau reseller, membuka konsol pelanggan, membaca kredensial VM atau kubeconfig, mengatur SSH keys, atau mengirim atau menyetel ulang kata sandi. - Mengubah modul jaringan dan perutean (BGP, FRR, RTBH, XDP, antarmuka, rute statis dan kebijakan, NAT) atau agen eksternal dan integrasi portal. Ini bersifat baca-saja. - Mengubah pengaturan seperti `demo_*`, `admin_*`, daftar host, passkey, autentikasi ulang, dan rahasia captcha. Apa pun yang tidak tercakup oleh aturan secara default ditutup untuk penulisan, dan dapat dibaca dengan `admin:read` untuk pembacaan. ### Tindakan yang memerlukan konfirmasi Anda {#actions-that-need-your-confirmation} Ini berhasil hanya setelah Anda menyetujui pratinjau (lihat [Two-step confirmation](#two-step-confirmation)): - Mengubah saldo pelanggan atau dompet reseller, mencairkan dana, catatan penagihan, nilai tukar. - Mengubah harga (harga paket, pembuatan paket massal, penetapan harga gambar dan penyimpanan) serta membuat kode diskon atau uang. - Menyimpan kredensial gateway pembayaran atau koneksi CloudStack. - Menghapus apa pun, memblokir atau menghapus pelanggan, mengubah batas pelanggan, menangguhkan atau menutup reseller. - Bertindak pada server pelanggan, atau membuat server berbayar untuk pelanggan. - Mengubah sakelar seluruh situs, pengaturan keamanan masuk, atau pengaturan pembayaran melalui pengaturan umum. ## Konfirmasi dua langkah {#two-step-confirmation} Ketika sebuah panggilan memerlukan konfirmasi, belum ada yang berubah. Jawabannya adalah HTTP **428** dengan `confirm_required`, `confirm_token`, `preview` (metode, jalur, alasan, nilai baru, dan jika tersedia, nilai saat ini) dan `expires_in: 300`. 1. Klien menampilkan pratinjau kepada Anda. 2. Setelah Anda menyetujui, klien mengulangi permintaan yang **sama** (metode, jalur, dan isi yang sama) dengan header `X-Confirm-Token: `. Alat MCP menggunakan argumen `confirm_token` sebagai gantinya. 3. Token berfungsi sekali dan kedaluwarsa setelah 5 menit. Key yang dibuat di dalam admin untuk AI Chat hanya dapat dikonfirmasi di layar: jawabannya menyatakan `confirm_in: "ui"` dan kartu konfirmasi muncul di admin. AI tidak dapat menyetujuinya. ## Aturan batas kecepatan dan IP {#rate-limit-and-ip-rules} - Melewati batas per menit, panggilan akan mengembalikan `rate_limited` (HTTP 429) dengan `Retry-After: 60`. - Jika rentang IP diatur, panggilan dari alamat lain akan mengembalikan `ip_not_allowed` (HTTP 403). ## Log aktivitas {#activity-log} Tab **Activity** mencatat setiap panggilan yang dibuat menggunakan kunci, diurutkan dari yang terbaru: waktu, kunci, klien, jalur kedatangan (`http`, `mcp`, `chat`, `cli`, `confirm`, `preview`), metode dan jalur, alat, status HTTP, IP, serta detail (yang disamarkan). Anda dapat mencari berdasarkan jalur, alat, atau nama kunci, hanya menampilkan kesalahan (HTTP 400 ke atas) atau panggilan yang menunggu konfirmasi (428 ke atas), serta membatasi periode ke satu jam terakhir, 24 jam, atau 7 hari. NexCMP menyimpan 200,000 entri terbaru. Perubahan yang dilakukan melalui kunci juga muncul di Logs › Admin actions di bawah nama `ak:/`. ![Tab Activity yang mencantumkan panggilan dengan status, klien, alat, dan IP](https://nexcmp.com/id/docs/images/configure-with-ai/admin-api-keys-03-activity.webp) ## Verifikasi {#verify} Uji kunci baca-saja dari mesin mana pun yang berada di dalam rentang IP: ```bash curl -s https://cloud.example.com/v1/admin/agent/tools \ -H "Authorization: Bearer ak_XXXX" ``` Anda akan mendapatkan daftar JSON dari alat yang diizinkan oleh cakupan Anda. Jalankan salah satu: ```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 '{}' ``` Waktu **Last used** pada kunci akan berubah dan panggilan tersebut muncul di **Activity**. Daftar alat lengkap dan deskripsi OpenAPI (`/v1/admin/openapi.json`) dijelaskan di [Connect an AI client](https://nexcmp.com/id/docs/configure-with-ai/mcp-admin/). ## Galat {#errors} Kesalahan berupa JSON: `{"error": {"code": "...", "message": "..."}}`. | HTTP | `code` | Arti | Solusi | |---|---|---|---| | 401 | `invalid_key` | Kunci tidak ada, salah format, atau tidak dikenal. Juga dikembalikan saat kunci `ak_` digunakan pada jalur non-admin. | Periksa kunci; gunakan hanya pada `/v1/admin/` dan `/mcp/admin`. | | 401 | `key_expired` | Masa berlaku kunci telah kedaluwarsa. | Buat kunci baru. | | 401 | `key_revoked` | Kunci telah dicabut. | Buat kunci baru. | | 403 | `ip_not_allowed` | IP pemanggil berada di luar rentang IP kunci. | Lakukan panggilan dari IP yang diizinkan, atau buat kunci dengan rentang yang benar. | | 403 | `local_only_key` | Kunci yang dibuat untuk AI Chat atau CLI server digunakan dari mesin lain. | Kunci ini hanya berfungsi pada server panel itu sendiri. | | 403 | `insufficient_scope` | Kunci tidak memiliki cakupan; jawaban menyertakan `required_scope`. | Buat kunci dengan cakupan tersebut. | | 403 | `forbidden_for_keys` | Titik akhir, atau pengaturan yang coba Anda ubah, ditutup untuk kunci. | Lakukan di admin. | | 403 | `demo_read_only` | Panel berada dalam mode demo dan panggilan melakukan penulisan. | Gunakan panel non-demo. | | 403 | `confirm_in_ui` | Tindakan ini harus dikonfirmasi di layar dalam admin. | Setujui kartu konfirmasi. | | 428 | `confirm_required` | Pratinjau sudah siap; tidak ada yang berubah. Menyertakan `confirm_token`. | Tampilkan pratinjau, lalu ulangi dengan `X-Confirm-Token`. | | 409 | `confirm_expired` | Token lebih lama dari 5 menit. | Kirim permintaan lagi untuk pratinjau baru. | | 409 | `confirm_mismatch` | Token milik permintaan yang berbeda (metode, jalur, atau isi berbeda). | Ulangi permintaan yang persis sama. | | 409 | `confirm_invalid` | Token tidak dikenal atau sudah digunakan. | Kirim permintaan lagi untuk pratinjau baru. | | 429 | `rate_limited` | Terlalu banyak panggilan pada menit ini. | Tunggu hingga `Retry-After`. | | 400 | `invalid_path` | Jalur berisi urutan yang dilarang. | Gunakan jalur biasa. | | 413 | `too_large` | Isi melebihi 10 MB. | Kirim data yang lebih sedikit. | | 400 | `invalid_argument` | Argumen alat tidak ada, tidak dikenal, atau jenisnya salah; pesan menyebutkannya. | Perbaiki argumen tersebut. | ## Batas & catatan {#limits-notes} - Buat kunci berumur pendek dan spesifik. Lebih baik gunakan satu kunci per klien agar Anda dapat mencabut satu kunci saja. - Kunci memiliki kekuatan sebesar cakupannya. `secrets:write` ditambah `billing:write` adalah kombinasi paling sensitif; tindakan yang melibatkan uang tetap berhenti pada pratinjau. - Kunci yang dibuat secara otomatis (untuk AI Chat, CLI server) hanya aktif selama beberapa menit dan hanya berfungsi dari server panel. - Untuk memutuskan sambungan klien AI seketika, cabut kuncinya. Koneksi OAuth dicabut pada tab **Connected apps** ([OAuth connectors](https://nexcmp.com/id/docs/configure-with-ai/oauth-connectors/)). --- # Menghubungkan klien AI (MCP) {#connect-an-ai-client-mcp} > **Lokasi di admin:** System › Settings › API & AI agents (`/agent/keys`), tab **Connect an AI** menampilkan URL titik akhir dan cuplikan siap salin untuk setiap klien, yang sudah diisi dengan kunci yang baru saja Anda buat. ## Fungsi {#what-it-does} **Model Context Protocol (MCP)** memungkinkan klien AI memanggil alat. Panel Anda menjalankan server MCP admin di `https://cloud.example.com/mcp/admin`. Hubungkan alat AI Anda sendiri ke sana dan tanyakan dalam bahasa sehari-hari: "apa saja yang belum diatur?", "tambahkan kluster Proxmox saya", "buat paket dengan margin 40%". Klien memanggil alat admin di bawah ini; panel memeriksa cakupan, meminta konfirmasi Anda sebelum melakukan tindakan berisiko, dan mencatat setiap panggilan. ::: info Dua titik akhir MCP `/mcp` adalah titik akhir **pelanggan** (kunci API pelanggan, `vk_`; lihat [MCP server](https://nexcmp.com/id/docs/developers/mcp/)). `/mcp/admin` adalah titik akhir **admin** yang dijelaskan di sini (kunci admin `ak_` atau OAuth). Keduanya tidak pernah dicampur: alat admin tidak terlihat di `/mcp`, dan `/mcp/admin` hanya menerima kunci admin. ::: ## Persyaratan {#requirements} | Item | Persyaratan | |---|---| | Endpoint | `https://cloud.example.com/mcp/admin` pada domain panel Anda sendiri. Salin URL persis dari tab **Connect an AI**. Halaman yang sama mencantumkan URL lokal (`http://127.0.0.1:/mcp/admin`) untuk alat yang berjalan di server itu sendiri. | | Kredensial | [Kunci API admin](https://nexcmp.com/id/docs/configure-with-ai/admin-api-keys/) (`ak_...`) dengan cakupan yang Anda inginkan, **atau** masuk OAuth untuk konektor web ([OAuth connectors](https://nexcmp.com/id/docs/configure-with-ai/oauth-connectors/)). | | Klien | Klien MCP apa pun yang mendukung transpor **Streamable HTTP** dan header `Authorization` kustom. Versi protokol 2025-11-25, 2025-06-18, dan 2025-03-26. | | Jaringan | Jika Anda menempatkan proksi balik sendiri di depan panel, proksi tersebut harus meneruskan `/mcp/admin`. Konektor web (claude.ai, ChatGPT) terhubung dari server vendor, sehingga URL harus dapat dijangkau dari internet. | ## Siapkan infrastruktur {#prepare-the-infrastructure} Tidak ada yang perlu diinstal di server. Jika Anda membatasi kunci berdasarkan IP, pastikan alamat tempat klien Anda terhubung berada dalam rentang tersebut. Uji keterjangkauan terlebih dahulu: ```bash curl -i -X POST https://cloud.example.com/mcp/admin ``` Respons `401` dengan header `WWW-Authenticate: Bearer ... resource_metadata=...` berarti titik akhir aktif dan memerlukan kredensial. ## Hubungkan di NexCMP {#connect-in-nexcmp} 1. Membuat kunci: **System › Settings › API & AI agents › API keys › New key**. Untuk percobaan pertama, gunakan `admin:read` saja; tambahkan cakupan tulis saat Anda membutuhkannya. Lihat [Admin API keys](https://nexcmp.com/id/docs/configure-with-ai/admin-api-keys/). 2. Buka tab **Connect an AI**. Selama dialog "kunci dibuat" masih baru, setiap cuplikan di bawah ini sudah berisi kunci asli Anda. Jika tidak, cuplikan akan menampilkan placeholder `ak_YOUR_KEY`. 3. Salin cuplikan untuk klien Anda, lalu jalankan atau tempel seperti yang dijelaskan berikutnya. ![Tab Connect an AI dengan URL MCP dan satu kartu berisi tombol salin per klien](https://nexcmp.com/id/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" ``` Kemudian jalankan `claude` dan tanyakan "list the tools from nexcmp" atau "what is left to set up?". Diverifikasi pada 30/10/2026 dengan Claude Code 2.1: `claude mcp add --transport http …` menulis server (tambahkan `-s project` untuk menyimpannya di `.mcp.json` proyek — Claude Code akan meminta Anda menyetujui server proyek saat pertama kali). Untuk skrip, `claude -p "…" --mcp-config .mcp.json --strict-mcp-config --allowedTools "mcp__nexcmp__*"` berjalan tanpa konfirmasi persetujuan dan membatasi Claude hanya menggunakan tool milik panel. ### Claude Desktop {#claude-desktop} Memerlukan Node.js 18 atau yang lebih baru. Tambahkan ini ke `claude_desktop_config.json` (menggunakan bridge `mcp-remote`) dan mulai ulang Claude Desktop: ```json { "mcpServers": { "nexcmp": { "command": "npx", "args": ["-y", "mcp-remote", "https://cloud.example.com/mcp/admin", "--header", "Authorization:Bearer ak_XXXX"] } } } ``` Jika sistem Anda merusak spasi pada argumen header, simpan seluruh nilainya ke dalam environment variable sebagai gantinya, persis seperti pada endpoint pelanggan: `"args": [..., "--header", "Authorization:${NEXCMP_AUTH_HEADER}"]` dengan `"env": { "NEXCMP_AUTH_HEADER": "Bearer ak_XXXX" }`. ### claude.ai (konektor kustom) {#claude-ai-custom-connector} Kunci tidak diperlukan: masuk menggunakan OAuth. Di claude.ai, buka pengaturan konektor, tambahkan custom connector, tempel `https://cloud.example.com/mcp/admin`, lalu masuk dengan akun admin NexCMP Anda dan pilih izin pada layar persetujuan. Detail: [Konektor OAuth](https://nexcmp.com/id/docs/configure-with-ai/oauth-connectors/). ### ChatGPT (developer mode) {#chatgpt-developer-mode} Kunci tidak diperlukan. Di ChatGPT, aktifkan developer mode, tambahkan konektor MCP dengan URL `https://cloud.example.com/mcp/admin`, pilih OAuth, lalu masuk dengan akun admin NexCMP Anda. Detail: [Konektor OAuth](https://nexcmp.com/id/docs/configure-with-ai/oauth-connectors/). ### Codex CLI {#codex-cli} Tambahkan ke `~/.codex/config.toml`: ```toml [mcp_servers.nexcmp] url = "https://cloud.example.com/mcp/admin" bearer_token_env_var = "NEXCMP_KEY" ``` Kemudian ekspor kunci di shell yang memulai Codex: ```bash export NEXCMP_KEY=ak_XXXX codex codex mcp list # shows nexcmp with "Bearer token" auth ``` ::: tip Non-interaktif `codex exec` Di `codex exec` (skrip, CI) Codex tidak bertanya sebelum memanggil alat, dan melewati alat yang mengubah data. Tambahkan `default_tools_approval_mode = "approve"` di bawah `[mcp_servers.nexcmp]` untuk mengizinkannya memanggil alat tersebut; panel tetap mengembalikan pratinjau dan meminta konfirmasi untuk tindakan uang, keamanan, dan penghapusan. Diuji dengan Codex CLI 0.166 pada 30/10/2026. ::: ### Gemini CLI {#gemini-cli} Tambahkan ke `~/.gemini/settings.json`: ```json { "mcpServers": { "nexcmp": { "httpUrl": "https://cloud.example.com/mcp/admin", "headers": { "Authorization": "Bearer ak_XXXX" } } } } ``` Gemini CLI menonaktifkan server MCP di folder yang tidak dipercayainya. Mulai di folder yang Anda percayai (atau percayai folder saat diminta), lalu periksa dengan `gemini mcp list` — ini menampilkan `nexcmp … Connected`. Anda dapat menyimpan kunci di luar file dengan `"Authorization": "Bearer $NEXCMP_KEY"`. Diuji dengan Gemini CLI 0.66 pada 30/10/2026. ### Cursor {#cursor} Tambahkan ke `~/.cursor/mcp.json` (atau `.cursor/mcp.json` di dalam proyek): ```json { "mcpServers": { "nexcmp": { "url": "https://cloud.example.com/mcp/admin", "headers": { "Authorization": "Bearer ak_XXXX" } } } } ``` ::: tip Jauhkan kunci dari file konfigurasi Jika klien mendukungnya, baca kunci dari variabel lingkungan alih-alih menulisnya di dalam file: Codex melakukan ini secara default (`bearer_token_env_var`), dan Cursor menerima `"Bearer ${env:NEXCMP_KEY}"`. Jangan pernah melakukan commit pada file yang berisi kunci. ::: ### 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", ) ``` Eksekusi lengkap (diuji dengan `openai-agents` 0.24 pada 30/10/2026 — alat baca, lalu perubahan saldo yang mengembalikan pratinjau konfirmasi dan diterapkan pada pemanggilan kedua dengan `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} Teruskan server sebagai alat bertipe `mcp`. Pertahankan `require_approval` pada `always` agar program Anda bertanya sebelum setiap pemanggilan: ```json { "type": "mcp", "server_label": "nexcmp", "server_url": "https://cloud.example.com/mcp/admin", "headers": { "Authorization": "Bearer ak_XXXX" }, "require_approval": "always" } ``` ### Lainnya (HTTP biasa) {#anything-else-plain-http} Klien tanpa MCP dapat memanggil alat yang sama melalui HTTP. `GET /v1/admin/agent/tools` mencantumkannya, `POST /v1/admin/agent/tools/` menjalankan satu alat dengan isi JSON berisi argumen, dan `GET /v1/admin/openapi.json` mengembalikan deskripsi OpenAPI 3.1 (setiap alat adalah satu operasi). Semuanya memerlukan `Authorization: Bearer ak_...`. ## Verifikasi {#verify} 1. Tanpa klien, daftar alat: ```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"}' ``` Hasilnya adalah respons JSON-RPC dengan alat yang diizinkan oleh cakupan Anda. 2. Di klien Anda, tanyakan "run system_health". Ini mengembalikan peringatan, kesehatan infrastruktur yang terhubung, pembayaran, email, AI, dan status lisensi. 3. Buka **API & AI agents › Activity**: pemanggilan tercantum beserta nama klien dan `mcp`. 4. Pada server, `sudo nexcmp status` mencetak baris "MCP admin" yang menyatakan `ready` saat titik akhir merespons (HTTP 401 tanpa kunci adalah status sehat). ## Peralatan {#tools} Server menyediakan 58 alat. Klien hanya melihat alat yang diizinkan oleh cakupan kuncinya: alat baca memerlukan `admin:read`, alat tulis memerlukan cakupannya sendiri. Alat tulis juga menerima argumen opsional `confirm_token` (lihat [Confirmation](#confirmation-confirm-token)). Argumen diperiksa terhadap skema setiap alat: argumen yang tidak dikenal atau salah ketik ditolak dengan pesan yang menyebutkan namanya. Harga dalam USD: harga paket dalam dolar per jam (`hourly_usd`), saldo dalam sen. Rahasia dapat diatur tetapi tidak pernah dikembalikan. ### Ikhtisar dan log {#overview-and-logs} | Alat | Fungsi | Cakupan | Mengubah data | Meminta Anda | |---|---|---|---|---| | `system_health` | Peringatan yang memerlukan perhatian, kesehatan infrastruktur, pembayaran, email, AI, status lisensi, dan pembaruan. | `admin:read` | Tidak | Tidak | | `setup_checklist` | Apa yang dikonfigurasi dan yang tersisa: lisensi, infrastruktur, zona, templat OS, paket, pembayaran, email, branding, legal, pesanan uji. | `admin:read` | Tidak | Tidak | | `license_status` | Status lisensi dan apakah versi NexCMP yang lebih baru tersedia. | `admin:read` | Tidak | Tidak | | `audit_search` | Cari log audit admin dan log kunci API. | `admin:read` | Tidak | Tidak | ### Pengaturan, branding, legal, modul {#settings-branding-legal-modules} | Alat | Fungsi | Cakupan | Mengubah data | Meminta Anda | |---|---|---|---|---| | `settings_get` | Membaca pengaturan umum (filter `keys`; akhiran `*` mencocokkan awalan). | `admin:read` | Tidak | Tidak | | `settings_update` | Mengubah pengaturan umum dari objek datar `values`. Hanya kunci yang mencantumkan `settings_get` yang diterima. | `settings:write` | Ya | Saat kunci menyentuh pembayaran, keamanan masuk, sakelar seluruh situs, atau harga | | `branding_get` | Nama merek, warna, mata uang tampilan, nama penjual, logo, dan URL favicon. | `admin:read` | Tidak | Tidak | | `branding_update` | Atur nama merek (hingga 60 karakter), warna (`#rrggbb`), mata uang tampilan (`usd` atau `vnd`), dan nama penjual. | `settings:write` | Ya | Tidak | | `branding_logo_set` | Unggah logo terang atau gelap atau favicon dari URL https atau base64 (PNG, JPEG, WEBP, ICO, atau SVG, hingga 512 KB). | `settings:write` | Ya | Tidak | | `legal_get` | Ketentuan layanan dan kebijakan privasi (Bahasa Inggris dan Vietnam) serta standar netral. | `admin:read` | Tidak | Tidak | | `legal_update` | Atur teks ketentuan dan privasi (markdown sederhana, tanpa HTML, hingga 50 KB masing-masing). Kosongkan untuk mengembalikan ke default. | `settings:write` | Ya | Tidak | | `modules_get` | Modul opsional mana yang aktif dan mana yang dapat dialihkan. | `admin:read` | Tidak | Tidak | | `module_set` | Nyalakan atau matikan modul opsional (`key` harus berupa salah satu dari `settable`). | `settings:write` | Ya | Tidak | ### Email dan peringatan {#email-and-alerts} | Alat | Fungsi | Cakupan | Mengubah data | Meminta Anda | |---|---|---|---|---| | `smtp_get` | Pengaturan email keluar (kata sandi disamarkan) dan status antrean. | `admin:read` | Tidak | Tidak | | `smtp_configure` | Atur server SMTP. Mengubah host, port, atau keamanan memerlukan kata sandi kembali. | `settings:write` (+ `secrets:write` untuk kata sandi) | Ya | Tidak | | `smtp_test` | Kirim email uji coba nyata dengan pengaturan yang disimpan. | `settings:write` | Mengirim email | Tidak | | `telegram_get` | Saluran pemberitahuan admin (id chat; token bot tidak pernah ditampilkan). | `admin:read` | Tidak | Tidak | | `telegram_configure` | Tambah atau perbarui saluran peringatan Telegram (token bot dan id chat) serta aktifkan atau nonaktifkan peringatan admin. | `settings:write` (+ `secrets:write` untuk token) | Ya | Tidak | | `telegram_test` | Kirim pesan uji coba ke saluran Telegram. | `settings:write` | Mengirim pesan | Tidak | ### Pembayaran dan mata uang {#payments-and-currency} | Alat | Fungsi | Cakupan | Mengubah data | Meminta Anda | |---|---|---|---|---| | `payments_get` | Status Stripe, PayPal, kripto (USDT), dan transfer bank, ditambah saluran yang diaktifkan dan biaya. | `admin:read` | Tidak | Tidak | | `payment_configure` | Atur kredensial satu gateway (`stripe`, `paypal`, `crypto`, atau `bank`). | `billing:write` (+ `secrets:write`) | Ya | Selalu | | `payment_test` | Periksa kredensial gateway yang disimpan dengan penyedia. | `billing:write` | Tidak | Tidak | | `currency_get` | Mata uang tampilan dan kurs USD ke VND (otomatis atau manual). | `admin:read` | Tidak | Tidak | | `currency_set` | Atur mata uang tampilan dan/atau kurs manual (0 berarti otomatis, jika tidak 15000 hingga 50000). | `billing:write` | Ya | Saat Anda mengubah kurs manual | ### Infrastruktur dan zona {#infrastructure-and-zones} | Alat | Fungsi | Cakupan | Mengubah data | Meminta Anda | |---|---|---|---|---| | `cloudstack_get` | Endpoint CloudStack serta id zona dan jaringan yang tersimpan (kunci disamarkan). | `admin:read` | Tidak | Tidak | | `cloudstack_test` | Uji endpoint dengan kunci API dan rahasia tanpa menyimpan; mencantumkan zona. | `infra:write` (+ `secrets:write`, karena Anda meneruskan kunci) | Tidak | Tidak | | `cloudstack_connect` | Simpan koneksi CloudStack. | `infra:write` (+ `secrets:write`) | Ya | Selalu | | `proxmox_list` | Klaster Proxmox VE ditambahkan sebagai sumber, beserta kesehatannya. | `admin:read` | Tidak | Tidak | | `proxmox_add` | Tambahkan klaster Proxmox VE dengan token API (`user@realm!tokenid`) dan kuncinya. | `infra:write` (+ `secrets:write`) | Ya | Tidak | | `proxmox_test` | Sambungkan ke klaster berdasarkan id; keberhasilan pertama akan menyematkan sertifikat TLS-nya. | `infra:write` | Ya | Tidak | | `proxmox_attach_zone` | Jual klaster Proxmox di zona yang ada, secara opsional dengan node sebagai region. | `infra:write` | Ya | Tidak | | `zones_list` | Zona (lokasi) yang dapat dipilih pelanggan. | `admin:read` | Tidak | Tidak | | `zone_create` | Buat zona. | `infra:write` | Ya | Tidak | ### Katalog dan paket {#catalog-and-plans} | Alat | Fungsi | Cakupan | Mengubah data | Meminta Anda | |---|---|---|---|---| | `templates_list` | Templat OS yang dapat diinstal pelanggan. | `admin:read` | Tidak | Tidak | | `templates_sync` | Impor templat OS dari CloudStack. | `catalog:write` | Ya | Tidak | | `template_update` | Aktifkan atau sembunyikan templat, ganti namanya, atur pengguna login atau urutannya. | `catalog:write` | Ya | Tidak | | `offerings_list` | Penawaran layanan CloudStack (CPU, memori, disk root) untuk membangun paket. | `admin:read` | Tidak | Tidak | | `plans_list` | Paket dengan harga per jam dan per bulan, ukuran, zona, dan berapa banyak server yang menggunakannya. | `admin:read` | Tidak | Tidak | | `plan_create` | Buat paket. Harga sebagai `hourly_usd`. Paket CloudStack memerlukan `cs_offering_id`; paket Proxmox memerlukan `backend_id`. | `catalog:write` | Ya | Tidak | | `plan_update` | Ganti nama, tampilkan atau sembunyikan, aktifkan atau nonaktifkan, atau ubah harga paket. Perubahan ukuran pada paket yang sedang digunakan memerlukan salinan. | `catalog:write` | Ya | Saat harga berubah | | `plans_from_offerings` | Buat tabel paket pemula dari penawaran (atau ukuran Proxmox) menggunakan biaya Anda dan persentase margin. Mengembalikan pratinjau; panggil lagi dengan `apply=true` untuk membuat paket. | `catalog:write` | Dengan `apply=true` | Selalu saat menerapkan | | `quota_defaults_get` | Batas default pelanggan. | `admin:read` | Tidak | Tidak | | `quota_defaults_set` | Ubah pengaturan `quota_*`. | `catalog:write` | Ya | Tidak | | `coupons_list` | Batch kode diskon dan hadiah. | `admin:read` | Tidak | Tidak | | `coupon_create` | Buat batch kode: tipe `money` (nilai nominal dalam sen USD) atau `percent` (1 hingga 100, dengan diskon maksimum). | `catalog:write` | Ya | Selalu | ### Pelanggan dan reseller {#customers-and-resellers} | Alat | Fungsi | Cakupan | Mengubah data | Meminta Anda | |---|---|---|---|---| | `customers_search` | Cari pelanggan berdasarkan email, nama, atau IP. | `admin:read` | Tidak | Tidak | | `customer_get` | Akun, saldo, server, dan penagihan terkini dari satu pelanggan. | `admin:read` | Tidak | Tidak | | `customer_adjust_balance` | Tambahkan (positif) atau kurangi (negatif) kredit dalam sen USD. Alasan wajib diisi. | `billing:write` | Ya | Selalu | | `customer_block` | Blokir pelanggan, opsional menghentikan server mereka. Alasan wajib diisi. | `customers:write` | Ya | Selalu | | `customer_unblock` | Buka blokir pelanggan. | `customers:write` | Ya | Tidak | | `resellers_list` | Reseller dengan wallet dan status. | `admin:read` | Tidak | Tidak | | `reseller_get` | Situs, wallet, pengguna, dan gateway dari satu reseller. | `admin:read` | Tidak | Tidak | ### AI provider {#ai-provider} | Alat | Fungsi | Cakupan | Mengubah data | Meminta Anda | |---|---|---|---|---| | `ai_provider_get` | Penyedia kompatibel-OpenAI yang digunakan oleh AI Chat dan AI Agent pelanggan (kunci disamarkan). | `admin:read` | Tidak | Tidak | | `ai_provider_set` | Atur penyedia: URL dasar, model, API key, model fallback, reasoning effort, diaktifkan. | `ai:write` (+ `secrets:write` untuk kuncinya) | Ya | Tidak | | `ai_provider_test` | Ajukan satu pertanyaan ke penyedia yang tersimpan untuk memeriksa apakah berfungsi. | `ai:write` | Tidak | Tidak | ### File konfigurasi {#configuration-files} | Alat | Fungsi | Cakupan | Mengubah data | Meminta Anda | |---|---|---|---|---| | `config_export` | Ekspor konfigurasi sebagai YAML (rahasia menjadi referensi `secret://`). | `admin:read` | Tidak | Tidak | | `config_plan` | Bandingkan konfigurasi YAML dengan panel aktif dan buat daftar perubahan yang akan terjadi. | `admin:read` | Tidak | Tidak | | `config_apply` | Terapkan konfigurasi YAML bagian demi bagian. Setiap perubahan mengikuti aturan scope dan konfirmasi standar. | `admin:read` + scope dari setiap perubahan | Ya | Per perubahan | Lihat [Konfigurasi sebagai kode](https://nexcmp.com/id/docs/configure-with-ai/config-as-code/) untuk format file. ## Prompt {#prompts} Server juga menawarkan tiga prompt siap pakai yang dapat ditampilkan klien sebagai pintasan: | Prompt | Argumen | Tindakan yang diminta kepada AI | |---|---|---| | `initial-setup` | tidak ada | Panggil `setup_checklist`, jelaskan setiap langkah yang terbuka dalam satu kalimat, minta informasi yang dibutuhkan kepada Anda, jalankan langkah tersebut dengan alat yang sesuai, pratinjau perubahan biaya atau keamanan, dan akhiri dengan `system_health`. | | `add-proxmox` | `endpoint` (opsional, `https://host:8006`) | Minta token API, lalu `proxmox_add`, `proxmox_test`, alat zona dan `proxmox_attach_zone`; lalu usulkan paket dengan `plans_from_offerings` dan tunggu persetujuan Anda. | | `launch-pricing` | `margin_pct` (opsional, default 40) | Minta biaya bulanan Anda per vCPU, per GB RAM, dan per GB disk, tampilkan tabel pratinjau dengan biaya, harga per bulan, dan harga per jam, lalu buat paket setelah Anda menyetujuinya. | ## Konfirmasi (`confirm_token`) {#confirmation-confirm-token} Tindakan yang memindahkan uang, menghapus data, mengubah kredensial pembayaran, atau keamanan masuk terdiri dari dua langkah: 1. Panggilan pertama tidak mengubah apa pun. Hasil alat dimulai dengan "CONFIRMATION REQUIRED" dan menyertakan **pratinjau** (apa yang akan dipanggil, mengapa tindakan tersebut sensitif, nilai baru, dan nilai saat ini) serta `confirm_token`. 2. Klien harus menunjukkan pratinjau kepada Anda. Hanya setelah Anda menyetujuinya, klien akan memanggil alat yang sama lagi dengan argumen yang sama ditambah `confirm_token`. 3. Token ini berfungsi sekali, hanya untuk permintaan persis tersebut, dan kedaluwarsa setelah 5 menit. Instruksi server memberi tahu AI untuk memperlakukan hasil alat sebagai data, bukan sebagai instruksi, dan tidak boleh mengulang panggilan dengan token yang belum Anda setujui. Anda adalah pengaman: baca pratinjau. ::: warning Jangan setujui otomatis Beberapa klien dapat menyetujui setiap panggilan alat secara otomatis. Untuk alat tulis, tetap aktifkan persetujuan per panggilan, atau gunakan kunci baca-saja, sehingga rencana yang salah dari AI tidak dapat menjangkau panel Anda tanpa sepengetahuan Anda. ::: ## Cara kerja {#how-it-works} | Item | Detail | |---|---| | Transportasi | `POST /mcp/admin` dengan pesan JSON-RPC 2.0; jawabannya adalah `application/json`. Hingga 20 pesan dalam satu batch. `GET /mcp/admin` menjawab 405 (tidak ada aliran server); `DELETE /mcp/admin` mengakhiri sesi. | | Autentikasi | `Authorization: Bearer ak_...` (kunci manual atau token akses OAuth). Kredensial yang hilang atau salah memberikan 401 dengan `WWW-Authenticate: Bearer ... resource_metadata=...`, yang memungkinkan klien OAuth memulai proses masuk sendiri. | | Sesi | `Mcp-Session-Id` dikeluarkan oleh `initialize`, terikat pada kunci tersebut dan berlaku selama 24 jam. | | Kapabilitas | Alat dan prompt. Tanpa sumber daya. | | Ukuran | Badai permintaan hingga 1 MB; hasil alat dipotong setelah sekitar 100 KB. | | Asal | Permintaan yang membawa header `Origin` dari situs lain ditolak (`origin_not_allowed`). Klien baris perintah dan desktop tidak mengirimkannya. | | Gerbang yang sama seperti REST | Setiap panggilan alat dikirim ulang melalui saluran permintaan panel Anda dengan kunci Anda, sehingga cakupan, rentang IP, batasan laju, konfirmasi, dan log aktivitas berlaku persis seperti pada panggilan API langsung. | ## Batas & catatan {#limits-notes} - Alat yang tidak dapat Anda lihat adalah cakupan yang tidak Anda berikan. Tambahkan cakupan ke kunci baru. - Menetapkan kata sandi atau kunci API melalui klien AI berarti rahasia tersebut melewati AI tersebut. Jika Anda mau, matikan `secrets:write` dan masukkan sendiri rahasia di panel admin, atau gunakan bidang **Secret** AI Chat ([AI Chat di admin](https://nexcmp.com/id/docs/configure-with-ai/ai-chat-in-admin/#secrets)) atau referensi `secret://` ([Konfigurasi sebagai kode](https://nexcmp.com/id/docs/configure-with-ai/config-as-code/#secrets)). - Klien tidak berbagi sesi: setiap koneksi dimulai dengan `initialize`. - Cabut kunci di **API & AI agents** untuk memutus koneksi klien AI seketika. ## Pemecahan Masalah {#troubleshooting} | Gejala | Penyebab | Solusi | |---|---|---| | 401 `invalid_key` | Kunci salah, terpotong, atau bukan kunci admin (misalnya kunci `vk_`) | Gunakan kunci `ak_`. | | 401 `key_expired` atau `key_revoked` | Kunci habis masa berlakunya atau telah dicabut | Buat kunci baru. | | 403 `ip_not_allowed` | IP Anda berada di luar rentang IP kunci | Sambungkan dari IP yang diizinkan. | | 403 `origin_not_allowed` | Halaman browser di asal lain memanggil endpoint | Gunakan klien desktop atau CLI. | | 404 pada permintaan dengan `Mcp-Session-Id` | Sesi milik kunci lain atau sudah kedaluwarsa | Kirim `initialize` lagi. | | 400 `MCP-Protocol-Version` tidak didukung | Klien menggunakan versi yang tidak dikenali oleh server | Perbarui klien; yang didukung: 2025-11-25, 2025-06-18, 2025-03-26. | | Daftar alat terlalu pendek | Cakupan kunci | Buat kunci dengan lebih banyak cakupan. | | `insufficient_scope` pada panggilan | Suatu alat memerlukan cakupan kedua, misalnya `secrets:write` | Tambahkan cakupan ke kunci baru. | | 429 `rate_limited` | Panggilan per menit melebihi yang diizinkan oleh kunci | Tunggu selama `Retry-After` atau tingkatkan batasan pada kunci baru. | | claude.ai atau ChatGPT tidak dapat terhubung | URL tidak dapat dijangkau dari internet, atau proksi memblokir `/mcp/admin` atau `/oauth-admin/` | Periksa DNS, TLS, dan reverse proxy. | Untuk semua kode galat, lihat [Admin API keys](https://nexcmp.com/id/docs/configure-with-ai/admin-api-keys/#errors). --- # Konektor claude.ai dan ChatGPT {#claude-ai-and-chatgpt-connectors} > **Di mana letaknya di admin:** System › Settings › API & AI agents (`/agent/keys`), tab **Connected apps**. Layar izin terbuka di `/agent/consent` saat konektor meminta akses (tidak ada di menu). ## Fungsi {#what-it-does} Aplikasi AI web tidak dapat membaca kunci dari disk Anda. Mereka terhubung menggunakan **OAuth**: Anda menambahkan URL MCP panel, aplikasi mengarahkan Anda ke admin sendiri untuk masuk, Anda memilih apa yang boleh dilakukan aplikasi dan untuk berapa lama, lalu aplikasi menerima token berumur pendek. Tidak ada kunci yang disalin atau ditempel. Anda dapat memutuskan hubungan aplikasi kapan saja. Gunakan ini untuk konektor kustom claude.ai, konektor mode pengembang ChatGPT, dan klien MCP lain yang mendukung OAuth dengan pendaftaran klien dinamis. Alat baris perintah dapat menggunakan alur yang sama, tetapi [admin API key](https://nexcmp.com/id/docs/configure-with-ai/admin-api-keys/) lebih sederhana bagi mereka. ## Persyaratan {#requirements} | Item | Persyaratan | |---|---| | URL | `https://cloud.example.com/mcp/admin`, dapat diakses dari internet (server vendor terhubung ke sana). | | Reverse proxy | Jika Anda menempatkan proxy sendiri di depan panel, proxy tersebut harus meneruskan jalur `/mcp/admin`, `/oauth-admin/`, dan `/.well-known/` ke panel. | | Anda | Masuk ke admin NexCMP **di browser yang sama** yang Anda gunakan untuk layar izin. | | Klien | Mendukung MCP melalui Streamable HTTP, OAuth 2.1 dengan PKCE (S256), dan pendaftaran klien dinamis. | ## Menghubungkan {#connect} 1. Di aplikasi AI, tambahkan konektor MCP kustom dan tempel `https://cloud.example.com/mcp/admin`. Di claude.ai ini ada di bawah pengaturan konektor (tambahkan konektor kustom); di ChatGPT ada di bawah mode pengembang (tambahkan konektor MCP, autentikasi OAuth). 2. Pilih **Sign in** (atau "Connect") di aplikasi. Browser Anda membuka layar izin admin NexCMP. Jika Anda belum masuk, masuklah terlebih dahulu; layar akan dilanjutkan setelahnya. 3. Baca kartu: "**Example AI app** wants to manage this NexCMP admin" (nama aplikasi yang meminta), beserta alamat tempat Anda akan dikembalikan. 4. Centang cakupan yang ingin diberikan. Cakupan yang diminta oleh aplikasi sudah dicentang sebelumnya; jika tidak ada yang diminta, hanya `admin:read` yang dicentang. Lihat [Scopes](https://nexcmp.com/id/docs/configure-with-ai/admin-api-keys/#scopes). 5. Pilih berapa lama koneksi berlangsung: **7**, **30**, atau **90** hari (default 30). 6. Klik **Allow**. Browser kembali ke aplikasi, yang sekarang sudah terhubung. Klik **Deny** untuk menolak. ![Layar izin yang meminta izin untuk aplikasi AI, dengan kotak centang cakupan, pilihan durasi, serta tombol Allow dan Deny](https://nexcmp.com/id/docs/images/configure-with-ai/oauth-connectors-01-consent.webp) ::: important Pilih cakupan seperti yang Anda lakukan untuk kunci Berikan set terkecil yang dapat menyelesaikan tugas. Tindakan keuangan, penghapusan, dan keamanan tetap berhenti pada pratinjau dan memerlukan persetujuan Anda, tetapi koneksi dengan `settings:write` masih dapat mengubah branding dan email Anda. ::: ## Kelola dan cabut {#manage-and-revoke} Buka **System › Settings › API & AI agents › Connected apps**. Tabel mencantumkan setiap aplikasi yang Anda hubungkan: aplikasi, cakupan, waktu terhubung, waktu kedaluwarsa, dan waktu terakhir digunakan. Untuk memutuskan aplikasi, klik **Revoke** dan konfirmasi. Tokennya langsung berhenti berfungsi; aplikasi harus melalui layar izin lagi untuk menyambungkan kembali. ![Tab Connected apps yang mencantumkan satu aplikasi AI beserta cakupan, masa kedaluwarsa, dan tombol Revoke](https://nexcmp.com/id/docs/images/configure-with-ai/oauth-connectors-02-connected-apps.webp) ## Cara kerja alur {#how-the-flow-works} | Langkah | Detail | |---|---| | Penemuan | Aplikasi membaca `/.well-known/oauth-protected-resource/mcp/admin` lalu `/.well-known/oauth-authorization-server/oauth-admin`. Penerbitnya adalah `https://cloud.example.com/oauth-admin`. | | Pendaftaran | Aplikasi mendaftarkan dirinya sendiri (`POST /oauth-admin/register`, RFC 7591). Hanya klien publik yang didukung (tanpa rahasia klien). Alamat pengalihan harus berupa `https`, atau `http` di komputer yang sama (loopback). | | Otorisasi | `GET /oauth-admin/authorize` dengan metode PKCE `S256`. Parameter `resource`, saat dikirim, harus berupa URL `/mcp/admin` panel ini. Permintaan valid selama 10 menit dan terikat pada browser yang memulainya. | | Persetujuan | Anda memilih cakupan dan durasi (di atas). Kode otorisasi berlaku selama 60 detik dan hanya dapat digunakan sekali. | | Token | `POST /oauth-admin/token` mengembalikan **access token** (sebuah `ak_o...` key, berlaku selama 1 jam atau hingga koneksi berakhir, mana yang lebih dulu) dan **refresh token** (`akr_...`). Setiap refresh menghasilkan refresh token baru; yang lama berhenti berfungsi. Koneksi berakhir setelah hari yang Anda pilih. | | Pencabutan | **Revoke** di Connected apps, atau aplikasi memanggil `POST /oauth-admin/revoke` (RFC 7009). | Access token berperan seperti admin key dengan cakupan yang Anda berikan: aturan cakupan, konfirmasi, batas laju, dan log aktivitas yang sama. Panggilannya akan muncul pada tab **Activity**. ## Verifikasi {#verify} 1. Di dalam aplikasi, tanyakan "run system_health" (atau "what tools do you have?"). Aplikasi akan mencantumkan alat yang diizinkan oleh cakupan Anda ([the tool list](https://nexcmp.com/id/docs/configure-with-ai/mcp-admin/#tools)). 2. Buka **Connected apps**: **Last used** bergerak. 3. Buka **Activity**: panggilan tercantum beserta nama aplikasi dan `mcp`. ## Batas & catatan {#limits-notes} - Jika aplikasi meminta untuk masuk kembali setelah satu jam, itu normal ketika klien tidak melakukan refresh; sambungkan kembali. - Refresh token yang digunakan dua kali dianggap dicuri: seluruh koneksi dicabut. Sambungkan kembali dari aplikasi. - Kode otorisasi yang digunakan dua kali akan ditolak (`invalid_grant`) dan token yang telah diterbitkan darinya dicabut. - Akses OAuth tidak pernah memberikan lebih dari yang diizinkan aturan cakupan: [what a key can never do](https://nexcmp.com/id/docs/configure-with-ai/admin-api-keys/#what-a-key-can-never-do) juga berlaku untuk aplikasi terhubung. - Vendor mengubah menu dan dukungan mereka. Jika aplikasi vendor tidak menawarkan konektor kustom pada paket Anda, gunakan [admin API key](https://nexcmp.com/id/docs/configure-with-ai/admin-api-keys/) dengan klien desktop atau baris perintah sebagai gantinya. ## Pemecahan Masalah {#troubleshooting} | Gejala | Penyebab | Solusi | |---|---|---| | Layar persetujuan bertuliskan "Wrong browser" | Permintaan dimulai di browser yang berbeda dari yang Anda gunakan untuk masuk | Mulai koneksi kembali dari aplikasi AI di browser yang sama. | | Layar persetujuan menyatakan permintaan kedaluwarsa atau hilang | Lebih dari 10 menit telah berlalu, atau tautan dibuka dua kali | Mulai koneksi kembali dari aplikasi AI. | | Halaman "Unknown client" atau "redirect address does not match" | Pendaftaran aplikasi sudah usang, atau menggunakan alamat pengalihan yang tidak didaftarkan | Hapus konektor di aplikasi lalu tambahkan kembali. | | `invalid_target` | `resource` yang dikirim bukan URL `/mcp/admin` panel ini | Gunakan URL persis yang ditampilkan pada tab **Connect an AI**. | | `invalid_request` tentang PKCE | Klien tidak mengirimkan `code_challenge_method=S256` | Gunakan klien yang mendukung OAuth 2.1 dengan PKCE. | | Aplikasi terhubung tetapi panggilan mengembalikan `insufficient_scope` | Anda tidak mencentang cakupan tersebut | Cabut koneksi dan sambungkan kembali dengan cakupan yang dicentang. | | Aplikasi tidak dapat menjangkau URL | DNS, TLS, atau reverse proxy memblokir `/mcp/admin`, `/oauth-admin/`, atau `/.well-known/` | Periksa aturan proxy. | --- # Configuration as code {#configuration-as-code} > **Where in the admin:** System › Settings › Import/Export (`/agent/config`). Di server: perintah `nexcmp config export`, `plan`, dan `apply`, serta `nexcmp admin `. ## Fungsi {#what-it-does} Konfigurasi panel Anda (branding, pengaturan umum, email, peringatan Telegram, modul, mata uang, gateway pembayaran, batas, zona, paket, penyedia AI, dan halaman hukum) dapat disimpan sebagai satu file YAML. Anda dapat mengedit filenya sendiri, meminta asisten AI untuk mengeditnya, menyimpannya dalam kontrol versi, dan menerapkannya ke panel yang sama atau panel lainnya. Sebelum ada yang berubah, Anda akan selalu melihat daftar perbedaan. Rahasia tidak pernah ditulis ke dalam file. Gunakan untuk mengkloning peninjauan ke instalasi kedua, untuk meninjau perubahan sebelum ditayangkan, untuk memulihkan pengaturan setelah terjadi kesalahan, atau untuk membiarkan AI mengusulkan seluruh konfigurasi yang Anda baca sebagai satu dokumen. ## Persyaratan {#requirements} | Item | Persyaratan | |---|---| | NexCMP | 1.4.0 atau lebih baru. | | Baris perintah | Anda adalah `root` di server panel (gunakan `sudo`). Perintah ini meminta kunci sementara dari panel (15 menit, semua cakupan) dengan sendirinya. Untuk menggunakan kunci yang lebih terbatas sebagai gantinya, tetapkan `NEXCMP_KEY` ke [admin API key](https://nexcmp.com/id/docs/configure-with-ai/admin-api-keys/) dan simpan melalui sudo, misalnya `sudo --preserve-env=NEXCMP_KEY nexcmp config plan -f nexcmp.yaml`. | | Halaman admin | Masuk ke admin. Halaman ini hanya-baca pada panel demo. | | Rahasia | Nilai yang disediakan pada saat penerapan (lihat [Secrets](#secrets)); tidak pernah di dalam file. | ## Ekspor, edit, pratinjau, terapkan {#export-edit-preview-apply} 1. Ekspor konfigurasi saat ini: ```bash sudo nexcmp config export -o nexcmp.yaml ``` Tanpa `-o`, YAML dicetak ke layar. 2. Edit `nexcmp.yaml` (lihat [example](#example-file) di bawah). Tetap simpan `version: 1` di atas. 3. Pratinjau apa yang akan berubah. Ini tidak mengubah apa pun: ```bash sudo nexcmp config plan -f nexcmp.yaml ``` Setiap baris menunjukkan bagian, item, bidang, dan `old → new`. Baris bertanda `$` termasuk dalam bagian penagihan (lihat [Billing sections](#billing-sections)). Jika panel sudah cocok dengan file, Anda akan melihat "No changes". 4. Terapkan. Tanpa `--yes`, perintah ini berupa **dry run** dan hanya mencetak daftar yang sama: ```bash sudo nexcmp config apply -f nexcmp.yaml --yes ``` 5. Baca hasilnya: `applied`, `pending` (menunggu konfirmasi Anda), `skipped`, dan `errors`. | Opsi | Arti | |---|---| | `-f ` | File YAML (diperlukan untuk `plan` dan `apply`). | | `--yes` | Terapkan secara nyata. Tanpa itu, `apply` adalah dry run. | | `--confirm-billing` | Terapkan juga bagian penagihan (`payments`, `currency`, `plans`). Tanpa itu, bagian tersebut akan dilewati. | | `--section ` | Terapkan hanya bagian ini. Ulangi opsi ini untuk beberapa bagian. | | `-o ` | Dengan `export`: tulis YAML ke sebuah file. | Kode keluar adalah 0 ketika semuanya berhasil diterapkan atau tidak ada yang berubah, 1 ketika kesalahan dikembalikan, 2 untuk kesalahan penggunaan atau kunci. ### Rahasia {#secrets} File tersebut menyimpan referensi alih-alih rahasia, seperti `password: secret://smtp_password`. Pada saat penerapan, nilai berasal dari variabel lingkungan bernama `NEXCMP_SECRET_` ditambah nama referensi dalam huruf kapital: ```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 ``` Jika referensi tidak memiliki nilai, rahasia yang sudah disimpan di panel akan **tetap disimpan**. Rahasia yang tidak pernah disimpan dan tidak disediakan akan tetap kosong. | Nama referensi | Tujuannya | |---|---| | `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` | ## Contoh file {#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). ``` Sebuah file dapat berisi bagian mana pun dari subset. Bagian yang Anda lewatkan tidak akan disentuh. File yang lebih besar dari 1 MB, `version: 1` yang hilang, nomor versi yang berbeda, atau bagian yang tidak dikenal akan ditolak sebelum ada yang berjalan. ## Bagian {#sections} | Bagian | Yang dikendalikan | Catatan | |---|---|---| | `branding` | Nama merek (hingga 60 karakter), warna primer, mata uang tampilan (`usd` atau `vnd`), nama penjual. | Logo bukan bagian dari file; gunakan [branding page](https://nexcmp.com/id/docs/customers/branding/). | | `settings` | Daftar tetap pengaturan umum: `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`. | Kunci lainnya diabaikan. | | `email.smtp` | Host SMTP, port, keamanan (`starttls`, `tls`, `none`), pengguna, kata sandi, nama dan alamat pengirim, balas-ke. | [SMTP and e-mail templates](https://nexcmp.com/id/docs/administration/smtp-and-emails/). Mengubah host, port, atau keamanan memerlukan kata sandi lagi. | | `telegram` | Saluran pemberitahuan aktif atau nonaktif, chat ID, bot token. | [Telegram notifications](https://nexcmp.com/id/docs/administration/telegram-notifications/). | | `modules` | Modul opsional aktif atau nonaktif (`key: true/false`). | Hanya tombol yang diizinkan oleh panel. Lihat [Modules](https://nexcmp.com/id/docs/infrastructure/modules/). | | `currency` | Mata uang tampilan dan kurs manual USD ke VND (`0` otomatis, jika tidak 15000 hingga 50000). | Bagian penagihan. Lihat [Currency and exchange rates](https://nexcmp.com/id/docs/catalog/currency-and-exchange-rates/). | | `payments` | Kredensial `stripe`, `paypal`, `crypto`, `bank` dan tombol `channels` (`pay_card_enabled`, `pay_wallets_enabled`, `pay_alipay_enabled`, `pay_paypal_enabled`, `pay_usdt_enabled`, `pay_sepay_enabled`). | Bagian penagihan. Lihat [Payment channels](https://nexcmp.com/id/docs/billing/payment-channels/). | | `quotas` | Batas `quota_*`. | Lihat [Quotas](https://nexcmp.com/id/docs/billing/quotas/). | | `zones` | Zona berdasarkan `slug` (wajib: `slug`, `name`, `country`; opsional `city`, `enabled`, `is_default`). | Zona baru dibuat. Zona yang sudah ada **tidak diubah** oleh file tersebut. Lihat [Zones](https://nexcmp.com/id/docs/infrastructure/zones/). | | `plans` | Paket berdasarkan `slug` (wajib: `slug`, `name`, `cpu`, `ram_mb`, `disk_gb`, `hourly_usd`; opsional `cs_offering_id`, `backend_id`, `zone_id`, `enabled`, `visible`, `sort`, `description`). | Bagian penagihan. Paket baru dibuat, paket yang sudah ada diperbarui berdasarkan slug. Harga dalam USD per jam. Lihat [Plans](https://nexcmp.com/id/docs/catalog/plans/). | | `ai_provider` | Provider AI panel yang digunakan oleh AI Chat dan AI Agent pelanggan. | [AI provider](https://nexcmp.com/id/docs/ai/ai-providers/). | | `legal` | Teks syarat dan privasi per bahasa (`en`, `vi`). | [Legal pages](https://nexcmp.com/id/docs/customers/legal/). | Urutan penerapan adalah urutan di atas: item mirip infrastruktur sebelum paket. ## Aturan yang perlu diingat {#rules-to-remember} - **Idempoten.** Menerapkan file yang sama dua kali tidak mengubah apa pun pada kali kedua. `plan` menampilkan "No changes". - **Tanpa penghapusan.** File tidak pernah menghapus zona, paket, atau pengaturan. Menghapus entri dari file membiarkan panel seperti apa adanya. - **Aturan keamanan normal tetap berlaku.** Dari baris perintah, setiap perubahan dikirim melalui pemeriksaan yang sama seperti perubahan API: cakupan dan aturan IP. Perubahan yang memerlukan konfirmasi (misalnya tombol tingkat situs) dilaporkan di bawah `pending` dengan pratinjau alih-alih langsung diterapkan, kecuali Anda meneruskan `--confirm-billing`, yang mengonfirmasi semuanya. - **Klien AI tidak dapat membuka kunci penagihan.** Ketika `config_apply` dipanggil oleh klien MCP, `confirm_billing` diabaikan; perubahan uang menunggu persetujuan Anda. - **Periksa sebelum Anda menerapkannya.** Skema JSON menjelaskan setiap field. Arahkan editor Anda ke sana, atau berikan ke AI agar menulis YAML yang valid: `https://cloud.example.com/v1/admin/agent/config/schema.json` (dapat dibaca publik). ### Bagian penagihan {#billing-sections} `payments`, `currency`, dan `plans` mengubah harga atau jalur uang. `nexcmp config apply --yes` **mengabaikannya** kecuali Anda menambahkan `--confirm-billing`; perubahan tersebut kemudian dicantumkan di bawah `skipped` ("billing section - pass confirm_billing"). Flag tersebut adalah konfirmasi Anda: dengannya, setiap perubahan penagihan dalam file (dan perubahan lain yang akan meminta konfirmasi) diterapkan tanpa prompt kedua. Jalankan `plan` terlebih dahulu dan baca setiap baris yang ditandai `$`. Ketika file yang sama diterapkan oleh AI (alat `config_apply` di klien MCP atau AI Chat), flag tersebut diabaikan, dan perubahan uang akan menunggu persetujuan Anda. ## Gunakan halaman Import/Export {#use-the-import-export-page} 1. Buka **System › Settings › Import/Export**. 2. Di bawah **Export** klik **Get current configuration**, lalu **Download .yaml** untuk menyimpan `nexcmp.yaml`. Rahasia muncul sebagai placeholder. 3. Di bawah **Import** pilih file, seret ke dalam kotak, atau tempel YAML. 4. Opsional: buka **Secrets that come with it (not in the file)** dan tambahkan nama serta nilai untuk setiap referensi, misalnya `smtp_password`. 5. Klik **Preview changes**. Tabel mengelompokkan perubahan menurut bagian; bagian yang terkait dengan uang membawa tag "Money-related". Hilangkan centang pada bagian yang tidak Anda inginkan. 6. Jika bagian yang berkaitan dengan keuangan tercantum, centang **Also apply money-related changes (prices, payment gateways, balances)**. Tanpa centang tersebut, bagian itu akan dilewati. 7. Klik **Apply selected**. Hasilnya menunjukkan apa saja yang diterapkan, dilewati, atau gagal. Perubahan yang dikembalikan sebagai menunggu konfirmasi akan muncul sebagai kartu konfirmasi; tekan **Confirm** pada kartu tersebut. Tombol **JSON Schema** di kanan atas akan membuka skema. ![Halaman Import/Export dengan kartu Export dan kartu Import yang berisi YAML yang diekspor](https://nexcmp.com/id/docs/images/configure-with-ai/config-as-code-01-import-export.webp) ![Tabel pratinjau perubahan yang dikelompokkan menurut bagian dengan tag penagihan dan tombol Apply selected](https://nexcmp.com/id/docs/images/configure-with-ai/config-as-code-02-preview.webp) ## Jalankan alat apa pun dari baris perintah {#run-any-tool-from-the-command-line} `nexcmp admin` menjalankan alat yang sama seperti asisten AI ([daftar alat](https://nexcmp.com/id/docs/configure-with-ai/mcp-admin/#tools)) dan mencetak 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"}}' ``` Argumen berupa pasangan `key=value` (nilai dibaca sebagai JSON saat diurai, jika tidak sebagai teks) atau satu objek `--json '{...}'`. Jika tindakan memerlukan konfirmasi, perintah akan mencetak pratinjau dan berhenti dengan kode keluar 3 serta "Nothing changed". Baca pratinjau tersebut, lalu jalankan kembali perintah yang sama dengan `--yes` untuk menerapkannya. Saat dijalankan sebagai root, perintah akan mendapatkan kunci 15 menit dengan semua cakupan, sehingga langkah konfirmasi adalah pengaman Anda; dengan `NEXCMP_KEY`, cakupan kunci Anda sendiri yang akan berlaku. ## Verifikasi {#verify} 1. `sudo nexcmp config plan -f nexcmp.yaml` tepat setelah `apply --yes` mencetak "No changes". 2. Di admin, halaman yang Anda ubah akan menampilkan nilai baru, dan **Logs › Admin actions** mencantumkan perubahan tersebut. 3. Menerapkan file yang sama lagi tidak akan mengubah apa pun. ## Batas & catatan {#limits-notes} - File ini mencakup pengaturan di atas, bukan pelanggan, server, tagihan, atau sumber infrastruktur (koneksi CloudStack dan Proxmox). Hubungkan komponen tersebut menggunakan [AI Chat](https://nexcmp.com/id/docs/configure-with-ai/ai-chat-in-admin/) atau halaman admin. - Zona dan paket dicocokkan dengan `slug`. Jangan ganti nama slug di dalam file: slug tersebut akan dibuat sebagai item baru. - Paket yang sudah digunakan oleh pelanggan tidak dapat diubah ukurannya; buat paket baru sebagai gantinya. - Jaga kerahasiaan file yang diekspor meskipun tidak berisi data rahasia: file tersebut mencantumkan harga, alamat, dan nama akun Anda. ## Pemecahan Masalah {#troubleshooting} | Gejala | Penyebab | Solusi | |---|---|---| | `missing version: 1` | File tidak dimulai dengan `version: 1` | Tambahkan file tersebut. | | `unsupported version 2` | File memiliki nomor versi yang berbeda | Panel ini hanya membaca versi 1. | | `unknown section 'x' (known: ...)` | Kunci tingkat atas salah eja atau tidak didukung | Gunakan bagian di atas. | | `YAML error: ...` | YAML tidak valid (indentasi, tab) | Perbaiki baris yang disebutkan oleh pesan tersebut. | | `config is larger than 1 MB` | File terlalu besar | Pecah file tersebut dan gunakan `--section`. | | `no API key: set NEXCMP_KEY=ak_... or run as root on the server` | Perintah tidak menemukan kunci | Jalankan dengan `sudo`, atau ekspor `NEXCMP_KEY` dan pertahankan melalui sudo. | | `panel not reachable` | Layanan panel tidak berjalan pada port default | Periksa `sudo nexcmp status`. | | Baris penagihan di bawah `skipped` | Bagian penagihan memerlukan `--confirm-billing` | Tambahkan tanda (flag) tersebut dan tinjau baris `$` terlebih dahulu. | | Item di bawah `pending` | Perubahan memerlukan konfirmasi | Buka **API & AI agents**, atau hasil Import/Export, lalu tekan **Confirm** pada kartu tersebut. | | Rahasia tidak diperbarui | Tidak ada nilai `NEXCMP_SECRET_` yang ditetapkan, sehingga rahasia yang disimpan tetap dipertahankan | Ekspor variabel tersebut dan terapkan kembali. | | Entri di bawah `errors` dengan HTTP 403 `insufficient_scope` | Kunci tidak memiliki cakupan (scope) untuk bagian tersebut | Gunakan kunci yang memiliki cakupan tersebut, atau jalankan sebagai root. | | Entri di bawah `errors` dengan HTTP 403 `demo_read_only` | Panel demo | Terapkan pada instalasi nyata. | --- # Contoh perintah {#example-prompts} > **Di mana letaknya di admin:** AI Chat (`/agent`) atau tombol mengambang **Ask AI** di halaman admin mana pun. Perintah yang sama berfungsi di klien AI apa pun yang terhubung melalui [MCP](https://nexcmp.com/id/docs/configure-with-ai/mcp-admin/). ## Fungsi {#what-it-does} Perintah-perintah ini menunjukkan cara bertanya. Masing-masing mencantumkan tindakan asisten di balik layar, cakupan yang diperlukan (untuk klien eksternal atau kunci), dan tempat Anda diminta memberikan persetujuan. Ganti nilai contoh dengan milik Anda sendiri. ::: tip Jangan pernah mengetikkan informasi rahasia ke dalam teks obrolan Untuk kata sandi, kunci API, dan token, gunakan bidang **Secret** di sebelah input AI Chat ([detail](https://nexcmp.com/id/docs/configure-with-ai/ai-chat-in-admin/#secrets)). AI hanya melihat placeholder yang mewakili rahasia tersebut, bukan nilainya. Dengan klien AI eksternal, rahasia tersebut melewati klien tersebut, jadi lebih baik memasukkannya di admin. ::: ## Periksa posisi Anda {#check-where-you-are} ```text Check my setup progress and tell me the next three things to do, in order. ``` Asisten memanggil `setup_checklist` dan `system_health` (cakupan `admin:read`) serta menjawab dari status nyata. Lihat [Setup progress checklist](https://nexcmp.com/id/docs/configure-with-ai/setup-checklist/). ## Penyiapan awal {#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. ``` Ini sama dengan perintah MCP `initial-setup`. Ini memerlukan `admin:read` ditambah cakupan dari langkah-langkah yang Anda terima. Harapkan kartu konfirmasi untuk setiap perubahan di AI Chat. ## Menambahkan kluster 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. ``` Yang terjadi: 1. Asisten menanyakan id token API (`user@realm!tokenid`) dan sekretnya. Masukkan sekret ke dalam bidang **Secret**. Buat token terbatas terlebih dahulu: [Proxmox VE](https://nexcmp.com/id/docs/infrastructure/proxmox/). 2. Ini memanggil `proxmox_add`, `proxmox_test`, `zone_create`, dan `proxmox_attach_zone`. 3. Ini mengusulkan paket dengan `plans_from_offerings` dan menunggu persetujuan Anda (lihat contoh berikutnya). Cakupan: `infra:write`, `secrets:write`, `catalog:write`, `admin:read`. ## Membuat tabel paket dengan margin 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. ``` Asisten memanggil `plans_from_offerings` dengan `margin_pct` 40 dan biaya Anda. Margin adalah bagian dari harga jual yang merupakan keuntungan: pada 40%, paket yang membebani Anda $60 dijual seharga $100. Panggilan pertama hanya mengembalikan pratinjau. Saat Anda menyetujuinya, asisten akan memanggil alat tersebut lagi dengan `apply=true`, yang membuat paket dalam satu langkah dan meminta satu konfirmasi karena melibatkan harga. Untuk Proxmox, ini menggunakan `backend_id` dan daftar ukuran default (1, 2, 2, dan 4 vCPU). Cakupan: `catalog:write`, `admin:read`. Lihat [Plans](https://nexcmp.com/id/docs/catalog/plans/). ![Jawaban AI Chat yang menampilkan tabel pratinjau paket dengan biaya, harga bulanan, dan harga per jam](https://nexcmp.com/id/docs/images/configure-with-ai/example-prompts-01-plan-preview.webp) ## Mengonfigurasi email dan mengirim pesan uji {#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. ``` Asisten memanggil `smtp_get`, `smtp_configure`, dan `smtp_test` serta memberi tahu Anda apakah pesan tersebut diterima. Cakupan: `settings:write`, `secrets:write`. Lihat [SMTP and e-mail templates](https://nexcmp.com/id/docs/administration/smtp-and-emails/). ## Menyiapkan 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` selalu merupakan tindakan dua langkah: Anda melihat pratinjau dengan nilai rahasia yang disamarkan dan menyetujuinya. Kemudian `payment_test` memeriksa kredensial dengan Stripe. Cakupan: `billing:write`, `secrets:write`. Beralihlah ke mode live hanya setelah pembayaran uji. Lihat [Stripe](https://nexcmp.com/id/docs/billing/stripe/). ## Mengaktifkan peringatan 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. ``` Asisten memanggil `telegram_configure` dan `telegram_test`. Cakupan: `settings:write`, `secrets:write`. Lihat [Telegram notifications](https://nexcmp.com/id/docs/administration/telegram-notifications/). ## Mencari pelanggan dan menambahkan kredit {#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. ``` Asisten memanggil `customers_search` dan `customer_get` (hanya baca), lalu `customer_adjust_balance` dengan `delta_cents` 1000 dan alasan. Ini **selalu** memerlukan persetujuan Anda: kartu konfirmasi bertuliskan "changes a customer balance" dan menampilkan jumlah serta alasan yang akan masuk ke log audit. Cakupan: `admin:read`, `billing:write`. ## Mengekspor konfigurasi saya {#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. ``` Asisten memanggil `config_export`. Rahasia diganti dengan referensi `secret://`. Simpan hasil sebagai `nexcmp.yaml` dan simpan dalam kontrol versi. Lihat [Configuration as code](https://nexcmp.com/id/docs/configure-with-ai/config-as-code/). Cakupan: `admin:read`. ## Menulis perintah yang baik {#write-good-prompts} - Berikan tujuan dan fakta: nama, harga, alamat email. Jangan tempelkan data rahasia. - Minta pratinjau terlebih dahulu untuk apa pun yang memerlukan biaya atau menghapus data. - Minta asisten untuk "membaca nilai saat ini sebelum mengubahnya". Petunjuk bawaan sudah menyatakan hal ini. - Jika jawaban tampak salah, tanyakan "alat mana yang Anda panggil dan dengan argumen apa?". Kartu alat di AI Chat menampilkan keduanya. ## Pemecahan Masalah {#troubleshooting} | Gejala | Penyebab | Solusi | |---|---|---| | Asisten mengatakan tidak memiliki alat untuk sesuatu | Cakupan untuk alat tersebut tidak diberikan, atau tindakan ditutup untuk AI | Periksa [Admin API keys](https://nexcmp.com/id/docs/configure-with-ai/admin-api-keys/#what-a-key-can-never-do), atau lakukan di admin. | | Ia meminta Anda menempelkan kata sandi | Model mengabaikan instruksi | Tolak; gunakan bidang Secret atau masukkan nilai di admin. | | Tidak ada yang berubah setelah "lakukan" | Perubahan sedang menunggu konfirmasi Anda | Gulir ke kartu konfirmasi dan tekan **Confirm**. | | Paket dibuat dengan harga yang tidak Anda duga | Biaya atau margin dalam prompt salah | Edit paket di halaman Paket atau minta asisten untuk menetapkan ulang harga; perubahan harga memerlukan konfirmasi. | --- # Daftar periksa progres penyiapan {#setup-progress-checklist} > **Di mana letaknya di admin:** Overview › Dashboard (`/`), kartu **Setup progress** di bagian atas. Daftar kosong pada Plans, Customers, Zones, Payments, dan Infrastructure menampilkan bantuan yang sama. ## Fungsi {#what-it-does} Instalasi baru memerlukan sepuluh hal sebelum pelanggan pertama dapat memesan dan membayar. Kartu **Setup progress** memeriksa hal tersebut untuk Anda dari konfigurasi nyata, menunjukkan berapa banyak yang sudah selesai, menyebutkan **langkah berikutnya**, dan menautkan ke halaman tempat Anda melakukannya. Jika Anda memiliki sumber AI yang terhubung, **Do it for me** membuka [AI assistant](https://nexcmp.com/id/docs/configure-with-ai/ai-chat-in-admin/) dengan pertanyaan siap pakai untuk langkah tersebut. Asisten (dan klien AI apa pun melalui [MCP](https://nexcmp.com/id/docs/configure-with-ai/mcp-admin/)) dapat membaca daftar yang sama dengan alat `setup_checklist`. ## Sepuluh langkah {#the-ten-steps} | # | Langkah | Dihitung sebagai selesai bila | Tempat Anda melakukannya | |---|---|---|---| | 1 | Lisensi aktif | Lisensi diaktifkan untuk domain Anda | System › Admin › License & updates (`/license`). Lihat [License and purchase](https://nexcmp.com/id/docs/getting-started/license-and-purchase/). | | 2 | Hubungkan sumber infrastruktur | CloudStack terhubung, atau setidaknya satu kluster Proxmox VE ditambahkan | Infrastructure › Cloud provider › Providers (`/infra/providers`). Lihat [CloudStack](https://nexcmp.com/id/docs/infrastructure/cloudstack/) dan [Proxmox VE](https://nexcmp.com/id/docs/infrastructure/proxmox/). | | 3 | Membuat zona | Setidaknya satu zona ada | Infrastructure › Datacenter › Zone (`/infra/zones`). Lihat [Zones](https://nexcmp.com/id/docs/infrastructure/zones/). | | 4 | Template OS | Setidaknya satu template diaktifkan | Services › Virtual Machines › Plans & pricing, tab Templates (`/vm/catalog?tab=templates`). Lihat [OS templates](https://nexcmp.com/id/docs/infrastructure/templates/). | | 5 | Buat paket | Setidaknya satu paket diaktifkan | Services › Virtual Machines › Plans & pricing (`/vm/catalog`). Lihat [Plans and pricing](https://nexcmp.com/id/docs/catalog/plans/). | | 6 | Siapkan pembayaran | Stripe, PayPal, kripto, atau transfer bank dikonfigurasi | Finance › Payment channels (`/payments`). Lihat [Payment channels](https://nexcmp.com/id/docs/billing/payment-channels/). | | 7 | Email (SMTP) | Email keluar telah dikonfigurasi | System › Settings › Email (`/settings/email`). Lihat [SMTP and e-mail templates](https://nexcmp.com/id/docs/administration/smtp-and-emails/). | | 8 | Branding | Logo telah diunggah, atau nama merek diubah dari bawaan | System › Settings › Brand (`/settings/branding`). Lihat [Branding](https://nexcmp.com/id/docs/customers/branding/). | | 9 | Ketentuan & privasi | Setidaknya satu teks hukum telah diisi | System › Settings › Legal (`/settings/legal`). Lihat [Legal pages](https://nexcmp.com/id/docs/customers/legal/). | | 10 | Buat pesanan pengujian | Setidaknya ada satu pesanan | Buat pesanan sebagai pelanggan di portal pelanggan untuk memastikan semuanya berfungsi dari ujung ke ujung; kartu ini menautkan ke halaman Billing (`/billing`). | Kartu ini menampilkan `done/total` (misalnya 6/10), bilah progres, langkah berikutnya dengan tombol **Open** dan, saat sumber AI tersambung, **Do it for me**. Klik sebuah langkah untuk melompat ke halamannya. Di sebelah langkah, tautan kecil akan membuka halaman dokumentasi yang sesuai; beberapa langkah juga menampilkan detail seperti "2 zone(s)". ![Kartu progres penyiapan di Overview dengan tiga dari sepuluh langkah selesai serta tombol Open dan Do it for me](https://nexcmp.com/id/docs/images/configure-with-ai/setup-checklist-01-card.webp) ## Gunakan {#use-it} 1. Buka Overview. Kartu ini berada di bagian atas. Gunakan panah untuk menutupnya; panel akan mengingat pilihan Anda di browser Anda. 2. Klik **Open** untuk membuka halaman langkah berikutnya, atau klik **Do it for me**. 3. Dengan **Do it for me**, asisten akan terbuka dengan permintaan seperti "Sarankan tabel paket pemula dari penawaran saya dengan margin 40%, tunjukkan pratinjaunya sebelum membuatnya." Jawab pertanyaannya, lalu tinjau dan **Confirm** setiap kartu. Lihat [AI Chat in the admin](https://nexcmp.com/id/docs/configure-with-ai/ai-chat-in-admin/). 4. Saat kesepuluh langkah selesai, kartu ini akan hilang. ### Daftar kosong {#empty-lists} Saat Plans, Customers, Zones, Payments, atau Infrastructure kosong, halaman akan menampilkan blok **Next step** beserta penjelasan, tombol untuk tindakan tersebut, **Do it for me**, dan tautan ke dokumentasi sehingga Anda tidak akan pernah menemui tabel kosong. ![Halaman Plans kosong dengan penjelasan langkah berikutnya dan tombol Do it for me](https://nexcmp.com/id/docs/images/configure-with-ai/setup-checklist-02-empty.webp) ## Minta dengan kata-kata Anda sendiri {#ask-for-it-in-your-own-words} Anda tidak memerlukan kartu ini. Di AI Chat atau klien AI apa pun yang terhubung, Anda dapat bertanya: ```text Check my setup progress and take me through the open steps, one at a time. ``` Ini juga merupakan prompt MCP `initial-setup`. Asisten memanggil `setup_checklist`, menjelaskan mengapa setiap langkah yang belum selesai itu penting, meminta informasi yang dibutuhkannya, dan menggunakan alat yang sesuai. Cakupan yang diperlukan: `admin:read` untuk membaca daftar, ditambah cakupan langkah yang ingin Anda selesaikan. Lihat [Example prompts](https://nexcmp.com/id/docs/configure-with-ai/example-prompts/). ## Verifikasi {#verify} 1. Setelah Anda menyelesaikan suatu langkah, jumlah pada kartu akan bertambah saat Overview berikutnya dimuat. 2. Di dalam asisten, `setup_checklist` mengembalikan angka yang sama, dengan `done: true` pada langkah yang sudah selesai. ## Batas & catatan {#limits-notes} - Pemeriksaan melihat apa yang disimpan, bukan apakah itu berfungsi. Gateway yang dikonfigurasi dihitung sebagai selesai meskipun pengujiannya gagal. Gunakan tombol **Test** di setiap halaman, dan alat `system_health` untuk mengatasi masalah. - Kartu ini khusus untuk administrator. - **Do it for me** memerlukan sumber AI yang terhubung di bawah System › Settings › AI accounts; jika tidak ada, hanya **Open** yang ditampilkan. - Kesepuluh langkah ini sama untuk setiap instalasi; langkah yang tidak berencana Anda gunakan (misalnya pembayaran pada cloud privat) akan tetap dihitung sebagai belum selesai. ## Pemecahan Masalah {#troubleshooting} | Gejala | Penyebab | Solusi | |---|---|---| | Kartu tidak ada | Kesepuluh langkah telah selesai, atau kartu tidak dapat dimuat | Muat ulang Overview. Tanyakan `setup_checklist` di AI Chat untuk melihat statusnya. | | Suatu langkah tetap terbuka setelah Anda mengerjakannya | Penyimpanan gagal diselesaikan, atau kondisinya belum terpenuhi (misalnya templat ada tetapi dinonaktifkan) | Buka halaman langkah tersebut dan periksa tabel di atas. | | Branding tetap terbuka setelah mengubah logo | Branding dihitung saat logo ada atau nama merek berbeda dari "NexCMP" default | Unggah logo atau tetapkan nama Anda sendiri. | | **Do it for me** tidak berfungsi | Tidak ada sumber AI yang terhubung, atau panel demo | Sambungkan sumber di akun AI. | --- # SMTP dan templat e-mail {#smtp-and-e-mail-templates} > **Di mana letaknya di admin:** System › Settings › Email (`/settings/email`) — tab **SMTP** dan **Email templates**. Log pengiriman: Overview › Support › Sent emails (`/support/emails`). ## Fungsi {#what-it-does} NexCMP mengirim e-mail untuk verifikasi pendaftaran, pengaturan ulang kata sandi, "VM ready" (dengan kata sandi awal), faktur, saldo rendah, pembaruan, isi ulang, balasan dukungan, dan banyak lagi. Semuanya melalui **satu akun SMTP yang Anda sediakan**. Pesan dan templat tersedia dalam 16 bahasa; bahasa pelanggan yang akan digunakan. ## Persyaratan {#requirements} | Item | Persyaratan | |---|---| | Server SMTP | Host, port, dan kredensial dari penyedia mana pun (server Anda sendiri, Brevo, Amazon SES, Mailgun, Google Workspace ...) | | Jaringan | TCP keluar dari server NexCMP ke host dan port SMTP (587 STARTTLS, 465 TLS, atau 25) | | Domain pengirim | Domain yang Anda kendalikan, dengan **SPF dan DKIM** yang dipublikasikan untuk penyedia serta catatan DMARC | | Izin | Akun SMTP harus diizinkan untuk mengirim sebagai alamat **From** | ::: warning Keteririman E-mail seperti "VM ready" berisi kata sandi. Jika SPF/DKIM/DMARC domain pengirim tidak cocok dengan penyedia SMTP, e-mail akan masuk ke spam. Halaman ini mengingatkan Anda akan hal tersebut. ::: ## Siapkan penyedia e-mail {#prepare-the-e-mail-provider} 1. Di panel penyedia Anda, tambahkan dan verifikasi domain pengiriman Anda (misalnya `example.com`). 2. Publikasikan catatan DNS SPF, DKIM, dan DMARC yang ditampilkan oleh penyedia. 3. Buat pengguna SMTP (atau kunci API-SMTP) dan catat host, port, nama pengguna, serta kata sandi. ## Hubungkan di NexCMP {#connect-in-nexcmp} 1. Buka **System › Settings › Email**, tab **SMTP**. 2. Isi formulir: | Kolom | Contoh | Catatan | |---|---|---| | Host | `smtp.example.net` | Server SMTP | | Port | `587` | | | Keamanan | STARTTLS (587) | Pilih mode yang diwajibkan oleh penyedia Anda | | Nama pengguna | `smtp-user` | | | Kata sandi | (tersembunyi) | Hanya-tulis: halaman hanya menampilkan apakah sudah diatur | | Email dari | `no-reply@example.com` | Harus diotorisasi di penyedia | | Nama pengirim | `Example Cloud` | Default ke nama merek Anda | | Balas-Ke (opsional) | `support@example.com` | Tempat balasan pelanggan dikirim | ![Tab SMTP dari Pengaturan, Email dengan host, port, keamanan, nama pengguna, bidang pengirim, dan tombol Kirim uji](https://nexcmp.com/id/docs/images/administration/smtp-and-emails-01-smtp.webp) 3. Klik **Save**, lalu **Send test** dan masukkan alamat Anda sendiri. Pengaturan disimpan dalam file dengan akses terbatas (`smtp.json`, mode 0600) dan hanya pekerja latar belakang `nexcmp-vmd` yang mengirimkan email; layanan web hanya mengantrekannya. ## Verifikasi {#verify} - Pesan uji tiba di kotak masuk (cek juga folder spam). Di sumber pesan, konfirmasikan `dkim=pass` dan `spf=pass`. - Buka **Support › Sent emails**: setiap pesan memiliki status (dalam antrean, terkirim, gagal) dan hasil pengiriman. Pesan yang gagal akan dicoba ulang hingga 3 kali. - Daftarkan pelanggan uji coba di portal dan konfirmasikan email verifikasi tiba. ## Edit templat email {#edit-e-mail-templates} Tab **Email templates** mencantumkan setiap templat berdasarkan kunci, beserta bahasa yang tersedia (misalnya `verify_email`, `reset_password`, `vm_ready`, `invoice_paid`, `low_balance`, `topup_received`, `ticket_reply`, `scale_up` …). 1. Klik templat dan pilih bahasa. 2. Edit subjek dan isi. Placeholder akan diisi saat pesan dimasukkan ke antrean. 3. Simpan. Perubahan berlaku **segera** pada pesan yang masuk antrean setelahnya. ![Tab Email templates yang mencantumkan kunci templat beserta bahasanya](https://nexcmp.com/id/docs/images/administration/smtp-and-emails-02-templates.webp) ## Batasan dan catatan {#limits-and-notes} - Satu akun SMTP per instalasi. Pelanggan reseller menerima email melalui akun yang sama kecuali reseller dikonfigurasi secara berbeda. - Batasan pengiriman penyedia berlaku; NexCMP tidak melakukan pelambatan selain mencoba ulang. - Tanpa SMTP panel tetap berfungsi, tetapi verifikasi pendaftaran dan pengaturan ulang kata sandi tidak dapat diselesaikan oleh pelanggan. ## Pemecahan Masalah {#troubleshooting} | Gejala | Penyebab | Solusi | |---|---|---| | Email uji tidak pernah tiba | Kredensial salah, port diblokir, pengirim tidak berwenang | Periksa `journalctl -u nexcmp-vmd` untuk kesalahan SMTP; coba port 587 dengan STARTTLS; verifikasi alamat From di penyedia. | | Pesan masuk ke spam | SPF/DKIM/DMARC hilang atau tidak selaras | Publikasikan catatan penyedia dan kirim dari domain tersebut. | | "failed" di Sent emails | Penyedia menolak pesan | Buka baris untuk respons penyedia. | | Kolom kata sandi tampak kosong setelah disimpan | Sesuai desain (hanya-tulis) | Label menampilkan "current: set" setelah kata sandi disimpan. | --- # Telegram dan pemberitahuan admin {#telegram-and-admin-alerts} > **Di panel admin:** System › Settings › Admin alerts (`/settings/alerts`). Pintasan dukungan: Customers › Support › Tickets (`/support/tickets`), tab **Settings**. ## Fungsi {#what-it-does} NexCMP memberitahu **Anda** — operator — saat ada yang memerlukan perhatian, dan saat pelanggan mendaftar atau deposit dikreditkan. Pemberitahuan dikirim ke satu atau beberapa **saluran**: Telegram, webhook, atau e-mail. Peristiwa yang dikirim ke saluran admin meliputi: kegagalan penerapan, VM hilang, jaringan mati, IP bebas di bawah 30, item kedaluwarsa (peringatan 1 jam), sengketa Stripe, pekerja mati, RAM kluster di atas ambang batas, pendaftaran pelanggan baru, dan deposit yang dikreditkan. Peristiwa pelanggan diantrekan secara tahan lama dan dicoba ulang dengan penundaan yang meningkat (30 detik hingga 1 jam) sampai Telegram menerimanya. ## Persyaratan {#requirements} | Item | Persyaratan | |---|---| | Telegram | Bot yang dibuat dengan **@BotFather** (token) dan **chat ID** grup atau pengguna yang harus menerima pesan | | Jaringan | HTTPS keluar ke `api.telegram.org` | | Webhook (alternatif) | Titik akhir HTTPS yang menerima payload pemberitahuan | ## Siapkan Telegram {#prepare-telegram} 1. Di Telegram, buka **@BotFather**, kirim `/newbot`, pilih nama; salin **bot token** (`123456789:AA...`). 2. Buat sebuah grup, tambahkan bot ke dalamnya, lalu kirim pesan apa saja. 3. Cari **chat ID**: buka `https://api.telegram.org/bot/getUpdates` di peramban dan baca `chat.id` (ID grup diawali dengan `-`). ## Hubungkan di NexCMP {#connect-in-nexcmp} 1. Buka **System › Settings › Admin alerts**. 2. Di **Add channel** pilih **Type: Telegram**, atur **Destination** ke chat ID dan **Secret (bot token)** ke token tersebut. Klik **Add**. 3. Pastikan tombol toggle **Send admin Telegram (VM module)** aktif; baris *VM module status (read-only)* menampilkan "on". ![Halaman Admin alerts dengan formulir Add channel yang diatur ke Telegram](https://nexcmp.com/id/docs/images/administration/telegram-notifications-01-channel.webp) ## Verifikasi {#verify} Saluran akan muncul di bawah **Configured channels**. Picu suatu peristiwa (misalnya mendaftarkan pelanggan uji coba) dan pesan akan masuk ke dalam grup. Jika tidak ada saluran yang dikonfigurasi, halaman akan memperingatkan "Without a channel, attacks will go unnoticed" dan di dalam log, peristiwa Telegram hanya akan dicatat secara lokal. ## Pintasan dukungan untuk pelanggan {#support-shortcuts-for-customers} Widget dukungan pelanggan dapat menampilkan tombol **Telegram** dan **Zalo**. Tombol-tombol ini disembunyikan sampai dikonfigurasi pada pengaturan dukungan: masukkan tautan `https://t.me/...` untuk Telegram serta tautan atau QR Zalo. Hanya tautan `https://` yang diterima. Obrolan dukungan juga dapat memberi tahu grup Telegram Anda dengan pertanyaan serta draf jawabannya — lihat [AI Chat](https://nexcmp.com/id/docs/ai/ai-chat/). ## Batasan dan catatan {#limits-and-notes} - Bot token disimpan bersama saluran dan tidak akan pernah ditampilkan lagi. - Peristiwa Telegram menggunakan saluran Telegram aktif pertama yang memiliki tujuan dan token. ## Pemecahan Masalah {#troubleshooting} | Gejala | Penyebab | Solusi | |---|---|---| | Tidak ada pesan yang masuk | Chat ID salah, bot tidak berada di dalam grup, atau bot belum pernah dikirimi pesan | Periksa ulang ID dengan `getUpdates`; kirim pesan ke bot atau grup terlebih dahulu. | | Berfungsi untuk sementara lalu berhenti | Token dicabut di BotFather | Buat token baru dan perbarui saluran tersebut. | | `Telegram: no channel` di dalam log | Tidak ada saluran Telegram yang aktif | Tambahkan salah satu seperti di atas. | --- # Log audit dan aktivitas {#audit-log-and-activity} > **Letak di admin:** System › Logs › Activity (`/logs`), Admin actions (`/logs/admin`), Console (`/logs/console`), Login (`/logs/logins`), VM events (`/logs/vm-events`); Overview › Support › Sent emails. NexCMP mencatat setiap tindakan penting. Gunakan halaman **Activity** sebagai linimasa tunggal, dan tab lainnya untuk mempersempit pencarian. ## Tab {#tabs} | Tab | Konten | |---|---| | **Activity** | Linimasa terpadu di semua sumber: tindakan admin, peristiwa VM, login, afiliasi, dan galat sistem | | **Admin actions** | Perubahan yang dilakukan oleh administrator (misalnya `customer.block`, `customer.delete`), beserta alamat IP administrator tersebut | | **Console** | Sign-in konsol admin dan permintaan sistem seperti permintaan pembaruan | | **Login** | Masuk pelanggan dan kegagalannya | | **VM events** | Langkah penerapan, pembuatan, kata sandi, penghancuran, dan peristiwa siklus hidup lainnya per mesin virtual | ## Membaca baris {#reading-a-row} Kolom: **Time**, **Source**, **Level**, **Actor** (siapa), **Target**, **Services**, **Action** (kode peristiwa seperti `customer.delete`) dan **Details**. Klik **Open** untuk catatan lengkap. ![Halaman Aktivitas dengan filter sumber, situs, dan layanan di atas linimasa](https://nexcmp.com/id/docs/images/administration/audit-log-01-activity.webp) ## Filter dan pencarian {#filter-and-search} 1. Pilih **source**, **site**, dan **service** dari menu drop-down. 2. Atur rentang **From date** / **To date**. 3. Ketik kode aktivitas (misalnya `customer.block` atau `destroy`) di kotak pencarian — pencarian aktivitas mencocokkan kode peristiwa. ## Retensi dan ekspor {#retention-and-exports} Catatan tersimpan di database NexCMP pada `/var/lib/nexcmp` dan disertakan dalam [backups](https://nexcmp.com/id/docs/getting-started/backup-and-restore/). Retensi bergantung pada jenis log: upaya masuk pelanggan yang lebih lama dari 180 hari dan log permintaan API-key pelanggan yang lebih lama dari 60 hari akan dibersihkan. Audit API-key admin menyimpan hingga sekitar 200,000 catatan terbaru. Batasan ini tidak berarti retensi yang sama berlaku untuk timeline aktivitas terpadu. ## Penggunaan umum {#common-uses} | Pertanyaan | Tempat memeriksa | |---|---| | Siapa yang menangguhkan pelanggan ini? | Admin actions, cari `customer.block` | | Mengapa sebuah VM menghilang? | VM events, filter berdasarkan ID VM; serta Activity | | Apakah pelanggan menerima email tersebut? | Overview › Support › Sent emails | | Kapan pembaruan terakhir diminta? | Tab Console | --- # Keamanan {#security} > **Lokasi di admin:** System › Admin › Console security (`/account`), Admin users (`/users`); System › Settings › Customer logins (`/settings/login`). ## Konsol admin {#admin-console} ### Otentikasi dua faktor (TOTP) {#two-factor-authentication-totp} Konsol dapat diakses dari Internet, jadi aktifkan TOTP. 1. Buka **System › Admin › Console security**. 2. Di bawah **Two-factor authentication (TOTP)** klik **Start setup**. 3. Pindai kode QR dengan Google Authenticator, Authy, 1Password, atau Bitwarden, lalu masukkan kode 6 digit. ### Rentang IP konsol yang diizinkan {#allowed-console-ip-ranges} Di bawah **Allowed console IP ranges** masukkan satu IP atau CIDR (IPv4 atau IPv6) per baris. **Kosong berarti di mana saja.** Di luar rentang tersebut, proses masuk dan API admin akan diblokir. ::: warning Jangan sampai terkunci sendiri Halaman ini menampilkan IP Anda saat ini dan mengharuskan daftar baru menyertakannya. Gunakan **+ Add my IP**. Jika Anda tetap terkunci, gunakan [emergency access](https://nexcmp.com/id/docs/getting-started/cli-reference/#emergency-access) dari server. ::: ### Ubah kata sandi {#change-password} Isi **Current password**, **New password**, dan **Confirm new password**. Gunakan kata sandi yang panjang dan unik (12 karakter atau lebih; wisaya penyiapan mewajibkan 12 karakter untuk administrator pertama). ### Akun administrator dan peran {#administrator-accounts-and-roles} Buka **System › Admin › Admin users** dan gunakan **+ Create account**. | Role | Akses | |---|---| | `admin` | Akses penuh ke API admin | | `staff` | Hanya-baca di seluruh sistem | | `user` | Tampilan hanya-baca untuk sumber daya satu pelanggan | Akun root adalah akun yang dibuat dalam [setup wizard](https://nexcmp.com/id/docs/getting-started/setup-wizard/). Aksi baris: **Edit**, **Reset PW**, **Key**, **Delete**. Kata sandi disimpan sebagai salted hash; mengubah atau mengunci akun akan langsung mengakhiri sesinya. ## Login pelanggan {#customer-sign-in} Buka **System › Settings › Customer logins**. | Pengaturan | Fungsi | |---|---| | **Google sign-in** | Aktifkan, lalu masukkan ID klien OAuth dan secret. Salin **Callback URL** yang ditampilkan di halaman ke *Google Cloud Console › APIs & Services › Credentials › OAuth client ID › Authorized redirect URIs*. Gunakan **Test configuration**. | | **GitHub login** | Sama, dengan *GitHub › Settings › Developer settings › OAuth Apps › Authorization callback URL* | | **Passkey** | Login sidik jari, PIN, atau kunci perangkat; aktif secara default. Passkey terikat pada domain; setiap domain reseller berfungsi sendiri-sendiri. Masukkan domain lama di *Legacy passkey Domain* setelah rebrand agar pelanggan mendapat petunjuk yang membantu | | **Autentikasi ulang saat menambahkan metode login** | Minta kata sandi lagi sebelum menambahkan passkey atau menautkan Google/GitHub (nonaktif secara default) | | **Captcha** | Cloudflare Turnstile atau Google reCAPTCHA saat pendaftaran: aktifkan, pilih penyedia, masukkan site key dan secret key | | **Block e-mail domains** | Satu domain per baris (maks 2000). Alamat yang cocok akan ditolak saat pendaftaran dengan `email_domain_blocked` | ![Halaman login pelanggan yang menampilkan login Google beserta callback URL-nya](https://nexcmp.com/id/docs/images/administration/security-01-customer-logins.webp) ### Kebijakan bawaan {#built-in-policies} | Kebijakan | Nilai | |---|---| | Kata sandi pelanggan | Minimal 10 karakter, huruf dan angka | | Sesi pelanggan | 30 hari; sesi "login as customer" berlangsung selama 1 jam | | Verifikasi email | Diperlukan sebelum membuat VM saat *require e-mail verified* aktif di pengaturan penjualan | | Anti-carding | Akun dengan saldo di bawah top-up minimum hanya dapat membuat jumlah VM yang terbatas | ## Pengerasan server {#server-hardening} - Port 3000 ditutup setelah penyiapan dan TLS; lihat [Installation](https://nexcmp.com/id/docs/getting-started/installation/#the-panel-port-3000). - Layanan berjalan sebagai pengguna `nexcmp` non-istimewa dengan sandbox systemd yang dibatasi. - Kunci API, kredensial pembayaran, dan kata sandi SMTP disimpan secara terenkripsi; kunci master berada di `/var/lib/nexcmp/secrets` — lindungi [backups](https://nexcmp.com/id/docs/getting-started/backup-and-restore/). - Rilis diverifikasi dengan SHA-256 dan tanda tangan Ed25519 sebelum instalasi. --- # Pengaturan umum {#general-settings} > **Where in the admin:** System › Settings › General (`/settings`). Perubahan langsung diterapkan (cache 30 detik). Halaman ini memiliki tiga bagian. ## Merek & URL {#branding-urls} | Kolom | Tujuan | |---|---| | Nama merek (email, faktur) | Ditampilkan dalam email dan faktur. Logo dan warna berada di [Branding](https://nexcmp.com/id/docs/customers/branding/) | | Bahasa default | Bahasa untuk pengunjung baru | | URL aplikasi pelanggan | Alamat publik portal, misalnya `https://cloud.example.com` | | URL konsol | Alamat layanan konsol VM | | URL admin | Tautan yang digunakan saat Anda "log in as" pelanggan reseller | | URL konsol partner | Digunakan dalam tautan undangan, email reseller, dan pengalihan setelah top-up | Wizard mengisi kolom-kolom ini secara otomatis dari domain Anda; ubah hanya jika Anda memindahkan portal. ## Penjual & penagihan {#seller-invoicing} Dicetak pada setiap faktur: | Kolom | Contoh | |---|---| | Nama entitas hukum | Example Cloud Ltd | | ID Pajak | `TAX-000000` | | Alamat | 1 Example Street, New York | | Email kontak | `billing@example.com` | | Prefiks nomor faktur | `INV` (1–8 karakter, A–Z dan 0–9) | Faktur yang sudah ada mempertahankan detail penjual dan nomor saat diterbitkan; perubahan hanya memengaruhi faktur **baru**. ## Pemeliharaan & wilayah {#maintenance-region} Aktifkan **Customer app MAINTENANCE** untuk menampilkan banner dan **memblokir semua tindakan tulis pelanggan** sementara konsol admin tetap berfungsi. Masukkan **Maintenance message** yang akan dilihat pelanggan. Gunakan ini selama peningkatan infrastruktur Anda. ![Halaman pengaturan Umum dengan bidang nama merek, bahasa default, dan URL](https://nexcmp.com/id/docs/images/administration/general-settings-01-general.webp) ## Halaman pengaturan lainnya {#other-settings-pages} | Halaman | Panduan | |---|---| | Brand | [Branding](https://nexcmp.com/id/docs/customers/branding/) | | Legal | [Legal](https://nexcmp.com/id/docs/customers/legal/) | | Customer logins | [Security](https://nexcmp.com/id/docs/administration/security/) | | Email | [SMTP dan templat email](https://nexcmp.com/id/docs/administration/smtp-and-emails/) | | Admin alerts | [Telegram dan peringatan admin](https://nexcmp.com/id/docs/administration/telegram-notifications/) | | AI provider | [AI providers](https://nexcmp.com/id/docs/ai/ai-providers/) | --- # Laporkan bug {#report-a-bug} > **Lokasi di admin:** Top bar › **Report a bug** (di sebelah Docs; hanya ditampilkan untuk administrator utama). Menemukan kendala pada NexCMP? Klik **Report a bug**, jelaskan masalahnya, lalu kirimkan. Laporan langsung diterima oleh tim NexCMP sebagai tiket pada akun lisensi Anda dalam satu langkah — tanpa perlu masuk ke tempat lain atau menyalin berkas log secara manual. Semua paket dapat menggunakannya: NexCMP Free mencakup perbaikan bug, begitu juga NexCMP Source. ::: info Laporan bug bukan permintaan dukungan teknis NexCMP Free tidak mencakup dukungan teknis, jadi gunakan formulir ini hanya untuk kendala pada perangkat lunak. Bantuan penyiapan dan migrasi merupakan bagian dari [NexCMP Source](https://nexcmp.com/pricing). ::: ## Persyaratan {#requirements} | Item | Persyaratan | |---|---| | Versi | NexCMP 1.5.2 atau lebih baru | | Pihak yang dapat mengirim | Akun administrator utama. Akun staf (read-only), konsol reseller, pelanggan, dan demo read-only tidak dapat mengirim | | License | Lisensi aktif (Free atau Source) yang tidak ditangguhkan | | Jaringan | Server harus dapat menjangkau `https://nexcmp.com` melalui HTTPS (alamat yang sama dengan yang digunakan untuk pemeriksaan lisensi dan pembaruan) | ## Kirim laporan {#send-a-report} 1. Klik **Report a bug** di bilah atas. Di ponsel, buka menu dan pilih **Report a bug**. 2. Masukkan **Subject** singkat. 3. Di bagian **What happened**, jelaskan apa yang Anda lakukan, apa yang Anda lihat, dan apa yang Anda harapkan. 4. Anda juga dapat mencantumkan **Langkah-langkah reproduksi**. 5. Pilih **Impact**: **Blocking** (Anda tidak dapat bekerja), **Major** (fitur utama rusak), atau **Minor** (masalah kecil atau kosmetik). 6. Biarkan **Attach diagnostics** tetap aktif (disarankan) dan baca kotak **What will be sent**. 7. Klik **Send report**. Pada 1.6.1 isi formulir dapat digulirkan sementara tombol tindakan tetap terlihat, termasuk pada ponsel. Nilai kata sandi setelah `password:` atau `password=` disamarkan tanpa menghapus bagian laporan lainnya. Tinjau teks Anda sebelum mengirim serta jangan sertakan data pelanggan dan kredensial. ![Dialog Report a bug dengan judul, deskripsi, tingkat dampak, dan daftar data yang akan dikirim](https://nexcmp.com/id/docs/images/administration/report-a-bug-01-dialog.webp) Setelah laporan diterima, dialog akan menampilkan nomor tiket dan tautan. Balasan dari tim, jika ada, akan dikirim ke alamat email akun lisensi Anda di nexcmp.com, dan tiket tersebut juga tercantum di bagian **Support** saat Anda masuk ke sana sebagai pemilik lisensi. ## Data yang dikirim {#what-is-sent} Kotak **What will be sent** menampilkan informasi berikut secara tepat sebelum Anda mengeklik Send: | Dikirim | Detail | |---|---| | Teks Anda | Judul, deskripsi, langkah-langkah, dan dampak | | Versi, paket, domain | Versi NexCMP Anda, Free atau Source, serta domain instalasi | | Halaman saat ini | Halaman yang sedang Anda buka di admin, tanpa bagian apa pun setelah `?` atau `#` | | Peramban | Teks user-agent browser Anda (nama, versi, dan sistem operasi), dipotong hingga 200 karakter | | Error terbaru | Hingga 5 error terakhir di tab browser ini. Untuk script error hanya berupa pesan; untuk permintaan yang gagal hanya metode, path, dan kode status | Anda dapat menonaktifkan **Attach diagnostics**; sehingga hanya teks Anda serta versi, paket, dan domain yang akan dikirim. ## Data yang tidak pernah dikirim {#what-is-never-sent} - Kata sandi, token, cookie, dan API key. Apa pun yang menyerupai data tersebut di dalam teks Anda atau di pesan error akan disamarkan (ditampilkan sebagai `***` atau `[redacted]`) di server Anda sebelum dikirim. - Konten permintaan dan respons — permintaan yang gagal hanya dicatat sebagai metode, path, dan status. - Data pelanggan Anda (nama, email, pesanan, faktur) serta alamat IP mereka. - Alamat IP browser Anda dan file apa pun dari server Anda. Seperti halnya setiap pemeriksaan lisensi, server lisensi melihat alamat IP yang digunakan server Anda untuk terhubung. Tiket ditautkan ke instalasi Anda melalui token lisensi yang sudah dimiliki server, sehingga versi, domain, dan instalasi ditentukan oleh server serta tidak dapat diubah dari browser. ## Batas {#limits} | Batas | Nilai | |---|---| | Subjek | 150 karakter | | Deskripsi beserta langkah-langkah | Total 8 KB | | Reports | 5 per jam dan 20 per hari untuk seluruh instalasi | Mengirim laporan yang sama dua kali (misalnya setelah terjadi gangguan jaringan) tidak akan membuat tiket kedua. ## Pemecahan Masalah {#troubleshooting} | Pesan | Penyebab | Solusi | |---|---|---| | Aktifkan lisensi Anda terlebih dahulu | Instalasi tidak memiliki lisensi yang aktif | Buka **License & updates** dan aktifkan, lalu kirim kembali | | Tidak dapat menjangkau server lisensi | Server tidak dapat menjangkau `nexcmp.com` | Periksa HTTPS outbound dan DNS dari server, lalu tekan **Send report** lagi — teks Anda tetap tersimpan | | Terlalu banyak laporan bug dari instalasi ini | Anda telah mencapai 5 per jam atau 20 per hari | Tunggu dan coba lagi; tambahkan temuan baru ke tiket yang sudah terbuka | | Lisensi ini ditangguhkan | Lisensi ditangguhkan atau dananya dikembalikan | Lihat [Lisensi dan pembelian](https://nexcmp.com/id/docs/getting-started/license-and-purchase/) | | Instalasi ini telah dicabut | Instalasi telah dicabut di portal lisensi | Aktifkan kembali dari **License & updates** | | Token lisensi tidak dapat diperbarui | Server tidak dapat memperbarui token lisensinya | Buka **License & updates**, tekan **Refresh**, lalu kirim lagi | | Tidak ada tombol Report a bug | Anda masuk dengan akun staf, reseller, atau pelanggan, atau sedang berada di demo read-only | Masuk sebagai administrator utama | ::: tip Untuk asisten AI dan API key Asisten di panel admin dan API key admin tidak dapat mengirim laporan bug atas nama Anda: tombol ini memerlukan seseorang yang masuk sebagai administrator utama. ::: --- # Galat instalasi {#installation-errors} Penginstal berhenti pada masalah fatal pertama dan mencetak baris merah yang diawali dengan `✗`. Perbaiki penyebabnya dan **jalankan perintah yang sama lagi** — penginstal aman untuk diulang. Baris informatif diawali dengan `•`, langkah yang berhasil dengan `✓`. ## Pemeriksaan mesin {#machine-checks} | Pesan | Penyebab | Solusi | |---|---|---| | `must be run as root (sudo)` | Tidak berjalan sebagai root | Awali perintah dengan `sudo`, atau jalankan sebagai root. | | `only Ubuntu 22.04/24.04 is supported (this host: …)` | Distribusi atau versi lain | Gunakan server Ubuntu 22.04 atau 24.04. | | `only x86_64 is supported` | ARM atau CPU lain | Gunakan server x86_64. | | `requires ≥ 2 GB RAM (host has … MB)` | Memori terlalu sedikit | Tambahkan RAM. | | `requires ≥ 8 GB free disk space on / (… GB available)` | Sistem file root hampir penuh | Kosongkan ruang atau perbesar `/`. | | `missing --license` / `missing --domain` | Instalasi pertama tanpa parameter tersebut | Lewatkan keduanya — lihat [Installation](https://nexcmp.com/id/docs/getting-started/installation/#parameters). | | `unknown argument: …` | Kesalahan ketik pada parameter | Periksa ejaan; jalankan dengan `--help`. | | `apt-get failed (another apt/dpkg process, e.g. unattended-upgrades, may still be running)` | Pengelola paket terkunci | Tunggu beberapa menit (Ubuntu baru menjalankan pembaruan otomatis setelah boot) lalu jalankan ulang. | | `… is a symlink — aborting` | `/opt/nexcmp` atau `/etc/nexcmp` adalah symbolic link | Ganti dengan direktori asli — penginstal menolak symlink demi keamanan. | ## Aktivasi lisensi {#license-activation} | Pesan | Penyebab | Solusi | |---|---|---| | `cannot connect to https://nexcmp.com` | Tidak ada HTTPS keluar ke server lisensi | Periksa DNS, firewall, dan proxy pada server: `curl -I https://nexcmp.com`. | | `license activation failed (HTTP …): ` | Server lisensi menolak kunci tersebut | Baca pesan: kunci salah, domain tidak cocok dengan lisensi, lisensi ditangguhkan atau dicabut. Periksa halaman lisensi di [nexcmp.com/licenses](https://nexcmp.com/licenses). | | `no release available for this license yet` | Lisensi tidak memiliki rilis yang dapat diunduh | Hubungi bagian penjualan; lihat [Support](https://nexcmp.com/id/docs/troubleshooting/support/). | ## Unduhan dan verifikasi {#download-and-verification} | Pesan | Penyebab | Solusi | |---|---|---| | `failed to download release X` | Masalah jaringan selama pengunduhan | Jalankan ulang. | | `sha256 mismatch (… ≠ …)` | File tiba dalam keadaan rusak atau telah diubah | Jalankan ulang; jika terulang kembali, proxy mungkin mengubah unduhan — coba dari jaringan lain. | | `release X is unsigned — refusing to install` | Server tidak memberikan tanda tangan | Jangan pernah melewati; hubungi dukungan. | | `INVALID SIGNATURE for version X — aborting` | Tanda tangan Ed25519 tidak dapat diverifikasi | Jangan **menginstal**. Hubungi dukungan — ini berarti file tersebut bukan rilis resmi. | | `openssl failed to read public key` | OpenSSL sangat lama atau rusak | Perbarui paket `openssl`. | | `invalid version: …` | Data tidak terduga dari server | Jalankan ulang; hubungi dukungan jika masalah berlanjut. | ## Memulai layanan {#service-start} | Pesan | Penyebab | Solusi | |---|---|---| | `service failed to start — check: journalctl -u nexcmp -n 50` | Panel tidak merespons `/healthz` dalam waktu 3 menit | Baca jurnal. Penyebab umum: port (default 3000) sudah digunakan (`ss -ltnp | grep 3000`) — instal ulang dengan `--port`; file dimiliki oleh root di `/var/lib/nexcmp` — jalankan `sudo nexcmp fix-owner`. | ## nginx dan TLS {#nginx-and-tls} | Pesan | Penyebab | Solusi | |---|---|---| | `DNS does not point to (nor to Cloudflare) — skipping nginx/TLS` | Record A/AAAA hilang atau salah | Lihat [DNS and Cloudflare](https://nexcmp.com/id/docs/getting-started/dns-and-cloudflare/), lalu jalankan ulang. | | `certbot could not get a certificate yet — re-run the installer once DNS has settled` | Validasi Let's Encrypt gagal (port 80 diblokir, DNS belum merambat, batasan tingkat/rate limit) | Buka port 80, tunggu DNS, jalankan ulang. Periksa `/var/log/letsencrypt/letsencrypt.log`. | | `certbot could not renew now — keeping the existing certificate` | Kegagalan pembaruan sementara | Tidak berbahaya; jalankan ulang nanti. | | `nginx rejected the HTTPS configuration — kept the previous one (check: nginx -t)` | Situs nginx lain mengalami konflik (`server_name` sama, pengaturan duplikat) | Jalankan `sudo nginx -t` dan perbaiki konflik tersebut, lalu jalankan ulang. | | `apt-get could not install nginx` / `certbot`, atau `E: Failed to fetch … 404 Not Found` | Pengelola paket terkunci, atau indeks paket server sudah kedaluwarsa (umum pada gambar templat yang sudah lama tidak diperbarui) | Jalankan `sudo apt-get update`, tunggu proses apt lainnya selesai, lalu jalankan ulang penginstal. | | `openssl could not create the self-signed certificate` | Masalah OpenSSL | Perbarui `openssl`; jalankan ulang. | ## Setelah instalasi {#after-installation} | Gejala | Penyebab | Solusi | |---|---|---| | Peramban tidak dapat membuka `https://` | DNS atau TLS belum siap | `sudo nexcmp status`; gunakan [emergency access](https://nexcmp.com/id/docs/getting-started/cli-reference/#emergency-access). | | `ERR_TOO_MANY_REDIRECTS` | Mode SSL Cloudflare **Flexible** | Atur **Full (strict)** — [detail](https://nexcmp.com/id/docs/getting-started/dns-and-cloudflare/). | | Wizard mengatakan "setup code" salah | Kesalahan ketik atau kode dari instalasi sebelumnya | Jalankan `sudo nexcmp status` dan salin kode saat ini. | | Lisensi menampilkan HTTP 421 | File dalam `/var/lib/nexcmp` dimiliki oleh root | `sudo nexcmp fix-owner`, lalu `sudo systemctl restart nexcmp`. | --- # Galat pembaruan {#update-errors} > **Di mana letaknya di admin:** System › Admin › License & updates (`/license`) Pembaruan dijelaskan dalam [Updating NexCMP](https://nexcmp.com/id/docs/getting-started/updating/). Saat kartu Update atau `sudo nexcmp update` melaporkan galat: | Pesan | Penyebab | Solusi | |---|---|---| | `update plan expired — renew on the license page to receive this feature release` | Tanggal "updates until" Anda sebelum tanggal rilis. Perbaikan keamanan tetap dikirimkan; rilis fitur tidak | Perbarui di [nexcmp.com/licenses](https://nexcmp.com/licenses) ($99 per tahun untuk NexCMP Free), lalu periksa kembali. Perangkat lunak tetap berjalan sementara itu. | | `sha256 mismatch (downloaded …, expected …)` | Unduhan rusak atau diubah | Coba lagi. Jika terulang, periksa proxy di jalur tersebut. | | `downgrade/same version rejected: X is not newer than Y` | Versi yang dipilih tidak lebih baru daripada versi yang berjalan | Tidak ada yang perlu dilakukan — Anda sudah menggunakan versi terbaru. | | `extraction failed / main binary missing` | Arsip rusak atau diska penuh | Periksa `df -h`; coba lagi. | | `systemctl restart failed` | Layanan tidak dapat dimulai ulang setelah mengganti file biner | `journalctl -u nexcmp -n 80`; file biner sebelumnya disimpan sebagai `/opt/nexcmp/bin/nexcmp.bak` — lihat pembatalan di bawah. | | Galat server saat menghubungi server pembaruan | Tidak ada rute ke `nexcmp.com` atau token lisensi kedaluwarsa | Periksa HTTPS keluar; klik **Check now** pada kartu License. | ## Batalkan {#roll-back} Jika versi baru bermasalah: ```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 ``` Jika migrasi basis data sudah berjalan, pulihkan juga [backup](https://nexcmp.com/id/docs/getting-started/backup-and-restore/) Anda yang dibuat sebelum pembaruan. ## `sudo nexcmp update` menyatakan tidak dapat menemukan penginstal {#sudo-nexcmp-update-says-it-cannot-find-the-installer} `nexcmp update` menjalankan penginstal yang disertakan di dalam rilis terinstal (`/opt/nexcmp/releases//share/install.sh`). Jika file tersebut hilang, jalankan kembali perintah instalasi dari halaman lisensi Anda. --- # FAQ {#faq} ## Perizinan {#licensing} **Apa yang terjadi jika lisensi saya kedaluwarsa atau server kehilangan akses internet?** Token tetap valid selama 14 hari dan diperbarui setiap hari. Setelah itu, pelanggan tidak dapat membuat layanan **baru**; layanan yang sedang berjalan, penagihan, dan login tetap berfungsi. Lihat [License and purchase](https://nexcmp.com/id/docs/getting-started/license-and-purchase/). **Apakah saya tetap mendapatkan perbaikan keamanan setelah hak pembaruan saya berakhir?** Ya — rilis keamanan selalu dikirimkan; rilis fitur memerlukan hak aktif. **Bisakah saya menjalankan NexCMP di server atau domain kedua?** Aktifkan dengan kunci dan domain yang terdaftar pada lisensi — lihat [License and purchase](https://nexcmp.com/id/docs/getting-started/license-and-purchase/#moving-to-a-new-server-or-domain). ## Instalasi {#installation} **Apakah NexCMP memerlukan Docker, PostgreSQL, atau Redis?** Tidak. Ini adalah satu program dengan basis data SQLite, yang dijalankan oleh systemd sebagai pengguna non-istimewa. Lihat [Requirements](https://nexcmp.com/id/docs/getting-started/requirements/). **Bisakah saya menginstal tanpa domain publik?** Ya, gunakan `--no-nginx` dan terowongan SSH — lihat [Installation](https://nexcmp.com/id/docs/getting-started/installation/#installing-without-a-public-domain-lab-or-test). **Mengapa port 3000 ditutup setelah pengaturan?** Demi keamanan, panel mendengarkan pada `127.0.0.1` setelah wizard selesai dan TLS aktif. Gunakan `sudo nexcmp open-port` untuk keadaan darurat. ## Infrastruktur {#infrastructure} **Bisakah saya menggunakan CloudStack dan Proxmox VE secara bersamaan?** Ya. Satu zona dapat memiliki keduanya; setiap paket memilih sumbernya. Lihat [Proxmox VE](https://nexcmp.com/id/docs/infrastructure/proxmox/) dan [Zones](https://nexcmp.com/id/docs/infrastructure/zones/). **Apakah saya memerlukan kunci ROOT API CloudStack?** Tidak — dan Anda sebaiknya tidak menggunakannya. Buat akun khusus — [CloudStack](https://nexcmp.com/id/docs/infrastructure/cloudstack/). **Mengapa beberapa tab atau tombol tidak muncul pada mesin virtual?** Halaman hanya menampilkan fitur yang didukung oleh sumber VM tersebut (misalnya, Proxmox VE tidak memiliki penerusan port). Lihat tabel kapabilitas di [Proxmox VE](https://nexcmp.com/id/docs/infrastructure/proxmox/). ## Operasi {#operations} **Bagaimana cara memindahkan NexCMP ke server lain?** Buat cadangan, instal versi yang sama di server baru dengan lisensi yang sama, pulihkan — lihat [Backup and restore](https://nexcmp.com/id/docs/getting-started/backup-and-restore/). **Di mana letak log?** `journalctl -u nexcmp -u nexcmp-vmd`, `/var/log/nexcmp`, dan konsol admin di bawah System › Logs. Lihat [Audit log](https://nexcmp.com/id/docs/administration/audit-log/). **Dapatkah saya melihat portal pelanggan sebelum menginstal?** Ya. Halaman layanan di [nexcmp.com](https://nexcmp.com/platform/) menampilkan portal pelanggan tab demi tab dengan data sampel; buka *View demo* untuk penampil layar penuh. Untuk melihat instalasi sebenarnya, hubungi sales. --- # Dukungan {#support} ## Kontak {#contact} Tidak ada formulir kontak. Kirimkan email ke **sales@nexcmp.com** — ini mencakup lisensi, pembaruan, domain, dan pertanyaan teknis. Halaman lisensi Anda di [nexcmp.com/licenses](https://nexcmp.com/licenses) juga menautkan ke alamat yang sama. ## Sebelum Anda menulis {#before-you-write} 1. Cari di dokumentasi ini (tekan `/`) dan periksa [Installation errors](https://nexcmp.com/id/docs/troubleshooting/installation-errors/) serta [Update errors](https://nexcmp.com/id/docs/troubleshooting/update-errors/). 2. Kumpulkan fakta-fakta di bawah ini — hal tersebut memungkinkan dukungan merespons dalam satu balasan. ## Apa saja yang harus disertakan {#what-to-include} | Item | Cara mendapatkannya | |---|---| | Versi NexCMP | `sudo nexcmp status` atau System › Admin › License & updates | | Domain utama dan 4 karakter terakhir dari kunci lisensi | License & updates (jangan pernah mengirim kunci lengkap) | | Apa yang Anda lakukan dan apa yang Anda harapkan | Langkah-langkah persisnya | | Teks kesalahan atau tangkapan layar | Sembunyikan informasi rahasia sebelum mengirim | | Status layanan | `sudo nexcmp status` | | Baris log terbaru | `sudo journalctl -u nexcmp -u nexcmp-vmd -n 100 --no-pager` | | Infrastruktur | Versi CloudStack atau Proxmox VE, satu zona atau beberapa zona | ::: warning Jangan pernah mengirim informasi rahasia Jangan kirim kunci lisensi, kunci API, kata sandi, kode penyiapan, kredensial pembayaran, atau arsip cadangan. Sembunyikan informasi tersebut dalam log dan tangkapan layar. ::: ## Laporan keamanan {#security-reports} Jika Anda yakin menemukan kerentanan, kirim email ke alamat yang sama dengan subjek "Security" dan hindari mempublikasikan detailnya secara terbuka hingga masalah tersebut diperbaiki.