# NexCMP 1.6.1 — full documentation > Complete NexCMP documentation in one file. Source: https://nexcmp.com/fr/docs/ · generated 2026-11-02. --- # Qu'est-ce que NexCMP {#what-is-nexcmp} NexCMP est un logiciel que vous installez sur **votre propre serveur** pour transformer une infrastructure cloud en un produit à vendre. Il vous offre : - un **portail client** où les utilisateurs s'inscrivent, créditent leur compte, commandent des machines virtuelles et d'autres services, ouvrent une console, créent des Snapshots et contactent le support ; - une **console d'administration** (`/admin`) pour gérer les clients, les offres, les tarifs, les paiements, l'infrastructure et les paramètres ; - la **facturation** : un portefeuille par client, une tarification horaire ou mensuelle, des factures, des promotions et des quotas de ressources ; - des **revendeurs en marque blanche** : d'autres marques qui revendent vos capacités sous leur propre nom de domaine ; - une **API**, un outil en ligne de commande (`cmp`) et un serveur MCP pour l'automatisation ; - en option, **AI Chat** (assistant de support) et **AI Agent** (gestion d'une VM en langage naturel). ## À quoi il se connecte {#what-it-connects-to} NexCMP n'héberge pas lui-même les machines virtuelles. Il pilote la plateforme qui s'en charge. Une *source* (aussi appelée fournisseur) correspond à l'une des options suivantes : | Source | Usage type | Guide | |---|---|---| | Apache CloudStack | Cloud privé ou public avec zones, réseaux, routeurs virtuels et adresses IP publiques | [CloudStack](https://nexcmp.com/fr/docs/infrastructure/cloudstack/) | | Proxmox VE | Serveurs autonomes ou clusters que vous exploitez déjà | [Proxmox VE](https://nexcmp.com/fr/docs/infrastructure/proxmox/) | D'autres modules nécessitent leur propre infrastructure : [serveurs bare-metal](https://nexcmp.com/fr/docs/infrastructure/dedicated/), [nœuds VPN et proxy](https://nexcmp.com/fr/docs/infrastructure/vpn-proxy-nodes/), [Object Storage S3](https://nexcmp.com/fr/docs/infrastructure/s3/), [Kubernetes et Private Cloud](https://nexcmp.com/fr/docs/infrastructure/kubernetes-and-private-cloud/). Consultez [Prérequis d'infrastructure](https://nexcmp.com/fr/docs/infrastructure/requirements/) pour obtenir un tableau récapitulatif complet. ## Comment il est conçu {#how-it-is-built} NexCMP est un programme unique fonctionnant avec deux services systemd sur un serveur Ubuntu : - `nexcmp` — le serveur web : portail client, console d'administration, API, assistant de configuration ; - `nexcmp-vmd` — le worker en arrière-plan : tâches de provisionnement, synchronisation avec votre CloudStack ou Proxmox, cycles de facturation. Les données se trouvent dans `/var/lib/nexcmp` (bases de données SQLite et fichiers), la configuration dans `/etc/nexcmp` et le programme dans `/opt/nexcmp`. Consultez [Architecture](https://nexcmp.com/fr/docs/infrastructure/architecture/) pour une vue d'ensemble. ## Étapes suivantes {#where-to-go-next} 1. Vérifiez les [prérequis](https://nexcmp.com/fr/docs/getting-started/requirements/). 2. Obtenez une licence — [Licence et achat](https://nexcmp.com/fr/docs/getting-started/license-and-purchase/). 3. [Installez](https://nexcmp.com/fr/docs/getting-started/installation/), puis lancez l'[assistant de configuration](https://nexcmp.com/fr/docs/getting-started/setup-wizard/). 4. Connectez votre plateforme : [CloudStack](https://nexcmp.com/fr/docs/infrastructure/cloudstack/) ou [Proxmox VE](https://nexcmp.com/fr/docs/infrastructure/proxmox/). --- # Prérequis pour le serveur NexCMP {#requirements-for-the-nexcmp-server} Cette page concerne le serveur exécutant NexCMP. Les prérequis pour votre infrastructure CloudStack, Proxmox VE ou autre sont détaillés dans [Prérequis d'infrastructure](https://nexcmp.com/fr/docs/infrastructure/requirements/). ## Serveur {#server} | Élément | Prérequis | Vérifié par l'installateur | |---|---|---| | Système d'exploitation | Ubuntu **22.04** ou **24.04** | Oui — s'arrête avec une erreur pour tout autre système | | Architecture CPU | x86_64 | Oui | | Mémoire | 2 GB minimum (l'installateur refuse en dessous d'environ 1.8 GB) | Oui | | Espace disque libre | 8 GB libres sur `/` minimum | Oui | | Privilèges | root (`sudo`) | Oui | | Paquets | `curl`, `ca-certificates`, `zstd`, `tar`, `openssl`, `python3`, `openssh-client` — installés automatiquement | Installés si manquants | | Avec HTTPS | `nginx` et `certbot` — installés automatiquement sauf si vous passez `--no-nginx` | Installés si manquants | ::: tip Dimensionnement Une petite installation (quelques centaines de clients) fonctionne confortablement sur 2 vCPU / 4 GB RAM. L'utilisation du disque est principalement liée aux bases de données SQLite et aux copies facultatives de mise à jour et de sauvegarde — prévoyez 20 GB ou plus pour la production. ::: ## Réseau {#network} | Sens | Port | Usage | |---|---|---| | Entrant | 80/tcp | Validation Let's Encrypt et redirection vers HTTPS | | Entrant | 443/tcp | Portail client, console d'administration, API | | Entrant | 3000/tcp | Assistant de configuration lors de la première installation et accès d'urgence uniquement — voir [Installation](https://nexcmp.com/fr/docs/getting-started/installation/#the-panel-port-3000) | | Sortant | 443/tcp vers `nexcmp.com` | Activation de licence, vérification quotidienne de licence, mises à jour | | Sortant | vers votre API CloudStack / API Proxmox | Provisionnement et synchronisation | | Sortant | 443/tcp vers les fournisseurs de paiement, d'e-mail et d'IA que vous activez | Stripe, PayPal, SMTP, fournisseur d'IA, etc. | Le serveur nécessite une **adresse IPv4 publique** si vous souhaitez que Let's Encrypt délivre directement un certificat. Si le domaine passe par le proxy Cloudflare, consultez [DNS et Cloudflare](https://nexcmp.com/fr/docs/getting-started/dns-and-cloudflare/). ## DNS - Un **domaine principal** (par exemple `cloud.example.com`) — le portail est `https://cloud.example.com/` et la console d'administration est `https://cloud.example.com/admin`. - Facultatif : `admin.` et `partner.`. Si ces noms pointent vers le serveur (ou vers Cloudflare), l'installateur les ajoute au certificat. - Le domaine doit correspondre à celui enregistré sur votre licence. ## Non requis sur ce serveur {#not-required-on-this-server} NexCMP s'exécute en tant qu'utilisateur de service standard sans privilèges (`nexcmp`). Il n'a **pas** besoin de root à l'exécution, de Docker, d'un serveur de base de données distinct, de Redis ou d'un quelconque logiciel d'hyperviseur. --- # Licence et achat {#license-and-purchase} > **Emplacement dans l'admin :** System › Admin › License & updates (`/license`) NexCMP s'active avec une **clé de licence** que vous gérez dans votre [compte NexCMP](https://nexcmp.com/licenses). Les éditions et les tarifs actuels sont indiqués sur [nexcmp.com/pricing](https://nexcmp.com/pricing) ; cette page explique le fonctionnement de la licence une fois obtenue. ## Obtenir une licence {#get-a-license} 1. Créez un compte sur [nexcmp.com](https://nexcmp.com/register) et vérifiez votre adresse e-mail. 2. Choisissez une édition : - **NexCMP Free** — pour les opérateurs réseau disposant de leur propre ASN et d'un sous-réseau enregistré à leur nom. Déposez une demande sur [nexcmp.com/deploy](https://nexcmp.com/deploy) (entreprise, ASN, sous-réseau, domaine du panel). L'adresse e-mail de votre compte doit correspondre au domaine de l'entreprise indiqué dans le registre public (WHOIS) pour l'ASN ou le sous-réseau. Chaque demande est examinée ; vous recevez un e-mail dès qu'une décision est prise, et la clé de licence n'apparaît qu'après approbation. - **NexCMP Source** — une mise à niveau unique, sans ASN requis. Consultez [nexcmp.com/pricing](https://nexcmp.com/pricing). 3. Ouvrez votre page de licence. Elle affiche la **clé de licence** (au format `NXC-XXXXX-XXXXX-XXXXX-XXXXX`), le **domaine principal** et une commande d'installation prête à l'emploi. ::: warning Gardez la clé confidentielle La clé de licence active une installation. Traitez-la comme un mot de passe : ne la collez pas dans des tickets, des chats ou des captures d'écran. ::: ## Contenu d'une licence {#what-a-license-contains} | Champ | Description | |---|---| | Domaine principal | Le nom d'hôte sur lequel s'exécute votre portail. La clé y est associée lors de l'activation. | | Domaines revendeurs | Noms d'hôte supplémentaires utilisés comme portails en marque blanche — voir [Revendeurs](https://nexcmp.com/fr/docs/customers/resellers/). | | Mises à jour jusqu'au | Date jusqu'à laquelle vous recevez les **mises à jour et correctifs de bugs**. Une licence Free commence par **1 an** à compter du jour de son approbation ; renouvelez-la pour $99 par an sur votre page de licence. Les correctifs de sécurité sont toujours fournis, même après cette date. | | Statut | `active`, ou suspendu / expiré / révoqué. | ## À la fin de l'année gratuite {#when-the-free-year-ends} Le logiciel **continue de fonctionner** lorsque la date « Mises à jour jusqu'au » est dépassée : les clients, les services et la facturation ne sont pas affectés. Vous ne recevez plus les nouvelles versions de fonctionnalités ni les correctifs de bugs (les correctifs de sécurité continuent d'être fournis). Renouvelez pour $99 par an sur votre page de licence sur [nexcmp.com/licenses](https://nexcmp.com/licenses) pour continuer ; le renouvellement ajoute 12 mois à la date de fin actuelle. NexCMP Free inclut uniquement les correctifs de bugs — aucun support technique ni aucune application. ## Ce qu'apporte NexCMP Source {#what-nexcmp-source-adds} Une licence Source est une mise à niveau unique de votre licence pour $1,999 : le code source complet, toutes les applications NexCMP (Android, iOS, Windows, macOS, Linux, Chrome / Edge / Brave et Firefox) compilées et personnalisées à votre marque, ainsi que 30 jours ouvrés avec un ingénieur expert — migration gratuite depuis VMware, WHMCS ou un autre panel, ou installation complète de A à Z. Les nouvelles versions du code source sont incluses pendant 12 mois ; leur renouvellement ultérieur ($99 par an) est facultatif, et le code source téléchargé vous appartient définitivement. Consultez les [conditions de la licence Source](https://nexcmp.com/legal/source-license/). ## Comment l'installation vérifie sa licence {#how-the-installation-checks-its-license} - Lors de l'installation, le serveur active la clé pour votre domaine et reçoit un **jeton signé**. - Le jeton est renouvelé automatiquement toutes les **24 heures**. Il reste valide pendant **14 jours**, de sorte qu'une courte coupure d'Internet est sans conséquence. - Toutes les versions et tous les jetons sont vérifiés à l'aide d'une signature Ed25519 intégrée au programme ; tout téléchargement altéré est rejeté. Vérifiez l'état à tout moment dans la console d'administration ou avec `sudo nexcmp status`. ## Si la licence n'est pas valide {#if-the-license-is-not-valid} Lorsque le jeton expire, que la licence est suspendue ou que le domaine ne correspond plus : - les clients **ne peuvent pas créer de nouveaux services** et la console d'administration affiche un bandeau ; - les services déjà en cours d'exécution, **la facturation et les clients existants ne sont pas affectés** ; - résolvez la cause (reconnectez le serveur à Internet, renouvelez sur [nexcmp.com/licenses](https://nexcmp.com/licenses)) et cliquez sur **Check now** dans License & updates. ## Migration vers un nouveau serveur ou domaine {#moving-to-a-new-server-or-domain} Activez sur le nouveau serveur avec la même clé et le domaine enregistré (voir [Installation](https://nexcmp.com/fr/docs/getting-started/installation/)). Pour changer de domaine enregistré, modifiez-le d'abord sur votre page de licence à l'adresse [nexcmp.com/licenses](https://nexcmp.com/licenses), puis réexécutez le programme d'installation avec le nouveau `--domain`. --- # Installer NexCMP {#install-nexcmp} Le programme d'installation est un script unique fourni par votre serveur de licences. Il vérifie la machine, active votre licence, télécharge et valide le programme, installe les services et configure (facultativement) nginx avec un certificat Let's Encrypt. ## Avant de commencer {#before-you-start} - Un serveur répondant aux [prérequis](https://nexcmp.com/fr/docs/getting-started/requirements/), et un accès root. - Votre **clé de licence** et votre **domaine principal** depuis votre [page de licence](https://nexcmp.com/licenses) — voir [Licence et achat](https://nexcmp.com/fr/docs/getting-started/license-and-purchase/). - Un enregistrement DNS pour le domaine — voir [DNS et Cloudflare](https://nexcmp.com/fr/docs/getting-started/dns-and-cloudflare/). Vous pouvez également commencer par l'installation et corriger le DNS plus tard ; l'installateur vous indique ce qui manque et peut simplement être réexécuté. ## Installation {#install} 1. Connectez-vous au serveur et passez en root (ou préfixez par `sudo`). 2. Exécutez la commande depuis votre page de licence. Elle se présente ainsi : ```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. Attendez la fin des étapes de validation. Une nouvelle installation prend quelques minutes ; le premier démarrage crée le schéma de base de données et peut prendre jusqu'à une minute sur les disques lents. 4. Lisez le récapitulatif à la fin. Il affiche les URL du portail et d'administration, le **code de configuration**, ainsi que l'étape suivante. ![Fin de l'installation affichant l'URL du portail, l'URL d'administration et le code de configuration à usage unique](https://nexcmp.com/fr/docs/images/getting-started/installation-01-finish.webp) ## Paramètres {#parameters} | Paramètre | Valeur par défaut | Description | |---|---|---| | `--license KEY` | requis lors de la première installation | La clé de licence. | | `--domain NAME` | requis lors de la première installation | Domaine principal. Doit correspondre à la licence. `https://` et les chemins finaux sont supprimés. | | `--email ADDRESS` | aucun | E-mail de contact pour les avis d'expiration Let's Encrypt. Sans lui, le certificat est enregistré sans e-mail. | | `--port N` | `3000` | Port local du panneau (1–65535). | | `--no-nginx` | désactivé | N'installez ni ne configurez nginx / TLS. Utilisez cette option si vous utilisez votre propre reverse proxy ou si vous souhaitez d'abord découvrir NexCMP. | | `--behind-cloudflare` | détection automatique | Force le mode « le domaine passe par le proxy Cloudflare ». Normalement détecté via le DNS. | | `--channel NAME` | `stable` | Canal de version. | Réexécuter le programme d'installation **sans paramètres** réutilise ceux enregistrés (`/etc/nexcmp/install.conf`) et met à niveau en toute sécurité, en conservant les données, la configuration et les comptes. C'est exactement ce que fait `sudo nexcmp update`. ## Actions réalisées par l'installateur {#what-the-installer-does} 1. **Vérifie la machine** — Ubuntu 22.04/24.04, x86_64, au moins 2 Go de RAM, 8 Go d'espace disque disponible. 2. **Installe les paquets** nécessaires (`curl`, `zstd`, `openssl`, `python3`, `openssh-client` …). 3. **Crée l'utilisateur de service** `nexcmp` et les répertoires: `/opt/nexcmp` (programme, appartenant à root, en lecture seule pour le service), `/etc/nexcmp` (configuration), `/var/lib/nexcmp` (données), `/var/log/nexcmp`. 4. **Active la licence** pour le domaine et enregistre un ID d'instance fixe pour cette machine. 5. **Télécharge la version la plus récente à laquelle vous avez droit**, puis vérifie son empreinte SHA-256 et sa signature Ed25519. Une version sans signature valide est refusée. Il ne rétrograde jamais une version en cours d'exécution plus récente. 6. **Écrit la configuration et les unités systemd** (`nexcmp`, `nexcmp-vmd`, `nexcmp-update`) et démarre les services; il attend que `/healthz` réponde. 7. **Configure nginx et TLS** (sauf `--no-nginx`): obtient un certificat Let's Encrypt avec certbot (challenge webroot) pour le domaine et pour `admin.` / `partner.` lorsque ces noms sont également résolus. Si le DNS ne pointe pas encore vers ce serveur (ou Cloudflare), il ignore cette étape et le signale. 8. **Affiche un récapitulatif** avec les URL et, si aucun administrateur n'existe encore, le **code de configuration**. ## Le port du panel (3000) {#the-panel-port-3000} - Lors de la première installation, le panel écoute sur `0.0.0.0:3000` pour que vous puissiez ouvrir l'assistant de configuration sur `http://:3000/setup`. - Une fois l'assistant terminé **et** TLS actif, le panel écoute uniquement sur `127.0.0.1`; nginx relaie `https://` vers celui-ci. - En cas d'urgence (nginx en panne, DNS incorrect), vous pouvez ouvrir le port pendant une durée limitée: `sudo nexcmp open-port 30` (30 minutes, puis il se referme de lui-même) — ou utiliser un tunnel SSH: `ssh -L 3000:127.0.0.1:3000 ` et ouvrir `http://127.0.0.1:3000/`. ::: warning HTTP en clair Le port 3000 est en HTTP en clair. Utilisez-le uniquement pour l'assistant de configuration sur un réseau de confiance, ou via un tunnel SSH. Ne le laissez pas ouvert. ::: ## Installation sans domaine public (lab ou test) {#installing-without-a-public-domain-lab-or-test} Vous pouvez effectuer l'installation sur une machine sans DNS pour le moment: ```bash curl -fsSL https://nexcmp.com/install.sh | sudo bash -s -- \ --license NXC-XXXXX-XXXXX-XXXXX-XXXXX --domain lab.example.com --no-nginx ``` Ouvrez ensuite l'assistant via un tunnel SSH (`ssh -L 3000:127.0.0.1:3000 `, accédez à `http://127.0.0.1:3000/setup`). Réexécutez l'installateur sans `--no-nginx` une fois le DNS configuré. ## Docker et Kubernetes {#docker-and-kubernetes} Aucune image de conteneur n'est publiée. L'installateur (une installation systemd native) est la méthode d'installation prise en charge. ## Vérification {#verify} ```bash sudo nexcmp status ``` Vous devriez voir la version, `nexcmp: active`, `nexcmp-vmd: active`, `healthz: ok` et — jusqu'à ce que l'assistant soit terminé — le code de configuration. Poursuivez avec l'[assistant de configuration](https://nexcmp.com/fr/docs/getting-started/setup-wizard/). Si un problème survient, consultez [Erreurs d'installation](https://nexcmp.com/fr/docs/troubleshooting/installation-errors/). --- # DNS et Cloudflare {#dns-and-cloudflare} NexCMP a besoin d'un nom DNS — son **domaine principal** — et fonctionne selon deux modes. ## Mode A: le DNS pointe directement vers le serveur {#mode-a-dns-points-straight-at-the-server} 1. Créez un enregistrement **A** `cloud.example.com → ` (et un enregistrement **AAAA** si le serveur dispose d'IPv6). 2. Facultatif, si vous les utilisez: `admin.cloud.example.com` et `partner.cloud.example.com` pointant vers la même IP. 3. Exécutez (ou réexécutez) l'[installateur](https://nexcmp.com/fr/docs/getting-started/installation/). Il détecte que le nom résout vers l'IP publique du serveur et obtient un certificat Let's Encrypt via le challenge HTTP-01 sur le port 80. ## Mode B: le domaine passe par le proxy Cloudflare {#mode-b-the-domain-is-proxied-by-cloudflare} Créez les mêmes enregistrements avec le nuage orange (**Proxied**). L'installateur détecte que le nom résout uniquement vers des adresses Cloudflare et bascule en mode Cloudflare: - nginx écoute toujours sur les ports 80/443 de votre serveur; - l'adresse IP réelle du visiteur est lue depuis l'en-tête `CF-Connecting-IP` — **uniquement** pour les connexions provenant des plages publiées par Cloudflare, évitant ainsi toute falsification ; - le certificat est obtenu via Let's Encrypt (Cloudflare transmet le challenge à votre origine) ; si cela n'est pas encore possible, un **certificat d'origine auto-signé** est généré afin que le mode « Full » fonctionne, puis une réexécution ultérieure de l'installateur met à niveau vers Let's Encrypt. Vous pouvez forcer ce mode avec `--behind-cloudflare`. ::: important Configurer le mode SSL/TLS dans Cloudflare Dans Cloudflare, allez dans **SSL/TLS › Overview** et sélectionnez **Full (strict)** une fois que l'installateur signale un certificat Let's Encrypt. Avec un certificat d'origine auto-signé, utilisez **Full**. **Flexible** provoquera des boucles de redirection. ::: ::: tip Si « Always Use HTTPS » est activé, Cloudflare envoie la requête de validation sur le port 443 de votre origine. L'installateur gère cela en créant d'abord le certificat temporaire auto-signé, puis en réessayant Let's Encrypt. ::: ## Vérification {#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 ``` Les certificats sont renouvelés automatiquement par le timer certbot. Le renouvellement utilise le webroot `/var/www/nexcmp-acme`, le port 80 doit donc rester accessible (directement ou via Cloudflare). ## Problèmes fréquents {#common-problems} | Symptôme | Cause | Solution | |---|---|---| | L'installateur indique « DNS … does not point to … (nor to Cloudflare) — skipping nginx/TLS » | Enregistrement DNS manquant, erroné ou non propagé | Corrigez l'enregistrement, attendez la propagation, puis relancez l'installateur. | | Le navigateur affiche `ERR_TOO_MANY_REDIRECTS` derrière Cloudflare | Le mode SSL est **Flexible** | Définissez **Full (strict)** (ou **Full**). | | Erreur Cloudflare 525/526 | Certificat d'origine rejeté | Utilisez **Full** avec un certificat d'origine auto-signé, ou **Full (strict)** avec Let's Encrypt. | | Les visiteurs affichent tous des IP Cloudflare dans les logs | Pas en mode Cloudflare | Relancez l'installateur avec `--behind-cloudflare`. | Plus d'informations dans [Erreurs d'installation](https://nexcmp.com/fr/docs/troubleshooting/installation-errors/). --- # Assistant de configuration {#setup-wizard} > **Emplacement dans l'admin :** l'assistant est une page autonome accessible à `/setup` affichée uniquement jusqu'à la création du premier administrateur. Par la suite, les mêmes vérifications se trouvent sous System › Admin › Start (`/setup`). L'assistant transforme une nouvelle installation en un panneau fonctionnel en quatre étapes rapides. Il est disponible sur le port 3000 (`http://:3000/setup`) ou, lorsque TLS est déjà actif, à l'adresse `https:///setup`. ::: warning L'assistant disparaît après l'étape 3 Une fois l'administrateur créé, l'assistant se ferme et le code d'installation est supprimé. Pour accéder au panneau par la suite, utilisez la console d'administration. ::: ## Étape 0 — Setup code {#step-0-—-setup-code} L'installateur affiche un **code d'installation à usage unique** à la fin. Vous pouvez le relire avec : ```bash sudo nexcmp status ``` Collez-le dans **Setup code** et cliquez sur **Continue**. Ce code protège l'assistant : quiconque trouve le port ouvert ne pourra pas créer l'administrateur sans lui. ![Étape 0 de l'assistant de configuration demandant le code d'installation à usage unique](https://nexcmp.com/fr/docs/images/getting-started/setup-wizard-00-code.webp) ## Étape 1 — License {#step-1-—-license} | Champ | Valeur | |---|---| | License key | `NXC-XXXXX-XXXXX-XXXXX-XXXXX` — préactivé par l'installateur, cette étape affiche donc normalement "Activated for cloud.example.com" | | Domaine principal | Le domaine enregistré sur la licence | Si l'installateur a déjà activé la licence, l'assistant le détecte et passe à la suite. Sinon, saisissez la clé ainsi que le domaine et cliquez sur **Activate**. Les erreurs s'affichent en rouge — voir [Installation errors](https://nexcmp.com/fr/docs/troubleshooting/installation-errors/). ![Étape 1 de l'assistant de configuration montrant la licence déjà activée pour le domaine principal](https://nexcmp.com/fr/docs/images/getting-started/setup-wizard-01-license.webp) ## Étape 2 — CloudStack (ou Connect later) {#step-2-—-cloudstack-or-connect-later} Deux options s'offrent à vous : - **Connect now.** Saisissez l'**API URL** (`https://cloudstack.example.com/client/api`), la **API key** et la **Secret key** CloudStack, cliquez sur **Test connection**, puis sélectionnez la **Zone**, le **Guest network for customer VMs**, un **Zone display name** et le **Country** à deux lettres. Cliquez sur **Save CloudStack**. - **Connect later.** Cliquez sur **Connect later**. Tout le reste fonctionne ; vous pourrez connecter CloudStack ou Proxmox VE ultérieurement dans Infrastructure. D'ici là, le panneau d'état vous rappellera qu'aucune source n'est connectée. ![Étape 2 de l'assistant avec les champs CloudStack API URL, API key et Secret key renseignés avec des valeurs d'exemple](https://nexcmp.com/fr/docs/images/getting-started/setup-wizard-02-cloudstack-form.webp) ::: important Utiliser un compte CloudStack dédié N'utilisez pas la clé de l'administrateur ROOT. Créez un domaine et un compte dédiés pour NexCMP et utilisez sa clé API — voir [CloudStack](https://nexcmp.com/fr/docs/infrastructure/cloudstack/#create-a-dedicated-account-and-api-key). L'assistant vérifie que le réseau sélectionné appartient bien à la zone et au compte associé à cette clé. ::: ![Après Test connection : les listes de zones et de réseaux invités, le nom d'affichage de la zone et les champs de pays](https://nexcmp.com/fr/docs/images/getting-started/setup-wizard-02b-cloudstack-picked.webp) Si vous prévoyez d'utiliser uniquement **Proxmox VE**, choisissez **Connect later** et suivez [Proxmox VE](https://nexcmp.com/fr/docs/infrastructure/proxmox/). ## Étape 3 — Administrateur et marque {#step-3-—-administrator-and-brand} | Champ | Règles | |---|---| | Admin email (login) | Adresse e-mail valide. Il s'agit de votre nom d'utilisateur administrateur. | | Password | Au moins 12 caractères, comprenant des lettres et des chiffres. | | Brand name | Visible par vos clients (par défaut "Cloud"). Jusqu'à 60 caractères. | | Support email | Défini par défaut sur l'e-mail administrateur. | ![Étape 3 de l'assistant avec l'e-mail administrateur, le mot de passe, le nom de marque et l'e-mail de support](https://nexcmp.com/fr/docs/images/getting-started/setup-wizard-03-admin.webp) Cliquez sur **Finish setup**. Le panneau redémarre (environ 1 à 2 secondes) et la page vous redirige vers la connexion administrateur sur `https:///admin/`. Si cette adresse ne répond pas encore (DNS ou TLS en attente), elle vous redirige vers `/` sur l'adresse actuelle. ![L'assistant après finalisation indiquant que le panneau redémarre](https://nexcmp.com/fr/docs/images/getting-started/setup-wizard-03-done.webp) ## Ce que l'assistant configure pour vous {#what-the-wizard-sets-up-for-you} - Nom de marque, URL du site (`https://`), URL admin (`https:///admin`), URL console (`https:///console`), e-mail de support et nom d'expéditeur. - Paramètres par défaut des modules intégrés à NexCMP : DDoS & BGP, AI et web SSH sont **désactivés** ; la mesure de bande passante est **activée**. Voir [Modules](https://nexcmp.com/fr/docs/infrastructure/modules/). - Si vous avez connecté CloudStack : le fournisseur n°1, sa première zone, le réseau invité et une paire de clés d'exploitation rattachée aux VM des clients pour assurer le support. Étape suivante : [First login](https://nexcmp.com/fr/docs/getting-started/first-login/). --- # Première connexion et étapes suivantes {#first-login-and-next-steps} > **Dans l'admin :** la page de connexion est `/admin`; après connexion, la page d'accueil est Overview › Dashboard. ## Adresses {#addresses} | Élément | URL | |---|---| | Portail client | `https:///` | | Console d'administration | `https:///admin` | | Configuration / urgence par IP | `http://:3000/` (voir [le port du panel](https://nexcmp.com/fr/docs/getting-started/installation/#the-panel-port-3000)) | | Contrôle de santé | `https:///healthz` | ## Connexion {#sign-in} 1. Ouvrez `https:///admin`. 2. Saisissez l'e-mail et le mot de passe administrateur créés dans l'assistant. 3. Vous arrivez sur le **Dashboard**. Un bandeau apparaît en haut si la licence n'est pas valide ou si aucune source n'est connectée. ![La page de connexion admin](https://nexcmp.com/fr/docs/images/getting-started/first-login-01-login.webp) ## Check-list recommandée {#recommended-checklist} Effectuez ces étapes dans l'ordre — chacune renvoie à sa page. | # | Tâche | Page | |---|---|---| | 1 | Activez l'authentification à deux facteurs pour votre compte | [Security](https://nexcmp.com/fr/docs/administration/security/) | | 2 | Connectez une source d'infrastructure (si vous avez choisi « Connect later ») | [CloudStack](https://nexcmp.com/fr/docs/infrastructure/cloudstack/) ou [Proxmox VE](https://nexcmp.com/fr/docs/infrastructure/proxmox/) | | 3 | Vérifiez les zones et les templates de machines / la liste des OS | [Zones](https://nexcmp.com/fr/docs/infrastructure/zones/), [Templates](https://nexcmp.com/fr/docs/infrastructure/templates/) | | 4 | Vérifiez les plans et les tarifs | [Plans](https://nexcmp.com/fr/docs/catalog/plans/) | | 5 | Définissez votre logo, vos couleurs et vos pages légales | [Branding](https://nexcmp.com/fr/docs/customers/branding/), [Legal](https://nexcmp.com/fr/docs/customers/legal/) | | 6 | Configurez l'e-mail sortant et envoyez un test | [SMTP and emails](https://nexcmp.com/fr/docs/administration/smtp-and-emails/) | | 7 | Activez au moins un canal de paiement et testez un rechargement | [Payment channels](https://nexcmp.com/fr/docs/billing/payment-channels/) | | 8 | Choisissez les modules que vous vendez | [Modules](https://nexcmp.com/fr/docs/infrastructure/modules/) | | 9 | Passez une commande de test en tant que client et supprimez-la | [Ordering](https://nexcmp.com/fr/docs/portal/ordering/) | | 10 | Effectuez une première sauvegarde | [Backup and restore](https://nexcmp.com/fr/docs/getting-started/backup-and-restore/) | ## Créer votre première commande (smoke test) {#create-your-first-order-smoke-test} 1. Ouvrez le portail client dans une fenêtre de navigation privée et enregistrez un compte de test. 2. Ajoutez du crédit (un bon d'achat ou un paiement de test). 3. Commandez le plus petit plan de votre zone. 4. Observez son apparition dans l'admin sous Services › Virtual Machines, ouvrez sa console, puis supprimez-la. Si la VM n'atteint pas l'état *running*, ouvrez **Infrastructure › Cloud provider › Sync & errors** et consultez l'erreur. --- # Mise à jour de NexCMP {#updating-nexcmp} > **Dans l'admin :** System › Admin › License & updates (`/license`) → carte *Update*. ## Ce que vous recevez {#what-you-receive} | Type de version | Conditions d'accès | |---|---| | Correctif de sécurité | **Toujours**, même après votre date « updates until » | | Version de fonctionnalités | Uniquement si publiée **au plus tard** à votre date « updates until » | Vous pouvez consulter ces deux dates dans **License & updates**. Renouvelez vos accès sur [nexcmp.com/licenses](https://nexcmp.com/licenses). ## Mettre à jour depuis la console d'administration {#update-from-the-admin-console} 1. Ouvrez **System › Admin › License & updates**. 2. Dans l'encadré **Update**, cliquez sur **Check for update**. L'encadré affiche la version actuelle, la version la plus récente que vous pouvez installer, un badge *security* le cas échéant, ainsi que le changelog. 3. Cliquez sur **Update to X.Y.Z** et confirmez. Le programme télécharge la version, vérifie sa **signature SHA-256 et Ed25519**, remplace le binaire de manière atomique (en conservant une copie `.bak`) et redémarre. Prévoyez environ **10 secondes** d'interruption. 4. Rechargez la page et vérifiez la version en haut à droite de License & updates. ![L'encadré Update affichant la version en cours d'exécution et le bouton Check for new version](https://nexcmp.com/fr/docs/images/getting-started/updating-01-card.webp) ## Mettre à jour en ligne de commande {#update-from-the-command-line} ```bash sudo nexcmp update ``` Cette commande exécute le programme d'installation inclus *au sein de la version actuellement installée* (et non un script téléchargé à la volée) avec les paramètres enregistrés depuis `/etc/nexcmp/install.conf`. Elle actualise le binaire, les unités systemd, les modèles nginx et l'agent de nœud, tout en préservant les données, la configuration et les comptes. ::: tip Aucun retour à une version antérieure Si le serveur propose une version plus ancienne que celle en cours d'exécution, le programme d'installation conserve la version active. ::: ## Avant de mettre à jour {#before-you-update} 1. Effectuez une sauvegarde : `sudo nexcmp backup` — voir [Sauvegarde et restauration](https://nexcmp.com/fr/docs/getting-started/backup-and-restore/). 2. Lisez le journal des modifications dans la carte Update. Pour les changements depuis la 1.3, consultez les [Notes de version jusqu'à la 1.6.1](https://nexcmp.com/fr/docs/getting-started/release-notes/), y compris la mise à jour de l'agent VPN et les règles de tarification Bare Metal. 3. Effectuez la mise à jour pendant une période de faible activité ; les machines virtuelles en cours d'exécution ne sont pas impactées, mais les clients ne pourront pas accéder au portail pendant quelques secondes. ## Après la mise à jour {#after-you-update} - Exécutez `sudo nexcmp status` et confirmez que les deux services sont actifs. - Ouvrez le Dashboard d'administration et la page **Needs attention**. - Les migrations de base de données s'exécutent automatiquement au premier démarrage de la nouvelle version. - Si vous exploitez des nœuds VPN, mettez à jour leur agent séparément et vérifiez les relevés d'utilisation. Mettre à jour le panneau met le nouvel agent à disposition, mais ne garantit pas que chaque nœud distant l'exécute déjà. Consultez [Quota de données des nœuds VPN](https://nexcmp.com/fr/docs/infrastructure/vpn-proxy-nodes/#data-allowance-on-a-vpn-node). Si une mise à jour échoue, consultez [Erreurs de mise à jour](https://nexcmp.com/fr/docs/troubleshooting/update-errors/). --- # Notes de version {#release-notes} > **Où dans l'administration :** System › Admin › License & updates (`/license`), la carte **Update**. Ces notes couvrent les changements après la 1.3 jusqu'à **NexCMP 1.6.1**. Effectuez une sauvegarde avant la mise à jour et utilisez la version proposée par la carte **Update** de votre installation. Consultez [Mise à jour de NexCMP](https://nexcmp.com/fr/docs/getting-started/updating/) pour les commandes et les vérifications de signature. ## 1.6.1 - **Métriques Bare Metal :** la vue client **Overview** affiche des tuiles pour le processeur, la RAM, l'activité disque et le réseau avec un historique récent. Les mesures manquantes affichent un tiret et une explication. Les relevés réseau nécessitent un compteur de trafic ; ils ne sont pas déduits de l'inventaire matériel iDRAC. - **Plans Bare Metal d'exemple :** les noms d'exemple utilisent `BM-40C-`. Les plans d'exemple intégrés que vous n'avez pas modifiés reçoivent des noms neutres. Les plans modifiés sont conservés, et un plan référencé garde son code. Vérifiez le matériel réel du serveur avant de rendre un plan disponible à la vente. - **Changements d'offre :** la liste des demandes côté administrateur se trie sur le serveur et conserve ses actions visibles lors du défilement horizontal. - **Signaler un bug :** le formulaire défile tout en maintenant ses boutons visibles. Le masquage des mots de passe préserve le texte de diagnostic environnant. - **Chargement :** les ressources des pages et les données d'administration fréquemment utilisées sont chargées plus tôt afin de réduire les temps de navigation. Consultez [Configuration, tarification et contrôles client de Bare Metal](https://nexcmp.com/fr/docs/infrastructure/dedicated/) et [Signaler un bug](https://nexcmp.com/fr/docs/administration/report-a-bug/). ## 1.6.0 - **Configuration de Bare Metal :** renseignez les réseaux iDRAC, l'adresse du serveur ISO et l'adresse de rappel du panneau dans **Safety › Management network connection**. Les valeurs d'exemple bloquent les opérations en production tant qu'elles ne sont pas configurées. - **Hébergement d'ISO :** `sudo nexcmp dedicated-setup-iso` configure le serveur web ISO du réseau de gestion. L'installateur peut installer la console et les outils ISO avec `--baremetal` ou les options ISO. Les outils manquants bloquent les opérations en production avec `tools_missing`. - **Tarifs Bare Metal :** une installation vierge ou non utilisée démarre avec des prix en USD. Une installation disposant déjà de données tarifaires en VND conserve les VND et nécessite toujours un taux USD/VND. La mise à jour ne réinterprète pas ces prix existants en dollars. - **Page serveur client :** renouveler à l'avance, planifier un changement de cycle de facturation, demander un changement d'offre, consulter les factures et afficher les identifiants de l'OS après installation. Un nouveau propriétaire ne peut pas voir le mot de passe d'un propriétaire précédent. - **Profils clients :** huit onglets regroupent aperçu, services, facturation, quotas, sécurité, support, affiliation et journaux. Les services partagent un tableau unique avec recherche et tri. - **Actions de service :** le verrouillage, le déverrouillage, l'annulation sans remboursement ou l'annulation avec remboursement utilisent une boîte de dialogue commune. Les remboursements sont crédités sur le portefeuille ou l'allocation de crédit d'origine ; les processeurs de paiement ne sont pas remboursés automatiquement. Consultez [Serveurs dédiés](https://nexcmp.com/fr/docs/infrastructure/dedicated/) et [Gestion des clients](https://nexcmp.com/fr/docs/customers/managing-customers/). Le BYOIP et le rattachement d'un sous-réseau client à un serveur Bare Metal restent indisponibles dans NexCMP. ## 1.5.2 L'administrateur principal peut ouvrir **Report a bug** à côté de **Docs** et envoyer un ticket au compte de licence sans connexion distincte. Les diagnostics sont facultatifs. Le personnel, les clients et les assistants IA ne peuvent pas envoyer de rapports via cette action. Consultez [Report a bug](https://nexcmp.com/fr/docs/administration/report-a-bug/). ## 1.5.1 - **Consommation VPN :** les nœuds agents remontent le trafic au panel. Un abonnement qui épuise son quota de Go est coupé ; il redevient disponible après une augmentation de bande passante ou lors d'une nouvelle période. Les nœuds sans rapport de consommation affichent **Not measured** et ne sont pas coupés sur la base des Go. - **Agent VPN :** la version 1.5.1 retente l'envoi de la consommation non acquittée, transmet le trafic final lors de l'arrêt et ferme les connexions ouvertes lorsqu'un endpoint est arrêté. Mettez à jour les agents distants ainsi que le panel. - **Options VPN retirées :** High IP Reputation, High Concurrency et High Priority Network ne sont plus commercialisées. Leurs frais sont supprimés des montants des futurs renouvellements des abonnements existants ; les périodes passées ne sont pas remboursées. Si une option a été supprimée du catalogue, vérifiez manuellement le montant du renouvellement. - **Étiquettes de protocole :** le proxy HTTP IPv4 fonctionne en simple HTTP. Les adresses IPv4 ne font l'objet d'aucune rotation. Le port 443 du proxy IPv6 dessert du SOCKS5 ; il ne s'agit pas d'un endpoint proxy HTTPS. - **Nouvelle installation :** l'initialisation de la base de données réessaie en cas de conflits de migration temporaires entre le panel et le worker, afin que l'enregistrement du premier fournisseur ne nécessite aucun redémarrage. Consultez [Nœuds VPN et proxy IPv6](https://nexcmp.com/fr/docs/infrastructure/vpn-proxy-nodes/). ## 1.5.0 **AI Models** est un module facultatif de passerelle et de facturation, désactivé par défaut. Ajoutez les sources de modèles que vous exploitez ou êtes autorisé à revendre, synchronisez les modèles, définissez les tarifs et les routes, activez les modèles, puis ouvrez les ventes. Aucun compte fournisseur, modèle ou tarif n'est inclus par défaut. Il est distinct du module AI Chat et AI Agent. Consultez [AI Models](https://nexcmp.com/fr/docs/infrastructure/ai-models/). ## 1.4.2 L'installation des nœuds proxy IPv6 utilise le démon et le script réseau inclus dans le paquet de version. Le panel requiert `sshpass` pour l'installation SSH par mot de passe. Le panel exécute les plannings de rotation, et la configuration du nœud exclut l'adresse de passerelle des attributions. Le branding permet de définir un nom d'affichage personnalisé pour le service VPN. Consultez [Nœuds VPN et proxy IPv6](https://nexcmp.com/fr/docs/infrastructure/vpn-proxy-nodes/). ## 1.4.0–1.4.1 - **Administration de l'IA :** l'AI Chat administrateur, les comptes IA personnels, les clés d'API d'administration, le serveur MCP administrateur, les connecteurs OAuth, l'import/export de configuration et la checklist d'installation sont disponibles. Consultez [Configurer avec l'IA](https://nexcmp.com/fr/docs/configure-with-ai/overview/). - **Licences :** les workflows Free et Source incluent les builds officiels et les builds personnalisés à partir des sources. Le compte, les licences, les téléchargements et la documentation utilisent `nexcmp.com`. Consultez [Licence et achat](https://nexcmp.com/fr/docs/getting-started/license-and-purchase/). - **Liens vers la documentation :** **Docs** dans l'administration ouvre le guide de la page en cours. - **Devises :** une nouvelle installation suit la langue du client par défaut. Le taux USD/VND provient d'une table publique de taux de change ou de votre taux fixe. Consultez [Devises et taux de change](https://nexcmp.com/fr/docs/catalog/currency-and-exchange-rates/). - **Zones à sources mixtes :** les tarifs publics Cloud Server s'appliquent lorsque CloudStack et Proxmox VE partagent une zone. Les offres utilisent leur propre source d'infrastructure. - **Tarifs dérivés des offres :** le pourcentage est une marge sur le prix de vente. Une marge de 40% sur un coût de $60 donne $100, avant tout arrondi. ## Checklist de mise à niveau {#upgrade-checklist} 1. Sauvegardez vos données, lisez la carte **Update**, mettez à jour et exécutez `sudo nexcmp status`. 2. Mettez à jour les agents VPN et confirmez que les nœuds transmettent le trafic mesuré avant de vous fier à la coupure basée sur les Go. 3. Si vous utilisez Bare Metal, vérifiez les champs du réseau de gestion, les outils requis, l'unité de prix, les modèles et les exemples d'offres avant d'ouvrir les ventes ou l'exploitation en production. 4. Ouvrez un profil client et vérifiez sa liste de services. Vérifiez le montant et l'attribution de paiement d'origine avant de confirmer une annulation avec remboursement. 5. Laissez les modules optionnels désactivés tant que leur infrastructure n'est pas prête. Pour AI Models, vérifiez la présence d'un fournisseur, d'un modèle tarifé et d'une requête client réussie avant d'ouvrir les ventes. --- # Sauvegarde et restauration {#backup-and-restore} > **Accès dans l'administration :** System › Admin › Backup (`/backup`) apparaît uniquement si le module DDoS & BGP est activé ; pour une installation standard, utilisez la ligne de commande ci-dessous. ## Éléments sauvegardés {#what-is-backed-up} `sudo nexcmp backup` crée une archive compressée contenant : | Composant | Contenu | |---|---| | `data/**/*.db` | Toutes les bases de données SQLite dans `/var/lib/nexcmp`, copiées via l'API de sauvegarde à chaud de SQLite — cohérentes même lorsque le panneau est en cours d'exécution | | `files.tar` | Tous les autres fichiers dans `/var/lib/nexcmp` (fichiers de configuration, éléments de personnalisation graphique téléversés, `secrets/`), à l'exception des bases de données et du dossier `updates/` | | `etc/` | Une copie de `/etc/nexcmp` (paramètres d'installation, identifiant d'instance, port et adresse d'écoute) | ::: warning L'archive contient vos clés maîtresses `secrets/` contient la clé qui chiffre les clés API, les identifiants de paiement et les mots de passe SMTP stockés dans la base de données. L'archive est créée avec les permissions `0600`. Conservez-la chiffrée et hors du serveur. Sans ces clés, une base de données restaurée ne pourra pas déchiffrer ses secrets. ::: ## Créer une sauvegarde {#take-a-backup} ```bash sudo nexcmp backup # writes to /var/backups/nexcmp sudo nexcmp backup /mnt/nas/nexcmp # or to another directory ``` La commande affiche le chemin de l'archive, par exemple `/var/backups/nexcmp/nexcmp-backup-20261030-120000.tar.zst`. ### Planifier {#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 ``` Copiez le dossier hors de la machine (Object Storage, NAS, autre serveur). ## Restaurer {#restore} Restaurez sur un serveur où NexCMP de la **même version (ou plus récente)** est installé. 1. Installez NexCMP avec l'[installateur](https://nexcmp.com/fr/docs/getting-started/installation/) en utilisant la même licence et le même domaine, mais ne lancez **pas** l'assistant de configuration. 2. Arrêtez les services : ```bash sudo systemctl stop nexcmp-vmd nexcmp ``` 3. Décompressez l'archive dans un répertoire temporaire : ```bash sudo mkdir /root/restore && sudo tar --zstd -xf nexcmp-backup-20261030-120000.tar.zst -C /root/restore ``` 4. Remettez les fichiers en place : ```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. Démarrez les services et vérifiez : ```bash sudo systemctl start nexcmp nexcmp-vmd sudo nexcmp status ``` 6. Connectez-vous à `https:///admin` avec l'administrateur du système *sauvegardé*. ::: tip Testez la procédure Exécutez les étapes 1 à 6 sur un serveur de test une fois, avant d'en avoir besoin. Une sauvegarde que vous n'avez jamais restaurée n'est qu'un espoir. ::: ## Non inclus {#not-included} - Configuration nginx et certificats (régénérés par l'installateur ; les certificats Let's Encrypt sont réémis). - Vos serveurs CloudStack / Proxmox VE et leurs machines virtuelles — sauvegardez-les à l'aide de leurs propres outils. --- # Désinstaller NexCMP {#uninstall-nexcmp} ::: warning Perte d'accès pour les clients La désinstallation interrompt le portail et la facturation. Les machines virtuelles sur votre CloudStack ou Proxmox VE continuent de fonctionner, mais plus rien ne les gère ni ne les facture. Créez d'abord une [sauvegarde](https://nexcmp.com/fr/docs/getting-started/backup-and-restore/). ::: ## Supprimer le programme, conserver les données {#remove-the-program-keep-the-data} ```bash sudo nexcmp uninstall ``` Cela désactive et supprime les services `nexcmp` et `nexcmp-vmd`, le site et l'extrait nginx, `/opt/nexcmp` et la commande `nexcmp`. Les **données sont conservées** dans `/var/lib/nexcmp` et `/etc/nexcmp`, afin qu'une installation ultérieure sur le même serveur reprenne là où vous vous étiez arrêté. ## Tout supprimer {#remove-everything} ```bash sudo nexcmp uninstall --purge ``` Supprime également `/var/lib/nexcmp`, `/etc/nexcmp`, `/var/log/nexcmp` et l'utilisateur système `nexcmp`. Cette action est irréversible. ## Après la désinstallation {#after-uninstalling} - Les certificats Let's Encrypt et les paquets `nginx` / `certbot` sont conservés. Supprimez le certificat avec `sudo certbot delete --cert-name ` si vous le souhaitez. - Libérez le domaine sur votre page de licences à [nexcmp.com/licenses](https://nexcmp.com/licenses) si vous prévoyez de l'activer ailleurs. - Supprimez le compte CloudStack dédié / le jeton d'API Proxmox créés pour NexCMP si vous n'en avez plus besoin. --- # Référence de la commande `nexcmp` {#nexcmp-command-reference} L'installateur place un utilitaire dans `/usr/local/bin/nexcmp`. Exécutez-le sur le serveur NexCMP. Les commandes qui modifient le système nécessitent `sudo`. (L'outil côté client pour l'API est un programme différent, voir [cmp CLI](https://nexcmp.com/fr/docs/developers/cmp-cli/).) | Commande | Nécessite root | Description | |---|---|---| | `nexcmp status` | Non (plus de détails avec `sudo`) | Version, état des services (`nexcmp`, `nexcmp-vmd`), `/healthz`, résumé de la licence, état du port public, code de configuration si l'assistant n'est pas terminé | | `nexcmp update` | Oui | Exécute l'installateur fourni dans la version installée avec les paramètres enregistrés — voir [Mise à jour](https://nexcmp.com/fr/docs/getting-started/updating/) | | `nexcmp backup [dir]` | Oui | Sauvegarder vers `/var/backups/nexcmp` (ou `dir`) — voir [Sauvegarde et restauration](https://nexcmp.com/fr/docs/getting-started/backup-and-restore/) | | `nexcmp uninstall [--purge]` | Oui | Supprimer les services et le programme; `--purge` supprime également les données — voir [Désinstallation](https://nexcmp.com/fr/docs/getting-started/uninstall/) | | `nexcmp open-port [minutes]` | Oui | **Urgence**: écouter sur le port du panel (3000 par défaut) sur toutes les interfaces pendant 1–1440 minutes (30 par défaut), puis fermer automatiquement | | `nexcmp close-port` | Oui | Fermer la fenêtre d'urgence maintenant | | `nexcmp fix-owner` | Oui | Restituer les fichiers de `/var/lib/nexcmp` appartenant à root à l'utilisateur `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) ``` Si des fichiers du répertoire de données appartiennent à root (par exemple créés en exécutant une autre commande `nexcmp` avec `sudo` en tant que root), `status` affiche un avertissement car l'utilisateur du service ne peut pas les lire — un symptôme typique étant la licence affichant HTTP 421. Corrigez avec `sudo nexcmp fix-owner`. Cette même correction s'exécute automatiquement à chaque démarrage du service. ## Accès d'urgence {#emergency-access} Lorsque le domaine, nginx ou TLS est défaillant, vous pouvez toujours accéder au panel: ```bash sudo nexcmp open-port 30 # http://:3000/ for 30 minutes sudo nexcmp close-port # close it earlier ``` Plus sûr, sans rien ouvrir: `ssh -L 3000:127.0.0.1:3000 user@server` et accédez à `http://127.0.0.1:3000/`. ## Environnement {#environment} | Variable | Description | |---|---| | `NEXCMP_BASE` | Remplacer l'URL de base du serveur de licences (par défaut `https://nexcmp.com`); réservé aux tests | Fichiers et répertoires: programme `/opt/nexcmp`, configuration `/etc/nexcmp`, données `/var/lib/nexcmp`, journaux `/var/log/nexcmp` et `journalctl -u nexcmp -u nexcmp-vmd`. --- # Prérequis d'infrastructure {#infrastructure-requirements} > **Emplacement dans l'admin:** Infrastructure (la zone du menu de gauche) et System › Admin › License & updates (`/license`) pour activer les modules. Cette page liste les prérequis de chaque module **en dehors** du serveur NexCMP. Pour le serveur lui-même (Ubuntu, mémoire, disque, ports), voir [Prérequis pour le serveur NexCMP](https://nexcmp.com/fr/docs/getting-started/requirements/). Pour activer les modules, voir [Modules](https://nexcmp.com/fr/docs/infrastructure/modules/). ## Module par module {#module-by-module} | Module | Infrastructure minimale | Détails | |---|---|---| | **Machines virtuelles sur CloudStack** | Apache CloudStack 4.23 (testé), KVM, une zone avancée avec un réseau invité et une plage d'adresses IP publiques; un domaine et un compte dédiés avec une clé API (jamais ROOT); au moins un template prêt à l'emploi et une offre de service | [CloudStack](https://nexcmp.com/fr/docs/infrastructure/cloudstack/) | | **Machines virtuelles sur Proxmox VE** | Proxmox VE 9.x (vérifié sur 9.2); un token API avec un rôle personnalisé; un stockage permettant le clonage; un bridge; un bloc IPv4 avec une passerelle; un template cloud-init par OS et par nœud | [Proxmox VE](https://nexcmp.com/fr/docs/infrastructure/proxmox/) | | **Templates d'OS** | CloudStack: une machine de build Linux avec libguestfs et un serveur web pour l'image. Proxmox VE: des templates cloud-image avec le guest agent | [Templates d'OS](https://nexcmp.com/fr/docs/infrastructure/templates/) | | **Bare metal / Serveur dédié** | Serveurs Dell avec iDRAC 9 accessibles en HTTPS (Redfish) depuis le panel sur un réseau de gestion; un serveur HTTP sur ce réseau distribuant les fichiers ISO; des dossiers ISO accessibles en écriture pour le service NexCMP | [Serveurs dédiés](https://nexcmp.com/fr/docs/infrastructure/dedicated/) | | **AI Models** | Une ou plusieurs sources de modèles que vous êtes autorisé à revendre, avec une API compatible OpenAI ou Anthropic et votre propre clé; HTTPS sortant (port 443, nom de domaine public) depuis le panel vers chaque source, ou une passerelle interne répertoriée sous Allowed internal hosts; aucun GPU ni matériel spécifique | [AI Models](https://nexcmp.com/fr/docs/infrastructure/ai-models/) | | **VPN** | Un ou plusieurs hôtes Linux (x86_64, systemd, root) avec des adresses IPv4 publiques sur l'interface ou routées vers celle-ci, flux HTTPS sortant vers votre panel | [Nœuds VPN et proxy](https://nexcmp.com/fr/docs/infrastructure/vpn-proxy-nodes/) | | **IPv6 Proxy** | Hôtes Linux (x86_64, systemd, `nft`, `ip`, `ss`, `sysctl`) avec une IPv4 publique, les ports 80, 443 et 60001-65535 disponibles, et un préfixe IPv6 de /32 à /64 fonctionnel pour le trafic sortant; accès SSH par mot de passe pour l'installation initiale | [Nœuds VPN et proxy](https://nexcmp.com/fr/docs/infrastructure/vpn-proxy-nodes/) | | **Object Storage (S3)** | Un cluster Ceph avec RADOS Gateway (RGW), un utilisateur Admin Ops et un endpoint HTTPS public sur le port 443 | [S3](https://nexcmp.com/fr/docs/infrastructure/s3/) | | **Kubernetes** | CloudStack avec le service Kubernetes (CKS) activé, au moins un ISO de version Kubernetes et une offre de service de control-plane gratuite d'exactement 2 vCPU et 2048 MB | [Kubernetes et Private Cloud](https://nexcmp.com/fr/docs/infrastructure/kubernetes-and-private-cloud/) | | **Private Cloud** | CloudStack avec une offre de VPC et une offre réseau par forfait de bande passante (plus une offre verrouillée à 1 Mbps) | [Kubernetes et Private Cloud](https://nexcmp.com/fr/docs/infrastructure/kubernetes-and-private-cloud/) | | **OS & ISO Images** | CloudStack dont la VM de stockage secondaire peut accéder à Internet pour télécharger les images client (liens directs, sans redirection) ; le compte CloudStack doit pouvoir enregistrer des templates et des ISO | [Modules](https://nexcmp.com/fr/docs/infrastructure/modules/) | | **Bandwidth** | Rien de plus avec la source par défaut : l'utilisation est lue depuis les statistiques de VM CloudStack. Les VM sur Proxmox VE ne sont pas mesurées | [Bandwidth](https://nexcmp.com/fr/docs/catalog/bandwidth/) | | **AI Chat and AI Agent** | Une API compatible OpenAI (URL de base, modèle et clé) accessible par le serveur du panel. Aucun logiciel supplémentaire sur vos serveurs | [Fournisseurs d'IA](https://nexcmp.com/fr/docs/ai/ai-providers/) | | **DDoS & BGP** | Un package d'extension nécessitant un hôte routeur edge avec des démons s'exécutant en root (BGP, filtrage, statistiques de flux). Il ne fait pas partie de l'installation standard | [Modules](https://nexcmp.com/fr/docs/infrastructure/modules/) | | **DDoS Shield** | L'extension DDoS & BGP | [Modules](https://nexcmp.com/fr/docs/infrastructure/modules/) | | **Terminal SSH web** | Un service de proxy SSH distinct et une route dédiée. Il ne fait pas partie de l'installation standard ; l'AI Agent n'en a pas besoin | [Modules](https://nexcmp.com/fr/docs/infrastructure/modules/) | ## Aperçu des chemins réseau {#network-paths-at-a-glance} | De | Vers | Port | Usage | |---|---|---|---| | Serveur du panel | Serveur de gestion CloudStack | 443 ou 8080 (selon votre publication) | API | | Serveur du panel | Nœud Proxmox VE | 8006/tcp | API et console | | Serveur du panel | Dell iDRAC | 443/tcp (et le port VNC, 5901 par défaut) | Redfish et console | | iDRAC | Serveur web ISO | le port HTTP de votre choix (par exemple 8080) | Média virtuel | | Serveur du panel | Ceph RGW | 443/tcp | Admin Ops | | Serveur du panel | Nœud proxy IPv6 | Port SSH saisi | Installation unique | | Nœuds VPN et proxy | Panel (via nginx) | 443/tcp | Enrôlement, heartbeat, configuration | | Clients | Nœuds VPN et proxy | ports par IP 65001-65535 (VPN) ; 80, 443, 60001-65535 (proxy IPv6) | Le service lui-même | ::: tip Garder les réseaux de gestion privés Les adresses de gestion iDRAC et des hyperviseurs doivent être situées sur un réseau inaccessible aux clients. NexCMP refuse les adresses iDRAC situées en dehors des plages privées que vous autorisez. ::: ## Checklist avant de vendre {#checklist-before-you-sell} 1. L'infrastructure associée au premier service est connectée et **Test connection** est au vert. 2. Une zone est prête pour la vente (voir [Zones](https://nexcmp.com/fr/docs/infrastructure/zones/)) : un backend actif, un plan et un template prêt. 3. Un canal de paiement est configuré (voir [Payment channels](https://nexcmp.com/fr/docs/billing/payment-channels/)). 4. L'e-mail fonctionne (voir [SMTP and e-mails](https://nexcmp.com/fr/docs/administration/smtp-and-emails/)). 5. Vous avez passé une commande de test et supprimé la VM. --- # Architecture {#architecture} > **Emplacement dans l'admin :** il s'agit d'une page de référence. Les services décrits ici sont visibles avec `sudo nexcmp status` ; les connexions sont configurées sous Infrastructure et System › Settings. ## Schéma d'ensemble {#the-picture} ![Architecture de NexCMP : les clients accèdent à nginx via le DNS et éventuellement Cloudflare, nginx relaie vers le panel sur le port 3000, le panel et le worker communiquent avec CloudStack, Proxmox VE, iDRAC, Ceph, les passerelles de paiement, SMTP et un fournisseur d'IA, et les nœuds VPN et proxy IPv6 renvoient leurs requêtes vers le panel](https://nexcmp.com/fr/docs/images/infrastructure/architecture.svg) ### Le même schéma en détail {#the-same-diagram-in-words} 1. Un client ou un administrateur ouvre `https://cloud.example.com` (le portail), `https://cloud.example.com/admin` (la console d'administration) ou appelle l'API REST. Le DNS fait pointer le nom de domaine vers votre serveur, ou vers Cloudflare, qui relaie le trafic. 2. **nginx** sur le serveur du panel écoute sur les ports 80 (redirection et renouvellement de certificat) et 443 (TLS) et transmet chaque requête au **panel** sur `127.0.0.1:3000`. Après l'assistant de configuration, le panel écoute uniquement sur l'interface loopback. 3. Le **panel** (`nexcmp.service`) dessert le portail client, la console d'administration, l'API REST, l'assistant de configuration et les téléchargements nécessaires aux nœuds (le binaire de l'agent, le script d'installation, l'outil en ligne de commande `cmp`). Il vérifie également votre licence une fois par jour. 4. Le **worker** (`nexcmp-vmd.service`) écoute sur `127.0.0.1:8112`, accessible uniquement en local. Il exécute tout ce qui prend du temps ou doit être planifié : les tâches de provisionnement, la synchronisation avec CloudStack et Proxmox VE, les cycles de facturation, la collecte de la bande passante et les connexions de console dans le navigateur. 5. Depuis ces deux processus, NexCMP effectue des appels vers l'extérieur : **CloudStack** (API de gestion), **Proxmox VE** (API sur le port 8006, certificat épinglé), **Dell iDRAC** (Redfish via HTTPS sur le réseau de gestion), **Ceph RGW** (S3 et Admin Ops via HTTPS), les **passerelles de paiement** (Stripe, PayPal, USDT et les prestataires de virement bancaire, qui appellent aussi vos URL de webhook), **votre serveur SMTP**, un **fournisseur d'IA** doté d'une API compatible OpenAI, et facultativement **Telegram**. 6. Les **nœuds VPN** exécutent `cmp-agent`. Chaque nœud s'enregistre une fois à l'aide d'un jeton à usage unique, puis envoie un heartbeat toutes les 5 secondes via HTTPS au panel et reçoit sa configuration en réponse. Les **nœuds proxy IPv6** sont installés une seule fois par le panel via SSH, puis récupèrent leur configuration auprès du panel. 7. L'état réside dans des bases de données SQLite et quelques fichiers sous `/var/lib/nexcmp`. Les identifiants pour CloudStack, Proxmox, S3, iDRAC et le fournisseur d'IA sont stockés sous forme chiffrée (AES-256-GCM) avec des fichiers de clé maîtresse dans le même répertoire. ## Services et processus {#services-and-processes} | Processus | Exécuté en tant que | Écoute sur | Rôle | |---|---|---|---| | `nginx` | root (workers `www-data`) | 80, 443 | TLS, redirection, proxy vers le panel | | `nexcmp` | `nexcmp` | 3000 (toutes les interfaces lors de l'installation initiale, puis `127.0.0.1`) | Portail, console d'administration, API, assistant, téléchargements | | `nexcmp-vmd` | `nexcmp` | `127.0.0.1:8112` | Tâches, synchronisation, facturation, bande passante, console | | `nexcmp-update` | root | aucun | Applique les mises à jour demandées par la console d'administration (une unité path attend la requête) | | `cmp-agent` (sur les nœuds VPN) | root | les ports d'écoute VPN | Envoie des rapports au panel, exécute les écouteurs proxy sur les IPv4 publiques | Le panel et le worker s'exécutent en tant qu'utilisateur ordinaire sans aucune capacité Linux, avec un système de fichiers en lecture seule sauf `/var/lib/nexcmp` et `/var/log/nexcmp`. Ils ne nécessitent aucun accès root, ni Docker, ni base de données distincte, ni Redis. ## Fichiers et emplacements {#files-and-where-they-are} | Chemin | Contenu | |---|---| | `/opt/nexcmp` | Le programme : versions, `bin/`, fichiers partagés tels que le générateur de modèles. Propriété de root, accessible en lecture seule pour le service. | | `/etc/nexcmp` | Paramètres de l'installateur (`install.conf`), port et écoute (`nexcmp.env`). | | `/var/lib/nexcmp` | Bases de données SQLite, personnalisation de marque téléversée, dossier de téléchargement des agents, état de la licence, fichiers de clé principale. À sauvegarder. | | `/var/log/nexcmp` | Journaux. | Consultez [Sauvegarde et restauration](https://nexcmp.com/fr/docs/getting-started/backup-and-restore/). Les fichiers de clé principale doivent être sauvegardés avec les bases de données, sous peine qu'une base restaurée ne puisse pas déchiffrer ses identifiants enregistrés. ## Qui se connecte à qui {#who-connects-to-whom} | Sens | Chemin | Port | Remarques | |---|---|---|---| | Client vers panel | Internet, DNS, Cloudflare optionnel, nginx | 443 | Consultez [DNS et Cloudflare](https://nexcmp.com/fr/docs/getting-started/dns-and-cloudflare/). | | Panel vers serveur de licences | `nexcmp.com` | 443 | Activation, vérification quotidienne et mises à jour. | | Panel vers CloudStack | API | 443 ou 8080 | La console VM, la bande passante et les fonctionnalités Kubernetes utilisent le même endpoint. | | Panel vers Proxmox VE | API et console WebSocket | 8006 | Certificat épinglé par SHA-256. | | Panel vers iDRAC | Redfish | 443, VNC 5901 | Réseau de gestion uniquement. | | iDRAC vers serveur ISO | HTTP | votre port | L'iDRAC récupère l'ISO. | | Panel vers Ceph RGW | Admin Ops | 443 | | | Panel vers SMTP | SMTP | 587 ou 465 | | | Panel vers fournisseur d'IA | HTTPS | 443 | Uniquement lorsque le module IA est activé. | | Passerelle de paiement vers panel | Webhook | 443 | Stripe et PayPal effectuent des rappels. | | Nœud vers panel | `cmp-agent` | 443 | Enrôlement, heartbeat, mise à niveau. | | Panel vers nœud proxy IPv6 | SSH | le port saisi | Installation initiale uniquement. | ## Pourquoi c'est important {#why-it-matters} - **Un panel accessible est un panel vulnérable aux attaques.** Laissez le port 3000 fermé une fois l'assistant de configuration terminé. Le programme d'installation s'en charge déjà lorsque TLS est activé. - **Le worker doit être actif** pour que les ressources puissent être créées ou facturées. `sudo nexcmp status` montre les deux services ainsi que le contrôle de santé. - **Configurez les pare-feu sortants.** Si le trafic sortant du serveur du panel est filtré, autorisez les destinations indiquées dans le tableau ci-dessus. - **Le trafic d'administration ne transite pas par le réseau public.** Les connexions vers CloudStack, Proxmox VE, iDRAC et Ceph s'effectuent directement du serveur du panel vers ces systèmes, sans jamais passer par nginx ou Cloudflare. --- # Modules {#modules} > **Emplacement dans l'admin :** System › Admin › License & updates (`/license`), carte **Module**. ## Description {#what-it-does} Un module est un service ou une fonctionnalité que vous pouvez activer ou désactiver globalement. Un module **désactivé** est masqué du menu d'administration et indisponible à l'achat pour les clients ; ses routes d'API renvoient `404 module_disabled` lorsqu'il s'agit d'un add-on. Activer un module ne fait qu'exposer la fonctionnalité : l'infrastructure sous-jacente doit toujours être connectée (voir la dernière colonne). ## Prérequis {#requirements} | Élément | Prérequis | |---|---| | Compte | Un administrateur avec accès en écriture. Le personnel en lecture seule peut voir les commutateurs sans pouvoir les modifier. | | Infrastructure | Voir le tableau : chaque module détaille ses prérequis. | | Dépend de | Certains modules dépendent d'autres (DDoS Shield nécessite DDoS & BGP). | ## Préparer l'infrastructure {#prepare-the-infrastructure} Non requis pour l'activation elle-même. Connectez l'infrastructure de chaque module comme décrit sur la page liée dans le tableau. ## Connecter dans NexCMP {#connect-in-nexcmp} 1. Ouvrez **System › Admin › License & updates** et faites défiler jusqu'à la carte **Module**. Elle indique que les modules désactivés sont masqués du menu d'administration et ne peuvent pas être achetés par les clients. 2. Actionnez le commutateur d'un module. La page confirme **Saved: reloading menu** et se recharge, mettant à jour le menu instantanément. ![La carte Module dans License & updates avec un commutateur pour chaque module](https://nexcmp.com/fr/docs/images/infrastructure/modules-01-license-modules.webp) ### Les modules {#the-modules} | Module (tel qu'affiché) | Valeur par défaut | Ce qu'il apporte | Prérequis | Page | |---|---|---|---|---| | **Virtual Machines** | toujours activé | Catalogue de VM, commandes, console, Snapshots | CloudStack ou Proxmox VE | [CloudStack](https://nexcmp.com/fr/docs/infrastructure/cloudstack/), [Proxmox VE](https://nexcmp.com/fr/docs/infrastructure/proxmox/) | | **Bandwidth** | **activé** | Quotas, add-ons, alertes et actions de dépassement pour les VM, Kubernetes et S3 | Rien de plus (statistiques de VM CloudStack) | [Bandwidth](https://nexcmp.com/fr/docs/catalog/bandwidth/) | | **OS & ISO Images** | désactivé | Les clients enregistrent leurs propres images d'OS et ISO, facturés au Go | CloudStack ; accès Internet pour sa VM de stockage secondaire | [Prérequis](https://nexcmp.com/fr/docs/infrastructure/requirements/) | | **Kubernetes** | désactivé | Clusters Kubernetes (CKS) | CloudStack avec CKS activé | [Kubernetes et Private Cloud](https://nexcmp.com/fr/docs/infrastructure/kubernetes-and-private-cloud/) | | **Private Cloud** | désactivé | VPC avec forfaits de bande passante dédiée | VPC et offres de réseau CloudStack | [Kubernetes et Private Cloud](https://nexcmp.com/fr/docs/infrastructure/kubernetes-and-private-cloud/) | | **Object Storage** | désactivé | Comptes S3 sur Ceph RGW, facturation à l'usage | Ceph RGW et une zone avec le service S3 | [S3](https://nexcmp.com/fr/docs/infrastructure/s3/) | | **VPN** | désactivé | VPN sur vos propres nœuds | Nœuds exécutant `cmp-agent` | [Nœuds VPN et proxy](https://nexcmp.com/fr/docs/infrastructure/vpn-proxy-nodes/) | | **IPv6 Proxy** | désactivé | Proxy IPv6 sur vos propres nœuds | Nœuds proxy avec un préfixe IPv6 | [Nœuds VPN et proxy](https://nexcmp.com/fr/docs/infrastructure/vpn-proxy-nodes/) | | **Bare Metal** | désactivé | Serveurs Dell via iDRAC : commandes, installation d'OS, console, alimentation | iDRAC 9 sur un réseau d'administration | [Serveurs dédiés](https://nexcmp.com/fr/docs/infrastructure/dedicated/) | | **AI Models** | désactivé | Une passerelle pour vendre l'accès à des modèles d'IA: une clé unique pour plusieurs modèles, tarification par modèle, limites d'utilisation, logs, facturation sur portefeuille | Sources de modèles que vous fournissez: une API compatible OpenAI ou Anthropic avec votre propre clé | [AI Models](https://nexcmp.com/fr/docs/infrastructure/ai-models/) | | **AI** | désactivé | AI Chat (support automatisé) et AI Agent (administration de VM en langage naturel) | Un fournisseur compatible OpenAI | [Fournisseurs d'IA](https://nexcmp.com/fr/docs/ai/ai-providers/) | | **DDoS Shield** | désactivé | Protection IP pour les clients ; requiert DDoS & BGP, son commutateur reste donc désactivé sans lui | L'extension DDoS & BGP | ci-dessous | | **DDoS & BGP** | désactivé, **add-on** | Console de routeur de bordure : BGP, RTBH, XDP, sessions et trafic de bordure | Un hôte de bordure avec des démons root | ci-dessous | ### Rôle de chaque commutateur {#which-switch-does-what} - **Bare Metal** comporte deux niveaux. Le commutateur du module affiche le menu d'administration et l'API. La vente aux clients correspond à un commutateur distinct avec confirmation saisie sous **Services › Dedicated Server**, et chaque écriture vers un iDRAC est bloquée tant que vous n'activez pas **live ops** sous **Infrastructure › Bare Metal › Safety**. Voir [Serveurs dédiés](https://nexcmp.com/fr/docs/infrastructure/dedicated/). - Pour **Kubernetes**, **Private Cloud**, **VPN**, **IPv6 Proxy** et **Images**, le commutateur du module et celui des ventes sur la page du service agissent sur le même paramètre. - **AI** requiert également la configuration d'un fournisseur sous **System › Settings › AI provider**. - **AI Models** comporte deux niveaux. L'interrupteur du module affiche le menu d'administration et l'API. La vente aux clients dépend d'un interrupteur distinct en haut des pages AI Models, désactivé par défaut. Voir [AI Models](https://nexcmp.com/fr/docs/infrastructure/ai-models/). ### Modules lus au démarrage {#modules-read-at-start-up} Trois fonctionnalités ne sont pas de simples commutateurs. Elles sont lues **une seule fois au démarrage des services** et nécessitent une infrastructure non incluse dans l'installation standard. | Fonctionnalité | Paramètre | État | Prérequis | |---|---|---|---| | DDoS & BGP | `module_ddos` | Affiché comme **Add-on package** lorsqu'il est désactivé, **Installed** lorsqu'il est activé. Aucun commutateur n'est présent dans la console. | Démons de routeur de bordure (BGP, RTBH, XDP, statistiques de flux) exécutés en tant que root. Le panneau s'exécute sous un utilisateur non privilégié et ne peut pas les lancer. | | AI | `module_ai` | Un commutateur classique. Les routes s'adaptent immédiatement ; les tâches de fond d'AI Chat (analyse de tickets, réponses planifiées) démarrent au prochain redémarrage des services. La console indique qu'un redémarrage est recommandé. | Le fournisseur d'IA. | | Terminal Web SSH | `feature_ssh_web` | Désactivé par défaut, aucun commutateur dans la console | Un service proxy SSH distinct et sa route. Sans lui, l'onglet Console du portail n'affiche que VNC. L'**AI Agent n'en a pas besoin** : il exécute les commandes via une connexion SSH établie directement par le panneau. | Après modification d'un paramètre de démarrage, redémarrez les services : `sudo systemctl restart nexcmp nexcmp-vmd`. ## Vérification {#verify} 1. L'entrée de menu du module apparaît (ou disparaît) après le rechargement. 2. Pour un module côté client, le portail affiche la nouvelle entrée de menu pour un client connecté. Un module désactivé n'affiche rien ou « coming soon ». ## Limites et remarques {#limits-and-notes} - Désactiver un module ne supprime rien. Les VM en cours d'exécution, clusters, comptes S3 et abonnements continuent de fonctionner et d'être facturés ; les clients ne peuvent simplement plus en créer de nouveaux. - Les pages de quotas ne listent que les services dont les modules sont activés. ## Dépannage {#troubleshooting} | Symptôme | Cause | Solution | |---|---|---| | L'entrée de menu n'est pas apparue | La page n'a pas été rechargée | Rechargez la console d'administration. | | L'interrupteur DDoS Shield est désactivé | DDoS & BGP n'est pas installé | DDoS Shield nécessite l'add-on DDoS & BGP. | | « This module is an add-on package and cannot be switched here » (HTTP 409 ou 422) | Vous (ou un script) avez tenté de basculer DDoS & BGP | Il s'agit d'un add-on ; il n'y a pas d'interrupteur. | | « DDoS Shield needs the DDoS & BGP add-on » | Idem, pour DDoS Shield | Installez d'abord l'add-on. | | Une route de module renvoie 404 `module_disabled` | Le module est désactivé | Activez le module. | | AI Chat répond mais l'investigation du ticket ne démarre jamais | Le module d'IA a été activé sans redémarrage | `sudo systemctl restart nexcmp nexcmp-vmd`. | | Le personnel en lecture seule ne peut pas enregistrer | Leur rôle est en lecture seule | Utilisez un compte administrateur. | --- # Zones {#zones} > **Dans l'administration :** Infrastructure › Datacenter › Zone (`/infra/zones`). La page de détails d'une zone est `/infra/zones/`. ## Description {#what-it-does} Une **zone** est l'emplacement choisi par le client lors de sa commande : un pays et une ville avec un drapeau, ainsi que les services qui y sont vendus. C'est un concept commercial, distinct des zones, clusters et nœuds des plateformes sous-jacentes. Derrière une zone, vous associez l'**infrastructure** : une zone CloudStack, un cluster Proxmox VE, des nœuds VPN avec plages IP, un backend S3. La zone 1 est créée par l'[assistant de configuration](https://nexcmp.com/fr/docs/getting-started/setup-wizard/), avec le nom d'affichage et le pays saisis. Ajoutez d'autres zones lorsque vous disposez d'infrastructures supplémentaires, ou pour attribuer un emplacement propre à VPN et S3. ## Prérequis {#requirements} | Élément | Prérequis | |---|---| | Permissions | Un compte administrateur. Un rôle en lecture seule peut consulter mais pas modifier. | | Infrastructure | Une zone ne vend rien tant qu'aucun élément ne lui est associé (voir « Quel service vend où » ci-dessous). | | Dépend de | [CloudStack](https://nexcmp.com/fr/docs/infrastructure/cloudstack/) ou [Proxmox VE](https://nexcmp.com/fr/docs/infrastructure/proxmox/) pour les VM, [nœuds VPN et proxy](https://nexcmp.com/fr/docs/infrastructure/vpn-proxy-nodes/) pour le VPN, [S3](https://nexcmp.com/fr/docs/infrastructure/s3/) pour le stockage objet. | ## Préparer l'infrastructure {#prepare-the-infrastructure} Non requis. Une zone est un enregistrement interne à NexCMP. ## Connecter dans NexCMP {#connect-in-nexcmp} ### Créer une zone {#create-a-zone} 1. Ouvrez **Infrastructure › Datacenter › Zone** et cliquez sur **Add zone**. 2. Remplissez le formulaire : | Champ | Exemple de valeur | Remarques | |---|---|---| | Pays | `United States` | Définit le drapeau. | | Ville | `New York` | Facultatif. | | Nom (vietnamien), Nom (anglais) | `New York` | Le nom affiché aux clients selon chaque langue. | | Slug | `us-new-york` | a-z, 0-9, tiret, 2-32 caractères. Rempli automatiquement selon le pays et la ville jusqu'à saisie manuelle. | | Visibilité | Public | Les zones **Public** sont visibles par tous les clients; les zones **Hidden** ne sont attribuées que par un administrateur. | | Ordre | `0` | Les numéros les plus bas apparaissent en premier dans les listes. | | Services vendus dans cette zone | Machines virtuelles (VM), VPN, Object Storage (S3) | Cochez au moins une option. | | Actif | On | **Off** masque la zone aux clients. | | Valeur par défaut | désactivé | La zone présélectionnée pour les clients qui n'en ont pas choisi. Une seule zone peut être celle par défaut. | ![Boîte de dialogue Add zone avec un pays, une ville, un slug et les services cochés](https://nexcmp.com/fr/docs/images/infrastructure/zones-01-add-zone.webp) 3. Cliquez sur **Create zone**. La liste affiche la zone avec son drapeau, son propriétaire, ses services, son état ainsi que le nombre de VM, de plans et d'infrastructures associées. ![Liste des zones avec la zone par défaut et une deuxième zone](https://nexcmp.com/fr/docs/images/infrastructure/zones-02-list.webp) ### Voir les éléments rattachés {#look-at-what-is-attached} Cliquez sur une ligne pour ouvrir la zone. L'onglet **Provider infrastructure** répertorie chaque backend rattaché avec son fournisseur, son type (CloudStack ou Proxmox VE), sa région, son état et sa priorité. L'onglet **VPN infrastructure** liste les plages et les nœuds VPN de la zone et renvoie vers le pool VPN. ![Détail de la zone avec l'onglet Provider infrastructure](https://nexcmp.com/fr/docs/images/infrastructure/zones-03-detail.webp) ### Quel service est vendu où {#which-service-sells-where} | Service | Comment il est associé à une zone | |---|---| | Machines virtuelles sur CloudStack | L'assistant (ou **Infrastructure › Cloud provider › CloudStack**) associe CloudStack à la zone 1. | | Machines virtuelles sur Proxmox VE | Dans l'onglet **Clusters** du cluster, utilisez **Attach cluster to zone**. Le cluster rejoint une zone **existante**, généralement celle qui vend via CloudStack. | | VPN | Un nœud VPN qui signale ses plages d'adresses IP publiques crée (ou rejoint) une zone correspondant à son pays et ajoute les plages au pool VPN. Vous pouvez également assigner la zone et le nœud d'une plage sous **VPN IP pools**. | | IPv6 Proxy | Un nouveau nœud IPv6 proxy crée sa zone avec l'état **off**. Activez la zone ici pour que les clients puissent la choisir. | | Object Storage (S3) | Cochez le service S3 sur la zone, puis rattachez le backend sous **Ceph S3 (RGW)**. | ### Quand une zone peut-elle vendre des machines virtuelles ? {#when-can-a-zone-sell-virtual-machines} Une zone affiche le tag **not ready to sell VMs** tant qu'elle ne dispose pas d'au moins un backend actif et vendable **et** d'au moins un plan visible **et** d'au moins un template prêt sur ce backend. Le formulaire de commande client ne liste que les zones prêtes. ## Vérification {#verify} 1. La zone apparaît dans la liste avec l'état **On** et le bon drapeau. 2. Sa page de détails affiche le backend ou les plages VPN attendus. 3. Pour les VM : le tag **not ready to sell VMs** a disparu. Dans le portail client, commencez une commande et vérifiez que la zone est proposée. ## Limites et remarques {#limits-and-notes} - Dans cette version de NexCMP, les clients commandent des machines virtuelles dans la **zone par défaut** (zone 1). Les autres zones sont utilisées pour le VPN, IPv6 Proxy et Object Storage, ou pour préparer un emplacement avant qu'il ne dispose d'une infrastructure ; la note sous la liste des zones indique la même chose. - Une zone ne peut être supprimée que si rien n'y est rattaché : aucun backend, VM, plan ou plage VPN. La zone par défaut ne peut pas être supprimée ; définissez d'abord une autre zone par défaut. - Les zones appartenant à un revendeur peuvent uniquement être activées ou désactivées et masquées ou affichées par vous ; leurs autres champs sont verrouillés. - Le slug fait partie des références internes. Définissez-le une fois pour toutes. ## Dépannage {#troubleshooting} | Symptôme | Cause | Solution | |---|---|---| | "Nom de zone requis" / "Sélectionnez un pays" / "Sélectionnez au moins 1 service" | Un champ obligatoire est vide | Renseignez le nom, choisissez le pays et cochez un service. | | "Slug non valide (a-z 0-9 -, 2-32 caractères)" | Le slug contient d'autres caractères ou n'a pas la bonne longueur | Utilisez uniquement des lettres minuscules, des chiffres et des tirets. | | Tag "non prêt pour la vente de VM" | Aucun backend actif vendable, aucun plan ou aucun template prêt dans cette zone | Rattachez l'infrastructure, puis ajoutez un plan et un template. Voir [Plans](https://nexcmp.com/fr/docs/catalog/plans/) et [Templates](https://nexcmp.com/fr/docs/infrastructure/templates/). | | Suppression désactivée avec "still attached" | La zone contient des backends, des VM, des plans ou des plages VPN | Supprimez-les ou déplacez-les d'abord. | | Suppression désactivée avec "Default zone" | La zone est définie par défaut | Définissez une autre zone par défaut. | | Les clients ne voient pas la zone | Elle est masquée, inactive ou n'a aucun service coché | Passez Visibility à Public, Active à On et cochez le service. | | Une zone S3 est absente du formulaire de backend | Le service S3 n'est pas coché sur la zone | Modifiez la zone et cochez **Object Storage (S3)**. | --- # CloudStack > **Dans l'admin:** Infrastructure › Cloud provider › CloudStack › API connection (`/infra/cloudstack?tab=connect`). La première connexion peut aussi se faire à l'étape 2 du [setup wizard](https://nexcmp.com/fr/docs/getting-started/setup-wizard/). ## Description {#what-it-does} NexCMP vend des machines virtuelles exécutées sur votre cloud Apache CloudStack. Il déploie, démarre, arrête, redimensionne, snapshotte et supprime les VM via l'API CloudStack, attribue les adresses IP publiques de la zone, relève l'usage pour la facturation et la bande passante, et affiche la capacité et l'état de santé dans la console admin. CloudStack reste la source de référence pour les hyperviseurs; NexCMP constitue la vitrine, la facturation et le portail par-dessus. Consultez cette page si CloudStack est (ou sera) votre source principale de VM. Pour ajouter une seconde source à ses côtés, voir [Proxmox VE](https://nexcmp.com/fr/docs/infrastructure/proxmox/). ## Prérequis {#requirements} | Élément | Prérequis | |---|---| | Version de CloudStack | 4.23 est la version testée. La console VM nécessite la version 4.18 ou plus récente, et le redimensionnement à chaud du CPU/RAM d'une VM active nécessite la 4.23 avec KVM. | | Type de zone | Une zone avec au moins un réseau invité pour les VM des clients et une plage d'IP publiques disposant d'adresses libres. | | Hyperviseur | KVM est l'hyperviseur testé. | | Compte | Un **domaine et un compte dédiés** créés pour NexCMP. N'utilisez jamais la clé administrateur ROOT. | | Accessibilité de l'API | Le serveur du panneau doit pouvoir joindre l'URL de l'API du management server (`https://cloudstack.example.com/client/api`) en HTTP(S). La console VM, la bande passante et les fonctionnalités Kubernetes utilisent le même endpoint. | | Clé en lecture seule optionnelle | Une seconde clé en lecture seule permet à la console admin d'afficher les hôtes, le stockage, les VM système et les plages d'IP publiques. Facultative pour la vente de VM. | | IP publique | Adresses IPv4 publiques libres dans la zone. Le préfixe que NexCMP peut commercialiser se configure sous Sales IP pools. | | Templates | Au moins un modèle prêt avec mot de passe activé et une offre de service visible par votre compte. Voir [Templates](https://nexcmp.com/fr/docs/infrastructure/templates/). | | Stockage | Stockage primaire pour les volumes du compte et, si vous vendez des snapshots ou des images, stockage secondaire. | | Dépend de | Rien. Kubernetes, Private Cloud, Images et Bandwidth dépendent de cette page. | ::: warning N'utilisez pas la clé administrateur ROOT Créez un domaine et un compte dédiés pour NexCMP. La clé n'accède ainsi qu'à ce domaine, et une clé compromise ne peut pas toucher le reste de votre cloud. L'assistant d'installation vérifie également que le réseau choisi appartient à la zone **et** au compte propriétaire de la clé. ::: ## Préparer l'infrastructure {#prepare-the-infrastructure} Les commandes utilisent [CloudMonkey](https://cloudstack.apache.org/) (`cmk`) connecté en tant qu'administrateur CloudStack. Remplacez les exemples de noms et les espaces réservés entre crochets angulaires. ### Créer un compte et une clé API dédiés {#create-a-dedicated-account-and-api-key} 1. Créez le domaine qui contiendra tout ce qui appartient à NexCMP. ```bash cmk create domain name=nexcmp ``` Notez l'identifiant `id` dans la sortie ; il est utilisé comme `` ci-dessous. 2. Trouvez le rôle que vous souhaitez attribuer au compte. ```bash cmk list roles type=DomainAdmin filter=id,name ``` | Rôle | Quand le choisir | |---|---| | **Domain Admin** (recommandé) | Ensemble complet de fonctionnalités : VM, réseaux, projets pour Kubernetes, VPC, images. Sa portée s'arrête au domaine `nexcmp`. | | Utilisateur | Cycle de vie des VM uniquement. Un utilisateur standard ne peut pas purger les VM sauf si le paramètre global `allow.user.expunge.recover.vm` est défini sur true ; NexCMP arrête alors la VM et CloudStack la purge après `expunge.delay`. | 3. Créez le compte et son premier utilisateur. Utilisez un mot de passe aléatoire long ; il ne sera plus jamais saisi. ```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. Générez la paire de clés API pour le nouvel utilisateur. ```bash cmk list users domainid= username=nexcmp-api filter=id,username cmk generate userkeys id= ``` Copiez `apikey` et `secretkey`. Ce sont la **API key** et la **Secret key** à saisir dans NexCMP. NexCMP les stocke de manière chiffrée et n'affiche plus que les quatre derniers caractères par la suite. 5. Assurez-vous que le domaine ne possède pas de limites de ressources restrictives (instances, volumes, IP publiques, réseaux, snapshots, templates, projets). ```bash cmk list resourcelimits domainid= ``` ### Créer le réseau invité pour les VM des clients {#create-the-guest-network-for-customer-vms} Les VM des clients sont déployées dans un réseau invité appartenant au nouveau compte. Un réseau isolé avec un routeur virtuel (VR) et les services Static NAT, Firewall et Port Forwarding fonctionne bien, car NexCMP associe une IP publique à chaque VM via le NAT statique. ```bash cmk list networkofferings state=Enabled guestiptype=Isolated filter=id,name cmk create network name=customers displaytext=customers zoneid= \ networkofferingid= account=nexcmp-api domainid= ``` Vérifiez la politique de sortie par défaut de l'offre : si elle est définie sur "deny", les VM des clients n'ont aucun accès sortant tant que des règles de pare-feu de sortie ne sont pas ajoutées. ### Rendre les offres et les templates visibles {#make-offerings-and-templates-visible} - **Service offerings** et **network offerings** doivent être publics ou assignés au domaine `nexcmp`, sinon le compte ne peut pas les lister ni les utiliser. - Enregistrez ou partagez au moins un template (voir [Templates](https://nexcmp.com/fr/docs/infrastructure/templates/)). NexCMP liste les templates prêts et mis en avant. ### Optionnel : clé en lecture seule pour les pages d'infrastructure {#optional-read-only-key-for-infrastructure-pages} Les onglets **Capacity**, **Host**, **Storage**, **System VM** et la liste des plages d'IP publiques utilisent une seconde clé qui nécessite uniquement un accès en lecture à six commandes. Créez un rôle limité au lieu de réutiliser une clé d'administrateur complet : ```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 ``` Créez ensuite un compte doté de ce rôle (dans le domaine ROOT, car il lit les données de l'ensemble des zones), générez ses clés comme à l'étape 4, et saisissez-les comme **RO API key** dans la section suivante. ### Vérifier le chemin réseau {#check-the-network-path} Depuis le serveur du panneau : ```bash curl -fsS -o /dev/null -w '%{http_code}\n' https://cloudstack.example.com/client/api ``` N'importe quelle réponse HTTP (même 4xx) prouve que le port est joignable. Un délai d'attente (timeout) indique un problème de pare-feu ou de DNS de votre côté. ## Connecter dans NexCMP {#connect-in-nexcmp} ### Dans l'assistant d'installation {#in-the-setup-wizard} L'étape 2 de l'[setup wizard](https://nexcmp.com/fr/docs/getting-started/setup-wizard/) demande les mêmes valeurs. **Test connection** liste les zones et les réseaux visibles par la clé ; choisissez la zone et le réseau invité, un nom d'affichage pour la zone et le pays, puis cliquez sur **Save CloudStack**. L'assistant rejette un réseau qui n'est pas dans cette zone ou qui n'est pas visible par la clé. ![Étape 2 de l'assistant avec l'URL de l'API CloudStack, les clés renseignées, ainsi que la zone et le réseau choisis après Test connection](https://nexcmp.com/fr/docs/images/infrastructure/cloudstack-01-wizard-step.webp) ### Plus tard, dans la console d'administration {#later-in-the-admin-console} 1. Ouvrez **Infrastructure › Cloud provider › CloudStack** et choisissez l'onglet **API connection**. 2. Remplissez la carte **Connection** : | Champ | Exemple de valeur | |---|---| | Endpoint API | `https://cloudstack.example.com/client/api` | | Clé API (accès en écriture) | `XXXX` (laisser vide pour conserver la clé enregistrée) | | Clé secrète | `XXXX` | | Clé API RO / Clé secrète RO | optionnel, depuis le compte en lecture seule | | ID de zone | l'UUID de votre zone | ![L'onglet de connexion API avec un exemple d'endpoint et des clés masquées](https://nexcmp.com/fr/docs/images/infrastructure/cloudstack-02-connect-form.webp) 3. Cliquez sur **Test connection** avant d'enregistrer. Cela teste les clés saisies sans les enregistrer : la clé d'écriture avec `listZones` et `listCapabilities`, et la clé en lecture seule avec `listSystemVms`. 4. Cliquez sur **Save connection**. Laissez **Enable CloudStack connection** activé ; le désactiver arrêtera toutes les tâches CloudStack du worker, sans perte de données. 5. Ouvrez **Services › Virtual Machines › Policy › Provisioning** pour définir le réseau invité par défaut, les offres personnalisées et la paire de clés SSH par défaut pour les nouvelles machines virtuelles. ![Politique de VM, onglet Provisioning, avec l'ID du réseau par défaut](https://nexcmp.com/fr/docs/images/infrastructure/cloudstack-04-provisioning.webp) 6. Ouvrez **Infrastructure › Cloud provider › Sales IP pools** et, sous **Configure sales ranges**, définissez les **Sellable IP range prefixes** (par exemple `203.0.113.`) ainsi que les **préfixes IP exclus** si certaines adresses de la zone ne doivent jamais être vendues. Laissez le préfixe vide pour autoriser toutes les adresses libres. ![Pools d'adresses IP de vente avec le préfixe vendable 203.0.113. défini](https://nexcmp.com/fr/docs/images/infrastructure/cloudstack-05-sales-ip-pool.webp) ### Ce que NexCMP lit et écrit {#what-nexcmp-reads-and-writes} | Domaine | Lectures | Modifications | |---|---|---| | VMs | liste, états, historique d'utilisation, endpoint de console | déployer, démarrer, arrêter, redémarrer, réinstaller, supprimer, redimensionner, réinitialiser le mot de passe et la clé SSH | | Disques et instantanés | volumes, instantanés de VM, sauvegardes | créer, attacher, détacher, redimensionner, supprimer, instantané, restaurer | | Réseau | réseaux, routeurs, IP publiques, pare-feu, redirection de port, règles de répartition de charge | associer et libérer des IP publiques, NAT statique, pare-feu, redirection de port, règles de trafic sortant, réseaux et ACL pour le Cloud Privé | | Catalogue | offres de service, de disque et de réseau, modèles, ISO, types de système d'exploitation | enregistrer et supprimer des modèles et des ISO (Images), offres de service lors de la création de plans personnalisés | | Kubernetes | versions prises en charge, clusters, configuration | projets, limites de ressources, réseaux, clusters (module Kubernetes) | | Clé en lecture seule | hôtes, clusters, pools de stockage, VM système, capacité, plages IP VLAN | aucun | ### CPU et RAM en direct, et bande passante {#live-cpu-and-ram-and-bandwidth} - **Hot-plug.** Une VM en cours d'exécution peut être redimensionnée sans redémarrage uniquement lorsque son modèle le permet (extensible dynamiquement) et que le système invité active de nouveaux CPU et de la RAM. NexCMP active Auto Scaling pour les modèles dont le nom se termine par `vN` avec N supérieur ou égal à 6, ou lorsque vous le définissez manuellement dans le champ **vCPU/RAM hot-plug** du modèle. Voir [Templates](https://nexcmp.com/fr/docs/infrastructure/templates/). - **Source de la bande passante.** Avec les paramètres par défaut, NexCMP mesure le trafic à partir des statistiques de VM CloudStack (`listVirtualMachinesUsageHistory`, interrogées toutes les 5 minutes et additionnées par interface réseau de VM). Les chiffres incluent le trafic entre les VM, ils peuvent donc être légèrement supérieurs à ce qu'un routeur de périphérie compterait. Maintenez la collecte des statistiques de VM CloudStack activée ; les lacunes supérieures à la rétention des statistiques sont ignorées. Voir [Bandwidth](https://nexcmp.com/fr/docs/catalog/bandwidth/). ## Vérification {#verify} 1. **Test connection** renvoie « Write key: OK » avec votre zone et la version de CloudStack. 2. **Infrastructure › Cloud provider › Providers** affiche le fournisseur comme actif avec une heure de test récente. Le panneau de santé du tableau de bord n'affiche plus « CloudStack: not connected ». 3. **Sales IP pools** liste les adresses libres (actualisation environ une fois par minute). 4. Commandez une petite VM depuis le portail client ou la console d'administration et vérifiez qu'elle atteint l'état Running, qu'elle dispose d'une IP publique et que vous pouvez ouvrir la console. ## Limites et remarques {#limits-and-notes} - Un seul cluster CloudStack peut être connecté dans cette version de NexCMP. La boîte de dialogue **Add cloud provider** peut tester les clés d'un second cluster mais ne peut pas les enregistrer. - Une seule zone CloudStack est attachée à la zone par défaut de NexCMP ; un CloudStack avec plusieurs zones est limité à la zone que vous saisissez, de sorte que les VM, IP et réseaux des autres zones sont ignorés. - La suppression du réseau invité dans CloudStack entraîne l'échec de chaque nouveau déploiement. La console d'administration affiche un avis rouge lorsque le réseau disparaît. - Les identifiants ne quittent jamais le serveur. L'API ne renvoie que les quatre derniers caractères. ## Dépannage {#troubleshooting} | Symptôme | Cause | Solution | |---|---|---| | `listCapabilities: cloudstack 401: unable to verify user credentials and/or request signature` | Clé ou secret d'API incorrect, clé d'un autre utilisateur ou problème d'horloge sur le serveur du panneau | Générez à nouveau les clés avec `cmk generate userkeys` et collez les deux. Vérifiez l'heure du serveur du panneau. | | Test : `listZones: …` ou délai d'attente dépassé | Le serveur du panneau ne peut pas joindre l'URL de l'API | Vérifiez le DNS, le pare-feu et le chemin `/client/api` exact. | | Assistant : « network not found in that zone for this API key » | Le réseau choisi appartient à un autre compte ou à une autre zone | Créez le réseau dans le compte dédié (voir ci-dessus) et exécutez à nouveau **Test connection**. | | Assistant : « pick a zone and a network » | Test non exécuté, ou aucune zone ni aucun réseau sélectionné | Cliquez sur **Test connection** et choisissez les deux listes. | | Bannière « CloudStack key not configured » | Aucune clé enregistrée pour l'instant (« Connect later ») | Remplissez la carte Connection, **Save connection**, puis **Test connection**. | | Bannière « CloudStack connection is OFF » | Le commutateur **Enable CloudStack connection** est désactivé | Activez-le et enregistrez. | | Clé en lecture seule : « unusable … » lors du test | Permission de rôle manquante ou compte erroné | Vérifiez les six commandes autorisées et assurez-vous que le compte se trouve dans le domaine ROOT. | | « Zone public IP ranges not measured yet » ou « no public IP ranges declared » | Pas de clé en lecture seule, ou la zone n'a vraiment aucune plage publique | Ajoutez la clé en lecture seule ou ajoutez une plage d'IP publiques dans CloudStack. | | "Pool vide — attendez 60 s pour la synchronisation vmd" | La liste des IP est actualisée par le worker une fois par minute | Attendez une minute et rechargez. | | "plus d'IP libres dans la plage 203.0.113." | Toutes les adresses du préfixe vendable sont occupées | Ajoutez des adresses à la zone, élargissez le préfixe ou libérez les IP inutilisées. | | "Échec de la récupération des données réseau (CloudStack ne répond pas ou la clé manque de permissions)" | La clé a perdu l'accès ou CloudStack est hors ligne | Exécutez **Test connection** ; vérifiez que le compte est activé. | | "Le réseau invité N'EXISTE PAS" | Le réseau a été supprimé dans CloudStack | Créez à nouveau le réseau et définissez-le comme valeur par défaut sous Provisioning. | --- # Proxmox VE > **Où dans l'administration :** Infrastructure › Cloud provider › Providers (`/infra/providers`), puis la page du fournisseur (`/infra/providers/`) avec les onglets Overview, Clusters, VMs, Servers et Credentials. Les plans se paramètrent sous Services › Virtual Machines › Plans & pricing (`/vm/catalog`). ## Description {#what-it-does} NexCMP peut vendre des machines virtuelles s'exécutant sur un ou plusieurs clusters Proxmox VE, en complément ou à la place de CloudStack. Une VM est créée en clonant un modèle d'OS par clonage intégral, puis configurée via cloud-init : taille, adresse IP issue d'un pool que vous définissez, mot de passe root et clé SSH. Les clients bénéficient du contrôle d'alimentation, de la console, des instantanés, de la réinstallation, de la réinitialisation du mot de passe et des métriques dans le portail. Ils ne voient jamais le nom du cluster, du nœud ou de la source. À utiliser lorsque vous exploitez déjà Proxmox VE, ou pour proposer un second pool de VM aux tarifs différents. ## Prérequis {#requirements} | Élément | Prérequis | |---|---| | Proxmox VE | PVE 9.x. L'intégration a été vérifiée sur la version 9.2. Elle nécessite le contenu de stockage `import` et l'option de disque `import-from` (PVE 8.2 ou version ultérieure). | | Réseau depuis le panneau | HTTPS vers l'API du cluster, `https://:8006`. Aucun chemin, nom d'utilisateur ou requête. Le panneau et le worker s'y connectent tous les deux ; la console du navigateur passe par un proxy via le panneau. | | Compte | Un utilisateur PVE dédié doté d'un **jeton API** et d'un rôle personnalisé disposant des privilèges listés ci-dessous. N'utilisez jamais `root@pam`. | | Stockage | Un stockage pour les disques de VM prenant en charge les clones (par exemple `local-lvm`). Pour le générateur de modèles intégré, le stockage nommé `local` avec les types de contenu `import` et `snippets`. | | Réseau | Un bridge Linux (par exemple `vmbr0`) atteignant le réseau où résident les IP des clients. Utilisez un bridge compatible VLAN si vous saisissez un identifiant de VLAN. | | IP | Un bloc IPv4 (/16 à /30) routé vers ce bridge, avec une passerelle. NexCMP attribue les adresses lui-même ; Proxmox ne gère pas les IP. | | Templates | Une machine virtuelle modèle cloud-init par OS, sur chaque nœud où vous déployez, avec l'agent QEMU guest. | | Zone | Une zone existante à laquelle rattacher le cluster. Voir [Zones](https://nexcmp.com/fr/docs/infrastructure/zones/). | | Dépend de | Aucun. | ## Préparer l'infrastructure {#prepare-the-infrastructure} Exécutez les commandes en tant que root sur n'importe quel nœud du cluster. ### 1. Créer un rôle, un utilisateur et un jeton API à privilèges minimaux {#_1-create-a-least-privilege-role-user-and-api-token} 1. Créez le rôle. La liste des privilèges correspond exactement à ce que NexCMP utilise ; elle ne contient rien qui modifie les utilisateurs, les définitions de stockage ou le centre de données. ```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` est requis pour le téléchargement de l'image cloud. PVE 9 ne possède pas le privilège `VM.Monitor` ; ne l'ajoutez pas. 2. Créez l'utilisateur et un jeton. `--privsep 1` signifie que les droits du jeton correspondent à **l'intersection** des permissions propres de l'utilisateur et de celles du jeton. ```bash pveum user add nexcmp@pve --comment "NexCMP" pveum user token add nexcmp@pve api --privsep 1 ``` La commande affiche le **secret du token une seule fois** (un UUID). Copiez-le maintenant. L'id du token est `nexcmp@pve!api`. 3. Attribuez le rôle **à la fois** à l'utilisateur et au token. C'est l'étape souvent oubliée: avec la séparation des privilèges, l'attribuer uniquement au token entraîne des erreurs 403 telles que `Datastore.Audit` si l'utilisateur n'a pas de permission. ```bash pveum acl modify / --roles NexCMP --users nexcmp@pve pveum acl modify / --roles NexCMP --tokens 'nexcmp@pve!api' ``` 4. Testez-le depuis le serveur du panel: ```bash curl -sk -H 'Authorization: PVEAPIToken=nexcmp@pve!api=' https://192.0.2.10:8006/api2/json/version ``` Un document JSON contenant `version` signifie que le token fonctionne. (`-k` sert uniquement pour ce test rapide; NexCMP épingle lui-même le certificat, voir ci-dessous.) ### 2. Vérifier le bridge et le stockage {#_2-check-the-bridge-and-the-storage} ```bash pvesm status # storages, type, content and free space ip -br link show type bridge ``` - Les VM clientes reçoivent des interfaces réseau `virtio` sur le bridge renseigné dans NexCMP. Si vous définissez un VLAN, le bridge doit être VLAN-aware. - Placez les VM clientes sur un bridge ou un VLAN **séparé de l'adresse de gestion du nœud**. S'ils partagent le même réseau, l'IP set de gestion automatique du pare-feu Proxmox ouvre les ports 22, 8006, 3128, 5900-5999 et 60000-60050 du nœud à toutes les VM de ce réseau. Si vous ne pouvez pas les séparer, ajoutez au-dessus de la règle ACCEPT de gestion une règle DROP explicite pour le sous-réseau des VM vers ces ports. ### 3. Remarques sur le stockage (LVM-thin) {#_3-storage-notes-lvm-thin} - Laissez le **zeroing du thin-pool sur sa valeur par défaut**. Le désactiver (`lvchange -Zn`) peut laisser d'anciennes données dans les blocs nouvellement alloués et corrompre les tables de partition ou les systèmes de fichiers des VM clonées. - Les disques qui indiquent "write cache: disabled" peuvent cloner à seulement quelques Mo/s. Vérifiez avec `hdparm -W /dev/sdX` et activez le cache d'écriture si le disque dispose d'une protection contre les coupures de courant. ### 4. Activer le contenu `import` (uniquement pour le créateur de modèles intégré) {#_4-enable-the-import-content-only-for-the-built-in-template-builder} Le générateur intégré télécharge l'image cloud dans le stockage nommé `local` et crée le modèle à partir de celle-ci. Ajoutez `import` (et `snippets`) à la liste des contenus de ce stockage. Conservez les types que vous utilisez déjà; `--content` remplace la liste entière: ```bash pvesm status --storage local # note the current content pvesm set local --content iso,vztmpl,backup,import,snippets ``` ### 5. Créer un modèle d'OS à partir d'une image cloud {#_5-build-an-os-template-from-a-cloud-image} Un modèle est une VM cloud-init que NexCMP clone. Chacun est enregistré sous une **OS key** courte telle que `ubuntu-24.04` avec son id de VM. Créez un modèle par OS **sur chaque nœud destiné à recevoir des VM**, car le clone s'exécute sur le nœud sélectionné. **Option A, recommandée: construisez-le vous-même.** Les images cloud Ubuntu et Debian standard ne contiennent pas le guest agent et n'autorisent pas la connexion root, or NexCMP définit le mot de passe root via cloud-init. Préparez d'abord l'image: ```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' ``` Créez ensuite la VM modèle (l'id 9000 est un exemple; conservez les id de modèles sous la valeur `vmid from`, par défaut 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 ``` **Option B : le générateur intégré.** La carte **Create OS template from cloud image** de l'onglet Clusters (voir plus bas) télécharge une image qcow2, génère le template et l'enregistre. Elle crée la VM avec cloud-init et le flag du guest agent, mais ne modifie pas le contenu de l'image. Utilisez-la uniquement avec une image autorisant déjà la connexion root et exécutant le guest agent, ou si vous fournissez également un extrait vendor-data cloud-init. Le guest agent est requis pour **Reset password** et pour afficher l'adresse IP de la VM. ### 6. Connaître l'empreinte du certificat (optionnel) {#_6-know-the-certificate-fingerprint-optional} NexCMP fait confiance au cluster en épinglant l'empreinte SHA-256 de son certificat TLS, un certificat auto-signé convient donc parfaitement. Pour voir la valeur que NexCMP va épingler : ```bash openssl x509 -in /etc/pve/local/pve-ssl.pem -noout -fingerprint -sha256 ``` ## Connecter dans NexCMP {#connect-in-nexcmp} 1. Ouvrez **Infrastructure › Cloud provider › Providers** et cliquez sur **Add cloud provider**. Choisissez **Proxmox VE** et renseignez : | Champ | Exemple de valeur | |---|---| | Name | `Proxmox cluster 1` | | Endpoint | `https://192.0.2.10:8006` | | Token id | `nexcmp@pve!api` | | Token secret | `XXXX` (l'UUID affiché à l'étape 1) | | Slug | `pve-1` (a-z, 0-9, tiret, 2-32 caractères) | | Default node | `pve1` (vide : le nœud en ligne disposant de la plus grande RAM libre) | | Stockage | `local-lvm` | | Bridge | `vmbr0` | ![Boîte de dialogue Ajouter un fournisseur de cloud avec Proxmox VE sélectionné et des exemples de valeurs pour l'endpoint, le jeton et le stockage](https://nexcmp.com/fr/docs/images/infrastructure/proxmox-01-add-provider.webp) 2. Cliquez sur **Save & open provider**, puis saisissez un motif lorsque vous y êtes invité. Le jeton est chiffré avant d'être stocké. 3. Sous l'onglet **Overview**, cliquez sur **Test connection**. Le premier test réussi **épingle l'empreinte TLS du cluster** ; par la suite, tout certificat différent sera refusé. 4. Ouvrez l'onglet **Clusters**. La carte **Node · storage · bridge** indique ce que l'API détecte, tandis que la carte **Cluster configuration** regroupe les paramètres : | Champ | Description | |---|---| | Default node | Nœud utilisé pour les nouvelles VM. Vide signifie le nœud en ligne disposant de la plus grande RAM libre. | | Storage, Bridge, VLAN | Stockage disque, pont réseau (NIC bridge) et balise VLAN facultative (0 signifie aucun). | | CPU type | `host` par défaut. Utilisez `x86-64-v2-AES` lorsque les nœuds possèdent différentes générations de processeurs. | | vmid from | Premier ID de VM attribué aux VM des clients (1000 par défaut). | | Storage ISO, Storage backup | Laissez vide sauf si vous les utilisez ; vide signifie que les fonctionnalités ISO et de sauvegarde ne sont pas proposées. | | Template OS | Un par ligne, `os-key=vmid`, par exemple `ubuntu-24.04=9000`. | | Pinned TLS fingerprint (SHA-256) | Renseigné par le premier test. Effacez-le et effectuez un nouveau test après avoir remplacé le certificat du cluster. | ![Onglet Clusters, carte de configuration du cluster avec des exemples de nœud, de stockage, de pont et de liste de modèles d'OS](https://nexcmp.com/fr/docs/images/infrastructure/proxmox-03-cluster-config.webp) 5. Facultatif : si vous avez utilisé l'option B ci-dessus, renseignez **Create OS template from cloud image** (clé d'OS `ubuntu-24.04`, vmid `9000`, nœud `pve1`, URL de l'image qcow2) et cliquez sur **Create template**. L'opération s'exécute en arrière-plan pendant quelques minutes ; le résultat se trouve dans le journal d'audit. ![Carte de création de modèle d'OS à partir d'une image cloud avec un exemple d'URL d'image Ubuntu](https://nexcmp.com/fr/docs/images/infrastructure/proxmox-04-template-from-image.webp) 6. Cliquez sur **Add pool** dans **Cluster IP pool** et créez le pool dans lequel les VM piocheront leurs adresses : | Champ | Exemple de valeur | |---|---| | Name | `customers-1` | | CIDR | `198.51.100.0/24` | | Gateway | `198.51.100.1` (jamais attribué à une VM) | | DNS | `1.1.1.1,8.8.8.8` (1 à 4 adresses IPv4) | | Bridge, VLAN | `vmbr0`, `0` | | Already used IPs | un par ligne, `ip note`, par exemple `198.51.100.10 monitoring` | NexCMP n'attribue jamais l'adresse réseau, l'adresse de diffusion (broadcast), la passerelle ou une adresse réservée. Les pools d'un même cluster ne peuvent pas se chevaucher. Un pool ne peut être supprimé que lorsqu'aucune de ses adresses n'est utilisée. ![Boîte de dialogue d'ajout de pool d'IP avec un exemple de /24 et de passerelle](https://nexcmp.com/fr/docs/images/infrastructure/proxmox-05-ip-pool.webp) 7. Dans **Attach cluster to zone**, choisissez la zone et, facultativement, un nom de nœud, puis cliquez sur **Attach to zone**. Le cluster rejoint la zone qui propose déjà des VM, ce qui permet à une même zone de regrouper CloudStack et Proxmox. La nouvelle source n'est **pas vendue par défaut** et ne modifie pas le comportement des offres existantes. ![Carte d'association du cluster à la zone avec une zone existante sélectionnée](https://nexcmp.com/fr/docs/images/infrastructure/proxmox-06-attach-zone.webp) 8. Ouvrez **Services › Virtual Machines › Plans & pricing** et cliquez sur **Add plan**. Dans **Infrastructure source**, choisissez le cluster Proxmox, puis définissez le processeur, la RAM, le disque et le prix. Un plan Proxmox ne requiert aucune offre CloudStack. Pour vendre la même configuration à partir des deux sources, utilisez **Clone** sur un plan et sélectionnez l'autre source. Le disque du plan doit être au moins aussi grand que celui du modèle ; Proxmox ne peut pas réduire la taille d'un disque. ### Importer une VM existante {#import-a-vm-that-already-exists} Ouvrez l'onglet **Servers** pour lister les VM du cluster. **Import** assigne une VM existante à un compte client sans frais : rien n'est facturé pour les heures, le temps d'arrêt ou le trafic. Le client peut démarrer, arrêter, redémarrer et ouvrir la console mais ne peut pas la supprimer ; seul un administrateur le peut. NexCMP effectue uniquement des lectures sur le cluster lors de l'importation. - Le cluster doit être rattaché à une zone **avec le nom de nœud** de cette VM (laissez le nœud vide et les importations indiqueront que la région n'est pas configurée). - Pour rendre une VM **protégée** (l'arrêt, le redémarrage, la réinstallation, la restauration de snapshot, la destruction et le changement de forfait sont refusés), importez-la en ligne de commande avec `--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 ``` ### Ce qui est pris en charge ou non sur Proxmox {#what-is-and-is-not-supported-on-proxmox} | Fonctionnalité | Proxmox VE | |---|---| | Création, mise sous/hors tension, redémarrage, suppression | Oui | | Redimensionnement du CPU et de la RAM, extension du disque | Oui, mais la VM est arrêtée, modifiée puis redémarrée (pas de redimensionnement à chaud) | | Snapshots | Oui, jusqu'à 5 par VM : création, liste, restauration, suppression | | Réinstallation | Oui : la VM est reconstruite à partir du modèle et conserve son identifiant, son IP et ses paramètres, avec un nouveau mot de passe | | Réinitialisation du mot de passe | Oui, via l'agent invité | | Console | Oui, une console de navigateur transmise par proxy via le panneau | | Métriques | Oui : CPU, mémoire, réseau et disque | | Montage ISO, sauvegardes, pare-feu, IPv6, redirection de port, changement d'IP, volumes supplémentaires, Auto Scaling, DDoS Shield, VPC, mesure de la bande passante | Non disponible. La page de la VM du client masque ce qu'une source ne peut pas faire. | ## Vérification {#verify} 1. **Test connection** indique OK et le statut du fournisseur est actif. 2. **Clusters** liste vos nœuds comme étant en ligne, avec le stockage et le bridge. 3. **Cluster IP pool** affiche les comptes d'adresses libres, utilisées et réservées. 4. La clé OS apparaît sous les modèles de la zone dans **Services › Virtual Machines › Template** après le rattachement du cluster. 5. Commandez une VM de test à partir d'un forfait qui utilise le cluster. Elle doit obtenir une adresse du pool, un mot de passe root et une console fonctionnelle ; le pool indique une adresse utilisée. ## Limites et remarques {#limits-and-notes} ::: tip Zones à sources mixtes Depuis NexCMP 1.4.0, la grille tarifaire publique Cloud Server fonctionne aussi lorsque CloudStack et Proxmox VE partagent une zone. Chaque plan utilise sa propre **Infrastructure source**. Après avoir rattaché un cluster, vérifiez la grille tarifaire publique et passez une commande de test pour chaque source. ::: - Plusieurs clusters Proxmox peuvent être ajoutés. Chacun constitue un fournisseur. - Une zone propose une source par défaut ; un forfait doté de sa propre **Infrastructure source** est déployé exactement sur ce cluster, à condition que le cluster soit actif et dans la zone du forfait. - Un cluster situé derrière la même zone que CloudStack conserve ses forfaits hérités sur CloudStack. Testez une commande de bout en bout avant le lancement. - Le jeton API peut uniquement être remplacé, jamais visualisé. Remplacez-le dans l'onglet **Credentials** : créez d'abord le nouveau jeton dans Proxmox, saisissez-le, exécutez **Test connection**, puis révoquez l'ancien jeton. - Les actions Test, Sync et cluster-info sont limitées à six appels par minute et par administrateur. - NexCMP facture vos clients ; le coût du matériel et des licences du cluster reste à votre charge. ## Dépannage {#troubleshooting} | Symptôme | Cause | Solution | |---|---|---| | Test : "Key rejected (wrong access key / secret, or revoked)" ou HTTP 401/403 | Mauvais ID de jeton ou secret, ou l'ACL a été attribuée uniquement au jeton | Relancez les deux commandes `pveum acl modify` (utilisateur **et** jeton) et vérifiez que l'id du jeton est `user@realm!tokenid`. | | Test : "Could not connect to the provider" ou "Timed out" | Pare-feu, hôte ou port incorrect | Vérifiez `https://host:8006` depuis le serveur du panneau. | | Test : "Invalid endpoint or not on the allowlist" | L'endpoint comporte un chemin, un utilisateur, une requête ou n'est pas en HTTPS | Utilisez exactement `https://host:8006`. | | "le certificat TLS du cluster NE CORRESPOND PAS à l'empreinte épinglée" | Le certificat du cluster a été remplacé | Effacez **Pinned TLS fingerprint** dans l'onglet Clusters, enregistrez, puis relancez **Test connection**. | | Slug rejeté | Caractères non autorisés (a-z, 0-9, tiret) ou longueur différente de 2-32 caractères | Utilisez quelque chose comme `pve-1`. | | "Format du Token id : user@realm!tokenid et le secret est requis" | Identifiant de jeton ou secret manquant | Saisissez les deux ; le secret est l'UUID affiché lors de la création du jeton. | | "Ligne de modèle invalide : …" | Une ligne dans **Template OS** n'est pas `key=vmid` | Utilisez des lettres, chiffres, `.`, `_`, `-` dans la clé et un vmid d'au moins 100. | | "Clé OS : a-z 0-9 . _ - et vmid ≥ 100" | Clé ou id invalide dans **Create template** | Corrigez la clé OS et utilisez un vmid libre. | | "vmid … already exists" lors de la création d'un modèle | Le vmid est déjà utilisé | Choisissez un autre id. | | "l'URL pointe vers une adresse interne" | L'URL de l'image est une IP interne | Utilisez une URL publique ; les noms sont résolus par Proxmox. | | La tâche du modèle échoue au téléchargement | Le stockage `local` n'a pas de contenu `import` | `pvesm set local --content …,import,snippets`, puis réessayez. Un nom de fichier doit se terminer par `.qcow2`, `.raw`, `.vmdk`, `.ova` ou `.ovf`. | | "cluster has no online nodes" ou "node … is not online" | Le nœud par défaut est arrêté ou mal orthographié | Corrigez **Default node** ou laissez-le vide. | | "l'image n'appartient pas au cluster" | L'OS du plan ne figure pas dans **Template OS** | Ajoutez la clé à la liste et enregistrez. | | Le déploiement patiente, puis échoue lors du clonage | La machine virtuelle modèle ne se trouve pas sur le nœud choisi | Créez le modèle sur ce nœud, ou définissez **Default node** sur le nœud qui l'héberge. | | Le client ne peut pas se connecter en tant que root | L'image bloque la connexion root | Reconstruisez le modèle comme indiqué dans l'Option A. | | La réinitialisation du mot de passe n'a aucun effet | Aucun agent invité n'est installé dans la machine virtuelle | Installer et activer `qemu-guest-agent` dans le modèle. | | "Nom, CIDR et passerelle requis" | Champ de pool manquant | Remplir les trois. | | Pool create: "overlaps with pool …", "gateway must be within range (not network/broadcast address)" ou "cidr: network address must be …" | Pool en chevauchement, passerelle erronée ou CIDR ne se trouvant pas sur une limite de réseau | Utiliser une plage libre, une passerelle à l'intérieur de celle-ci et un CIDR écrit sous forme d'adresse réseau (par exemple `198.51.100.0/24`). | | Importation : "la région n'est pas configurée" | Le cluster est rattaché sans le nom du nœud de la VM | Rattacher le cluster à la zone avec le nom du nœud. | --- # Modèles d'OS et ISO {#os-templates-and-isos} > **Où trouver dans l'admin :** Services › Virtual Machines › Template (`/vm/templates`). Les templates Proxmox sont listés par cluster dans Infrastructure › Cloud provider › Providers › (cluster) › Clusters. ## Description {#what-it-does} Un modèle est l'image du système d'exploitation à partir de laquelle une nouvelle VM démarre. NexCMP ne stocke pas les images lui-même : il lit ce que CloudStack rapporte (modèles prêts et en vedette) ou ce que vous listez pour un cluster Proxmox, et vous permet de choisir celles qui sont vendues, avec un nom orienté client, une icône et un utilisateur de connexion. Cette page montre comment préparer des images qui fonctionnent bien avec NexCMP : connexion par mot de passe, mise à l'échelle en direct du processeur et de la RAM, fichier d'échange et disque racine qui s'adapte à la taille du forfait. ## Prérequis {#requirements} | Élément | Prérequis | |---|---| | Générateur de modèles CloudStack | Une machine Linux avec `libguestfs-tools` (`virt-customize`, `virt-sparsify`, `guestfish`), `qemu-utils`, `curl` et environ 5 Go de disque libre. Aucun KVM ni root n'est requis. Accès Internet pour les installations de paquets (ou construction avec `--offline`). | | Emplacement du générateur | Il est fourni avec chaque version dans `/opt/nexcmp/releases//share/templates/` sur le serveur du panneau. Vous n'avez pas besoin de l'exécuter là-bas : copiez le dossier sur n'importe quelle machine Linux. | | Serveur Web | N'importe quel serveur HTTP(S) que la VM de stockage secondaire de CloudStack peut atteindre, pour publier le fichier `.qcow2` terminé. Il n'a pas besoin d'être accessible depuis Internet. | | CloudStack | Un compte autorisé à enregistrer des modèles, ainsi que l'identifiant de votre zone et d'un type d'OS correspondant. Voir [CloudStack](https://nexcmp.com/fr/docs/infrastructure/cloudstack/). | | Proxmox VE | VM de modèles cloud-init avec l'agent invité QEMU, un par OS et par nœud. Voir [Proxmox VE](https://nexcmp.com/fr/docs/infrastructure/proxmox/). | | Dépend de | [CloudStack](https://nexcmp.com/fr/docs/infrastructure/cloudstack/) ou [Proxmox VE](https://nexcmp.com/fr/docs/infrastructure/proxmox/) connectés au préalable. | ## Préparer l'infrastructure {#prepare-the-infrastructure} ### CloudStack : créer un modèle {#cloudstack-build-a-template} Images de base prises en charge (l'image du fournisseur est téléchargée et sa somme de contrôle est vérifiée avant toute modification) : | Image | `--distro` | Utilisateur de connexion | |---|---|---| | 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` | Plus de distributions : ajoutez une ligne à `distros.conf` (URL de l'image, fichier de somme de contrôle, famille `deb` ou `rpm`). 1. Copiez le générateur sur une machine de construction et exécutez-le : ```bash cp -r /opt/nexcmp/releases//share/templates ~/templates && cd ~/templates ./build-template.sh --distro ubuntu-24.04 --version v7 --work ./out ``` Ajoutez `--panel-url https://cloud.example.com` pour intégrer un agent de surveillance de premier démarrage optionnel qui s'inscrit auprès de votre panneau (HTTPS uniquement). Sans cela, aucun agent n'est ajouté. Autres options : `--base ` pour utiliser une image que vous avez téléchargée, `--offline` pour ignorer les installations de paquets. 2. Le résultat est `out/ubuntu-24.04-v7.qcow2` et son `.sha256`. La construction se termine par l'exécution de `verify-image.sh`, qui inspecte l'image terminée en lecture seule et rejette une image défectueuse (elle est conservée sous le nom de `.unverified`). Vous pouvez l'exécuter à nouveau à tout moment : `./verify-image.sh out/ubuntu-24.04-v7.qcow2 --no-agent`. Ce que le générateur intègre dans l'image : | Élément | Raison | |---|---| | `qemu-guest-agent` | CloudStack peut interroger la VM concernant les CPU et les IP, et la placer en veille pour les snapshots. | | cloud-init avec la source de données CloudStack, `set_passwords` à chaque démarrage, connexion SSH par mot de passe | Le mot de passe généré est récupéré depuis le routeur virtuel et **Reset password** fonctionne. | | Une règle udev pour l'ajout à chaud de CPU et de RAM | Les vCPU et la RAM ajoutés à chaud s'activent d'eux-mêmes, permettant ainsi le redimensionnement à chaud et l'Auto Scaling. | | Un service de fichier d'échange | Crée `/swapfile` de la plus petite valeur entre 50 % de la RAM et 4 GiB après l'agrandissement du disque. `touch /etc/cmp-swap.disabled` le désactive. | | cloud-init `growpart` et `resizefs` | Le petit disque racine s'agrandit à la taille du disque du forfait au premier démarrage. | | machine-id vide, pas de clés d'hôte SSH | Chaque VM obtient sa propre identité. | ::: warning Nommer le modèle ` ` NexCMP active **Auto Scaling** pour les modèles dont le nom se termine par `vN` ou `vN.M` avec **N de 6 ou plus** (`Ubuntu 24.04 v7`, `Rocky Linux 9 v7.1`). Le générateur applique cette règle pour `--version`. Enregistrez le modèle avec le nom exact affiché. ::: 3. Publiez le fichier et enregistrez-le dans CloudStack. Utilisez le SHA-256 affiché par la compilation et n'effectuez l'enregistrement qu'une fois le fichier entièrement écrit : ```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` permet à CloudStack de générer le mot de passe de la VM. - `isdynamicallyscalable=true` permet le redimensionnement à chaud. - `host-passthrough` est nécessaire pour le démarrage des images récentes de Rocky et Alma ; `osdefault` maintient la portabilité du contrôleur de disque. 4. Attendez que le modèle atteigne **Download Complete / Ready**. L'image du fournisseur conserve sa petite taille virtuelle (environ 3.5 GiB pour Ubuntu et Debian, 10 GiB pour Rocky). N'oubliez pas qu'un disque de forfait ne peut pas être plus petit que le disque du modèle. ### Proxmox VE : créer un modèle {#proxmox-ve-make-a-template} Créez un modèle de VM cloud-init par système d'exploitation sur chaque nœud sur lequel vous déployez, avec l'agent invité installé et la connexion root activée, puis enregistrez-le en tant que `os-key=vmid`. Les commandes complètes se trouvent dans [Proxmox VE](https://nexcmp.com/fr/docs/infrastructure/proxmox/). Le générateur CloudStack ci-dessus **n'est pas** destiné à Proxmox : il configure cloud-init pour la source de données CloudStack. ### ISO {#isos} Les clients montent leurs propres ISO via le module **Images** (CloudStack) ou le module Serveur dédié. Ceux-ci sont distincts des modèles d'OS de cette page. Voir [Modules](https://nexcmp.com/fr/docs/infrastructure/modules/) et [Dedicated servers](https://nexcmp.com/fr/docs/infrastructure/dedicated/). ## Connecter dans NexCMP {#connect-in-nexcmp} 1. Ouvrez **Services › Virtual Machines › Template**. Cliquez sur **Sync now** ou patientez jusqu'à 15 minutes. La synchronisation ajoute les modèles prêts et mis en avant dans CloudStack. ![La page Template listant les modèles synchronisés avec leur état prêt et la colonne de hot-plug CPU](https://nexcmp.com/fr/docs/images/infrastructure/templates-01-list.webp) 2. Cliquez sur **Edit** sur un nouveau modèle et définissez ce que les clients voient : | Champ | Exemple de valeur | |---|---| | Nom d'affichage pour les clients | `Ubuntu 24.04 LTS` | | Famille d'OS | `ubuntu` (icône et utilisateur par défaut) | | Version | `24.04` | | Nom d'utilisateur de connexion | `ubuntu` (Windows : `Administrator` ; autre : `root`) | | Icône | URL d'image, chemin ou nom | | Ordre | `10` | | Actif | On | | Hot-plug vCPU/RAM (redimensionnement à chaud) | **Auto by name (v6 or later)**, **Yes** ou **No (needs a restart)** | ![Dialogue d'édition de modèle avec un nom orienté client, une famille d'OS, un utilisateur de connexion et l'option de hot-plug](https://nexcmp.com/fr/docs/images/infrastructure/templates-02-edit.webp) 3. Activez le modèle. Un modèle que CloudStack ne liste plus est masqué automatiquement (et vous en êtes averti sur Telegram si configuré) ; il n'est jamais supprimé de NexCMP. ### Remplacer un modèle par une version plus récente {#replace-a-template-with-a-newer-build} Utilisez **More › Replace with new version** sur le modèle vendu. Choisissez le nouveau modèle prêt et actuellement désactivé. L'entrée vendue pointe alors vers la nouvelle version tout en conservant son nom, son ordre et son icône ; l'ancienne est désactivée comme solution de repli (pour revenir en arrière, utilisez **Replace** sur la nouvelle entrée. Les machines virtuelles en cours d'exécution ne sont pas touchées. Si la nouvelle version appartient à une autre famille de système d'exploitation, cochez d'abord la confirmation. ## Vérification {#verify} 1. La ligne indique **ready** et, pour les versions nommées `vN` avec N supérieur ou égal à 6, **CPU hot-plug: supported**. 2. Déployez une machine virtuelle de test à partir du modèle et vérifiez à l'intérieur : - vous pouvez vous connecter avec le mot de passe affiché dans le portail ; - `df -h /` affiche la taille de disque du plan ; - après un redimensionnement à chaud (**Change plan** sans redémarrage), `nproc` et `free -m` augmentent ; - `swapon --show` liste `/swapfile` (les disques disposant de moins de swap plus 2 GiB d'espace libre sont ignorés) ; - `systemctl is-active qemu-guest-agent` affiche `active`. 3. Si vous avez intégré l'agent, la machine virtuelle apparaît dans les hôtes surveillés du panneau une minute après le premier démarrage. La machine virtuelle a besoin de sa propre adresse IP publique : le panneau la reconnaît par son IP source publique. ## Limites et remarques {#limits-and-notes} - Le générateur est réservé à Linux et produit des images Linux. D'autres images (par exemple Windows) peuvent être enregistrées dans CloudStack par d'autres moyens ; NexCMP liste ce que CloudStack rapporte. - Seul l'agent amd64 est fourni ; les autres architectures ignorent l'installation de l'agent. - L'image est vérifiée avec `guestfish` mais n'est jamais démarrée par le générateur. Déployez toujours une machine virtuelle de test avant de vendre une nouvelle image. - Ignorez l'agent sur une machine virtuelle avec `touch /etc/cmp-agent.disabled` avant le premier démarrage. Supprimez-le plus tard avec `systemctl disable --now cmp-agent cmp-agent-install; rm -rf /etc/cmp-agent /usr/local/bin/cmp-agent`, puis supprimez l'agent dans la console d'administration. ## Dépannage {#troubleshooting} | Symptôme | Cause | Solution | |---|---|---| | `virt-customize` ne parvient pas à télécharger les paquets | La machine de construction n'a pas d'accès réseau sortant | Corrigez le DNS ou le proxy sur cette machine, ou effectuez la construction avec `--offline` sur une image de base qui contient déjà les paquets. | | `libguestfs: error: /usr/bin/supermin exited with error status 1` | Le noyau de l'hôte n'est pas lisible par l'utilisateur actuel (Ubuntu) | `sudo chmod +r /boot/vmlinuz*`, ou exécutez la construction en tant que root. | | La somme de contrôle diffère ou l'image du fournisseur n'existe plus | Les fournisseurs déplacent leurs fichiers « latest » | Téléchargez vous-même l'image, vérifiez-la par rapport au fichier de somme de contrôle du fournisseur et transmettez-la avec `--base`. | | Rocky : un système XFS plus récent ne peut pas être monté | Le noyau de l'hôte est trop ancien | Construisez sur une machine dotée d'un noyau récent. | | `--version must be v6 or higher` | Le nom doit être `vN` avec N supérieur ou égal à 6 | Utilisez `--version v7`. | | `--panel-url must be a plain https:// URL` | L'agent est téléchargé et exécuté en tant que root, le HTTP non sécurisé est donc refusé | Utilisez une URL `https://` sans espaces, guillemets ni chaîne de requête. | | Le modèle reste **not ready** | CloudStack n'a pas terminé le téléchargement | Attendez **Download Complete**, vérifiez que la machine virtuelle de stockage secondaire peut atteindre l'URL. | | La ligne indique **no-pass** | Le modèle a été enregistré sans `passwordenabled=true` | Enregistrez-le à nouveau avec ce paramètre. | | Le branchement à chaud du processeur indique **unsupported** | Le nom ne se termine pas par `vN` (N supérieur ou égal à 6) | Renommez le modèle ou définissez **vCPU/RAM hot-plug** sur **Yes** dans Edit si l'image possède la règle udev. | | « Empty template list » après la première connexion | La synchronisation ne s'est pas exécutée | Cliquez sur **Sync now** (nécessite l'exécution du service d'arrière-plan) ou attendez le cycle de 15 minutes. | --- # Serveurs dédiés (bare metal) {#dedicated-servers-bare-metal} > **Où dans l'admin :** Infrastructure › Bare Metal (Servers `/infra/baremetal`, IP Pools, Stock / iDRAC import, Operations, Templates, Customer ISOs, Safety). Offres et abonnements : Services › Dedicated Server (`/dedicated`). Activez le module sous System › Admin › License & updates (`/license`). ## Description {#what-it-does} NexCMP gère les serveurs physiques **directement via leur iDRAC**, sur l'API Redfish. Les clients louent un serveur entier : ils l'allument et l'éteignent, ouvrent une console par navigateur, montent une ISO ou font installer un système d'exploitation à partir d'un modèle, et visualisent le matériel ainsi que les métriques. Ils ne voient jamais l'adresse iDRAC, le nom d'utilisateur ni le mot de passe. Utilisez-le pour revendre des serveurs dédiés depuis vos propres baies. ## Prérequis {#requirements} | Élément | Prérequis | |---|---| | Matériel | Serveurs Dell avec **iDRAC 9** et l'API Redfish. | | Réseau de gestion | **À votre charge.** Le serveur du panel doit pouvoir joindre chaque iDRAC sur **HTTPS 443** (ainsi que le port VNC de l'iDRAC, par défaut **5901**, pour la console), et chaque iDRAC doit pouvoir joindre le serveur web d'ISO ci-dessous. L'adresse de l'iDRAC doit être une **adresse IPv4 dans une plage privée** (RFC 1918, un préfixe /16 ou plus petit) que vous indiquez dans le paramètre `dedicated_bmc_cidrs`. Les noms DNS et l'IPv6 sont refusés. NexCMP ne crée pas ce réseau et ne peut pas le tester pour vous. | | Compte iDRAC | Un compte avec le privilège **Administrator** sur chaque iDRAC. NexCMP l'utilise pour lire le serveur et envoyer les quelques commandes qu'il s'autorise (alimentation, média virtuel, démarrage unique, console). Il ne crée jamais de compte iDRAC pour vos clients. | | Outils sur le serveur du panel | `xorriso` et `genisoimage` (génération de l'ISO d'installation de chaque serveur) et `novnc` (page de console dans le navigateur). Installez-les avec `sudo apt-get install -y xorriso genisoimage novnc`, ou laissez le programme d'installation s'en charger: exécutez-le avec `--baremetal`, ou fournissez-lui les options du serveur ISO; une mise à jour les installe également lorsque le module Bare Metal est déjà activé. S'il en manque un, **Safety** l'indique dans une notification rouge, les **live ops** refusent de s'activer (erreur `tools_missing`), et la console ainsi que l'installation de l'OS signalent qu'un outil est manquant au lieu d'échouer plus tard. | | Serveur web ISO | Un serveur **HTTP** standard sur le réseau de gestion qui sert le dossier d'ISO de NexCMP aux iDRAC. Son adresse est une adresse IPv4 privée et un port optionnel, par exemple `http://10.20.0.2:8080`, **sans chemin**, enregistrée dans `dedicated_iso_base_url`. Il doit prendre en charge les byte ranges. Le dossier étant alimenté par le worker du panel, le serveur web s'exécute normalement sur le **serveur du panel lui-même**, en écoute sur une adresse attribuée à ce serveur sur le réseau de gestion. NexCMP fournit un site nginx prêt à l'emploi et une commande en une seule étape pour le configurer (voir ci-dessous). | | Dossiers ISO | Un dossier pour les fichiers ISO et, à l'intérieur, `pub` (ce que lisent les iDRAC) et `server` (les ISO des clients). La commande en une seule étape utilise `/srv/nexcmp-iso`; sans elle, les valeurs par défaut suivent l'installation (paramètres `dedicated_iso_lib_dir`, `dedicated_iso_pub_dir`, `dedicated_iso_server_dir`). Le worker de NexCMP doit pouvoir y **écrire**. Il s'exécute avec un système de fichiers en lecture seule sauf `/var/lib/nexcmp`; un dossier situé ailleurs nécessite donc un drop-in systemd (que la commande en une seule étape installe). | | Adresse de rappel | `dedicated_callback_base`, une `https://` que le serveur en cours d'installation peut joindre et qui pointe vers votre panneau. | | Stockage | Espace disque libre pour la bibliothèque ISO et pour les ISO fournies par les clients. | | Dépend de | Le module **Bare Metal**, une zone et les pools IP des serveurs. | ::: warning Les valeurs d'exemple ne constituent pas une configuration Une nouvelle installation contient des valeurs d'exemple dans `dedicated_bmc_cidrs`, `dedicated_iso_base_url` et `dedicated_callback_base` (un exemple de réseau privé et `https://example.com`). Elles ne correspondent pas à votre réseau. Tant que l'une d'elles conserve une valeur d'exemple, les pages Bare Metal affichent une notification rouge **Management network not configured**, l'importation d'un iDRAC échoue au contrôle de la liste d'autorisation, et l'interrupteur **live ops** refuse de s'activer (erreur `config_placeholder`). Définissez ces trois valeurs sous **Infrastructure › Bare Metal › Safety › Management network connection** (voir ci-dessous). ::: ## Préparer l'infrastructure {#prepare-the-infrastructure} 1. **Placez chaque iDRAC sur un réseau de gestion** inaccessible aux clients et attribuez à chacun une adresse IPv4 privée fixe. Vérifiez l'API Redfish depuis le serveur du panneau : ```bash curl -sk -u 'nexcmp-admin:XXXX' https://10.20.0.11/redfish/v1/Systems | head ``` 2. **Créez un compte administrateur sur l'iDRAC** pour NexCMP (via l'interface web de l'iDRAC ou `racadm`). Utilisez un mot de passe fort et unique. Ne réutilisez jamais le compte intégré de l'iDRAC. 3. **Publier le dossier d'ISO auprès des iDRAC - en une seule commande.** Sur le serveur du panel, en tant que root, avec l'adresse de ce serveur sur le réseau de gestion et le réseau de l'iDRAC: ```bash sudo nexcmp dedicated-setup-iso --listen 10.20.0.2:8080 --allow 10.20.0.0/24 ``` `--listen` doit être une adresse de ce serveur (IPv4 privée, port 8080 par défaut). `--allow` liste le ou les réseaux de l'iDRAC (CIDR privés, /16 ou plus petits, jusqu'à 8, séparés par des virgules); seuls ceux-ci peuvent télécharger, et la commande les utilise aussi comme `dedicated_bmc_cidrs` lorsque ce paramètre contient encore la valeur d'exemple. `--dir /path` permet de choisir un autre dossier d'ISO (par défaut `/srv/nexcmp-iso`). La commande: - crée le dossier contenant `pub` et `server`, appartenant à l'utilisateur de service de NexCMP; - crée le groupe `nexcmp-iso` et y ajoute l'utilisateur nginx, afin que nginx puisse lire une ISO lorsqu'un iDRAC l'a montée et que personne d'autre ne le puisse; - installe le site nginx `nexcmp-iso` (conservé uniquement si `nginx -t` le valide, nginx étant installé s'il est absent) et un drop-in systemd `nexcmp-vmd.service.d/iso.conf` (`ReadWritePaths` pour le dossier, `SupplementaryGroups=nexcmp-iso`); - écrit les paramètres ISO (`dedicated_iso_base_url`, les trois dossiers, le groupe) et redémarre le worker de NexCMP. Elle peut être réexécutée avec d'autres valeurs, et `sudo nexcmp dedicated-setup-iso --remove` supprime à nouveau le site nginx et le drop-in (les fichiers ISO sont conservés). Elle peut aussi être lancée lors de l'installation: ajoutez `--iso-listen`, `--iso-allow` (et `--iso-dir`) à la commande d'installation. La commande ne crée **pas** le réseau de gestion et ne contacte aucun iDRAC; si les valeurs sont incorrectes, que l'adresse n'appartient pas à ce serveur ou que le port est déjà utilisé, elle s'arrête avec un message avant de modifier quoi que ce soit, et tout site nginx rejeté par `nginx -t` n'est pas conservé. 4. **Ce que sert le serveur web ISO.** Le site nginx répond `GET` (et `HEAD`, avec les plages d'octets) pour `/pub/.iso` et rien d'autre: pas de listage de répertoire, aucun autre chemin sous le dossier (la bibliothèque et `server/` ne sont pas accessibles), aucune autre méthode, et uniquement depuis les réseaux `--allow` (tout le reste reçoit une 403). NexCMP expose chaque ISO qu'un iDRAC doit lire sous forme de fichier ou de lien temporaire dans `pub`; nginx ne suit un lien que si le lien et sa cible ont le même propriétaire (l'utilisateur du service), ainsi tout lien vers un fichier système est refusé. Vérifiez-le depuis un autre hôte sur le réseau d'administration: ```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 ``` Un fichier de test dans `pub` devrait répondre à une requête `Range` par 206. *Pour le faire manuellement:* le site nginx et le drop-in sont fournis sous forme de modèles dans le paquet de version (`share/dedicated/nginx-iso.conf` et `share/dedicated/vmd-iso.conf` sous `/opt/nexcmp/releases//`). Copiez-les, remplacez les marqueurs `__...__` (adresse d'écoute, dossier, lignes allow, groupe) et conservez les règles ci-dessus. 5. **Préparez les images OS.** Placez les ISOs auto-installables dans le dossier de la bibliothèque (voir **Templates** ci-dessous). Les clients peuvent également ajouter des ISOs depuis un lien ; celles-ci sont téléchargées sur le serveur et ne sont jamais transmises à l'iDRAC sous forme d'URL. ## Connecter dans NexCMP {#connect-in-nexcmp} ### 1. Activer le module {#_1-turn-the-module-on} Dans **System › Admin › License & updates**, activez **Bare Metal**. La catégorie **Bare Metal** apparaît sous Infrastructure. Voir [Modules](https://nexcmp.com/fr/docs/infrastructure/modules/). ### 2. Configurer la connexion au réseau d'administration {#_2-set-the-management-network-connection} Ouvrez **Infrastructure › Bare Metal › Safety**. La carte **Management network connection** contient les trois valeurs qui déterminent si le système peut fonctionner: | Champ | Paramètre | Valeur à saisir | |---|---|---| | Réseau iDRAC (CIDR) | `dedicated_bmc_cidrs` | Le ou les réseaux privés de vos iDRAC, par exemple `10.20.0.0/24`. CIDR privés uniquement, /16 ou plus petits, jusqu'à 8, séparés par des virgules. Seuls les iDRAC situés dans ces plages peuvent être importés. | | Serveur ISO pour les iDRAC | `dedicated_iso_base_url` | `http://[:port]`, sans chemin: l'adresse du serveur web ISO de la section précédente, par exemple `http://10.20.0.2:8080`. La commande en une seule étape la renseigne pour vous. | | Adresse de callback du panel | `dedicated_callback_base` | `https://`, sans chemin: l'adresse que le serveur en cours d'installation appelle pour signaler la fin de l'opération. Elle doit être accessible depuis le réseau de ce serveur. `example.com`, `localhost` et les valeurs similaires sont refusées. | Le formulaire vérifie le format pendant la saisie et le serveur le vérifie à nouveau lors de l'enregistrement; une valeur incorrecte est refusée avec le motif et la valeur enregistrée reste inchangée. Un champ qui contient encore la valeur d'exemple fournie porte l'étiquette rouge **Not configured**, et chaque page Bare Metal affiche l'avertissement rouge **Management network not configured** tant que les trois valeurs ne sont pas réelles. Les modifications sont consignées dans le journal d'audit avec votre motif. Réenregistrer la valeur d'exemple n'est pas considéré comme une configuration, à moins de l'avoir saisie vous-même. ### 3. Vérifier le verrou de sécurité (laissez-le fermé pour l'instant) {#_3-check-the-safety-gate-leave-it-closed-for-now} Ouvrez **Infrastructure › Bare Metal › Safety**. **Live ops** est le commutateur global pour chaque commande d'écriture vers un iDRAC (alimentation, média virtuel, console et installation d'OS). Il est initialement **désactivé** et ne peut pas être activé tant que la connexion au réseau d'administration ci-dessus contient encore des valeurs d'exemple (le commutateur répond `config_placeholder` et indique les champs). Les écritures sont refusées au niveau de l'API puis à nouveau dans le worker, tandis que la lecture des statuts continue de fonctionner. Un second verrou, **ops_locked**, protège chaque serveur: les serveurs nouvellement importés sont toujours verrouillés, même lorsque live ops est activé. ![La page Safety avec les Live ops désactivés et la liste des actions bloquées](https://nexcmp.com/fr/docs/images/infrastructure/dedicated-01-safety.webp) ### 4. Importer des serveurs {#_4-import-servers} 1. Ouvrez **Infrastructure › Bare Metal › Stock / iDRAC import**. 2. Sous **Add one server**, saisissez l'adresse iDRAC, le compte et le mot de passe, puis cliquez sur **Test connection**. Le test n'envoie que des commandes de lecture et n'enregistre rien. | Champ | Exemple de valeur | |---|---| | Adresse iDRAC (URL ou hôte) | `10.20.0.11` | | Compte | `nexcmp-admin` | | Password | `XXXX` | | Libellé | `rack1-01` (vide : généré) | | Attribuer une IP depuis un pool | optionnel ; choisissez le pool d'IP de service du serveur | | Inclure dans la liste de vente | désactivé jusqu'à ce que vous soyez prêt | ![Importation de stock et d'iDRAC avec un exemple d'adresse et un test en lecture seule réussi](https://nexcmp.com/fr/docs/images/infrastructure/dedicated-02-import-server.webp) 3. Cliquez sur **Save to stock**. NexCMP lit le modèle, le processeur, la RAM, les disques, les cartes réseau et le numéro de série depuis l'iDRAC. Le serveur entre en stock en étant **verrouillé**. 4. Pour un grand nombre de serveurs, utilisez **Bulk import** : un serveur par ligne, champs séparés par une virgule, un point-virgule ou une tabulation. **Preview** vérifie la liste blanche, les doublons d'adresse iDRAC ou de numéro de série, et lit le matériel (jusqu'à quatre serveurs à la fois). ### 5. ISO clients et adresse web des ISO {#_5-customer-isos-and-the-iso-web-address} Ouvrez **Infrastructure › Bare Metal › Customer ISOs**. - **HTTP address serving ISOs to iDRAC** correspond à `dedicated_iso_base_url`, la même valeur que dans la carte Safety (modifiable à l'un ou l'autre endroit). Saisissez l'adresse de votre serveur web ISO sur le réseau d'administration. - **Les limites ISO client** définissent la taille d'un fichier ISO, le stockage ISO total, l'espace libre minimal, la durée de conservation des ISO (en heures), le temps de téléchargement maximal et le nombre de téléchargements simultanés. ![ISO clients avec l'adresse HTTP des iDRAC et les limites ISO](https://nexcmp.com/fr/docs/images/infrastructure/dedicated-03-iso-settings.webp) ### 6. Modèles d'OS {#_6-os-templates} Ouvrez **Infrastructure › Bare Metal › Templates**. Cette section liste les ISO auto-installables trouvés dans le dossier de la bibliothèque. Cliquez sur **Register** sur un fichier pour renseigner la famille d'OS, la version et le compte (pré-remplis à partir du nom du fichier), puis activez le commutateur **Enable** du modèle. Activer un modèle ne lance rien : chaque installation passe toujours par le contrôle de sécurité. **Unregister** supprime uniquement la ligne du modèle, jamais le fichier. ![Modèles Bare Metal avec un ISO enregistré et un ISO non enregistré](https://nexcmp.com/fr/docs/images/infrastructure/dedicated-04-os-templates.webp) ### 7. Pools d'IP {#_7-ip-pools} Ouvrez **Infrastructure › Bare Metal › IP Pools** et ajoutez les plages IPv4 attribuées aux serveurs en tant qu'adresses de service. Chaque serveur reçoit une adresse ; **Assign an IP from a pool** lors de l'importation attribue la prochaine adresse libre. Les adresses libres sont comptées par pool. ![Pools d'IP Bare Metal avec des exemples de plages et de compteurs libres](https://nexcmp.com/fr/docs/images/infrastructure/dedicated-05-ip-pools.webp) ### 8. Plans et vente {#_8-plans-and-sale} 1. Ouvrez **Services › Dedicated Server › Plans & pricing**. Modifiez les quatre plans d'exemple (nommés `BM-40C-` dans 1.6.1) ou créez les vôtres : prix, cycles et frais d'installation. **Sur une nouvelle installation, les prix sont saisis en dollars américains, au centime près, et le portefeuille est débité exactement de ce montant : aucun taux de change n'est nécessaire.** Une installation qui avait déjà des plans tarifés en dôngs vietnamiens conserve les dôngs et nécessite toujours un taux de change dans ses paramètres (sans cela, les commandes sont refusées avec `dedicated_fx_unavailable`). Les plans d'exemple commencent avec un prix de 0 et sont **désactivés** : un plan en vente doit avoir un prix supérieur à 0. Vérifiez chaque plan par rapport au matériel que vous importez réellement ; le nom d'un plan d'exemple ne détecte ni ne modifie le matériel d'un serveur. 2. Ouvrez le serveur (Infrastructure › Bare Metal › the server › **Sales**), **associez le plan** et activez **Sellable**. 3. Activez les **live ops** (page Safety, avec la confirmation textuelle) et déverrouillez les serveurs que vous souhaitez exploiter (onglet **Lock** du serveur, avec un motif qui est consigné dans le journal d'audit). 4. Sur **Services › Dedicated Server**, activez les ventes. Cela se fait en deux étapes : lisez les conséquences, puis tapez `ENABLE SALES`. Jusque-là, les clients ne voient aucune page de commande et ne sont pas facturés. ![Plans Dedicated Server avec le commutateur de vente désactivé](https://nexcmp.com/fr/docs/images/infrastructure/dedicated-06-plans.webp) ### Ce que les clients peuvent faire sur la page de leur serveur {#what-customers-can-do-on-their-server-page} La page serveur d'un client comporte seize onglets répartis en sept groupes (Overview, Control, Network, Hardware, Billing, Activity, Settings). Le groupe **Billing** contient: - **Offre et renouvellement** : payez de 1 à 24 mois d'avance en une seule étape ; la nouvelle date est calculée à partir de la date de renouvellement actuelle et le portefeuille est débité en une fois. Le renouvellement automatique peut être activé ou désactivé. - **Billing cycle** : choisissez un autre cycle (par exemple trimestriel) ; il s'applique à partir du **prochain** renouvellement, sans aucun débit ni remboursement immédiat. - **Change plan** : le client peut **demander** un autre forfait. La demande n'entraîne aucun débit. Vous l'approuvez ou la refusez sous **Services › Dedicated Server › Plan changes**, après avoir mis à niveau le matériel ou déplacé le serveur. Une mise à niveau approuvée facture la différence pour le reste de la période déjà payée par le client ; un déclassement ne donne lieu à aucun remboursement et s'applique à partir de la période suivante. - **Invoices** : toutes les factures associées à ce serveur (commande, renouvellements, mises à niveau). Dans **Plan changes**, triez les demandes par identifiant, date, état, plans ou serveur ; le tri s'applique à l'ensemble des résultats sur le serveur. La colonne d'action reste visible lorsque vous faites défiler horizontalement sur un écran étroit. En haut de **Overview**, quatre tuiles en direct affichent **CPU**, **RAM**, **Disk** et **Network**, avec un petit graphique pour les dernières 24 heures. CPU, RAM et Disk indiquent les pourcentages d'utilisation de la dernière interrogation iDRAC (Disk correspond à l'activité d'E/S, et non à l'espace libre) ; Network indique le débit actuel entrant et sortant ainsi que le total mensuel, relevés depuis le compteur de trafic. Une tuile affiche **—** et un motif court lorsque le serveur est éteint, que l'iDRAC est inaccessible ou que la machine ne transmet pas cette valeur ; elle n'affiche jamais un 0 fictif. Ces relevés proviennent de Dell iDRAC, et sans compteur de trafic, la tuile Network reste à **—**. Les tuiles s'actualisent chaque minute tant que la page est ouverte, et un clic ouvre l'onglet **Hardware** ou **Bandwidth**. Sur **Overview**, la carte **Access** affiche le nom d'utilisateur et le mot de passe du système d'exploitation installé, masqués par défaut avec des boutons **Show** et **Copy**. Ces informations restent disponibles après chaque installation, pas seulement la première fois, et un nouveau propriétaire du serveur ne voit jamais le mot de passe d'un propriétaire précédent. Si le mot de passe de l'OS est modifié directement sur le serveur, la carte continue d'afficher celui défini lors de l'installation. L'onglet **Bandwidth** n'apparaît que si un compteur de trafic l'alimente (voir Limites). Il n'y a pas d'onglet **Subnet** : apporter son propre préfixe IP sur un serveur loué n'est pas pris en charge par NexCMP. ### Ce que les clients peuvent et ne peuvent pas faire {#what-customers-can-and-cannot-do} | Les clients peuvent | Jamais possible | |---|---| | Voir l'inventaire, l'état de santé, l'état d'alimentation et les métriques | Voir l'adresse, le nom d'utilisateur ou le mot de passe de l'iDRAC | | Mise sous tension, arrêt propre, redémarrage, extinction forcée, réinitialisation | Modifier les comptes iDRAC ou les paramètres réseau de l'iDRAC | | Ouvrir une console de navigateur (une session à la fois) | Modifier le BIOS ou le RAID, effacer les journaux, mettre à jour le micrologiciel, réinitialiser l'iDRAC | | Monter une ISO ou un lien ISO personnel, définir le démarrage unique, réinstaller le système d'exploitation à partir d'un modèle activé | Exécuter des appels Redfish bruts (les fonctions n'existent pas dans NexCMP) | NexCMP ne crée pas de comptes iDRAC pour les clients : ils utilisent uniquement les commandes du portail, et l'adresse ainsi que les identifiants iDRAC ne leur sont jamais communiqués. ## Vérification {#verify} 0. Sur **Safety**, la carte **Management network connection** n'affiche aucune mention rouge et les pages Bare Metal n'affichent aucun avertissement rouge. Depuis un hôte sur le réseau de gestion, `curl -I http:///` ne liste pas les fichiers. 1. **Test connection** sur le formulaire d'importation renvoie le modèle, le processeur, la RAM et le numéro de série. 2. Le serveur apparaît dans **Servers** avec son matériel. Lorsque les **live ops sont désactivés**, toute action d'alimentation est refusée avec le message "Server control is temporarily disabled system-wide". 3. Après avoir activé les live ops et déverrouillé un serveur de test, éteignez et rallumez le serveur depuis **Operations** ou la page du serveur, puis ouvrez la console. 4. Psez une commande de test avec un plan de test : le serveur est assigné, le système d'exploitation s'installe et l'installation se termine lorsque le serveur communique avec le panneau. ## Limites et remarques {#limits-and-notes} - Chaque serveur physique dispose d'un seul abonnement actif au maximum. - Une commande d'écriture n'est envoyée que **lorsque** les live ops sont activés **et que** le verrou du serveur est ouvert. La vérification est répétée dans le processus d'arrière-plan immédiatement avant chaque commande. - L'état **Installing** attend que le nouveau système d'exploitation réponde sur son port (SSH 22, Windows 3389, Proxmox 8006) avant que la commande ne se termine ; une installation a une limite de temps (`dedicated_install_timeout_min`, par défaut 150 minutes). - La bande passante des serveurs dédiés est mesurée par un agent compteur de trafic qui ne fait pas partie de l'installation standard. En son absence, rien n'est enregistré, le portail masque l'onglet Bandwidth et l'API renvoie `capabilities.bandwidth` sous la forme `false`. - Les actions d'administration sur une location (verrouillage, déverrouillage, résiliation avec ou sans remboursement) sont identiques et unifiées pour tous les services, les remboursements étant crédités sur le solde utilisé pour le paiement. - Les serveurs ne sont pas revendus par l'intermédiaire de revendeurs : Dedicated est vendu uniquement sur le site principal. ## Dépannage {#troubleshooting} | Symptôme | Cause | Solution | |---|---|---| | Le test échoue avec une erreur d'adresse | L'adresse n'est pas un littéral IPv4 dans `dedicated_bmc_cidrs` (privée, /16 ou plus petite) ou le port n'est pas autorisé | Utilisez l'adresse IPv4 de l'iDRAC et ajoutez son réseau sous Safety › Management network connection (`dedicated_bmc_cidrs`). Les noms DNS et l'IPv6 sont refusés. | | Avertissement rouge "Management network not configured", ou le commutateur live ops répond `config_placeholder` | L'une des valeurs `dedicated_bmc_cidrs`, `dedicated_iso_base_url`, `dedicated_callback_base` contient encore la valeur d'exemple par défaut | Saisissez les valeurs réelles sous Safety › Management network connection. | | Un champ est refusé lors de l'enregistrement | Format incorrect (CIDR non privé ou plus large que /16, adresse ISO différente de `http://[:port]`, callback différent de `https://`) ou adresse d'exemple telle que `example.com` | Lisez le message sous le champ ; la valeur enregistrée reste inchangée. | | `nexcmp dedicated-setup-iso` s'arrête avant d'effectuer la moindre modification | `--listen` n'est pas une adresse de ce serveur, le port est déjà utilisé ou une valeur n'est pas valide | Utilisez l'adresse de ce serveur sur le réseau de gestion, un autre port ou corrigez la valeur indiquée dans le message. | | "Le certificat TLS iDRAC diffère de celui épinglé — l'interrogation et les actions d'écriture ont été arrêtées" | Le certificat iDRAC a été remplacé (nouveau certificat, iDRAC remplacé) | Ouvrez le serveur, dans l'onglet **Access**, comparez les deux empreintes et, si le changement est intentionnel, cliquez sur **Repin certificate**. | | "Le contrôle des serveurs est temporairement désactivé pour tout le système" | Les opérations en direct sont désactivées | Activez-les dans **Safety**. | | "Ce serveur est verrouillé pour les opérations" | Le verrouillage par serveur est fermé | Ouvrez le verrou dans l'onglet **Lock** du serveur avec un motif. | | "Une autre opération est déjà en cours sur ce serveur" | Une opération précédente n'est pas terminée | Patientez ; vérifiez **Operations**. | | "Une autre session de console est déjà ouverte sur ce serveur" | Une seule console à la fois | Fermez l'autre session. | | "Le contrôleur du serveur est temporairement indisponible" | L'iDRAC ne répond pas | Vérifiez le réseau de gestion et l'iDRAC. | | Le montage d'ISO échoue avec une erreur 403 ou 404 de l'iDRAC | Le serveur web ne peut pas lire le fichier ou l'adresse de base est erronée | Vérifiez les permissions du serveur web ISO et l'**HTTP address serving ISOs to iDRAC**. | | "Ce plan est en rupture de stock dans l'emplacement sélectionné" | Aucun serveur vendable avec ce plan dans la zone | Associez le plan à un serveur et activez **Sellable**. | | "Aucune adresse IPv4 n'est disponible pour le moment" | Le pool d'adresses IP est vide | Ajoutez des adresses au pool. | | "L'installation automatique du système d'exploitation n'est pas disponible pour l'instant" | Prérequis d'installation manquants | Vérifiez qu'un modèle est activé et que les dossiers ISO sont accessibles en écriture ; les clients peuvent toujours installer via une ISO et la console. | | L'installation se fige | Le serveur en cours d'installation ne peut pas atteindre l'adresse de rappel | Vérifiez `dedicated_callback_base` et assurez-vous que le réseau du serveur peut joindre votre panneau via HTTPS. | --- # Nœuds VPN et proxy IPv6 {#vpn-and-ipv6-proxy-nodes} > **Où trouver dans l'admin :** Infrastructure › VPN & Proxy nodes › Agents & external nodes (`/agents`), VPN IP pools (`/vpn/pool`), IPv6 Proxy nodes (`/vpn/proxy6/nodes`). Les services eux-mêmes se trouvent sous Services › VPN et Services › IPv6 Proxy. Les deux modules sont activés dans System › Admin › License & updates. ## Description {#what-it-does} NexCMP vend des accès VPN et proxy sortant depuis des **adresses IP vous appartenant**, sur des serveurs que vous exploitez. Il existe deux types de nœuds : - **Nœud VPN.** Un petit programme Go, `cmp-agent`, s'exécute sur votre hôte Linux. Il détecte les adresses IPv4 publiques de l'hôte, ouvre un écouteur SOCKS5, HTTP et UDP sur chaque adresse vendue, et achemine le trafic depuis la **même IP** que celle à laquelle le client s'est connecté (même sortie IP). Il transmet des rapports au panneau toutes les quelques secondes. - **Nœud proxy IPv6.** Un service proxy qui attribue aux clients des adresses provenant d'un préfixe IPv6 routé vers l'hôte. Le panneau l'installe pour vous via SSH. Utilisez-les pour revendre des adresses IP propres dans les pays où vous possédez des serveurs. ## Prérequis {#requirements} ### Nœud VPN {#vpn-node} | Élément | Prérequis | |---|---| | Système d'exploitation | Une distribution Linux avec systemd et un noyau 4.15 ou plus récent (prise en charge du free-bind IPv6). Le binaire de l'agent fourni est uniquement **x86_64** (amd64). | | Privilèges | root, pour l'installation. Le service conserve uniquement `CAP_NET_ADMIN`, `CAP_NET_RAW` et `CAP_DAC_READ_SEARCH`. | | Outils | `curl` ou `wget`, et `sha256sum` (l'installateur refuse de continuer sans vérifier le fichier). | | Adresses publiques | Adresses IPv4 publiques assignées sur une interface de l'hôte (une `/32` chacune), **ou** un préfixe routé vers l'hôte que vous ajoutez en tant que sous-réseau supplémentaire (IPv4 /16 à /32, IPv6 /48 à /128). Les plages privées, CGNAT et de documentation sont ignorées. | | Réseau, entrant | Les clients se connectent à chaque IP publique vendue sur les **ports 65001-65535** (TCP pour SOCKS5 et HTTP, UDP pour l'association UDP). Chaque point de terminaison utilise un ensemble de trois ports consécutifs. | | Réseau, sortant | HTTPS (443) vers le domaine de votre panneau. L'agent interroge aussi son pays sur `ip-api.com` (HTTP) et `ipinfo.io` (HTTPS), avec une limite de 3.5 secondes. | | Messagerie | Les connexions sortantes vers le port 25 sont toujours bloquées ; il n'existe aucun paramètre pour l'ouvrir. | | Docker, VPN et interfaces virtuelles | Les interfaces nommées `docker*`, `veth*`, `br-*`, `cni*`, `flannel*`, `virbr*`, `cali*`, `tun*`, `tap*`, `wg*` et `tailscale*` ne fournissent pas d'adresses. | | Dépend de | Le module **VPN**, une zone (créée automatiquement à partir du pays de l'hôte) et le panneau NexCMP accessible en HTTPS. | ### Nœud proxy IPv6 {#ipv6-proxy-node} | Élément | Prérequis | |---|---| | Système d'exploitation | Linux avec systemd sur **x86_64**. Les commandes `systemctl`, `nft`, `ip`, `ss`, `sysctl` et `useradd` doivent exister, sinon l'installation s'arrête en indiquant la commande manquante. | | Accès pour l'installation | Une adresse IPv4 publique (les adresses privées, de boucle locale et CGNAT sont refusées), le port SSH, un compte avec des droits root ou `sudo` et son **mot de passe**. Le mot de passe est utilisé uniquement pour l'installation et n'est pas stocké. | | Ports libres | **80, 443 et tous les ports supérieurs à 60000** doivent être libres. L'installateur n'arrête ni ne modifie jamais les services déjà en cours d'exécution ; il signale les ports occupés et s'arrête. | | IPv6 | Un préfixe public compris entre **/32 et /64** dans `2000::/3` que l'hôte peut utiliser comme source pour le trafic sortant, livré soit **routé** vers l'hôte, soit **on-link** avec proxy NDP (voir ci-dessous). | | Réseau | Les clients se connectent à l'IPv4 du nœud sur le port 80 (proxy HTTP), le port 443 (SOCKS5) et les ports 60001-65535 (un port par IP statique). Le nœud n'a pas de certificat, il n'y a donc pas de proxy HTTPS. Le trafic sort uniquement en IPv6, et seulement vers les destinations disposant d'une adresse IPv6. Le nœud récupère sa configuration depuis le panneau via HTTPS. | | Logiciel de nœud sur le serveur du panneau | Le démon du nœud et son script réseau sont inclus dans le package de publication de NexCMP. Le panneau les copie depuis son dossier d'installation (`/opt/nexcmp/releases//bin`, ou `/opt/nexcmp/bin` sur un build personnalisé) vers chaque nœud pendant l'installation. Le serveur du panneau a également besoin de `sshpass` et d'un client SSH ; le programme d'installation ajoute `sshpass`, et sur un serveur installé avant la 1.4.2, vous l'ajoutez avec `sudo apt-get install -y sshpass`. | | Dépend de | Le module **IPv6 Proxy**, et l'URL du panneau que les nœuds rappellent (**IPv6 Proxy › Settings › Panel URL for nodes**, par défaut `https://`). | ## Préparer l'infrastructure {#prepare-the-infrastructure} ### Nœud VPN {#vpn-node-1} 1. **Provisionnez l'hôte** avec un Linux pris en charge et les adresses IPv4 publiques que vous souhaitez vendre, soit configurées sur l'interface réseau, soit routées vers l'hôte. 2. **Si vous vendez un bloc routé**, prévoyez de le saisir en tant qu'**Extra subnet** lors de l'ajout du nœud. L'agent installe une route `local dev lo` afin que l'hôte accepte le trafic pour chaque adresse du bloc, puis signale les adresses trouvées. L'agent lit également la table de routage réelle de l'hôte et ne vend ni ne capture jamais une adresse de **passerelle** : si le bloc contient le saut suivant de l'une des routes de l'hôte (par exemple l'adresse du routeur d'un bloc on-link), l'agent installe des routes `local` uniquement pour les parties du bloc qui l'entourent, signale la passerelle au panneau, et le panneau exclut cette adresse du pool et de chaque allocation. Il supprime les routes installées lorsque le sous-réseau supplémentaire change ou que l'agent s'arrête. 3. **Ouvrez le pare-feu.** Autorisez le trafic TCP et UDP entrant **65001-65535** sur les adresses publiques, et HTTPS sortant vers le panneau. 4. **Facultatif : compteurs d'octets par IP.** La comptabilité Conntrack (`net.netfilter.nf_conntrack_acct = 1`) permet au rôle de surveillance de compter les octets par IP. Le panneau peut l'activer en envoyant une commande `acct` à l'agent, ce qui écrit également `/etc/sysctl.d/99-cmp-agent.conf`. Le rôle VPN en lui-même n'en a pas besoin. 5. **Vérifiez le panneau depuis le nœud :** ```bash curl -fsS -o /dev/null -w '%{http_code}\n' https://cloud.example.com/install.sh ``` ### Nœud proxy IPv6 {#ipv6-proxy-node-1} Un préfixe IPv6 atteint le nœud de l'une de ces deux manières. L'installateur teste les deux avec de vraies connexions sortantes et conserve ce qui fonctionne. | Type | Signification | Configuration | |---|---|---| | **Routé** | Votre opérateur achemine un préfixe (par exemple /48 ou /56) **vers la propre adresse du nœud**. Les paquets sortants peuvent utiliser n'importe quelle adresse du préfixe comme source et les réponses reviennent au nœud. | Demandez à votre fournisseur un préfixe routé dont le saut suivant est le nœud. Rien de plus sur le nœud : le service proxy utilise des sockets transparents, une table de routage par politique fixe et `nft`. | | **On-link** | Le /64 se trouve sur le même réseau local que le nœud. Les réponses ne fonctionnent que si le nœud répond aux requêtes de découverte de voisins pour chaque adresse utilisée (**proxy NDP**). | Le service définit, sur cette interface uniquement, `net.ipv6.conf..accept_ra=2`, `forwarding=1` et `proxy_ndp=1`, mémorise les anciennes valeurs, les restaure à l'arrêt et bloque le transfert des adresses du pool afin que le nœud ne devienne pas un routeur pour le pool. | Fonctionnement de la vérification : le nœud tente une connexion TCP vers une adresse IPv6 publique (port 443) à partir d'une adresse aléatoire du préfixe candidat, dans un délai de 6 secondes. Les candidats sont des adresses globales sur les interfaces avec un préfixe de /64 ou plus court, ainsi que des routes de type `local`, `unreachable` ou `blackhole` entre /16 et /64. Un préfixe plus court que /64 est accepté comme **routé** si un /64 aléatoire à l'intérieur fonctionne. ::: warning Ne pas utiliser le même préfixe deux fois Un préfixe ne doit pas chevaucher le préfixe d'un autre nœud et ne doit pas être plus large qu'un préfixe appartenant déjà au propre pool IPv6 du panneau. Un /64 **à l'intérieur** du pool du panneau est autorisé. Les chevauchements sont signalés comme « assign range … (node …) » dans le résultat de l'installation et le préfixe est ignoré. ::: Restrictions appliquées par le nœud lui-même : les clients ne peuvent pas envoyer d'e-mails (ports 25, 465, 587, 2525) à partir des adresses du pool, et le trafic IPv4 du démon est limité aux réponses ainsi qu'au panneau et au DNS. ## Connecter dans NexCMP {#connect-in-nexcmp} ### Nœud VPN {#vpn-node-2} 1. Sur **System › Admin › License & updates**, activez **VPN**. Voir [Modules](https://nexcmp.com/fr/docs/infrastructure/modules/). ![La carte Module avec les commutateurs VPN et IPv6 Proxy](https://nexcmp.com/fr/docs/images/infrastructure/vpn-proxy-nodes-01-modules.webp) 2. Ouvrez **Infrastructure › VPN & Proxy nodes › Agents & external nodes**. Vous disposez de deux méthodes pour ajouter un nœud. **a. Installation via SSH.** Cliquez sur **+ Add server (SSH)** et remplissez : | Champ | Exemple de valeur | |---|---| | Adresse IPv4 du serveur | `192.0.2.50` | | Port SSH | `22` | | Utilisateur SSH | `root` | | Mot de passe SSH | `XXXX` | | Nom d'affichage | `node-ny-1` (vide : nommé d'après l'IP) | | Rôle du serveur | External VPN / Proxy Node | | Attribution de zone | Automatique par GeoIP (créer / assigner une zone) ou zone existante | | Sous-réseau supplémentaire (optionnel) | laisser vide pour analyser automatiquement les interfaces ou spécifier un bloc routé tel que `203.0.113.0/24` | | Activer la vente après l'installation | activer pour marquer chaque adresse détectée comme vendue | Cliquez sur **Connect & install**. Le panneau se connecte en SSH, exécute l'installateur en une ligne sur le nœud avec un jeton à usage unique, et affiche le nom du nœud, son emplacement GeoIP et les plages détectées. ![Boîte de dialogue d'ajout de nœud via SSH avec un exemple d'adresse de serveur et de rôle](https://nexcmp.com/fr/docs/images/infrastructure/vpn-proxy-nodes-02-add-server-ssh.webp) **b. Installation manuelle.** Cliquez sur **Generate manual install token**. La commande s'affiche **une seule fois** ; copiez-la et exécutez-la sur le nœud : ```bash curl -fsSL https://cloud.example.com/install.sh | sudo sh -s -- --token XXXX --name node-ny-1 ``` Une installation par jeton inscrit la machine uniquement pour la surveillance : par sécurité, le panneau ne permet pas à une machine détenant le jeton partagé de s'attribuer le rôle VPN (l'ajout de `--roles vpn` à la commande est sans effet). Une fois la machine visible dans la liste, ouvrez-la et attribuez-lui vous-même le rôle **VPN**. L'installation via SSH (option a) attribue d'emblée le rôle VPN au nœud. Un nouveau jeton annule l'ancien ; les hôtes déjà inscrits continuent de fonctionner car ils utilisent leur propre clé. ![Boîte de dialogue de commande d'installation affichant le jeton à usage unique](https://nexcmp.com/fr/docs/images/infrastructure/vpn-proxy-nodes-03-install-command.webp) Ce que fait l'installateur : il télécharge `cmp-agent-linux-amd64` depuis votre panneau, **en vérifie le SHA-256**, l'installe vers `/usr/local/bin/cmp-agent`, s'enrôle avec le jeton, écrit `/etc/cmp-agent/agent.json` et démarre le service systemd `cmp-agent`. Pour le désinstaller : `curl -fsSL https://cloud.example.com/install.sh | sudo sh -s -- --uninstall`. 3. Après le premier signal de vie, le nœud apparaît dans la liste. Son pays est détecté par GeoIP (d'abord via la recherche propre du nœud, puis par la base de données du panneau). Une **zone** pour ce pays est créée et rendue publique si elle n'existe pas, et les adresses trouvées sur l'hôte deviennent des plages de pools. 4. Ouvrez **Infrastructure › VPN & Proxy nodes › VPN IP pools** pour voir les plages, leur zone et leur nœud, ainsi que pour modifier la zone, le nœud ou le commutateur **Sellable** de chaque plage. **Enable range** permet aux nouvelles commandes d'utiliser ses IP libres ; **Disable range** arrête seulement les nouvelles allocations, les IP louées continuent de fonctionner. ![Pools IP VPN avec des plages signalées par un nœud](https://nexcmp.com/fr/docs/images/infrastructure/vpn-proxy-nodes-04-vpn-pool.webp) 5. Ouvrez **Services › VPN**, définissez la grille tarifaire et activez les ventes. L'interrupteur **Sell VPN** sur **Subscriptions** est identique au module VPN dans License & updates. 6. **Facultatif : renommer le service.** Dans **Settings › Branding**, **VPN service display name** modifie la façon dont le service VPN est nommé dans le menu client, la page de commande, la page de détail et la liste de déploiement (par exemple `IPv4 Proxy`, `Datacenter Proxy` ou `Static Residential Proxy` ; jusqu'à 40 caractères, vide conserve `VPN`). Cela ne modifie que les libellés : les routes, les données et l'API restent inchangées. ### Nœud proxy IPv6 {#ipv6-proxy-node-2} 1. Sur **System › Admin › License & updates**, activez **IPv6 Proxy**. 2. Ouvrez **Infrastructure › VPN & Proxy nodes › IPv6 Proxy nodes** et cliquez sur **Add node (SSH)**. Saisissez l'adresse IPv4 du nœud, le port SSH, l'utilisateur, le mot de passe, un nom facultatif et un **Reason** (qui est consigné dans le journal d'audit), puis cliquez sur **Install**. ![Boîte de dialogue d'ajout de nœud IPv6 avec un exemple d'adresse et de motif](https://nexcmp.com/fr/docs/images/infrastructure/vpn-proxy-nodes-05-proxy6-add-node.webp) 3. Le panneau effectue ensuite, dans l'ordre : vérifie la machine et les ports, copie le démon, le script réseau, l'unité de service et un fichier d'environnement spécifique au nœud (un jeton de nœud et une clé de signature de mot de passe), exécute la **sonde** (probe) pour trouver les préfixes utilisables, enregistre les préfixes dans le pool, démarre le service et attend jusqu'à 90 secondes pour le premier rapport. **Install log** affiche chaque étape. 4. Un nouveau nœud crée sa zone à l'état **off** (à partir du GeoIP de l'IPv4 du nœud). Activez la zone sous **Infrastructure › Datacenter › Zone** pour que les clients puissent la choisir. 5. Définissez une **Mbps cap** totale par nœud (de 10 à 100000 par direction). Sous **Services › IPv6 Proxy**, définissez la liste de prix et activez les ventes. 6. Vérifiez **IPv6 Proxy › Settings › Panel URL for nodes**. Les nœuds appellent cette adresse (`https://host`, sans chemin) pour récupérer leur configuration et envoyer des rapports. Laisser vide équivaut à `https://`. Il doit s'agir d'un hôte dont l'adresse pointe directement vers le panneau, afin que l'IPv4 propre au nœud l'atteigne sans modification. ::: tip Calendrier de rotation Les clients peuvent définir un intervalle de rotation automatique de 30 à 600 secondes. Dans NexCMP, le panneau exécute ce calendrier (ainsi que le nettoyage horaire des journaux de connexion) ; les nœuds adoptent une nouvelle adresse en 5 secondes environ. ::: ### Fonctionnement des rapports d'un nœud {#how-a-node-reports} | | Nœud VPN (`cmp-agent`) | Nœud proxy IPv6 | |---|---|---| | Enregistrement | Ticket ou jeton unique via HTTPS, puis sa propre clé | Installation SSH unique, puis jeton de nœud | | Signal de vie | Toutes les **5 secondes** (10 s pour un agent de surveillance uniquement) ; le panneau peut définir une valeur de 3 à 300 s. Après un échec, il observe un recul par paliers de 5 s jusqu'à 60 s | Le nœud envoie un rapport toutes les 60 secondes environ et récupère la configuration | | Affiché comme en ligne | Un signal de vie au cours des **60 dernières secondes** | **alive** au cours des **120 dernières secondes**, sinon **missed heartbeat** | | Modification de configuration | Appliquée au prochain signal de vie | Appliquée en 5 secondes environ | | Mises à jour | Le panneau peut envoyer une commande `upgrade` avec la nouvelle version, l'URL et le code SHA-256 | Réinstallation depuis la ligne du nœud | ### Quota de données sur un nœud VPN {#data-allowance-on-a-vpn-node} Depuis NexCMP **1.5.1**, l'agent du nœud VPN transmet le trafic acheminé à chaque heartbeat, et le panneau l'ajoute à la consommation du forfait pour la période en cours. La même valeur est présentée au client (onglets Overview et Bandwidth) ainsi qu'à vous (VPN › Subscriptions, colonne Used, et ligne du nœud). - **Interruption.** Lorsqu'un forfait a consommé ses Go pour la période, le panneau cesse d'envoyer les points de terminaison de ce forfait à l'agent, de sorte que les nouvelles connexions sont refusées et les connexions actives sont fermées. La coupure intervient dans l'intervalle d'un heartbeat, un forfait peut donc dépasser légèrement sa limite. Les forfaits avec un palier Unlimited ne sont jamais coupés. - **Rétablissement.** Le forfait est de nouveau desservi dans l'intervalle d'un heartbeat après l'achat de bande passante supplémentaire par le client ou dès le début de la période suivante. - **Non mesuré.** Un nœud dont l'agent n'a pas transmis de consommation (par exemple un agent plus ancien) affiche **Not measured**, et ses plans ne sont jamais interrompus en raison des Go. - **Mettez à jour l'agent.** Utilisez l'agent **1.5.1** sur les nœuds. Les versions antérieures de l'agent sont toujours comptabilisées, mais elles peuvent perdre les octets d'un heartbeat ayant échoué, d'un endpoint arrêté ou d'un redémarrage, et elles ne ferment pas les connexions ouvertes lorsqu'un forfait est coupé. Mettez à jour depuis la ligne du nœud (Reinstall) ou avec la commande `upgrade`. - Le décompte porte sur la charge utile transitant par le proxy, il est donc légèrement inférieur (environ 1 %) aux octets circulant sur le réseau. ### Options VPN retirées {#retired-vpn-add-ons} High IP Reputation, High Concurrency et High Priority Network ne sont plus proposées pour les nouvelles commandes. Les abonnements existants conservent leurs options sélectionnées, mais les frais retirés sont supprimés de leurs montants de renouvellement. Les périodes déjà payées ne font l'objet d'aucun remboursement. L'ajustement utilise le prix catalogue actuel de l'option ; si vous avez modifié ce prix ou supprimé l'option, vérifiez le montant de renouvellement de l'abonnement avant sa prochaine échéance. ## Vérification {#verify} 1. La ligne du nœud est en ligne. Pour un nœud VPN, **Agents & external nodes** affiche sa zone, son pays, son rôle et les plages détectées. 2. **VPN IP pools** liste les plages avec des IP libres ; la page de détail de la zone affiche l'infrastructure VPN. 3. Commandez un plan VPN ou proxy de test. Le client obtient un point de terminaison `ip:port`, un nom d'utilisateur et un mot de passe ; connectez-vous par ce biais et vérifiez que l'adresse IP publique visible est bien celle du nœud (par exemple `curl --proxy socks5h://USER:XXXX@IP:PORT https://ifconfig.me`). 4. Sur un nœud IPv6, exécutez sur l'hôte : ```bash systemctl is-active nft list tables | grep proxy6 ss -ltn | grep -E ':(80|443|6[0-9]{4})\b' ``` ## Limites et remarques {#limits-and-notes} - Les hôtes Windows peuvent exécuter l'agent de surveillance mais pas le rôle VPN. - Quota de données (Go par période) d'un forfait VPN : à partir de NexCMP 1.5.1, le panel additionne le trafic rapporté par l'agent du nœud VPN et coupe les proxys du forfait lorsque les Go de la période sont épuisés (voir « Quota de données sur un nœud VPN » ci-dessous). Les forfaits IPv6 Proxy n'ont pas de quota en Go ; ils limitent la vitesse en Mbps par forfait. - Les adresses IPv4 d'un forfait VPN ne font pas l'objet d'une rotation. Un client signale une IP sur liste noire ; vous ou le revendeur approuvez un remplacement depuis la même zone. Seul IPv6 Proxy effectue une rotation. - Au maximum 64 plages sont signalées par signal de vie. - Un ensemble de points de terminaison VPN utilise trois ports par IP vendue. Avec les ports 65001-65535, chaque IP dessert un nombre limité de points de terminaison (178 ensembles de ports) ; le panneau ignore les ensembles déjà utilisés auparavant. - La suppression d'un nœud proxy IPv6 n'est autorisée que lorsqu'aucune offre n'y détient d'IP. Cela supprime les plages et le jeton du nœud ; le logiciel sur l'hôte n'est pas désinstallé. - Il est possible de revendre une plage qui héberge également vos propres machines virtuelles : le VPN n'utilise que les ports 65001-65535, il partage donc l'IP avec d'autres services. ## Dépannage {#troubleshooting} | Symptôme | Cause | Solution | |---|---|---| | "échec de l'enrôlement (jeton invalide ou serveur inaccessible)" | Jeton erroné ou déjà utilisé, ou panneau inaccessible | Générez un nouveau jeton ou réessayez l'installation SSH. | | "incompatibilité de signature de fichier - ARRÊT" | L'agent téléchargé diffère du SHA-256 publié | Vérifiez le dossier `/dl/` du panneau et assurez-vous qu'aucun élément ne réécrit le téléchargement en cours de route. | | "cet installateur est réservé à Linux" / "l'architecture … n'est pas encore prise en charge" | Windows, ou une architecture autre que x86_64 (la version fournit l'agent pour x86_64 uniquement) | Utilisez un hôte Linux x86_64. | | Le nœud n'apparaît pas | Le nœud ne peut pas joindre le panneau via HTTPS | Testez `curl https:///install.sh` depuis le nœud ; vérifiez le DNS et le pare-feu. | | Le nœud apparaît avec le mauvais pays | Les recherches de pays ont échoué, la base de données d'adresses du panneau a donc été utilisée | Autorisez l'accès sortant vers `ip-api.com` et `ipinfo.io`, ou choisissez explicitement la zone dans le formulaire SSH. | | Aucune plage détectée | Aucune IPv4 publique sur une interface non virtuelle | Ajoutez une adresse publique ou saisissez le bloc routé en tant que **Extra subnet**. | | Le VPN fonctionne, le trafic sort d'une autre IP | L'IP vendue n'est pas assignée ou routée vers l'hôte | Assurez-vous que l'IP se trouve sur une interface ou est couverte par `local … dev lo`. | | "le serveur du panel ne dispose pas de sshpass" | L'hôte du panel ne peut pas se connecter aux nœuds avec un mot de passe | Exécutez `sudo apt-get install -y sshpass openssh-client` sur le serveur du panel, puis réinstallez le nœud. | | "not found in the installed package" lors de l'installation d'un nœud IPv6 | Le panel est antérieur à la version 1.4.2, ou il s'agit d'un build personnalisé sans les fichiers du nœud | Mettez à jour NexCMP vers la version 1.4.2 ou ultérieure ; pour un build personnalisé, utilisez `build.sh`, qui intègre désormais `brandy-proxy6d` et `brandy-proxy6-net`. | | "SSH: …" au début d'une installation IPv6, ou "SSH to internal/loopback addresses is not allowed" | Port, utilisateur ou mot de passe erroné, SSH bloqué, ou adresse privée | Utilisez l'IPv4 publique du nœud et vérifiez l'accès manuellement avec `ssh -p PORT USER@IP`. | | "architecture … non prise en charge (x86_64 uniquement)" | Le nœud n'est pas en x86_64 | Utilisez un hôte x86_64. | | "commande manquante sur le nœud : …" | `nft`, `ip`, `ss`, `sysctl`, `systemctl` ou `useradd` non installé | Installez les paquets, puis relancez l'installation. | | "ports utilisés par un autre service sur le nœud : … — 80, 443, 60001-65535 doivent être libres" | Le port 80, 443 ou un port supérieur à 60000 est occupé | Déplacez l'autre service ; l'installateur ne l'arrête pas. | | "aucun préfixe IPv6 avec accès Internet trouvé sur le nœud (échec de la sonde de sortie réelle)" | Aucun préfixe routé, proxy NDP impossible ou absence d'IPv6 sortant | Vérifiez que le préfixe est routé vers le nœud, que l'interface dispose d'une connectivité IPv6 et qu'aucun élément ne filtre le trafic sortant. | | "toutes les plages détectées appartiennent déjà à un autre nœud" | Le préfixe est déjà utilisé par un autre nœud | Retirez-le de l'autre nœud ou choisissez un autre préfixe. | | L'installation se termine par "no initial report received from node" | Le service a démarré mais n'a pas joint le panneau en l'espace de 90 secondes | Vérifiez l'URL du panneau fournie aux nœuds et le chemin HTTPS du nœud vers celui-ci ; consultez le **Install log**. | | La ligne du nœud affiche **missed heartbeat** | Aucun rapport pendant 120 secondes | Vérifiez le service sur le nœud, son horloge et son chemin vers le panneau. | | Les clients ne voient aucun emplacement IPv6 | La zone est désactivée | Activez la zone sous **Zone**. | --- # AI Models {#ai-models} > **Dans l'admin :** System › Admin › License & updates (`/license`) pour activer le module. Puis Services › AI Models : Providers (`/ai/providers`), Models (`/ai/models`), Profit (`/ai/profit`) et Audit (`/ai/audit`). Les clients utilisent AI › API dans le portail client. ## Description {#what-it-does} AI Models est une passerelle et une couche de facturation intégrées à votre propre panneau. Vos clients obtiennent des clés API et appellent **un endpoint unique sur votre domaine**, au format compatible OpenAI ou compatible Anthropic. Vous choisissez les modèles à proposer et le coût de chacun pour 1 million de tokens. NexCMP vérifie la clé, les limites et le solde, transmet la requête à un fournisseur que vous avez ajouté, comptabilise les tokens et débite le compte prépayé du client. **Vous fournissez les sources de modèles.** NexCMP est livré sans provider, sans modèle, sans adresse par défaut et sans tarif. Il ne fournit ni modèles, ni clés API, ni tokens, ni comptes de provider. ::: warning Vérifiez d'abord les conditions de vos sources De nombreuses sources de modèles limitent la revente ou la transmission d'accès à des tiers. N'utilisez que des sources que vous êtes autorisé à exploiter et à revendre, et respectez leurs conditions ainsi que la législation en vigueur. Cette page ne constitue pas un conseil juridique. ::: AI Models est un produit distinct de **AI Chat and AI Agent** (module **AI**, voir [AI providers](https://nexcmp.com/fr/docs/ai/ai-providers/)). Les deux modules sont totalement indépendants. ## Prérequis {#requirements} | Élément | Prérequis | |---|---| | Module | **AI Models** activé sous License & updates, Modules. Il est désactivé par défaut. | | Providers | Une ou plusieurs sources de modèles que vous êtes autorisé à revendre, chacune avec une API compatible OpenAI (`/chat/completions`), une API compatible Anthropic (`/messages`) ou les deux. Chacune nécessite une URL de base et une clé API. | | Réseau | Le panel doit pouvoir joindre chaque provider en **HTTPS sur le port 443** via un nom de domaine public. Tout provider situé sur un hôte interne, un autre port ou en HTTP standard doit être répertorié sous **Allowed internal hosts** (paramètre `ai_endpoint_allow`). | | Clients | Un compte client avec une adresse e-mail vérifiée et un solde sur son wallet. | | Matériel | Aucun. NexCMP ne fait que relayer les requêtes : aucun GPU ni fichier de modèle requis. | ## Préparer l'infrastructure {#prepare-the-infrastructure} 1. Obtenez une clé API auprès de chaque source de modèle que vous utiliserez, et notez son URL de base (par exemple `https://api.example.com/v1`). 2. Vérifiez les conditions de la source concernant la revente. 3. Si une source fonctionne sur votre réseau interne, déterminez son adresse, par exemple `http://10.0.0.5:8000/v1`. Vous renseignerez `10.0.0.5:8000` sous **Allowed internal hosts**. ## Connecter dans NexCMP {#connect-in-nexcmp} ### 1. Activer le module {#_1-turn-the-module-on} Ouvrez **System › Admin › License & updates**, localisez la carte **Module** et activez **AI Models**. Le menu se recharge et **Services › AI Models** apparaît. Tant que le module est désactivé, les pages client, les pages d'administration et la passerelle répondent toutes `404 module_disabled`, et aucun provider n'est contacté. ![La carte Module avec le commutateur AI Models activé](https://nexcmp.com/fr/docs/images/infrastructure/ai-models-01-modules.webp) ### 2. Ajouter un fournisseur {#_2-add-a-provider} 1. Ouvrez **AI Models › Providers** et choisissez **Add provider**. 2. Saisissez un **slug** court, un **nom** (vous seul le voyez), le **type** (OpenAI-compatible, Anthropic-compatible ou Both), l'**URL de base** et l'**API key**, ainsi qu'une **priorité** (un nombre plus faible est testé en premier). 3. Enregistrez. La clé est stockée chiffrée et seuls ses quatre derniers caractères sont affichés par la suite. Une clé ne peut être saisie que depuis une session administrateur connectée. N'utilisez **Both** que pour une passerelle qui prend réellement en charge les deux formats. NexCMP ne convertit **pas** un format vers l'autre : un modèle proposé par un fournisseur compatible OpenAI est accessible sur `/ai/v1/chat/completions`, et un modèle proposé par un fournisseur compatible Anthropic sur `/ai/v1/messages`. ![La page Providers listant trois exemples de fournisseurs avec leur type, priorité et statut](https://nexcmp.com/fr/docs/images/infrastructure/ai-models-02-providers.webp) ### 3. Tester la connexion {#_3-test-the-connection} Choisissez **Test connection** sur le fournisseur. NexCMP interroge `GET /models` avec la clé et indique **ok**, ou la raison de l'échec : **auth** (clé incorrecte), **blocked**, **billing** ou **unreachable**. Les tests sont limités à 6 par minute. ### 4. Synchroniser les modèles {#_4-sync-the-models} Choisissez **Sync models**. NexCMP lit la liste des modèles du fournisseur et ajoute chaque nouveau modèle **désactivé et sans prix**. Un modèle qui ne figure plus chez le fournisseur est signalé. Tant que le module est activé, la liste est également synchronisée automatiquement toutes les 6 heures (paramètre `ai_models_sync_hours`). ### 5. Définir les prix et activer les modèles {#_5-set-prices-and-switch-models-on} 1. Ouvrez **AI Models › Models**. 2. Pour chaque modèle que vous souhaitez commercialiser, définissez le **prix de vente** en dollars américains par 1 million de tokens: **input**, **cached input** et **output**. 3. Vous pouvez également saisir votre **coût** pour le modèle. **Profit** affiche alors les revenus par rapport aux coûts par jour et par modèle, et un prix de vente inférieur à votre coût majoré de la marge minimale (paramètre `ai_min_margin_pct`, 10 par défaut) est refusé à moins que vous ne confirmiez une vente à perte délibérée. **Set price from cost** utilise une marge que vous choisissez ; il n'y a pas de marge par défaut. 4. Activez le modèle. Un modèle sans prix de vente ne peut pas être activé. Un prix de cached input laissé à zéro est facturé au prix de l'input. ![La page Models avec les prix de vente input, cached input et output ainsi que les commutateurs d'activation](https://nexcmp.com/fr/docs/images/infrastructure/ai-models-03-models.webp) ### 6. Routes et basculement {#_6-routes-and-failover} Sur un modèle, **Routes** liste les fournisseurs qui le desservent, dans l'ordre. Ajoutez un deuxième fournisseur de secours, définissez l'ordre et indiquez si besoin un nom de modèle différent pour chaque fournisseur (le nom envoyé au fournisseur peut différer du nom que vous publiez). Lorsqu'un fournisseur renvoie une erreur de serveur, une erreur d'autorisation ou de facturation, un modèle manquant ou une limite de débit, NexCMP essaie la route suivante. Si un délai d'attente de lecture expire après l'envoi de la requête, celle-ci n'est **pas** envoyée à un autre fournisseur, pour vous éviter de payer deux fois. Chaque fournisseur est régulé à `ai_provider_rpm` requêtes par minute (50 par défaut). Si un fournisseur continue de renvoyer des erreurs d'autorisation ou de facturation, NexCMP alerte l'administrateur sur Telegram lorsque Telegram est configuré. ### 7. Activer le commutateur de vente {#_7-open-the-sale-switch} En haut des pages AI Models, le **commutateur de vente** (paramètre `feature_ai_models`) est désactivé par défaut. Tant qu'il est désactivé, les clients voient que le service n'est pas encore ouvert et la liste de prix publique l'indique comme indisponible. Vérifiez qu'au moins un modèle est activé, qu'il a un prix de vente et une route avec une clé, puis activez-le. ### Ce que les clients peuvent faire {#what-customers-can-do} Dans le portail client, **AI › API**: - **Models** affiche vos modèles et vos prix, l'URL de base et des exemples de commandes prêts à l'emploi. - **API Keys** : créez, renommez, renouvelez, désactivez et supprimez des clés. Un secret n'est affiché qu'une seule fois ; seul un hash est conservé. Par clé : modèles autorisés, expiration, budget indicatif (avertit) et budget strict (bloque avec `402`), requêtes par minute et tokens par minute. - **Usage** par modèle, clé et jour, avec export. - **Logs**: enregistrements de requêtes filtrables (heure, clé, modèle, tokens, coût, statut, latence). **Les prompts et réponses ne sont pas enregistrés.** Les logs sont conservés 90 jours par défaut (`ai_log_retention_days`). - **Settings**: un budget de compte et l'adresse e-mail pour les alertes de budget. - **Playground**: discutez avec un modèle, comparez des modèles côte à côte et copiez le code correspondant. ![La page API Keys du client avec les URL de base pour les deux formats d'API](https://nexcmp.com/fr/docs/images/infrastructure/ai-models-04-keys.webp) Les endpoints de la passerelle, sur votre domaine: ```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 ``` ### Portefeuille et facturation {#wallet-and-billing} L'utilisation de l'IA est débitée du même portefeuille prépayé que tous les autres services. Avant qu'une requête ne soit envoyée à un fournisseur, NexCMP réserve le montant maximal que la requête pourrait coûter; si le solde est inférieur au minimum (`ai_min_balance_cents`, 20 centimes par défaut) ou insuffisant, la requête est refusée avec `402 insufficient_balance` et **aucun fournisseur n'est appelé**. L'utilisation est regroupée par compte et imputée dans le grand livre du portefeuille après chaque heure, avec un balayage toutes les 5 minutes; l'utilisation non encore imputée est déjà déduite du solde visible par la passerelle. Les revendeurs peuvent vendre AI Models sur leur propre domaine: leur marge ou remise s'applique à votre prix de vente et leur portefeuille wholesale est débité du prix de gros. Un commutateur d'IA par revendeur, activé par défaut, contrôle qui peut les vendre. ## Vérification {#verify} 1. Après l'étape 3, **Test connection** affiche **ok** et le nombre de modèles. 2. Après l'étape 4, les nouveaux modèles sont listés, désactivés, sans aucun prix. 3. En tant que client disposant d'un portefeuille approvisionné, créez une clé et appelez la passerelle: ```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"}]}' ``` Une réponse `200` renvoie la réponse du modèle. **Usage** affiche la requête, et **Profit** l'affiche si vous avez saisi un coût. 4. Avec un portefeuille à zéro, le même appel renvoie `402 insufficient_balance`. ## Limites et remarques {#limits-and-notes} - Le module n'intègre aucun fournisseur, modèle ou tarif par défaut, et aucune grille tarifaire n'est jamais récupérée auprès d'un fournisseur. - Les outils exécutés côté fournisseur et facturés par appel, comme la recherche web, sont rejetés car ils ne peuvent pas être mesurés. Seule une courte liste de paramètres de requête est transmise. - L'utilisation des tokens est extraite de la réponse du fournisseur; si une réponse n'en contient pas, NexCMP l'estime et marque l'enregistrement comme estimé. - Les erreurs d'un fournisseur sont nettoyées avant d'atteindre le client (les noms, hôtes, adresses et le nom de modèle du fournisseur sont supprimés). Les clients ne voient jamais quel fournisseur a traité une requête. - Les clients accèdent à la passerelle via le domaine de votre panneau, le protocole TLS de ce domaine doit donc être fonctionnel. - NexCMP ne fournit pas de contrat de niveau de service, de fine-tuning ni d'hébergement GPU pour ce module. ## Dépannage {#troubleshooting} | Symptôme | Cause et résolution | |---|---| | Toutes les pages AI Models et la passerelle répondent `404 module_disabled` | Le module est désactivé. Activez **AI Models** sous License & updates, Modules. | | L'ajout d'un fournisseur échoue avec `endpoint_host_not_allowed`, `endpoint_must_be_https` ou `invalid_endpoint_port` | L'URL de base doit être en HTTPS sur le port 443 avec un nom de domaine public. Pour un hôte interne, un autre port ou du HTTP simple, ajoutez `host:port` sous **Allowed internal hosts**. | | `blocked_endpoint` | L'adresse est une IP, ou le nom résout vers une adresse privée. Ajoutez-la sous **Allowed internal hosts** si c'est ce que vous souhaitez. | | **Test connection** indique `auth` | La clé est incorrecte ou n'a aucun accès. Saisissez à nouveau la clé. | | Un modèle ne peut pas être activé (`no_price`) | Définissez d'abord un prix de vente. | | Les clients reçoivent `503 ai_unavailable` | Le commutateur de vente est désactivé, ou le commutateur d'IA du revendeur est désactivé. | | Les clients reçoivent `503 upstream_unavailable` | Aucune route activée avec une clé ne dessert ce modèle dans le format demandé. Vérifiez les routes du modèle et le type de fournisseur. | | Les clients reçoivent `402 insufficient_balance` | Le solde du portefeuille est inférieur au minimum ou insuffisant pour la requête. Demandez au client de recharger. | --- # Object Storage (S3, Ceph RGW) {#object-storage-s3-ceph-rgw} > **Où trouver dans l'admin :** Infrastructure › Cloud provider › Ceph S3 (RGW) (`/infra/s3`). Comptes : Services › Object Storage › S3 accounts (`/s3`). Tarification : Services › Object Storage › PAYG pricing (`/s3/policy`). Activez le module sous System › Admin › License & updates. ## Description {#what-it-does} Les clients créent des comptes S3 depuis le portail et obtiennent des clés d'accès. NexCMP crée et supprime les utilisateurs correspondants sur **votre Ceph RADOS Gateway (RGW)** via l'API Admin Ops du RGW, lit l'utilisation pour la facturation et facture à l'usage : le stockage au-delà d'un palier gratuit par Go et par mois (facturé à l'heure) ainsi que le trafic de téléchargement par Go. Les téléversements sont gratuits. Utilisez cette option lorsque vous exploitez un cluster Ceph avec RGW et souhaitez revendre du stockage objet. ## Prérequis {#requirements} | Élément | Prérequis | |---|---| | Ceph | Un cluster doté d'au moins un démon RGW, avec l'**Admin Ops API** activée (le défaut `rgw_enable_apis` inclut `admin`). | | Utilisateur administrateur | Un utilisateur RGW pour NexCMP disposant des privilèges listés ci-dessous. N'utilisez pas un utilisateur qui possède des données clients. | | Points de terminaison | Le point de terminaison S3 utilisé par les clients et le point de terminaison Admin Ops. Tous deux sont écrits sous la forme `https://host` **sans chemin, port 443 uniquement**, et doivent se résoudre en une adresse **publique** : les adresses de boucle locale, de liaison locale, de multidiffusion, privées et locales uniques sont refusées. | | Certificat | Un certificat valide pour l'hôte du point de terminaison. | | Journal d'utilisation | La journalisation d'utilisation RGW activée (`rgw_enable_usage_log = true`), afin que l'API d'utilisation puisse rapporter le trafic. | | Zone | Une zone principale avec le service **Object Storage (S3)** coché. Voir [Zones](https://nexcmp.com/fr/docs/infrastructure/zones/). | | Stockage | De la capacité dans Ceph pour les quotas que vous vendez. | | Dépend de | Le module **Object Storage**. Le trafic de téléchargement entrant compte également dans [Bandwidth](https://nexcmp.com/fr/docs/catalog/bandwidth/). | ## Préparer l'infrastructure {#prepare-the-infrastructure} Sur un nœud d'administration Ceph : 1. Créez l'utilisateur administrateur et attribuez-lui les privilèges Admin Ops nécessaires : ```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 ``` Copiez la `access_key` et la `secret_key` depuis la sortie. Ce sont la **clé d'accès administrateur** et la **clé secrète administrateur** dans NexCMP. 2. Activez le journal d'utilisation et redémarrez les passerelles : ```bash ceph config set client.rgw rgw_enable_usage_log true ``` 3. Placez les passerelles derrière HTTPS sur le port 443 (un proxy inverse ou le TLS propre au RGW), publiez le nom DNS et testez depuis le serveur du panneau : ```bash curl -fsS -o /dev/null -w '%{http_code}\n' https://s3.example.com/ ``` Vous devriez obtenir une réponse XML S3 (HTTP 200 ou 403), et non un délai d'attente (timeout). ## Connecter dans NexCMP {#connect-in-nexcmp} 1. **Attribuer le service S3 à une zone.** Ouvrez **Infrastructure › Datacenter › Zone**, modifiez la zone et cochez **Object Storage (S3)**. Seules les zones principales disposant du service S3 apparaissent dans le formulaire du backend. 2. Ouvrez **Infrastructure › Cloud provider › Ceph S3 (RGW)** et cliquez sur **Add backend** : | Champ | Exemple de valeur | |---|---| | Nom du backend | `Ceph RGW 1` | | Zone | la zone de l'étape 1 | | Point de terminaison RGW Admin Ops | `https://s3.example.com` | | Point de terminaison S3 client | `https://s3.example.com` | | Région de signature S3 | `default` | | Clé d'accès administrateur | `XXXX` | | Clé secrète administrateur | `XXXX` | | Actif | activé | | Activer les ventes (nécessite d'abord un test de connexion) | **désactivé** pour l'instant | | Motif de la modification | `initial setup` | ![Boîte de dialogue Backend S3 avec des exemples de points de terminaison, de région et de clés masquées](https://nexcmp.com/fr/docs/images/infrastructure/s3-02-backend-dialog.webp) 3. Cliquez sur **OK** (enregistrer), puis sur **Check** dans la ligne. NexCMP appelle l'API Admin Ops avec la clé admin. **Ceph connection successful** et l'étiquette **Verified** indiquent que tout fonctionne. 4. Cliquez sur **Edit**, activez **Enable sales** et enregistrez. NexCMP refuse d'ouvrir les ventes tant qu'un test n'a pas réussi. 5. Ouvrez **Services › Object Storage › PAYG pricing** et définissez la tarification : | Champ | Description | |---|---| | Stockage au-delà du palier gratuit (VND/Go/mois) | Prix du stockage ; facturé à l'heure comme le prix mensuel divisé par 730. | | Téléchargement sortant (VND/Go) | Prix du trafic sortant. | | Téléchargement entrant (VND/Go) | Toujours 0. | | Palier gratuit avec VM en cours d'exécution (Go) | Fixé à 100 Go par compte tant que le client a au moins une VM en cours d'exécution, partagé entre ses comptes S3 par taille. | | Limite de découvert (VND) | Montant d'utilisation impayée autorisé. | | Seuil de facturation (VND) | L'utilisation est regroupée en une facture une fois ce montant dépassé. | | Solde min. pour créer S3 (VND) | Solde du portefeuille requis pour créer un compte. | | Comptes S3 max. par client, Quota technique par défaut (Go) | Limites pour les nouveaux comptes. | ![Formulaire de tarification PAYG S3](https://nexcmp.com/fr/docs/images/infrastructure/s3-04-pricing.webp) Les prix S3 sont saisis en VND. Ils sont convertis pour l'affichage et les prélèvements sur le portefeuille au taux de change en vigueur ; voir [Currency and exchange rates](https://nexcmp.com/fr/docs/catalog/currency-and-exchange-rates/). ## Vérification {#verify} 1. **Check** renvoie « Ceph connection successful ». 2. En tant que client (ou avec un compte de test), créez un compte S3. Sur Ceph, `radosgw-admin user list` affiche un nouvel utilisateur, et **S3 accounts** le liste. 3. Créez un compartiment avec n'importe quel client S3 en utilisant les clés du client sur le point de terminaison client. Téléversez un fichier. 4. Après le cycle de facturation de l'heure suivante, **S3 accounts** affiche l'utilisation. ## Limites et remarques {#limits-and-notes} - Un backend qui possède déjà des comptes associés conserve sa **zone, son point de terminaison et sa région** ; pour les modifier, créez un nouveau backend. - Une zone peut avoir son propre backend ; les comptes et les backends sont définitivement liés à une zone. - Le palier gratuit et la gratuité des téléversements sont des règles fixes, non des options. - Les clés sont stockées de manière chiffrée ; la console n'affiche qu'un champ « laisser vide pour conserver la clé actuelle ». Une paire de clés est toujours saisie ensemble. - Les clés secrètes des clients ne sont affichées qu'une seule fois à la création, plus jamais. Une clé perdue est remplacée par une rotation. ## Dépannage {#troubleshooting} | Symptôme | Cause | Solution | |---|---|---| | "Endpoint requires HTTPS" | Le point de terminaison utilise du HTTP non chiffré | Publiez HTTPS sur le port 443. | | "Port de point de terminaison non autorisé" | Un port autre que 443 | Utilisez le port HTTPS standard. | | "Adresse de point de terminaison non autorisée" | Le nom se résout vers une adresse privée, de boucle locale (loopback), locale au lien (link-local) ou locale unique (unique-local) | Utilisez une adresse publique. | | "Le point de terminaison ne doit contenir que le protocole et l'hôte" | L'URL comporte un chemin, une requête ou des informations utilisateur | Utilisez `https://host` uniquement. | | "Échec de la résolution du point de terminaison" | La résolution DNS échoue depuis le serveur du panneau | Corrigez le DNS. | | "Failed to connect to Ceph" | Erreur de pare-feu ou de TLS | Testez avec `curl` depuis le serveur du panneau. | | "Ceph returned HTTP 403 AccessDenied" | Clés incorrectes ou privilèges manquants | Vérifiez les clés et relancez `radosgw-admin caps add`. | | "Invalid Ceph response" | L'endpoint ne correspond pas à une API RGW Admin Ops | Pointez vers le RGW, et non vers une page Web. | | "Le test de connexion doit réussir avant d'activer la vente" | Vous avez activé les ventes avant un **Check** réussi | Exécutez **Check**, puis activez les ventes. | | "Toutes les nouvelles clés pour le point de terminaison sont requises" | Endpoint modifié sans les deux clés | Saisissez la clé d'accès et la clé secrète ensemble. | | "Le backend possède déjà des ressources associées ; créez un nouveau backend pour changer de zone ou de point de terminaison" | Des comptes existent sur ce backend | Créez un nouveau backend. | | "Sélectionnez la zone principale avec le service S3" | La zone n'est pas une zone maître ou ne dispose pas du service S3 | Cochez **Object Storage (S3)** sur la zone. | | "Invalid region" | La région contient des caractères autres que des lettres, des chiffres, `-` et `_` | Utilisez `default` ou le nom de votre zonegroup RGW. | | "Résumé d'utilisation Ceph manquant ; non facturé" | Journal d'utilisation désactivé | Activez `rgw_enable_usage_log`. | --- # Kubernetes et Cloud privé {#kubernetes-and-private-cloud} > **Où dans l'administration :** Kubernetes : Infrastructure › Cloud provider › CloudStack › Kubernetes (CKS) (`/infra/cloudstack?tab=k8s`), puis Services › Kubernetes (Overview, Clusters, Versions, Policy). Private Cloud : Services › Private Cloud (Overview `/vpc`, VPC `/vpc/list`, Plans & pricing `/vpc/plans`). Activez les deux modules sous System › Admin › License & updates. ## Description {#what-it-does} - **Kubernetes.** Les clients créent des clusters Kubernetes gérés sur votre CloudStack avec CloudStack Kubernetes Service (CKS). Le plan de contrôle est gratuit ; les clients paient pour les nœuds **worker**. NexCMP crée un réseau distinct et une IP publique pour chaque cluster et isole les clusters de chaque client. - **Private Cloud.** Les clients disposent d'un réseau privé (un VPC CloudStack) doté d'un routeur, de sous-réseaux (tiers), de règles de pare-feu (ACL réseau) et de machines virtuelles. Il est vendu par **forfait de bande passante** avec un débit dédié et non mesuré (par exemple 50, 100, 500 Mbps, 1 et 3 Gbps). Chaque client peut posséder un VPC par défaut. Tous deux reposent sur [CloudStack](https://nexcmp.com/fr/docs/infrastructure/cloudstack/) et utilisent son API via la même connexion. ## Prérequis {#requirements} ### Kubernetes {#kubernetes} | Élément | Prérequis | |---|---| | CloudStack | 4.23 (testé). CKS doit être **activé** (`cloud.kubernetes.service.enabled = true`). | | Compte | Un compte **Domain Admin** dans le domaine dédié, afin que NexCMP puisse créer un projet CloudStack pour chaque client et des limites de ressources associées. Voir [CloudStack](https://nexcmp.com/fr/docs/infrastructure/cloudstack/#create-a-dedicated-account-and-api-key). | | `endpoint.url` | Le paramètre global CloudStack doit pointer vers votre API de gestion, accessible depuis les machines virtuelles du cluster. NexCMP affiche la valeur et le résultat d'une vérification de point de terminaison. | | Versions | Au moins une version Kubernetes prise en charge avec son ISO de binaires, à l'état **Enabled**. Les versions en fin de vie ne peuvent pas être proposées à la vente. | | Offre de plan de contrôle | Une offre de service gratuite avec **exactement 2 vCPU, 2048 Mo de RAM et une limite de processeur** (`limitcpuuse = true`), visible par le compte. Le serveur rejette toute autre configuration avec `cp_offering_invalid`. | | Réseau | Une offre de réseau isolé compatible CKS qui est activée. | | IP | Des adresses IPv4 publiques gratuites dans la plage vendable ; chaque cluster en utilise une. | | Capacité | Chaque cluster vous coûte 2 à 4 Go de RAM pour le plan de contrôle et une petite machine virtuelle routeur. Surveillez les onglets de capacité. | ### Cloud privé {#private-cloud} | Élément | Prérequis | |---|---| | CloudStack | 4.23 (testé) avec VPC activé. | | Offre VPC | Une offre VPC. Une offre double pile attribue également un /64 IPv6 à chaque sous-réseau. | | Offres de réseau de sous-réseau | **Une offre de réseau par forfait de bande passante**, créée pour le VPC, avec le **débit réseau** (Mbps) égal au forfait, plus une offre **verrouillée** de **1 Mbps** qui s'applique lorsqu'un VPC est verrouillé pour non-paiement. | | Compte | Le compte dédié (Domain Admin recommandé). Les réseaux VPC restent dans le compte, pas dans les projets. | | IP | Adresses IPv4 publiques gratuites (chaque VPC en utilise une pour le NAT source). | | Espace d'adressage | Chaque VPC reçoit un /16 de `10.128.0.0/9`. Conservez cette plage inutilisée sur vos propres réseaux. | | Dépend de | CloudStack connecté ; le module **Private Cloud**. | ## Préparer l'infrastructure {#prepare-the-infrastructure} ### Kubernetes : activer CKS et ajouter des versions {#kubernetes-enable-cks-and-add-versions} 1. Activez le service et définissez le point de terminaison, puis redémarrez le serveur de gestion : ```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` est appelé en retour par le contrôleur du cluster, il doit donc s'agir d'une adresse accessible par les machines virtuelles du cluster. 2. Compilez un ISO de binaires Kubernetes pour la version que vous souhaitez vendre, à l'aide du script `create-kubernetes-binaries-iso.sh` de l'arborescence source de CloudStack, hébergez-le sur un serveur web et enregistrez-le : ```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 ``` Attendez que l'état de l'ISO devienne **Ready** et que la version soit **Enabled**. 3. Créez l'offre de plan de contrôle, limitée au domaine 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. Vérifiez qu'une offre de réseau CKS est activée : ```bash cmk list networkofferings state=Enabled forvpc=false filter=id,name ``` ### Cloud privé : créer les offres {#private-cloud-create-the-offerings} Dans l'interface utilisateur de CloudStack (**Service Offerings › Network Offerings › Add network offering**) ou avec `cmk` : 1. Répertoriez ce que vous possédez : ```bash cmk list vpcofferings filter=id,name,state cmk list networkofferings forvpc=true filter=id,name,networkrate,state ``` 2. Utilisez une offre VPC activée (double pile si vous souhaitez l'IPv6). Si vous en avez besoin d'une nouvelle, klonez l'offre VPC par défaut de CloudStack et activez-la. 3. Pour **chaque** forfait de bande passante que vous vendez, créez une offre de réseau **pour VPC** (klonez l'offre par défaut "isolated network offering for VPC networks") et définissez **Network rate (Mb/s)** sur la vitesse du forfait : `50`, `100`, `500`, `1000`, `3000`. Activez chaque offre. 4. Créez une offre supplémentaire avec un **débit réseau de 1** (`VPC-LOCKED-1M`) pour les VPC verrouillés : les clients peuvent toujours accéder à leurs serveurs via SSH, mais la vitesse est limitée. 5. Notez l'UUID de chaque offre. NexCMP en a besoin dans la section suivante. ::: warning Les ID d'offre fournis n'existent pas dans votre cloud Le formulaire Private Cloud est pré-rempli avec des UUID d'offre appartenant à une autre installation CloudStack. Remplacez **chacun** d'eux par le vôtre, sinon la première commande VPC échouera. ::: ## Connecter dans NexCMP {#connect-in-nexcmp} ### Kubernetes {#kubernetes-1} 1. Ouvrez **Infrastructure › Cloud provider › CloudStack** et choisissez l'onglet **Kubernetes (CKS)**. La carte de droite **CKS status on CloudStack (read-only)** affiche `kubernetesserviceenabled`, `endpoint.url` avec **Endpoint check**, l'offre de réseau CKS, les paramètres `cloud.kubernetes.*` et la liste des ISO et versions. Cliquez sur **Recheck** après avoir corrigé un problème. 2. Dans **Sales config**, choisissez le **Control plane Offering** (un avertissement apparaît s'il ne s'agit pas exactement de 2 vCPU / 2048 Mo / limite CPU), définissez **Max workers per cluster** (1 à 9 : CKS autorise 10 nœuds, y compris le nœud de contrôle), activez l'option **Enable CKS for this backend** et cliquez sur **Save**. Le commutateur reste désactivé tant qu'aucune offre n'est choisie. ![L'onglet Kubernetes (CKS) avec l'offre de plan de contrôle choisie et la carte d'état CKS](https://nexcmp.com/fr/docs/images/infrastructure/kubernetes-and-private-cloud-01-cks.webp) 3. Ouvrez **Services › Kubernetes › Versions** et cliquez sur **Sync from CloudStack**. Activez **Available for new clusters** pour les versions que vous vendez, définissez la version par défaut et, si vous le souhaitez, une date de **Fin de vie (EOL)**. 4. Ouvrez **Services › Kubernetes › Policy**. Dans **Worker plans**, ajoutez des plans dotés d'un **Code de plan** (A-Z, 0-9, tiret, jusqu'à 16 caractères). Définissez **NVMe per worker (GB)**, les valeurs **Min and max workers**, ainsi que les limites du cluster (clusters actifs par compte, créations par 24 heures, plafond global, opérations CKS simultanées). Activez ensuite **Sell Kubernetes (CKS)**. Au moins un plan doit rester en vente. ![Politique Kubernetes avec les plans de workers et le commutateur de vente](https://nexcmp.com/fr/docs/images/infrastructure/kubernetes-and-private-cloud-03-policy.webp) ### Cloud privé {#private-cloud-1} 1. Ouvrez **Services › Private Cloud** (Vue d'ensemble). Dans la carte des politiques, remplacez **VPC offering** et **Locked offering tier** par vos propres UUID. Vérifiez les limites (VPC par compte, niveaux, machines virtuelles et règles ACL par VPC, solde en heures de frais de plan requis pour la création, modifications de plan par 24 heures, opérations concurrentes où 0 correspond à un arrêt d'urgence) ainsi que les serveurs DNS. Cliquez sur **Save** (un motif vous sera demandé). ![Vue d'ensemble de Private Cloud avec les champs d'offre VPC et d'offre verrouillée](https://nexcmp.com/fr/docs/images/infrastructure/kubernetes-and-private-cloud-04-vpc-policy.webp) 2. Ouvrez **Services › Private Cloud › Plans & pricing**. Pour chaque plan, cliquez sur **Edit** et définissez le paramètre **VND price per month**, l'option **On sale** et l'UUID de l'**CloudStack tier offering** dont le débit réseau correspond aux Mbps du plan. La ligne indique le coût et le bénéfice en cas d'utilisation maximale, ce qui vous permet d'identifier les plans dont le tarif est inférieur à vos coûts. ![Boîte de dialogue de modification d'un plan de bande passante Private Cloud](https://nexcmp.com/fr/docs/images/infrastructure/kubernetes-and-private-cloud-05-vpc-plan.webp) 3. Activez **Sell Private Cloud**. Pour tester le service au préalable, ajoutez des identifiants de comptes de test dans **Beta accounts** : ces comptes pourront utiliser le service même si le commutateur de vente est désactivé. ## Vérification {#verify} 1. Kubernetes : la carte d'état indique `kubernetesserviceenabled: true`, une vérification d'endpoint réussie et une version activée. Créez un cluster de test à un seul worker en tant que client ; il doit atteindre l'état d'exécution et `kubectl get nodes` doit indiquer qu'il est prêt. Supprimez-le ensuite : le réseau et l'IP retournent dans le pool. 2. Private Cloud : créez un VPC avec le plus petit plan en tant que client de test. Le VPC s'affiche comme actif, un niveau obtient son sous-réseau, une machine virtuelle du niveau accède à Internet via le routeur VPC, et l'option **Change plan** vers un plan supérieur prend effet en environ 20 secondes sans interruption des connexions. ## Limites et remarques {#limits-and-notes} - Kubernetes : les workers sont facturés comme des machines virtuelles aux prix des plans et comptent comme des machines virtuelles dans les limites de VM. Un cluster peut comporter au maximum 9 workers en raison de la limite CKS de 10 nœuds. - Kubernetes : le plan de contrôle, le routeur et l'adresse IP publique d'un cluster sont gratuits pour le client ; vous en assumez les coûts. - Private Cloud : tous les plans sont **non mesurés**. Les prix du formulaire sont en dongs vietnamiens par mois ; la colonne des coûts utilise un prix de référence qui n'est pas le vôtre, veillez donc à utiliser vos propres chiffres. - Un VPC verrouillé est limité à 1 Mbps, n'est pas facturé et n'est pas supprimé automatiquement. - Private Cloud utilise un routeur par VPC et non une paire redondante. En cas de défaillance de son hôte, CloudStack le reconstruit en quelques minutes. ## Dépannage {#troubleshooting} | Symptôme | Cause | Solution | |---|---|---| | `cp_offering_invalid` / "Cette offre n'est pas 2 vCPU / 2048 Mo / limitcpuuse" | L'offre du plan de contrôle a d'autres tailles ou aucune limite de CPU | Créez l'offre comme à l'étape 3 et sélectionnez-la à nouveau. | | Le commutateur **Enable CKS** est désactivé | Aucune offre de plan de contrôle choisie | Sélectionnez-en une d'abord. | | `kubernetesserviceenabled: false` | CKS est désactivé dans CloudStack | Activez-le et redémarrez le serveur de gestion. | | La vérification du point de terminaison échoue | `endpoint.url` n'est pas joignable depuis les machines virtuelles du cluster | Définissez une URL joignable, redémarrez le serveur de gestion et cliquez sur **Recheck**. | | "Fin de vie (EOL) : impossible d'activer la vente" | La date de fin de vie (EOL) de la version est dépassée | Enregistrez une version plus récente. | | "Aucune version : cliquez sur Sync from CloudStack" | Aucune version de Kubernetes enregistrée | Enregistrez une version et synchronisez. | | "Le backend CKS est désactivé : les clients ne peuvent pas créer de clusters même si l'indicateur de vente est activé" | L'interrupteur de vente est activé mais le backend CKS est désactivé | Activez CKS sur l'onglet CloudStack. | | "Au moins 1 plan doit être en vente" | Dernier plan worker supprimé | Conservez au moins un plan ou désactivez la vente de Kubernetes. | | Cluster bloqué en cours de création | Capacité insuffisante ou ISO manquante | Vérifiez les onglets de capacité et l'état ISO de la version. | | Un nouveau VPC échoue à la première étape | L'ID de l'offre VPC ou de l'offre de niveau n'est pas valide | Remplacez chaque UUID d'offre par un provenant de votre CloudStack. | | "cs_offering_id doit être un UUID" | Un ID d'offre n'est pas un UUID | Collez l'ID de `cmk list networkofferings`. | | Le changement de plan a échoué | La nouvelle offre de niveau n'existe pas ou le débit réseau est incorrect | Vérifiez l'UUID de l'offre et son débit réseau. | --- # Plans et tarification {#plans-and-pricing} > **Où se trouve l'élément dans l'admin :** Services › Virtual Machines › Plans & pricing (`/vm/catalog`), avec les onglets Plan, Custom plan, Cycle et Offering CloudStack. Les modèles se trouvent sur la page séparée Services › Virtual Machines › Template (`/vm/templates`). ## Description {#what-it-does} Un **plan** est une taille que les clients peuvent acheter : vCPU, RAM, disque racine et un prix, dans une zone, provenant d'une source (CloudStack ou un cluster Proxmox VE). Le client choisit un plan, un système d'exploitation et un **cycle de facturation** (horaire, mensuel ou une période prépayée plus longue). Les plans sont vendus dans le portail client, via l'API et sur les sites des revendeurs. ## Prérequis {#requirements} | Élément | Prérequis | |---|---| | Source | CloudStack connecté (un plan pointe vers une offre de service CloudStack) ou un cluster Proxmox VE rattaché à la zone. Voir [CloudStack](https://nexcmp.com/fr/docs/infrastructure/cloudstack/) et [Proxmox VE](https://nexcmp.com/fr/docs/infrastructure/proxmox/). | | Zone | Une zone qui vend des machines virtuelles. Voir [Zones](https://nexcmp.com/fr/docs/infrastructure/zones/). | | Templates | Au moins un modèle activé et prêt. Voir [OS templates](https://nexcmp.com/fr/docs/infrastructure/templates/). | | Taux de change | Uniquement si vous saisissez les prix en VND. Voir [Currency and exchange rates](https://nexcmp.com/fr/docs/catalog/currency-and-exchange-rates/). | | Permissions | Un administrateur ; chaque modification de prix demande une raison. | ## Préparer l'infrastructure {#prepare-the-infrastructure} - **CloudStack :** créez les offres de service que vous souhaitez vendre (publiques ou partagées avec le domaine NexCMP). Un plan pointe vers une offre. L'onglet **Offering CloudStack** liste en direct les offres et les offres de disque de CloudStack (mises en cache pendant 60 secondes). Lorsque la table des plans est vide, le worker crée automatiquement six plans à partir de vos offres réelles. - **Proxmox VE :** rien dans Proxmox ; un plan porte son propre CPU, sa RAM et son disque. Le disque ne doit pas être plus petit que celui du template. ## Connecter dans NexCMP {#connect-in-nexcmp} ### Comment les prix sont stockés {#how-prices-are-stored} NexCMP stocke chaque prix en **micro-dollars par heure** (µ$/heure ; 1 µ$ vaut 1/1,000,000 USD). Vous pouvez saisir le prix dans l'unité de votre choix et le formulaire le convertit : | Unité | Remarques | |---|---| | USD / heure (6 décimales) | Stocké tel quel. | | USD / mois | Divisé par le paramètre d'heures par mois (730). | | VND / mois | Converti une fois au taux de change actuel, puis stocké en µ$/heure. N'apparaît que lorsqu'un taux existe. | Le formulaire affiche le résultat : µ$/heure, USD/heure, le prix mensuel et chaque cycle de facturation. **Prix mensuel = prix horaire × 730** ; un cycle plus long est **prix mensuel × mois × (1 − remise)**. ### Ajouter un plan {#add-a-plan} 1. Ouvrez **Services › Virtual Machines › Plans & pricing** et cliquez sur **Add plan**. 2. Remplissez le formulaire : | Champ | Exemple de valeur | |---|---| | Nom du plan | `VM-2-4` | | Slug | vide : généré à partir du nom | | Zone | votre zone par défaut | | Source d'infrastructure | vide pour CloudStack, ou un cluster Proxmox | | Offre de service CloudStack (en direct) | en choisir une (affiché uniquement pour CloudStack) | | CPU (cœur), RAM (Mo), Disque racine (Go) | `2`, `4096`, `40` | | Offre de disque | facultatif, pour une taille racine personnalisée | | Saisir le prix par / Prix | `USD / month`, `12` | | Description courte | `2 vCPU, 4 GB RAM, 40 GB NVMe` | | Ordre | `10` | | Actif | Activé : les clients peuvent acheter | | Visibilité | Visible dans le catalogue | | Raison de la modification du prix | `initial price` | 3. Cliquez sur **OK**. Le plan apparaît dans le tableau avec son prix horaire et mensuel ainsi qu'une cellule pour chaque cycle activé. ![Tableau des plans avec prix horaires, mensuels et par cycle](https://nexcmp.com/fr/docs/images/catalog/plans-02-list.webp) ### Cycles de facturation {#billing-cycles} Ouvrez l'onglet **Cycle** pour définir les cycles que les clients peuvent choisir et leurs remises. | Cycle | Valeur par défaut | Remarques | |---|---|---| | Horaire | toujours activé | Facturé heure par heure. | | Mensuel | activé, 0 % | | | 1 an | activé, 10 % | | | 2 ans | activé, 15 % | | | 3 ans | activé, 20 % | | Vous pouvez renommer un cycle, modifier sa remise (0 à 90%) et l'activer ou le désactiver. Une modification s'applique aux VM achetées ou renouvelées **après** votre enregistrement ; les VM en cours d'exécution conservent leur prix bloqué. ![Onglet Cycle avec remises par cycle de facturation](https://nexcmp.com/fr/docs/images/catalog/plans-03-cycles.webp) ### Définir un plan de base et dériver les autres {#set-a-base-plan-and-derive-the-others} **Set base plan + derive other plans** recalcule tout le tableau à partir d'un seul prix. Choisissez le plan de base et son prix, puis conservez les **current price ratios** entre les plans ou calculez à partir des **component prices** (µ$/heure par vCPU, par Go de RAM et par Go de NVMe, avec une remise forfaitaire optionnelle de 0 à 50%). Un tableau de préperception affiche les anciens et les nouveaux prix avant tout enregistrement. Cliquez sur **Apply** et indiquez un motif. Lorsque vous appliquez de nouveaux prix : les VM **hourly** en cours d'exécution obtiennent un prix **plus bas** à partir de l'heure de facturation suivante, et les VM prépayées l'obtiennent au renouvellement. Si un prix **augmente**, les VM en cours d'exécution conservent leur ancien prix. ### Plans personnalisés {#custom-plans} L'onglet **Custom plan** permet aux clients de choisir leur propre vCPU, RAM et taille NVMe. Définissez le prix unitaire horaire pour un vCPU, un Go de RAM et un Go de NVMe (laissez vide pour dériver d'une remise en pourcentage), le minimum, le maximum et le pas pour chacun, ainsi que les cycles de facturation applicables. Un plan **personnalisé** doit coûter plus cher qu'un plan fixe de la même taille, sinon les clients ignoreraient le plan fixe ; la page signale les lignes où le personnalisé est moins cher. Activez **Enable custom plans for customers** pour les vendre ; s'il est désactivé, "Coming soon" s'affiche dans le portail. Chaque VM personnalisée obtient sa propre ligne de plan masquée ; ces lignes ne peuvent pas être modifiées ou supprimées tant que la VM existe. ### Modifier, masquer, cloner, supprimer {#change-hide-clone-delete} | Action | Description | |---|---| | **Edit** | Modifie le nom, la description, l'ordre, le prix, l'état actif et la visibilité. | | **On/Off** | **Off** : les clients ne peuvent pas acheter ; les VM en cours d'exécution ne sont pas affectées. | | **Hide / Show** | Un plan masqué ne figure pas dans le catalogue, mais les VM existantes le conservent et un administrateur peut l'attribuer. | | **Clone** | Crée un nouveau plan dans la même zone avec une nouvelle source, taille ou un nouveau prix, en masquant éventuellement l'ancien. Pour vendre la même configuration depuis CloudStack et Proxmox, clonez-la et choisissez l'autre source. | | **Move up/down** | Modifie l'ordre. | | **Delete** | Retire le plan de la vente et du tableau. Les VM qui l'utilisent déjà le conservent. | ::: warning Les plans en cours d'utilisation sont verrouillés Dès qu'un plan comporte des VM, ses paramètres **zone, offering, CPU, RAM, disk et source** sont verrouillés afin que les VM en cours d'exécution ne soient pas modifiées silencieusement. Utilisez **Clone** pour créer la nouvelle configuration ; l'ancien plan conserve ses VM. ::: ## Vérification {#verify} 1. Le plan apparaît dans le tableau avec le prix horaire et mensuel attendu. 2. Dans le portail client, lancez une commande : la zone propose le plan et les prix des cycles correspondent à l'onglet **Cycle**. 3. Passez une commande de test, vérifiez le débit sur le portefeuille par rapport au prix affiché et supprimez la VM. ## Limites et remarques {#limits-and-notes} - Un plan appartient à **une** seule zone et à **une** seule source. - Les prix sont stockés en µ$/heure ; le prix en VND affiché est dérivé et arrondi par le **VND rounding step** (voir la page des devises). Le portefeuille est toujours en USD. - Les revendeurs obtiennent un prix de gros et de détail dérivé du prix catalogue ; la modification du prix d'un plan existant ne copie pas les prix personnalisés du revendeur vers un clone dont vous avez modifié la configuration. - Les limites min, max et de pas des plans personnalisés sont vérifiées par rapport aux limites propres de CloudStack ; un disque maximum supérieur à celui de CloudStack `storage.max.volume.size` entraîne l'échec des déploiements et un remboursement. ## Dépannage {#troubleshooting} | Symptôme | Cause | Solution | |---|---|---| | "Nom de plan requis" / "Offre de service requise" | Champ manquant | Remplissez le nom ; pour CloudStack, choisissez une offre. | | "CPU/RAM/disk doit être > 0" | Une taille est vide ou égale à zéro | Saisissez les trois. | | "Prix non valide (µ$/hr doit être compris entre 1 … 100,000,000)" | Le prix est hors limites | Vérifiez l'unité et le montant. | | "Le changement de prix nécessite un motif" | Motif vide lors de la modification | Saisissez un motif (3 caractères ou plus). | | "L'offre "X" est 4c/8192 mais le plan spécifie 2c/4096 - CloudStack provisionnera selon l'offre. Enregistrer ?" | Les valeurs du plan diffèrent de celles de l'offre | Faites-les correspondre ou confirmez pour conserver la taille de CloudStack. | | "Échec de la récupération des offres depuis CloudStack" | La connexion est interrompue ou la clé n'a pas les permissions requises | Voir [CloudStack](https://nexcmp.com/fr/docs/infrastructure/cloudstack/). | | "Le modèle n'est pas prêt sur CloudStack - le déploiement échouera. Activer quand même ?" | Vous avez activé un modèle non prêt | Attendez que le modèle soit prêt. | | Le plan ne peut pas être modifié ("contient des VM - verrouillé") | Des machines virtuelles utilisent ce plan | Clonez-le. | | Le plan n'apparaît pas pour les clients | Désactivé, masqué ou la zone n'est pas prête | Vérifiez **Active**, **Visibility** et le tag de zone. Voir [Zones](https://nexcmp.com/fr/docs/infrastructure/zones/). | | "Sélectionnez au moins 1 cycle de facturation" | Aucun cycle sélectionné pour les plans personnalisés | Cochez au moins une option. | | "La remise groupée doit être comprise entre 0 et 50%" | Hors limites | Utilisez une valeur entre 0 et 50. | | Option de prix en VND manquante | Aucun taux de change disponible | Mettez d'abord le taux à jour. | --- # Quotas de bande passante et add-ons {#bandwidth-quotas-and-add-ons} > **Where in the admin:** Services › Bandwidth: Summary (`/bandwidth`), Add-on (`/bandwidth/addons`) et Quotas, pricing & policy (`/bandwidth/policy`). Le sélecteur de module se trouve dans System › Admin › License & updates. ## Description {#what-it-does} La bande passante attribue à chaque service mesuré un **quota** de trafic mensuel. NexCMP mesure l'utilisation, avertit le client à 80 % et 100 % et, en cas de dépassement du quota, applique votre **politique de dépassement**. Les clients peuvent acheter des **add-ons** de téraoctets supplémentaires depuis leur solde ; vous pouvez également octroyer des add-ons gratuitement. | Service | Quota | |---|---| | Machines virtuelles | Par machine virtuelle et par mois (par défaut 2048 Go, soit 2 To) | | Kubernetes | Le quota de la machine virtuelle multiplié par le nombre de travailleurs | | Object Storage | Trafic de téléchargement par client et par mois (par défaut 100 Go) ; au-delà, le tarif d'utilisation à l'acte s'applique | | VPN | Conserve le quota de son plan ; mettez à niveau la bande passante sur la page VPN | | Cloud privé | **Illimité** | ## Prérequis {#requirements} | Élément | Prérequis | |---|---| | Module | **Bandwidth** est activé par défaut. Désactivez-le sous License & updates pour le masquer. | | Source de mesure | Avec la source par défaut, **CloudStack VM statistics**. Maintenez la collecte des statistiques des VM activée dans CloudStack ; la conservation par défaut de 720 minutes est suffisante. | | Proxmox VE | Les VM sur Proxmox VE ne sont **pas comptabilisées**. | | Taux de change | Le prix du module complémentaire est saisi en VND. Voir [Currency and exchange rates](https://nexcmp.com/fr/docs/catalog/currency-and-exchange-rates/). | | Dépend de | [CloudStack](https://nexcmp.com/fr/docs/infrastructure/cloudstack/) pour le trafic des VM et de Kubernetes, [S3](https://nexcmp.com/fr/docs/infrastructure/s3/) pour les téléchargements de stockage. | ## Préparer l'infrastructure {#prepare-the-infrastructure} Non requis au-delà de la connexion de CloudStack. NexCMP lit `listVirtualMachinesUsageHistory` pour toutes les VM du compte en un seul appel, toutes les 5 minutes, dans des fenêtres de deux heures maximum. Chaque échantillon couvre une minute et est **additionné**. Les échantillons sont pris trois minutes dans le passé pour leur laisser le temps d'arriver. Un intervalle supérieur à la rétention de CloudStack (environ 12 heures) est ignoré et enregistré. ::: info Ce que signifient les chiffres L'utilisation est comptabilisée sur l'interface réseau de chaque VM, ce qui inclut donc le trafic entre les VM, et pas seulement le trafic vers Internet. Cela peut être légèrement supérieur à ce qu'un routeur de périphérie compterait. ::: ## Connecter dans NexCMP {#connect-in-nexcmp} 1. Ouvrez **Services › Bandwidth › Quotas, pricing & policy**. 2. Définissez les valeurs et cliquez sur **Save** ; un motif est demandé et enregistré. Le worker applique la modification en 30 secondes environ. | Champ | Valeur par défaut | Description | |---|---|---| | Activer la bande passante (menu client et achat de modules complémentaires) | activé | L'interrupteur pour la partie commerciale du module. | | VM, Go/mois (Kubernetes = cette valeur × workers) | 2048 | Quota par VM et par période. | | S3, Go téléchargés/mois par client | 100 | Au-delà, la tarification à l'usage S3 normale s'applique. | | Direction du quota (VM, Kubernetes) | Entrant + sortant | Ou **Outbound only**. | | Prix +1 To (VND) | 100,000 | Converti en centimes au taux du devis. | | Max par achat (To) | 50 | | | Politique de dépassement | suspendre | **notify**, **throttle** ou **suspend** (ci-dessous). | | Appliquer la suspension effective à partir du | date de migration + 24 heures | Avant cette date, rien n'est suspendu ; les clients sont seulement avertis. | | Limite de débit (Mbit/s) | | Utilisé uniquement par la limitation (throttle). | ![Politique de bande passante : quotas par défaut, prix des options et politique de dépassement](https://nexcmp.com/fr/docs/images/catalog/bandwidth-01-policy.webp) ### Politiques de dépassement {#overage-policies} | Politique | Ce qui se passe lorsqu'un service dépasse 100% | |---|---| | **notify** | Le client est notifié. Rien d'autre. | | **throttle** | Comme notify pour l'instant : le limiteur de vitesse n'est pas connecté dans cette version. | | **suspend** (par défaut) | La VM, le cluster ou le compte S3 est suspendu jusqu'à ce que le client achète un module complémentaire ou que la période suivante commence. Applicable uniquement à partir de la date **suspend-from**. | Les alertes à 80% et 100% (cloche et e-mail) s'exécutent toujours, une fois par seuil, période et service. Si vous débloquez un service suspendu pour cause de bande passante alors qu'il dépasse toujours son quota, la vérification suivante (dans les 5 minutes) le suspend à nouveau. Pour le maintenir en activité, **attribuez un module complémentaire**. ### Surveiller l'utilisation et attribuer des modules complémentaires {#watch-usage-and-grant-add-ons} Ouvrez **Services › Bandwidth › Summary**. Sont listés chaque service avec son utilisation sur la période en cours, le quota incluant les modules complémentaires, le quota restant, ainsi que les seuils de 80% et 100%. Des indicateurs clés affichent le nombre de services, les modules complémentaires vendus au cours des 30 derniers jours et l'état du collecteur (en cours d'exécution, curseur). Le tableau **Daily** présente la période en cours jour par jour. ![Résumé de la bande passante avec l'état du collecteur et l'utilisation par service](https://nexcmp.com/fr/docs/images/catalog/bandwidth-02-summary.webp) Pour donner de la marge à un client, utilisez **Grant** sur un service (un module complémentaire de téraoctets entiers gratuit). Ouvrez **Add-on** pour consulter l'historique des achats et des attributions, du plus récent au plus ancien, avec un filtre par type. ![Historique des modules complémentaires affichant les achats et attributions gratuites](https://nexcmp.com/fr/docs/images/catalog/bandwidth-03-addons.webp) ### Ce que voient les clients {#what-customers-see} Le portail client intègre un menu **Bandwidth** affichant l'utilisation, le quota restant et une action **buy +1 TB** réglée depuis le portefeuille (dans la limite de votre maximum par achat). Les modules complémentaires sont valables pour la période en cours. ## Vérification {#verify} 1. Le collecteur sur **Summary** est en cours d'exécution et son curseur avance toutes les quelques minutes. 2. Une machine virtuelle générant du trafic affiche son utilisation après environ 10 à 15 minutes. 3. Pour observer les alertes, réduisez le quota de la machine virtuelle à quelques Go sur une installation de **test** et générez du trafic. Ne faites pas cela en production : le quota s'applique à chaque machine virtuelle. ## Limites et remarques {#limits-and-notes} - L'utilisation est comptabilisée par période (un mois). Les modules complémentaires et les quotas s'appliquent à la période en cours. - Le paramètre "Enforce actual suspend from" évite de suspendre les clients dès l'activation initiale du module. - La politique de limitation (throttle) n'émet pour l'instant que des notifications dans cette version. - Modifier le quota s'applique à tous les sites, y compris les sites de revendeurs. Les prix de détail et de gros des modules complémentaires des revendeurs suivent leur remise ou majoration. - La bande passante pour les **Dedicated servers** relève d'un sujet distinct ; consultez [Dedicated servers](https://nexcmp.com/fr/docs/infrastructure/dedicated/). ## Dépannage {#troubleshooting} | Symptôme | Cause | Solution | |---|---|---| | L'utilisation reste à zéro pour une machine virtuelle en cours d'exécution | Le worker est arrêté, CloudStack est déconnecté ou les statistiques des machines virtuelles sont désactivées | Vérifiez `sudo nexcmp status` et **Test connection** dans [CloudStack](https://nexcmp.com/fr/docs/infrastructure/cloudstack/) ; activez les statistiques des machines virtuelles CloudStack. | | L'utilisation présente des lacunes | La période de rétention CloudStack a été dépassée ou le worker a été hors ligne pendant plus de 12 heures environ | Irrécupérable ; la lacune est enregistrée. | | L'utilisation est légèrement supérieure aux prévisions | Le trafic entre machines virtuelles et autre trafic d'interface est inclus | Attendu ; expliquez cela aux clients. | | Un service suspendu réapparaît comme suspendu après son déverrouillage | Il dépasse toujours son quota | Attribuez un module complémentaire ou augmentez le quota. | | Rien n'est suspendu malgré une politique réglée sur **suspend** | La date de début de suspension est fixée dans le futur | Définissez-la à l'instant présent (la page indique "ACTIVE" lorsqu'elle est effective). | | "bw_over_policy doit être notify, throttle ou suspend" | Politique non valide transmise via l'API | Utilisez l'une de ces trois valeurs. | | Les machines virtuelles Proxmox n'affichent aucune utilisation | Elles ne sont pas mesurées | Attendu. | | Les clients ne peuvent pas acheter de modules complémentaires | La bande passante est désactivée ou le portefeuille est vide | Vérifiez l'interrupteur et le portefeuille. | --- # Devises et taux de change {#currency-and-exchange-rates} > **Où dans l'administration :** Finance › Payment channels › Exchange rates (`/payments/fx`) pour les taux. System › Settings › Brand (`/settings/branding`) pour le sélecteur **Site currency**. ## Description {#what-it-does} NexCMP conserve les portefeuilles et les factures en USD. Les prix des plans de VM sont stockés en micro-dollars par heure. Les devises d'affichage permettent aux clients de lire les montants en USD dans leur propre devise à un taux publié; elles ne modifient pas le solde du portefeuille. Certains services acceptent des prix saisis en VND, notamment les options de bande passante, S3, Private Cloud et les plans Bare Metal existants conservant une tarification en VND. Les virements bancaires via Sepay sont réglés en VND. Les taux sont **publiés par un administrateur**. Rien ne se met à jour automatiquement, les taux enregistrés restent donc inchangés jusqu'à ce que vous cliquiez sur le bouton de mise à jour. ## Prérequis {#requirements} | Élément | Prérequis | |---|---| | Accès Internet | Le serveur du panneau doit pouvoir joindre `open.er-api.com` (pour USD/VND) et `api.frankfurter.dev` (pour les autres devises) lorsque vous cliquez sur **Update exchange rates**. | | Permissions | Un administrateur pour les modifications ; chaque modification requiert un motif. | | Dépend de | Rien. Les [Plans](https://nexcmp.com/fr/docs/catalog/plans/), la [Bandwidth](https://nexcmp.com/fr/docs/catalog/bandwidth/), le [S3](https://nexcmp.com/fr/docs/infrastructure/s3/) et les virements bancaires en VND utilisent le taux. | ## Préparer l'infrastructure {#prepare-the-infrastructure} Non requis. Si votre serveur filtre le trafic sortant, autorisez le trafic HTTPS vers les deux services ci-dessus. ## Connecter dans NexCMP {#connect-in-nexcmp} ### 1. Choisir la devise du site {#_1-choose-the-site-currency} Ouvrez **System › Settings › Brand** et définissez **Site currency** : | Choix | Ce que voient les clients | |---|---| | **Language-based (auto)** (valeur par défaut d'une nouvelle installation) | Le portail choisit une devise d'affichage selon la langue (tableau ci-dessous). Le client peut choisir l'USD à la place. | | **USD** | Prix et soldes en USD uniquement. Aucun sélecteur de devise ni montant converti. | | **VND** | Paramètre hérité ; suit les mêmes règles d'affichage basées sur la langue qu'Auto. | Enregistrez. Les pages client se mettent à jour en environ une minute. Lorsque le site suit la langue du client : | Langue | Devise d'affichage | |---|---| | Anglais | USD | | Vietnamien | VND | | Chinois (simplifié / traditionnel) | CNY / TWD | | Japonais, coréen | JPY, KRW | | Français, allemand, espagnol, italien | EUR | | Portugais, russe | BRL, RUB | | Arabe, hindi | SAR, INR | | Indonésien, thaï | IDR, THB | Une devise dont le taux n'a pas été publié n'est pas proposée : le portail se replie sur l'USD. ### 2. Publier les taux {#_2-publish-the-rates} 1. Ouvrez **Finance › Payment channels › Exchange rates**. 2. La carte **Currency by language** liste les 11 devises d'affichage avec leur taux par USD, la source (Frankfurter) et l'heure de la dernière mise à jour. Cliquez sur **Update exchange rates**. Le bouton effectue deux opérations en une seule étape : il lit la table publique du marché pour **USD/VND** et lit les 11 autres taux. Les deux sont vérifiés avant que l'un ou l'autre ne soit enregistré. En cas d'échec de l'un d'eux, rien n'est modifié et les taux précédents sont conservés. 3. La carte **Active exchange rate** affiche le taux USD/VND en vigueur, son tag de source (marché public ou fixe), la marge ainsi que les valeurs de référence du marché avec leur horodatage. 4. La carte **Config** (enregistrer avec un motif) : | Champ | Description | Plage | |---|---|---| | Marge (pb, 100 = 1 %) | Ajouté au taux de référence du marché. Le taux effectif correspond au taux de référence majoré de la marge, arrondi à l'entier supérieur. | 0 à 1000 | | Taux fixe (VND par USD, 0 = suivre le marché) | Un taux que vous définissez vous-même. Il remplace la valeur du marché. | 0 ou 15,000 à 50,000 | | Seuil de saut (pb) | Un nouveau taux de marché qui diffère du taux actuel de plus que cette valeur est **mis en attente** jusqu'à confirmation de votre part. | 50 à 2000 (par défaut 500) | | Pas d'arrondi VND | Arrondit les prix en VND et les montants par virement bancaire. | 1, 100, 1,000 (par défaut) ou 10,000 | 5. Si un nouveau taux de marché dépasse le seuil de variation, la carte **Pending exchange rate** apparaît et le taux n'est **pas appliqué**. Comparez-le à votre référence choisie et cliquez sur **Apply this rate**. Un taux de marché en dehors de 15,000 à 50,000 VND par USD est rejeté comme déraisonnable. Les actualisations manuelles sont limitées à une requête toutes les cinq minutes, le bouton peut donc vous demander d'attendre. 6. Le tableau **Exchange rate history** liste chaque taux récupéré ou confirmé avec son horodatage, le taux effectif, la référence du marché, la source, s'il a été appliqué, son auteur et une note (les écarts retenus sont marqués **held**). ## Utilisation d'un taux {#how-a-rate-is-used} | Emplacement | Règle | |---|---| | Portefeuille et factures | Cents USD. Le taux ne modifie jamais un solde. | | Plans de VM saisis en VND | Convertis **une seule fois** au taux en vigueur lors de l'enregistrement, puis stockés en USD. Les modifications ultérieures de taux ne recalculent pas le prix de ces plans de VM. | | Virement bancaire via Sepay | Le client paye `ceil(USD × rate)`, arrondi supérieur au pas d'arrondi. Sepay est **bloqué** tant qu'aucun taux USD/VND n'existe. | | Plans Bare Metal | Les nouvelles installations utilisent directement l'USD. Les plans existants en VND conservent leur unité de prix et nécessitent un taux lors de la facturation; consultez [Serveurs dédiés](https://nexcmp.com/fr/docs/infrastructure/dedicated/). | | Autres paiements internationaux saisis en VND | Arrondi au cent le plus proche. | | Affichage dans le portail | USD multipliés par le taux publié de la monnaie d'affichage, formatés selon la langue. | ## Vérification {#verify} 1. **Active exchange rate** affiche une valeur USD/Vnd assortie d'une heure de récupération récente. 2. La grille **Currency by language** affiche les taux non vides. 3. Dans le portail client, basculez la langue en vietnamien (devise du site sur Auto) : les prix s'affichent en dôngs; basculez en japonais : en yens. Avec la devise du site sur USD, seuls les dollars sont affichés. 4. Sur le formulaire de forfait (Plans & pricing), la liste **Enter price by** propose **VND / month**. ## Limites et remarques {#limits-and-notes} - Pas de mise à jour automatique. Appuyez sur **Update exchange rates** lorsque vous souhaitez de nouveaux taux et définissez un rappel si les taux sont importants pour vous. - Le cours public du marché est utilisé pour l'USD/VND; il s'agit d'un taux de référence plutôt que d'une cotation d'achat ou de vente bancaire. Les autres devises d'affichage proviennent de Frankfurter; une date antérieure à 14 jours ou un tableau incomplet est rejeté. - La marge et un taux fixe s'appliquent uniquement à USD/VND. Les 11 devises d'affichage ne comportent aucune marge. - Chaque langue client possède une devise. Le changement de langue réinitialise la devise à celle de cette langue, sauf si le client a choisi l'USD pour cette même langue. - Les sites des revendeurs suivent les mêmes taux. ## Dépannage {#troubleshooting} | Symptôme | Cause | Solution | |---|---|---| | "Le nouveau taux de change s'écarte au-delà du seuil - EN ATTENTE, nécessite une confirmation manuelle" | L'écart est supérieur au seuil | Vérifiez et cliquez sur **Apply this rate**, ou modifiez le seuil. | | "Le serveur a rejeté le nouveau taux de change" | La valeur du marché est en dehors de 15,000 à 50,000 ou est mal formée | Patientez et réessayez, ou définissez un taux fixe. | | L'actualisation vous demande d'attendre avant de réessayer | Mises à jour trop fréquentes | Patientez et réessayez. | | "impossible de récupérer le taux : …" | Le serveur du panneau ne peut pas joindre les services de taux | Autorisez le HTTPS sortant et réessayez. | | Étiquette **Sepay blocked** | Aucun taux USD/VND n'a encore été publié | Appuyez sur **Update exchange rates** ou définissez un taux fixe. | | Une devise est manquante dans le portail | Son taux est manquant | Appuyez sur **Update exchange rates**. | | Les clients voient les prix uniquement en USD | La devise du site est l'USD, ou le taux est manquant | Définissez **Site currency** sur Auto et publiez les taux. | | "Table des taux Fx incomplète ; taux précédents conservés" | Frankfurter a renvoyé moins de 11 devises | Réessayez plus tard ; rien n'a été modifié. | | L'option VND est absente du formulaire de plan | Aucun taux USD/VND | Publiez d'abord un taux. | --- # Canaux de paiement {#payment-channels} > **Où dans l'administration :** Finance › Payment channels (`/payments`). Commutateurs et frais : Finance › Payment channels › Fees & limits (`/payments/fees`). NexCMP utilise un **solde USD prépayé**. Les clients ajoutent des fonds au solde via un canal de paiement, puis chaque service est réglé depuis ce solde. Un canal n'est affiché aux clients que lorsqu'il est à la fois **activé** et **configuré**. ## Description {#what-it-does} Les canaux de paiement connectent vos comptes de paiement (Stripe, PayPal, Binance, une banque vietnamienne) au solde client. Un paiement confirmé génère exactement un crédit de solde — chaque crédit est identifié par l'ID de paiement de la passerelle, de sorte qu'un webhook répété ne peut jamais créditer deux fois. Utilisez cette page pour voir quels canaux sont prêts, leurs performances sur les 30 derniers jours et ceux qui nécessitent une attention particulière. ## Prérequis {#requirements} | Élément | Prérequis | |---|---| | Adresse HTTPS publique | Les passerelles envoient des webhooks vers `https:///v1/billing/...`, votre panneau doit donc être accessible depuis Internet via un protocole TLS valide (voir [DNS and Cloudflare](https://nexcmp.com/fr/docs/getting-started/dns-and-cloudflare/)). | | Comptes | Votre propre compte auprès de chaque fournisseur que vous souhaitez utiliser. Les identifiants sont saisis dans l'administration et ne sont plus jamais affichés (seuls les 4 derniers caractères le sont). | | Rôle administrateur | Un compte administrateur. | | Dépendances | Aucun. Le canal bancaire vietnamien nécessite en plus un [taux de change](https://nexcmp.com/fr/docs/catalog/currency-and-exchange-rates/). | ## Les canaux {#the-channels} | Canal | Ce que voit le client | Configurer dans | Article | |---|---|---|---| | Carte (Stripe) | Formulaire de carte, carte enregistrée | Payment channels › Stripe | [Stripe](https://nexcmp.com/fr/docs/billing/stripe/) | | Apple Pay, Google Pay, Link | Boutons de portefeuille (Stripe Express Checkout) | Stripe, plus enregistrement du domaine | [Stripe](https://nexcmp.com/fr/docs/billing/stripe/#apple-pay-google-pay-and-link) | | Alipay | Redirection vers Alipay (facturé en JPY par Stripe) | Stripe, plus frais et limites | [Stripe](https://nexcmp.com/fr/docs/billing/stripe/#alipay) | | PayPal | Boutons PayPal, compte PayPal enregistré | Payment channels › PayPal | [PayPal](https://nexcmp.com/fr/docs/billing/paypal/) | | USDT | Adresse de dépôt et montant exact | Payment channels › USDT | [USDT](https://nexcmp.com/fr/docs/billing/usdt/) | | Virement bancaire VN | QR code et détails du virement (interface vietnamienne uniquement) | Payment channels › VN bank transfer | [Virement bancaire (Vietnam)](https://nexcmp.com/fr/docs/billing/bank-transfer-vn/) | ## Préparer l'infrastructure {#prepare-the-infrastructure} Non requis. Tout est configuré dans l'administration ; il n'y a rien à installer sur le serveur. ## Connecter dans NexCMP {#connect-in-nexcmp} 1. Ouvrez **Finance › Payment channels** (`/payments`). Le tableau de synthèse liste chaque canal avec son état. 2. Ouvrez l'onglet propre au canal (**Stripe**, **PayPal**, **USDT**, **VN bank transfer**) et suivez son article. Chaque onglet se termine par un bouton **Save** et, le cas échéant, un bouton **Test**. 3. Ouvrez **Fees & limits** (`/payments/fees`), recherchez la carte **Payment gateways & fees (wallet top-up)**, activez le canal avec son interrupteur et cliquez sur **Save channels & fees**. ![Aperçu des canaux de paiement listant les passerelles avec leurs statistiques d'activation, de configuration et sur 30 jours](https://nexcmp.com/fr/docs/images/billing/payment-channels-01-overview.webp) ![Page des frais et limites avec les interrupteurs de canaux et les champs de frais](https://nexcmp.com/fr/docs/images/billing/payment-channels-02-fees.webp) ### Interrupteurs et frais (Fees & limits) {#switches-and-fees-fees-limits} | Paramètre | Valeur par défaut | Description | |---|---|---| | Carte (Stripe) | On | Formulaire de carte sur l'écran de dépôt. Masqué tant que Stripe ne dispose pas d'une clé secrète. | | Apple Pay, Google Pay, Link | On | Boutons de portefeuille. Ils n'apparaissent que lorsque le domaine est vérifié chez Stripe. | | Alipay | Désactivé | Nécessite qu'Alipay soit activé dans le tableau de bord Stripe. | | PayPal | Désactivé | Affiché uniquement lorsque PayPal est configuré. | | USDT (Binance) | Désactivé | L'interrupteur est verrouillé tant que l'adresse de dépôt n'a pas été vérifiée auprès de Binance. | | Frais Stripe % / fixe (centimes) | 3.6 % et 0 | Utilisé pour afficher les frais au client et calculer le montant crédité. Définissez-le selon votre tarif Stripe réel. | | Frais PayPal % / fixe | 4.4 % et 30 cents | Idem, pour PayPal. | | Frais USDT % | 1 % | Idem, pour USDT. | | Le client paie les frais de rechargement | Désactivé | **On** : le client paie le montant + les frais et le portefeuille reçoit le montant total. **Off** : les frais sont déduits et le portefeuille reçoit le montant moins les frais. | Le client voit toujours les frais et le crédit final sur son portefeuille avant de payer. Désactiver un canal masque le bouton et le serveur refuse les nouveaux paiements avec `method_disabled` (HTTP 403). ::: tip Limites de rechargement Le montant minimum et maximum par rechargement se trouvent sur la même page — voir [Minimum top-up](https://nexcmp.com/fr/docs/billing/minimum-top-up/). ::: ## Vérification {#verify} 1. Dans le tableau récapitulatif, le canal affiche **Enabled** et **Configured** ; la colonne **Last test** est remplie après avoir cliqué sur **Test** dans l'onglet du canal. 2. Connectez-vous au portail en tant que client test et ouvrez **Billing › Deposit**. Le bouton du canal est présent. 3. Effectuez un petit paiement (consultez l'article du canal pour les cartes de test ou les comptes sandbox). Le solde augmente, une notification **Top-up received** apparaît et le paiement est répertorié dans **Finance › Billing › Top-ups** (`/billing/deposits`). ## Limites et notes {#limits-notes} - **Colonnes du récapitulatif :** *30 days* (nombre de paiements, réussites, échecs et volume), *Stuck 24h* (paiements toujours en attente après un jour) et *Unmatched* (USDT ou virements bancaires reçus mais ne correspondant à aucune commande). La ligne des KPI ajoute le volume sur 30 jours, le nombre de canaux défectueux (activés mais non configurés, ou paiements bloqués) et le total non concordant. - **Les événements de webhook** sont répertoriés sous **Payment channels › Gateway events** (`/payments/events`). Stripe possède son propre onglet ; PayPal et USDT en partagent un. Un événement échoué peut être rejoué — le grand livre du portefeuille est idempotent, le rejeu ne crédite donc jamais deux fois. - Les **Resellers** peuvent avoir leurs propres canaux Stripe, PayPal, USDT et bancaires. Leurs lignes apparaissent également ici, et le sélecteur de site dans l'en-tête les filtre. Voir [Resellers](https://nexcmp.com/fr/docs/customers/resellers/). - **Remboursements :** les paiements Stripe et PayPal peuvent être remboursés depuis la liste des paiements ; les paiements USDT ne peuvent pas être remboursés vers la source (le serveur répond `usdt_no_refund`). - **Le mode maintenance** accepte toujours les webhooks de la passerelle, de sorte qu'un paiement effectué juste avant la maintenance n'est pas perdu. ## Dépannage {#troubleshooting} | Symptôme | Cause | Solution | |---|---|---| | Canal manquant sur l'écran de dépôt du client | Désactivé, non configuré ou (banque VN) l'interface n'est pas en vietnamien | Vérifiez **Fees & limits** et l'onglet du canal ; voir [Bank transfer (Vietnam)](https://nexcmp.com/fr/docs/billing/bank-transfer-vn/). | | Le KPI **Faulty channels** est supérieur à 0 | Un canal est activé sans identifiants, ou des paiements sont en attente depuis plus de 24 heures | Ouvrez la ligne et cliquez sur **Configure** ; pour les paiements bloqués, ouvrez **Gateway events** et rejouez-les. | | Le client a payé mais le solde n'a pas changé | Le webhook n'est pas arrivé | Vérifiez l'URL du webhook dans l'onglet du canal, puis rejouez l'événement dans **Gateway events**. | | Le serveur répond `method_disabled` | Le commutateur est désactivé | Activez-le dans **Fees & limits** et enregistrez. | | Le commutateur USDT est grisé | Adresse de dépôt non vérifiée | Cliquez sur **Test & verify address** dans l'onglet USDT. | --- # Stripe > **Où dans l'admin :** Finance › Payment channels › Stripe (`/payments/stripe`). Commutateurs et frais : Finance › Payment channels › Fees & limits (`/payments/fees`). ## Description {#what-it-does} Stripe prend en charge les paiements par carte pour les recharges de portefeuille. Avec le même compte, vous pouvez également proposer **Apple Pay**, **Google Pay**, **Link** et **Alipay**, et permettre aux clients d'**enregistrer une carte** pour le [rechargement automatique](https://nexcmp.com/fr/docs/billing/auto-top-up/). Utilisez-le comme canal principal pour les clients internationaux. ## Prérequis {#requirements} | Élément | Prérequis | |---|---| | Compte Stripe | Un compte Stripe capable d'accepter les paiements en **USD**. Alipay est facturé en JPY et doit être activé par Stripe sur votre compte. | | Clés | Une clé secrète (`sk_live_...` ou `sk_test_...`) et une clé publiable (`pk_live_...` ou `pk_test_...`). Le formulaire n'accepte que les clés portant ces préfixes. | | Réseau | Votre panneau doit être accessible en HTTPS depuis Internet (Stripe appelle le webhook) et doit pouvoir joindre `api.stripe.com` sur le port 443. | | Domaine (portefeuilles uniquement) | Le domaine destiné aux clients doit desservir `/.well-known/apple-developer-merchantid-domain-association` — NexCMP s'en charge pour vous. | | Dépendances | Aucune. | ::: info Comptes Stripe partagés NexCMP traite uniquement les événements de webhook pour les paiements qu'il a créés lui-même, vous pouvez donc utiliser un compte Stripe qui dessert également une autre application. ::: ## Préparer l'infrastructure {#prepare-the-infrastructure} Du côté de Stripe : 1. Connectez-vous au [Stripe Dashboard](https://dashboard.stripe.com). Activez ou désactivez **Test mode** selon que vous effectuez un essai ou passez en production. Les clés d'un mode ne fonctionnent jamais avec l'autre. 2. Ouvrez **Developers › API keys**. Copiez la **Publishable key**, puis révélez et copiez la **Secret key**. Gardez la clé secrète confidentielle. 3. (Optionnel) Ouvrez **Settings › Payment methods** et activez **Alipay** si vous souhaitez le proposer. 4. Vous n'avez **pas** besoin de créer le webhook manuellement — NexCMP peut le créer pour vous (voir l'étape 5 ci-dessous). Si vous préférez le faire manuellement, créez un point de terminaison dans **Developers › Webhooks** avec l'URL et les événements indiqués dans [Webhook](#webhook). ## Connecter dans NexCMP {#connect-in-nexcmp} 1. Ouvrez **Finance › Payment channels › Stripe** (`/payments/stripe`). 2. Dans la carte **API keys**, choisissez le **Mode** (`live` ou `test`), puis collez la **Secret key** et la **Publishable key**. 3. Cliquez sur **Save**. Les clés sont écrites dans un fichier de configuration sur le serveur que seul le compte de service NexCMP peut lire. Elles ne sont jamais renvoyées au navigateur ; par la suite, la page n'affiche que les 4 derniers caractères. 4. Cliquez sur **Check**. Une boîte de dialogue indique la connexion, le mode, le solde disponible et en attente, l'ID du compte, si les débits sont activés, si un webhook existe et si Alipay est disponible. Une ligne rouge indique qu'un élément nécessite votre attention. 5. Dans la carte **Webhook**, cliquez sur **Create webhook** et confirmez. NexCMP demande à Stripe de créer le point de terminaison avec chaque événement requis et remplit automatiquement le champ **Webhook signing secret** (`whsec_...`). L'URL préremplie dans le champ est `https:///v1/billing/stripe/webhook`, par exemple `https://cloud.example.com/v1/billing/stripe/webhook`. 6. Ouvrez **Fees & limits** (`/payments/fees`), laissez **Card (Stripe)** activé, définissez **Stripe fee %** et **Stripe fixed fee (cents)** selon votre tarif réel, puis cliquez sur **Save channels & fees**. Voir [Payment channels](https://nexcmp.com/fr/docs/billing/payment-channels/#switches-and-fees-fees-limits). ![Page Stripe avec le mode, la clé secrète et la clé publiable remplies avec des valeurs d'exemple](https://nexcmp.com/fr/docs/images/billing/stripe-01-keys.webp) ### Webhook {#webhook} La bannière rouge "Missing webhook_secret" s'affiche jusqu'à ce qu'un secret de signature soit enregistré. Sans cela, les recharges Stripe ne sont **pas enregistrées**, même si Stripe a encaissé l'argent. | Élément | Valeur | |---|---| | URL | `https:///v1/billing/stripe/webhook` | | Événements | `checkout.session.completed`, `payment_intent.succeeded`, `payment_intent.payment_failed`, `charge.refunded`, `charge.dispute.created`, `charge.dispute.closed`, `radar.early_fraud_warning.created`, `refund.updated`, `refund.failed` | | Signature | En-tête Stripe `Stripe-Signature`, HMAC-SHA256, tolérance de 300 secondes. Les requêtes dotées d'une mauvaise signature reçoivent un code HTTP 400. | | Idempotence | Chaque ID d'événement est stocké une seule fois ; une livraison répétée ne crédite jamais deux fois. | Si vous avez effectué une mise à niveau à partir d'une version qui enregistrait moins d'événements, cliquez à nouveau sur **Create webhook** — l'ancien point de terminaison est conservé, vous devez donc le supprimer manuellement dans le Stripe Dashboard par la suite. Les lignes **24h events** et **Latest event** de la carte Webhook indiquent si Stripe parvient à joindre le panneau. Les événements individuels sont répertoriés dans **Payment channels › Gateway events** (`/payments/events`, onglet Stripe), où chaque événement peut être consulté (**Payload**) ou rejoué (**Replay**). ### Apple Pay, Google Pay et Link {#apple-pay-google-pay-and-link} 1. Dans la carte **Wallets (Apple Pay · Google Pay · Link) & Alipay**, le champ **Customer app Domain registered with Stripe** est prérempli avec le nom d'hôte de votre site (par exemple `cloud.example.com`). 2. Cliquez sur **Register / verify domain** et confirmez. NexCMP enregistre le domaine dans les domaines de moyens de paiement de Stripe et demande à Stripe de le valider. 3. Le résultat affiche le statut de **Apple Pay**, **Google Pay** et **Link**. Apple Pay n'apparaît que lorsque le statut est `active`. 4. Dans **Fees & limits**, laissez **Apple Pay · Google Pay · Link** activé. ![Carte de portefeuille affichant le domaine enregistré ainsi que les statuts Apple Pay, Google Pay et Link](https://nexcmp.com/fr/docs/images/billing/stripe-03-wallets.webp) ::: tip Apple Pay reste inactif Apple Pay nécessite que le fichier d'association de domaine réponde par HTTP 200 sur votre domaine public. Si vous placez Cloudflare ou un autre proxy en amont, ne bloquez pas `/.well-known/`. ::: ### Alipay {#alipay} Alipay est optionnel. Activez-le dans **Stripe Dashboard › Settings › Payment methods**, cliquez sur **Check** et attendez que la boîte de dialogue indique qu'Alipay est disponible, puis activez **Alipay (Stripe, JPY display)** dans **Fees & limits**. Définissez **Alipay fee %**, **Alipay fixed fee**, le **taux ¥/USD** (50–500) et le **spread de change %** (0–20). Mettez régulièrement à jour le taux ¥/USD ; la page avertit lorsqu'il date de plus de 7 jours. ## Vérification {#verify} 1. En mode test, connectez-vous au portail en tant que client test, ouvrez **Billing**, cliquez sur **Deposit**, choisissez **Card** et payez le minimum avec la carte de test Stripe `4242 4242 4242 4242` (n'importe quelle date future, n'importe quel CVC). 2. Le solde augmente en quelques secondes et le paiement apparaît sous **Finance › Billing › Top-ups** avec le statut *Completed*. 3. Ouvrez **Payment channels › Gateway events › Stripe**: vous devriez voir `checkout.session.completed` ou `payment_intent.succeeded` avec une heure de traitement. 4. De retour sur la page Stripe, **24h events** est supérieur à 0. Avant de passer en production, basculez **Mode** sur `live`, collez les clés de production et cliquez de nouveau sur **Create webhook** (les webhooks du mode test et du mode production sont distincts). ## Limites et notes {#limits-notes} - **Montants et devise.** Les portefeuilles sont en USD. Les paiements par carte, portefeuille et link sont facturés en USD ; Alipay est affiché au client en JPY et converti selon votre taux. - **Frais.** Le frais réel de Stripe n'est pas récupéré automatiquement ; le pourcentage de frais que vous définissez détermine ce que voit le client et ce qui est crédité sur le portefeuille. Choisissez **Customer pays top-up fee** dans *Fees & limits* pour facturer les frais en sus. - **Cartes enregistrées.** Lorsque le client coche *Save card for auto top-up*, la carte est stockée chez Stripe et non sur votre serveur. Voir [Saved payment methods](https://nexcmp.com/fr/docs/billing/saved-payment-methods/). - **Remboursements.** Le remboursement sur la carte s'effectue en deux étapes : un administrateur crée une demande de remboursement pour un paiement complété (**Finance › Billing › Top-ups**, action de remboursement sur le paiement) puis l'approuve sous **Finance › Payouts › Card refunds** (`/billing/payouts`). Les remboursements Alipay sont asynchrones ; un échec (`refund.failed`) restitue le montant retenu au portefeuille. - **Litiges.** Sur `charge.dispute.created`, NexCMP bloque le compte du client, suspend ses services prépayés (rien n'est supprimé) et envoie une alerte administrateur. Si vous gagnez (`charge.dispute.closed`), le montant est recrédité sur le portefeuille. - **Paiements en attente.** Si un webhook n'arrive jamais, NexCMP vérifie de lui-même auprès de Stripe les paiements restés en attente pendant plus de 10 minutes et les finalise. Les paiements de plus de 7 jours sont ignorés. - Les **Resellers** peuvent connecter leur propre compte Stripe (webhook `https:///v1/billing/stripe/webhook/r/`) ; voir [Resellers](https://nexcmp.com/fr/docs/customers/resellers/). ## Dépannage {#troubleshooting} | Symptôme | Cause | Solution | |---|---|---| | "La clé secrète doit commencer par sk_live_/sk_test_" | Mauvaise clé collée | Collez la clé secrète depuis **Developers › API keys**. | | "La clé secrète ne correspond pas au mode live/test" | Mode et clé discordants | Faites correspondre le paramètre **Mode** avec le préfixe de la clé. | | "La clé publiable doit commencer par pk_" | Clé incorrecte | Utilisez la clé publiable. | | La vérification indique que la connexion a échoué | Clé incorrecte, clé révoquée ou le serveur ne peut pas joindre `api.stripe.com` | Recolez la clé ; testez avec `curl -I https://api.stripe.com` depuis le serveur. | | Bannière rouge "Missing webhook_secret" | Le secret de signature n'est pas enregistré | Cliquez sur **Create webhook** ou collez le secret `whsec_...` depuis le tableau de bord Stripe, puis sur **Save**. | | Paiement effectué mais le solde n'a pas changé | Webhook non délivré ou échec de la signature | Vérifiez que l'URL se termine par `/v1/billing/stripe/webhook`, que le secret correspond au point de terminaison et réexécutez l'événement dans **Gateway events**. Dans Stripe, ouvrez le point de terminaison et consultez les tentatives de livraison (une erreur HTTP 400 indique un mauvais secret de signature). | | "Create webhook" échoue | L'URL n'est pas en HTTPS ou n'est pas accessible | Utilisez votre domaine public `https://`. | | Statut Apple Pay inactif | Domaine non validé | Cliquez à nouveau sur **Register / verify domain** après que le fichier d'association de domaine a répondu 200. | | Alipay non disponible dans la boîte de dialogue de vérification | Non activé sur Stripe | Activez-le dans le tableau de bord Stripe, puis cliquez sur **Check**. | | Le client ne voit pas le formulaire de carte | **Card (Stripe)** est désactivé ou aucune clé secrète n'est définie | Activez-le dans **Fees & limits** et enregistrez les clés. | --- # PayPal > **Dans l'administration :** Finance › Payment channels › PayPal (`/payments/paypal`). L'interrupteur marche/arrêt et les frais se trouvent dans Finance › Payment channels › Fees & limits (`/payments/fees`). ## Description {#what-it-does} Permet aux clients de recharger leur portefeuille en USD avec leur solde PayPal, leur compte bancaire ou une carte enregistrée sur PayPal. Les clients peuvent également autoriser NexCMP à mémoriser leur compte PayPal pour le [rechargement automatique](https://nexcmp.com/fr/docs/billing/auto-top-up/). À utiliser en parallèle de [Stripe](https://nexcmp.com/fr/docs/billing/stripe/) pour les clients qui préfèrent PayPal. ## Prérequis {#requirements} | Élément | Prérequis | |---|---| | Compte PayPal | Un compte PayPal **Business** capable de recevoir des USD. | | Application REST | Une application REST dans le tableau de bord des développeurs PayPal (**Apps & Credentials**) fournissant un **Client ID** et un **Client secret**. Utilisez l'onglet **Sandbox** pour les tests et **Live** pour la production. | | Réseau | HTTPS accessible depuis Internet (PayPal appelle le webhook) et accès sortant vers `api-m.paypal.com` (production) ou `api-m.sandbox.paypal.com` (bac à sable), port 443. | | Permissions | L'application REST nécessite les fonctionnalités de remboursement et de webhooks. La boîte de dialogue **Check** indique si les deux portées sont présentes. | | Dépendances | Aucune. | ## Préparer l'infrastructure {#prepare-the-infrastructure} 1. Connectez-vous à [developer.paypal.com](https://developer.paypal.com) avec votre compte Business et ouvrez **Apps & Credentials**. 2. Choisissez **Sandbox** (tests) ou **Live**, puis cliquez sur **Create App**. Donnez-lui un nom, par exemple "NexCMP". 3. Copiez le **Client ID** et le **Secret** de l'application. 4. Pour les tests, utilisez **Testing Tools › Sandbox Accounts** pour trouver ou créer un compte sandbox *Personnel* (acheteur). 5. Vous n'avez pas besoin de créer le webhook vous-même ; NexCMP le crée avec le bouton **Create webhook**. ## Connecter dans NexCMP {#connect-in-nexcmp} 1. Ouvrez **Finance › Payment channels › PayPal** (`/payments/paypal`). 2. Dans **API keys**, choisissez **Mode** : `live` (argent réel, `api-m.paypal.com`) ou `sandbox` (`api-m.sandbox.paypal.com`). 3. Collez le **Client ID** (au moins 20 caractères) et le **Client secret**. 4. Cliquez sur **Check**. Cela teste les identifiants saisis (l'enregistrement n'est pas requis) et indique la connexion, l'ID d'application, le mode, la présence des portées de remboursement et de webhooks, ainsi que la durée de vie du jeton. 5. Cliquez sur **Save**. 6. Dans la carte **Webhook**, confirmez que l'URL est `https:///v1/billing/paypal/webhook` (elle doit être `https`), puis cliquez sur **Create webhook** et confirmez. NexCMP demande à PayPal de créer ou de mettre à jour le webhook avec 11 événements et enregistre le **Webhook ID** renvoyé. Le bouton utilise les clés **enregistrées** — enregistrez d'abord si vous venez de les modifier. 7. Cliquez à nouveau sur **Check** : la ligne **Webhook** doit indiquer "exists, 11 events". 8. Ouvrez **Fees & limits**, activez **PayPal**, définissez **PayPal fee %** (par défaut 4.4) et **PayPal fixed fee (cents)** (par défaut 30) selon votre tarif, puis cliquez sur **Save channels & fees**. ![Page PayPal avec le mode sandbox et des exemples d'identifiants saisis](https://nexcmp.com/fr/docs/images/billing/paypal-01-keys.webp) ### Événements de webhook {#webhook-events} NexCMP enregistre ces 11 événements : `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`. Chaque webhook est vérifié en appelant l'API de vérification de signature de PayPal, stocké une seule fois et traité de manière idempotente. NexCMP ne fait jamais confiance au montant contenu dans le corps du webhook : avant de créditer une capture, il récupère la capture auprès de PayPal. ## Vérification {#verify} 1. Laissez **Mode** sur `sandbox`. Dans le portail, ouvrez **Billing › Deposit**, choisissez **PayPal**, cliquez sur **Continue on PayPal** (ou sur le bouton PayPal) et connectez-vous avec le compte acheteur sandbox. 2. Approuvez le paiement. Vous retournez sur le portail, le solde augmente et le paiement apparaît sous **Finance › Billing › Top-ups** avec le statut *Completed*. 3. Ouvrez **Payment channels › Gateway events › PayPal & USDT** : l'événement `PAYMENT.CAPTURE.COMPLETED` est répertorié. 4. Lorsque tout fonctionne, basculez **Mode** sur `live`, saisissez les identifiants de production, **Save**, puis cliquez à nouveau sur **Create webhook** (les webhooks sandbox et de production sont distincts). ## Limites et notes {#limits-notes} - **Comment un paiement se finalise.** La commande est créée en USD ; après son approbation par le client, le **serveur** effectue la capture (ID de requête idempotent) et crédite le portefeuille exactement une fois. Le webhook et une tâche de réconciliation exécutée toutes les 10 minutes constituent des filets de sécurité si le client ferme son navigateur. - **Commandes en attente et abandonnées.** Une commande peut rester ouverte pendant 12 heures. Un client peut avoir au maximum 5 commandes en attente (le serveur répond `too_many_pending`, HTTP 429). Une commande toujours non capturée après 24 heures est marquée comme échouée. - **Aucun webhook configuré.** Le panneau répond par HTTP 503 à chaque webhook PayPal tant qu'un Webhook ID n'est pas enregistré. Les captures effectuées via le portail et la réconciliation toutes les 10 minutes créditent toujours le portefeuille, mais rien de ce que PayPal signale par webhook (litiges, annulations, captures tardives) n'est appliqué — cliquez sur **Create webhook**. - **Compte PayPal enregistré.** Lorsque le client choisit d'enregistrer PayPal (ou effectue le premier dépôt, ce qui active le [top-up automatique](https://nexcmp.com/fr/docs/billing/auto-top-up/)), PayPal stocke le jeton de paiement dans son coffre-fort. NexCMP conserve uniquement un identifiant et l'e-mail PayPal. Voir [Saved payment methods](https://nexcmp.com/fr/docs/billing/saved-payment-methods/). - **Remboursements et litiges.** Ils sont gérés comme pour Stripe : les demandes de remboursement sont approuvées sous **Finance › Payouts › Card refunds** ; un litige bloque le compte du client et suspend ses services prépayés jusqu'à sa résolution. - **Frais.** Les frais de PayPal ne sont pas relus automatiquement ; le pourcentage et les frais fixes configurés déterminent ce que le client voit et ce qui est crédité. Le tarif réel dépend de votre pays (le formulaire indique 4.4 % pour le Vietnam et 3.49 % pour les États-Unis). ## Dépannage {#troubleshooting} | Symptôme | Cause | Solution | |---|---|---| | "Client ID trop court" | Moins de 20 caractères collés | Copiez l'ID client complet. | | "L'URL du webhook doit être en https" | URL saisie avec `http://` | Utilisez votre domaine public `https://`. | | La vérification signale une erreur de connexion | Mode incorrect (clés live en sandbox ou l'inverse), secret erroné, pas d'accès sortant | Faites correspondre **Mode** au type de clé ; testez `curl -I https://api-m.paypal.com` depuis le serveur. | | La portée remboursement / webhooks indique "no" | L'application REST ne dispose pas des fonctionnalités | Activez les fonctionnalités sur l'application dans le tableau de bord développeur PayPal. | | Banniere "PayPal key set, NO webhook" | ID de webhook manquant | Cliquez sur **Create webhook**. | | "Webhook not found" lors de la vérification | Le webhook a été supprimé chez PayPal ou appartient à une autre application | Cliquez à nouveau sur **Create webhook**. | | Il est indiqué au client que PayPal a refusé le paiement | PayPal a rejeté cette source de financement | Demandez au client de choisir une autre source de paiement. | | Le client voit "Too many pending requests" | 5 commandes ouvertes | Attendez qu'elles expirent ou finalisez-les. | | Bouton PayPal manquant | PayPal désactivé dans **Fees & limits** ou non configuré | Activez-le et enregistrez les identifiants. | --- # USDT (Binance) {#usdt-binance} > **Où dans l'administration :** Finance › Payment channels › USDT (`/payments/usdt`). Commutateur et frais : Finance › Payment channels › Fees & limits (`/payments/fees`). Dépôts non correspondants : Finance › Payment channels › Gateway events › PayPal & USDT (`/payments/events?tab=gateways`). ## Description {#what-it-does} Les clients envoient des USDT vers **votre adresse de dépôt Binance** ; NexCMP lit l'historique des dépôts via une clé API Binance **en lecture seule** et crédite le portefeuille lorsqu'un dépôt correspond à une demande ouverte. Aucun frais de processeur de paiement n'est appliqué de votre côté en dehors de ceux facturés par Binance, et aucune clé privée n'est jamais conservée par NexCMP. ## Prérequis {#requirements} | Élément | Prérequis | |---|---| | Compte Binance | Un compte Binance vérifié avec les dépôts USDT activés sur le réseau de votre choix. | | Clé API | Une clé API Binance avec uniquement **Enable Reading**. Les options Enable Withdrawals, Internal Transfer et Spot/Margin Trading doivent être sur **off**. | | Restriction IP | Fortement recommandé : restreignez la clé à l'IP sortante du serveur (la boîte de dialogue **Test & verify address** l'affiche). | | Réseau | HTTPS sortant vers `api.binance.com`. Aucun port entrant n'est requis. | | Réseaux pris en charge | `TRX` (Tron, TRC20), `BSC` (BNB Smart Chain, BEP20), `SOL` (Solana), `ETH` (Ethereum, ERC20). La cryptomonnaie est fixée à USDT. | | Dépendances | Aucune. | ::: warning Choisissez le réseau une seule fois Les clients qui envoient sur le mauvais réseau perdent leurs fonds. Choisissez le réseau aux frais bas pris en charge par les plateformes de vos clients (TRX et BSC sont les choix habituels) et ne le changez pas souvent. ::: ## Préparer l'infrastructure {#prepare-the-infrastructure} 1. Dans Binance, ouvrez **Account › API Management** et créez une nouvelle clé API (générée par le système). Donnez-lui un libellé tel que "NexCMP". 2. Modifiez les autorisations : laissez uniquement **Enable Reading** cochée. N'activez pas les retraits, les transferts ni le trading. 3. Sous **Restrict access to trusted IPs only**, ajoutez l'adresse IP publique de votre serveur NexCMP. Si vous ne la connaissez pas encore, créez la clé sans restriction, effectuez un premier test dans NexCMP (qui affiche l'adresse IP sortante) puis ajoutez l'IP. 4. Copiez la **API key** et la **Secret key** (le secret n'est affiché qu'une seule fois). 5. Ouvrez **Wallet › Deposit › Crypto**, choisissez **USDT** ainsi que le **réseau** que vous allez utiliser, puis copiez l'**adresse de dépôt** (par exemple une adresse `T...` sur TRX ou `0x...` sur BSC/ETH). ## Connecter dans NexCMP {#connect-in-nexcmp} 1. Ouvrez **Finance › Payment channels › USDT** (`/payments/usdt`). 2. Dans **API key (Binance › API Management)**, collez l'**API key** et l'**API secret**. Ces deux éléments doivent être saisis ensemble. 3. Dans **Deposit address**, choisissez le **Network** et collez l' **adresse de dépôt USDT sur le réseau sélectionné**. Le format est vérifié en fonction du réseau (`T` + 33 caractères pour TRX, `0x` + 40 caractères hexadécimaux pour BSC et ETH, base58 pour SOL). 4. Cliquez sur **Save**. Modifier l'adresse ou le réseau réinitialise la vérification et met le canal en pause jusqu'à ce que vous le vérifiiez à nouveau ; la page vous demande de confirmer. 5. Cliquez sur **Test & verify address**. (Les modifications non enregistrées sont refusées — la vérification s'exécute sur la configuration enregistrée.) La boîte de dialogue affiche : - les permissions de la clé (lecture, retraits, transfert interne, trading, restriction IP) — des avertissements rouges pour les permissions dangereuses ; - l'adresse IP sortante du serveur (à saisir dans Binance) ; - le réseau (dépôts ouverts ou fermés, confirmations requises, poussières) ; - l'adresse générée par Binance pour ce réseau et indique si elle **correspond** à la vôtre. 6. Lorsque l'adresse correspond, NexCMP enregistre l'heure de la vérification. Ce n'est qu'alors que vous pouvez ouvrir **Fees & limits**, activer **USDT (Binance)**, vérifier le **USDT fee %** (par défaut 1) ainsi que **USDT request expires after (mins)** (5–180, par défaut 30), et cliquer sur **Save channels & fees**. ## Comment un paiement est mis en correspondance {#how-a-payment-is-matched} 1. Le client saisit un montant dans **Billing › Deposit › USDT** et clique sur **Get deposit address**. 2. NexCMP crée une demande et affiche l'adresse, le réseau et un **montant exact** à six décimales — par exemple `19.173742`. Les quatre dernières décimales constituent un code aléatoire (nonce) qui rend le montant unique pour cette demande. 3. Le client doit envoyer **exactement** ce montant sur ce réseau. Un paiement ne correspondant pas (montant arrondi, mauvais réseau) ne peut pas être attribué automatiquement. 4. Toutes les 60 secondes, NexCMP lit les dépôts Binance des dernières 24 heures. Un dépôt correspondant fait passer la demande à l'état *confirming* et, une fois que Binance a réuni les confirmations requises, crédite le portefeuille. Une demande ayant reçu des fonds n'expire jamais tant que des confirmations sont en attente. 5. Une demande non payée dans le délai d'expiration (30 minutes par défaut) est marquée comme expirée. ## Vérification {#verify} 1. Une fois l'adresse vérifiée et l'USDT activé, connectez-vous en tant que client test et demandez un petit dépôt (le montant minimal de rechargement). 2. Envoyez le montant exact depuis un autre portefeuille ou une autre bourse. Patientez quelques minutes. 3. Le portail affiche *Transfer seen — confirming*, puis *USDT received — balance updated*. 4. La page USDT indique une heure récente pour **Last poll** et **Unmatched** à 0. ## Limites et notes {#limits-notes} - **Taux.** 1 USDT = 1.00 USD. Les frais définis dans **USDT fee %** sont affichés au client et soit déduits, soit ajoutés au montant selon la configuration de **Customer pays top-up fee**. - **Aucun remboursement.** Les paiements en USDT ne sont jamais remboursés à la source par NexCMP (HTTP 409 `usdt_no_refund`). Effectuez un remboursement manuel en dehors du système si nécessaire. - **Limite de demandes en attente.** Un client dispose d'un nombre limité de demandes ouvertes ; au-delà, le serveur répond par `too_many_pending` (HTTP 429). - Les **Resellers** peuvent utiliser leur propre compte Binance ; consultez [Resellers](https://nexcmp.com/fr/docs/customers/resellers/). - **Si vous partagez le compte Binance** avec un autre système, attribuez à chaque système un réseau différent afin que deux interrogateurs ne voient jamais le même dépôt. ### Dépôts non correspondants {#unmatched-deposits} Un dépôt qui ne correspond à aucune demande (montant erroné, réseau erroné, demande expirée) crée un événement `deposit.unmatched` et une alerte administrateur. Ouvrez **Payment channels › Gateway events › PayPal & USDT**, trouvez l'événement, vérifiez la transaction sur Binance et cliquez sur l'action d'attribution pour créditer le bon client. Le compteur **Unmatched** sur la page USDT et sur la vue d'ensemble des canaux retombe ensuite à 0. ## Dépannage {#troubleshooting} | Symptôme | Cause | Solution | |---|---|---| | "La clé API et le secret doivent être saisis ensemble" | Un seul champ rempli | Remplissez les deux. | | "L'adresse n'est pas au format de réseau ..." | L'adresse ne correspond pas au réseau sélectionné | Recopiez-la depuis Binance pour le même réseau. | | "Modifications non enregistrées — Enregistrez d'abord puis testez" | Le test s'exécute sur les paramètres enregistrés | Cliquez sur **Save**, puis effectuez le test. | | Avertissement "key has Enable Withdrawals" | Permission excessive | Retirez-la dans la gestion des API de Binance. | | Avertissement "key not restricted to IP" | `ipRestrict` est désactivé | Ajoutez l'IP sortante du serveur indiquée dans la boîte de dialogue. | | Avertissement "key lacks Enable Reading" | Permission manquante | Activez Enable Reading. | | Avertissement "Binance has deposits disabled for USDT on the network" | Réseau suspendu | Choisissez un autre réseau ou patientez. | | "DANGER : l'adresse configurée diffère de celle émise par Binance" | Adresse ou réseau erroné | Copiez à nouveau l'adresse depuis Binance pour ce réseau. | | Interrupteur USDT grisé dans Fees & limits | Adresse non vérifiée | Exécutez **Test & verify address** jusqu'à ce qu'elle corresponde. | | Client payé, rien n'a été crédité | Montant arrondi ou réseau erroné | Trouvez l'événement dans Gateway events et attribuez-le manuellement. | | Dépôt vu mais attente prolongée | Pas assez de confirmations pour l'instant | Patientez ; la demande n'expire pas pendant la confirmation. | --- # Virement bancaire (Vietnam) {#bank-transfer-vietnam} > **Où trouver dans l'admin :** Finance › Payment channels › VN bank transfer (`/payments/bank`). Taux de change : Finance › Payment channels › Exchange rates (`/payments/fx`). ## Description {#what-it-does} Permet aux clients de recharger le portefeuille USD par virement bancaire normal en dongs vietnamiens. NexCMP affiche un code VietQR, les détails du compte et un **libellé de virement** unique ; [Sepay](https://sepay.vn) surveille votre compte bancaire et appelle un webhook lorsque l'argent arrive, puis NexCMP crédite le portefeuille. Utilisez cette option si vous vendez à des clients au Vietnam. ::: info Affiché uniquement dans l'interface vietnamienne L'option bancaire vietnamienne n'est proposée au client que lorsque le portail est affiché en **Vietnamese**. Les clients utilisant une autre langue ne la voient jamais. ::: ## Prérequis {#requirements} | Élément | Prérequis | |---|---| | Compte bancaire | Un compte bancaire vietnamien (ou un compte virtuel Sepay, **VA**) relié à un compte Sepay sur [my.sepay.vn](https://my.sepay.vn). | | Sepay | Un compte Sepay avec l'intégration des webhooks activée. | | Taux de change | Un taux USD/VND doit exister : mettez-le d'abord à jour sous **Exchange rates**. Sans taux, le canal renvoie `fx_unavailable` et les clients ne peuvent pas initier de virement. | | Réseau | Votre panneau doit être accessible en HTTPS pour que Sepay puisse appeler `https:///v1/billing/sepay/webhook`. | | Dépendances | [Devise et taux de change](https://nexcmp.com/fr/docs/catalog/currency-and-exchange-rates/). | ## Préparer l'infrastructure {#prepare-the-infrastructure} Du côté de Sepay : 1. Sur [my.sepay.vn](https://my.sepay.vn), connectez votre compte bancaire (ou créez un VA) et assurez-vous que les transactions apparaissent. 2. Définissez le **préfixe de libellé** — 2 à 5 lettres majuscules, par exemple `PAY`. NexCMP génère le libellé sous la forme du préfixe suivi de 8 chiffres aléatoires (par exemple `PAY48210937`). Le préfixe ne doit pas contenir `ORD` et ne doit pas être utilisé par un autre système recevant des fonds sur le même compte. 3. Si votre compte Sepay utilise une *structure de code de paiement*, enregistrez le même préfixe afin que Sepay reconnaisse le libellé. 4. Créez le webhook ultérieurement, après que la page NexCMP vous a fourni l'URL et la clé (étape 7 ci-dessous). ## Connecter dans NexCMP {#connect-in-nexcmp} 1. Ouvrez **Finance › Payment channels › Exchange rates** et cliquez sur **Update exchange rates** si aucun taux n'a été enregistré. 2. Ouvrez **Finance › Payment channels › VN bank transfer** (`/payments/bank`). 3. Dans **Receiving account**, renseignez : | Champ | Exemple | Règle | |---|---|---| | Banque | `VCB` Vietcombank | Choisissez dans la liste ; le BIN se remplit automatiquement. | | Numéro de compte | `0123456789` | 4 à 24 chiffres ou lettres majuscules. | | Compte virtuel (VA — facultatif) | | S'il est défini, les clients effectuent le virement vers le VA et le QR code l'affiche. | | Nom du titulaire du compte | `NGUYEN VAN A` | Sans accents, EN MAJUSCULES, 2 à 60 caractères. | | Préfixe du libellé de virement | `PAY` | 2 à 5 lettres majuscules, sans `ORD`. | 4. Dans **Webhook authentication**, choisissez **Auth method** : **HMAC-SHA256** (recommandé) ou **API key**, et saisissez la **Webhook key / HMAC secret** (8 à 200 caractères). Saisissez éventuellement le **userapi token** de Sepay ; il est utilisé uniquement pour rapprocher les virements dont le webhook a été perdu. 5. Dans **Channel & limits**, définissez les limites (par défaut entre parenthèses) : **Min / order** (10,000 VND), **Max / order** (200,000,000 VND), **Order expiry** (120 minutes, 15–1440), **Max pending orders / account** (3, 1–10), **Reconcile every** (10 minutes) et, optionnellement, **Allowed webhook IPs** (séparées par des virgules ; vide pour consigner uniquement). 6. Cliquez sur **Save**. La bannière rouge « Sepay not configured » disparaît dès que le compte, le nom, le préfixe et la clé sont valides. 7. Copiez **Webhook URL to paste into my.sepay.vn** (qui indique `https:///v1/billing/sepay/webhook`) avec **Copy**. Dans Sepay, ouvrez l'intégration de webhook, collez l'URL, choisissez le même type d'authentification et la même clé, puis activez l'événement « money in ». 8. Cliquez sur **Test connection**. Activez ensuite l'option **Enable Sepay for clients (main site)** et cliquez sur **Save**. ![Page de virement bancaire VN avec le compte de réception, le préfixe de libellé et l'authentification webhook renseignés avec des exemples de valeurs](https://nexcmp.com/fr/docs/images/billing/bank-transfer-vn-01-config.webp) ![Carte du canal et des limites avec l'interrupteur Sepay activé et les limites par défaut](https://nexcmp.com/fr/docs/images/billing/bank-transfer-vn-02-limits.webp) ### Sécurité des webhooks {#webhook-security} | Méthode | Ce que Sepay doit envoyer | |---|---| | HMAC-SHA256 | En-tête `X-SePay-Signature: sha256=`, calculé sur `"."` ; l'horodatage peut différer d'au maximum 300 secondes. | | Clé API | En-tête `Authorization: Apikey `. | Seuls les en-têtes sont vérifiés (jamais le corps ni la chaîne de requête) et la comparaison est à temps constant. Seuls les transferts entrants (`transferType = in`) vers votre compte configuré ou VA sont utilisés. Chaque transaction Sepay est enregistrée une seule fois, de sorte qu'un webhook relancé ne crédite jamais deux fois. NexCMP répond `200 {"success":true}` même lorsqu'il ignore délibérément une transaction, et HTTP 5xx uniquement pour les erreurs temporaires afin que Sepay réessaie. ## Comment le client paie {#how-the-customer-pays} 1. Dans **Billing › Deposit** (interface en vietnamien), le client choisit l'option de virement bancaire vietnamien et un montant, puis clique sur le bouton de création de virement. 2. NexCMP convertit le montant en USD au taux enregistré (incluant la marge et l'étape d'arrondi que vous avez définies dans **Exchange rates**) et **arrondit le montant en VND vers le haut** selon l'étape d'arrondi. 3. Le client voit un code QR (VietQR, généré localement) avec le numéro de compte, la banque, le montant et le libellé. 4. Après le transfert, Sepay appelle le webhook, NexCMP crédite `floor(VND received × 100 / rate)` centimes. Le taux est verrouillé lors de la création de la commande ; si l'argent arrive après l'expiration de la commande, le plus élevé entre le taux verrouillé et le taux actuel est utilisé. 5. Les commandes expirent après **Order expiry** ; la réconciliation s'exécute toutes les **Reconcile every** minutes en tant que filet de sécurité (nécessite le jeton userapi). ## Vérification {#verify} 1. Créez une commande test en tant que client sur l'interface vietnamienne. Vérifiez que le montant, le compte et le libellé sont corrects. 2. Transférez le montant minimum autorisé avec le libellé exact. 3. En moins d'une minute, le portail affiche le dépôt comme terminé et le solde augmente ; la carte **State** sur la page de la banque indique l'heure du dernier webhook. 4. Ouvrez **Finance › Billing › Top-ups** et vérifiez que le paiement est répertorié avec le montant en VND reçu. ## Limites et notes {#limits-notes} - **Minimum.** Le minimum en VND qu'un client voit est le plus élevé entre **Min / order** et la valeur en VND du [minimum top-up](https://nexcmp.com/fr/docs/billing/minimum-top-up/). - **Commandes en attente.** Un client ne peut avoir que **Max pending orders / account** commandes ouvertes (par défaut 3). - **Même libellé deux fois.** Transférer deux fois avec le même libellé crée un second paiement complété au taux actuel. - **Pas de remboursement automatique** vers un compte bancaire. - **Frais.** Le canal n'a pas de ligne de frais fixes dans **Fees & limits** ; la marge sur le taux est le seul ajustement. - Les **Resellers** peuvent configurer leur propre compte ; l'URL de leur webhook se termine par `/v1/billing/sepay/webhook/r/`. ### Transferts non appariés {#unmatched-transfers} L'argent qui est parvenu sur le compte mais ne comporte aucun libellé valide apparaît dans **Unmatched transactions** au bas de la page (filtre *All channel owners* ou *Master*). Vérifiez la référence bancaire avec le client, puis cliquez sur **Assign** et sélectionnez le compte. Le portefeuille est crédité au taux actuel. ## Dépannage {#troubleshooting} | Symptôme | Cause | Solution | |---|---|---| | Bannière "Sepay not configured" | Banque, compte, nom du titulaire, préfixe ou clé manquant ou invalide | Complétez les cartes **Receiving account** et **Webhook authentication**. | | Bannière "USD/VND rate blocked" (`fx_unavailable`) | Aucun taux de change enregistré | **Exchange rates › Update exchange rates**. | | `prefix: 2–5 capital letters, no ORD` | Préfixe invalide | Utilisez 2 à 5 lettres majuscules sans `ORD`. | | Erreur `account_name` | Accents ou minuscules | Utilisez des lettres majuscules sans accent, des chiffres, des espaces, des points ou des tirets. | | `webhook_secret: 8–200 characters` | Clé trop courte | Utilisez au moins 8 caractères imprimables. | | Le client ne voit pas l'option | Non présent dans l'interface vietnamienne, désactivé ou taux manquant | Vérifiez la langue, le commutateur et le taux. | | Client a payé mais rien n'a été crédité | Le webhook n'est pas arrivé, le mémo a changé, montant erroné | Consultez le journal des webhooks de Sepay ; le virement figurera dans **Unmatched transactions** si le mémo était incorrect. | | Le webhook renvoie 401 ou 403 | Incompatibilité de méthode d'authentification ou de clé | Utilisez la même méthode et la même clé dans Sepay et NexCMP. | | Le client voit "Too many pending requests" | Limite de commandes en attente atteinte | Elles se terminent ou attendent l'expiration. | --- # Montant minimal de recharge {#minimum-top-up} > **Où dans l'administration :** Finance › Payment channels › Fees & limits (`/payments/fees`), carte **Wallet & top-up (Billing › Policy)**. ## Description {#what-it-does} Chaque canal de paiement rejette un montant inférieur au **minimum top-up** ou supérieur au **maximum top-up per transaction**. Les valeurs par défaut sont **$10.00** et **$5,000.00**. Utilisez le minimum pour éviter les micro-paiements dont les frais de passerelle excèdent la valeur. ## Prérequis {#requirements} | Élément | Prérequis | |---|---| | Rôle | Un administrateur. | | Dépendances | Aucune. | ## Définir les limites {#set-the-limits} 1. Ouvrez **Finance › Payment channels › Fees & limits** (`/payments/fees`). 2. Dans la carte **Wallet & top-up (Billing › Policy)**, modifiez **Min top-up (USD)** et **Max top-up per transaction (USD)**. 3. Cliquez sur **Save Wallet & top-up**. ![Carte du portefeuille et de la recharge avec le montant minimal de 10.00 et maximal de 5000.00](https://nexcmp.com/fr/docs/images/billing/minimum-top-up-01-limits.webp) | Paramètre | Valeur par défaut | Plage autorisée | Règle | |---|---|---|---| | Min top-up (USD) | $10.00 | $0 à $10,000 | Doit être inférieur ou égal au maximum. | | Recharge maximale par transaction (USD) | $5,000.00 | $1 à $1,000,000 | Doit être au moins égal au minimum. | Les valeurs sont stockées en cents (`min_topup_cents`, `max_topup_cents`). ## Où s'appliquent les limites {#where-the-limits-apply} | Emplacement | Comportement | |---|---| | Carte, Apple/Google Pay, Link, Alipay, PayPal, USDT | Les montants hors de la plage sont refusés par le serveur. Le portail affiche "Enter an amount between {min} and {max}". | | Virement bancaire VN | Le montant en VND doit se situer dans les limites de Sepay **et** sa valeur en USD (reçue par le portefeuille) entre le minimum et le maximum. Le portail affiche le plus grand des deux minimums en VND. Voir [Bank transfer (Vietnam)](https://nexcmp.com/fr/docs/billing/bank-transfer-vn/). | | [Automatic top-up](https://nexcmp.com/fr/docs/billing/auto-top-up/) | Chaque débit automatique respecte le minimum et le maximum. En mode fixe, le montant du client doit être compris entre le minimum et $1,000. | | Codes de recharge ([Vouchers](https://nexcmp.com/fr/docs/billing/promotions/)) | Non affecté. | | Crédit / débit administrateur | Non affecté. | | Recharge du portefeuille revendeur | Un minimum distinct (`rs_topup_min_cents`, par défaut $20) sous Resellers › Defaults. | ## Seuils associés {#related-floors} Le montant minimal de recharge n'est pas la seule règle de solde. Celles-ci se trouvent dans **Services › Virtual Machines › Policy** (`/vm/policy`) : | Règle | Valeur par défaut | Description | |---|---|---| | Solde minimal (`min_balance_cents`) | $5.00 | Le solde de portefeuille minimal requis pour qu'un client crée une machine virtuelle. | | Quotas | Désactivé | Lorsque les **Quotas** sont activés, la création d'une machine virtuelle nécessite également un solde couvrant un certain nombre d'heures d'utilisation. Voir [Quotas](https://nexcmp.com/fr/docs/billing/quotas/). | ## Vérification {#verify} 1. Dans le portail, ouvrez **Billing › Deposit** et saisissez un montant juste en dessous de votre minimum. Le bouton de paiement est désactivé et le message indiquant la plage s'affiche. 2. Saisissez le minimum et confirmez que le paiement démarre. ## Limites et notes {#limits-notes} - Une modification s'applique aux nouveaux paiements. Les commandes déjà créées conservent les montants avec lesquels elles ont été générées. - L'indication visible par le client (« Minimum $10.00, maximum $5,000.00 ») et les boutons de montant rapide s'ajustent automatiquement aux nouvelles limites. - Si vous affichez le VND (page **Exchange rates**), le minimum est converti au taux enregistré uniquement à des fins d'affichage ; le portefeuille et les limites restent en USD. ## Dépannage {#troubleshooting} | Symptôme | Cause | Solution | |---|---|---| | « Le montant minimum du rechargement doit être inférieur ou égal au maximum » | Valeurs inversées | Abaissez le minimum ou augmentez le maximum. | | Le client ne peut pas payer un petit montant par virement bancaire vietnamien | Le minimum SePay en VND ou le minimum en USD est plus élevé | Abaissez **Min / order** sur la page de la banque ou le minimum en USD. | | Erreur de serveur `invalid_argument` lors d'un rechargement | Montant hors de la plage | Demandez un montant compris dans la plage affichée. | --- # Saved payment methods {#saved-payment-methods} > **Où dans le portail :** Billing › Settings (`/billing?settings=1`). **Où dans l'admin :** Customers › List › a customer › Overview (`/customers/`), carte **Payment**, affiche la méthode enregistrée et l'historique des rechargements automatiques. ## Description {#what-it-does} Un moyen de paiement enregistré permet à NexCMP de débiter un client **en son absence**, afin que ses services ne s'arrêtent jamais par manque de fonds. Il est utilisé exclusivement par le [rechargement automatique](https://nexcmp.com/fr/docs/billing/auto-top-up/). Il en existe deux types : une **carte** enregistrée sur Stripe (y compris les cartes utilisées via Apple Pay, Google Pay ou Link lorsque Stripe renvoie une carte réutilisable) et un **compte PayPal** stocké dans le coffre-fort PayPal. ## Prérequis {#requirements} | Élément | Prérequis | |---|---| | Canaux | [Stripe](https://nexcmp.com/fr/docs/billing/stripe/) et/ou [PayPal](https://nexcmp.com/fr/docs/billing/paypal/) configurés et activés. | | Site | Le site principal, ou un site de revendeur dont le canal de paiement est encaissé par la plateforme. Un site de revendeur qui utilise son propre compte Stripe ne peut pas enregistrer de cartes. | | Client | Un compte client ayant effectué un rechargement par carte ou PayPal. | ## Comment un moyen est enregistré {#how-a-method-gets-saved} 1. Le client ouvre **Billing**, clique sur **Deposit** et paie par **Card** ou **PayPal**. 2. Le paiement est créé de manière à ce que le moyen puisse être réutilisé ultérieurement : Stripe stocke la carte auprès du client sur Stripe (utilisation hors session), PayPal stocke un jeton de coffre-fort. NexCMP ne conserve que des références (un ID de moyen de paiement et un ID client Stripe, ou l'ID de coffre-fort PayPal) ainsi qu'un libellé d'affichage tel que `visa •••• 4242` ou l'e-mail PayPal. **Les numéros de carte ne transitent jamais par votre serveur.** 3. Une fois le paiement effectué, le [rechargement automatique](https://nexcmp.com/fr/docs/billing/auto-top-up/) est activé une première fois si le client n'avait jamais défini de paramètres auparavant. Il n'y a pas de case à cocher supplémentaire ni de message à l'écran. Le serveur enregistre l'horodatage, l'adresse IP du client et le moyen comme preuve. 4. La fois suivante, l'écran de dépôt propose **Saved card ...** dans le menu déroulant des cartes, et **Saved PayPal ...** pour PayPal. ## Gestion et suppression {#manage-and-remove} 1. Dans le portail, allez dans **Billing** et cliquez sur **Settings**. Le panneau affiche les moyens enregistrés (carte Stripe et/ou PayPal) ainsi que les options de rechargement automatique. 2. Pour supprimer une carte, cliquez sur **Remove card** et confirmez. Stripe détache la carte et **le rechargement automatique est désactivé**. 3. Pour supprimer PayPal, cliquez sur **Remove saved PayPal** et confirmez. ### Vue administrateur {#admin-view} Ouvrez le client dans **Customers › List**. La carte **Payment** sur l'onglet **Overview** affiche les libellés des méthodes enregistrées (**Saved cards**), la passerelle utilisée pour les prélèvements automatiques, la preuve de consentement enregistrée (heure, IP, méthode) et les 20 dernières tentatives de prélèvement automatique avec leur statut et leur motif (**Auto top-up history**). ## Vérification {#verify} 1. En tant que client test, déposez le montant minimum par carte. Une fois le paiement terminé, ouvrez **Billing › Settings**: la carte et le commutateur de rechargement automatique (activé) sont visibles. 2. Commencez un autre dépôt : le menu déroulant propose la carte enregistrée. 3. Dans l'administration, la carte **Payment** du client affiche le même libellé de carte. ## Limites et notes {#limits-notes} - **Stripe Link et portefeuilles.** Link, Apple Pay et Google Pay sont des fonctionnalités de Stripe. NexCMP ne stocke rien de spécifique à Link ; il conserve uniquement la référence de carte renvoyée par Stripe. - **PayPal.** Chaque rechargement PayPal initié par le client nécessite un clic ; le PayPal enregistré est utilisé uniquement par le rechargement automatique, jamais par d'autres fonctionnalités. - **Sites de revendeurs.** Si un revendeur utilise son propre compte Stripe ou PayPal, les méthodes enregistrées sont masquées et le rechargement automatique n'est pas disponible pour ce site. - **Litiges.** Un litige sur n'importe quel paiement bloque le compte et arrête ses services prépayés ; voir [Stripe](https://nexcmp.com/fr/docs/billing/stripe/). - **La suppression de la dernière méthode** désactive le rechargement automatique ; le client conserve le solde de son portefeuille. - **Preuve.** L'enregistrement du consentement est écrit par le serveur (non modifiable par le client) et est conservé pour le traitement des litiges. ## Dépannage {#troubleshooting} | Symptôme | Cause | Solution | |---|---|---| | Le client ne voit aucun bouton Paramètres ni de carte enregistrée | Le site utilise un canal de paiement appartenant au revendeur, ou aucun paiement par carte pour l'instant | Effectuez un rechargement par carte ou PayPal via le canal de la plateforme. | | "Saved card" manquant après un paiement Stripe | Le paiement a été effectué avec une méthode non réutilisable (par exemple Alipay) | Payez à nouveau avec une carte. | | PayPal : "cannot save this account yet" | PayPal n'a pas renvoyé de jeton de coffre-fort | Continuez avec un paiement unique ou essayez un autre compte PayPal. | | Le rechargement automatique s'est arrêté après la suppression de la carte | Attendu : la suppression de la carte la désactive | Enregistrez une nouvelle méthode lors du prochain dépôt. | --- # Rechargement automatique {#auto-top-up} > **Où dans l'administration :** Finance › Payment channels › Fees & limits (`/payments/fees`), carte **Wallet & top-up (Billing › Policy)**, section **Auto top-up (Stripe / PayPal)**. **Où dans le portail :** Billing › Settings (`/billing?settings=1`). ## Description {#what-it-does} Lorsque le solde du portefeuille d'un client devient trop bas, NexCMP débite sa [méthode de paiement enregistrée](https://nexcmp.com/fr/docs/billing/saved-payment-methods/) et crédite le portefeuille, afin que les services en cours ne soient pas suspendus par manque de fonds. Une tâche de fond vérifie tous les clients activés **toutes les 5 minutes**. ## Prérequis {#requirements} | Élément | Prérequis | |---|---| | Canal | [Stripe](https://nexcmp.com/fr/docs/billing/stripe/) et/ou [PayPal](https://nexcmp.com/fr/docs/billing/paypal/) configurés. | | Méthode enregistrée | Le client possède une carte ou un compte PayPal enregistré. | | Site | Site principal ou site de revendeur dont le canal Stripe/PayPal est encaissé par la plateforme. | | Interrupteur global | **Auto top-up enabled** est activé (activé par défaut). | ## Comment ça fonctionne {#how-it-works} Après le **premier rechargement Stripe ou PayPal** d'un client, le serveur enregistre le mode de paiement et active le rechargement automatique en mode **By usage**, uniquement si le client ne l'a jamais configuré lui-même. Aucune case à cocher supplémentaire n'apparaît sur l'écran de dépôt ; le serveur consigne l'heure, l'adresse IP et la méthode comme justificatifs. Si le client désactive ultérieurement le rechargement automatique, il ne sera jamais réactivé de lui-même. | Mode | Déclencheur (lorsque le solde est inférieur à...) | Montant facturé | |---|---|---| | **By usage** (par défaut après le premier rechargement) | le coût des 24 prochaines heures de services actifs (VM facturées à l'heure plus renouvellements prépayés dus dans les 24 heures), mais jamais en dessous de **$5** | le coût sur 24 heures arrondi au dollar supérieur, au moins le [minimum top-up](https://nexcmp.com/fr/docs/billing/minimum-top-up/), au plus le maximum top-up et le plafond journalier | | **Fixed amount** | le seuil personnalisé du client ($1 à $500) | le montant personnalisé du client (du minimum de rechargement à $1,000, et supérieur au seuil) | S'il n'y a aucun service actif en mode **By usage**, aucun montant n'est facturé. Le solde comparé au seuil correspond à **l'argent réel dans le portefeuille**. Les crédits de service issus de codes promotionnels sont conservés séparément et ne sont pas pris en compte (voir [Promotions](https://nexcmp.com/fr/docs/billing/promotions/)). Les frais sont traités comme un rechargement normal : si l'option **Customer pays top-up fee** est activée, la carte est débitée du montant augmenté des frais et le portefeuille reçoit le montant intégral ; si elle est désactivée, le portefeuille reçoit le montant moins les frais. ## Configurer les limites globales {#configure-the-global-limits} 1. Ouvrez **Finance › Payment channels › Fees & limits** (`/payments/fees`). 2. Dans **Auto top-up (Stripe / PayPal)**, définissez : | Paramètre | Valeur par défaut | Plage | Description | |---|---|---|---| | Auto top-up enabled | On | activé ou désactivé | La position désactivée arrête immédiatement tout prélèvement en arrière-plan. | | Seuil de rechargement automatique par défaut (USD, repli en mode fixe) | $5.00 | $0 à $10,000 | Utilisé uniquement comme seuil initial en mode fixe. | | Nombre max. de rechargements auto. par 24 h et par client | 3 | 1 à 50 | Compte les tentatives réussies et en attente. | | Plafond du montant de rechargement auto. par 24 h et par client (USD) | $500.00 | $0 à $1,000,000 | Total des prélèvements automatiques sur une période glissante d'un jour. | 3. Cliquez sur **Save Wallet & top-up**. ![Section de rechargement automatique de la page des frais et limites avec l'interrupteur global et les limites journalières](https://nexcmp.com/fr/docs/images/billing/auto-top-up-01-limits.webp) ## Ce que voit le client {#what-the-customer-sees} 1. Dans le portail, le client ouvre **Billing** et clique sur **Settings**. 2. Le panneau affiche le ou les modes de paiement enregistrés, l'interrupteur marche/arrêt, le mode (**By usage** ou **Fixed amount**), l'estimation de l'utilisation actuelle et du prochain prélèvement, ainsi que la section **Recent automatic top-ups**. 3. Passer au mode **Fixed amount** lui permet de saisir le seuil et le montant. Désactiver l'interrupteur arrête les prélèvements. ![Paramètres de facturation client avec le rechargement automatique en mode By usage et les rechargements automatiques récents](https://nexcmp.com/fr/docs/images/billing/auto-top-up-02-portal.webp) ## Vérification {#verify} 1. En tant que client test, effectuez un premier rechargement avec une carte de test ([Stripe](https://nexcmp.com/fr/docs/billing/stripe/#verify)). Ouvrez **Billing › Settings**: le rechargement automatique est activé. 2. Démarrez une petite machine virtuelle pour générer de l'utilisation et réduisez le solde en dessous du seuil (par exemple via **Customers › customer › Credit / debit**). 3. Un prélèvement est effectué dans les 5 minutes environ. Dans la carte **Overview › Payment** du client, **Auto top-up history** affiche la tentative avec le statut *Done*, et une notification *Top-up received* est envoyée. ## Limites et notes {#limits-notes} - **Un seul débit par seuil franchi.** Après un débit, la tâche attend que le solde remonte au-dessus du seuil ou que le délai d'attente expire : 1 heure après un succès, 24 heures après un débit en attente, 30 minutes après une erreur système. - **Limites quotidiennes.** Lorsque l'une ou l'autre des limites quotidiennes est atteinte, aucun débit n'est effectué et une ligne *Daily limit reached* est enregistrée (au maximum toutes les 6 heures). - **Échecs.** Une carte refusée, expirée ou un solde insuffisant compte comme un échec de carte. La tâche réessaie après 1 heure, puis 6 heures, puis 24 heures. **Après 3 échecs consécutifs de carte, le rechargement automatique est désactivé** et le client est notifié (*Auto top-up failed*). Un paiement nécessitant une confirmation du client (par exemple 3-D Secure) n'est pas comptabilisé comme un échec ; il est demandé au client de le confirmer. - **Pas de double débit.** Chaque débit est revendiqué de manière atomique par franchissement de seuil à la baisse et utilise une clé d'idempotence auprès de la passerelle. - **La suppression de la carte** désactive le rechargement automatique. - **Revendeurs.** Si un revendeur utilise son propre canal de paiement, le client ne peut pas activer le rechargement automatique (HTTP 403 `feature_disabled`). ## Dépannage {#troubleshooting} | Symptôme | Cause | Solution | |---|---|---| | Le client ne peut pas l'activer : "Top up once with a card or PayPal" | Aucun moyen enregistré | Effectuez d'abord un premier rechargement par carte ou PayPal. | | Erreur `no_card` (422) | La passerelle choisie n'a aucune méthode enregistrée | Sélectionnez une passerelle qui en possède une ou enregistrez une méthode. | | Erreur `invalid_argument` sur le montant | Mode fixe hors des plages autorisées | Seuil $1–$500, montant entre le rechargement minimum et $1,000, montant supérieur au seuil. | | Aucun débit effectué malgré un solde bas | Commutateur global désactivé, aucun service en cours d'exécution en mode À l'usage, limite quotidienne atteinte ou débit précédent toujours en attente | Vérifiez le commutateur, l'historique et les limites. | | "N tentatives consécutives échouées — le rechargement automatique se désactive après 3" | La carte continue d'échouer | Le client remplace la carte par un nouveau dépôt. | | Statut *Nécessite votre confirmation* | La banque exige 3-D Secure | Le client effectue un rechargement normal une fois. | --- # Factures et grand livre {#invoices-and-ledger} > **Où dans l'admin :** Finance › Billing (`/billing`) avec les onglets Overview, Transactions (`/billing/ledger`), Invoices (`/billing/invoices`), Top-ups (`/billing/deposits`), Payouts (`/billing/payouts`), Vouchers (`/billing/vouchers`) et Reports (`/billing/reports`). **Où dans le portail :** Billing (`/billing`). ## Description {#what-it-does} Chaque montant dans NexCMP est stocké en centimes USD et enregistré une seule fois. L'idée clé : le **grand livre du portefeuille** est la source de vérité pour les soldes ; les factures, les paiements de rechargement et les rapports sont des vues construites à partir de celui-ci. Le grand livre est en **mode ajout uniquement** (append-only) — une erreur se corrige en ajoutant une écriture d'annulation, jamais en modifiant l'historique. ## Prérequis {#requirements} | Élément | Prérequis | |---|---| | Rôle | Un administrateur. | | Détails du vendeur | Définissez le nom légal, le numéro de TVA, l'adresse, l'e-mail de contact et le préfixe de numéro de facture dans **System › Settings › General**, onglet **Seller & invoicing** (`/settings?tab=seller`), carte **Seller details (printed on invoices)**. | | Dépendances | [Payment channels](https://nexcmp.com/fr/docs/billing/payment-channels/) pour les entrées d'argent. | ## Les éléments {#the-pieces} | Onglet admin | Ce qu'il liste | Usage type | |---|---|---| | **Overview** | Recettes du jour et du mois, totaux du grand livre par type (dépôt, débit, remboursement, ajustement, bon d'achat), factures par statut, remboursements en attente, raccourcis, dépenses par service sur les 30 derniers jours | Vérification quotidienne | | **Transactions** | Le grand livre du portefeuille, une ligne par mouvement | Expliquer le solde d'un client | | **Invoices** | Factures et deuxième vue **Orders** avec chaque achat de chaque service | Trouver un document, renvoyer, marquer comme payé | | **Top-ups** | Paiements reçus via les passerelles | Vérifier un paiement, le rembourser | | **Payouts** | Remboursements de cartes, commissions d'affiliation, retraits de revendeurs | Approuver les sorties d'argent | | **Vouchers** | Codes de rechargement | Voir [Promotions](https://nexcmp.com/fr/docs/billing/promotions/) | | **Reports** | Chiffre d'affaires par service, par revendeur | Comptabilité | ### Transactions (grand livre) {#transactions-ledger} Colonnes : heure, client, **type**, service, montant (signé), VM, référence, acteur, note. Filtres : type, service, ID client, site (si vous avez des revendeurs), plage de dates et lien vers une VM. | Type | Description | |---|---| | `deposit` | Recharge depuis une passerelle | | `charge` | Montant prélevé pour un service (commande, renouvellement, consommation horaire...) | | `refund` | Argent reversé dans le portefeuille | | `adjust` | Crédit ou débit administrateur, ainsi que codes de rechargement (référence commençant par `vch:`) — la vue d'ensemble affiche les bons d'achat sur leur propre ligne | Chaque ligne possède une référence telle que `dep:stripe:` ; la même référence ne peut jamais être écrite deux fois, ce qui empêche un webhook répété de créditer deux fois. Utilisez **Customers › List › customer › Credit / debit** pour ajouter un ajustement manuel : un motif est obligatoire, un montant positif tente également de déverrouiller les VMs bloquées par manque de fonds, et l'action est confirmée en deux étapes. ![Onglet Transactions affichant les lignes du grand livre du portefeuille avec le type, le service, le montant et la référence](https://nexcmp.com/fr/docs/images/billing/invoices-and-ledger-01-ledger.webp) ### Factures {#invoices} Une facture est créée automatiquement lorsqu'un client achète ou renouvelle un service payé depuis le portefeuille, ou pour une recharge. Les numéros ressemblent à `-<000001>` (par exemple `NX202610-000042`) ; les sites revendeurs utilisent leur propre préfixe et séquence. Les numéros existants ne changent jamais lorsque vous modifiez le préfixe. | Champ | Valeurs | |---|---| | Type | Reçu, Renouvellement, Recharge, Manuel, Remboursement | | Statut | Impayée, Payée, En retard, Annulée, Remboursée | Actions sur une ligne : | Action | Effet | |---|---| | **View** / **Print** | Ouvre la facture ; le portail permet également de l'imprimer ou de l'enregistrer en PDF. | | **Mark paid** (impayée ou en retard uniquement) | Marque la facture comme payée **sans mouvement d'argent dans le portefeuille** — à utiliser lorsque le client vous a payé en dehors de NexCMP. Un motif est requis. Pour une facture de renouvellement, cela prolonge et déverrouille également la VM. | | **Cancel** (impayée ou en retard uniquement) | Annule la facture. Un motif est requis. | | **Resend** | Envoie à nouveau la facture par e-mail. | **Create manual invoice** (bouton en haut de l'onglet) : identifiant client, 1 à 50 lignes (description, quantité, prix unitaire), ID de VM facultatif, jours d'échéance facultatifs (0 à 365, par défaut 7), note facultative. Il est créé comme impayé ; le client le voit dans **Billing › Invoice History**. **réglées automatiquement depuis le portefeuille** dès qu'il y a de l'argent, de sorte que l'action du client se résume à recharger. ### Rechargements (paiements) {#top-ups-payments} Une ligne par tentative : heure, client, **passerelle et méthode**, type (rechargement ou rechargement automatique), statut (en attente, complété, échec, remboursé, contesté, annulé), montant payé par le client, frais, montant versé au portefeuille, référence de la passerelle et heure de fin. Les paiements Stripe et PayPal complétés disposent d'une action **Refund**. Utilisez les pages d'événements de passerelle pour voir les webhooks ([Payment channels](https://nexcmp.com/fr/docs/billing/payment-channels/)). ### Versements {#payouts} Trois sous-onglets : **Card refunds** (approuver ou rejeter les demandes de remboursement ; la demande est créée à partir d'un paiement complété), **Affiliate payouts** (retraits de commissions) et **Reseller withdrawals**. Chaque décision fait l'objet d'un audit. ### Rapports {#reports} **Revenue** (tendance sur 30 jours, mois par mois, meilleurs clients), **By service** et **By reseller**. ![Onglet Reports affichant les KPI de revenus et la tendance sur trente jours](https://nexcmp.com/fr/docs/images/billing/invoices-and-ledger-03-reports.webp) ## Ce que voit le client {#what-the-customer-sees} Dans **Billing**, le client dispose de **Balance**, **Deposit**, **Redeem code**, **Settings** (rechargement automatique) et d'un historique comprenant les onglets **Invoice History**, **Payment Order**, **Ledger** et **Orders** (chaque service dans une liste unique avec des filtres par service et par type). Chaque facture propose **View**, **Print** et **Save as PDF** ; les montants sont en USD, affichés éventuellement dans la devise d'affichage. ## Vérification {#verify} 1. Effectuez un petit rechargement en tant que client test. 2. **Transactions** affiche une ligne `deposit`, **Top-ups** indique le paiement comme *Completed* et les revenus de **Overview** augmentent. 3. Achetez un article : une ligne `charge` apparaît et **Invoices** affiche une facture de type *Receipt* ou *Renewal* comportant les coordonnées du vendeur que vous avez configurées. ## Limites et notes {#limits-notes} - **Ajout seul.** Impossible de modifier ou de supprimer une ligne de grand livre ; ajoutez un redressement avec un motif. - **Devise.** Les montants sont en USD ; la devise d'affichage est purement cosmétique (voir [Currency and exchange rates](https://nexcmp.com/fr/docs/catalog/currency-and-exchange-rates/)). - **Le remboursement sur carte** s'effectue en deux étapes (demande, puis validation sous Payouts) ; les transferts USDT et bancaires ne sont pas remboursés à la source. - **Tout est audité** sous System › Logs › Admin actions avec le motif saisi. - **Commandes vs factures.** L'utilisation horaire n'est pas facturée par heure ; la vue Orders la groupe par jour pour en conserver la visibilité. ## Dépannage {#troubleshooting} | Symptôme | Cause | Solution | |---|---|---| | Le solde du client semble incorrect | Un débit, un redressement ou un bon d'achat inattendu | Filtrez **Transactions** par l'identifiant client et consultez les références et notes. | | "La facture est déjà payée" (409) | Marquer comme payée une facture déjà réglée | Aucune action requise. | | Impossible d'annuler une facture | Seules les factures impayées ou en retard peuvent être annulées | Pour les factures payées, utilisez un remboursement ou un redressement. | | Coordonnées du vendeur manquantes sur les factures | Non renseigné | Renseignez **Seller details** dans System › Settings › General › Seller & invoicing. | | Carte de crédit/débit refusée | Le montant est nul ou supérieur à $100,000 | Utilisez un montant compris entre 1 cent et $100,000. | | Un paiement reste *Pending* longtemps | Webhook manquant | Consultez **Gateway events** et relancez. | --- # Promotions {#promotions} > **Où dans l'admin :** Finance › Billing › Vouchers (`/billing/vouchers`). **Où dans le portail :** Billing › Redeem code (également dans le panneau de dépôt). ## Description {#what-it-does} Un **code de recharge** (bon d'achat) est un secret à usage unique que vous donnez aux clients. Selon la manière dont vous le créez, il peut : | Type | Ce que reçoit le client | Où va la valeur | |---|---|---| | **Bonus credit** pour tous les services | Argent ajouté au portefeuille | Solde du portefeuille. Utilisable pour tout. | | **Bonus credit** pour les services choisis | Un crédit de service | Une poche séparée qui ne peut payer que ces services. | | **Discount %** | Un pourcentage de réduction sur la première commande des services choisis | Aucun crédit n'est accordé ; la remise est appliquée lors du paiement. | Utilisez-les pour des campagnes, des crédits de dédommagement, des offres partenaires ou une remise sur la première commande. ## Prérequis {#requirements} | Élément | Prérequis | |---|---| | Rôle | Un administrateur. | | Clients | Les clients utilisent les codes en étant connectés au portail (pas en tant qu'invité). Par défaut, le client doit avoir un e-mail vérifié. | | Codes en VND | Un code créé en VND est converti en USD lors de son utilisation au taux de change enregistré (voir [Currency and exchange rates](https://nexcmp.com/fr/docs/catalog/currency-and-exchange-rates/)). | ## Créer un lot {#create-a-batch} 1. Ouvrez **Finance › Billing › Vouchers** et cliquez sur **Create vouchers**. 2. Remplissez le formulaire. Des exemples de valeurs sont entre crochets. | Champ | Remarques | |---|---| | Nom du lot | 1 à 80 caractères (`Spring welcome`). | | Cible | **Clients du site principal**, **Clients d'un seul revendeur** (nécessite une liste de clients) ou **Portefeuille du revendeur**. | | Utilisateurs éligibles | **All in target audience** ou **Specified** — un e-mail ou identifiant client par ligne, jusqu'à 1,000. Pour les clients d'un revendeur, cela doit être *Specified*. | | 1 code par cible | Avec *Spécifiés*, crée un code par client listé. | | Type de code | **Bonus credit** ou **Discount %**. | | S'applique à | Choisissez un ou plusieurs services ; vide = **Tous les services**. | | Devise, Valeur nominale | USD à partir de $1.00, ou VND à partir de 10,000 par multiples de 1,000 (crédit bonus uniquement). | | Remise (%) | 1 à 100 (Remise % uniquement). | | Plafond de remise maximal (USD) | Requis pour la Remise %, à partir de $1.00. C'est également le montant maximal que vous pouvez perdre par utilisation. | | Commande minimum (USD) | `0` = aucun. La première commande doit atteindre au moins ce montant. | | Nombre de codes | 1 à 1,000 codes aléatoires. | | Utilisations par code | 1 à 100,000. `1` signifie une personne par code ; augmentez cette valeur pour un code partagé. | | Utilisations max. par compte | Au moins 1. Doit être `1` pour un pourcentage de remise. | | Heure de début (optionnel), Expiration | L'expiration doit être postérieure à la date d'aujourd'hui et au début, au plus 2 ans dans le futur. | | Préfixe du code (0 à 6 car.) | Lettres uniquement ; vide utilise le préfixe du site. | | Code personnalisé (uniquement si le nombre = 1) | 6 à 32 caractères de A à Z et de 0 à 9. Facile à partager mais facile à deviner : maintenez les utilisations au plus bas. | | Exiger un e-mail vérifié | Activé par défaut. | | Note interne, Motif | Le motif est obligatoire et est consigné dans le journal d'audit. | 3. Le formulaire affiche l'**exposition maximale** (valeur nominale x codes x utilisations) pour vous informer du pire scénario. Cliquez sur **Generate codes**. 4. **Copiez les codes maintenant.** Ils ne s'affichent qu'une seule fois : NexCMP ne stocke qu'un hachage et les 4 derniers caractères. Utilisez **Copy all** ou **Download CSV**, cochez la confirmation et fermez la fenêtre. ## Comportement de chaque type {#how-each-type-behaves} ### Bonus de portefeuille (aucun service sélectionné) {#wallet-bonus-no-service-selected} Le portefeuille est crédité d'une écriture d'**ajustement** (référence `vch:...`). Il n'est pas remboursable sur une carte, ne génère pas de commission d'affiliation, ne crée pas de facture et compte comme solde du portefeuille pour les quotas. Les codes en VND utilisent le taux de change au moment de l'utilisation. ### Crédit de service (services sélectionnés) {#service-credit-services-selected} - Le crédit réside dans une **poche séparée**, ne peut payer que les frais des services choisis (nouvelles commandes, renouvellements, frais horaires ou journaliers, mises à niveau) et est dépensé **avant** le portefeuille. - Il ne peut pas être retiré, transféré ou converti en argent, et il expire avec le code. - Le grand livre affiche la charge totale plus une ligne de crédit correspondante, de sorte que les revenus par service restent corrects tandis que le portefeuille ne diminue que du montant réellement payé par le client. - Il n'augmente **pas** un niveau de [quota](https://nexcmp.com/fr/docs/billing/quotas/) et est ignoré par le [rechargement automatique](https://nexcmp.com/fr/docs/billing/auto-top-up/). - Si une charge payée avec du crédit ou une remise est remboursée, la partie payée par le code est récupérée sur le remboursement du portefeuille et reversée dans la poche de crédit. ### Remise en % {#discount} 1. Le client saisit le code : il devient **activé**. Un code en pourcentage ne peut être utilisé qu'une seule fois par compte. 2. La **première charge** d'un service sélectionné qui n'est pas des frais horaires, et au moins égale à la **Commande minimum**, bénéficie du pourcentage de remise, jamais au-delà du **Plafond de remise maximal**. 3. La remise est recalculée par le serveur au moment de la facturation ; le montant affiché dans le navigateur est ignoré. La ligne d'utilisation est enregistrée lorsque le code est réellement utilisé, avec la remise réelle. 4. Les frais d'utilisation horaires n'utilisent jamais le code. ## Actions du client {#what-the-customer-does} 1. Ouvrez **Billing** dans le portail et cliquez sur **Redeem code**, ou utilisez **Have a top-up code?** dans le panneau de dépôt. 2. Saisissez le code (insensible à la casse, tirets facultatifs) et cliquez sur **Check**. Le portail indique ce qu'il offre, par exemple *Valid code: +$5.00*, *$5.00 credit for VPN* ou *20% off voucher for Virtual Machines (up to $5.00)*, ainsi que *Valid for orders from $10.00*. 3. Cliquez sur **Redeem** et confirmez. Chaque code peut être utilisé une seule fois par compte. Les codes sont liés au site : un code d'un site est « non valide » sur un autre, sans indice de son existence ailleurs. Les tentatives erronées sont limitées et, après plusieurs échecs, le compte est bloqué pendant quelques minutes (« N tentatives restantes avant un blocage temporaire »). ## Suivre et arrêter {#track-and-stop} - **Batches** liste chaque lot avec son statut (*active*, *disabled*, *expired*, *used up*), le nombre d'utilisations et l'exposition. Ouvrez un lot pour accéder aux onglets **Codes** (masqués) et **Redemptions**, ainsi qu'à **Export CSV**. - **Redemptions** liste toutes les utilisations de codes confondues ; **Reseller quotas** indique la part de la limite d'émission mensuelle utilisée par chaque revendeur ; **Settings** active ou désactive les codes revendeurs et définit la limite mensuelle par défaut. - **Disable batch** arrête tous les codes inutilisés ; les utilisations déjà effectuées sont conservées. Un code individuel peut également être désactivé. ## Vérification {#verify} 1. Créez un lot de 1 code : % de remise 20, plafond $5, commande minimum $10, service Virtual Machines. 2. Utilisez-le en tant que client test. Le portail indique qu'il est activé. 3. Commandez une VM coûtant au moins $10 (cycle mensuel) : la facture affiche la remise (au maximum $5). 4. Dans le lot, le code affiche 1 utilisation avec la remise réelle. ## Limites et notes {#limits-notes} - Les codes sont liés au **public** et au **site** lors de leur création ; ils ne peuvent pas être déplacés par la suite. - Les revendeurs peuvent émettre des codes pour leurs propres clients dans la limite de leur exposition mensuelle ; voir [Resellers](https://nexcmp.com/fr/docs/customers/resellers/). - Les diapositives promotionnelles de la barre latérale pour les clients (**Marketing › Promo slides**) constituent une fonctionnalité distincte et n'accordent aucune remise. - Le code en clair n'étant jamais stocké, un lot perdu ne peut pas être récupéré : désactivez-le et créez-en un nouveau. ## Dépannage {#troubleshooting} | Symptôme | Cause | Solution | |---|---|---| | « Codes en pourcentage : une utilisation par compte » (`percent_one_per_account`) | Max d'utilisations par compte supérieur à 1 pour % de remise | Définissez-le sur `1`. | | Le formulaire indique que le plafond est obligatoire | % de remise sans plafond de remise maximum | Entrez au moins $1.00. | | Clients introuvables | Un e-mail ou un ID de la liste n'existe pas | Corrigez la liste (l'erreur indique les entrées inconnues). | | Le client indique « code invalide » | Mauvais site, expiré, désactivé, épuisé, client non ciblé ou e-mail non vérifié | Vérifiez le lot et le client. | | Le crédit n'a pas été utilisé | Le débit appartient à un autre service | Le crédit ne règle que les services sélectionnés sur le lot. | | Remise non appliquée | Commande inférieure au minimum, facturation horaire ou code activé pour un autre service | Passez une première commande éligible. | | Client bloqué lors de l'utilisation d'un code | Trop de tentatives erronées | Attendez l'expiration du blocage. | --- # Quotas {#quotas} > **Dans l'admin:** Services › Virtual Machines › Policy › Quota tab (`/vm/policy?tab=quota`). Par client: Customers › List › a customer › Overview (`/customers/`), carte **Quota**. **Dans le portail:** Client › Quotas (`/client/quotas`). ## Description {#what-it-does} Les quotas vous protèrent contre les abus des nouveaux comptes : plus un client a versé d'argent réel dans son portefeuille, plus il peut créer de ressources. Il existe deux niveaux : - **Ressources de VM et Kubernetes** : vCPU, RAM et disque totaux, ainsi que le nombre de VM. Les paliers correspondent à vos forfaits fixes. - **Quotas de service** : nombre d'IP, clusters, VPC, Go de stockage, etc., répartis en cinq niveaux (L0 à L4) déterminés par les fonds déposés. Les quotas sont vérifiés **avant** qu'aucun débit ne soit effectué. Toute requête dépassant la limite est refusée avec le code HTTP 403 `quota_exceeded` et un message indiquant au client le montant à recharger. ## Prérequis {#requirements} | Élément | Prérequis | |---|---| | Rôle | Un administrateur. | | Bouton | **Enable quota** (`quota_enabled`) est désactivé (**off**) par défaut. Aucune règle ci-dessous ne s'applique tant que vous ne l'activez pas. | | Forfaits fixes | Au moins un forfait non personnalisé (voir [Plans](https://nexcmp.com/fr/docs/catalog/plans/)) — les niveaux de ressources correspondent à vos forfaits fixes. En l'absence de forfait, seule la règle du nombre de VM s'applique. | | Dépendances | Les lignes de quotas de service n'existent que pour les produits activés dans votre installation (VPN, proxy IPv6, Kubernetes, Private Cloud, Images, Object Storage, Dedicated). | ## Calcul de la base {#how-the-basis-is-calculated} NexCMP ne se base pas uniquement sur les paiements par carte. La **base** correspond au **solde comptabilisé du portefeuille** du client : les recharges par passerelle, les crédits administrateur (**Credit / debit**) et les bons de portefeuille échangés sont tous comptabilisés une seule fois via le grand livre du portefeuille. Les remises sur commande et les crédits de service issus de codes promotionnels ne constituent pas de l'argent de portefeuille et ne sont pas pris en compte. La base la plus élevée jamais atteinte par un client est **conservée** (par site) : les dépenses ou les remboursements ne rabaissent jamais un niveau déjà débloqué. ### Ressources de VM et Kubernetes {#vm-and-kubernetes-resources} 1. Les paliers sont les forfaits fixes du site, triés par coût d'exécution sur 24 heures. 2. Un client se trouve sur le palier le plus élevé dont le coût sur 24 heures ne dépasse pas sa base. La limite correspond aux vCPU, à la RAM et au disque de ce forfait. Un client qui ne peut pas s'offrir le forfait le moins cher obtient tout de même les ressources de ce dernier. 3. L'utilisation décomptée de la limite inclut chaque VM active (y compris celles verrouillées), les volumes de données achetés (même détachés) ainsi que les workers et plans de contrôle Kubernetes (les workers comptent également comme des VM). 4. **Nombre de VM :** jusqu'au **Max VMs at 24h tier** (par défaut 2). À partir de la VM suivante, le solde *actuel* du portefeuille du client doit couvrir **30 jours (720 heures)** de toutes ses VM existantes plus la nouvelle, jusqu'à **Max VMs when meeting 30-day threshold** (par défaut 10). 5. **La création d'une VM** nécessite également un solde d'au moins **N heures** de cette VM (**Create VM: balance ≥ N hours**, par défaut 2) et le solde minimum de la plateforme. 6. La réduction d'une VM n'est jamais bloquée. Seule la dimension en augmentation est vérifiée ; un client qui dépasse la limite de disque peut donc toujours ajouter des vCPU si la limite de vCPU le permet. ## Configuration {#configure} 1. Ouvrez **Services › Virtual Machines › Policy** et sélectionnez l'onglet **Quota**. 2. Activez **Enable quota**. 3. Examinez les trois chiffres (tous modifiables) : | Champ | Valeur par défaut | Plage | |---|---|---| | Créer une VM : solde ≥ N heures | 2 | 1 à 720 | | Max VMs at 24h tier | 2 | 1 à 100 | | Nombre max de VM lors de l'atteinte du seuil de 30 jours | 10 | 1 à 1000 (pas en dessous du champ précédent) | 4. Dans **Tier-based service quotas**, modifiez le tableau (ci-dessous). 5. Cliquez sur **Save**. NexCMP demande un **motif**, qui est consigné dans le journal d'audit avec l'ancienne et la nouvelle valeur. La modification s'applique à tous les clients. ![Onglet Quota avec le commutateur d'activation, les limites de VM et le tableau des quotas de service par palier](https://nexcmp.com/fr/docs/images/billing/quotas-01-policy.webp) ### Tableau des quotas de service {#service-quota-table} Le tableau comporte cinq niveaux. Les cellules d'en-tête **L0** à **L4** contiennent le **seuil de dépôt en centimes** : les valeurs par défaut `0, 1000, 5000, 20000, 100000` désignent L0 pour un nouveau compte, L1 à partir de $10, L2 de $50, L3 de $200 et L4 de $1,000. Le premier seuil doit rester `0`. Chaque ligne définit le quota d'une clé par niveau ; **-1 signifie illimité**. | Clé | Description | L0 | L1 | L2 | L3 | L4 | |---|---|---|---|---|---|---| | `vpn.ips` | IP VPN | 2 | 10 | 30 | 100 | 500 | | `proxy6.ips` | IP proxy IPv6 | 500 | 2000 | 10000 | 50000 | -1 | | `dedicated.servers` | Serveurs dédiés (bare-metal) | 1 | 2 | 5 | 20 | 50 | | `s3.storage_gb` | GB de stockage Object Storage alloués | 2048 | 4096 | 10240 | 51200 | -1 | | `k8s.clusters` | Clusters Kubernetes | 1 | 2 | 5 | 10 | 30 | | `k8s.workers` | Nœuds de travail Kubernetes | 3 | 9 | 18 | 50 | 200 | | `vpc.count` | Réseaux Private Cloud | 1 | 2 | 5 | 10 | 30 | | `images.gb` | GB de stockage d'images personnalisées | 50 | 100 | 200 | 500 | 2000 | Le tableau répertorie également quelques lignes pour des produits qui ne font pas partie de cette version ; laissez-les telles quelles. Une clé dont le produit est désactivé est masquée et jamais appliquée. Une valeur doit être `-1` ou comprise entre `0` et `10,000,000`. Les quotas de service suivent la **base des fonds**, comme les paliers de VM : le solde de portefeuille le plus élevé atteint, et non le total des paiements par carte. Les clients revendeurs utilisent les mêmes valeurs par défaut et le revendeur peut uniquement les consulter. ## Remplacements par client {#per-customer-overrides} 1. Ouvrez **Customers › List**, puis le client. Dans **Overview**, trouvez la carte **Quota**. 2. **Ressources de VM :** cliquez sur **Quota override** et choisissez l'une des options - **Par solde de recharge (supprimer le remplacement)** — comportement par défaut ; - **Illimité (y compris le nombre de VM)** — supprime toute limite pour ce client ; - un **palier de plan** — fixe le plafond des ressources à ce plan ; la règle du nombre de VM s'applique toujours. Saisissez un motif. Les administrateurs de la plateforme peuvent définir n'importe quel palier ; un remplacement défini par un revendeur ne peut pas dépasser la base conservée du client. 3. **Services :** le tableau sous *Service quotas* affiche chaque clé avec *In use*, la limite effective et son *Source* (palier ou remplacement). Cliquez sur **Edit** sur une ligne, saisissez le **New quota** (`-1` = illimité, vide = retour au palier par défaut) et un motif. ![Carte des quotas client avec le palier, l'utilisation des ressources et le tableau des quotas de service avec un remplacement](https://nexcmp.com/fr/docs/images/billing/quotas-02-customer.webp) Chaque remplacement est enregistré dans le journal d'audit avec l'administrateur, le motif et les valeurs avant/après. ## Ce que voit le client {#what-the-customer-sees} **Client › Quotas** (`/client/quotas`) affiche le **palier actuel** du client, les vCPU, la RAM, le disque et le nombre de VM utilisés et totaux (répartis entre les VM et Kubernetes), le **solde de portefeuille éligible**, la **base de ressources acquise** (elle ne diminue pas lors des dépenses) et le montant à recharger pour atteindre le palier suivant. Un curseur lui permet de choisir un palier cible et d'accéder directement à l'écran de dépôt. La carte **Service Quotas** liste chaque service avec son quota, le montant utilisé, son palier (de L0 à L4), le montant supplémentaire à déposer pour le palier suivant, ainsi qu'un bouton **Request increase** qui ouvre un brouillon de ticket de support. Un bouton **Quota policy** explique les règles. ![Page des quotas du portail avec le palier actuel, l'utilisation des ressources et les quotas de service](https://nexcmp.com/fr/docs/images/billing/quotas-03-portal.webp) ## Vérification {#verify} 1. Activez **Enable quota** et utilisez un nouveau client test disposant d'un solde de $0. 2. Essayez de créer une VM plus grande que votre plan le moins cher. La requête est refusée avec `quota_exceeded` et le message "Exceeds the resources of tier ... Top up $X more to unlock tier ...". 3. Rechargez le montant indiqué. Le palier change immédiatement et la même requête aboutit. 4. Achetez des IP VPN au-delà de la limite L0 : HTTP 403 `quota_exceeded` avec `"scope":"service"` et un lien vers `/client/quotas`. 5. Dans la carte des quotas du client, **Source** affiche *tier* ; définissez un remplacement et observez le passage à *override*. ## Limites et notes {#limits-notes} - **Désactivé signifie désactivé.** Lorsque `quota_enabled` est désactivé, l'ancienne règle `new_account_max_vms` (**Services › Virtual Machines › Policy › Sales**) limite les nouveaux comptes à 2 VM jusqu'à ce que leurs dépôts atteignent $10. Lorsque le quota est activé, cette règle ne s'applique plus. - **Les machines virtuelles créées par l'administrateur ne sont pas bloquées.** - **Les erreurs échouent par défaut.** Si l'état du quota ne peut pas être lu, la requête est refusée avec `quota_unavailable` plutôt que d'être autorisée. - **Les requêtes API, CLI et MCP** utilisent les mêmes gestionnaires, les mêmes limites s'appliquent donc. - **Le crédit promotionnel** ne fait pas passer au niveau supérieur (voir [Promotions](https://nexcmp.com/fr/docs/billing/promotions/)). - **Les seuils de niveau sont en centimes**, et non en dollars. ## Dépannage {#troubleshooting} | Symptôme | Cause | Solution | |---|---|---| | `quota_exceeded`, raison `resources` | Le nouveau total de vCPU/RAM/disque dépasse le niveau | Approvisionnez le montant indiqué dans le message ou définissez une dérogation. | | `quota_exceeded`, raison `vm_30d` | Nombre de VM supérieur au niveau sur 24h et le solde ne couvre pas encore 30 jours du parc | Approvisionnez le montant affiché. | | `quota_exceeded`, raison `vm_max` | La limite absolue de VM est atteinte | Augmentez **Max VMs when meeting 30-day threshold** ou utilisez une dérogation. | | `quota_exceeded`, `scope: service` | Une limite par service est atteinte | Augmentez la valeur du tableau ou surchargez cette clé pour le client. | | `quota_unavailable` | L'état du quota n'a pas pu être vérifié | Réessayez ; consultez le journal du serveur si le problème persiste. | | "quota_max_vms_30d must be >= quota_max_vms_24h" à l'enregistrement | Valeurs inversées | Définissez une valeur à 30 jours au moins égale à celle sur 24 heures. | | Le client indique que le niveau a baissé | Il ne baisse pas ; comparez la **Held resource basis** avec le coût du plan | Vérifiez la liste des prix des plans : une augmentation du prix d'un plan peut déplacer les seuils. | --- # Gestion des clients {#managing-customers} > **Où se trouve l'administration :** Customers › Customers › List (`/customers`), Deletion requests (`/customers/requests`), Service transfers (`/customers/transfers`) et API keys (`/customers/apikeys`). ## Description {#what-it-does} La section Clients permet au personnel de support de consulter un compte, de voir son solde, ses services, ses tickets et son historique de connexion, et d'agir en conséquence : verrouiller, déverrouiller, vérifier l'e-mail, réinitialiser le mot de passe, ajouter ou retirer du crédit, usurper l'identité, créer une machine virtuelle ou fermer le compte. ## Prérequis {#requirements} | Élément | Prérequis | |---|---| | Rôle | Un administrateur. Chaque action d'écriture demande un motif et est consignée dans le journal d'audit (System › Logs › Admin actions). | | E-mail | Les e-mails de réinitialisation de mot de passe et d'invitation nécessitent une [SMTP configuration](https://nexcmp.com/fr/docs/administration/smtp-and-emails/) opérationnelle. | ## La liste des clients {#the-customer-list} Ouvrez **Customers › List**. Les clients sont les comptes de votre site principal ; les comptes des revendeurs apparaissent également et peuvent être filtrés par site. ![Liste des clients avec les filtres et les colonnes pays, source de parrainage, solde et nombre de VM](https://nexcmp.com/fr/docs/images/customers/managing-customers-01-list.webp) | Colonne | Description | |---|---| | **Email** (et nom) | Cliquez pour ouvrir le client. | | **State** | *Active*, *Locked* ou *Deleted*, ainsi que l'e-mail *verified* ou *unverified*. Survolez une icône de verrou pour lire la raison. | | **Login** | Méthodes de connexion du client : mot de passe, Google, GitHub, passkey. | | **Country** | Drapeau et nom dérivés de l'**adresse IP** : le pays de l'IP d'inscription ou, si elle est inconnue, de la dernière IP de connexion. L'infobulle indique laquelle a été utilisée. | | **Referral source** | *Referral* avec un lien vers le parrain et le code de parrainage lorsque le client s'est inscrit via un lien d'affiliation ; sinon « Not recorded ». | | **Balance**, **VMs** | Solde du compte (valeurs négatives en rouge) et nombre de VM actives. | | **IP enregistré / dernier** | L'IP utilisée lors de l'inscription et de la dernière connexion, avec le code pays à deux lettres. Permet d'identifier plusieurs comptes provenant d'une même adresse. | | **Tenant** | L'identifiant de tenant interne du client. | | **Created**, **Last login** | Temps relatifs. | | **Site** | Affiché lorsque vous avez des revendeurs. | **Search** accepte l'adresse e-mail, le nom ou l'IP. **Filters:** état (all, active, locked, deleted), méthode de connexion (any, Google, GitHub, passkey, no password yet) et site. Les filtres sont conservés dans l'URL, ce qui permet de mettre une liste filtrée dans les favoris ou de la partager avec un collègue. **Le tri est global.** Cliquer sur l'en-tête de *Email*, *State*, *Balance*, *VMs*, *Created* ou *Last login* trie l'**ensemble** de la base clients sur le serveur, et pas seulement la page affichée, et le numéro de page revient à 1. **La liste se met à jour automatiquement.** Elle s'actualise toutes les quelques secondes pendant que vous la consultez (elle se met en pause lorsqu'une boîte de dialogue est ouverte ou pendant que vous écrivez), ainsi les nouvelles inscriptions et les modifications de solde apparaissent sans rechargement. La page du client s'actualise environ toutes les 30 secondes tant qu'elle est visible; chaque onglet charge ses propres données lors de sa première ouverture. ### Créer un client {#create-a-customer} 1. Cliquez sur **Create customer**. 2. Saisissez l'**e-mail**, un **display name** optionnel, un **password** optionnel (vide = le client le définit via le lien d'invitation) et choisissez s'il faut **send the invitation e-mail**. 3. Confirmez. Un compte créé manuellement est considéré comme vérifié lorsque vous envoyez l'invitation. ## La page d'un client {#a-customer-s-page} Cliquez sur une ligne. La page comporte huit onglets; l'onglet sélectionné est conservé dans l'URL afin que vous puissiez l'ajouter à vos favoris. Les onglets se chargent lors de leur première ouverture et conservent leur état lorsque vous changez d'onglet. | Onglet | Contenu | |---|---| | **Overview** | Identité, informations d'inscription et de dernière connexion, synthèse du portefeuille et des services | | **Services** | Un tableau pour les services du client, avec filtres par type et état, recherche, tri côté serveur et pagination | | **Billing** | Portefeuille et crédits, grand livre, factures, paiements, remboursements, moyen de paiement enregistré et rechargement automatique | | **Quota** | Limites de ressources et dérogations; consultez [Quotas](https://nexcmp.com/fr/docs/billing/quotas/) | | **Security** | Sessions, authentification, méthodes de connexion, historique de connexion et clés API; consultez [Clés API](https://nexcmp.com/fr/docs/developers/api-keys/) | | **Support** | Tickets récents | | **Affiliate** | Statut du programme de parrainage | | **Log** | Historique d'audit et d'activité | Boutons d'action dans l'en-tête (masqués pour les comptes supprimés) : | Bouton | Description | |---|---| | **Lock account** / **Unlock** | Bloque la connexion et l'accès à l'API. Arrête également de manière facultative toutes les VM (sans les supprimer). Les services prépayés qui ne sont pas des VM (Kubernetes, Private Cloud, VPN, etc.) sont également arrêtés. Les VM verrouillées par un administrateur doivent être déverrouillées séparément sur la page de la VM. | | **Verify email** | Marque l'e-mail comme vérifié sans que le client n'ait à cliquer sur un lien. | | **Send reset link** | Envoie par e-mail un lien de réinitialisation du mot de passe (valide 1 heure, usage unique). Si le SMTP n'est pas configuré, le lien s'affiche une seule fois pour que vous puissiez l'envoyer vous-même. Un administrateur ne voit jamais le mot de passe. | | **Impersonate** | Se connecte en tant que client pendant une heure. Voir [Log in as a customer](https://nexcmp.com/fr/docs/customers/login-as/). | | **Credit / debit** | Ajoute ou déduit de l'argent du portefeuille via un ajustement comptable. Voir [Invoices and ledger](https://nexcmp.com/fr/docs/billing/invoices-and-ledger/). | | **Revoke sessions** | Déconnecte le client partout ; les jetons d'application cessent de fonctionner. | | **Create VM** | Crée une VM pour le client. | | **Soft delete** | Ferme le compte. Vous devez saisir l'e-mail pour confirmer. | ### Gérer un service individuel {#manage-an-individual-service} Ouvrez l'onglet **Services** du client, recherchez un service par son nom, son identifiant, son adresse IP ou sa configuration, et utilisez les actions de sa ligne. Les mêmes actions sont disponibles dans la liste d'administration propre au service. La boîte de dialogue ne propose que les actions prises en charge par ce service et son état actuel. | Action | Effet | |---|---| | **Lock** | Arrête le service tout en conservant ses données. Le client le voit comme verrouillé et ne peut pas l'utiliser. Le rechargement du solde ne lève pas le verrouillage appliqué par un administrateur; le renouvellement automatique est bloqué tant que le service est verrouillé. | | **Unlock** | Lève le verrouillage de l'administrateur. Cela ne supprime pas un verrouillage distinct pour abus ou autre protection. | | **Résilier sans remboursement** | Résilie le service sans écriture comptable de remboursement. La confirmation avertit que la résiliation est irréversible. | | **Résilier et rembourser** | Affiche les paiements initiaux, leur répartition portefeuille/crédit, les remboursements précédents et le montant maximal remboursable. Vérifiez le montant avant de confirmer. | Saisissez un motif pour chaque action. Ce motif est destiné aux administrateurs ; le client reçoit un événement de service ou une notification neutre. Les fonds remboursés sur le wallet y retournent, et les attributions de crédit ou promotionnelles retournent sur le crédit. Cette action ne renvoie pas d'argent via Stripe, virement bancaire ou PayPal. Pour plusieurs services du même type, sélectionnez jusqu'à 50 lignes et choisissez une action groupée. Le résultat indique le succès ou l'échec pour chaque ligne. Les remboursements groupés utilisent le montant suggéré de chaque service ; les services dont le remboursement suggéré est de zéro sont ignorés en mode remboursement et nécessitent un examen individuel ou une résiliation sans remboursement. DDoS Shield, les disques et les backups sont des lignes en lecture seule ici. Les options de bande passante suivent leur service parent. L'accès à AI Models peut être verrouillé, mais il ne comporte aucun abonnement à résilier. Pour verrouiller un serveur Bare Metal loué, intervenez sur son abonnement plutôt que sur sa commande. ### Fermeture d'un compte (suppression logique) {#closing-an-account-soft-delete} Le compte est défini comme *supprimé*, bloqué, ses sessions sont révoquées et ses commissions de parrainage non encore payées sont annulées. Les factures et le grand livre sont conservés à des fins comptables. L'action est refusée tant que le client possède **le moindre service actif** (VM, Kubernetes, Private Cloud, Dedicated, VPN, proxy IPv6), un compte S3 ou une utilisation S3 non réglée. Supprimez-les d'abord. ## Demandes de suppression {#deletion-requests} Un client peut demander la suppression depuis la page de son compte. Les demandes apparaissent sous **Customers › Deletion requests** (filtre par défaut : en attente) avec le client, le motif, le nombre de VM actives, le solde et l'heure de la demande. - **Approve deletion** n'est possible que lorsque le client n'a aucune VM active. Saisissez l'e-mail pour confirmer. Le compte est supprimé de manière logique ; **le solde restant du portefeuille n'est pas remboursé automatiquement** — créez d'abord un remboursement si vous le devez. - **Reject** nécessite un motif. ## Transferts de services {#service-transfers} **Customers › Service transfers** liste les demandes de transfert d'une **VM ou d'un abonnement VPN** d'un compte à un autre **sur le même site**. - L'écran est en lecture et création uniquement : vous pouvez créer une demande au nom d'un client ou en annuler une. Il n'y a délibérément **aucun** bouton pour l'approuver pour le propriétaire ou le destinataire. - Déroulement : le propriétaire confirme via un lien e-mail à usage unique (valide 30 minutes, avec TOTP si activé), puis le destinataire se connecte et accepte (le destinataire reprend les obligations de paiement). Une demande non acceptée dans les 7 jours expire. - Règles : le service doit être actif, sans facture impayée ni tâche en cours ; le destinataire doit être un client actif avec un e-mail vérifié sur le même site. Le transfert d'une VM supprime la clé SSH et désactive le renouvellement automatique ; le transfert d'un VPN modifie les mots de passe de connexion. - Les factures déjà émises restent rattachées au propriétaire précédent ; le nouveau propriétaire peut consulter l'historique de facturation du service en masquant les données du propriétaire précédent. - Les clients peuvent créer leurs propres demandes sous **Transfers** dans le portail (5 demandes par heure et 3 ouvertes à la fois). ## Vérification {#verify} 1. Créez un client avec un e-mail d'invitation. Le nouveau compte apparaît en haut de la liste en quelques secondes. 2. Trier par **Balance** : l'ordre s'applique à tous les clients. 3. Verrouiller le client : l'étiquette d'état passe à *Locked* et le client ne peut plus se connecter. Déverrouillez-le. ## Limites et notes {#limits-notes} - La colonne du pays est une indication basée sur l'IP, non une preuve de résidence. Les adresses privées ou inconnues ne donnent aucun pays. - Le verrouillage d'un compte ne rembourse rien et ne supprime pas les VM, sauf si vous choisissez également de les arrêter. - Le déverrouillage du compte ne déverrouille pas les VM qu'un administrateur a verrouillées ; rouvrez-les séparément sur la page de la VM. ## Dépannage {#troubleshooting} | Symptôme | Cause | Solution | |---|---|---| | "Le client a encore des services actifs ... arrêter/supprimer d'abord" | Le client possède des services ou un compte S3 | Supprimez-les, puis effectuez une suppression logique. | | L'approbation de suppression indique "N VMs alive" | Même raison | Supprimez d'abord les VM. | | Lien de réinitialisation affiché au lieu de "e-mail queued" | SMTP non configuré | Configurez l'e-mail ou envoyez le lien vous-même. | | Impossible de supprimer une méthode de connexion (`last_login_method`) | C'est le seul moyen pour le client de se connecter | Ajoutez d'abord une autre méthode. | | Le verrouillage n'arrête pas les services prépayés | Des erreurs d'arrêt ont été signalées | Lisez le message après le verrouillage ; le système réessaie d'arrêter automatiquement. | | Impossible de créer un transfert | Facture impayée, tâche en cours, destinataire sur un autre site ou non vérifié | Corrigez la condition et réessayez. | --- # Se connecter en tant que client {#log-in-as-a-customer} > **Emplacement dans l'admin :** Customers › Customers › List › a customer › header button **Impersonate** (`/customers/`). ## Description {#what-it-does} **Impersonate** (login-as) permet à un administrateur du support de voir le portail exactement comme un client le voit, afin de reproduire un problème ou d'aider pour une commande. La session dure une heure et est clairement séparée d'une session normale : tout ce qui pourrait donner un accès durable au compte est bloqué, et chaque utilisation est enregistrée dans le journal d'audit. ## Prérequis {#requirements} | Élément | Prérequis | |---|---| | Rôle | Un administrateur connecté à la console d'administration. | | Client | Le compte doit être **actif**. Un compte verrouillé ou supprimé répond "account is not active" (HTTP 409). | | Raison | Une raison est obligatoire ; elle est inscrite dans le journal d'audit. | | Navigateur | Autorisez les pop-ups pour l'adresse d'administration : le portail s'ouvre dans une nouvelle fenêtre. | ## Étapes {#steps} 1. Ouvrez **Customers › List** et cliquez sur le client. 2. Cliquez sur **Impersonate**. Une boîte de dialogue explique que le site du client s'ouvre en tant que client pour une durée d'une heure et que chaque action est auditée. 3. Saisissez la **raison** (par exemple "Ticket 1234 — cannot create VM") et cliquez sur **Open app**. 4. Une nouvelle fenêtre s'ouvre sur le site du client et affiche le tableau de bord avec `?impersonated=1`. Si le navigateur a bloqué la fenêtre, autorisez les pop-ups et cliquez à nouveau. ![Boîte de dialogue d'usurpation d'identité avec le champ de raison renseigné](https://nexcmp.com/fr/docs/images/customers/login-as-01-dialog.webp) Pour le client d'un revendeur, la fenêtre s'ouvre sur le **propre domaine du revendeur**, car le lien ne fonctionne que sur le site du client. ## Comment ça fonctionne {#how-it-works} 1. L'action de l'administration crée un **jeton à usage unique** valide pendant une heure et écrit `customer.login_as` (administrateur, IP, raison, site) dans le journal d'audit. 2. La nouvelle fenêtre s'ouvre `https:///v1/portal/impersonate/`. Une première requête affiche seulement une petite page et **ne consomme pas** le jeton (pour que le préchargement du navigateur ne l'épuise pas) ; la page confirme ensuite avec une requête POST. 3. La requête POST consomme le jeton. Une seconde utilisation, ou une utilisation après une heure, répond "The impersonation link has expired or was already used". 4. NexCMP crée une session client qui dure **une heure** (une session normale dure 30 jours), enregistre une entrée de connexion avec la méthode `impersonate` et consigne `customer.login_as.used`. 5. Le jeton ne fonctionne que sur le propre site du client ; sur un autre hôte, il renvoie 404. ## Ce qui est bloqué lors d'une session usurpée {#what-is-blocked-in-an-impersonated-session} Tout ce qui donne un accès au-delà de l'heure ou modifie la sécurité du client renvoie le code HTTP 403 `impersonate_forbidden` : | Bloqué | Raison | |---|---| | Modification du mot de passe, TOTP, association/dissociation de Google/GitHub, modification des passkeys | Identifiants propres du client | | Suppression du compte | Irréversible | | Création ou modification de **API keys** | Accès à long terme | | Approbation d'une connexion CLI, bureau ou MCP (liaison d'appareil) | Accès à long terme | | Création d'accès Kubernetes, de clés S3, de clés SSH, de mots de passe root, de liens de partage de console, d'identifiants VPN ou proxy | Secrets persistant après la session | | Utilisation de codes de recharge | Campagnes financières | | Retrait ou modification du versement de commissions d'affiliation | Sortie d'argent du système | | Modification des clés AI, des budgets ou des e-mails d'alerte | Configuration du client | Tout le reste fonctionne : vous pouvez consulter les pages, créer ou gérer des machines virtuelles, passer des commandes, etc. Les actions s'exécutent avec l'identité du client et dépensent son argent ; les entrées d'audit ci-dessus indiquent qu'un administrateur était à l'origine de la session. ## Vérification {#verify} 1. Usurpez l'identité d'un client de test. Le portail s'ouvre et affiche les données de ce client. 2. Essayez de modifier le mot de passe : vous obtenez "interdit" (usurpation d'identité). 3. Dans **System › Logs › Admin actions**, recherchez `customer.login_as` avec votre nom, le motif et le site, suivi de `customer.login_as.used`. 4. Fermez la fenêtre et rouvrez le même lien : "lien expiré ou déjà utilisé". ## Limites et notes {#limits-notes} - La limite d'une heure est fixe (3600 secondes). Pour continuer, réempruntez l'identité. - Privilégiez la lecture et la reproduction ; évitez les actions qui dépensent de l'argent, sauf demande explicite du client. - Révoquez la session de manière anticipée via **Revoke sessions** sur la page du client (cela déconnecte également ce dernier). - Les revendeurs disposent de leur propre option d'usurpation **Sign in to partner console** (60 minutes) depuis Resellers ; voir [Resellers](https://nexcmp.com/fr/docs/customers/resellers/). ## Dépannage {#troubleshooting} | Symptôme | Cause | Solution | |---|---|---| | "Le compte n'est pas actif" | Compte verrouillé ou supprimé | Déverrouillez-le d'abord ou consultez plutôt la page du client. | | Le navigateur bloque la fenêtre | Bloqueur de pop-ups | Autorisez les pop-ups pour l'adresse d'administration et réessayez. | | "Lien expiré ou déjà utilisé" | Limite d'une heure ou réutilisation | Recommencez l'usurpation d'identité. | | Ouvre "Non trouvé" | Le lien a été utilisé sur le mauvais hôte | Utilisez la fenêtre ouverte par la boîte de dialogue ; ne collez pas le lien ailleurs. | | Une action renvoie "interdit" | Bloqué lors des sessions usurpées | Demandez au client de le faire ou utilisez les écrans d'administration. | --- # Revendeurs (marque blanche) {#resellers-white-label} > **Où trouver dans l'admin :** Customers › Resellers › List (`/resellers`), Domains & SSL (`/resellers/domains`), Permissions & wholesale (`/resellers/entitlements`), Defaults (`/resellers/settings`). Emplacements de revendeur : System › Admin › License & updates (`/license`). ## Description {#what-it-does} Un **revendeur** dispose d'une copie personnalisée du portail client sur **son propre domaine**, avec ses propres clients, son propre portefeuille, ses prix et (en option) ses propres canaux de paiement. Il achète chez vous au tarif de gros et vend à ses propres prix. Ses clients ne voient jamais votre marque, et le domaine du revendeur ne peut en aucun cas ouvrir votre console d'administration. Le revendeur gère son activité depuis la **console partenaire** à l'adresse `https://partner.`. ## Prérequis {#requirements} | Élément | Prérequis | |---|---| | Licence | Un **emplacement de domaine revendeur** sur votre licence pour chaque domaine de revendeur personnalisé. La page de licence indique `used/max` emplacements et propose un lien pour en acheter d'autres. Sans emplacement disponible, l'ajout d'un domaine échoue avec l'erreur "Out of license reseller domain slots". | | DNS | Chaque domaine de revendeur doit pointer vers votre serveur (voir ci-dessous). | | Serveur Web et TLS | Le nom d'hôte doit atteindre le panneau NexCMP via votre proxy inverse avec un certificat valide pour ce nom. | | E-mail | SMTP configuré pour les e-mails d'invitation et de notification. | | Interrupteur principal | **Reseller settings › General › `rs_enabled`** est activé par défaut. | ## Préparer l'infrastructure {#prepare-the-infrastructure} 1. Définissez l'adresse publique du serveur : son adresse IPv4 et, si vous préférez des CNAME, un nom d'hôte qui y pointe (par exemple `sites.cloud.example.com`). 2. Ouvrez **Customers › Resellers › Defaults** (`/resellers/settings`), groupe **Domains & SSL**, et configurez : | Clé | Description | |---|---| | `rs_server_ipv4` | L'IPv4 publique vers laquelle les enregistrements A des revendeurs doivent pointer. | | `rs_cname_target` | Le nom d'hôte vers lequel les enregistrements CNAME des revendeurs doivent pointer. | | `rs_master_hosts` | Noms d'hôte appartenant à votre propre site principal (ils ne peuvent pas être attribués à des revendeurs). | | `rs_platform_domain` | Domaine parent optionnel pour les **sous-domaines de plateforme** (par exemple `partners.cloud.example.com` pour donner aux revendeurs `acme.partners.cloud.example.com`). Laisser vide désactive l'option. | | `rs_sites_stale_minutes` | Minutes avant qu'un service de certificats ne soit considéré comme obsolète (par défaut 15). | | `rs_ssl_fail_hours` | Heures de tentatives infructueuses avant qu'une erreur ne soit levée (par défaut 48). | ::: warning Vérifiez ces valeurs avant d'envoyer les instructions `rs_server_ipv4`, `rs_cname_target` et `rs_master_hosts` contiennent des valeurs d'exemple. Remplacez-les par votre propre serveur et domaine **avant** de transmettre les instructions DNS à un revendeur, sous peine de pointer vers un mauvais emplacement à l'écran. ::: 3. Cliquez sur **Save** (un motif est requis). 4. Assurez-vous que votre proxy inverse transfère les noms d'hôte des revendeurs vers le panneau NexCMP et sert un certificat pour chacun d'eux. L'installateur configure nginx et Let's Encrypt uniquement pour le domaine principal (ainsi que les noms `admin.` et `partner.` qui se résolvent). Si vous utilisez Cloudflare, activez le mode proxy sur le nom d'hôte et utilisez le mode Full SSL. ## Connecter dans NexCMP {#connect-in-nexcmp} ### Créer le revendeur {#create-the-reseller} 1. Ouvrez **Customers › Resellers › List** et cliquez sur **New reseller**. L'assistant comporte 8 étapes et effectue le provisionnement complet à la fin ; chaque étape peut être relancée en toute sécurité. | Étape | Renseigner | |---|---| | **Revendeur** | Nom légal ou commercial, **slug** (4 à 31 caractères a–z, 0–9 ou `-`, commençant par une lettre ; il sert également de préfixe de facture), nom du contact, e-mail et téléphone, langue par défaut, coordonnées de facturation du revendeur (en tant qu'acheteur de recharges de portefeuille). | | **Compte de console** | Nom d'utilisateur, e-mail du compte, nom complet ; **Send a one-time invite link by e-mail** (valable 72 heures, recommandé) ou afficher un mot de passe temporaire unique. | | **Marque** | Nom de marque, nom court, slogans, couleurs principales, e-mail et téléphone du support, nom du vendeur figurant sur les factures clients, logos (fonds clair et sombre), icône carrée et favicon : PNG, JPEG, WEBP ou ICO jusqu'à 256 Ko, **pas de SVG**. | | **Domaines** | Le ou les domaines client avec **aussi www**, lequel est prioritaire, un **domaine de test** (sslip.io) et l'option **dry-run**, ou un sous-domaine de la plateforme. L'assistant indique **DNS OK / DNS not ready** et les enregistrements à créer. | | **Tarifs et portefeuille** | Remise de gros (%), plancher de vente (% du tarif public), majoration par défaut (%), limite de crédit, solde initial, alerte de solde bas, limites sur les clients, les VM et les domaines, fonctionnalités du site (inscription client, protection DDoS, tickets de support, forfait personnalisé, redimensionnement, Auto Scaling). | | **Canaux de paiement** | Qui perçoit les paiements des clients (voir ci-dessous) et optionnellement son propre PayPal et son propre virement bancaire vietnamien. | | **Email** | Nom de l'expéditeur et Reply-To. L'adresse From reste celle de la plateforme tant que DKIM n'est pas configuré pour le domaine du revendeur. | | **Révision** | Vérifiez le tout et cliquez sur **Provision everything**, ou **Save draft (provision later)**. | 2. Le provisionnement se poursuit en arrière-plan (toutes les 30 secondes). Ouvrez le revendeur pour suivre la progression et utilisez **Continue provisioning** ou **Retry** si une étape a échoué. ![Assistant de création d'un revendeur à la première étape avec des exemples de valeurs](https://nexcmp.com/fr/docs/images/customers/resellers-01-wizard.webp) ### Pointer les DNS (le revendeur s'en charge) {#point-dns-the-reseller-does-this} Le revendeur (ou vous-même) crée les enregistrements affichés sous l'onglet **Domains & SSL** : | Enregistrement | Name | Valeur | |---|---|---| | TXT (propriété, première fois seulement) | `_site-verify.` | `sv=` affiché à l'écran | | A (domaine apex tel que `shop.example.net`) | le domaine | votre `rs_server_ipv4` | | CNAME (sous-domaine tel que `cloud.example.net`) | le domaine | votre `rs_cname_target` (ou un enregistrement A vers `rs_server_ipv4`) | | CNAME (optionnel) | `www.` | votre `rs_cname_target` | Également : - Supprimez tout enregistrement **AAAA** (IPv6) sauf si votre serveur répond sur cette adresse IPv6. - Désactivez le proxy CDN (**off**, nuage gris) pendant la vérification du domaine. - Si le domaine possède des enregistrements **CAA**, autorisez `letsencrypt.org`. Le jeton de l'enregistrement TXT est unique pour chaque domaine ; copiez-le depuis l'écran. Le système revérifie les DNS toutes les 5 minutes pendant les premières 48 heures, puis toutes les heures, et libère un nom dont l'enregistrement TXT est toujours absent après 72 heures. ### États des domaines {#domain-states} Sur **Customers › Resellers › Domains & SSL** (tous les revendeurs) et dans l'onglet **Domains & SSL** d'un revendeur : | État | Description | |---|---| | `pending_verify` | En attente de l'enregistrement TXT. | | `pending_dns` / `verifying` | En attente du pointage A ou CNAME vers vous. | | `issuing` | Certificat en cours d'émission. | | `active` | Diffusion du site du revendeur. | | `cert_expiring` | Certificat proche de l'expiration ; renouvellement attendu. | | `dns_lost` | Les DNS ne pointent plus vers vous ; le domaine est supprimé au bout de 30 jours. | | `error` | Consultez le code d'erreur ; **Retry** après correction. | | `removing` / `removed` | En cours de suppression ; l'emplacement de licence est récupéré. | Actions sur les lignes : **Check now**, **Retry**, **Make primary**, **Test mode** (pour un domaine de test), **Remove**. ## Permissions et gros {#permissions-wholesale} **Customers › Resellers › Permissions & wholesale** (`/resellers/entitlements`) est une matrice : une ligne par revendeur, avec la **remise** et la **marge** en gros, et un interrupteur par service (par exemple DDoS Shield et VPN). Un interrupteur est modifiable lorsque la fonction globale de la plateforme est activée ; sinon, la cellule est en lecture seule et renvoie vers le paramètre. Le sous-onglet **Top-up codes** définit le nombre de codes que chaque revendeur peut émettre par mois (voir [Promotions](https://nexcmp.com/fr/docs/billing/promotions/)). Règles de tarification : - Prix de gros = prix public x (1 - remise), et peut être remplacé par plan et par cycle de facturation dans l'onglet **Wholesale pricing** du revendeur. - Le revendeur définit les prix au détail et ne peut pas descendre sous le **plancher** (pourcentage du prix public). - Le **portefeuille** du revendeur paie le prix de gros lorsque ses clients achètent. Le portefeuille dispose d'une limite de crédit, d'un délai de grâce et d'un plafond de découvert (voir Defaults). ## Defaults {#defaults} **Customers › Resellers › Defaults** (`/resellers/settings`) contient les clés `rs_*` s'appliquant à chaque revendeur. Chaque modification demande une raison et est auditée. | Groupe | Clé | Valeur par défaut | Description | |---|---|---|---| | Général | `rs_enabled` | 1 | Programme de revendeurs activé. | | | `rs_platform_collect_enabled` | 0 | Permet à la plateforme de collecter les paiements des clients pour le compte des revendeurs. **Activer uniquement après un examen juridique.** | | | `rs_totp_required` | 1 | Les comptes de la console revendeur doivent utiliser l'authentification multifacteur. | | | `rs_agreement_version` | 1 | Version de l'accord de revendeur qu'ils doivent accepter. | | Tarification par défaut | `rs_default_discount_bp` | 2000 (20 %) | Remise en gros pour les nouveaux revendeurs (points de base, de 0 à 9000). | | | `rs_default_markup_bp` | 2500 (25 %) | Marge par défaut (de 0 à 50000). | | | `rs_default_floor_bp` | 9000 (90 %) | Plancher de détail (de 0 à 20000). | | | `rs_default_max_domains` | 3 | Domaines autorisés par revendeur. | | Portefeuille et versements | `rs_grace_hours` | 72 | Délai de grâce avant que les services des clients ne soient affectés par un portefeuille de revendeur vide. | | | `rs_overdraft_cap_cents` | 5000 | Découvert autorisé sur le portefeuille. | | | `rs_retention_days` | 14 | Jours avant la destruction des VM d'un revendeur fermé. | | | `rs_payout_hold_days` | 30 | Jours pendant lesquels une commission est retenue avant de pouvoir être retirée. | | | `rs_payout_min_cents` | 5000 | Retrait minimum. | | | `rs_topup_min_cents` | 2000 | Recharge de portefeuille minimale par un revendeur. | | Paiements et e-mails | `rs_webhook_base` | vide | URL de base publique pour les webhooks de la passerelle revendeur (vide = utiliser l'URL du site). | | | `rs_mail_from` | vide | Adresse d'expéditeur pour les e-mails des revendeurs. | | | `rs_invoice_show_processor` | 1 | Afficher le processeur de paiement sur les factures. | | | `rs_gw_stripe_enabled`, `rs_gw_usdt_enabled` | 1 | Indique si les revendeurs peuvent configurer leur propre Stripe ou USDT. | ## Qui collecte les paiements des clients {#who-collects-customer-payments} | Mode | Description | |---|---| | **Le revendeur collecte (canaux propres)** — par défaut | Le revendeur connecte son propre compte Stripe, PayPal, USDT ou bancaire. Ses webhooks sont `https:///v1/billing//webhook/r/`. Les cartes enregistrées et l'[auto top-up](https://nexcmp.com/fr/docs/billing/auto-top-up/) ne sont pas disponibles pour ces sites. | | **La plateforme collecte** | Vos canaux sont affichés sur le site du revendeur. Verrouillé jusqu'à `rs_platform_collect_enabled = 1`. | | **Mixte** | Une combinaison choisie par canal. | ## Ce que voit le revendeur {#what-the-reseller-sees} La console partenaire sur `https://partner.` propose Overview, Reports, Customers, VMs, Tickets, Orders, Payments, Prices, Brand, Landing & legal, Domains & SSL, Email, Wallet et Payment channels. Les comptes de la console ont le rôle *reseller* (complet) ou *staff* (lecture seule). Pour la consulter vous-même, ouvrez le revendeur et cliquez sur **Sign in to partner console** : vous y entrez pour 60 minutes, chaque écriture est enregistrée avec votre nom dans le journal administrateur et le journal revendeur, et les opérations financières nécessitent une seconde confirmation. ## Vérification {#verify} 1. Après le provisionnement, la ligne du revendeur affiche *active* et une colonne **Provisioning** verte. 2. Ouvrez le domaine du revendeur dans un navigateur : sa propre page de connexion apparaît avec sa marque. `https:///admin` répond par 404. 3. Inscrivez un client test sur ce domaine : le client apparaît sous **Customers › List** avec le revendeur dans la colonne **Site**. 4. La page de licence indique un emplacement utilisé de plus. ## Limites et notes {#limits-notes} - Un emplacement de licence par domaine personnalisé ou test ; les sous-domaines de la plateforme n'utilisent pas d'emplacement. - La suspension d'un revendeur conserve les données ; **Close reseller** restitue tous les emplacements de domaine, et la destruction de VM n'est autorisée qu'après la période de rétention. - Les clients des revendeurs apparaissent dans votre liste de clients et peuvent être usurpés comme les autres (le lien s'ouvre sur le domaine du revendeur). - Les revendeurs ne peuvent pas voir ni modifier vos canaux de paiement, quotas par défaut ou autres revendeurs. ## Dépannage {#troubleshooting} | Symptôme | Cause | Solution | |---|---|---| | "Nombre de domaines revendeurs sous licence épuisé" | All slots used | Libérez un emplacement (supprimez un domaine) ou achetez-en d'autres sur la page de licence. | | Domain stuck in `pending_verify` | TXT record missing | Créez l'enregistrement TXT tel qu'affiché ; utilisez **Check now**. | | Domain stuck in `pending_dns` | A/CNAME ne pointant pas vers vous, enregistrement AAAA ou proxy CDN activé | Corrigez le DNS, désactivez le proxy, puis **Check now**. | | `error` state | Consultez le code sur la ligne (par exemple CAA bloquant Let's Encrypt, limite de taux) | Corrigez et cliquez sur **Retry**. | | Le navigateur indique que l'hôte est inconnu ou "421" | Le nom d'hôte ne figure pas sur la licence ou n'est pas routé vers le panneau | Ajoutez le domaine via le revendeur (consomme un emplacement) et corrigez le proxy inverse. | | Les instructions indiquent une IP ou un hôte erroné | `rs_server_ipv4` / `rs_cname_target` contiennent toujours les valeurs d'exemple | Set them in Defaults. | | Le revendeur ne peut pas activer la collecte de la plateforme | Locked | Définissez `rs_platform_collect_enabled` après examen juridique. | --- # Personnalisation {#branding} > **Où dans l'administration :** System › Settings › Brand (`/settings/branding`). Similaire : System › Settings › General (`/settings`) pour les URL et les coordonnées du vendeur indiquées sur les factures. ## Description {#what-it-does} NexCMP est en marque blanche : le produit ne porte aucun nom de fournisseur et tout ce que vos clients voient est **votre** marque. Les paramètres de marque s'appliquent aux pages de connexion et d'inscription, au portail, à la console d'administration et aux e-mails. ## Prérequis {#requirements} | Élément | Prérequis | |---|---| | Rôle | Un administrateur. | | Fichiers | Logos : SVG, PNG, JPEG, WEBP ou ICO, **jusqu'à 512 Ko chacun**. | | Dépendances | Aucune. | ## Étapes {#steps} 1. Open **System › Settings › Brand**. 2. Dans la carte **Identity**, renseignez : | Champ | Remarques | |---|---| | **Brand name** (required) | Jusqu'à 60 caractères. Affiché dans le portail, les e-mails, les factures et les pages légales. | | **Nom du vendeur sur les factures** | Jusqu'à 120 caractères. Vide signifie le nom de la marque. | | **Brand color** | Une couleur `#rrggbb` ; le petit bouton à côté du champ la réinitialise à la couleur intégrée. | | **Site currency** | **USD** : les prix et les soldes sont affichés uniquement en USD, sans sélecteur de devise. **VND** : affiche également le montant converti au taux de change enregistré (voir [Currency and exchange rates](https://nexcmp.com/fr/docs/catalog/currency-and-exchange-rates/)). | 3. Cliquez sur **Save**. 4. Dans la carte **Logo & favicon**, téléchargez les trois images — **Logo (fond clair)**, **Logo (fond sombre)** et **Favicon** — à l'aide de **Upload** (ou de **Replace**) ; **Remove** permet d'en supprimer une. ![Page de marque avec les champs d'identité et les trois images téléchargées](https://nexcmp.com/fr/docs/images/customers/branding-01-brand.webp) ### Paramètres associés dans General {#related-settings-in-general} **System › Settings › General** comporte deux onglets qui complètent le tableau : | Onglet | Champs | |---|---| | **Branding & URLs** | Nom de marque (e-mail, factures), langue par défaut (anglais ou vietnamien), **Customer app URL**, **Console URL**, **Admin URL** (lien d'usurpation de revendeur) et **Partner console URL** (liens d'invitation, e-mails de revendeur). L'assistant d'installation remplit ces champs avec `https://`, `https:///admin` et `https:///console`. | | **Seller & invoicing** | Nom de l'entité juridique, numéro de TVA, adresse, e-mail de contact et préfixe de numéro de facture. Voir [Invoices and ledger](https://nexcmp.com/fr/docs/billing/invoices-and-ledger/). | Le nom d'expéditeur (**From name**) des e-mails se configure dans **System › Settings › Email** ([SMTP and e-mails](https://nexcmp.com/fr/docs/administration/smtp-and-emails/)). ## Vérification des fichiers téléchargés {#uploaded-files-are-checked} - Les images matricielles sont reconnues d'après leur contenu (et non d'après le nom du fichier) et mesurées. - **Les fichiers SVG sont régénérés** à partir d'une liste sécurisée de formes. Tout fichier contenant des scripts, `foreignObject`, des attributs d'événements, des liens externes, `url(...)` pointant vers l'extérieur, un DOCTYPE ou des entités est **refusé** (`svg_unsafe`). - Un fichier trop volumineux est refusé avec `asset_too_large`, un type incorrect avec `asset_type`, de mauvaises dimensions avec `asset_dimensions`. - Les fichiers sont servis depuis votre propre domaine avec des en-têtes de sécurité stricts. ## Vérification {#verify} 1. Ouvrez la page de connexion du portail dans une fenêtre privée : le logo, le nom et la couleur apparaissent. 2. Vérifiez l'onglet du navigateur pour le favicon (les navigateurs mettent les favicons en cache ; rechargez en vidant le cache si vous voyez toujours l'ancien). 3. Déclenchez un e-mail de test (par exemple **Send reset link** pour un client test) et vérifiez le nom de la marque dans l'objet et le pied de page. ## Limites et notes {#limits-notes} - Le logo pour fond sombre est utilisé lorsque le client ou l'administrateur bascule sur le thème sombre. - Les revendeurs possèdent leur propre marque ; ils téléchargent des fichiers PNG, JPEG, WEBP ou ICO jusqu'à 256 Ko (pas de SVG). Voir [Resellers](https://nexcmp.com/fr/docs/customers/resellers/). - Une modification de la couleur de marque ou du logo s'affiche au chargement de page suivant ; les e-mails déjà envoyés ne sont pas modifiés. ## Dépannage {#troubleshooting} | Symptôme | Cause | Solution | |---|---|---| | Téléchargement refusé : `svg_unsafe` | Le SVG contient des scripts, des liens ou des références externes | Exportez un SVG simple (sans script ni images externes) ou utilisez le format PNG. | | `asset_too_large` | Fichier supérieur à 512 Ko | Compressez ou redimensionnez l'image. | | `asset_type` | Format non pris en charge (ni SVG, ni PNG, ni JPEG, ni WEBP, ni ICO) | Convertissez le fichier. | | `invalid_argument: primary` | La couleur n'est pas `#rrggbb` | Utilisez une valeur hexadécimale à six chiffres. | | Ancien logo toujours visible | Cache du navigateur | Effectuez un rechargement forcé ; les favicons peuvent prendre plus de temps. | | Les prix s'affichent uniquement en USD | La devise du site est l'USD | Passez au VND et assurez-vous qu'un taux de change est enregistré. | --- # Pages légales {#legal-pages} > **Où dans l'administration :** System › Settings › Legal (`/settings/legal`). **Où les clients les voient :** `https:///terms` et `/privacy`, liés depuis l'inscription et la commande. ## Description {#what-it-does} Votre installation publie deux pages : **Terms of Service** et **Privacy Policy**. En attendant de rédiger les vôtres, NexCMP affiche un **texte neutre par défaut** qui ne mentionne pas l'éditeur du logiciel et ne promet aucun service particulier. Remplacez-le par un texte examiné par votre conseiller juridique avant de commencer à vendre. ## Prérequis {#requirements} | Élément | Prérequis | |---|---| | Rôle | Un administrateur. | | Contenu | Markdown brut, jusqu'à **50 Ko** par page et par langue. | | Dépendances | Le nom de la marque et les coordonnées du vendeur ([Branding](https://nexcmp.com/fr/docs/customers/branding/)) sont insérés dans le texte par défaut. | ## Étapes {#steps} 1. Ouvrez **System › Settings › Legal**. Chacune des deux pages possède sa propre carte avec le tag *Using the default text* ou *Using your text*. 2. Choisissez l'onglet de langue, **English** ou **Tiếng Việt**. 3. Saisissez votre texte. Tant que le champ est vide, le texte par défaut s'affiche en filigrane comme espace réservé. Pour partir de celui-ci, cliquez sur **Start from the default text**, puis modifiez-le. 4. Cliquez sur **Save**. Le compteur de taille affiche `used / 50 KB`. 5. Cliquez sur **View on the customer site** pour ouvrir `/terms` ou `/privacy`. 6. Pour revenir au texte par défaut pour une langue, cliquez sur **Clear, back to default** et enregistrez. ![Paramètres juridiques avec la carte des conditions d'utilisation affichant le texte par défaut comme point de départ](https://nexcmp.com/fr/docs/images/customers/legal-01-terms.webp) ## Contenu des pages par défaut {#what-the-default-pages-contain} Le texte par défaut est enregistré dans le produit sous la forme `legal_default.json` et complété par votre nom de marque, nom de vendeur, URL du site et e-mail de contact (provenant de **Seller & invoicing** sous System › Settings › General ; si aucun e-mail n'est défini, il pointe vers votre équipe de support). | Page | Sections | |---|---| | **Terms of Service** | 1 Le service · 2 Comptes et vérification · 3 Prix et facturation · 4 Remboursements · 5 Vos données · 6 Utilisation acceptable · 7 Disponibilité et support · 8 Suspension et résiliation · 9 Responsabilité · 10 Modifications et droit applicable (la loi du lieu d'établissement du vendeur) | | **Privacy Policy** | 1 Ce que nous collectons · 2 Pourquoi nous l'utilisons · 3 Cookies et stockage local · 4 Qui d'autre y a accès · 5 Conservation · 6 Vos droits · 7 Contact | ::: warning Avis de non-responsabilité juridique Le texte par défaut est un modèle neutre. Faites-le examiner avant de l'utiliser avec de vrais clients, en particulier les sections relatives aux remboursements, à la responsabilité et au droit applicable. ::: ## Règles Markdown {#markdown-rules} - Pris en charge : titres (`# 1. Title`), paragraphes, listes à puces et numérotées, **gras** et liens `[text](https://example.com)`. - Les liens doivent commencer par `http://` ou `https://`. - **Le HTML brut est refusé** (tout ``, ` # Aperçu du portail client {#customer-portal-overview} > **Où se trouve le portail :** `https:///` — les clients se connectent sur `/login`. Les administrateurs utilisent `/admin` ; la même connexion ouvre les deux lorsque le compte est un administrateur. Le portail est l'outil que vos clients utilisent chaque jour. Il est personnalisé à votre nom, votre logo et vos couleurs ([Branding](https://nexcmp.com/fr/docs/customers/branding/)) et n'affiche que les services que vous avez activés ([Modules](https://nexcmp.com/fr/docs/infrastructure/modules/)). ## The dashboard {#the-dashboard} Après la connexion, le **Dashboard** affiche : | Block | Description | |---|---| | Wallet balance | Le crédit actuel et une estimation du nombre de jours qu'il durera au rythme de consommation actuel | | Spent this month | Les frais facturés jusqu'à présent et une prévision pour la fin du mois | | Virtual machines | Chaque machine virtuelle avec son statut, son IP, son CPU et sa RAM, ainsi que des actions rapides (Console, Restart) | | Bandwidth | Le trafic entrant/sortant pour 1 h, 6 h, 24 h, 7 d, 30 d | | Recent activity | Les derniers événements sur le compte | | Quick start | Une liste de contrôle : créer une machine virtuelle, ajouter une clé SSH, recharger, activer la recharge automatique, vérifier l'e-mail | ![Le tableau de bord client avec le solde du portefeuille, la prévision de dépenses, une machine virtuelle en cours d'exécution et la liste de contrôle de démarrage rapide](https://nexcmp.com/fr/docs/images/portal/overview-01-dashboard.webp) ## Navigation {#navigation} Le menu groupe les services par type. Un service que vous avez désactivé (ou dont la source n'est pas connectée) n'apparaît pas. | Domaine | Page | |---|---| | Instances | [Virtual machines](https://nexcmp.com/fr/docs/portal/virtual-machines/) et leurs pages de détails | | Deploy | [Ordering](https://nexcmp.com/fr/docs/portal/ordering/) — créer une ressource | | Stockage | Les instantanés, sauvegardes et volumes lorsqu'ils sont activés — [Snapshots](https://nexcmp.com/fr/docs/portal/snapshots/) | | Billing | [Wallet and top-ups](https://nexcmp.com/fr/docs/portal/sign-up-and-wallet/), factures, commandes, quotas | | Compte | Profil, connexion et sécurité, préférences, recharge automatique | | Support | Widget de chat et tickets — [Support](https://nexcmp.com/fr/docs/portal/support/) | | Documentation API | `/apidoc` — [API](https://nexcmp.com/fr/docs/developers/api/) | ## Compte {#account} **Account** comprend quatre onglets : **Profile** (nom, e-mail, identifiant client, demande de suppression de compte), **Sign-in & security** (mot de passe, passkeys, comptes Google/GitHub liés), **Preferences** (langue, devise d'affichage) et **Auto top-up** ([Auto top-up](https://nexcmp.com/fr/docs/billing/auto-top-up/)). Un client ne peut pas supprimer son compte directement : il clique sur **Request account deletion**. Une fois toutes les machines virtuelles supprimées, un opérateur examine la demande (Customers › Deletion requests) et le client peut l'annuler tant qu'elle est en attente. ## Langue et devise {#language-and-currency} Le portail est disponible en 16 langues et affiche les prix dans une devise déterminée par la langue (voir [Currency and exchange rates](https://nexcmp.com/fr/docs/catalog/currency-and-exchange-rates/)). Les clients peuvent modifier ces deux paramètres dans **Preferences**. ## Quotas clients {#customer-quotas} **Billing › Quotas** indique la part de chaque ressource (CPU, mémoire, stockage, IP, VM) que le client est autorisé à utiliser en fonction de ses paiements — voir [Quotas](https://nexcmp.com/fr/docs/billing/quotas/). --- # Inscription, portefeuille et rechargement {#sign-up-wallet-and-top-up} > **Où dans le portail :** `/register`, `/login`, Billing (`/billing`). ## Créer un compte {#create-an-account} 1. Le client ouvre `https:///register` et saisit son e-mail et son mot de passe (au moins 10 caractères incluant lettres et chiffres), ou utilise **Google**, **GitHub** ou une **passkey** si vous les avez activés — voir [Security](https://nexcmp.com/fr/docs/administration/security/#customer-sign-in). 2. Si le captcha est activé, il doit le résoudre. 3. Un e-mail de vérification est envoyé via votre configuration [SMTP](https://nexcmp.com/fr/docs/administration/smtp-and-emails/). Cette vérification est requise avant la création d'une VM si vos paramètres de vente l'exigent. ![La page d'inscription avec les champs e-mail et mot de passe](https://nexcmp.com/fr/docs/images/portal/sign-up-and-wallet-01-register.webp) ::: tip Sans un serveur SMTP opérationnel, les clients ne peuvent ni vérifier leur e-mail ni réinitialiser leur mot de passe. Configurez d'abord le paramètre [SMTP](https://nexcmp.com/fr/docs/administration/smtp-and-emails/). ::: ## Le portefeuille {#the-wallet} Tous les services sont payés à partir du solde du **portefeuille**, exprimé dans votre devise de facturation. La page **Billing** affiche : | Section | Description | |---|---| | Capacité de dépenses | Solde et rechargements en attente | | Frais en cours | Services horaires consommés sur le cycle en cours, non encore facturés | | Solde impayé | Tout montant dû | | Historique de facturation | Onglets **Invoice History**, **Payment Order**, **Ledger**, **Orders** | ![La page Billing avec la capacité de dépenses, les frais en cours et les onglets d'historique](https://nexcmp.com/fr/docs/images/portal/sign-up-and-wallet-02-billing.webp) ## Ajouter du crédit {#add-credit} 1. Cliquez sur **Deposit**. 2. Saisissez le montant. Le minimum correspond à votre [minimum top-up](https://nexcmp.com/fr/docs/billing/minimum-top-up/). 3. Choisissez un canal de paiement (carte, PayPal, USDT ou virement bancaire si l'interface est en vietnamien) — les canaux disponibles sont ceux que vous avez activés dans [Payment channels](https://nexcmp.com/fr/docs/billing/payment-channels/). 4. Effectuez le paiement. Le solde est mis à jour dès confirmation par le fournisseur de paiement. Les cartes enregistrées, Stripe Link et PayPal peuvent être réutilisés et employés pour le [auto top-up](https://nexcmp.com/fr/docs/billing/auto-top-up/) ; voir [Saved payment methods](https://nexcmp.com/fr/docs/billing/saved-payment-methods/). ## Utiliser un code {#redeem-a-code} **Redeem code** permet d'ajouter du crédit à partir d'un bon que vous avez émis (Finance › Billing › Vouchers) ou d'appliquer un code promotionnel — voir [Promotions](https://nexcmp.com/fr/docs/billing/promotions/). ## Factures {#invoices} Chaque commande payée génère une facture affichant les coordonnées de votre entreprise ([General settings](https://nexcmp.com/fr/docs/administration/general-settings/)). Les clients peuvent y accéder depuis **Invoice History** et l'imprimer ou l'enregistrer au format PDF depuis leur navigateur. ## Frais horaires {#hourly-charges} Les services facturés à l'heure sont débités pour chaque heure d'existence de la ressource ; les montants s'accumulent et une seule heure peut s'arrondir à $0.00. Lorsque le solde est insuffisant, les services sont suspendus conformément à vos règles de facturation et le client en est informé par e-mail (`low_balance`). --- # Commander un service {#ordering-a-service} > **Où dans le portail :** Deploy (`/deploy/vm`). **Où dans l'administration** pour contrôler ce qui apparaît ici : Services (plans, prix) et System › Admin › License & updates (modules). La page de commande est un formulaire unique à défilement avec des étapes numérotées. Sélectionner un autre service à l'étape 1 conserve la page et modifie les étapes ci-dessous. ## Étapes {#steps} 1. **Service** — Cloud Servers, ainsi que les autres services activés (Kubernetes, Object Storage, Images, Private Cloud, VPN …). 2. **Emplacement** — la [zone](https://nexcmp.com/fr/docs/infrastructure/zones/). Les prix et le trafic inclus peuvent varier selon l'emplacement. 3. **Plan** — un plan fixe (vCPU, RAM, disque NVMe, prix horaire) ou **Custom** (le client choisit vCPU, RAM et disque ; facturé par ressource). Les plans proviennent de [Plans](https://nexcmp.com/fr/docs/catalog/plans/). 4. **Billing cycle** — **Hourly** ou cycles prépayés mensuels/annuels avec réduction (par exemple 1 an −10%, 2 ans −15%, 3 ans −20%). 5. **Système d'exploitation** — une liste de modèles, **My Images** (les propres imports du client) et la version. 6. **Nom d'hôte et quantité** — un nom (ou **Randomize**) et le nombre de serveurs. ![La page de commande affichant les étapes du service, de l'emplacement et du plan](https://nexcmp.com/fr/docs/images/portal/ordering-01-plan.webp) ![Les étapes du cycle de facturation et du système d'exploitation de la page de commande](https://nexcmp.com/fr/docs/images/portal/ordering-02-cycle-os.webp) ## Passer la commande {#placing-the-order} Le résumé indique le prix. La commande est débitée du portefeuille **avant** le provisionnement, après les règles de [vérification du quota](https://nexcmp.com/fr/docs/billing/quotas/) et de [solde minimum](https://nexcmp.com/fr/docs/billing/minimum-top-up/). Une VM atteint généralement l'état *Running* en environ une minute ; le client voit les étapes de déploiement dans l'onglet **Activity** de la VM et reçoit l'e-mail "VM ready" avec le mot de passe initial (visible une seule fois pendant 10 minutes). ## Ce qui peut bloquer une commande {#what-can-stop-an-order} | Message / cause | Solution | |---|---| | Solde insuffisant | Recharger — [Sign-up, wallet and top-up](https://nexcmp.com/fr/docs/portal/sign-up-and-wallet/) | | Quota dépassé | Augmenter le quota — [Quotas](https://nexcmp.com/fr/docs/billing/quotas/) | | E-mail non vérifié | Le client vérifie l'e-mail | | Aucun plan pour l'emplacement choisi | Rendre un plan disponible dans cette zone — [Plans](https://nexcmp.com/fr/docs/catalog/plans/) | | Licence non valide | Les clients ne peuvent pas créer de nouveaux services — [License](https://nexcmp.com/fr/docs/getting-started/license-and-purchase/#if-the-license-is-not-valid) | --- # Virtual machines {#virtual-machines} > **Où dans le portail :** Instances (`/vms`) et page d'une VM (`/vms/`). **Instances** liste les VMs d'un client avec leur nom, OS, statut, IP, caractéristiques et coût. Cliquez sur l'une d'elles pour ouvrir sa page. ## La page de la VM {#the-vm-page} Onglets : **Overview**, **Console**, **AI SSH Agent** (quand le module IA est activé), **Monitoring**, **Storage**, **Network**, **Configuration**, **Billing**, **Activity**. ![Aperçu d'une machine virtuelle avec le statut, les caractéristiques, l'IP, le graphique de bande passante et le journal des actions](https://nexcmp.com/fr/docs/images/portal/virtual-machines-01-overview.webp) ### Actions {#actions} | Action | Effet | |---|---| | Console | Ouvre la console du navigateur — [Console](https://nexcmp.com/fr/docs/portal/console/) | | Redémarrer / Arrêter / Arrêt forcé | Contrôle de l'alimentation | | Réinitialisation du mot de passe | Génère un nouveau mot de passe, affiché une seule fois | | Réinstaller l'OS | Reconstruit à partir d'un modèle ; les données sont perdues | | Changer d'IP | Remplace l'IP publique (si la source le prend en charge) | | Activer Auto Scaling | Ajuste le CPU/RAM en charge lorsque l'option est activée | | Supprimer | Détruit la VM ; la facturation horaire s'arrête | ### Informations affichées {#information-shown} Disponibilité, coût du mois en cours, vCPU/RAM/disque avec utilisation en direct, IP publique et privée, nom d'utilisateur, graphique de bande passante, journal des actions et résumé de la facturation (offre, cycle, heures, restant). ::: info Les champs dépendent de la source Une page de VM n'affiche que ce que sa source prend en charge. Par exemple, une VM Proxmox VE ne dispose pas de redirection de port ni de changement d'IP, et sa liste d'OS suit le jeu de modèles de son cluster. Voir le tableau des fonctionnalités dans [Proxmox VE](https://nexcmp.com/fr/docs/infrastructure/proxmox/). ::: ## Onglet Facturation {#billing-tab} Affiche l'offre, le cycle, le nombre total d'heures, le temps restant et le journal de facturation. Les VM horaires s'accumulent jusqu'à leur suppression. Un client peut **changer de cycle** pour prépayer une période plus longue à prix réduit. ## Pour les administrateurs {#for-administrators} La même VM est visible sous Services › Virtual Machines dans la console d'administration, où vous pouvez agir au nom du client ou [vous connecter en tant que](https://nexcmp.com/fr/docs/customers/login-as/) lui. --- # Console {#console} > **Où dans le portail :** page d'une VM → onglet **Console**. **Où dans l'admin :** System › Admin › License & updates → modules (SSH web). ## Description {#what-it-does} L'onglet **Console** ouvre une session graphique (VNC) vers la VM dans le navigateur, même lorsque le réseau à l'intérieur de la VM est rompt. Un terminal **SSH web** est disponible comme seconde option lorsque le module SSH est activé. ## Prérequis {#requirements} | Élément | Console VNC | SSH web | |---|---|---| | CloudStack | VM proxy de console (CPVM) joignable par le panneau — voir [CloudStack](https://nexcmp.com/fr/docs/infrastructure/cloudstack/) | Un port SSH joignable sur la VM | | Proxmox VE | Fonctionne via le panneau (noVNC via l'API Proxmox ; l'empreinte TLS est épinglée) — voir [Proxmox VE](https://nexcmp.com/fr/docs/infrastructure/proxmox/) | Identique | | Panneau | URL de console définie dans [General settings](https://nexcmp.com/fr/docs/administration/general-settings/) | Le drapeau de service et de module `ssh-proxy` service and module flag `feature_ssh_web` ; désactivé par défaut — voir [Modules](https://nexcmp.com/fr/docs/infrastructure/modules/) | Si le module SSH web est désactivé, l'onglet affiche **VNC only**. ## L'utiliser {#use-it} 1. Ouvrez la VM → **Console**. 2. Cliquez sur **Console** (ou **Open in new window**). Un ticket à courte durée de vie est émis et la console s'ouvre à `https:///console`. 3. Connectez-vous avec le nom d'utilisateur et le mot de passe de la VM (visibles sur l'onglet Overview ; réinitialisez-les en cas de perte). ![L'onglet Console d'une machine virtuelle](https://nexcmp.com/fr/docs/images/portal/console-01-tab.webp) ## Dépannage {#troubleshooting} | Symptôme | Cause | Solution | |---|---|---| | "Disconnected" immédiatement | Le navigateur a conservé un ancien chemin de console | Effacez les données du site pour le domaine et réessayez | | Écran noir | La VM est arrêtée ou en cours de démarrage | Démarrez la VM et patientez | | La console ne s'ouvre pas sur CloudStack | La VM proxy de console ne s'exécute pas ou n'est pas joignable | Vérifiez les VM système dans CloudStack | | Pas d'option SSH | Module Web SSH désactivé | L'activer uniquement après l'installation de `ssh-proxy` | --- # Snapshots et Backups {#snapshots-and-backups} > **Où dans le portail :** Snapshots (`/snapshots`), Snapshot schedules (`/snapshots/schedules`), Backups (`/backups`). Visible uniquement lorsque la fonctionnalité est activée dans l'administration. ## Description {#what-it-does} Un snapshot enregistre l'état du disque d'une VM afin que le client puisse revenir en arrière après une mauvaise manipulation. Les Snapshots peuvent être créés manuellement ou selon une planification. ## Disponibilité {#availability} | Source | Snapshots | Remarques | |---|---|---| | CloudStack | Oui | Instantanés de volume ; stockage facturé selon la configuration | | Proxmox VE | Oui | Jusqu'à **5 par VM** ; création, liste, restauration et suppression | L'entrée de menu n'apparaît que lorsque la fonctionnalité d'instantané est activée et que le client possède une VM dont la source la prend en charge. ## L'utiliser {#use-it} 1. Ouvrez **Snapshots**, cliquez sur **Create**, choisissez la VM et donnez un nom. 2. Patientez jusqu'à ce que le statut soit *ready*. 3. Pour revenir en arrière, choisissez **Restore** sur l'instantané et confirmez — la VM retrouve cet état (et est redémarrée si nécessaire). 4. Supprimez les instantanés dont vous n'avez plus besoin. ::: warning La restauration efface tout ce qui a été écrit après l'instantané. Les VM protégées ne peuvent pas être restaurées ni détruites depuis le portail. ::: --- # Support pour les clients {#support-for-customers} > **Où dans le portail :** la bulle de chat sur chaque page, `/chat`, et les tickets de support. **Où dans l'administration :** Customers › Support › Tickets (`/support/tickets`), onglet **Settings**. ## Pour les clients {#for-customers} - **Bulle de chat** (coin inférieur de chaque page) : posez une question ; l'[AI Chat](https://nexcmp.com/fr/docs/ai/ai-chat/) répond en utilisant votre documentation et les données de compte du client. **Expand** ouvre la même conversation sur `/chat`. - **Parler au personnel** : transfère la conversation à votre équipe (via votre groupe Telegram d'administration). - **Boutons Telegram / Zalo** : n'apparaissent qu'après avoir défini les liens dans les paramètres de support. - **Tickets** : pour les problèmes plus longs ; les réponses sont envoyées par e-mail (`ticket_reply`). ## Pour vous {#for-you} 1. Ouvrez **Customers › Support › Tickets** ; les nouveaux tickets et chats y apparaissent avec la conversation. 2. Répondez dans le fil. Le client reçoit un e-mail via votre [SMTP](https://nexcmp.com/fr/docs/administration/smtp-and-emails/). 3. Dans l'onglet **Settings**, activez ou désactivez le widget de chat, définissez le lien Telegram et le lien Zalo (https uniquement), et choisissez si l'IA répond automatiquement — voir [AI Chat](https://nexcmp.com/fr/docs/ai/ai-chat/). 4. Connectez [Telegram alerts](https://nexcmp.com/fr/docs/administration/telegram-notifications/) pour que votre équipe soit avertie des nouveaux chats. --- # Fournisseur d'IA {#ai-provider} > **Où dans l'administration :** System › Settings › AI provider (`/settings/ai`). L'interrupteur du module d'IA se trouve à cet endroit ainsi que dans System › Admin › License & updates (`/license`), carte **Module**. ## Description {#what-it-does} AI Chat (chat de support automatique) et l'AI Agent (administration de VM en langage clair) ne sont pas livrés avec un modèle intégré. Vous choisissez **votre propre fournisseur** : tout service proposant une `chat/completions` API compatible **OpenAI** — par exemple OpenAI, OpenRouter, une passerelle LiteLLM ou votre propre serveur vLLM. NexCMP stocke le point de terminaison et la clé API (chiffrés) et les utilise pour chaque fonctionnalité d'IA. Vous payez directement le fournisseur. ## Prérequis {#requirements} | Élément | Prérequis | |---|---| | Endpoint | Une URL de base compatible OpenAI (`https://api.openai.com/v1`, `https://ai.example.com/v1`). NexCMP ajoute `/chat/completions` à une URL se terminant par `/v1` ; pour toute autre URL, il ajoute `/v1/chat/completions` ; une URL se terminant déjà par `/chat/completions` est utilisée telle quelle. | | Modèle | Un modèle qui prend en charge **l'appel d'outils (fonctions)**. L'AI Chat et l'Agent en dépendent tous les deux. | | Clé API | Une clé pour cet endpoint. Préférez une clé dotée d'un **plafond de dépenses** côté fournisseur (par exemple, une clé virtuelle LiteLLM avec un budget mensuel). | | Réseau | Le serveur du panneau doit pouvoir joindre l'endpoint via HTTP(S). Une URL saisie dans le formulaire ne peut pointer vers Internet que sur les ports 80, 443, 8080 ou 8443 ; pour utiliser une adresse interne, enregistrez d'abord le fournisseur puis testez. | | Dépendances | Le module **AI** est activé. Pour l'Agent, consultez [AI Agent](https://nexcmp.com/fr/docs/ai/ai-agent/#requirements). | ## Préparer l'infrastructure {#prepare-the-infrastructure} 1. Inscrivez-vous auprès du fournisseur et créez une clé API. Si le fournisseur prend en charge les budgets ou les limites de taux, définissez une limite mensuelle. 2. Notez l'**URL de base** et le **nom du modèle** exact (et éventuellement jusqu'à quatre modèles de secours). 3. Testez-la depuis le serveur NexCMP avant de la saisir : ```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"}]}' ``` Une réponse JSON avec `choices[0].message.content` indique que l'endpoint fonctionne. ## Connecter dans NexCMP {#connect-in-nexcmp} 1. Ouvrez **System › Settings › AI provider**. 2. Dans la carte **Module AI**, activez le module (**on**). Tant qu'il n'est pas activé, les clients ne voient ni l'AI Chat ni l'AI Agent dans le portail. (Vous pouvez également l'activer dans **License & updates**.) 3. Dans la carte **Connection**, renseignez : | Champ | Exemple | Remarques | |---|---|---| | Utiliser ce fournisseur | activé | Requiert une base URL, un modèle et une clé pour être activé. | | Nom d'affichage | `LiteLLM` | Jusqu'à 60 caractères. | | Base URL (compatible OpenAI) | `https://ai.example.com/v1` | `http://` ou `https://`, jusqu'à 300 caractères, sans espaces. | | Clé API du fournisseur | `sk-XXXX` | Stockée de manière chiffrée ; par la suite, seuls les 4 derniers caractères sont affichés. Laissez vide pour conserver la clé enregistrée. | | Modèle par défaut | `gpt-4o-mini` | Lettres, chiffres et `- _ . / : @`. | | Modèles de secours | `gemini-2.5-flash` | Séparés par des virgules, jusqu'à 4. Utilisés en cas d'échec du modèle par défaut. | | Niveau de raisonnement | Par défaut (non envoyé) | `Minimal`, `Low`, `Medium` ou `High`. Pour les modèles de raisonnement (Gemini, série o), un niveau bas répond beaucoup plus rapidement. Laissez sur Défaut pour les modèles normaux. | 4. Cliquez sur **Save**, puis sur **Test connection**. Le test envoie une question courte et affiche `Connected — , ms` ou l'erreur renvoyée par le fournisseur. ![Page AI provider avec le module AI activé et le formulaire de connexion rempli avec des valeurs d'exemple](https://nexcmp.com/fr/docs/images/ai/ai-providers-01-connection.webp) ### Ce que fait l'enregistrement {#what-saving-does} - Les paramètres du fournisseur sont enregistrés en tant qu'entrée de configuration unique et la clé est chiffrée avec AES-256-GCM, liée à cet usage, à l'aide de la clé principale de l'installation. - Les paramètres de support **Primary model** et **Fallback model** (utilisés par l'AI Chat) sont automatiquement définis sur votre modèle par défaut et votre premier modèle de secours. - La modification est consignée dans le journal d'audit (endpoint, modèle, indication de changement de clé — jamais la clé). ## Vérification {#verify} 1. **Test connection** s'affiche en vert. 2. Connectez-vous au portail en tant que client test : le menu propose désormais **AI Chat** (ou la bulle de chat) et **AI Agent**. 3. Posez la question "What is my balance?" à l'AI Chat. Une réponse indiquant votre véritable solde prouve que le fournisseur gère correctement les appels d'outils. ## Limites et notes {#limits-notes} - **Un seul fournisseur.** NexCMP utilise un unique fournisseur configuré pour le Chat, l'Agent et l'investigation des tickets. Les modèles de secours assurent la résilience au sein de ce fournisseur. - **Sécurité des clés.** La clé enregistrée n'est envoyée qu'à l'endpoint enregistré. Si vous modifiez la Base URL, vous devez saisir à nouveau la clé avant de tester. - **Limites par client.** L'AI Chat est réservé aux clients connectés, avec des limites de messages par minute et par chat. L'Agent dispose d'une limite d'appels quotidienne par compte. Voir [AI Chat](https://nexcmp.com/fr/docs/ai/ai-chat/) et [AI Agent](https://nexcmp.com/fr/docs/ai/ai-agent/). - **Confidentialité.** Les questions des clients et les données lues par l'IA pour ce client (en lecture seule) sont envoyées à votre fournisseur. Mentionnez-le dans votre [politique de confidentialité](https://nexcmp.com/fr/docs/customers/legal/). - **Maîtrise des coûts.** NexCMP ne facture pas les coûts de l'IA ; utilisez les fonctionnalités de budget du fournisseur. - Le module peut être désactivé à tout moment : les éléments de menu de l'IA disparaissent et les routes de l'IA renvoient une erreur 404 `module_disabled`. Certaines tâches d'arrière-plan de l'AI Chat (analyse de tickets, réponses différées) prennent en compte le changement au prochain redémarrage du panneau. ## Dépannage {#troubleshooting} | Symptôme | Cause | Solution | |---|---|---| | `base_url must be an http(s) URL` | Schéma manquant ou espaces | Utilisez `https://host/v1`. | | `api_key is required to enable the provider` | Aucune clé enregistrée | Saisissez la clé et enregistrez. | | `base_url and model are required to enable the provider` | Champ vide | Remplissez les deux. | | "URL de base bloquée : http(s) public uniquement, ports 80/443/8080/8443" | Test d'une adresse interne non enregistrée ou d'un autre port | Enregistrez d'abord le fournisseur, puis testez. | | `api_key is required (enter the key again when you change the endpoint)` | L'URL de base diffère de celle enregistrée | Saisissez à nouveau la clé. | | `model: letters, digits and - _ . / : @` | Caractère invalide | Utilisez l'ID de modèle exact du fournisseur. | | `fallback_models: up to 4 model names` | Trop nombreux | Conservez-en quatre ou moins. | | Le test échoue avec l'erreur 401 | Clé incorrecte | Vérifiez la clé et l'endpoint. | | Le test échoue avec 404 ou "model not found" | Chemin ou modèle incorrect | Vérifiez l'URL de base (`/v1`) et l'ID du modèle. | | `Too many tests — wait a minute` (429) | Plus de 10 tests par minute | Patientez. | | Le portail n'affiche toujours pas le menu IA | Module désactivé ou fournisseur non "in use" | Activez le module et activez le fournisseur. | --- # AI Chat {#ai-chat} > **Où dans l'admin :** Customers › Support › Ticket, onglet **AI settings** (`/support/tickets?tab=settings`). Fournisseur et module : System › Settings › AI provider (`/settings/ai`). **Où dans le portail :** le bouton de chat flottant et la page `/chat` (mode **Ask AI**). ## Description {#what-it-does} L'AI Chat répond aux questions des clients à tout moment, consulte *leurs propres* données de compte (solde, services, paiements, erreurs récentes) et peut agir en leur nom — créer une machine virtuelle, changer de forfait — après confirmation du client. Si l'assistant ne peut pas aider, le client clique sur **Talk to a human** : le chat est transmis à votre équipe sur Telegram et, si personne ne répond à temps, se transforme en ticket. Les mêmes paramètres d'IA permettent également au système d'**enquêter sur les tickets** pour votre équipe. ## Prérequis {#requirements} | Élément | Prérequis | |---|---| | Module et fournisseur | Le module **AI** activé et un [AI provider](https://nexcmp.com/fr/docs/ai/ai-providers/) enregistré et en cours d'utilisation. Sans fournisseur, l'assistant indique qu'il n'est pas configuré. | | Clients | **Clients connectés uniquement.** Dans une installation NexCMP, il n'y a pas de site public ; un visiteur non connecté reçoit donc le message "Sign in to use AI Chat". | | Canal du personnel (optionnel) | Un bot et un chat Telegram pour les alertes administrateur (voir [Telegram notifications](https://nexcmp.com/fr/docs/administration/telegram-notifications/)). Ce même canal reçoit les transferts de chat et les ébauches de tickets. | | Dépendances | [AI provider](https://nexcmp.com/fr/docs/ai/ai-providers/). | ## Préparer l'infrastructure {#prepare-the-infrastructure} Aucun prérequis supplémentaire en dehors du fournisseur d'IA. Si vous souhaitez le transfert vers le personnel : 1. Créez un bot Telegram avec @BotFather et notez le jeton. 2. Créez un groupe ou utilisez votre chat privé avec le bot, puis notez l'identifiant du chat. 3. Saisissez les deux dans System › Settings › Admin alerts (voir [Telegram notifications](https://nexcmp.com/fr/docs/administration/telegram-notifications/)). Les fonctionnalités de support réutilisent ce bot et ce chat. ## Connecter dans NexCMP {#connect-in-nexcmp} 1. Assurez-vous que le module IA est activé et que le test du fournisseur est au vert ([AI provider](https://nexcmp.com/fr/docs/ai/ai-providers/)). 2. Ouvrez **Customers › Support › Ticket** et sélectionnez l'onglet **AI settings**. Le haut de la carte de gauche affiche trois tags : *AI provider: configured*, *Telegram: channel present* et *On shift* ou *Off shift*. 3. Carte de gauche **AI + Telegram** : | Interrupteur ou champ | Valeur par défaut | Description | |---|---|---| | L'IA analyse les tickets automatiquement | On | Pour un nouveau ticket ou message, l'IA lit les données du client (en lecture seule) et rédige la cause probable ainsi qu'un brouillon de réponse sous forme de **note interne**. Elle n'envoie jamais rien au client. | | Alertes Telegram aux administrateurs | On | La note arrive sur Telegram avec les boutons Send, Edit et Skip. | | Réponse automatique par IA | Désactivé | Envoie de simples réponses pratiques ou commerciales de manière autonome lorsque toutes les conditions de sécurité sont réunies (confiance de 85 % ou plus, aucun avertissement) ; envoyé après 3 minutes et annulable sur Telegram. | | Catégories autorisées pour la réponse automatique | `how_to`, `sales` | Uniquement celles-ci. | | Modèle principal, Modèle de secours | défini par le fournisseur | Normalement, laissez tel qu'enregistré par la page du fournisseur d'IA. | | ID utilisateur Telegram autorisé à agir | vide | Vide signifie le chat du canal d'alerte. | 4. Carte de droite **Live chat (customer widget)** : | Champ | Valeur par défaut | Description | |---|---|---| | Activer le widget de chat | On | La bulle de discussion et la page `/chat`. | | Heures de support (heure du Vietnam) | `08:00-22:00` | Période où le personnel est censé répondre sur Telegram. En dehors de ces heures, ou lorsqu'aucun canal Telegram n'existe, **Talk to a human** transforme immédiatement le chat en ticket. | | Délai d'attente max pour le personnel (minutes), puis conversion en ticket | 10 | 1 à 240. | | Échanges IA / jour / client | 40 | 1 à 1000. Une fois la limite atteinte, l'assistant invite le client à parler à un humain. | | Nouveaux chats / heure / IP | 20 | 1 à 1000. | | **Lien Zalo OA** | vide | `https://zalo.me/...` Affiche le bouton **Chat on Zalo** (avec un code QR) dans le chat. Vide le masque. | | **Lien Telegram** | vide | `https://t.me/...` Affiche un bouton **Telegram**. Vide le masque. | | Plafond journalier global du système pour les échanges d'IA, clients connectés | 2000 | | | Plafond journalier global du système, invités | 500 | Pool propre ; inutilisé tant que les invités ne peuvent pas chatter. | | Plafond journalier global du système pour les analyses automatiques de tickets | 200 | | | Chemin administrateur (le bouton Telegram "Open admin") | vide | Votre URL d'administration, par exemple `https://cloud.example.com/admin`. | Chaque interrupteur ou champ est enregistré dès sa modification. 5. En bas, **Reply templates** (titre, langue VI/EN/ZH, texte jusqu'à 4,000 caractères) fournissent au personnel des réponses préenregistrées. ![Onglet AI settings avec les interrupteurs IA et Telegram, ainsi que les limites du live chat et les liens de raccourci](https://nexcmp.com/fr/docs/images/ai/ai-chat-01-settings.webp) ![Page de discussion client avec l'assistant, les boutons de raccourci Zalo et Telegram et l'option de parler à un humain](https://nexcmp.com/fr/docs/images/ai/ai-chat-02-portal.webp) ## Ce que l'assistant peut et ne peut pas faire {#what-the-assistant-can-and-cannot-do} - **Lecture :** il effectue des recherches dans votre base de connaissances et votre documentation publique, et lit les propres données du client connecté via des outils en lecture seule. Il ne peut pas voir un autre client. - **Action :** il utilise les propres permissions API du client. Une action de *lecture* s'exécute immédiatement. Tout ce qui modifie ou coûte de l'argent génère une **carte de confirmation** (avec la mention « Nécessite votre confirmation » et les étiquettes *Coûte de l'argent* ou *Supprimer*) ; rien ne se produit tant que le client ne clique pas sur **Confirm**. Une discussion peut contenir au maximum 3 cartes en attente et un compte au maximum 10 actions d'écriture confirmées par heure. - **Interdictions :** il ne peut pas ouvrir de consoles, créer de jetons SSH ou de console, télécharger de fichiers d'accès Kubernetes, réinitialiser de mots de passe ni afficher de secrets tels que les mots de passe de proxy ou les secrets S3. Les secrets ne sont jamais inclus dans le contexte du modèle ni dans l'historique de discussion. - **Sécurité :** ses réponses passent par un filtre de sortie ; le texte du client et les résultats des outils sont traités comme des données et non comme des instructions. - **Bannière d'honnêteté :** la discussion affiche la mention « Réponse générée par un assistant IA — peut comporter des imperfections. Parlez à un humain pour toute question critique. » ## Transfert au personnel {#staff-hand-off} 1. Le client clique sur **Talk to a human** et peut laisser une adresse e-mail. 2. Un message contenant la conversation est envoyé au chat Telegram du personnel. Le personnel répond en répondant à ce message ; la réponse apparaît dans la discussion du client sous le nom « [brand] Support ». 3. Si personne ne répond dans le délai d'attente imparti (10 minutes par défaut), la discussion se transforme en ticket sous **Customers › Support › Ticket**. Il en va de même immédiatement en dehors des heures de support ou lorsque Telegram n'est pas configuré, et le client est informé qu'un ticket a été ouvert. 4. Les administrateurs voient également les discussions en cours dans l'onglet **Live chat**. ## Vérification {#verify} 1. Connectez-vous en tant que client test, ouvrez la discussion et posez une question sur vos services. L'assistant répond. 2. Demandez-lui de créer un élément payant : une carte de confirmation apparaît et rien n'est créé tant que vous ne cliquez pas sur **Confirm**. 3. Cliquez sur **Talk to a human**. Le message arrive dans votre chat Telegram (s'il est configuré) ou, après le délai d'attente, un ticket apparaît. 4. Une fois les liens Zalo et Telegram renseignés, les deux boutons de raccourci apparaissent dans la discussion. ## Limites et notes {#limits-notes} - **Limites de taux (par IP) :** 20 messages par minute et quelques transferts par heure ; **40 messages par conversation**. Ces valeurs sont fixes. - **Coût :** chaque tour d'IA sollicite votre fournisseur. Réduisez le paramètre **AI turns / day / customer** pour plafonner les dépenses. - **La réponse automatique est désactivée par défaut.** Ne l'activez qu'après avoir observé les brouillons pendant un certain temps. - **Langues :** l'assistant répond dans la langue du client ; le vietnamien est détecté à partir du texte. - **Revendeurs :** les sites des revendeurs utilisent des tickets au lieu du widget. ## Dépannage {#troubleshooting} | Symptôme | Cause | Solution | |---|---|---| | Les clients ne voient pas la discussion | Module IA désactivé ou **Enable chat widget** désactivé | Activer les deux. | | « Connectez-vous pour utiliser AI Chat » | Le visiteur n'est pas connecté | Comportement attendu dans NexCMP : connectez-vous d'abord. | | L'assistant indique qu'aucun fournisseur d'IA n'est configuré | Fournisseur manquant, non utilisé ou clé manquante | Renseigner [AI provider](https://nexcmp.com/fr/docs/ai/ai-providers/). | | L'IA répond « parlez à un humain » après quelques questions | Limite quotidienne par client atteinte | Augmenter **AI turns / day / customer**. | | L'étiquette Telegram indique "no channel" | ID du bot ou du chat non configuré | Configurez [Telegram notifications](https://nexcmp.com/fr/docs/administration/telegram-notifications/). | | Bouton Zalo ou Telegram manquant | Le champ de lien est vide | Renseignez le lien. | | "Too many requests" dans le chat | Plus de 20 messages par minute provenant d'une seule IP | Patientez une minute. | | Conversation de chat pleine | 40 messages atteints | Démarrez une nouvelle conversation. | --- # AI Agent {#ai-agent} > **Où dans l'admin :** System › Settings › AI provider (`/settings/ai`) — commutateur de module et fournisseur ; System › Admin › License & updates (`/license`) — commutateur de module. **Où dans le portail :** AI Agent (`/ai/agent`) et la page `/chat/agent`, ou le mode **Agent** dans le chat. ## Description {#what-it-does} L'AI Agent se connecte à la propre VM Linux d'un client via SSH et exécute des tâches décrites en langage naturel : "check system health", "install Docker", "find recent errors", "free up disk space". Il affiche chaque commande qu'il propose ainsi que sa sortie. Les commandes en lecture seule peuvent s'exécuter automatiquement ; toute action modifiant le serveur attend que le client clique sur **Run**. ## Prérequis {#requirements} | Élément | Prérequis | |---|---| | Module IA et fournisseur | Le module **AI** activé et un [AI provider](https://nexcmp.com/fr/docs/ai/ai-providers/) fonctionnel. L'Agent requiert également un modèle compatible avec l'appel d'outils (tool calling). | | `openssh-client` sur le serveur du panneau | L'Agent exécute les commandes avec le programme `ssh` propre au panneau (`/usr/bin/ssh`). L'installateur installe `openssh-client` ; vérifiez avec `ssh -V`. Sans cela, l'Agent indique "ssh client is not installed on the panel server". | | Pas de passerelle SSH séparée | Dans l'installation par défaut, le service SSH intégré est utilisé et le terminal web `ssh-proxy` n'est **pas** requis. Ce n'est que lorsque la fonction optionnelle *web SSH* (`feature_ssh_web`) a été activée et que le service `ssh-proxy` est installé que l'Agent passe par `ssh-proxy` à la place. | | Réseau | Le serveur du panneau doit pouvoir joindre l'IP de la VM sur son port SSH (22 par défaut). Vérifiez les pare-feu et les groupes de sécurité entre le panneau et le réseau invité. | | VM | Possédée par le client, **en cours d'exécution**, non verrouillée, **Linux** (les machines virtuelles Windows sont refusées), avec une adresse IP publique ou accessible. | | Identifiants SSH | L'utilisateur et le mot de passe de connexion de la VM enregistrés par NexCMP (sauvegardés lors de la création de la VM ou de la réinitialisation de son mot de passe, chiffrés), ou la clé d'opérations du panneau si elle est installée. Si aucun des deux n'existe, l'Agent indique qu'il ne peut pas se connecter. | ## Préparer l'infrastructure {#prepare-the-infrastructure} 1. Vérifiez le client SSH sur le serveur du panneau : ```bash ssh -V sudo apt-get install -y openssh-client # only if missing ``` 2. Vérifiez que le serveur du panneau peut ouvrir une connexion SSH vers une VM invitée : ```bash nc -vz 198.51.100.10 22 ``` Remplacez l'adresse par l'IP d'une VM de test. Si cela échoue, corrigez d'abord le routage ou le pare-feu. 3. Assurez-vous que l'invité autorise la connexion par mot de passe pour l'utilisateur stocké par NexCMP (certaines images cloud la désactivent), ou que la clé d'opérations du panneau est installée sur l'invité. ## Connecter dans NexCMP {#connect-in-nexcmp} 1. Complétez [AI provider](https://nexcmp.com/fr/docs/ai/ai-providers/) : module activé, fournisseur enregistré, **Test connection** en vert. 2. Rien d'autre n'est configuré du côté administrateur. Le commutateur de module fait apparaître les entrées **AI Agent** dans le portail client. 3. En tant que client : ouvrez **AI Agent**, choisissez un serveur en cours d'exécution et cliquez sur **Choose server**. La page teste d'abord SSH avec une commande inoffensive fixe (aucun appel IA n'est utilisé) et affiche *SSH connected* ou la raison de l'échec. 4. Tapez une tâche ou choisissez un démarrage rapide (*Check system health*, *Install Docker*, *Install Nginx*, *Find recent errors*, *Security check*, *Free up disk space*). ## Comment il exécute les commandes {#how-it-runs-commands} - **Provenance :** le serveur du panneau, avec le client `ssh` du système, une commande non interactive à la fois. La cible est toujours l'IP de la VM **depuis la base de données**, jamais depuis la requête ; seule la VM active et déverrouillée du propriétaire peut être conjointe. - **Authentification :** le mot de passe stocké est transmis via un assistant `SSH_ASKPASS` unique dans l'environnement du processus — il n'est pas écrit sur le disque ni placé sur la ligne de commande. Les clés d'hôte ne sont pas épinglées (les VM sont réinstallées avec de nouvelles clés). La sortie par commande est limitée à 200 Ko et chaque commande dispose d'une limite de temps (60 secondes). - **Boucle de l'AI Agent :** l'IA propose des commandes et lit les sorties ; un tour se termine après au plus **10 étapes**. - **Modes :** | Mode | Comportement | |---|---| | **Confirm** | Chaque commande attend l'action **Run**. | | **Auto** | Seules les commandes qui passent une liste blanche stricte en lecture seule s'exécutent d'elles-mêmes (par exemple `df -h`, `ps`, `journalctl`). Tout le reste, et tout ce que l'analyseur ne peut pas analyser avec certitude (variables, substitution de commandes, redirection vers des fichiers), attend **Run**. | - **Libellés de risque :** les commandes qui écrasent ou suppriment des fichiers, écrivent sur des disques, modifient des comptes ou des clés SSH, envoient des données vers un serveur externe, ouvrent des connexions réseau brutes, exécutent du code obfusqué, téléchargent et exécutent un script, arrêtes ou redémarrent la machine, ou atteignent d'autres serveurs affichent toujours **Needs confirmation**, même en mode Auto. - **Sortie non fiabilisée :** la sortie de la commande est présentée au modèle en tant que donnée non fiabilisée ; les instructions qu'elle contient ne sont pas suivies. ## Vérification {#verify} 1. Choisissez une VM de test en cours d'exécution. La page indique *SSH connected*. 2. Demandez "Check CPU, RAM and disk". En mode Auto, les commandes en lecture seule s'exécutent et la réponse les résume. 3. Demandez "Install Nginx". La commande d'installation apparait avec **Run** et **Skip** ; rien ne s'exécute tant que vous n'appuyez pas sur **Run**. 4. Le compteur en haut affiche le nombre d'appels IA utilisés aujourd'hui (par exemple `3/300`). ## Limites et notes {#limits-notes} - **Limite quotidienne :** 300 appels IA par client et par jour (UTC) ; réinitialisation à 00:00 UTC. Lorsqu'elle est épuisée, l'AI Agent répond "Daily AI quota reached". - **Concurrence :** au plus 2 exécutions de l'AI Agent par client en même temps ; une session exécute un tour à la fois. - **Sessions :** jusqu'à 100 messages par session, 4,000 caractères par message. Une session appartient à une VM ; en cas de suppression ou de transfert, elle devient en lecture seule. - **VM verrouillée ou arrêtée, ou Windows :** la VM est affichée comme *Locked*, *Stopped*, *Windows* ou *No address* et ne peut pas être sélectionnée. - **Impersonnalisation :** un administrateur impersonnalisant un client ne peut pas utiliser les fonctionnalités d'identification de l'AI Agent (voir [Log in as a customer](https://nexcmp.com/fr/docs/customers/login-as/)). - **Responsabilité :** l'AI Agent peut faire des erreurs. Le portail indique aux clients de vérifier les commandes avant de les exécuter. Précisez aux clients dans vos conditions qu'ils sont responsables des commandes qu'ils approuvent. - Désactiver le module IA supprime les entrées de l'AI Agent et les routes renvoient l'erreur 404 `module_disabled`. ## Dépannage {#troubleshooting} | Symptôme | Cause | Solution | |---|---|---| | "le client ssh n'est pas installé sur le serveur du panneau (apt install openssh-client)" | Pas de binaire `ssh` | `sudo apt-get install -y openssh-client`. | | "L'Agent n'a pas pu se connecter" / `ssh: no saved credentials for this VM` | Aucun mot de passe enregistré et aucune clé d'opérations | Réinitialisez le mot de passe de la VM dans le portail pour qu'il soit enregistré à nouveau, ou installez la clé d'opérations. | | "Le serveur n'a pas répondu à temps" | Pare-feu, SSH n'écoutant pas, VM occupée | Testez `nc -vz 22` depuis le serveur du panneau ; démarrez `sshd` dans la VM. | | "Impossible d'atteindre SSH sur ce serveur" | Routage ou groupe de sécurité | Permettre au serveur du panneau d'atteindre la VM sur le port 22. | | "VM non démarrée" / "Interdit" | VM arrêtée, verrouillée, supprimée ou n'appartenant pas au client | La démarrer, la déverrouiller ou en choisir une autre. | | "Non disponible : N (arrêtée, verrouillée ou Windows)" | Raisons listées ci-dessus | La VM doit être sous Linux et en cours d'exécution. | | "La passerelle SSH est temporairement indisponible" | Fonctionnalité Web SSH activée mais `ssh-proxy` est hors ligne | Démarrez `ssh-proxy`, ou désactivez la fonctionnalité Web SSH pour utiliser le SSH intégré. | | "L'IA répond trop lentement (plus de 90 secondes)" | Fournisseur lent | Utilisez un modèle plus rapide ou un **Reasoning effort** plus faible. | | "Quota d'IA quotidien atteint" | 300 appels utilisés | Patientez jusqu'à 00:00 UTC. | | "Cette session est toujours en cours" | Autre tour en cours | Patientez ou appuyez sur **Stop**. | --- # REST API > **Où dans le portail :** Référence de l'API sur `https:///apidoc` (public) et clés API sur `/api-keys`. **Où dans l'admin :** Customers › API keys (`/customers/apikeys`) liste les clés créées par les clients. ## Description {#what-it-does} Chaque action qu'un client peut effectuer dans le portail — lister et contrôler des VM, lire des factures, gérer des clés SSH, Kubernetes, du stockage, des tickets de support — est disponible via une API REST versionnée sous `https:///v1/`. Les clients l'appellent depuis des scripts et des pipelines CI avec une **API key** à portée limitée. La même API alimente le [`cmp` command-line tool](https://nexcmp.com/fr/docs/developers/cmp-cli/) et le [MCP server](https://nexcmp.com/fr/docs/developers/mcp/), et la référence est générée à partir de l'installation en cours d'exécution, de sorte qu'elle liste toujours exactement les fonctionnalités que vous avez activées. ## Prérequis {#requirements} | Élément | Prérequis | |---|---| | Adresse HTTPS publique | L'API est hébergée sur votre domaine principal (et sur le propre domaine de chaque revendeur). | | Une clé API | Créée par le client dans le portail ; voir [API keys](https://nexcmp.com/fr/docs/developers/api-keys/). | | Dépendances | Aucun. Les points de terminaison d'un module que vous n'avez pas activé (par exemple Kubernetes ou Object Storage) sont masqués de la référence et refusés. | ## Préparer l'infrastructure {#prepare-the-infrastructure} Rien à installer. Si un proxy inverse se trouve devant NexCMP, transférez `/v1/`, `/mcp`, `/cli/` et `/apidoc` vers le panneau (la configuration nginx de l'installateur le fait déjà). ## Connecter dans NexCMP {#connect-in-nexcmp} ### La référence interactive {#the-interactive-reference} Ouvrez `https://cloud.example.com/apidoc` (remplacez l'hôte par votre domaine ; les clients d'un revendeur voient la référence sur le domaine du revendeur, avec le nom du revendeur). Elle propose une documentation des points de terminaison avec des exemples de requêtes et de réponses en curl, CLI `cmp`, JavaScript, Python et Go, une barre de recherche (Ctrl ou Cmd + K), et un panneau **Try it**. Try it envoie des requêtes uniquement vers le même site, avec une clé collée par le visiteur (conservée dans la session du navigateur) ; elle est en lecture seule par défaut, et les appels payants ou d'écriture nécessitent un commutateur supplémentaire et une confirmation. ### Téléchargements et documents lisibles par machine {#downloads-and-machine-readable-documents} Tous sont publics, ne nécessitent aucune clé et sont générés par site : | URL | Contenu | |---|---| | `/apidoc` | Référence interactive. | | `/v1/public/openapi.json` | Document OpenAPI 3.1. | | `/v1/public/openapi.yaml` | Identique, en YAML. | | `/v1/public/postman.json` | Collection Postman. | | `/v1/public/insomnia.json` | Exportation Insomnia. | | `/v1/public/api.md` | La référence sous forme de fichier Markdown unique. | | `/v1/public/api-catalog` | JSON léger : marque, URL de base, préfixe de clé, chaque portée et chaque point de terminaison avec méthode, chemin, portée et indication de la nécessité d'un `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 ``` Dans Postman, choisissez **Import › Link** et collez `https://cloud.example.com/v1/public/postman.json`. La page de référence propose également des clients API en un seul fichier pour JavaScript et Python. ### Authentification {#authentication} Envoyez la clé dans l'en-tête `Authorization` : ```bash curl -s https://cloud.example.com/v1/billing/wallet \ -H "Authorization: Bearer vk_XXXX" ``` - Les clés client commencent par `vk_`. Les clés sont **liées au site** : une clé créée sur `cloud.example.com` ne fonctionne pas sur le domaine d'un revendeur. - Les jetons de session du navigateur (`pt_...`) sont réservés au portail ; utilisez une clé pour l'automatisation. - Les **portées** de la clé déterminent ce qu'elle peut appeler ; une portée manquante renvoie une erreur HTTP 403 `scope_required`. Voir [API keys](https://nexcmp.com/fr/docs/developers/api-keys/). - Vérifiez une clé avec `GET /v1/apikeys/self` : elle renvoie le nom de la clé appelante, les portées, l'expiration et le quota de requêtes restant (toutes les clés peuvent l'appeler). ### Exemples {#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 ``` Récupérez les champs de requête exacts de chaque opération à partir de `/apidoc`. ### Erreurs {#errors} Chaque erreur est au format JSON avec un code `code` stable et un message explicite `message` : ```json {"error": {"code": "scope_required", "message": "Key lacks scope vm:write"}} ``` | HTTP | Code `code` typique | Description | |---|---|---| | 401 | `unauthenticated`, `key_invalid`, `key_revoked`, `key_expired`, `key_ip_denied`, `site_mismatch`, `api_keys_disabled` | Clé manquante ou inconnue, révoquée, expirée, IP de l'appelant hors de la liste blanche de la clé, clé provenant d'un autre site, ou clés API désactivées. | | 403 | `scope_required`, `endpoint_not_public`, `account_blocked`, `quota_exceeded`, `impersonate_forbidden` | La clé ne possède pas la portée requise ; le point de terminaison n'est pas accessible aux clés ; le compte est verrouillé ; un [quota](https://nexcmp.com/fr/docs/billing/quotas/) a été atteint ; action non autorisée dans une session usurpée. | | 404 | `not_found` | Introuvable — renvoyé également pour les ressources appartenant à quelqu'un d'autre. | | 422 | `invalid_argument` | Erreur de validation (champ nommé dans la réponse). | | 429 | `rate_limited` | Trop de requêtes ; patientez jusqu'à `Retry-After`. | | 503 | `maintenance` | Le mode maintenance est activé : les lectures fonctionnent, les écritures sont refusées. | ### Limites de taux {#rate-limits} | Limite | Valeur par défaut | |---|---| | Par clé | 120 requêtes par minute | | Par compte (toutes les clés confondues) | 300 requêtes par minute | Chaque réponse contient `X-RateLimit-Limit`, `X-RateLimit-Remaining` et `X-RateLimit-Reset` ; un code 429 ajoute `Retry-After`. ### Idempotence {#idempotency} Les commandes qui coûtent de l'argent ou ne peuvent pas être répétées (création, changement de forfait, achat, suppression ...) **nécessitent** un en-tête `Idempotency-Key` (n'importe quelle chaîne de caractères jusqu'à 200 caractères ; un UUID convient parfaitement). Renvoyez la même clé après un délai d'attente et le serveur renverra le résultat **original** (avec `Idempotency-Replayed: 1`) au lieu de répéter l'opération. Réutiliser une clé pour une commande différente renvoie 422 ; une requête encore en cours renvoie 409/`Retry-After`. Sans cet en-tête, un appel payant est refusé. ## Vérification {#verify} 1. Créez une clé avec la portée `vm:read` dans le portail (**API keys › Create key**). 2. Exécutez : ```bash curl -i https://cloud.example.com/v1/apikeys/self -H "Authorization: Bearer vk_XXXX" ``` Vous obtenez un code HTTP 200 et les en-têtes de limitation de débit. 3. `curl -s https://cloud.example.com/v1/vm -H "Authorization: Bearer vk_XXXX"` liste les VM du compte. Dans le portail, la colonne **Last used** de la clé et le journal **Key usage log** affichent les appels. ## Limites et notes {#limits-notes} - **Jamais accessibles avec une clé :** recharger son solde, retirer des fonds, modifier des cartes ou le rechargement automatique, changer le mot de passe, l'e-mail ou la 2FA, supprimer le compte, créer, modifier ou révoquer d'autres clés. Ces actions nécessitent une session de navigateur connectée. - **Modules masqués :** la documentation de référence et le document OpenAPI ne listent que les fonctionnalités activées sur ce site. - **Taille de réponse et pagination :** les points de terminaison de liste sont paginés (`page`, `per_page`) ; consultez le document OpenAPI pour chaque point de terminaison. - **Temps et argent :** les montants sont en centimes USD, sauf indication contraire dans le nom du champ. - **Admin API :** la console d'administration dispose de sa propre page **System › Admin › API** et de clés d'administrateur (`ofw_...`) dédiées à l'administration ; elles sont distinctes de l'API client décrite ici. - **Versionnement :** le préfixe de chemin `/v1` est stable ; de nouveaux champs peuvent être ajoutés aux réponses. ## Dépannage {#troubleshooting} | Symptôme | Cause | Solution | |---|---|---| | 401 sur une nouvelle clé | Clé provenant d'un autre domaine, expirée ou saisie avec des espaces | Créez la clé sur le domaine que vous appelez ; vérifiez l'en-tête `Authorization: Bearer vk_...`. | | 403 `scope_required` | Portée manquante | Modifiez la clé dans le portail et ajoutez la portée. | | 401 `key_ip_denied` ou `site_mismatch` | Clé restreinte à d'autres IP (« allowed IPs ») ou créée sur un autre domaine | Ajoutez l'IP de votre serveur aux IP autorisées de la clé, ou appelez le domaine sur lequel la clé a été créée. | | 404 sur une VM existante | La VM appartient à un autre compte | Utilisez une clé du propriétaire. | | 400/422 demandant `Idempotency-Key` | Opération payante sans l'en-tête | Ajoutez `Idempotency-Key: `. | | 429 | Limite dépassée | Patientez ; utilisez `Retry-After`. | | `/apidoc` affiche moins que prévu | Module désactivé | Activez le module dans License & updates. | --- # Clés API et portées {#api-keys-and-scopes} > **Où dans le portail :** API keys (`/api-keys`). **Où dans l'administration :** Customers › Customers › API keys (`/customers/apikeys`). ## Description {#what-it-does} Une **API key** permet à un script, à un job CI, au [`cmp` CLI](https://nexcmp.com/fr/docs/developers/cmp-cli/) ou à un assistant IA ([MCP](https://nexcmp.com/fr/docs/developers/mcp/)) d'appeler la [REST API](https://nexcmp.com/fr/docs/developers/api/) au nom d'un client, avec uniquement les autorisations (**scopes**) qui lui ont été accordées. Les clés client commencent par `vk_`. Elles peuvent lire et gérer les services, mais ne peuvent **jamais** toucher à l'argent ou au compte lui-même. ## Prérequis {#requirements} | Élément | Prérequis | |---|---| | Client | Une session de portail active (une clé ne peut ni créer ni modifier d'autres clés, et un administrateur usurpant l'identité d'un client ne le peut pas non plus). | | Bouton | Les clés API sont activées par défaut. Si elles sont désactivées, les appels renvoient 401 `api_keys_disabled`. | | Dépendances | Les scopes d'un produit n'apparaissent que lorsque ce produit est activé sur le site. | ## Créer une clé (client) {#create-a-key-customer} 1. Connectez-vous au portail et ouvrez **API keys**. 2. Cliquez sur **Create key**. 3. Remplissez le formulaire : | Champ | Règle | |---|---| | **Key name** | Obligatoire, jusqu'à 60 caractères ("deploy server", "backup script"). | | **Ce que cette clé peut faire** | Cochez les scopes dont vous avez besoin — au moins un. Une clé en lecture seule ne doit obtenir aucun scope d'écriture. Soyez prudent avec les scopes qui coûtent de l'argent ou suppriment des données. | | **Expiry** | Jamais, 30 jours, 90 jours ou 1 an (l'API accepte de 1 à 3650 jours). | | **N'autoriser les appels que depuis ces IP** | Une adresse IP ou une plage CIDR par ligne, jusqu'à 20 (IPv4 ou IPv6). Vide signifie n'importe quelle IP. Épinglez l'IP de votre serveur dès que possible. | 4. Confirmez le formulaire. La clé s'affiche **une seule fois** dans une fenêtre "Key created — shown ONCE". Copiez-la et cliquez sur **I saved the key**. Seul un hachage SHA-256 est stocké, de sorte qu'même un administrateur ne peut plus la lire ; si vous la perdez, révoquez-la et créez-en une nouvelle. 5. Le portail affiche également une `curl` commande prête à l'emploi pour tester la clé. Une clé se présente sous la forme `vk_` suivie d'une longue chaîne aléatoire. La liste n'affiche que les premiers caractères (par exemple `vk_a1b2c3d4`), les scopes, l'expiration, la dernière utilisation, le nombre de requêtes et le statut (*Active*, *Expired*, *Revoked*). ### Modifier, révoquer, auditer {#edit-revoke-audit} - **Edit** modifie le nom, les portées, les adresses IP autorisées et l'expiration. Cette action n'est pas autorisée lors d'une session usurpée. - **Revoke** désactive immédiatement la clé et cette action est irréversible. La ligne est conservée afin que le journal d'utilisation reste disponible. - **Key usage log** affiche les commandes d'écriture et toutes les erreurs des 60 derniers jours : heure, requête, clé, résultat et adresse IP source. - Un compte peut détenir au maximum **10 clés actives** par défaut. - Les clés créées via la CLI ou la connexion MCP apparaissent sous **Connected apps & devices** et peuvent y être révoquées. ## Portées {#scopes} Les noms de portées ont le format `area:action`. Celles qui sont proposées dépendent des produits que vous avez activés. | Portée | Autorise | |---|---| | `catalog:read` | Lecture des plans et du catalogue. | | `vm:read` | Lecture des VMs, des métriques et des factures de VM. | | `vm:write` | Actions d'alimentation, modifications mineures, pare-feu, instantanés rapides. | | `vm:create` | **Création de VMs (payant).** | | `vm:plan` | **Modification du plan ou redimensionnement (payant).** | | `vm:destroy` | **Suppression de VMs.** | | `vm:restore` | **Restauration d'une VM à partir d'un instantané (écrase le disque).** | | `vm:console` | Ouverture de tickets pour la console VNC. | | `sshkey:read`, `sshkey:write` | Lecture, ajout et suppression de clés SSH. | | `volume:read`, `volume:write`, `volume:create`, `volume:destroy` | Volumes de données (la création et l'agrandissement sont payants ; la suppression entraîne la perte des données). | | `backup:read`, `backup:write`, `backup:restore` | Backups (la restauration écrase le disque). | | `billing:read` | Portefeuille, factures, historique des paiements — **lecture seule**. | | `bandwidth:buy` | **Achat d'une option de bande passante supplémentaire (payant).** | | `account:read`, `account:write` | Profil, aperçu, activité, notifications ; `account:write` marque uniquement les notifications comme lues. | | `apikey:read` | Liste des clés du compte et journal d'utilisation (impossible de créer, modifier ou révoquer). | | `apikey:self` | Implicite sur chaque clé : inspection de la clé appelante (`GET /v1/apikeys/self`). | | `ticket:read`, `ticket:write` | Tickets de support. | | `aff:read`, `transfer:read` | Programme d'affiliation et transferts de services — lecture seule. | | `k8s:read`, `k8s:write`, `k8s:create`, `k8s:scale`, `k8s:destroy`, `k8s:kubeconfig` | Kubernetes (la création et la mise à l'échelle sont payantes ; le fichier kubeconfig donne les droits cluster-admin). | | `vpc:read`, `vpc:write`, `vpc:create`, `vpc:destroy` | Private Cloud. | | `image:read`, `image:write` | Images OS et ISO (le stockage est facturé à l'heure). | | `s3:read`, `s3:write`, `s3:create`, `s3:destroy`, `s3:keys` | Object Storage (le secret S3 n'est affiché qu'une seule fois). | | `vpn:read`, `vpn:detail`, `vpn:write`, `vpn:create`, `vpn:destroy` | VPN et proxy IPv6 (les détails de connexion incluent les mots de passe du proxy). | | `dedicated:read`, `dedicated:write`, `dedicated:console`, `dedicated:create`, `dedicated:destroy` | Serveurs dédiés (création de commandes depuis le portefeuille ; la suppression réinstalle l'OS). | | `shield:read`, `shield:write`, `shield:agent` | DDoS Shield, uniquement lorsque ce module est activé. | Un appel en dehors des portées de la clé renvoie **403 `scope_required`** ; un chemin qu'aucune clé ne peut appeler renvoie **403 `endpoint_not_public`**. ### Ce qu'une clé ne peut jamais faire {#what-a-key-can-never-do} Aucun scope n'ouvre l'accès à : recharger ou retirer de l'argent, modifier les cartes ou le rechargement automatique, changer le mot de passe, l'e-mail ou la 2FA, supprimer le compte, créer, modifier ou révoquer d'autres clés. Celles-ci nécessitent toujours un navigateur connecté. Même une clé compromise ne peut toucher à l'argent ou au compte du client. ## Règles sur lesquelles vous pouvez compter {#rules-you-can-rely-on} | Règle | Détail | |---|---| | Liée au site | Une clé fonctionne uniquement sur le site (domaine) où elle a été créée. | | Limites de taux | Par clé et par compte : 120 et 300 requêtes par minute par défaut. | | Idempotence | Les opérations qui coûtent de l'argent ou ne peuvent pas être répétées nécessitent un en-tête `Idempotency-Key`. | | Quotas | Une clé est soumise aux mêmes [quotas](https://nexcmp.com/fr/docs/billing/quotas/) que le client. | | Compte verrouillé | Les clés d'un client bloqué cessent de fonctionner (403 `account_blocked`). | | Audit | La révocation par un administrateur est consignée dans le journal d'audit administrateur. | ## Vue administrateur {#administrator-view} 1. Ouvrez **Customers › API keys** (`/customers/apikeys`). Le tableau affiche le nom de la clé et les premiers caractères, le propriétaire, les périmètres, le statut, la dernière utilisation (heure, nombre de requêtes, IP) et l'expiration. 2. Filtrez par site si vous avez des revendeurs. Recherchez par nom, ID ou début de clé. 3. Cliquez sur **Revoke** pour arrêter une clé active, ou sur **Log** pour consulter son utilisation. 4. Les administrateurs **voient et révoquent** les clés mais ne peuvent ni les lire ni les créer pour les clients. ![Liste administrateur des clés API client avec périmètres, statut, dernière utilisation et bouton Revoke](https://nexcmp.com/fr/docs/images/developers/api-keys-02-admin.webp) ## Vérification {#verify} 1. Créez une clé avec le périmètre `vm:read` uniquement. 2. `curl -s https://cloud.example.com/v1/vm -H "Authorization: Bearer vk_XXXX"` renvoie la liste des VM. 3. `curl -s -X POST .../v1/vm//start -H "Authorization: Bearer vk_XXXX"` répond par 403 `scope_required`. 4. Révoquez la clé ; le premier appel répond désormais par 401 `key_revoked`. ## Limites et notes {#limits-notes} - La clé n'est plus jamais affichée. Traitez-la comme un mot de passe et stockez-la dans un gestionnaire de secrets ou un secret CI. - Privilégiez une clé par script, des périmètres minimaux, une expiration courte et une liste d'adresses IP autorisées ; effectuez une rotation en créant une nouvelle clé et en révoquant l'ancienne. - Les clés issues d'une connexion d'appareil (CLI, MCP) expirent par défaut au bout de 90 jours. - Les ressources supprimées ou transférées ne sont pas affectées par la révocation d'une clé. ## Dépannage {#troubleshooting} | Symptôme | Cause | Solution | |---|---|---| | Erreur `too_many_keys` (422) | La limite de clés actives (10 par défaut) est atteinte | Révoquez une ancienne clé. | | Erreur `invalid_argument` : aucun périmètre choisi | Aucun périmètre cochée | Cochez au moins un périmètre. | | Erreur `invalid_argument` sur les IP autorisées | Une entrée n'est pas une IP ou une plage, la longueur du préfixe est incorrecte ou il y a plus de 20 entrées | Une IP ou un CIDR par ligne, par exemple `203.0.113.0/24`. | | La création est refusée pendant l'usurpation d'identité | `impersonate_forbidden` | Demandez au client de créer la clé. | | 401 `key_expired` | Date d'expiration dépassée | Créez une nouvelle clé. | | 401 `key_ip_denied` | IP de l'appelant absente de la liste autorisée | Ajoutez l'adresse IP ou effacez la liste. | | 401 `api_keys_disabled` | Fonctionnalité désactivée | Demandez à votre administrateur (paramètre `api_keys_enabled`). | --- # Outil en ligne de commande `cmp` {#cmp-command-line-tool} > **Où se trouve l'élément dans le portail :** les commandes d'installation se trouvent sur la référence API (`https:///apidoc`, section Command-line interface). Approbation d'une connexion : `https:///link`. Appareils connectés : API keys (`/api-keys`) › Connected apps & devices. ## Description {#what-it-does} `cmp` est un petit programme en ligne de commande destiné à vos clients (et à vous-même) qui transforme **chaque opération de l'API en commande** : `cmp vm list`, `cmp vm start `, `cmp billing invoice list`. Il est généré à partir du document OpenAPI de **votre** installation lors de la publication, de sorte que les commandes correspondent aux fonctionnalités que vous avez activées. Il s'agit d'un binaire statique unique pour Linux, macOS et Windows (amd64 et arm64) sans autre dépendance à installer. ## Prérequis {#requirements} | Élément | Prérequis | |---|---| | Serveur | Rien de plus. Les paquets de publication sont inclus dans la version de NexCMP et servis par le panneau à l'adresse `https:///cli/`. | | Machine client | Linux, macOS ou Windows (PowerShell 5.1+). `ssh-keygen` (OpenSSH 8.0+) est requis uniquement pour vérifier la signature. | | Identifiants | Une connexion par navigateur avec un code à usage unique, ou une [API key](https://nexcmp.com/fr/docs/developers/api-keys/). | | Réseau | HTTPS vers votre panel. Le CLI refuse d'envoyer une clé en clair sur `http://` sauf vers `localhost`. | ## Préparer l'infrastructure {#prepare-the-infrastructure} Rien. Le panel sert ces fichiers depuis `/cli/` (aucune compilation ni aucun téléversement requis) : | Fichier | Usage | |---|---| | `install.sh`, `install.ps1` | Installateurs pour Linux/macOS et Windows ; ils contiennent l'adresse de votre panel. | | `latest.json` | Version actuelle, liste des fichiers, tailles, sha256. | | `v/cmp___.tar.gz` ou `.zip` | Les programmes : linux amd64/arm64, darwin amd64/arm64/universal, windows amd64/arm64. | | `v/SHA256SUMS`, `SHA256SUMS.sig` | Sommes de contrôle et leur signature ed25519. | | `cmp-cli.pub` | La clé publique de la version. | ## Installer (client) {#install-customer} macOS et Linux : ```bash curl -fsSL https://cloud.example.com/cli/install.sh | sh ``` Windows PowerShell : ```powershell irm https://cloud.example.com/cli/install.ps1 | iex ``` L'installateur sélectionne le paquet correspondant au système et au processeur, télécharge `SHA256SUMS` et sa signature, vérifie la signature avec la clé intégrée au script, vérifie le hachage du paquet et installe `cmp` dans `/usr/local/bin` (en tant que root) ou `~/.local/bin` ; sous Windows, dans `%LOCALAPPDATA%\cmp\bin` (ajouté au `PATH` de l'utilisateur). Si une vérification échoue, rien n'est installé. | Variable | Description | |---|---| | `CMP_VERSION` | Installer cette version au lieu de la plus récente. | | `CMP_INSTALL_DIR` | Dossier d'installation. | | `CMP_REQUIRE_SIGNATURE` | `1` = abandonner lorsque la signature ne peut pas être vérifiée. | | `CMP_BASE_URL` | Base de téléchargement (pour les miroirs). | Téléchargement et vérification manuels : ```bash curl -fsSLO https://cloud.example.com/cli/latest.json sha256sum --check --ignore-missing SHA256SUMS ``` ![Section de référence API avec la commande cmp install pour macOS et Linux](https://nexcmp.com/fr/docs/images/developers/cmp-cli-01-install.webp) ## Connexion {#log-in} ```bash cmp login ``` 1. Le CLI affiche un **code** à usage unique et un lien (`https://cloud.example.com/link?code=WDJB-MJHT`), ouvre le navigateur et patiente. 2. Dans le navigateur, connectez-vous au portail, vérifiez le nom du client, l'appareil, l'adresse IP et le pays, cochez les autorisations (scopes) et choisissez la durée de vie de la clé (par défaut 90 jours). Les autorisations payantes ou supprimant des données restent décochées par défaut. Cliquez sur approuver. 3. Le CLI reçoit **sa propre clé**, distincte de celles créées manuellement par le client, et la stocke dans `~/.config/cmp/config.json` (mode `0600` ; `%APPDATA%\cmp` sous Windows). Elle apparaît sous **API keys › Connected apps & devices** et peut y être révoquée. Le code expire après 10 minutes. L'approbation nécessite une véritable session de portail connectée avec un e-mail vérifié — pas une autre clé ni une session usurpée. Options utiles : `--scopes vm:read,billing:read`, `--name "build server"`, `--no-browser`, `--profile`, `--api-url`. Pour l'intégration continue ou les serveurs sans navigateur, utilisez une clé provenant du portail : ```bash printf %s "$KEY" | cmp login --with-token export CMP_TOKEN=vk_XXXX # nothing is written to disk cmp whoami ``` ## Utilisation des commandes {#using-commands} ```text cmp [subgroup] [ ...] [flags] ``` - Les paramètres de chemin sont des arguments positionnels ; les paramètres de requête et les champs de corps deviennent des options en kebab-case (`--start-port 443`). - `--data '{"a":1}'`, `--data @file.json` ou `--data -` envoie un corps JSON complet ; les options remplacent ses champs. - `cmp help vm firewall add` (ou `--help`) affiche les détails de n'importe quelle commande. ```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 ``` Commandes intégrées : `login`, `logout`, `whoami`, `config`, `api`, `completion`, `version`, `update`, `help`. Tout le reste provient du document API. Options globales : | Option | Description | |---|---| | `-o, --output json\|table\|yaml` | Format. Par défaut `table` dans un terminal et `json` lors d'un tuyautage (pipe). | | `--profile`, `--api-url` | Connexion enregistrée et site utilisés. | | `-y, --yes` | Ignorer la confirmation pour les commandes destructrices ou payantes. | | `--idempotency-key ` | Choisir la clé d'une commande payante. | | `--retry ` | En cas d'erreur HTTP 429, attendre `Retry-After` et réessayer jusqu'à n fois. | | `--timeout ` | Secondes à attendre pour les en-têtes de réponse (60 par défaut). | | `--debug` | Afficher l'échange HTTP sur stderr, avec les clés masquées. | Les commandes qui **facturent le portefeuille ou suppriment des données** demandent une confirmation et, si elles sont payantes, envoient un jeton généré automatiquement `Idempotency-Key` (affiché sur stderr, ce qui vous permet de réessayer en toute sécurité avec `--idempotency-key`). Sans terminal, elles refusent à moins que `--yes` ne soit fourni. ### Codes de sortie {#exit-codes} | Code | Description | |---|---| | 0 | Succès | | 1 | Autre erreur (réseau, HTTP 4xx/5xx non répertorié) | | 2 | Erreur d'utilisation | | 3 | Non autorisé (401/403) | | 4 | Introuvable (404) | | 5 | Limite de taux atteinte (429) | | 6 | Confirmation requise ou refusée | | 130 | Interrompu | ### Profils et environnement {#profiles-and-environment} `cmp config` liste les profils ; `cmp config use ` bascule ; les clients d'un revendeur utilisent leur propre domaine : `cmp login --api-url https://shop.example.net --profile shop`. Priorité : indicateur, environnement, fichier de configuration. Variables : `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' ``` Complétion du shell : `cmp completion bash|zsh|fish|powershell`. ## Mise à jour et désinstallation {#update-and-uninstall} ```bash cmp version cmp update --check cmp update ``` `cmp update` télécharge `latest.json`, `SHA256SUMS` ainsi que la signature, vérifie la signature à l'aide de la clé publique **intégrée dans le binaire en cours d'exécution**, vérifie le hachage du paquet et ne se remplace qu'ensuite. Une rétrogradation (downgrade) nécessite `--force`. Lorsque vous mettez à jour NexCMP, le panneau sert la version de la CLI fournie avec la nouvelle version. Pour désinstaller, supprimez le binaire `cmp` et le répertoire de configuration (`cmp config path` l'indique). Révoquez la clé sous **API keys** si la machine est perdue. ## Vérification {#verify} 1. `cmp version` affiche la version et la version du document API. 2. `cmp login`, approuvez dans le navigateur, puis `cmp whoami` affiche le profil et l'URL de votre panneau. 3. `cmp vm list` renvoie vos VM ; `cmp vm list -o json | jq .` affiche le JSON brut. ## Limites et notes {#limits-notes} - La liste des commandes dépend de votre compilation : les paquets sont générés à partir du document OpenAPI de votre installation lors de la compilation de la version, de sorte qu'un produit désactivé dans votre version ne possède aucune commande. Utilisez `cmp api` pour un chemin que la CLI ne connaît pas. - La CLI est sous licence MIT. - Chaque paquet est signé avec une clé ed25519 ; la clé de signature est intégrée dans l'installateur et le binaire, et n'est pas récupérée au moment de la mise à jour. - Les clés sont limitées par clé et par compte (voir [REST API](https://nexcmp.com/fr/docs/developers/api/#rate-limits)). ## Dépannage {#troubleshooting} | Symptôme | Cause | Solution | |---|---|---| | `curl .../cli/install.sh` renvoie 404 | La version sur le serveur n'a pas de dossier CLI, ou l'hôte n'est pas couvert par la licence | Vérifiez `https:///cli/latest.json` et le domaine ; mettez à jour NexCMP. | | "la signature n'a pas pu être vérifiée" | `ssh-keygen` manquant ou trop ancien | Installez OpenSSH 8.0+, ou définissez `CMP_REQUIRE_SIGNATURE=0` uniquement si vous assumez le risque. | | `cmp login` indique que le code a expiré | 10 minutes se sont écoulées | Exécutez à nouveau `cmp login`. | | Code de sortie 3 | La clé n'a pas de portée, a expiré ou a été révoquée | `cmp whoami` ; créez ou réapprouvez avec davantage de portées. | | Code de sortie 6 dans un script | Commande payante ou destructive sans terminal | Ajoutez `--yes` (ainsi que votre propre `--idempotency-key`). | | "refuse d'envoyer une clé via http" | URL d'API HTTP simple | Utilisez `https://`, ou `CMP_ALLOW_HTTP=1` uniquement pour un laboratoire. | | Le navigateur ouvre le mauvais site | `--api-url` non défini pour un revendeur | `cmp login --api-url https://`. | --- # Serveur MCP {#mcp-server} > **Où dans le portail :** API reference › Tools (`https:///apidoc`) affiche le point de terminaison et les extraits pour le client ; les clés sont créées dans API keys (`/api-keys`). Il n'y a aucun paramètre dans l'admin : le point de terminaison fait partie du panneau. ## Description {#what-it-does} Le **Model Context Protocol (MCP)** permet à un assistant IA d'appeler des outils. NexCMP propose un point de terminaison MCP sur `https:///mcp`. Chaque opération d'API publique devient un **outil** (`vm_list`, `vm_start`, `billing_wallet`, ...), de sorte qu'un client peut demander à son assistant « quelles sont mes VM en cours d'exécution ? » ou « arrête la VM de staging ». L'assistant agit exclusivement avec la clé API et les autorisations du client. ::: tip Vous configurez NexCMP vous-même avec l'IA ? Cette page concerne le point de terminaison MCP **client** (`/mcp`). Pour permettre à un assistant IA de configurer votre propre panneau en tant qu'administrateur, consultez [Configure with AI](https://nexcmp.com/fr/docs/configure-with-ai/mcp-admin/) (point de terminaison `/mcp/admin`, clés d'administration `ak_`). ::: ## Prérequis {#requirements} | Élément | Prérequis | |---|---| | Serveur | Rien à installer : le point de terminaison est desservi par le panneau et accessible partout où le panneau l'est. Votre proxy inverse doit transmettre `/mcp` au panneau. | | Client | Une [API key](https://nexcmp.com/fr/docs/developers/api-keys/) (`vk_...`) disposant des portées nécessaires à l'assistant. | | Client | Un client MCP prenant en charge le transport **Streamable HTTP** et un en-tête `Authorization` personnalisé : Claude Code, Claude Desktop (via le pont `mcp-remote`), Cursor, VS Code en mode agent Copilot et similaires. | | Versions du protocole | 2025-11-25, 2025-06-18 et 2025-03-26. | ## Préparer l'infrastructure {#prepare-the-infrastructure} Rien de particulier, si ce n'est de s'assurer que `https:///mcp` n'est bloqué ni par un pare-feu ni par une règle de proxy. Un client MCP basé sur un navigateur provenant d'une autre origine est refusé à moins que cette origine ne soit autorisée ; les clients en ligne de commande et de bureau n'envoient aucun en-tête `Origin` et fonctionnent tels quels. ## Connexion (côté client) {#connect-customer-side} 1. Créez une clé API dans le portail (**API keys › Create key**) en ne sélectionnant que les portées que vous souhaitez autoriser pour l'assistant, avec une courte durée de validité et, si possible, une restriction IP. 2. Ajoutez le serveur à votre client. Remplacez `cloud.example.com` et la clé. **Claude Code** ```bash claude mcp add --transport http cloud https://cloud.example.com/mcp \ --header "Authorization: Bearer vk_XXXX" ``` **Cursor** (`~/.cursor/mcp.json` ou `.cursor/mcp.json` ; définissez `CLOUD_API_KEY` dans l'environnement à partir duquel Cursor démarre) : ```json { "mcpServers": { "cloud": { "url": "https://cloud.example.com/mcp", "headers": { "Authorization": "Bearer ${env:CLOUD_API_KEY}" } } } } ``` **Claude Desktop** (nécessite Node.js 18+ ; `claude_desktop_config.json`), via le pont `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" } } } } ``` Écrivez l'en-tête sans espace après les deux-points et placez toute la valeur dans la variable d'environnement, comme ci-dessus. 3. Redémarrez le client et demandez-lui de lister vos outils. Vérifiez la connexion sans client : ```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"}' ``` ## Comment ça fonctionne {#how-it-works} | Élément | Détail | |---|---| | Endpoint | `POST /mcp` avec un message JSON-RPC 2.0 ; la réponse est `application/json`. `GET /mcp` répond par 405 (pas de flux serveur à client) ; `DELETE /mcp` met fin à la session. | | Authentification | Seul `Authorization: Bearer vk_...` (les jetons de session, les cookies et les clés d'administration sont refusés avec un code 401 et un en-tête `WWW-Authenticate: Bearer`). | | Session | `Mcp-Session-Id` est émis par `initialize`, lié à cette clé et valide pendant 24 heures ; au maximum 16 sessions par clé. | | Outils | Un par opération d'API publique visible par la clé. Le nom de l'outil correspond à la commande CLI en remplaçant les espaces et les tirets par `_` (`vm firewall add` devient `vm_firewall_add`) et équivaut au champ OpenAPI `operationId`. Un outil n'est listé que lorsque la clé possède sa portée et que le module est activé. | | Fonctionnalités | Outils uniquement (pas de ressources ni de prompts). | | Taille | Corps de requête jusqu'à 1 Mo ; texte de résultat d'outil jusqu'à environ 100 Ko (le reste est tronqué avec une note) ; un appel prend au maximum 55 secondes. | ### Règles de sécurité {#safety-rules} - **Même passerelle que l'API REST.** Chaque `tools/call` passe par le pipeline de requêtes propre au panneau : portée, site, restriction IP, limitation de débit, idempotence, vérifications de propriété (404 pour les ressources d'autrui) et quotas s'appliquent tous. Le protocole MCP ne peut rien accorder que la clé ne possède pas. - **Confirmation.** Les outils payants, destructifs ou renvoyant des informations d'identification (tickets de console, kubeconfig, secrets S3 ou SSH, réinitialisations de mot de passe, nouvelles clés) nécessitent l'argument `confirm: true`. La description de l'outil indique à l'assistant de ne le transmettre qu'après approbation de l'utilisateur, empêchant ainsi toute instruction dissimulée dans une page web ou un journal de l'exécuter de son propre chef. - **Idempotence.** Les outils payants acceptent `idempotency_key` ; si cet argument est omis, une clé stable est dérivée du nom de l'outil et de ses arguments, empêchant qu'une nouvelle tentative identique ne soit facturée deux fois. - **Non exposés en tant qu'outils :** les points de terminaison de streaming (le chat de l'AI Agent), les tickets WebSocket ponctuels pour SSH ou console, les téléchargements binaires et les points de terminaison de l'application VPN (`/v1/ext/*`). - **Jamais possible :** l'API ne permet en aucun cas d'effectuer des recharges, de changer de mot de passe, de supprimer le compte ou de créer des clés, ce qu'aucun assistant ne peut donc faire. ### Limites {#limits} | Limite | Valeur par défaut | |---|---| | Appels d'outils par clé | 60 par minute | | Requêtes MCP par clé | 240 par minute | | Plus les limites normales de clé et de compte | Voir [REST API](https://nexcmp.com/fr/docs/developers/api/#rate-limits) | En cas de dépassement de la limite, le point de terminaison renvoie une erreur HTTP 429 avec une erreur JSON-RPC et `Retry-After`. ## Vérification {#verify} 1. La commande `curl` ci-dessus renvoie un résultat JSON-RPC avec une liste `tools`. Seuls les outils correspondant aux portées de la clé apparaissent. 2. Dans votre client, demandez "list my VMs" : l'assistant appelle `vm_list` et affiche le résultat. 3. Dans le portail, l'heure **Last used** de la clé est mise à jour et les appels d'écriture apparaissent dans le journal **Key usage log**. ## Limites et notes {#limits-notes} - **Connexion par navigateur (OAuth).** La page de référence décrit également la connexion via le navigateur pour les clients prenant en charge l'OAuth MCP. Dans une instance NexCMP installée, la méthode prise en charge et testée est la clé API (ou `cmp login` pour la CLI). - **Les sites revendeurs** n'affichent pas la section MCP ; leurs clients utilisent le domaine du revendeur pour l'API. - **Moindre privilège.** Créez une clé dédiée par assistant avec des portées en lecture en premier ; n'ajoutez des portées en écriture que lorsque cela est nécessaire. - Révoquez la clé dans **API keys** pour couper immédiatement l'accès de l'assistant. ## Dépannage {#troubleshooting} | Symptôme | Cause | Solution | |---|---|---| | 401 avec `WWW-Authenticate: Bearer` | Aucune clé, clé erronée ou jeton de session | Envoyer `Authorization: Bearer vk_...`. | | 403 concernant `Origin` | Page de navigateur sur une autre origine | Utilisez un client de bureau ou CLI, ou demandez à votre administrateur d'autoriser l'origine (`mcp_allowed_origins`). | | 404 sur une requête avec `Mcp-Session-Id` | La session appartient à une autre clé ou a expiré | Exécutez à nouveau `initialize`. | | 405 sur `GET /mcp` | Attendu : le serveur ne dispose d'aucun flux d'événements | Utilisez uniquement POST (les clients le font automatiquement). | | La liste des outils est courte | Portées ou modules de la clé | Ajoutez des portées à la clé ; activez le module. | | L'outil indique qu'il a besoin de `confirm: true` | Outil payant, de suppression ou sensible | L'assistant doit définir `confirm` après votre approbation. | | 429 | Limite de débit MCP ou de la clé | Attendre `Retry-After`. | | Le client ne peut pas se connecter avec un en-tête | Client sans prise en charge des en-têtes personnalisés | Utilisez le pont `mcp-remote`. | --- # Configurer avec l'IA {#configure-with-ai} > **Où dans l'administration :** AI Chat (`/agent`) et System › Settings › API & AI agents (`/agent/keys`). Tout sur ces pages est réservé aux administrateurs. ## Description {#what-it-does} À partir de NexCMP 1.4.0, vous pouvez demander à un assistant IA de configurer le panneau pour vous : connecter Proxmox VE ou CloudStack, créer une zone, établir un tableau de forfaits à partir de vos coûts, configurer les e-mails, les paiements et l'image de marque, trouver un client ou exporter toute la configuration. L'assistant utilise un ensemble fixe d'**outils d'administration**. Il n'accède jamais à un shell, ne lit aucun fichier sur le serveur et ne voit jamais de mot de passe stocké ni de clé API. Utilisez cette fonction pour obtenir une première configuration en quelques minutes au lieu de parcourir des dizaines de pages, ou lorsque vous gérez plusieurs installations et souhaitez conserver leur configuration dans un fichier. ## Trois façons de l'utiliser {#three-ways-to-use-it} | Méthode | Qui parle à l'IA | Où elle s'exécute | Commencer ici | |---|---|---|---| | **AI Chat dans l'administration** | Vous, dans l'administration de NexCMP | La source d'IA de votre choix : une clé API OpenAI, Anthropic, Gemini ou OpenRouter, le fournisseur d'IA de votre propre panneau ou une CLI d'IA officielle à laquelle vous vous êtes connecté | [AI Chat dans l'administration](https://nexcmp.com/fr/docs/configure-with-ai/ai-chat-in-admin/) | | **Votre propre client IA via MCP** | Vous, dans Claude Code, Codex CLI, Gemini CLI, Cursor, Claude Desktop, claude.ai ou ChatGPT | Sur votre machine ou dans l'application du fournisseur, connecté à votre panneau sur `https://cloud.example.com/mcp/admin` | [Connect an AI client](https://nexcmp.com/fr/docs/configure-with-ai/mcp-admin/) | | **Configuration as code** | Vous ou un script | Un fichier YAML et la commande `nexcmp config` sur le serveur (ou la page Import/Export) | [Configuration as code](https://nexcmp.com/fr/docs/configure-with-ai/config-as-code/) | Ces trois méthodes font appel aux mêmes outils et passent par la même couche de sécurité, ce qui vous permet de les combiner : rédiger une configuration avec un assistant, l'exporter au format YAML, l'examiner dans votre éditeur et l'appliquer ultérieurement. ## Modèle de sécurité {#safety-model} | Règle | Ce que cela implique pour vous | |---|---| | **Portées (Scopes)** | Une clé ou une connexion est limitée aux portées que vous cochez (`admin:read`, `catalog:write`, `infra:write`, `billing:write`, `customers:write`, `settings:write`, `ai:write`, `secrets:write`). Sans portée, l'appel est refusé. Voir [Admin API keys](https://nexcmp.com/fr/docs/configure-with-ai/admin-api-keys/#scopes). | | **Expiry** | Chaque clé et connexion expire : 1 à 90 jours pour les clés que vous créez, 30 jours par défaut. Les jetons d'accès OAuth durent une heure. | | **Restriction IP et limite de débit** | Une clé peut être limitée à des plages d'adresses IP et à un nombre d'appels par minute (120 par défaut). | | **Confirmation en deux étapes** | Les actions qui transfèrent de l'argent, suppriment des données, modifient des identifiants de paiement ou changent la sécurité de connexion affichent d'abord un aperçu et n'effectuent aucune action tant que vous ne les approuvez pas. Dans AI Chat, chaque modification est une carte de confirmation sur laquelle vous devez cliquer vous-même. | | **Actions interdites aux clés** | Créer des administrateurs, modifier la double authentification (2FA), créer ou révoquer des clés, se connecter en tant que client, sauvegarder, restaurer ou mettre à jour le panneau, et autres actions similaires. Celles-ci nécessitent votre intervention dans l'administration. | | **Journal d'activité** | Chaque appel, qu'il soit autorisé ou refusé, est enregistré avec la clé, le client, l'outil, l'adresse IP et le résultat. Voir System › Settings › API & AI agents › Activity. | | **Les secrets ne sont jamais renvoyés** | Les mots de passe, clés API et jetons peuvent être définis mais ne peuvent jamais être relus. Les réponses vues par l'IA les affichent masqués. | | **Les installations de démonstration sont en lecture seule** | Sur un panneau de démonstration, toute écriture est refusée avec `demo_read_only`. | ::: important Ce que l'IA peut lire Avec `admin:read`, un assistant peut lire les noms des clients, les adresses e-mail, les soldes et les historiques de facturation. Lorsque vous utilisez une source d'IA hébergée chez un fournisseur (OpenAI, Anthropic, Google, OpenRouter), ces données lui sont envoyées pour répondre à votre question. Attribuez à l'assistant le jeu de permissions minimal nécessaire et choisissez une source de confiance pour ces données. ::: ## Quick start {#quick-start} 1. Connectez-vous à l'administration et ouvrez **AI Chat**. Si aucune source d'IA n'est encore connectée, ouvrez **System › Settings › AI accounts** et connectez-en une (voir [AI accounts and subscriptions](https://nexcmp.com/fr/docs/configure-with-ai/ai-accounts-and-subscriptions/)). 2. Tapez "Check my setup progress" et appuyez sur Entrée. L'assistant lit la [Setup progress checklist](https://nexcmp.com/fr/docs/configure-with-ai/setup-checklist/) et vous indique ce qu'il reste à faire. 3. Demandez-lui d'effectuer l'étape suivante. Examinez chaque carte de confirmation et appuyez sur **Confirm** pour l'appliquer. Pour un premier aperçu des questions à poser, consultez [Example prompts](https://nexcmp.com/fr/docs/configure-with-ai/example-prompts/). ![Page AI Chat avec une conversation, le résultat d'un outil et une carte de confirmation](https://nexcmp.com/fr/docs/images/configure-with-ai/overview-01-ai-chat.webp) ## Limites et notes {#limits-notes} - **Démo et lecture seule.** Les pages sont visibles sur un panneau de démonstration, mais rien ne peut y être enregistré. - **Pas de shell.** L'assistant peut uniquement appeler les outils d'administration listés dans [Connect an AI client](https://nexcmp.com/fr/docs/configure-with-ai/mcp-admin/#tools). Il ne peut pas exécuter de commandes sur le serveur. - **Les modules réseau et de routage** (BGP, XDP, interfaces, NAT et similaires) sont en lecture seule pour l'IA, et les zones sensibles telles que les comptes administrateur, les sauvegardes et les mises à jour sont totalement interdites aux clés. - **Les prix** sont en USD : les tarifs des forfaits en dollars par heure, et les soldes en centimes. - **Coût.** Les réponses de l'IA sont facturées par la source d'IA que vous connectez (utilisation de l'API ou votre propre abonnement). Dans AI Chat, vous pouvez définir un plafond de dépenses quotidien. Pour le modèle de licence NexCMP, consultez https://nexcmp.com/pricing. ## Dépannage {#troubleshooting} | Symptôme | Cause | Solution | |---|---|---| | AI Chat indique qu'aucune source d'IA n'est connectée | Aucune source configurée pour votre compte administrateur | Ouvrez System › Settings › AI accounts et connectez-en une. | | Un assistant répond `insufficient_scope` | La clé ou la connexion ne dispose pas des permissions requises pour cet outil | Créez une clé dotée de la permission nécessaire, ou reconnectez-vous et cochez-la sur l'écran de consentement. Voir [Admin API keys](https://nexcmp.com/fr/docs/configure-with-ai/admin-api-keys/#errors). | | Chaque modification affiche une carte de confirmation | Comportement attendu dans AI Chat | Appuyez sur **Confirm** pour appliquer ou sur **Reject** pour annuler. | | Les écritures échouent avec `demo_read_only` | Le panneau est en mode démonstration | Utilisez une installation hors démo. | --- # AI Chat dans l'administration {#ai-chat-in-the-admin} > **Où le trouver dans l'administration :** AI Chat (`/agent`, son propre menu) et le bouton flottant **Ask AI** sur chaque page d'administration. Les sources de réponses se configurent dans System › Settings › AI accounts (`/agent/accounts`). ## Description {#what-it-does} AI Chat est un assistant intégré à l'administration. Vous décrivez ce que vous souhaitez ("connect my Proxmox cluster", "set up email"), l'assistant lit l'état actuel à l'aide des outils d'administration, propose des modifications et présente chacune d'elles sous la forme d'une **carte de confirmation**. Rien n'est appliqué tant que vous n'avez pas appuyé sur **Confirm**. Le panneau **Ask AI** correspond au même chat dans un panneau latéral étroit, ce qui vous permet de poser des questions tout en consultant une page. Des boutons tels que **Do it for me** (dans la [Setup progress checklist](https://nexcmp.com/fr/docs/configure-with-ai/setup-checklist/) et dans les listes vides) l'ouvrent avec une question pré-remplie. Il ne s'agit pas de l'[AI Chat](https://nexcmp.com/fr/docs/ai/ai-chat/) et de l'[AI Agent](https://nexcmp.com/fr/docs/ai/ai-agent/) destinés aux clients. ## Prérequis {#requirements} | Élément | Prérequis | |---|---| | Rôle | Un administrateur connecté. Les discussions, clés et préférences appartiennent à votre compte administrateur ; les autres administrateurs ne les voient pas. | | Une source de réponse | Au moins un élément connecté : une clé API, une connexion, le fournisseur d'IA propre au panneau ou une CLI d'IA à laquelle vous êtes connecté. Voir [AI accounts and subscriptions](https://nexcmp.com/fr/docs/configure-with-ai/ai-accounts-and-subscriptions/). | | Démo | Sur un panneau de démonstration, vous pouvez lire les anciennes discussions mais pas envoyer de messages. | ## Choisir l'origine des réponses {#choose-where-answers-come-from} Sélectionnez la source dans le menu déroulant sous le champ de saisie (il répertorie les sources que vous avez connectées). **System › Settings › AI accounts** permet également de définir une source par défaut, un modèle par défaut et le plafond journalier. | Source | Comment vous la connectez | Remarques | |---|---|---| | OpenAI (modèles ChatGPT) | Collez une clé API obtenue sur platform.openai.com | Facturé par OpenAI à l'utilisation. | | Anthropic (Claude) | Collez une clé API obtenue sur console.anthropic.com | Facturé par Anthropic à l'utilisation. | | Google Gemini | Collez une clé API obtenue sur aistudio.google.com ou **Sign in with Google** | La connexion avec Google nécessite un client OAuth que **vous** créez dans votre propre projet Google Cloud. | | OpenRouter | Collez une clé ou **Sign in with OpenRouter** | Un seul compte pour de nombreux modèles. | | Fournisseur d'IA du panneau | Déjà configuré dans System › Settings › AI provider | Le même fournisseur que celui utilisé par l'AI Chat de vos clients. [AI provider](https://nexcmp.com/fr/docs/ai/ai-providers/). | | Abonnement Claude, ChatGPT ou Gemini | CLI officielle installée et connectée sur le serveur du panneau | Voir [AI accounts and subscriptions](https://nexcmp.com/fr/docs/configure-with-ai/ai-accounts-and-subscriptions/). | Les clés que vous collez sont stockées de manière chiffrée pour votre compte administrateur uniquement. Elles ne sont plus jamais affichées et un autre administrateur ne peut pas les déchiffrer. ## Utiliser le chat {#use-the-chat} 1. Ouvrez **AI Chat** (ou cliquez sur **Ask AI**). 2. Cliquez sur **New chat** ou ouvrez une discussion précédente dans la liste à gauche. 3. Tapez votre requête et appuyez sur Entrée (Shift+Entrée insère un saut de ligne). Vous pouvez joindre des images ou des fichiers texte (jusqu'à 4 par message, 3 Mo chacun) pour illustrer une erreur ou coller un document. 4. Observez la réponse s'afficher en continu. Chaque outil appelé par l'assistant apparaît sous forme de carte repliable indiquant le nom de l'outil, ses arguments et un court résultat. 5. Appuyez sur **Stop** pour annuler une réponse en cours. Une seule réponse s'exécute à la fois par administrateur. ![AI Chat avec la liste des conversations, une réponse contenant des cartes d'outils et le champ de saisie avec le sélecteur de source et le champ Secret](https://nexcmp.com/fr/docs/images/configure-with-ai/ai-chat-in-admin-01-chat.webp) Jusqu'à 10 tours d'outils peuvent avoir lieu par message. L'assistant mémorise les 30 derniers messages de la discussion. Les résultats des outils sont transmis au modèle en tant que données et non en tant qu'instructions. ## Cartes de confirmation {#confirmation-cards} Dans AI Chat, **chaque modification fait l'objet d'une carte**, et pas seulement les actions financières. L'assistant propose ; vous décidez. Une carte indique : - Un titre expliquant pourquoi elle requiert votre attention, par exemple « modifications du solde d'un client ». - L'appel : méthode et chemin. - Un tableau des champs modifiés : la valeur actuelle et la nouvelle. Les valeurs secrètes apparaissent sous la forme `••••`. - Un compte à rebours (les cartes expirent après 5 minutes). - **Confirm** et **Reject**. **Confirm** demande au panneau lui-même d'appliquer la modification, puis indique à l'assistant ce qui s'est passé. L'assistant ne peut pas appuyer sur le bouton, ne peut pas approuver via l'API et a instruction de ne jamais affirmer qu'une modification a été appliquée avant qu'elle ne soit confirmée. Si vous rechargez la page, les cartes encore valides réapparaissent. Elles s'affichent également en haut de **System › Settings › API & AI agents** sous "Waiting for your confirmation". ![Carte de confirmation indiquant le changement de solde, le compte à rebours et les boutons Confirm et Reject](https://nexcmp.com/fr/docs/images/configure-with-ai/ai-chat-in-admin-02-confirm.webp) ## Secrets {#secrets} Les mots de passe et clés d'API ne doivent pas transiter par le texte du chat. Utilisez le champ **Secret** (icône de cadenas) situé à côté de la saisie : 1. Cliquez sur l'icône de cadenas et saisissez un **nom** (lettres, chiffres et underscore, par exemple `smtp_password`) ainsi que la **valeur**. 2. Dans votre message, faites référence au nom : "utilise le secret smtp_password comme mot de passe SMTP". 3. L'assistant ne voit jamais qu'un espace réservé représentant le secret, écrit de cette façon : ```text {{secret:smtp_password}} ``` Le panneau le remplace par la valeur réelle au moment d'exécuter l'outil. La valeur n'est pas enregistrée dans l'historique du chat et n'est pas envoyée à la source IA. Si vous collez par erreur dans le message un élément ressemblant à une clé, le panneau le déplace dans le même stockage protégé et le masque dans l'historique, mais considérez cela comme un filet de sécurité et non comme une méthode. Les secrets restent uniquement en mémoire dans le panneau, pour la conversation dans laquelle ils ont été saisis et jusqu'à une heure après son dernier message ; un redémarrage du panneau les efface également. Saisissez-les à nouveau si l'assistant le demande. La définition d'un secret requiert également la permission `secrets:write` pour la session de chat (voir ci-dessous). ## Permissions du chat {#permissions-of-the-chat} Chaque message s'exécute avec une clé temporaire qui existe le temps de la réponse (au maximum 15 minutes), fonctionne uniquement depuis le serveur du panneau et ne peut être utilisée que via les cartes de confirmation. Ses portées sont celles cochées dans **System › Settings › AI accounts › Chat session permissions**. `admin:read` est toujours actif. Toutes les portées sauf `secrets:write` sont actives par défaut ; cochez `secrets:write` si vous souhaitez que l'assistant puisse définir des mots de passe et des clés (via le champ Secret). Sur un panneau de démonstration, le chat est en lecture seule. ## Plafond de dépenses quotidien {#daily-spending-cap} AI Chat additionne le coût estimé des réponses provenant des sources API. Le plafond par défaut est de **5 USD par administrateur et par jour**. Définissez un autre montant (0 signifie pas de limite) sous **AI accounts › Defaults for AI Chat**. La page affiche "used today". Lorsque le plafond est atteint, le chat refuse les nouveaux messages (`daily_cap`) jusqu'au lendemain ou jusqu'à ce que vous augmentiez le plafond. Les sources qui sont des abonnements AI CLI ne sont pas comptabilisées, car elles sont facturées par votre abonnement. ## Vérification {#verify} 1. Dans **AI accounts**, cliquez sur **Test** sur la source. Elle répond avec le nom du modèle et le temps en millisecondes. 2. Dans AI Chat, demandez "Check my setup progress". La réponse liste les étapes de la [checklist](https://nexcmp.com/fr/docs/configure-with-ai/setup-checklist/) et une carte d'outil `setup_checklist` apparaît. 3. Demandez une modification mineure, par exemple "Set the brand name to Example Cloud". Une carte de confirmation apparaît ; appuyez sur **Confirm** et vérifiez la page Branding. 4. **API & AI agents › Activity** liste les appels avec le canal `chat`. ## Limites et notes {#limits-notes} - L'assistant n'a pas de shell et ne peut pas lire les fichiers sur le serveur. Il appelle uniquement les [admin tools](https://nexcmp.com/fr/docs/configure-with-ai/mcp-admin/#tools). - Les modifications que les clés ne peuvent jamais effectuer ([list](https://nexcmp.com/fr/docs/configure-with-ai/admin-api-keys/#what-a-key-can-never-do)) ne peuvent pas non plus être effectuées depuis AI Chat. - Vérifiez le travail du modèle. Une carte de confirmation montre exactement ce qui sera envoyé ; lisez-la, en particulier les prix et les montants. - Les réponses de l'API sont facturées par le fournisseur d'IA. Le plafond est une estimation ; définissez également une limite de dépenses chez le fournisseur. - Une réponse CLI s'arrête après 5 minutes. ## Dépannage {#troubleshooting} | Symptôme | Cause | Solution | |---|---|---| | "Limite de dépenses IA du jour atteinte" (`daily_cap`) | Vous avez atteint la limite quotidienne | Augmentez-la dans les comptes IA ou attendez demain. | | "Une autre réponse est déjà en cours d'exécution — attendez ou appuyez sur Stop" (`busy`) | Une seule réponse à la fois par administrateur | Appuyez sur **Stop** ou attendez. | | La source n'apparaît pas dans le sélecteur | Elle n'est pas connectée ou (Claude CLI) l'option "I understand" est désactivée | Connectez-la dans les comptes IA. | | "cela ne ressemble pas à une clé API" | La clé collée comporte des espaces ou est trop longue | Collez uniquement la clé. | | Le test échoue | Clé incorrecte, absence de crédit ou panne du fournisseur | Vérifiez la clé et la facturation chez le fournisseur. | | L'assistant indique qu'il ne peut pas effectuer une action | La session de chat ne dispose pas de la portée ou l'action est interdite à l'IA | Cochez la portée dans les comptes IA ou effectuez l'action dans l'administration. | | Une carte indique qu'elle a expiré | Plus de 5 minutes se sont écoulées | Demandez à l'assistant de proposer à nouveau la modification. | | La source CLI signale une "limite d'utilisation" ou une "connexion requise" | Votre limite d'abonnement ou session | Reconnectez-vous ou attendez ; voir [AI accounts and subscriptions](https://nexcmp.com/fr/docs/configure-with-ai/ai-accounts-and-subscriptions/). | --- # Comptes et abonnements IA {#ai-accounts-and-subscriptions} > **Où dans l'administration :** System › Settings › AI accounts (`/agent/accounts`), onglets **Accounts** et **Use your own AI subscription**. Le terminal optionnel est AI Console (`/agent/console`), qui n'apparaît sous AI Chat que lorsqu'il est activé. ## Description {#what-it-does} L'AI Chat a besoin d'une source pour répondre. Cette page vous permet de connecter cette source pour votre propre compte administrateur : - **Sources API** : OpenAI, Anthropic (Claude), Google Gemini et OpenRouter, avec une clé API ou une connexion. - **Le fournisseur IA du panneau**, si vous en avez déjà configuré un sous System › Settings › AI provider. - **Votre propre abonnement IA** (Claude, ChatGPT, Gemini) via l'**outil en ligne de commande officiel** du fournisseur, soit sur le serveur du panneau, soit sur votre propre ordinateur. Tout ce que vous connectez appartient à votre compte administrateur. Les clés et les jetons sont stockés de manière chiffrée pour vous seul ; un autre administrateur ne peut pas les utiliser. ## Prérequis {#requirements} | Élément | Prérequis | |---|---| | Rôle | Un administrateur connecté. Sur un panneau de démonstration, rien ne peut être connecté ou supprimé. | | Sources API | Un compte et une clé API chez le fournisseur (la carte dispose d'un lien **Get API key** qui ouvre la page du fournisseur). | | CLI sur le serveur du panneau | AI Console activée (voir ci-dessous), trafic HTTPS sortant du serveur vers le fournisseur et vers `nodejs.org` ainsi que le registre npm, et **2 Go de RAM ou plus** (une CLI requiert environ 1 Go libre lors de son exécution ; l'installateur émet un avertissement en deçà de 2 Go). Node.js 20 ou version ultérieure est utilisé s'il est présent, sinon l'installateur télécharge Node.js 22 avec vérification de la somme de contrôle. | | CLI sur votre ordinateur | Node.js 20 ou version ultérieure pour installer la CLI, ainsi que votre propre abonnement. | ## Connecter une source API {#connect-an-api-source} 1. Ouvrez **System › Settings › AI accounts** et restez sur **Accounts**. 2. Sur la carte de la source, cliquez sur **Connect**. La page de clé du fournisseur s'ouvre dans un nouvel onglet ; créez-y une clé. 3. Collez la clé dans le champ et enregistrez. La carte indique un état connecté avec les quatre derniers caractères. 4. Choisissez le **default model** si vous en préférez un autre, puis cliquez sur **Test**. Un bon résultat ressemble à "Connected - example-model, 850 ms". ![Page des comptes IA avec les cartes de source API, une carte OpenAI connectée et la carte du fournisseur Panel AI](https://nexcmp.com/fr/docs/images/configure-with-ai/ai-accounts-and-subscriptions-01-accounts.webp) | Source | Alternative de connexion | |---|---| | OpenRouter | **Sign in with OpenRouter** ouvre OpenRouter dans une fenêtre surgissante ou un onglet ; approuvez et vous revenez sur cette page connecté. | | Google Gemini | **Sign in with Google** apparaît après enregistrement, sous **Set up Google sign-in (optional)** sur la carte, avec un client OAuth créé dans **votre propre** projet Google Cloud (ID client se terminant par `.apps.googleusercontent.com`, ainsi que son secret). NexCMP ne fournit aucun client Google partagé. | | Fournisseur d'IA du panneau | Utilise le fournisseur déjà configuré sous System › Settings › AI provider ([AI provider](https://nexcmp.com/fr/docs/ai/ai-providers/)). Rien à coller. | Pour déconnecter une source, cliquez sur **Remove** sur sa carte. Cela supprime la clé stockée pour votre compte. ### Valeurs par défaut, plafond journalier et autorisations {#defaults-daily-cap-and-permissions} Au bas de l'onglet **Accounts**, **Defaults for AI Chat** propose trois réglages : | Paramètre | Description | |---|---| | Source et modèle par défaut | Ce que les nouvelles discussions utilisent. Vous pouvez toujours changer de source par message. | | Plafond de dépenses journalier (USD, 0 = illimité) | Par défaut 5. La page affiche "used today". Voir [AI Chat in the admin](https://nexcmp.com/fr/docs/configure-with-ai/ai-chat-in-admin/#daily-spending-cap). | | Autorisations de session de discussion | Les périmètres que l'assistant peut utiliser. `admin:read` est toujours actif ; `secrets:write` est désactivé par défaut. Voir [Admin API keys](https://nexcmp.com/fr/docs/configure-with-ai/admin-api-keys/#scopes). | Cliquez sur **Save defaults**. ## Utiliser votre propre abonnement IA {#use-your-own-ai-subscription} Vous pouvez piloter NexCMP avec un forfait Claude, ChatGPT ou Gemini que vous payez déjà, sans clé API séparée. Il y a deux façons de faire. ### Méthode 1 (recommandée) : la CLI sur votre propre ordinateur {#way-1-recommended-the-cli-on-your-own-computer} Vous utilisez l'outil du fournisseur sur votre propre ordinateur et vous vous connectez avec votre compte habituel. NexCMP reçoit uniquement des appels MCP signés avec une clé à courte durée de vie. Ouvrez **AI accounts › Use your own AI subscription** ; elle affiche trois étapes par outil. 1. Cliquez sur **Create a 7-day key** et choisissez le niveau : **Read only** (`admin:read`) ou **Read + configuration** (`admin:read`, `catalog:write`, `infra:write`, `settings:write`). Les commandes ci-dessous contiennent alors la vraie clé. 2. Installez la CLI et connectez-vous. La clé n'est affichée que sur cette page et une seule fois. | Outil | Installation | Connexion | |---|---|---| | Claude Code | `npm install -g @anthropic-ai/claude-code` | exécutez `claude`, puis `/login` | | Codex CLI | `npm install -g @openai/codex` | `codex login` | | Gemini CLI | `npm install -g @google/gemini-cli` | exécutez `gemini`, choisissez "Login with Google" | 3. Connectez-la à votre panneau avec une seule commande ou un seul bloc, copié depuis la page : ```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. Démarrez l'outil et demandez, par exemple, "what is left to set up in nexcmp?". Tous les détails de la connexion MCP se trouvent dans [Connect an AI client](https://nexcmp.com/fr/docs/configure-with-ai/mcp-admin/). Le même onglet affiche l'URL des connecteurs **claude.ai** et **ChatGPT**, qui se connectent via OAuth et ne nécessitent aucune clé : [OAuth connectors](https://nexcmp.com/fr/docs/configure-with-ai/oauth-connectors/). ![Onglet d'abonnement IA personnel avec le bouton de clé valable 7 jours et les commandes d'installation, de connexion et d'association pour trois CLI](https://nexcmp.com/fr/docs/images/configure-with-ai/ai-accounts-and-subscriptions-02-subscription.webp) ### Méthode 2 : la CLI sur le serveur du panneau (boutons Install / Login) {#way-2-the-cli-on-the-panel-server-install-login-buttons} Les cartes sous "Subscription through a CLI (Claude, ChatGPT, Gemini)" permettent à NexCMP d'installer la CLI officielle sur le serveur du panneau et d'ouvrir son propre flux de connexion, afin que **AI Chat** puisse répondre avec votre abonnement. **Comment cela est isolé.** Les CLI s'exécutent dans un processus séparé (`nexcmp-ai.service`) sous leur propre utilisateur système `nexcmp-ai`, sans sudo, sans accès aux données et dossiers de configuration de NexCMP, et avec une limite de mémoire. Pour chaque message de l'AI Chat, la CLI est démarrée avec uniquement les outils MCP de NexCMP autorisés (les outils de shell et de fichiers sont désactivés) et une clé qui ne fonctionne qu'depuis le serveur. NexCMP ne lit ni ne copie la connexion de la CLI : celle-ci la conserve dans un dossier privé pour votre compte administrateur. Il n'y a rien à activer : le panneau configure l'utilisateur et le service `nexcmp-ai` lors de son installation ou de sa mise à jour vers la version 1.4.0, de sorte que les cartes sont prêtes à l'emploi. **Installer et se connecter (par administrateur) :** 1. Sur la carte de la CLI, cliquez sur **Login**. Si la CLI n'est pas encore installée, le panneau l'installe d'abord : une barre de progression et un journal succinct indiquent le téléchargement (Node.js si nécessaire, puis la CLI). Un avertissement s'affiche lorsque le serveur dispose de moins de 2 Go de RAM. 2. La carte indique ce que demande la CLI : - **Codex CLI** : cliquez sur **Open the sign-in page** et saisissez le code à usage unique affiché par la carte. (La connexion par appareil d'OpenAI doit être activée dans vos paramètres de sécurité ChatGPT.) - **Claude Code et Gemini CLI** : cliquez sur **Open the sign-in page**, connectez-vous, puis collez le code de vérification affiché par la page du fournisseur dans **Paste the verification code here** et cliquez sur **Send code**. 3. La carte passe à "Signed in" avec le compte et la version. Une connexion non finalisée dans un délai de 10 minutes est annulée ; cliquez à nouveau sur **Login**. 4. Dans **AI Chat**, la source apparaît désormais dans le sélecteur (par exemple "ChatGPT (via Codex CLI)"). 5. **Sign out** supprime la connexion de la CLI pour votre compte. Pour Claude, la carte comporte un interrupteur supplémentaire, **I understand and accept the vendor's terms for using a subscription this way**, désactivé par défaut. La source n'est pas proposée dans l'AI Chat tant qu'il n'est pas activé. ![Cartes d'abonnement CLI avec Install et Login, un code à usage unique sur la carte Codex et l'interrupteur I understand sur la carte Claude](https://nexcmp.com/fr/docs/images/configure-with-ai/ai-accounts-and-subscriptions-03-cli.webp) ### Conditions des fournisseurs d'IA {#terms-of-the-ai-vendors} La connexion avec un abonnement grand public est régie par les conditions de chaque fournisseur, qui sont sujettes à modification. Les notes ci-dessous résument ce que les fournisseurs publient en octobre 2026 ; elles ne constituent pas un avis juridique ni une déclaration au nom du fournisseur. Veuillez lire les pages actuelles avant d'activer cette fonctionnalité. | Fournisseur | Ce que couvre la page du fournisseur | Source | |---|---|---| | Anthropic (Claude) | La connexion à Claude Code non modifié avec votre propre forfait est couverte. L'utilisation d'un abonnement via d'autres produits, ou le fait qu'un produit collecte ou transmette la connexion, est traité différemment, et les limites des forfaits supposent une utilisation individuelle ordinaire. C'est pourquoi la carte Claude comporte une remarque et l'interrupteur **I understand**, et pourquoi la méthode 1 constitue le choix le plus propre. | https://code.claude.com/docs/en/legal-and-compliance | | OpenAI (Codex) | Codex prend en charge la connexion avec un compte ChatGPT ou une clé API. OpenAI recommande les clés API pour l'automatisation et déconseille d'exposer Codex dans des environnements non sécurisés ou publics. N'utilisez la carte que pour vous-même. | https://developers.openai.com/codex/auth | | Google (Gemini CLI) | Prend en charge Connexion via Google, une clé API et Vertex AI ; les conditions dépendent de la méthode de connexion et les quotas de votre forfait s'appliquent. | https://geminicli.com/docs/get-started/authentication | Si vous souhaitez éviter complètement la question, utilisez une source **API key**, ou la méthode 1 sur votre propre ordinateur. ## AI Console {#ai-console} AI Console est une page de terminal optionnelle permettant d'exécuter l'une des CLI connectées sur le serveur du panneau. Elle est **désactivée par défaut**. - Activez-la ou désactivez-la, et gérez les CLI, sur le serveur : ```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` indique si le socket de l'exécuteur AI est prêt, si AI Console est activé ou désactivé, et pour chaque CLI si elle est « installée » ou « non installée ». `sudo nexcmp status` affiche également « AI runner: active ». - Une fois activé, un onglet **AI Console** apparaît sous AI Chat. Choisissez une CLI connectée, entrez à nouveau votre mot de passe administrateur (et votre code 2FA si vous l'utilisez) et ouvrez une session. Une bannière vous rappelle que les commandes exécutées ici ne peuvent gérer NexCMP qu'à travers ses outils MCP ; les outils de shell et de fichiers sont désactivés. - Les installations de démonstration ne créent jamais l'utilisateur `nexcmp-ai`. ![Écran de démarrage d'AI Console avec le sélecteur de CLI, le champ du mot de passe et la bannière d'avertissement spécifique au MCP](https://nexcmp.com/fr/docs/images/configure-with-ai/ai-accounts-and-subscriptions-04-console.webp) ## Vérification {#verify} 1. **Test** sur une source API renvoie le nom du modèle. 2. Sur la carte de la CLI, l'état indique « Connecté » avec le compte. 3. Sur le serveur : `sudo nexcmp ai-console status` liste la CLI comme installée, et `systemctl is-active nexcmp-ai` affiche `active`. 4. Dans AI Chat, choisissez la source, demandez « Check my setup progress », et une carte d'outil apparaît. ## Limites et notes {#limits-notes} - Une réponse de la CLI est limitée à 5 minutes et une seule réponse à la fois par administrateur. Le quota journalier ne compte pas les réponses de la CLI. - Chaque modification provenant d'une source CLI reste une carte de confirmation dans AI Chat ; la CLI ne peut pas appliquer les modifications de manière autonome. - Les plans d'abonnement ont leurs propres limites d'utilisation. Lorsque le fournisseur indique « usage limit » ou « not logged in », le chat affiche ce message. - La suppression d'une source ne supprime pas les conversations. - Maintenez le serveur à jour : les CLI sont installées à partir des paquets publics des fournisseurs au moment où vous cliquez sur Installer. ## Dépannage {#troubleshooting} | Symptôme | Cause | Solution | |---|---|---| | La connexion est désactivée et la carte indique « AI tools are not ready on the server yet » | Le service `nexcmp-ai` ne s'exécute pas | Mettez à jour le panneau vers la dernière version, puis vérifiez `sudo nexcmp status`. Sur la démo en lecture seule, cela est normal. | | « AI tools are not installed on this server yet » | Le service `nexcmp-ai` ne s'exécute pas (panneau ancien ou panneau de démonstration) | Mettez à jour le panneau, puis `sudo nexcmp ai-console install claude` (ou `codex`, `gemini`). | | Avertissement concernant une RAM inférieure à 2 Go | Le serveur est de petite taille | L'installation peut être lente ou échouer ; ajoutez de la mémoire ou utilisez la méthode 1. | | « Node.js download checksum mismatch » ou « download failed » | Le serveur ne parvient pas à joindre nodejs.org, ou un proxy a altéré le téléchargement | Autorisez le HTTPS sortant et réessayez. | | L'installation se solde par une erreur | npm n'a pas pu installer le paquet | Lisez le journal sur la carte, vérifiez l'accès sortant vers le registre npm, puis réessayez. | | La connexion se solde par une erreur ou expire | La fenêtre de 10 minutes s'est écoulée ou le code était incorrect | Cliquez à nouveau sur **Login** et terminez l'opération plus rapidement. | | La source Claude est absente dans AI Chat | Le commutateur **I understand** est désactivé, ou la CLI n'est pas connectée | Activez le commutateur après avoir lu la page du fournisseur, puis connectez-vous. | | « Sign in with Google » est absent sur Gemini | Aucun client OAuth Google n'a encore été enregistré | Créez le client dans votre propre projet Google Cloud et enregistrez-le sous **Set up Google sign-in (optional)** sur la fiche, ou collez une clé API à la place. | | "Sign in with OpenRouter" renvoie une erreur | Vous avez annulé ou la fenêtre pop-up a été bloquée | Autorisez les pop-up et réessayez. | | La réponse de la CLI indique "usage limit" | Le quota du forfait est épuisé | Patientez ou changez de source. | --- # Clés API administrateur {#admin-api-keys} > **Où dans l'admin :** System › Settings › API & AI agents (`/agent/keys`), onglet **API keys**. La même page contient les onglets **Connect an AI**, **Connected apps** et **Activity**. ## Description {#what-it-does} Une clé API administrateur (préfixe `ak_`) permet à un client IA ou à un script de gérer votre panneau avec exactement les permissions que vous lui accordez. Elle fonctionne sur l'API admin sous `/v1/admin/` et sur le point de terminaison MCP admin `/mcp/admin`. Elle ne fonctionne nulle part ailleurs. ::: info Différent des clés client Les clients créent des clés commençant par `vk_` dans le portail client ([API keys and scopes](https://nexcmp.com/fr/docs/developers/api-keys/)). Celles-ci n'accèdent qu'à l'API client et à `/mcp`. Une clé `ak_` est refusée sur l'API client, et une clé `vk_` est refusée sur l'API admin. ::: ## Prérequis {#requirements} | Élément | Prérequis | |---|---| | Rôle | Vous devez être connecté en tant qu'administrateur. Les clés ne peuvent pas créer d'autres clés. | | Démo | Sur un panneau de démonstration, la page est en lecture seule : aucune clé ne peut être créée ou révoquée. | | Accessibilité | Le client doit pouvoir joindre `https://cloud.example.com/mcp/admin` ou `/v1/admin/...` sur votre panneau (vérifiez votre pare-feu si vous utilisez des restrictions IP). | ## Créer une clé {#create-a-key} 1. Ouvrez **System › Settings › API & AI agents** et restez sur l'onglet **API keys**. 2. Cliquez sur **Create new key**. 3. Remplissez le formulaire : | Champ | Règles | |---|---| | Name | Jusqu'à 60 caractères, par exemple "Claude Code on my laptop". | | Portées | Cochez-en au moins une. Voir [Scopes](#scopes). Commencez par `admin:read` uniquement. | | Expiration | 1, 7, 30, 60 ou 90 jours. Par défaut 30. Maximum 90. Une clé sans date d'expiration ne peut pas être créée. | | Plages IP (optionnel) | Une adresse IPv4 ou IPv6 ou un CIDR par ligne, par exemple `203.0.113.0/24` ou `2001:db8::/48`. Au maximum 32. Laissez vide pour autoriser n'importe quelle IP. | | Appels par minute | 1 à 6000. Par défaut 120. | 4. Cliquez sur **Create key**. Une boîte affiche la clé une seule fois, par exemple `ak_XXXX`. **Copiez-la maintenant** : NexCMP ne stocke qu'un hachage et ne pourra plus jamais l'afficher. 5. Cliquez sur **I have saved the key**. Ouvrez l'onglet **Connect an AI** pour obtenir des commandes prêtes à coller contenant déjà la clé que vous venez de créer (uniquement sur cette page, jusqu'à son rechargement). ![Dialogue de nouvelle clé avec nom, cases à cocher des périmètres, expiration et plage IP renseignés](https://nexcmp.com/fr/docs/images/configure-with-ai/admin-api-keys-01-create.webp) ![Dialogue affichant la nouvelle clé une seule fois avec un bouton Copier et un avertissement](https://nexcmp.com/fr/docs/images/configure-with-ai/admin-api-keys-02-shown-once.webp) ## Portées {#scopes} Une clé ne peut utiliser que les outils et points de terminaison autorisés par ses périmètres. Les périmètres d'écriture n'incluent pas l'accès en lecture : une clé devant lire et écrire a également besoin de `admin:read`. | Portée | Ce qu'elle autorise | |---|---| | `admin:read` | Lire les paramètres, le catalogue, les clients, la facturation et les journaux. Les secrets ne sont jamais renvoyés. | | `catalog:write` | Forfaits, modèles d'OS, quotas, codes de réduction. | | `infra:write` | Sources d'infrastructure (CloudStack, Proxmox), zones, serveurs. | | `billing:write` | Passerelles de paiement, devise, factures, soldes. Les actions financières nécessitent une confirmation. | | `customers:write` | Clients et revendeurs. | | `settings:write` | Paramètres généraux, image de marque, e-mails, pages légales, modules, notifications. | | `ai:write` | Le fournisseur d'IA et les fonctionnalités d'IA. | | `secrets:write` | Écrire des mots de passe et des clés API. Ils peuvent être définis mais jamais relus. | ::: tip La définition d'un secret nécessite deux portées Tout appel contenant un mot de passe, une clé API ou un jeton (mot de passe SMTP, clé de paiement, jeton de bot Telegram, clé de fournisseur d'IA, identifiants CloudStack ou Proxmox) nécessite `secrets:write` **ainsi que** la portée du domaine (par exemple `settings:write` pour le SMTP). Si vous préférez saisir les secrets vous-même, omettez `secrets:write` et saisissez-les dans l'administration. ::: ## Révoquer une clé {#revoke-a-key} 1. Recherchez la clé dans le tableau (statut **Active**, **Expired** ou **Revoked** ; **Last used** indique l'heure et le client). 2. Cliquez sur **Revoke** et confirmez. La clé cesse de fonctionner immédiatement. La révocabilité est définitive ; créez une nouvelle clé si vous en avez nouveau besoin. ## Ce qu'une clé ne peut jamais faire {#what-a-key-can-never-do} Une clé ne peut jamais atteindre ces zones, quelles que soient ses portées. Celles-ci exigent que vous soyez connecté en tant qu'administrateur. - Créer ou modifier des utilisateurs administrateurs, la 2FA et la sécurité des connexions, les sessions admin et les jetons API admin. - Créer, lister ou révoquer des clés admin, des connexions OAuth et des comptes d'IA, ou utiliser la console d'IA. - Sauvegarder ou restaurer le panneau, le mettre à jour ou modifier sa licence. - Se connecter en tant que client ou revendeur, ouvrir la console d'un client, lire les identifiants de VM ou le fichier kubeconfig, définir des clés SSH, ou envoyer/réinitialiser des mots de passe. - Modifier les modules de réseau et de routage (BGP, FRR, RTBH, XDP, interfaces, routes statiques et de stratégie, NAT) ou les agents externes et l'intégration du portail. Ceux-ci sont en lecture seule. - Modifier des paramètres tels que `demo_*`, `admin_*`, les listes d'hôtes, les passkeys, la ré-authentification et les secrets CAPTCHA. Tout ce qui n'est pas couvert par une règle est fermé par défaut en écriture, et accessible en lecture avec `admin:read`. ### Actions nécessitant votre confirmation {#actions-that-need-your-confirmation} Celles-ci n'aboutissent qu'après validation d'un aperçu (voir [Two-step confirmation](#two-step-confirmation)) : - Modifier le solde d'un client ou le portefeuille d'un revendeur, effectuer un versement, enregistrer la facturation ou modifier le taux de change. - Modifier les prix (tarifs des offres, création en masse d'offres, tarification des images et du stockage) et créer des codes de réduction ou de montant. - Enregistrer les identifiants d'une passerelle de paiement ou la connexion CloudStack. - Supprimer un élément, bloquer ou supprimer un client, modifier les limites d'un client, suspendre ou clôturer un revendeur. - Interagir avec les serveurs clients ou créer un serveur payant pour un client. - Modifier les commutateurs globaux du site, les paramètres de sécurité des connexions ou les options de paiement via les paramètres généraux. ## Confirmation en deux étapes {#two-step-confirmation} Lorsqu'un appel nécessite une confirmation, rien n'est encore modifié. La réponse est un code HTTP **428** accompagné de `confirm_required`, d'un `confirm_token`, d'un `preview` (méthode, chemin, motif, nouvelles valeurs et, le cas échéant, valeurs actuelles) et de `expires_in: 300`. 1. Le client affiche l'aperçu. 2. Après votre approbation, il répète la **même** requête (même méthode, chemin et corps) avec l'en-tête `X-Confirm-Token: `. Les outils MCP prennent l'argument `confirm_token` à la place. 3. Le jeton est à usage unique et expire au bout de 5 minutes. Les clés créées dans l'administration pour l'AI Chat ne peuvent être confirmées que visuellement : la réponse indique `confirm_in: "ui"` et une carte de confirmation apparaît dans l'administration. L'IA ne peut pas l'approuver. ## Limitation de débit et règles IP {#rate-limit-and-ip-rules} - Au-delà de la limite par minute, un appel renvoie `rate_limited` (HTTP 429) avec `Retry-After: 60`. - Si des plages IP sont définies, les appels provenant de toute autre adresse renvoient `ip_not_allowed` (HTTP 403). ## Journal d'activité {#activity-log} L'onglet **Activity** répertorie chaque appel effectué avec une clé, du plus récent au plus ancien : heure, clé, client, mode d'arrivée (`http`, `mcp`, `chat`, `cli`, `confirm`, `preview`), méthode et chemin, outil, statut HTTP, IP et détails (masqués). Vous pouvez effectuer une recherche par chemin, outil ou nom de clé, n'afficher que les erreurs (HTTP 400 et supérieur) ou uniquement les appels en attente de confirmation (428 et supérieur), et limiter la période à la dernière heure, aux 24 derniers jours ou aux 7 derniers jours. NexCMP conserve les 200,000 derniers enregistrements. Les modifications effectuées via une clé apparaissent également dans Logs › Admin actions sous le nom `ak:/`. ![Onglet Activity listant les appels avec leur statut, client, outil et IP](https://nexcmp.com/fr/docs/images/configure-with-ai/admin-api-keys-03-activity.webp) ## Vérification {#verify} Testez une clé en lecture seule depuis n'importe quelle machine située dans la plage IP : ```bash curl -s https://cloud.example.com/v1/admin/agent/tools \ -H "Authorization: Bearer ak_XXXX" ``` Vous obtenez une liste JSON des outils autorisés par vos périmètres. Exécutez-en un : ```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 '{}' ``` L'heure de **Last used** de la clé est actualisée et l'appel apparaît dans **Activity**. La liste complète des outils et une description OpenAPI (`/v1/admin/openapi.json`) sont présentées dans [Connect an AI client](https://nexcmp.com/fr/docs/configure-with-ai/mcp-admin/). ## Erreurs {#errors} Les erreurs sont au format JSON : `{"error": {"code": "...", "message": "..."}}`. | HTTP | `code` | Description | Solution | |---|---|---|---| | 401 | `invalid_key` | La clé est absente, malformée ou inconnue. Également renvoyé lorsqu'une clé `ak_` est utilisée sur un chemin non administrateur. | Vérifiez la clé ; utilisez-la uniquement sur `/v1/admin/` et `/mcp/admin`. | | 401 | `key_expired` | La date d'expiration de la clé est dépassée. | Créez une nouvelle clé. | | 401 | `key_revoked` | La clé a été révoquée. | Créez une nouvelle clé. | | 403 | `ip_not_allowed` | L'adresse IP de l'appelant se trouve en dehors des plages IP de la clé. | Effectuez l'appel à partir d'une IP autorisée ou créez une clé avec la plage appropriée. | | 403 | `local_only_key` | Une clé créée pour AI Chat ou le CLI du serveur a été utilisée depuis une autre machine. | Ces clés ne fonctionnent que sur le serveur du panneau lui-même. | | 403 | `insufficient_scope` | La clé ne possède pas de périmètre ; la réponse inclut `required_scope`. | Créez une clé disposant de ce périmètre. | | 403 | `forbidden_for_keys` | L'endpoint, ou le paramètre que vous avez tenté de modifier, n'est pas accessible aux clés. | Effectuez cette action dans l'administration. | | 403 | `demo_read_only` | Le panneau est en mode démonstration et l'appel effectue une écriture. | Utilisez un panneau qui n'est pas en mode démonstration. | | 403 | `confirm_in_ui` | Cette action doit être confirmée à l'écran dans l'administration. | Approuvez la carte de confirmation. | | 428 | `confirm_required` | Un aperçu est prêt ; rien n'a été modifié. Inclut `confirm_token`. | Affichez l'aperçu, puis réitérez avec `X-Confirm-Token`. | | 409 | `confirm_expired` | Le jeton date de plus de 5 minutes. | Envoyez à nouveau la requête pour obtenir un nouvel aperçu. | | 409 | `confirm_mismatch` | Le jeton appartient à une autre requête (la méthode, le chemin ou le corps diffèrent). | Répétez la requête à l'identique. | | 409 | `confirm_invalid` | Jeton inconnu ou déjà utilisé. | Envoyez à nouveau la requête pour obtenir un nouvel aperçu. | | 429 | `rate_limited` | Trop d'appels au cours de cette minute. | Attendre `Retry-After`. | | 400 | `invalid_path` | Le chemin contient des séquences interdites. | Utilisez un chemin simple. | | 413 | `too_large` | Le corps de la requête dépasse 10 Mo. | Envoyez moins de données. | | 400 | `invalid_argument` | Un argument d'outil est manquant, inconnu ou d'un type incorrect ; le message le nomme explicitement. | Corrigez l'argument. | ## Limites et notes {#limits-notes} - Maintenez la durée de vie des clés courte et limitez leurs périmètres. Préférez une clé par client afin de pouvoir en révoquer une seule. - Une clé a autant de pouvoir que ses périmètres. `secrets:write` associé à `billing:write` constitue la combinaison la plus sensible ; les actions financières s'arrêtent toujours à un aperçu. - Les clés générées automatiquement (pour AI Chat, le CLI du serveur) n'ont une durée de vie que de quelques minutes et ne fonctionnent qu'à partir du serveur du panneau. - Pour couper un client IA immédiatement, révoquez sa clé. Les connexions OAuth sont révoquées sur l'onglet **Connected apps** ([OAuth connectors](https://nexcmp.com/fr/docs/configure-with-ai/oauth-connectors/)). --- # Connecter un client IA (MCP) {#connect-an-ai-client-mcp} > **Où dans l'admin :** System › Settings › API & AI agents (`/agent/keys`), l'onglet **Connect an AI** affiche l'URL de l'endpoint et un extrait prêt à copier pour chaque client, complété avec la clé que vous venez de créer. ## Description {#what-it-does} Le protocole **Model Context Protocol (MCP)** permet à un client IA d'appeler des outils. Votre panel héberge un serveur MCP administrateur sur `https://cloud.example.com/mcp/admin`. Connectez votre propre outil IA et demandez en langage naturel : "what is left to set up?", "add my Proxmox cluster", "create plans with a 40% margin". Le client appelle les outils administrateur ci-dessous ; le panel vérifie les portées, vous demande confirmation avant toute action risquée et enregistre chaque appel. ::: info Deux endpoints MCP `/mcp` est l'endpoint **client** (clés API client, `vk_` ; voir [MCP server](https://nexcmp.com/fr/docs/developers/mcp/)). `/mcp/admin` est l'endpoint **admin** décrit ici (clés admin `ak_` ou OAuth). Les deux ne se mélangent jamais : les outils admin ne sont pas visibles sur `/mcp`, et `/mcp/admin` n'accepte que les clés admin. ::: ## Prérequis {#requirements} | Élément | Prérequis | |---|---| | Endpoint | `https://cloud.example.com/mcp/admin` sur le propre domaine de votre panel. Copiez l'URL exacte depuis l'onglet **Connect an AI**. La même page liste une URL locale (`http://127.0.0.1:/mcp/admin`) pour les outils s'exécutant directement sur le serveur. | | Identifiants | Une [clé API admin](https://nexcmp.com/fr/docs/configure-with-ai/admin-api-keys/) (`ak_...`) avec les portées souhaitées, **ou** une connexion OAuth pour les connecteurs web ([OAuth connectors](https://nexcmp.com/fr/docs/configure-with-ai/oauth-connectors/)). | | Client | Tout client MCP compatible avec le transport **Streamable HTTP** et un en-tête personnalisé `Authorization`. Versions du protocole 2025-11-25, 2025-06-18 et 2025-03-26. | | Réseau | Si vous placez votre propre proxy inverse devant le panel, il doit transmettre `/mcp/admin`. Les connecteurs web (claude.ai, ChatGPT) se connectent depuis les serveurs du fournisseur, l'URL doit donc être accessible depuis Internet. | ## Préparer l'infrastructure {#prepare-the-infrastructure} Rien à installer sur le serveur. Si vous restreignez la clé par IP, assurez-vous que l'adresse depuis laquelle votre client se connecte se trouve dans la plage. Testez d'abord l'accessibilité : ```bash curl -i -X POST https://cloud.example.com/mcp/admin ``` Une réponse `401` avec un en-tête `WWW-Authenticate: Bearer ... resource_metadata=...` indique que l'endpoint est actif et attend des identifiants. ## Connecter dans NexCMP {#connect-in-nexcmp} 1. Créer une clé : **System › Settings › API & AI agents › API keys › New key**. Pour un premier essai, utilisez uniquement `admin:read` ; ajoutez des portées d'écriture lorsque vous en avez besoin. Voir [Admin API keys](https://nexcmp.com/fr/docs/configure-with-ai/admin-api-keys/). 2. Ouvrez l'onglet **Connect an AI**. Tant que la boîte de dialogue de création de clé est active, chaque extrait ci-dessous contient déjà votre vraie clé. Sinon, elle affiche le paramètre fictif `ak_YOUR_KEY`. 3. Copiez l'extrait correspondant à votre client et exécutez-le ou collez-le comme décrit ci-dessous. ![Onglet Connect an AI affichant l'URL MCP et une carte avec un bouton de copie par client](https://nexcmp.com/fr/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" ``` Lancez ensuite `claude` et demandez "list the tools from nexcmp" ou "what is left to set up?". Vérifié le 30/10/2026 avec Claude Code 2.1 : `claude mcp add --transport http …` enregistre le serveur (ajoutez `-s project` pour le conserver dans le fichier `.mcp.json` du projet — Claude Code vous demande d'approuver les serveurs de projet la première fois). Pour les scripts, `claude -p "…" --mcp-config .mcp.json --strict-mcp-config --allowedTools "mcp__nexcmp__*"` s'exécute sans invite d'approbation et permet à Claude d'utiliser uniquement les outils du panel. ### Claude Desktop {#claude-desktop} Requiert Node.js 18 ou une version ultérieure. Ajoutez ceci à `claude_desktop_config.json` (le pont `mcp-remote` est utilisé) et redémarrez Claude Desktop : ```json { "mcpServers": { "nexcmp": { "command": "npx", "args": ["-y", "mcp-remote", "https://cloud.example.com/mcp/admin", "--header", "Authorization:Bearer ak_XXXX"] } } } ``` Si votre système corrompt l'espace dans l'argument d'en-tête, placez plutôt la valeur entière dans une variable d'environnement, exactement comme pour l'endpoint client : `"args": [..., "--header", "Authorization:${NEXCMP_AUTH_HEADER}"]` avec `"env": { "NEXCMP_AUTH_HEADER": "Bearer ak_XXXX" }`. ### claude.ai (connecteur personnalisé) {#claude-ai-custom-connector} Aucune clé requise : la connexion s'effectue via OAuth. Dans claude.ai, ouvrez les paramètres des connecteurs, ajoutez un connecteur personnalisé, collez `https://cloud.example.com/mcp/admin`, puis connectez-vous avec votre compte administrateur NexCMP et sélectionnez les autorisations sur l'écran de consentement. Détails : [OAuth connectors](https://nexcmp.com/fr/docs/configure-with-ai/oauth-connectors/). ### ChatGPT (mode développeur) {#chatgpt-developer-mode} Aucune clé requise. Dans ChatGPT, activez le mode développeur, ajoutez un connecteur MCP avec l'URL `https://cloud.example.com/mcp/admin`, choisissez OAuth et connectez-vous avec votre compte administrateur NexCMP. Détails : [OAuth connectors](https://nexcmp.com/fr/docs/configure-with-ai/oauth-connectors/). ### Codex CLI {#codex-cli} Ajouter à `~/.codex/config.toml` : ```toml [mcp_servers.nexcmp] url = "https://cloud.example.com/mcp/admin" bearer_token_env_var = "NEXCMP_KEY" ``` Exportez ensuite la clé dans le shell qui lance Codex : ```bash export NEXCMP_KEY=ak_XXXX codex codex mcp list # shows nexcmp with "Bearer token" auth ``` ::: tip Non-interactive `codex exec` Dans `codex exec` (scripts, CI), Codex ne demande pas confirmation avant d'appeler des outils et ignore ceux qui modifient des données. Ajoutez `default_tools_approval_mode = "approve"` sous `[mcp_servers.nexcmp]` pour l'autoriser à les appeler ; le panneau renvoie toujours un aperçu et demande confirmation pour les actions financières, de sécurité et de suppression. Vérifié avec Codex CLI 0.166 le 30/10/2026. ::: ### Gemini CLI {#gemini-cli} Ajouter à `~/.gemini/settings.json` : ```json { "mcpServers": { "nexcmp": { "httpUrl": "https://cloud.example.com/mcp/admin", "headers": { "Authorization": "Bearer ak_XXXX" } } } } ``` Gemini CLI désactive les serveurs MCP dans les dossiers qu'il n'approuve pas. Lancez-le dans un dossier de confiance (ou approuvez le dossier lorsqu'il le demande), puis vérifiez avec `gemini mcp list` — cela affiche `nexcmp … Connected`. Vous pouvez garder la clé hors du fichier avec `"Authorization": "Bearer $NEXCMP_KEY"`. Vérifié avec Gemini CLI 0.66 le 30/10/2026. ### Cursor {#cursor} Ajouter à `~/.cursor/mcp.json` (ou `.cursor/mcp.json` dans un projet) : ```json { "mcpServers": { "nexcmp": { "url": "https://cloud.example.com/mcp/admin", "headers": { "Authorization": "Bearer ak_XXXX" } } } } ``` ::: tip Conserver la clé hors des fichiers de configuration Lorsque le client le prend en charge, lisez la clé à partir d'une variable d'environnement au lieu de l'écrire dans le fichier : Codex le fait par défaut (`bearer_token_env_var`) et Cursor accepte `"Bearer ${env:NEXCMP_KEY}"`. Ne commitez jamais un fichier contenant une clé. ::: ### 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", ) ``` Une exécution complète (vérifiée avec `openai-agents` 0.24 le 30/10/2026 — un outil de lecture, puis un changement de solde qui a renvoyé l'aperçu de confirmation et a été appliqué au second appel avec `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} Passez le serveur en tant qu'outil de type `mcp`. Gardez `require_approval` sur `always` pour que votre programme vous demande confirmation avant chaque appel : ```json { "type": "mcp", "server_label": "nexcmp", "server_url": "https://cloud.example.com/mcp/admin", "headers": { "Authorization": "Bearer ak_XXXX" }, "require_approval": "always" } ``` ### Tout le reste (HTTP non sécurisé) {#anything-else-plain-http} Un client sans MCP peut appeler les mêmes outils via HTTP. `GET /v1/admin/agent/tools` les liste, `POST /v1/admin/agent/tools/` en exécute un avec un corps JSON d'arguments et `GET /v1/admin/openapi.json` renvoie une description OpenAPI 3.1 (chaque outil correspond à une opération). Tous nécessitent `Authorization: Bearer ak_...`. ## Vérification {#verify} 1. Sans client, lister les outils : ```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"}' ``` La réponse est un résultat JSON-RPC contenant les outils autorisés par vos portées (scopes). 2. Dans votre client, demandez « run system_health ». Il renvoie les alertes, l'état de santé de l'infrastructure connectée, les paiements, l'e-mail, l'IA et l'état de la licence. 3. Ouvrez **API & AI agents › Activity**: les appels sont listés avec le nom du client et `mcp`. 4. Sur le serveur, `sudo nexcmp status` affiche une ligne « MCP admin » indiquant `ready` lorsque l'endpoint répond (un code HTTP 401 sans clé correspond à l'état sain). ## Outils {#tools} Le serveur propose 58 outils. Un client ne voit que les outils autorisés par les portées (scopes) de sa clé : les outils de lecture nécessitent `admin:read`, les outils d'écriture requièrent leur propre portée. Les outils d'écriture acceptent également un argument optionnel `confirm_token` (voir [Confirmation](#confirmation-confirm-token)). Les arguments sont vérifiés par rapport au schéma de chaque outil : les arguments inconnus ou mal saisis sont rejetés avec un message indiquant leur nom. Les prix sont en USD : prix des plans en dollars par heure (`hourly_usd`), soldes en centimes. Les secrets peuvent être définis mais ne sont jamais renvoyés. ### Overview and logs {#overview-and-logs} | Outil | Description | Portée | Changes data | Asks you | |---|---|---|---|---| | `system_health` | Alertes nécessitant une attention, état de santé de l'infrastructure, paiements, e-mail, IA, licence et statut des mises à jour. | `admin:read` | No | No | | `setup_checklist` | Ce qui est configuré et ce qui reste : licence, infrastructure, zone, modèles d'OS, plans, paiements, e-mail, image de marque, mentions légales, commande de test. | `admin:read` | No | No | | `license_status` | Statut de la licence et présence éventuelle d'une version de NexCMP plus récente. | `admin:read` | No | No | | `audit_search` | Rechercher dans le journal d'audit administrateur et le journal des clés API. | `admin:read` | No | No | ### Paramètres, image de marque, mentions légales, modules {#settings-branding-legal-modules} | Outil | Description | Portée | Changes data | Asks you | |---|---|---|---|---| | `settings_get` | Lire les paramètres généraux (`keys` filtres ; un `*` final correspond à un préfixe). | `admin:read` | No | No | | `settings_update` | Modifier les paramètres généraux à partir d'un objet `values` plat. Seules les clés listées par `settings_get` sont acceptées. | `settings:write` | Oui | Lorsqu'une clé touche aux paiements, à la sécurité des connexions, aux commutateurs globaux ou aux prix | | `branding_get` | Nom de marque, couleur, devise d'affichage, nom du vendeur, URLs du logo et du favicon. | `admin:read` | No | No | | `branding_update` | Définir le nom de marque (jusqu'à 60 caractères), la couleur (`#rrggbb`), la devise d'affichage (`usd` ou `vnd`) et le nom du vendeur. | `settings:write` | Oui | No | | `branding_logo_set` | Téléchargez un logo clair ou sombre ou un favicon depuis une URL https ou en base64 (PNG, JPEG, WEBP, ICO ou SVG, jusqu'à 512 Ko). | `settings:write` | Oui | No | | `legal_get` | Conditions d'utilisation et politique de confidentialité (en anglais et en vietnamien) ainsi que les valeurs neutres par défaut. | `admin:read` | No | No | | `legal_update` | Définissez le texte des conditions et de la politique de confidentialité (markdown simple, sans HTML, jusqu'à 50 Ko chacun). Une chaîne vide rétablit la valeur par défaut. | `settings:write` | Oui | No | | `modules_get` | Quels modules optionnels sont activés et lesquels peuvent être commutés. | `admin:read` | No | No | | `module_set` | Activez ou désactivez un module optionnel (`key` doit être l'un des éléments suivants : `settable`). | `settings:write` | Oui | No | ### E-mail et alertes {#email-and-alerts} | Outil | Description | Portée | Changes data | Asks you | |---|---|---|---|---| | `smtp_get` | Paramètres des e-mails sortants (mot de passe masqué) et état de la file d'attente. | `admin:read` | No | No | | `smtp_configure` | Définissez le serveur SMTP. Toute modification de l'hôte, du port ou de la sécurité nécessite à nouveau le mot de passe. | `settings:write` (+ `secrets:write` pour le mot de passe) | Oui | No | | `smtp_test` | Envoyez un véritable e-mail de test avec les paramètres enregistrés. | `settings:write` | Envoie un e-mail | No | | `telegram_get` | Canaux de notification pour les administrateurs (identifiants de chat ; les jetons de bot ne sont jamais renvoyés). | `admin:read` | No | No | | `telegram_configure` | Ajoutez ou mettez à jour le canal d'alerte Telegram (jeton de bot et identifiant de chat) et activez ou désactivez les alertes administrateur. | `settings:write` (+ `secrets:write` pour le jeton) | Oui | No | | `telegram_test` | Envoyez un message de test sur le canal Telegram. | `settings:write` | Envoie un message | No | ### Paiements et devise {#payments-and-currency} | Outil | Description | Portée | Changes data | Asks you | |---|---|---|---|---| | `payments_get` | Statut de Stripe, PayPal, des cryptomonnaies (USDT) et du virement bancaire, ainsi que des canaux activés et des frais. | `admin:read` | No | No | | `payment_configure` | Définissez les identifiants d'une passerelle (`stripe`, `paypal`, `crypto` ou `bank`). | `billing:write` (+ `secrets:write`) | Oui | Toujours | | `payment_test` | Vérifiez les identifiants enregistrés d'une passerelle auprès du fournisseur. | `billing:write` | No | No | | `currency_get` | Devise d'affichage et taux USD vers VND (automatique ou manuel). | `admin:read` | No | No | | `currency_set` | Définissez la devise d'affichage et/ou un taux manuel (0 signifie automatique, sinon de 15000 à 50000). | `billing:write` | Oui | Lorsque vous modifiez le taux manuel | ### Infrastructure et zones {#infrastructure-and-zones} | Outil | Description | Portée | Changes data | Asks you | |---|---|---|---|---| | `cloudstack_get` | Point de terminaison CloudStack, zone et identifiants réseau enregistrés (clés masquées). | `admin:read` | No | No | | `cloudstack_test` | Testez un point de terminaison avec une clé API et un secret sans enregistrer ; répertorie les zones. | `infra:write` (+ `secrets:write`, car vous transmettez les clés) | No | No | | `cloudstack_connect` | Enregistrez la connexion CloudStack. | `infra:write` (+ `secrets:write`) | Oui | Toujours | | `proxmox_list` | Clusters Proxmox VE ajoutés en tant que sources, avec leur état de santé. | `admin:read` | No | No | | `proxmox_add` | Ajoutez un cluster Proxmox VE avec un jeton API (`user@realm!tokenid`) et son secret. | `infra:write` (+ `secrets:write`) | Oui | No | | `proxmox_test` | Connectez-vous à un cluster par son identifiant ; la première connexion réussie épingle son certificat TLS. | `infra:write` | Oui | No | | `proxmox_attach_zone` | Vendez un cluster Proxmox dans une zone existante, éventuellement avec un nœud comme région. | `infra:write` | Oui | No | | `zones_list` | Zones (emplacements) que les clients peuvent choisir. | `admin:read` | No | No | | `zone_create` | Créez une zone. | `infra:write` | Oui | No | ### Catalogue et offres {#catalog-and-plans} | Outil | Description | Portée | Changes data | Asks you | |---|---|---|---|---| | `templates_list` | Modèles de systèmes d'exploitation que les clients peuvent installer. | `admin:read` | No | No | | `templates_sync` | Importez des modèles de systèmes d'exploitation depuis CloudStack. | `catalog:write` | Oui | No | | `template_update` | Activez ou masquez un modèle, renommez-le, définissez l'utilisateur de connexion ou l'ordre. | `catalog:write` | Oui | No | | `offerings_list` | Offres de service CloudStack (CPU, mémoire, disque racine) pour créer des offres. | `admin:read` | No | No | | `plans_list` | Offres avec prix par heure et par mois, taille, zone et nombre de serveurs qui les utilisent. | `admin:read` | No | No | | `plan_create` | Créez une offre. Prix sous la forme `hourly_usd`. Les offres CloudStack nécessitent `cs_offering_id` ; les offres Proxmox nécessitent `backend_id`. | `catalog:write` | Oui | No | | `plan_update` | Renommez, affichez ou masquez, activez ou désactivez, ou modifiez le prix d'une offre. Les modifications de taille sur une offre en cours d'utilisation nécessitent une copie. | `catalog:write` | Oui | Lorsque le prix change | | `plans_from_offerings` | Générer un tableau de forfaits de départ à partir des offres (ou des tailles Proxmox) en utilisant votre coût et un pourcentage de marge. Renvoie un aperçu ; appelez à nouveau avec `apply=true` pour créer les forfaits. | `catalog:write` | Avec `apply=true` | Toujours appliqué | | `quota_defaults_get` | Limites client par défaut. | `admin:read` | No | No | | `quota_defaults_set` | Modifier les paramètres de `quota_*`. | `catalog:write` | Oui | No | | `coupons_list` | Lots de codes de réduction et cadeaux. | `admin:read` | No | No | | `coupon_create` | Créer un lot de codes : tapez `money` (valeur faciale en centimes USD) ou `percent` (1 à 100, avec une réduction maximale). | `catalog:write` | Oui | Toujours | ### Clients et revendeurs {#customers-and-resellers} | Outil | Description | Portée | Changes data | Asks you | |---|---|---|---|---| | `customers_search` | Trouver des clients par e-mail, nom ou IP. | `admin:read` | No | No | | `customer_get` | Compte, solde, serveurs et facturation récente d'un client. | `admin:read` | No | No | | `customer_adjust_balance` | Ajouter (positif) ou supprimer (négatif) du crédit en centimes USD. Un motif est requis. | `billing:write` | Oui | Toujours | | `customer_block` | Bloquer un client, en arrêtant éventuellement ses serveurs. Un motif est requis. | `customers:write` | Oui | Toujours | | `customer_unblock` | Débloquer un client. | `customers:write` | Oui | No | | `resellers_list` | Revendeurs avec portefeuille et statut. | `admin:read` | No | No | | `reseller_get` | Site, portefeuille, utilisateurs et passerelles d'un revendeur. | `admin:read` | No | No | ### Fournisseur d'IA {#ai-provider} | Outil | Description | Portée | Changes data | Asks you | |---|---|---|---|---| | `ai_provider_get` | Le fournisseur compatible OpenAI utilisé par l'AI Chat et l'AI Agent client (clé masquée). | `admin:read` | No | No | | `ai_provider_set` | Définir le fournisseur : URL de base, modèle, clé API, modèles de secours, effort de raisonnement, activé. | `ai:write` (+ `secrets:write` pour la clé) | Oui | No | | `ai_provider_test` | Poser une question au fournisseur enregistré pour vérifier son bon fonctionnement. | `ai:write` | No | No | ### Fichiers de configuration {#configuration-files} | Outil | Description | Portée | Changes data | Asks you | |---|---|---|---|---| | `config_export` | Exporter la configuration au format YAML (les secrets deviennent des références `secret://`). | `admin:read` | No | No | | `config_plan` | Comparer une configuration YAML avec le panneau en direct et lister les modifications. | `admin:read` | No | No | | `config_apply` | Appliquer une configuration YAML section par section. Chaque modification respecte les règles normales de portée et de confirmation. | `admin:read` + la portée de chaque modification | Oui | Par modification | Consultez [Configuration as code](https://nexcmp.com/fr/docs/configure-with-ai/config-as-code/) pour connaître le format de fichier. ## Prompts {#prompts} Le serveur propose également trois prompts prêts à l'emploi que les clients peuvent afficher comme raccourcis : | Prompt | Argument | Ce qu'il demande à l'IA de faire | |---|---|---| | `initial-setup` | aucun | Appeler `setup_checklist`, expliquer chaque étape ouverte en une phrase, vous demander les informations nécessaires, effectuer l'étape avec l'outil correspondant, prévisualiser les modifications financières ou de sécurité, et terminer par `system_health`. | | `add-proxmox` | `endpoint` (facultatif, `https://host:8006`) | Demander le jeton API, puis `proxmox_add`, `proxmox_test`, les outils de zone et `proxmox_attach_zone` ; puis proposer des forfaits avec `plans_from_offerings` et attendre votre approbation. | | `launch-pricing` | `margin_pct` (facultatif, par défaut 40) | Demander votre coût mensuel par vCPU, par Go de RAM et par Go de disque, afficher un tableau d'aperçu avec le coût, le prix par mois et le prix par heure, et créer les forfaits après votre approbation. | ## Confirmation (`confirm_token`) {#confirmation-confirm-token} Les actions qui déplacent de l'argent, suppriment des données, modifient des identifiants de paiement ou la sécurité de connexion se font en deux étapes : 1. Le premier appel ne modifie rien. Le résultat de l'outil commence par « CONFIRMATION REQUIRED » et comprend un **aperçu** (ce qui sera appelé, pourquoi c'est sensible, les nouvelles valeurs et les actuelles) ainsi qu'un `confirm_token`. 2. Le client doit vous montrer l'aperçu. Ce n'est qu'après votre approbation qu'il rappelle le même outil avec les mêmes arguments plus `confirm_token`. 3. Le jeton fonctionne une seule fois, uniquement pour cette requête exacte, et expire après 5 minutes. Les instructions du serveur indiquent à l'IA de traiter les résultats d'outils comme des données, et non comme des instructions, et de ne jamais répéter un appel avec un jeton que vous n'avez pas approuvé. Vous êtes le rempart : lisez l'aperçu. ::: warning Ne pas approuver automatiquement Certains clients peuvent approuver automatiquement chaque appel d'outil. Pour les outils d'écriture, maintenez l'approbation par appel active ou utilisez une clé en lecture seule, afin qu'un plan erroné de l'IA ne puisse pas atteindre votre panneau à votre insu. ::: ## Comment ça fonctionne {#how-it-works} | Élément | Détail | |---|---| | Transport | `POST /mcp/admin` avec un message JSON-RPC 2.0 ; la réponse est `application/json`. Jusqu'à 20 messages dans un lot. `GET /mcp/admin` renvoie 405 (pas de flux serveur) ; `DELETE /mcp/admin` met fin à une session. | | Authentification | `Authorization: Bearer ak_...` (une clé manuelle ou un jeton d'accès OAuth). Des identifiants manquants ou incorrects renvoient 401 avec `WWW-Authenticate: Bearer ... resource_metadata=...`, ce qui permet aux clients OAuth de lancer la connexion par eux-mêmes. | | Sessions | `Mcp-Session-Id` est émis par `initialize`, lié à cette clé et valide pendant 24 heures. | | Fonctionnalités | Outils et invites. Pas de ressources. | | Taille | Corps de requête jusqu'à 1 Mo ; le résultat d'un outil est tronqué après environ 100 Ko. | | Origine | Une requête portant un en-tête `Origin` provenant d'un autre site est refusée (`origin_not_allowed`). Les clients en ligne de commande et de bureau n'en envoient aucun. | | Même passerelle que l'API REST | Chaque appel d'outil est retransmis via le pipeline de requêtes propre au panneau avec votre clé, de sorte que les portées, les plages IP, la limite de débit, la confirmation et le journal d'activité s'appliquent exactement comme pour les appels d'API directs. | ## Limites et notes {#limits-notes} - Un outil que vous ne voyez pas correspond à une portée que vous n'avez pas accordée. Ajoutez la portée à une nouvelle clé. - Définir un mot de passe ou une clé d'API via un client IA signifie que le secret transite par cette IA. Si vous préférez, désactivez `secrets:write` et saisissez vous-même les secrets dans l'administration, ou utilisez le champ **Secret** de l'AI Chat ([AI Chat in the admin](https://nexcmp.com/fr/docs/configure-with-ai/ai-chat-in-admin/#secrets)) ou les références `secret://` ([Configuration as code](https://nexcmp.com/fr/docs/configure-with-ai/config-as-code/#secrets)). - Les clients ne partagent pas les sessions : chaque connexion commence par `initialize`. - Révoquez la clé dans **API & AI agents** pour couper immédiatement l'accès à un client IA. ## Dépannage {#troubleshooting} | Symptôme | Cause | Solution | |---|---|---| | 401 `invalid_key` | Clé incorrecte, tronquée ou non administrateur (par exemple une clé `vk_`) | Utilisez une clé `ak_`. | | 401 `key_expired` ou `key_revoked` | La clé a expiré ou a été révoquée | Créez une nouvelle clé. | | 403 `ip_not_allowed` | Votre adresse IP se trouve en dehors des plages IP de la clé | Connectez-vous depuis une adresse IP autorisée. | | 403 `origin_not_allowed` | Une page de navigateur sur une autre origine a appelé l'endpoint | Utilisez un client de bureau ou CLI. | | 404 sur une requête avec `Mcp-Session-Id` | La session appartient à une autre clé ou a expiré | Envoyez à nouveau `initialize`. | | 400 unsupported `MCP-Protocol-Version` | Le client utilise une version que le serveur ne connaît pas | Mettez à jour le client ; versions prises en charge : 2025-11-25, 2025-06-18, 2025-03-26. | | La liste des outils est courte | Portées de clé | Créez une clé avec davantage de portées. | | `insufficient_scope` sur un appel | Un outil nécessite une seconde portée, par exemple `secrets:write` | Ajoutez la portée à une nouvelle clé. | | 429 `rate_limited` | Plus d'appels par minute que ne le permet la clé | Patientez pendant `Retry-After` ou augmentez la limite sur une nouvelle clé. | | claude.ai ou ChatGPT ne parvient pas à se connecter | L'URL n'est pas joignable depuis Internet, ou un proxy bloque `/mcp/admin` ou `/oauth-admin/` | Vérifiez le DNS, le protocole TLS et le proxy inverse. | Pour tous les codes d'erreur, consultez [Admin API keys](https://nexcmp.com/fr/docs/configure-with-ai/admin-api-keys/#errors). --- # Connecteurs claude.ai et ChatGPT {#claude-ai-and-chatgpt-connectors} > **Où dans l'admin :** System › Settings › API & AI agents (`/agent/keys`), onglet **Connected apps**. L'écran de consentement s'ouvre à `/agent/consent` lorsqu'un connecteur demande l'accès (il n'est pas dans le menu). ## Description {#what-it-does} Les applications d'IA web ne peuvent pas lire de clé sur votre disque. Elles se connectent via **OAuth** : vous ajoutez l'URL MCP du panneau, l'application vous envoie vers votre propre admin pour vous connecter, vous choisissez ce que l'application peut faire et pour combien de temps, et l'application reçoit des jetons à courte durée de vie. Aucune clé n'est copiée ou collée. Vous pouvez couper l'application à tout moment. Utilisez ceci pour les connecteurs personnalisés claude.ai, les connecteurs en mode développeur ChatGPT et tout autre client MCP prenant en charge OAuth avec enregistrement de client dynamique. Les outils en ligne de commande peuvent utiliser le même flux, mais une [admin API key](https://nexcmp.com/fr/docs/configure-with-ai/admin-api-keys/) est plus simple pour eux. ## Prérequis {#requirements} | Élément | Prérequis | |---|---| | URL | `https://cloud.example.com/mcp/admin`, accessible depuis Internet (les serveurs du fournisseur s'y connectent). | | Proxy inverse | Si vous placez votre propre proxy devant le panneau, il doit transférer `/mcp/admin`, `/oauth-admin/` et les chemins `/.well-known/` vers le panneau. | | Vous | Connecté à l'admin NexCMP **dans le même navigateur** que celui que vous utilisez pour l'écran de consentement. | | Client | Prend en charge MCP sur Streamable HTTP, OAuth 2.1 avec PKCE (S256) et l'enregistrement de client dynamique. | ## Connecter {#connect} 1. Dans l'application d'IA, ajoutez un connecteur MCP personnalisé et collez `https://cloud.example.com/mcp/admin`. Dans claude.ai, cela se trouve dans les paramètres des connecteurs (ajouter un connecteur personnalisé) ; dans ChatGPT, cela se trouve en mode développeur (ajouter un connecteur MCP, authentification OAuth). 2. Choisissez **Sign in** (ou « Connect ») dans l'application. Votre navigateur ouvre l'écran de consentement admin NexCMP. Si vous n'êtes pas connecté, connectez-vous d'abord ; l'écran continue ensuite. 3. Lisez la carte : « **Example AI app** souhaite gérer cet admin NexCMP » (le nom de l'application qui fait la demande), avec l'adresse vers laquelle vous serez renvoyé. 4. Cochez les portées à accorder. Celles demandées par l'application sont pré-cochées ; si aucune n'a été demandée, seul `admin:read` est coché. Voir [Scopes](https://nexcmp.com/fr/docs/configure-with-ai/admin-api-keys/#scopes). 5. Choisissez la durée de la connexion : **7**, **30** ou **90** jours (par défaut 30). 6. Cliquez sur **Allow**. Le navigateur revient à l'application, qui est désormais connectée. Cliquez sur **Deny** pour refuser. ![Écran de consentement demandant d'autoriser une application d'IA, avec des cases à cocher pour les portées, un choix de durée et des boutons Allow et Deny](https://nexcmp.com/fr/docs/images/configure-with-ai/oauth-connectors-01-consent.webp) ::: important Choisissez les portées comme vous le feriez pour une clé Accordez le plus petit ensemble possible pour effectuer la tâche. Les actions concernant l'argent, la suppression et la sécurité s'arrêtent toujours à un aperçu et nécessitent votre approbation, mais une connexion avec `settings:write` peut tout de même modifier votre image de marque et votre e-mail. ::: ## Gérer et révoquer {#manage-and-revoke} Ouvrez **System › Settings › API & AI agents › Connected apps**. Le tableau liste chaque application que vous avez connectée : application, portées, date de connexion, date d'expiration et dernière utilisation. Pour couper l'accès à une application, cliquez sur **Revoke** et confirmez. Ses jetons cessent de fonctionner immédiatement ; l'application doit repasser par l'écran de consentement pour se reconnecter. ![Onglet Connected apps listant une application d'IA avec ses portées, son expiration et un bouton Revoke](https://nexcmp.com/fr/docs/images/configure-with-ai/oauth-connectors-02-connected-apps.webp) ## Fonctionnement du flux {#how-the-flow-works} | Étape | Détail | |---|---| | Découverte | L'application lit `/.well-known/oauth-protected-resource/mcp/admin` puis `/.well-known/oauth-authorization-server/oauth-admin`. L'émetteur est `https://cloud.example.com/oauth-admin`. | | Enregistrement | L'application s'enregistre elle-même (`POST /oauth-admin/register`, RFC 7591). Seuls les clients publics sont pris en charge (pas de secret client). L'adresse de redirection doit être `https`, ou `http` sur le même ordinateur (bouclage). | | Autorisation | `GET /oauth-admin/authorize` avec la méthode PKCE `S256`. Le paramètre `resource`, lorsqu'il est envoyé, doit être l'URL `/mcp/admin` de ce panneau. La requête est valide pendant 10 minutes et est liée au navigateur qui l'a initiée. | | Consentement | Vous choisissez les portées et la durée (ci-dessus). Le code d'autorisation est valide 60 secondes et ne s'utilise qu'une seule fois. | | Jetons | `POST /oauth-admin/token` renvoie un **jeton d'accès** (un `ak_o...` secret, valide 1 heure ou jusqu'à la fin de la connexion, selon ce qui survient en premier) et un **jeton de rafraîchissement** (`akr_...`). Chaque rafraîchissement génère un nouveau jeton de rafraîchissement ; l'ancien cesse de fonctionner. La connexion prend fin après le nombre de jours que vous avez choisi. | | Révocation | **Revoke** dans Applications connectées, ou l'application appelle `POST /oauth-admin/revoke` (RFC 7009). | Le jeton d'accès se comporte comme une clé administrateur dotée des portées que vous avez accordées : mêmes règles de portée, confirmation, limite de débit et journal d'activité. Ses appels apparaissent dans l'onglet **Activity**. ## Vérification {#verify} 1. Dans l'application, demandez « run system_health » (ou « what tools do you have? »). L'application liste les outils autorisés par vos portées ([the tool list](https://nexcmp.com/fr/docs/configure-with-ai/mcp-admin/#tools)). 2. Ouvrez **Connected apps** : **Last used** change. 3. Ouvrez **Activity** : les appels sont répertoriés avec le nom de l'application et `mcp`. ## Limites et notes {#limits-notes} - Si l'application demande à nouveau de se connecter après une heure, cela est normal lorsqu'un client ne procède pas au rafraîchissement ; reconnectez-vous. - Un jeton de rafraîchissement utilisé deux fois est considéré comme compromis : toute la connexion est révoquée. Reconnectez-vous depuis l'application. - Un code d'autorisation utilisé deux fois est rejeté (`invalid_grant`) et les jetons déjà émis à partir de celui-ci sont révoqués. - L'accès OAuth n'accorde jamais plus que ce que permettent les règles de portée : [what a key can never do](https://nexcmp.com/fr/docs/configure-with-ai/admin-api-keys/#what-a-key-can-never-do) s'applique également aux applications connectées. - Les fournisseurs modifient leurs menus et les fonctionnalités prises en charge. Si l'application d'un fournisseur ne propose pas de connecteurs personnalisés sur votre formule, utilisez plutôt une [admin API key](https://nexcmp.com/fr/docs/configure-with-ai/admin-api-keys/) avec un client de bureau ou en ligne de commande. ## Dépannage {#troubleshooting} | Symptôme | Cause | Solution | |---|---|---| | L'écran de consentement indique « Wrong browser » | La requête a été initiée dans un navigateur différent de celui où vous êtes connecté | Relancez la connexion depuis l'application d'IA dans le même navigateur. | | L'écran de consentement indique que la requête a expiré ou est manquante | Plus de 10 minutes se sont écoulées ou le lien a été ouvert deux fois | Relancez la connexion depuis l'application d'IA. | | Page « Unknown client » ou « redirect address does not match » | L'enregistrement de l'application est obsolète ou utilise une adresse de redirection non enregistrée | Supprimez le connecteur dans l'application et ajoutez-le à nouveau. | | `invalid_target` | L'élément `resource` envoyé ne correspond pas à l'URL `/mcp/admin` de ce panneau | Utilisez l'URL exacte affichée sur l'onglet **Connect an AI**. | | `invalid_request` à propos de PKCE | Le client n'envoie pas `code_challenge_method=S256` | Utilisez un client qui prend en charge OAuth 2.1 avec PKCE. | | L'application se connecte mais un appel renvoie `insufficient_scope` | Vous n'avez pas coché cette portée | Révoquez la connexion et reconnectez-vous en cochant la portée. | | L'application ne parvient pas à joindre l'URL | Le DNS, TLS ou le proxy inverse bloque `/mcp/admin`, `/oauth-admin/` ou `/.well-known/` | Vérifiez les règles du proxy. | --- # Configuration as code {#configuration-as-code} > **Où dans l'administration :** System › Settings › Import/Export (`/agent/config`). Sur le serveur : les commandes `nexcmp config export`, `plan` et `apply`, ainsi que `nexcmp admin `. ## Description {#what-it-does} La configuration de votre panel (image de marque, paramètres généraux, e-mails, alertes Telegram, modules, devise, passerelles de paiement, limites, zones, offres, fournisseur AI et pages légales) peut être sauvegardée sous forme de fichier YAML unique. Vous pouvez modifier ce fichier vous-même, demander à un assistant AI de le modifier, le conserver dans un système de contrôle de version et l'appliquer au même panel ou à un autre. Avant toute modification, une liste des différences s'affiche toujours. Les secrets ne sont jamais écrits dans le fichier. Utilisez-le pour cloner une configuration vers une seconde installation, examiner les modifications avant qu'elles ne soient effectives, restaurer des paramètres après une erreur ou laisser l'AI proposer une configuration complète que vous lisez comme un document unique. ## Prérequis {#requirements} | Élément | Prérequis | |---|---| | NexCMP | 1.4.0 ou supérieur. | | Ligne de commande | Vous êtes `root` sur le serveur du panel (utilisez `sudo`). La commande demande d'elle-même au panel une clé temporaire (15 minutes, toutes les portées). Pour utiliser à la place une clé plus restreinte, définissez `NEXCMP_KEY` sur une [admin API key](https://nexcmp.com/fr/docs/configure-with-ai/admin-api-keys/) et conservez-la via sudo, par exemple `sudo --preserve-env=NEXCMP_KEY nexcmp config plan -f nexcmp.yaml`. | | Page d'administration | Connecté en tant qu'administrateur. La page est en lecture seule sur un panel de démonstration. | | Secrets | Valeurs fournies au moment de l'application (voir [Secrets](#secrets)) ; jamais à l'intérieur du fichier. | ## Exporter, modifier, prévisualiser, appliquer {#export-edit-preview-apply} 1. Exporter la configuration actuelle : ```bash sudo nexcmp config export -o nexcmp.yaml ``` Sans `-o`, le code YAML est affiché à l'écran. 2. Modifier `nexcmp.yaml` (voir l'[exemple](#example-file) ci-dessous). Conserver `version: 1` en haut. 3. Prévisualiser les modifications potentielles. Cela ne modifie rien : ```bash sudo nexcmp config plan -f nexcmp.yaml ``` Chaque ligne indique la section, l'élément, le champ et `old → new`. Les lignes marquées `$` appartiennent aux sections de facturation (voir [Billing sections](#billing-sections)). Si le panel correspond déjà au fichier, vous voyez "No changes". 4. Appliquer. Sans `--yes`, la commande est une **simulation** (dry run) et affiche uniquement la même liste : ```bash sudo nexcmp config apply -f nexcmp.yaml --yes ``` 5. Lire le résultat : `applied`, `pending` (en attente de votre confirmation), `skipped` et `errors`. | Option | Description | |---|---| | `-f ` | Le fichier YAML (requis pour `plan` et `apply`). | | `--yes` | Appliquer réellement. Sans cette option, `apply` est une simulation. | | `--confirm-billing` | Appliquer également les sections de facturation (`payments`, `currency`, `plans`). Sans cette option, elles sont ignorées. | | `--section ` | Appliquer uniquement cette section. Répéter l'option pour en appliquer plusieurs. | | `-o ` | Avec `export` : écrire le YAML dans un fichier. | Le code de retour est 0 lorsque tout a été appliqué ou qu'aucun changement n'a eu lieu, 1 lorsqu'une erreur a été renvoyée, et 2 en cas d'erreur d'utilisation ou de clé. ### Secrets {#secrets} Le fichier contient des références au lieu de secrets, telles que `password: secret://smtp_password`. Lors de l'application, la valeur provient d'une variable d'environnement nommée `NEXCMP_SECRET_` suivie du nom de la référence en majuscules : ```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 ``` Si une référence n'a pas de valeur, le secret déjà enregistré dans le panel est **conservé**. Un secret qui n'a jamais été enregistré et n'est pas fourni reste vide. | Nom de la référence | Emplacement de destination | |---|---| | `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` | ## Exemple de fichier {#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). ``` Un fichier peut contenir un sous-ensemble quelconque de sections. Une section omise n'est pas modifiée. Un fichier supérieur à 1 Mo, un élément `version: 1` manquant, un numéro de version différent ou une section inconnue est rejeté avant toute exécution. ## Sections {#sections} | Section | Éléments contrôlés | Remarques | |---|---|---| | `branding` | Nom de la marque (jusqu'à 60 caractères), couleur principale, devise d'affichage (`usd` ou `vnd`), nom du vendeur. | Les logos ne font pas partie du fichier ; utilisez la [branding page](https://nexcmp.com/fr/docs/customers/branding/). | | `settings` | Une liste fixe de paramètres généraux : `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`. | Les autres clés sont ignorées. | | `email.smtp` | Hôte SMTP, port, sécurité (`starttls`, `tls`, `none`), utilisateur, mot de passe, nom et adresse de l'expéditeur, adresse de réponse. | [SMTP et e-mail templates](https://nexcmp.com/fr/docs/administration/smtp-and-emails/). La modification de l'hôte, du port ou de la sécurité nécessite de saisir à nouveau le mot de passe. | | `telegram` | Canal d'alerte activé ou désactivé, ID de chat, jeton du bot. | [Notifications Telegram](https://nexcmp.com/fr/docs/administration/telegram-notifications/). | | `modules` | Modules optionnels activés ou désactivés (`key: true/false`). | Seules les clés que le panneau permet de basculer. Voir [Modules](https://nexcmp.com/fr/docs/infrastructure/modules/). | | `currency` | Devise d'affichage et taux USD vers VND manuel (`0` automatique, sinon 15000 à 50000). | Section de facturation. Voir [Devise et taux de change](https://nexcmp.com/fr/docs/catalog/currency-and-exchange-rates/). | | `payments` | Identifiants `stripe`, `paypal`, `crypto`, `bank` et commutateurs `channels` (`pay_card_enabled`, `pay_wallets_enabled`, `pay_alipay_enabled`, `pay_paypal_enabled`, `pay_usdt_enabled`, `pay_sepay_enabled`). | Section de facturation. Voir [Canaux de paiement](https://nexcmp.com/fr/docs/billing/payment-channels/). | | `quotas` | Limites `quota_*`. | Voir [Quotas](https://nexcmp.com/fr/docs/billing/quotas/). | | `zones` | Zones par `slug` (requis : `slug`, `name`, `country` ; optionnel : `city`, `enabled`, `is_default`). | De nouvelles zones sont créées. Une zone existante n'est **pas modifiée** par le fichier. Voir [Zones](https://nexcmp.com/fr/docs/infrastructure/zones/). | | `plans` | Plans par `slug` (requis : `slug`, `name`, `cpu`, `ram_mb`, `disk_gb`, `hourly_usd` ; optionnel : `cs_offering_id`, `backend_id`, `zone_id`, `enabled`, `visible`, `sort`, `description`). | Section de facturation. De nouveaux plans sont créés, les existants sont mis à jour par leur slug. Les prix sont en USD par heure. Voir [Plans](https://nexcmp.com/fr/docs/catalog/plans/). | | `ai_provider` | Le fournisseur d'IA du panneau utilisé pour l'AI Chat client et l'AI Agent. | [AI provider](https://nexcmp.com/fr/docs/ai/ai-providers/). | | `legal` | Texte des conditions et de la confidentialité par langue (`en`, `vi`). | [Pages légales](https://nexcmp.com/fr/docs/customers/legal/). | L'ordre d'application est l'ordre ci-dessus : les éléments liés à l'infrastructure avant les plans. ## Règles à retenir {#rules-to-remember} - **Idempotent.** Appliquer le même fichier deux fois ne change rien la seconde fois. `plan` affiche "No changes". - **Aucune suppression.** Le fichier ne supprime jamais de zone, de plan ou de paramètre. Retirer une entrée du fichier laisse le panneau tel quel. - **Les règles de sécurité normales s'appliquent toujours.** En ligne de commande, chaque modification passe par les mêmes vérifications qu'un changement d'API : portées et règles IP. Une modification nécessitant une confirmation (un commutateur global, par exemple) est signalée sous `pending` avec un aperçu au lieu d'être appliquée, sauf si vous passez `--confirm-billing`, ce qui les confirme toutes. - **Les clients IA ne peuvent pas déverrouiller la facturation.** Lorsque `config_apply` est appelé par un client MCP, `confirm_billing` est ignoré ; les modifications financières attendent votre intervention. - **Vérifiez avant d'appliquer.** Le schéma JSON décrit chaque champ. Pointez votre éditeur dessus ou fournissez-le à une IA pour qu'elle écrive un YAML valide : `https://cloud.example.com/v1/admin/agent/config/schema.json` (accessible publiquement). ### Sections de facturation {#billing-sections} `payments`, `currency` et `plans` modifient les prix ou les flux financiers. `nexcmp config apply --yes` les **ignore** sauf si vous ajoutez `--confirm-billing` ; elles sont alors listées sous `skipped` ("billing section - pass confirm_billing"). L'indicateur sert de confirmation : avec lui, chaque modification de facturation dans le fichier (et tout autre changement nécessitant une confirmation) est appliquée sans second prompt. Exécutez d'abord `plan` et lisez chaque ligne marquée `$`. Lorsque le même fichier est appliqué par une IA (l'outil `config_apply` dans un client MCP ou AI Chat), l'indicateur est ignoré et les mouvements d'argent attendent plutôt votre approbation. ## Utiliser la page Import/Export {#use-the-import-export-page} 1. Ouvrez **System › Settings › Import/Export**. 2. Sous **Export**, cliquez sur **Get current configuration**, puis sur **Download .yaml** pour enregistrer `nexcmp.yaml`. Les secrets apparaissent sous forme de texte fictif. 3. Sous **Import**, choisissez un fichier, glissez-le dans la zone ou collez le YAML. 4. Facultatif : ouvrez **Secrets that come with it (not in the file)** et ajoutez un nom et une valeur pour chaque référence, par exemple `smtp_password`. 5. Cliquez sur **Preview changes**. Le tableau groupe les modifications par section ; les sections liées à l'argent comportent un tag "Money-related". Décochez les sections dont vous ne voulez pas. 6. Si des sections liées aux finances sont répertoriées, cochez **Also apply money-related changes (prices, payment gateways, balances)**. Sans cette coche, elles sont ignorées. 7. Cliquez sur **Apply selected**. Le résultat indique ce qui a été appliqué, ignoré ou a échoué. Une modification renvoyée comme étant en attente de confirmation apparaît sous forme de carte de confirmation ; cliquez sur **Confirm** sur celle-ci. Le bouton **JSON Schema** en haut à droite ouvre le schéma. ![Page d'importation/exportation avec la carte Export et la carte Import contenant le code YAML exporté](https://nexcmp.com/fr/docs/images/configure-with-ai/config-as-code-01-import-export.webp) ![Tableau d'aperçu des modifications regroupées par section avec un libellé de facturation et un bouton Apply selected](https://nexcmp.com/fr/docs/images/configure-with-ai/config-as-code-02-preview.webp) ## Exécuter n'importe quel outil depuis la ligne de commande {#run-any-tool-from-the-command-line} `nexcmp admin` exécute les mêmes outils que les assistants IA ([the tool list](https://nexcmp.com/fr/docs/configure-with-ai/mcp-admin/#tools)) et affiche du 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"}}' ``` Les arguments sont des paires `key=value` (les valeurs sont lues comme du JSON si elles s'analysent ainsi, sinon comme du texte) ou un unique objet `--json '{...}'`. Si l'action nécessite une confirmation, la commande affiche l'aperçu et s'arrête avec le code de sortie 3 et "Nothing changed". Lisez l'aperçu, puis réexécutez la même commande avec `--yes` pour l'appliquer. Exécutée en tant que root, la commande obtient une clé de 15 minutes avec toutes les permissions, l'étape de confirmation constitue donc votre garde-fou ; avec `NEXCMP_KEY`, les propres permissions de la clé s'appliquent. ## Vérification {#verify} 1. `sudo nexcmp config plan -f nexcmp.yaml` juste après un `apply --yes` affiche "No changes". 2. Dans l'administration, les pages que vous avez modifiées affichent les nouvelles valeurs, et **Logs › Admin actions** répertorie les modifications. 3. Appliquer à nouveau le même fichier ne change rien. ## Limites et notes {#limits-notes} - Le fichier couvre les paramètres ci-dessus, et non les clients, serveurs, factures ou sources d'infrastructure (connexions CloudStack et Proxmox). Connectez-les à l'aide de [AI Chat](https://nexcmp.com/fr/docs/configure-with-ai/ai-chat-in-admin/) ou des pages d'administration. - Les zones et les plans sont mis làmatch par `slug`. Ne renommez pas un slug dans le fichier : il serait créé comme un nouvel élément. - Un plan déjà utilisé par des clients ne peut pas modifier sa taille ; créez plutôt un nouveau plan. - Gardez les fichiers exportés confidentiels même s'ils ne contiennent aucun secret : ils répertorient vos prix, adresses et noms de compte. ## Dépannage {#troubleshooting} | Symptôme | Cause | Solution | |---|---|---| | `missing version: 1` | Le fichier ne commence pas par `version: 1` | Ajoutez-le. | | `unsupported version 2` | Le fichier a un autre numéro de version | Ce panneau lit uniquement la version 1. | | `unknown section 'x' (known: ...)` | Une clé de niveau supérieur mal orthographiée ou non prise en charge | Utilisez les sections ci-dessus. | | `YAML error: ...` | YAML invalide (indiçage, tabulations) | Corrigez la ligne mentionnée par le message. | | `config is larger than 1 MB` | Fichier trop volumineux | Divisez-le et utilisez `--section`. | | `no API key: set NEXCMP_KEY=ak_... or run as root on the server` | La commande n'a trouvé aucune clé | Exécutez avec `sudo`, ou exportez `NEXCMP_KEY` et conservez-le via sudo. | | `panel not reachable` | Le service du panneau ne s'exécute pas sur le port par défaut | Vérifiez `sudo nexcmp status`. | | Lignes de facturation sous `skipped` | Les sections de facturation nécessitent `--confirm-billing` | Ajoutez l'indicateur et examinez d'abord les lignes `$`. | | Éléments sous `pending` | La modification nécessite une confirmation | Ouvrez **API & AI agents**, ou le résultat de l'importation/exportation, et appuyez sur **Confirm** sur la carte. | | Un secret n'a pas été mis à jour | Aucune valeur `NEXCMP_SECRET_` n'a été définie, le secret enregistré a donc été conservé | Exportez la variable et appliquez-la à nouveau. | | Entrée sous `errors` avec HTTP 403 `insufficient_scope` | La clé n'a pas la permission pour cette section | Utilisez une clé disposant de la permission, ou exécutez en tant que root. | | Entrée sous `errors` avec HTTP 403 `demo_read_only` | Panneau de démo | Appliquer sur une vraie installation. | --- # Exemples de prompts {#example-prompts} > **Où trouver dans l'admin :** AI Chat (`/agent`) ou le bouton flottant **Ask AI** sur n'importe quelle page d'administration. Les mêmes prompts fonctionnent dans tout client AI connecté via [MCP](https://nexcmp.com/fr/docs/configure-with-ai/mcp-admin/). ## Description {#what-it-does} Ces prompts montrent comment formuler vos demandes. Chacun indique ce que l'assistant fait en arrière-plan, les portées nécessaires (pour un client externe ou une clé) et l'endroit où vous devez approuver. Remplacez les valeurs d'exemple par les vôtres. ::: tip Ne saisissez jamais de secret dans le texte du chat Pour les mots de passe, clés API et jetons, utilisez le champ **Secret** situé à côté de la saisie de l'AI Chat ([détails](https://nexcmp.com/fr/docs/configure-with-ai/ai-chat-in-admin/#secrets)). L'AI voit uniquement un espace réservé représentant le secret, et non sa valeur. Avec un client AI externe, le secret transite par ce client ; il est donc préférable de le saisir dans l'admin. ::: ## Vérifier où vous en êtes {#check-where-you-are} ```text Check my setup progress and tell me the next three things to do, in order. ``` L'assistant appelle `setup_checklist` et `system_health` (portée `admin:read`) et répond à partir de l'état réel. Voir [Setup progress checklist](https://nexcmp.com/fr/docs/configure-with-ai/setup-checklist/). ## Première configuration {#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. ``` C'est la même chose que le prompt MCP `initial-setup`. Il nécessite `admin:read` ainsi que les portées des étapes que vous acceptez. Attendez-vous à une carte de confirmation pour chaque modification dans l'AI Chat. ## Ajouter un cluster 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. ``` Ce qui se passe : 1. L'assistant demande l'ID du jeton API (`user@realm!tokenid`) et son secret. Placez le secret dans le champ **Secret**. Créez d'abord un jeton restreint : [Proxmox VE](https://nexcmp.com/fr/docs/infrastructure/proxmox/). 2. Il appelle `proxmox_add`, `proxmox_test`, `zone_create` et `proxmox_attach_zone`. 3. Il propose des plans avec `plans_from_offerings` et attend votre approbation (voir l'exemple suivant). Portées : `infra:write`, `secrets:write`, `catalog:write`, `admin:read`. ## Créer un tableau de plans avec une marge de 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. ``` L'assistant appelle `plans_from_offerings` avec `margin_pct` 40 et vos coûts. La marge est la part du prix de vente qui constitue le bénéfice : à 40 %, un plan qui vous coûte $60 se vend $100. Le premier appel renvoie uniquement un aperçu. Lorsque vous approuvez, il rappelle l'outil avec `apply=true`, ce qui crée les plans en une seule étape et demande une seule confirmation puisque des prix sont impliqués. Pour Proxmox, il utilise `backend_id` et une liste de tailles par défaut (1, 2, 2 et 4 vCPU). Portées : `catalog:write`, `admin:read`. Voir [Plans](https://nexcmp.com/fr/docs/catalog/plans/). ![Réponse de l'AI Chat montrant un tableau d'aperçu des plans avec le coût, le prix mensuel et le prix horaire](https://nexcmp.com/fr/docs/images/configure-with-ai/example-prompts-01-plan-preview.webp) ## Configurer l'e-mail et envoyer un message de test {#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. ``` L'assistant appelle `smtp_get`, `smtp_configure` et `smtp_test` et vous indique si le message a été accepté. Portées : `settings:write`, `secrets:write`. Voir [SMTP and e-mail templates](https://nexcmp.com/fr/docs/administration/smtp-and-emails/). ## Configurer 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` est toujours une action en deux étapes : vous voyez un aperçu avec les valeurs secrètes masquées et vous l'approuvez. Ensuite, `payment_test` vérifie les identifiants auprès de Stripe. Portées : `billing:write`, `secrets:write`. Passez en mode production uniquement après un paiement test. Voir [Stripe](https://nexcmp.com/fr/docs/billing/stripe/). ## Activer les alertes 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. ``` L'assistant appelle `telegram_configure` et `telegram_test`. Portées : `settings:write`, `secrets:write`. Voir [Telegram notifications](https://nexcmp.com/fr/docs/administration/telegram-notifications/). ## Trouver un client et ajouter du crédit {#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. ``` L'assistant appelle `customers_search` et `customer_get` (lecture seule), puis `customer_adjust_balance` avec `delta_cents` 1000 et un motif. Cela nécessite **toujours** votre approbation : la carte de confirmation indique « modifie le solde d'un client » et affiche le montant ainsi que le motif qui sera consigné dans le journal d'audit. Portées : `admin:read`, `billing:write`. ## Exporter ma configuration {#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. ``` L'assistant appelle `config_export`. Les secrets sont remplacés par des références `secret://`. Enregistrez le résultat sous `nexcmp.yaml` et conservez-le dans le système de gestion de versions. Voir [Configuration as code](https://nexcmp.com/fr/docs/configure-with-ai/config-as-code/). Portée : `admin:read`. ## Rédiger de bons prompts {#write-good-prompts} - Donnez l'objectif et les faits : noms, prix, adresses e-mail. Ne collez pas de secrets. - Demandez d'abord un aperçu pour tout ce qui coûte de l'argent ou supprime des données. - Demandez à l'assistant de "lire la valeur actuelle avant de la modifier". Les instructions intégrées le prévoient déjà. - Si une réponse semble erronée, demandez "quel outil as-tu appelé et avec quels arguments ?". Les cartes d'outils dans AI Chat affichent les deux. ## Dépannage {#troubleshooting} | Symptôme | Cause | Solution | |---|---|---| | L'assistant indique qu'il n'a pas d'outil pour une action | La portée de cet outil n'est pas accordée, ou l'action est interdite à l'IA | Vérifiez [Admin API keys](https://nexcmp.com/fr/docs/configure-with-ai/admin-api-keys/#what-a-key-can-never-do), ou effectuez l'opération dans l'administration. | | Il vous demande de coller un mot de passe | Le modèle a ignoré les instructions | Refusez ; utilisez le champ Secret ou saisissez la valeur dans l'administration. | | Rien ne change après "fais-le" | Des modifications attendent votre confirmation | Faites défiler jusqu'à la carte de confirmation et appuyez sur **Confirm**. | | Des plans ont été créés à un prix inattendu | Les coûts ou la marge indiqués dans le prompt étaient erronés | Modifiez les plans sur la page Plans ou demandez à l'assistant de recalculer leurs prix ; les modifications de prix requièrent une confirmation. | --- # Liste de contrôle de configuration {#setup-progress-checklist} > **Où dans l'administration :** Overview › Dashboard (`/`), la carte **Setup progress** en haut. Les listes vides sur Plans, Customers, Zones, Payments et Infrastructure affichent la même aide. ## Description {#what-it-does} Une nouvelle installation requiert dix éléments avant que le premier client puisse commander et payer. La carte **Setup progress** les vérifie pour vous à partir de la configuration réelle, indique combien sont réalisés, nomme la **prochaine étape** et renvoie vers la page correspondante. Si vous disposez d'une source IA connectée, **Do it for me** ouvre [AI assistant](https://nexcmp.com/fr/docs/configure-with-ai/ai-chat-in-admin/) avec une question prête à l'emploi pour cette étape. L'assistant (ainsi que tout client IA via [MCP](https://nexcmp.com/fr/docs/configure-with-ai/mcp-admin/)) peut lire la même liste avec l'outil `setup_checklist`. ## Les dix étapes {#the-ten-steps} | # | Étape | Considéré comme validé lorsque | Où l'effectuer | |---|---|---|---| | 1 | Licence active | La licence est activée pour votre domaine | System › Admin › License & updates (`/license`). Voir [License and purchase](https://nexcmp.com/fr/docs/getting-started/license-and-purchase/). | | 2 | Connecter une source d'infrastructure | CloudStack est connecté, ou au moins un cluster Proxmox VE est ajouté | Infrastructure › Cloud provider › Providers (`/infra/providers`). Voir [CloudStack](https://nexcmp.com/fr/docs/infrastructure/cloudstack/) et [Proxmox VE](https://nexcmp.com/fr/docs/infrastructure/proxmox/). | | 3 | Créer une zone | Au moins une zone existe | Infrastructure › Datacenter › Zone (`/infra/zones`). Voir [Zones](https://nexcmp.com/fr/docs/infrastructure/zones/). | | 4 | Modèles d'OS | Au moins un modèle est activé | Services › Virtual Machines › Plans & pricing, onglet Templates (`/vm/catalog?tab=templates`). Voir [OS templates](https://nexcmp.com/fr/docs/infrastructure/templates/). | | 5 | Créer des plans | Au moins un plan est activé | Services › Virtual Machines › Plans & pricing (`/vm/catalog`). Voir [Plans and pricing](https://nexcmp.com/fr/docs/catalog/plans/). | | 6 | Configurer les paiements | Stripe, PayPal, les cryptomonnaies ou le virement bancaire sont configurés | Finance › Payment channels (`/payments`). Voir [Payment channels](https://nexcmp.com/fr/docs/billing/payment-channels/). | | 7 | Email (SMTP) | Les e-mails sortants sont configurés | System › Settings › Email (`/settings/email`). Voir [SMTP and e-mail templates](https://nexcmp.com/fr/docs/administration/smtp-and-emails/). | | 8 | Personnalisation | Un logo est téléchargé, ou le nom de la marque est modifié par rapport à la valeur par défaut | System › Settings › Brand (`/settings/branding`). Voir [Branding](https://nexcmp.com/fr/docs/customers/branding/). | | 9 | Terms & privacy | Au moins un texte juridique est renseigné | System › Settings › Legal (`/settings/legal`). Voir [Legal pages](https://nexcmp.com/fr/docs/customers/legal/). | | 10 | Passer une commande de test | Au moins une commande existe | Passez une commande en tant que client dans le portail client pour vérifier que tout fonctionne de bout en bout ; la carte renvoie vers la page Billing (`/billing`). | La carte affiche `done/total` (par exemple 6/10), une barre de progression, l'étape suivante avec **Open** et, lorsqu'une source IA est connectée, **Do it for me**. Cliquez sur une étape pour accéder à sa page. À côté d'une étape, un petit lien ouvre la page de documentation correspondante ; certaines étapes affichent également un détail tel que "2 zone(s)". ![Carte de progression de la configuration sur l'aperçu avec trois étapes sur dix terminées et les boutons Open et Do it for me](https://nexcmp.com/fr/docs/images/configure-with-ai/setup-checklist-01-card.webp) ## L'utiliser {#use-it} 1. Ouvrez l'aperçu. La carte se trouve en haut. Utilisez la flèche pour la réduire ; le panneau mémorise votre choix dans votre navigateur. 2. Cliquez sur **Open** pour accéder à la page de l'étape suivante, ou cliquez sur **Do it for me**. 3. Avec **Do it for me**, l'assistant s'ouvre avec une demande telle que "Suggère un tableau de forfaits de démarrage à partir de mes offres avec une marge de 40%, montre-moi l'aperçu avant de le créer." Répondez à ses questions, puis examinez et **Confirm** chaque carte. Voir [AI Chat in the admin](https://nexcmp.com/fr/docs/configure-with-ai/ai-chat-in-admin/). 4. Lorsque les dix étapes sont terminées, la carte disparaît. ### Empty lists {#empty-lists} Lorsque Plans, Customers, Zones, Payments ou Infrastructure est vide, la page affiche un bloc **Next step** avec une explication, un bouton pour l'action, **Do it for me** et un lien vers la documentation, afin de ne jamais tomber sur un tableau vide. ![Page Plans vide avec une explication de l'étape suivante et le bouton Do it for me](https://nexcmp.com/fr/docs/images/configure-with-ai/setup-checklist-02-empty.webp) ## Demandez-le avec vos propres mots {#ask-for-it-in-your-own-words} Vous n'avez pas besoin de la carte. Dans AI Chat ou tout client IA connecté, vous pouvez demander : ```text Check my setup progress and take me through the open steps, one at a time. ``` Il s'agit également de l'invite MCP `initial-setup`. L'assistant appelle `setup_checklist`, explique pourquoi chaque étape ouverte compte, demande les informations dont il a besoin et utilise l'outil correspondant. Portées nécessaires : `admin:read` pour lire la liste, plus la portée de l'étape que vous souhaitez effectuer. Voir [Example prompts](https://nexcmp.com/fr/docs/configure-with-ai/example-prompts/). ## Vérification {#verify} 1. Une fois une étape terminée, le compteur de la carte augmente au chargement suivant de la vue d'ensemble. 2. Dans l'assistant, `setup_checklist` renvoie les mêmes chiffres, avec `done: true` sur l'étape terminée. ## Limites et notes {#limits-notes} - Les vérifications examinent ce qui est enregistré et non si cela fonctionne. Une passerelle configurée est comptée comme terminée même si son test échoue. Utilisez les boutons **Test** sur chaque page et l'outil `system_health` en cas de problème. - Cette carte est réservée aux administrateurs. - **Do it for me** nécessite une source IA connectée sous System › Settings › AI accounts ; sans cela, seul **Open** est affiché. - Les dix étapes sont les mêmes pour chaque installation ; une étape que vous ne prévoyez pas d'utiliser (par exemple les paiements sur un cloud privé) compte tout de même comme ouverte. ## Dépannage {#troubleshooting} | Symptôme | Cause | Solution | |---|---|---| | La carte est manquante | Les dix étapes sont terminées ou la carte n'a pas pu être chargée | Rechargez la vue d'ensemble. Demandez à `setup_checklist` dans AI Chat pour voir l'état. | | Une étape reste ouverte après que vous l'avez effectuée | La sauvegarde ne s'est pas terminée ou la condition n'est pas encore remplie (par exemple, un modèle existe mais est désactivé). | Ouvrez la page de l'étape et vérifiez le tableau ci-dessus. | | L'image de marque reste ouverte après le changement de logo | L'image de marque est prise en compte lorsqu'un logo existe ou que le nom de la marque diffère du nom par défaut "NexCMP". | Téléchargez un logo ou définissez votre propre nom. | | **Do it for me** ne fait rien | Aucune source d'IA connectée ou panneau de démonstration | Connectez une source dans les comptes d'IA. | --- # SMTP et modèles d'e-mails {#smtp-and-e-mail-templates} > **Où dans l'administration :** System › Settings › Email (`/settings/email`) — onglets **SMTP** et **Email templates**. Journal des envois : Overview › Support › Sent emails (`/support/emails`). ## Description {#what-it-does} NexCMP envoie des e-mails pour la vérification à l'inscription, la réinitialisation de mot de passe, l'indication "VM prête" (avec le mot de passe initial), les factures, le solde bas, les renouvellements, les recharges, les réponses du support et plus encore. Tous transitent par **un compte SMTP que vous fournissez**. Les messages et modèles existent en 16 langues ; la langue du client est utilisée. ## Prérequis {#requirements} | Élément | Prérequis | |---|---| | Serveur SMTP | Hôte, port et identifiants de n'importe quel fournisseur (votre propre serveur, Brevo, Amazon SES, Mailgun, Google Workspace …) | | Réseau | TCP sortant du serveur NexCMP vers l'hôte et le port SMTP (587 STARTTLS, 465 TLS ou 25) | | Domaine d'expéditeur | Un domaine que vous contrôlez, avec **SPF et DKIM** publiés pour le fournisseur et un enregistrement DMARC | | Permission | Le compte SMTP doit être autorisé à envoyer en tant qu'adresse **From** | ::: warning Livrabilité Les e-mails tels que "VM prête" contiennent des mots de passe. Si les enregistrements SPF/DKIM/DMARC du domaine d'expéditeur ne correspondent pas au fournisseur SMTP, ils finissent dans les spams. La page vous le rappelle. ::: ## Préparer le fournisseur d'e-mails {#prepare-the-e-mail-provider} 1. Dans le panneau de votre fournisseur, ajoutez et vérifiez votre domaine d'envoi (par exemple `example.com`). 2. Publiez les enregistrements DNS SPF, DKIM et DMARC indiqués par le fournisseur. 3. Créez un utilisateur SMTP (ou une clé API-SMTP) et notez l'hôte, le port, le nom d'utilisateur et le mot de passe. ## Connecter dans NexCMP {#connect-in-nexcmp} 1. Ouvrez **System › Settings › Email**, onglet **SMTP**. 2. Remplissez le formulaire : | Champ | Exemple | Remarques | |---|---|---| | Hôte | `smtp.example.net` | Serveur SMTP | | Port | `587` | | | Sécurité | STARTTLS (587) | Choisissez le mode requis par votre fournisseur | | Nom d'utilisateur | `smtp-user` | | | Password | (masqué) | Écriture seule : la page indique uniquement si un élément est défini | | E-mail de l'expéditeur | `no-reply@example.com` | Doit être autorisé chez le fournisseur | | Nom de l'expéditeur | `Example Cloud` | Utilise par défaut le nom de votre marque | | Répondre à (optionnel) | `support@example.com` | Où vont les réponses des clients | ![L'onglet SMTP de Settings, Email avec les champs hôte, port, sécurité, nom d'utilisateur, expéditeur et le bouton Send test](https://nexcmp.com/fr/docs/images/administration/smtp-and-emails-01-smtp.webp) 3. Cliquez sur **Save**, puis sur **Send test** et saisissez votre propre adresse. Les paramètres sont stockés dans un fichier restreint en accès (`smtp.json`, mode 0600) et seul le service d'arrière-plan `nexcmp-vmd` envoie les e-mails ; le service web se contente de les mettre en file d'attente. ## Vérification {#verify} - Le message de test arrive dans la boîte de réception (vérifiez aussi les spams). Dans la source du message, confirmez `dkim=pass` et `spf=pass`. - Ouvrez **Support › Sent emails** : chaque message possède un statut (queued, sent, failed) et un résultat de livraison. Les messages échoués sont réessayés jusqu'à 3 fois. - Enregistrez un client test dans le portail et vérifiez que l'e-mail de confirmation arrive. ## Modifier les modèles d'e-mail {#edit-e-mail-templates} L'onglet **Email templates** liste chaque modèle par clé, avec les langues dans lesquelles il existe (par exemple `verify_email`, `reset_password`, `vm_ready`, `invoice_paid`, `low_balance`, `topup_received`, `ticket_reply`, `scale_up` …). 1. Cliquez sur un modèle et choisissez une langue. 2. Modifiez l'objet et le corps. Les espaces réservés sont remplis lorsqu'un message est mis en file d'attente. 3. Enregistrez. La modification s'applique **immédiatement** aux messages mis en file d'attente par la suite. ![L'onglet Email templates affichant les clés de modèle et leurs langues](https://nexcmp.com/fr/docs/images/administration/smtp-and-emails-02-templates.webp) ## Limites et remarques {#limits-and-notes} - Un seul compte SMTP par installation. Les clients des revendeurs reçoivent les e-mails via le même compte, sauf si le revendeur est configuré autrement. - Les limites d'envoi du fournisseur s'appliquent ; NexCMP ne bride pas les envois au-delà des nouvelles tentatives. - Sans SMTP, le panneau fonctionne, mais la vérification des inscriptions et la réinitialisation des mots de passe ne peuvent pas être effectuées par les clients. ## Dépannage {#troubleshooting} | Symptôme | Cause | Solution | |---|---|---| | L'e-mail de test n'arrive jamais | Identifiants erronés, port bloqué, expéditeur non autorisé | Vérifiez `journalctl -u nexcmp-vmd` pour l'erreur SMTP ; essayez le port 587 avec STARTTLS ; vérifiez l'adresse From auprès du fournisseur. | | Les messages vont dans les spams | SPF/DKIM/DMARC manquant ou mal configuré | Publiez les enregistrements du fournisseur et envoyez depuis ce domaine. | | "failed" dans Sent emails | Le fournisseur a rejeté le message | Ouvrez la ligne pour voir la réponse du fournisseur. | | Le champ du mot de passe semble vide après l'enregistrement | Par conception (écriture seule) | Le libellé indique "current: set" une fois qu'un mot de passe est enregistré. | --- # Telegram et alertes admin {#telegram-and-admin-alerts} > **Où le trouver dans l'admin :** System › Settings › Admin alerts (`/settings/alerts`). Raccourcis d'assistance : Customers › Support › Tickets (`/support/tickets`), onglet **Settings**. ## Description {#what-it-does} NexCMP **vous** notifie — l'opérateur — lorsqu'une action est requise et lorsqu'un client s'inscrit ou crédite son compte. Les alertes sont envoyées vers un ou plusieurs **canaux** : Telegram, un webhook ou par e-mail. Les événements envoyés aux canaux administrateur incluent : échec de déploiement, machine virtuelle manquante, réseau indisponible, moins de 30 IP libres, élément sur le point d'expirer (avertissement 1 heure), litige Stripe, processus inactif, RAM du cluster au-dessus du seuil, nouvelle inscription client et dépôts crédités. Les événements clients sont mis en file d'attente de manière durable et réessayés avec un délai croissant (de 30 secondes à 1 heure) jusqu'à ce que Telegram les accepte. ## Prérequis {#requirements} | Élément | Prérequis | |---|---| | Telegram | Un bot créé avec **@BotFather** (jeton) et le **chat ID** du groupe ou de l'utilisateur devant recevoir les messages | | Réseau | HTTPS sortant vers `api.telegram.org` | | Webhook (alternatif) | Un point de terminaison HTTPS qui accepte la charge utile de l'alerte | ## Préparer Telegram {#prepare-telegram} 1. Dans Telegram, ouvrez **@BotFather**, envoyez `/newbot`, choisissez un nom et copiez le **bot token** (`123456789:AA...`). 2. Créez un groupe, ajoutez-y le bot et envoyez n'importe quel message. 3. Trouvez le **chat ID** : ouvrez `https://api.telegram.org/bot/getUpdates` dans un navigateur et lisez `chat.id` (les identifiants de groupe commencent par `-`). ## Connecter dans NexCMP {#connect-in-nexcmp} 1. Ouvrez **System › Settings › Admin alerts**. 2. Dans **Add channel**, choisissez **Type: Telegram**, définissez **Destination** sur le chat ID et **Secret (bot token)** sur le jeton. Cliquez sur **Add**. 3. Assurez-vous que l'interrupteur **Send admin Telegram (VM module)** est activé ; la ligne *VM module status (read-only)* indique "on". ![La page des alertes administrateur avec le formulaire d'ajout de canal configuré pour Telegram](https://nexcmp.com/fr/docs/images/administration/telegram-notifications-01-channel.webp) ## Vérification {#verify} Le canal apparaît sous **Configured channels**. Déclenchez un événement (par exemple, inscrivez un client test) et le message arrive dans le groupe. Si aucun canal n'est configuré, la page avertit « Without a channel, attacks will go unnoticed » et, dans le journal, les événements Telegram sont uniquement enregistrés localement. ## Raccourcis de support pour les clients {#support-shortcuts-for-customers} Le widget de support client peut afficher des boutons **Telegram** et **Zalo**. Ils restent masqués tant qu'ils ne sont pas configurés dans les paramètres de support : saisissez un lien `https://t.me/...` pour Telegram ainsi que le lien ou le QR Zalo. Seuls les liens `https://` sont acceptés. Le chat de support peut également notifier votre groupe Telegram avec la question et un brouillon de réponse — voir [AI Chat](https://nexcmp.com/fr/docs/ai/ai-chat/). ## Limites et remarques {#limits-and-notes} - Le bot token est enregistré avec le canal et n'est plus jamais affiché. - Les événements Telegram utilisent le premier canal Telegram activé qui possède à la fois une destination et un jeton. ## Dépannage {#troubleshooting} | Symptôme | Cause | Solution | |---|---|---| | Aucun message n'arrive | Chat ID incorrect, bot absent du groupe ou aucun message n'a jamais été envoyé au bot | Vérifiez à nouveau l'ID avec `getUpdates` ; envoyez d'abord un message au bot ou au groupe. | | Fonctionne un moment puis s'arrête | Jeton révoqué dans BotFather | Créez un nouveau jeton et mettez à jour le canal. | | `Telegram: no channel` dans les journaux | Aucun canal Telegram activé | Ajoutez-en un comme décrit ci-dessus. | --- # Journal d'audit et activité {#audit-log-and-activity} > **Où trouver dans l'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 enregistre chaque action importante. Utilisez la page **Activity** comme chronologie unique et les autres onglets pour affiner votre recherche. ## Onglets {#tabs} | Onglet | Contenu | |---|---| | **Activity** | Chronologie unifiée de toutes les sources : actions administrateur, événements VM, connexions, erreurs d'affiliation et système | | **Admin actions** | Modifications effectuées par les administrateurs (par exemple `customer.block`, `customer.delete`), avec l'adresse IP de l'administrateur | | **Console** | Connexions à la console d'administration et requêtes système telles qu'une demande de mise à jour | | **Login** | Connexions et échecs de connexion des clients | | **VM events** | Étapes de déploiement, création, mot de passe, suppression et autres événements du cycle de vie par machine virtuelle | ## Lecture d'une ligne {#reading-a-row} Colonnes : **Time**, **Source**, **Level**, **Actor** (qui), **Target**, **Services**, **Action** (code d'événement tel que `customer.delete`) et **Details**. Cliquez sur **Open** pour afficher l'enregistrement complet. ![La page Activité avec les filtres source, site et service au-dessus de la chronologie](https://nexcmp.com/fr/docs/images/administration/audit-log-01-activity.webp) ## Filtrer et rechercher {#filter-and-search} 1. Sélectionnez un **source**, un **site** et un **service** dans les listes déroulantes. 2. Définissez une plage de dates **From date** / **To date**. 3. Saisissez un code d'événement (par exemple `customer.block` ou `destroy`) dans la zone de recherche — la recherche d'activité correspond au code de l'événement. ## Rétention et exportations {#retention-and-exports} Les enregistrements résident dans les bases de données NexCMP dans `/var/lib/nexcmp` et sont inclus dans les [backups](https://nexcmp.com/fr/docs/getting-started/backup-and-restore/). La rétention dépend du journal : les tentatives de connexion client de plus de 180 jours et les journaux de requêtes de clé API client de plus de 60 jours sont purgés. L'audit des clés API administrateur conserve jusqu'à environ 200,000 enregistrements récents. Ces limites n'impliquent pas la même rétention pour la chronologie d'activité unifiée. ## Utilisations courantes {#common-uses} | Question | Où regarder | |---|---| | Qui a suspendu ce client ? | Actions administrateur, recherche `customer.block` | | Pourquoi une VM a-t-elle disparu ? | Événements de VM, filtrer par l'ID de la VM ; également Activité | | Le client a-t-il reçu l'e-mail ? | Overview › Support › Sent emails | | Quand la dernière mise à jour a-t-elle été demandée ? | Onglet Console | --- # Sécurité {#security} > **Où dans l'administration :** System › Admin › Console security (`/account`), Admin users (`/users`) ; System › Settings › Customer logins (`/settings/login`). ## Console d'administration {#admin-console} ### Authentification à deux facteurs (TOTP) {#two-factor-authentication-totp} La console est accessible depuis Internet, activez donc le TOTP. 1. Ouvrez **System › Admin › Console security**. 2. Sous **Two-factor authentication (TOTP)**, cliquez sur **Start setup**. 3. Scannez le code QR avec Google Authenticator, Authy, 1Password ou Bitwarden, puis saisissez le code à 6 chiffres. ### Plages IP de console autorisées {#allowed-console-ip-ranges} Sous **Allowed console IP ranges**, saisissez une adresse IP ou un CIDR (IPv4 ou IPv6) par ligne. **Vide signifie n'importe où.** En dehors de la plage, la connexion et l'API d'administration sont bloquées. ::: warning Ne vous enfermez pas dehors La page affiche votre IP actuelle et exige que la nouvelle liste l'inclue. Utilisez **+ Add my IP**. Si vous êtes quand même bloqué, utilisez l'[emergency access](https://nexcmp.com/fr/docs/getting-started/cli-reference/#emergency-access) depuis le serveur. ::: ### Changer le mot de passe {#change-password} Remplissez **Current password**, **New password** et **Confirm new password**. Utilisez un mot de passe long et unique (12 caractères ou plus ; l'assistant d'installation impose 12 pour le premier administrateur). ### Comptes administrateur et rôles {#administrator-accounts-and-roles} Ouvrez **System › Admin › Admin users** et utilisez **+ Create account**. | Rôle | Accès | |---|---| | `admin` | Accès complet à l'API d'administration | | `staff` | Lecture seule sur l'ensemble du système | | `user` | Vue en lecture seule des ressources d'un client | Le compte root est celui créé dans l'[setup wizard](https://nexcmp.com/fr/docs/getting-started/setup-wizard/). Actions sur les lignes : **Edit**, **Reset PW**, **Key**, **Delete**. Les mots de passe sont stockés sous forme de hachages salés ; modifier ou verrouiller un compte met fin immédiatement à ses sessions. ## Connexion client {#customer-sign-in} Ouvrez **System › Settings › Customer logins**. | Paramètre | Description | |---|---| | **Connexion Google** | Activez cette option, puis saisissez l'ID client et le secret OAuth. Copiez l'**Callback URL** affichée sur la page dans *Google Cloud Console › APIs & Services › Credentials › OAuth client ID › Authorized redirect URIs*. Utilisez **Test configuration**. | | **GitHub login** | De même, avec *GitHub › Settings › Developer settings › OAuth Apps › Authorization callback URL* | | **Passkey** | Connexion par empreinte digitale, code PIN ou clé matérielle ; activé par défaut. Les Passkeys sont liés au domaine ; chaque domaine de revendeur fonctionne de manière autonome. Saisissez un ancien domaine dans *Legacy passkey Domain* après un changement de marque afin d'afficher un conseil utile aux clients | | **Réauthentification lors de l'ajout de méthodes de connexion** | Demander à nouveau le mot de passe avant d'ajouter une clé d'accès ou de lier Google/GitHub (désactivé par défaut) | | **Captcha** | Cloudflare Turnstile ou Google reCAPTCHA lors de l'inscription : activez l'option, choisissez le fournisseur, puis saisissez la clé de site et la clé secrète | | **Block e-mail domains** | Un domaine par ligne (max 2000). Les adresses correspondantes sont rejetées lors de l'inscription avec `email_domain_blocked` | ![La page de connexion client affichant la connexion Google avec son URL de callback](https://nexcmp.com/fr/docs/images/administration/security-01-customer-logins.webp) ### Politiques intégrées {#built-in-policies} | Politique | Valeur | |---|---| | Mot de passe client | Au moins 10 caractères, lettres et chiffres | | Session client | 30 jours ; les sessions "se connecter en tant que client" durent 1 heure | | Vérification des e-mails | Requise avant de créer une machine virtuelle si *require e-mail verified* est activé dans les paramètres de vente | | Anti-carding | Les comptes disposant d'un solde inférieur au rechargement minimum ne peuvent créer qu'un nombre limité de machines virtuelles | ## Durcissement du serveur {#server-hardening} - Le port 3000 est fermé après l'installation et le TLS ; voir [Installation](https://nexcmp.com/fr/docs/getting-started/installation/#the-panel-port-3000). - Le service s'exécute sous l'utilisateur non privilégié `nexcmp` avec un bac à sable systemd restreint. - Les clés API, les identifiants de paiement et les mots de passe SMTP sont stockés de manière chiffrée ; la clé principale se trouve dans `/var/lib/nexcmp/secrets` — protégez vos [backups](https://nexcmp.com/fr/docs/getting-started/backup-and-restore/). - Les versions sont vérifiées à l'aide de SHA-256 et d'une signature Ed25519 avant l'installation. --- # Paramètres généraux {#general-settings} > **Où trouver ce paramètre :** System › Settings › General (`/settings`). Les modifications prennent effet immédiatement (cache de 30 secondes). La page comporte trois sections. ## Marque et URL {#branding-urls} | Champ | Usage | |---|---| | Nom de marque (e-mail, factures) | Affiché dans les e-mails et les factures. Le logo et les couleurs se trouvent dans [Branding](https://nexcmp.com/fr/docs/customers/branding/) | | Langue par défaut | Langue pour les nouveaux visiteurs | | URL de l'application client | Adresse publique du portail, par exemple `https://cloud.example.com` | | URL de la console | Adresse du service de console des machines virtuelles | | URL administrateur | Lien utilisé lorsque vous vous "connectez en tant que" client d'un revendeur | | URL de la console partenaire | Utilisé dans les liens d'invitation, les e-mails des revendeurs et la redirection après un rechargement | L'assistant les remplit à partir de votre domaine ; ne les modifiez que si vous déplacez le portail. ## Seller & invoicing {#seller-invoicing} Imprimé sur chaque facture : | Champ | Exemple | |---|---| | Legal entity name | Example Cloud Ltd | | Tax ID | `TAX-000000` | | Address | 1 Example Street, New York | | Contact e-mail | `billing@example.com` | | Invoice number prefix | `INV` (1 à 8 caractères, A-Z et 0-9) | Les factures existantes conservent les coordonnées du vendeur et le numéro avec lequel elles ont été émisses ; les modifications n'affectent que les **nouvelles** factures. ## Maintenance & region {#maintenance-region} Activez **Customer app MAINTENANCE** pour afficher une bannière et **bloquer toutes les actions d'écriture des clients** pendant que la console d'administration continue de fonctionner. Saisissez le **Maintenance message** que les clients verront. Utilisez cette option lors des mises à niveau de votre infrastructure. ![La page des paramètres généraux avec les champs du nom de marque, de la langue par défaut et de l'URL](https://nexcmp.com/fr/docs/images/administration/general-settings-01-general.webp) ## Other settings pages {#other-settings-pages} | Page | Guide | |---|---| | Brand | [Branding](https://nexcmp.com/fr/docs/customers/branding/) | | Legal | [Legal](https://nexcmp.com/fr/docs/customers/legal/) | | Customer logins | [Security](https://nexcmp.com/fr/docs/administration/security/) | | Email | [SMTP et modèles d'e-mail](https://nexcmp.com/fr/docs/administration/smtp-and-emails/) | | Admin alerts | [Telegram et alertes administrateur](https://nexcmp.com/fr/docs/administration/telegram-notifications/) | | Fournisseur d'IA | [Fournisseurs d'IA](https://nexcmp.com/fr/docs/ai/ai-providers/) | --- # Signaler un bug {#report-a-bug} > **Emplacement dans l'administration :** Top bar › **Report a bug** (à côté de Docs ; visible uniquement par l'administrateur principal). Vous avez trouvé un défaut dans NexCMP ? Cliquez sur **Report a bug**, décrivez le problème et envoyez-le. Le rapport parvient à l'équipe NexCMP sous forme de ticket sur votre compte de licence en une seule étape — sans vous connecter ailleurs ni copier de fichiers journaux manuellement. Tous les forfaits peuvent l'utiliser : NexCMP Free couvre les corrections de bugs, tout comme NexCMP Source. ::: info Les signalements de bugs ne sont pas des demandes de support NexCMP Free n'inclut pas de support technique, utilisez donc ce formulaire pour les anomalies du logiciel. L'aide à l'installation et les migrations font partie de [NexCMP Source](https://nexcmp.com/pricing). ::: ## Prérequis {#requirements} | Élément | Prérequis | |---|---| | Version | NexCMP 1.5.2 ou version ultérieure | | Qui peut envoyer | Le compte administrateur principal. Les comptes collaborateurs (lecture seule), consoles revendeurs, clients et la démo en lecture seule ne peuvent pas envoyer | | Licence | Une licence activée (Free ou Source) non suspendue | | Réseau | Le serveur doit pouvoir joindre `https://nexcmp.com` via HTTPS (la même adresse que pour les vérifications de licence et les mises à jour) | ## Envoyer un rapport {#send-a-report} 1. Cliquez sur **Report a bug** dans la barre supérieure. Sur téléphone, ouvrez le menu et choisissez **Report a bug**. 2. Saisissez un **Subject** court. 3. Sous **What happened**, décrivez ce que vous avez fait, ce que vous avez constaté et ce que vous attendiez. 4. Indiquez éventuellement les **étapes de reproduction**. 5. Choisissez l'**Impact** : **Blocking** (vous ne pouvez pas travailler), **Major** (une fonctionnalité principale est défaillante) ou **Minor** (un problème mineur ou cosmétique). 6. Laissez **Attach diagnostics** activé (recommandé) et lisez l'encadré **What will be sent**. 7. Cliquez sur **Send report**. Dans la version 1.6.1, le corps du formulaire défile pendant que les boutons d'action restent visibles, y compris sur un téléphone. Les valeurs de mot de passe suivant `password:` ou `password=` sont masquées sans supprimer le reste du rapport. Vérifiez votre texte avant l'envoi et omettez les données client ainsi que les identifiants. ![La boîte de dialogue Report a bug avec le titre, la description, l'impact et la liste des éléments envoyés](https://nexcmp.com/fr/docs/images/administration/report-a-bug-01-dialog.webp) Lorsque le rapport est accepté, la boîte de dialogue affiche le numéro de ticket et un lien. Les réponses éventuelles de l'équipe sont envoyées à l'adresse e-mail de votre compte de licence sur nexcmp.com, et le ticket figure également sous **Support** lorsque vous vous y connectez en tant que propriétaire de la licence. ## Ce qui est envoyé {#what-is-sent} L'encadré **What will be sent** affiche précisément ceci avant que vous ne cliquiez sur Envoyer : | Données envoyées | Détails | |---|---| | Votre texte | Titre, description, étapes et impact | | Version, forfait, domaine | Votre version de NexCMP, Free ou Source, et le domaine de l'installation | | Page actuelle | La page sur laquelle vous vous trouvez dans l'administration, sans rien après `?` ou `#` | | Navigateur | Le texte user-agent de votre navigateur (nom, version et système d'exploitation), tronqué à 200 caractères | | Erreurs récentes | Jusqu'aux 5 dernières erreurs dans cet onglet de navigateur. Pour une erreur de script, le message uniquement ; pour une requête en échec, uniquement la méthode, le chemin et le code d'état | Vous pouvez désactiver **Attach diagnostics** ; seuls votre texte, la version, le forfait et le domaine seront alors envoyés. ## Ce qui n'est jamais envoyé {#what-is-never-sent} - Mots de passe, jetons, cookies et clés API. Tout élément ressemblant à l'un d'eux dans votre texte ou dans un message d'erreur est masqué (affiché sous la forme `***` ou `[redacted]`) sur votre serveur avant l'envoi. - Le contenu des requêtes et des réponses — les requêtes ayant échoué sont uniquement enregistrées sous forme de méthode, de chemin et de statut. - Les données de vos clients (noms, e-mails, commandes, factures) et leurs adresses IP. - L'adresse IP de votre navigateur et tout fichier de votre serveur. Comme pour chaque vérification de licence, le serveur de licence voit l'adresse IP depuis laquelle votre serveur se connecte. Le ticket est lié à votre installation par le jeton de licence que le serveur détient déjà, de sorte que la version, le domaine et l'installation sont définis par le serveur et ne peuvent pas être modifiés depuis le navigateur. ## Limites {#limits} | Limite | Valeur | |---|---| | Objet | 150 caractères | | Description et étapes | 8 Ko au total | | Rapports | 5 par heure et 20 par jour pour l'ensemble de l'installation | L'envoi d'un même rapport à deux reprises (par exemple après une erreur réseau) ne crée pas de second ticket. ## Dépannage {#troubleshooting} | Message | Cause | Solution | |---|---|---| | Activez d'abord votre licence | L'installation n'a pas de licence activée | Ouvrez **License & updates** et activez-la, puis envoyez à nouveau | | Impossible de joindre le serveur de licence | Le serveur ne parvient pas à joindre `nexcmp.com` | Vérifiez le trafic HTTPS sortant et le DNS depuis le serveur, puis appuyez à nouveau sur **Send report** — votre texte est conservé | | Trop de rapports de bug provenant de cette installation | Vous avez atteint 5 par heure ou 20 par jour | Patientez et réessayez ; ajoutez plutôt vos nouveaux éléments au ticket ouvert | | Cette licence est suspendue | La licence est suspendue ou remboursée | Consultez [Licence et achat](https://nexcmp.com/fr/docs/getting-started/license-and-purchase/) | | Cette installation a été révoquée | L'installation a été révoquée dans le portail de licences | Réactivez-la depuis **License & updates** | | Le jeton de licence n'a pas pu être actualisé | Le serveur n'a pas pu renouveler son jeton de licence | Ouvrez **License & updates**, appuyez sur **Refresh**, puis envoyez à nouveau | | Aucun bouton Report a bug | Vous êtes connecté avec un compte collaborateur, revendeur ou client, ou sur la démo en lecture seule | Connectez-vous en tant qu'administrateur principal | ::: tip Pour l'assistant IA et les clés API L'assistant dans l'interface d'administration et les clés API d'administrateur ne peuvent pas envoyer de rapports de bug en votre nom : le bouton requiert la connexion d'une personne en tant qu'administrateur principal. ::: --- # Erreurs d'installation {#installation-errors} L'installateur s'arrête au premier problème critique et affiche une ligne rouge commençant par `✗`. Corrigez la cause et **exécutez à nouveau la même commande** — l'installateur peut être relancé sans risque. Les lignes d'information commencent par `•`, les étapes réussies par `✓`. ## Machine checks {#machine-checks} | Message | Cause | Solution | |---|---|---| | `must be run as root (sudo)` | Exécution sans les privilèges root | Faites précéder la commande par `sudo` ou exécutez-la en tant que root. | | `only Ubuntu 22.04/24.04 is supported (this host: …)` | Autre distribution ou version | Use an Ubuntu 22.04 or 24.04 server. | | `only x86_64 is supported` | ARM or other CPU | Use an x86_64 server. | | `requires ≥ 2 GB RAM (host has … MB)` | Too little memory | Add RAM. | | `requires ≥ 8 GB free disk space on / (… GB available)` | Système de fichiers root presque saturé | Libérez de l'espace ou agrandissez `/`. | | `missing --license` / `missing --domain` | Première installation sans ces paramètres | Transmettez les deux — voir [Installation](https://nexcmp.com/fr/docs/getting-started/installation/#parameters). | | `unknown argument: …` | Typo in a parameter | Vérifiez l'orthographe ; exécutez avec `--help`. | | `apt-get failed (another apt/dpkg process, e.g. unattended-upgrades, may still be running)` | Le gestionnaire de paquets est verrouillé | Patientez quelques minutes (un Ubuntu frais exécute des mises à jour automatiques après le démarrage) et relancez. | | `… is a symlink — aborting` | `/opt/nexcmp` ou `/etc/nexcmp` est un lien symbolique | Remplacez-le par un vrai répertoire — le programme d'installation refuse les liens symboliques pour des raisons de sécurité. | ## Activation de la licence {#license-activation} | Message | Cause | Solution | |---|---|---| | `cannot connect to https://nexcmp.com` | Pas de trafic HTTPS sortant vers le serveur de licence | Vérifiez le DNS, le pare-feu et le proxy sur le serveur : `curl -I https://nexcmp.com`. | | `license activation failed (HTTP …): ` | Le serveur de licence a rejeté la clé | Lisez le message : clé erronée, domaine ne correspondant pas à la licence, licence suspendue ou révoquée. Consultez la page de licence sur [nexcmp.com/licenses](https://nexcmp.com/licenses). | | `no release available for this license yet` | La licence ne comporte aucune version téléchargeable | Contactez le service commercial ; consultez [Support](https://nexcmp.com/fr/docs/troubleshooting/support/). | ## Téléchargement et vérification {#download-and-verification} | Message | Cause | Solution | |---|---|---| | `failed to download release X` | Problème réseau pendant le téléchargement | Relancez. | | `sha256 mismatch (… ≠ …)` | Le fichier est arrivé endommagé ou a été altéré | Relancez ; si cela se reproduit, un proxy réécrit peut-être les téléchargements — essayez depuis un autre réseau. | | `release X is unsigned — refusing to install` | Le serveur n'a fourni aucune signature | Ne contournez jamais ; contactez le support. | | `INVALID SIGNATURE for version X — aborting` | La signature Ed25519 ne peut pas être vérifiée | N'installez **pas**. Contactez le support — cela signifie que le fichier n'est pas une version officielle. | | `openssl failed to read public key` | OpenSSL très ancien ou endommagé | Mettez à jour le paquet `openssl`. | | `invalid version: …` | Données inattendues provenant du serveur | Relancez ; contactez le support si le problème persiste. | ## Démarrage du service {#service-start} | Message | Cause | Solution | |---|---|---| | `service failed to start — check: journalctl -u nexcmp -n 50` | Le panneau n'a pas répondu à `/healthz` dans un délai de 3 minutes | Lisez le journal. Causes courantes : le port (par défaut 3000) est déjà utilisé (`ss -ltnp | grep 3000`) — réinstallez avec `--port` ; fichiers appartenant à root dans `/var/lib/nexcmp` — exécutez `sudo nexcmp fix-owner`. | ## nginx et TLS {#nginx-and-tls} | Message | Cause | Solution | |---|---|---| | `DNS does not point to (nor to Cloudflare) — skipping nginx/TLS` | L'enregistrement A/AAAA est absent ou erroné | Consultez [DNS and Cloudflare](https://nexcmp.com/fr/docs/getting-started/dns-and-cloudflare/), puis relancez. | | `certbot could not get a certificate yet — re-run the installer once DNS has settled` | La validation Let's Encrypt a échoué (port 80 bloqué, DNS non propagé, limite de taux) | Ouvrez le port 80, attendez la propagation du DNS, relancez. Vérifiez `/var/log/letsencrypt/letsencrypt.log`. | | `certbot could not renew now — keeping the existing certificate` | Échec temporaire de renouvellement | Sans conséquence ; relancez plus tard. | | `nginx rejected the HTTPS configuration — kept the previous one (check: nginx -t)` | Conflit avec un autre site nginx (même `server_name`, paramètres en double) | Exécutez `sudo nginx -t` et corrigez le conflit, puis relancez. | | `apt-get could not install nginx` / `certbot`, ou `E: Failed to fetch … 404 Not Found` | Gestionnaire de paquets verrouillé ou index des paquets du serveur obsolète (typique sur une image de modèle qui n'a pas été mise à jour depuis un moment) | Exécutez `sudo apt-get update`, attendez la fin de tout autre processus apt, puis relancez le programme d'installation. | | `openssl could not create the self-signed certificate` | Problème OpenSSL | Mettez à jour `openssl` ; relancez. | ## Après l'installation {#after-installation} | Symptôme | Cause | Solution | |---|---|---| | Le navigateur ne parvient pas à ouvrir `https://` | DNS ou TLS non prêt | `sudo nexcmp status` ; utilisez l'[emergency access](https://nexcmp.com/fr/docs/getting-started/cli-reference/#emergency-access). | | `ERR_TOO_MANY_REDIRECTS` | Mode SSL Cloudflare **Flexible** | Définir sur **Full (strict)** — [détails](https://nexcmp.com/fr/docs/getting-started/dns-and-cloudflare/). | | L'assistant indique que le code de configuration est erroné | Faute de frappe ou code issu d'une installation précédente | Exécutez `sudo nexcmp status` et copiez le code actuel. | | La licence affiche HTTP 421 | Fichiers dans `/var/lib/nexcmp` détenus par root | `sudo nexcmp fix-owner`, puis `sudo systemctl restart nexcmp`. | --- # Erreurs de mise à jour {#update-errors} > **Emplacement dans l'admin :** System › Admin › License & updates (`/license`) Les mises à jour sont décrites dans [Updating NexCMP](https://nexcmp.com/fr/docs/getting-started/updating/). Lorsque la carte de mise à jour ou `sudo nexcmp update` signale une erreur : | Message | Cause | Solution | |---|---|---| | `update plan expired — renew on the license page to receive this feature release` | Votre date limite de mise à jour est antérieure à la date de sortie. Les correctifs de sécurité sont toujours livrés, mais pas les nouvelles fonctionnalités | Renouvelez sur [nexcmp.com/licenses](https://nexcmp.com/licenses) ($99 par an pour NexCMP Free), puis vérifiez à nouveau. Le logiciel continue de fonctionner entre-temps. | | `sha256 mismatch (downloaded …, expected …)` | Téléchargement endommagé ou altéré | Réessayez. Si cela se reproduit, vérifiez les proxys sur le chemin. | | `downgrade/same version rejected: X is not newer than Y` | La version sélectionnée n'est pas plus récente que celle en cours d'exécution | Rien à faire — vous êtes à jour. | | `extraction failed / main binary missing` | Archive endommagée ou disque plein | Vérifiez `df -h` ; réessayez. | | `systemctl restart failed` | Le service n'a pas pu redémarrer après le remplacement du binaire | `journalctl -u nexcmp -n 80` ; le binaire précédent est conservé sous le nom de `/opt/nexcmp/bin/nexcmp.bak` — voir la section de retour en arrière ci-dessous. | | Erreur serveur lors du contact avec le serveur de mise à jour | Pas de route vers `nexcmp.com` ou jeton de licence expiré | Vérifiez le trafic HTTPS sortant ; cliquez sur **Check now** sur la carte de licence. | ## Retour en arrière {#roll-back} Si une nouvelle version se comporte mal : ```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 ``` Si une migration de base de données a déjà eu lieu, restaurez également votre [sauvegarde](https://nexcmp.com/fr/docs/getting-started/backup-and-restore/) effectuée avant la mise à jour. ## `sudo nexcmp update` indique qu'il ne trouve pas le programme d'installation {#sudo-nexcmp-update-says-it-cannot-find-the-installer} `nexcmp update` exécute le programme d'installation intégré à la version installée (`/opt/nexcmp/releases//share/install.sh`). Si ce fichier est manquant, exécutez à nouveau la commande d'installation depuis votre page de licence. --- # FAQ {#faq} ## Licences {#licensing} **Que se passe-t-il si ma licence expire ou si le serveur perd l'accès à Internet ?** Le jeton reste valide pendant 14 jours et se renouvelle quotidiennement. Passé ce délai, les clients ne peuvent plus créer de **nouveaux** services ; les services en cours d'exécution, la facturation et les connexions continuent de fonctionner. Voir [License and purchase](https://nexcmp.com/fr/docs/getting-started/license-and-purchase/). **Est-ce que je reçois toujours les correctifs de sécurité après la fin de mes droits de mise à jour ?** Oui — les versions de sécurité sont toujours livrées ; les versions fonctionnelles nécessitent des droits actifs. **Puis-je exécuter NexCMP sur un deuxième serveur ou domaine ?** Activez-le avec la clé et le domaine enregistrés sur la licence — voir [License and purchase](https://nexcmp.com/fr/docs/getting-started/license-and-purchase/#moving-to-a-new-server-or-domain). ## Installation {#installation} **NexCMP a-t-il besoin de Docker, PostgreSQL ou Redis ?** Non. Il s'agit d'un programme unique doté de bases de données SQLite, exécuté par systemd en tant d'utilisateur non privilégié. Voir [Requirements](https://nexcmp.com/fr/docs/getting-started/requirements/). **Puis-je installer sans domaine public ?** Oui, utilisez `--no-nginx` et un tunnel SSH — voir [Installation](https://nexcmp.com/fr/docs/getting-started/installation/#installing-without-a-public-domain-lab-or-test). **Pourquoi le port 3000 est-il fermé après la configuration ?** Pour des raisons de sécurité, le panneau écoute sur `127.0.0.1` une fois l'assistant terminé et TLS actif. Utilisez `sudo nexcmp open-port` pour les urgences. ## Infrastructure {#infrastructure} **Puis-je utiliser CloudStack et Proxmox VE ensemble ?** Oui. Une zone peut comporter les deux ; chaque plan choisit sa source. Voir [Proxmox VE](https://nexcmp.com/fr/docs/infrastructure/proxmox/) et [Zones](https://nexcmp.com/fr/docs/infrastructure/zones/). **Ai-je besoin de la clé API ROOT de CloudStack ?** Non — et vous ne devriez pas l'utiliser. Créez un compte dédié — [CloudStack](https://nexcmp.com/fr/docs/infrastructure/cloudstack/). **Pourquoi certains onglets ou boutons n'apparaissent-ils pas sur une machine virtuelle ?** Les pages n'affichent que ce que la source de la VM prend en charge (par exemple, Proxmox VE ne propose pas de redirection de port). Consultez le tableau des fonctionnalités dans [Proxmox VE](https://nexcmp.com/fr/docs/infrastructure/proxmox/). ## Opérations {#operations} **Comment déplacer NexCMP vers un autre serveur ?** Effectuez une sauvegarde, installez la même version sur le nouveau serveur avec la même licence, puis restaurez — voir [Backup and restore](https://nexcmp.com/fr/docs/getting-started/backup-and-restore/). **Où se trouvent les journaux ?** `journalctl -u nexcmp -u nexcmp-vmd`, `/var/log/nexcmp`, et la console d'administration sous System › Logs. Voir [Audit log](https://nexcmp.com/fr/docs/administration/audit-log/). **Puis-je voir le portail client avant de l'installer?** Oui. Les pages de services sur [nexcmp.com](https://nexcmp.com/platform/) présentent le portail client onglet par onglet avec des données d'exemple; ouvrez *View demo* pour la visionneuse plein écran. Pour voir une installation réelle, écrivez à l'équipe commerciale. --- # Support {#support} ## Contact {#contact} Il n'y a pas de formulaire de contact. Envoyez un e-mail à **sales@nexcmp.com** — cela couvre la licence, les renouvellements, les domaines et les questions techniques. Votre page de licence sur [nexcmp.com/licenses](https://nexcmp.com/licenses) renvoie également vers cette même adresse. ## Avant d'écrire {#before-you-write} 1. Recherchez dans cette documentation (appuyez sur `/`) et consultez [Installation errors](https://nexcmp.com/fr/docs/troubleshooting/installation-errors/) ainsi que [Update errors](https://nexcmp.com/fr/docs/troubleshooting/update-errors/). 2. Rassemblez les éléments ci-dessous — ils permettent au support de répondre en une seule réponse. ## Ce qu'il faut inclure {#what-to-include} | Élément | Comment l'obtenir | |---|---| | Version de NexCMP | `sudo nexcmp status` ou System › Admin › License & updates | | Domaine principal et les 4 derniers caractères de la clé de licence | License & updates (n'envoyez jamais la clé complète) | | Ce que vous avez fait et ce que vous attendiez | Étapes exactes | | Le texte de l'erreur ou une capture d'écran | Masquez les informations sensibles avant l'envoi | | État du service | `sudo nexcmp status` | | Lignes de journal récentes | `sudo journalctl -u nexcmp -u nexcmp-vmd -n 100 --no-pager` | | Infrastructure | Version de CloudStack ou Proxmox VE, une zone ou plusieurs | ::: warning N'envoyez jamais d'informations sensibles N'envoyez pas de clés de licence, de clés API, de mots de passe, de code d'installation, d'informations de paiement ou d'archives de sauvegarde. Masquez-les dans les journaux et les captures d'écran. ::: ## Rapports de sécurité {#security-reports} Si vous pensez avoir découvert une vulnérabilité, envoyez un e-mail à la même adresse avec « Security » dans l'objet et évitez de publier les détails publiquement jusqu'à ce qu'elle soit corrigée.