Créer un module de provisionnement

Ajoutez votre propre panneau de contrôle à BilloraX en créant un seul fichier TypeScript.

Dernière mise à jour : 19 avril 2026

Principe de fonctionnement

Chaque panneau de contrôle est un module TypeScript qui implémente une interface de quatre méthodes : create, suspend, unsuspend et terminate.

Les modules placés dans lib/modules/custom/ sont découverts automatiquement au démarrage du serveur (npm run dev / npm run build). Il n'y a rien d'autre à configurer.

Étape 1 — Copier le template

Copie le fichier template dans le dossier custom/.

bash
cp lib/modules/custom/_template.ts lib/modules/custom/mon-panel.ts

Étape 2 — Déclarer les métadonnées

En haut du fichier, renseigne l'identifiant, le label affiché dans l'interface admin, et le style du badge.

L'identifiant doit être unique et en majuscules.

typescript
registerPanelMeta({
  id:    'MON_PANEL',
  label: 'Mon Panel',
  style: 'bg-violet-500/10 text-violet-400 border-violet-500/20',
});

Étape 3 — Implémenter les quatre méthodes

Retourner { success: true, username: "id" } en cas de succès. L'identifiant username est stocké sur le Service et réutilisé dans les appels suivants.

ChampTypeDescription
service.emailstringEmail du client
service.usernamestringIdentifiant du compte (stocké après create)
service.passwordstringMot de passe
service.domainstringDomaine principal
service.firstNamestringPrénom
service.lastNamestringNom
server.hostnamestringHostname du serveur
server.apiUrlstring?URL API si différente du hostname
server.apiUsernamestringIdentifiant API
server.apiPasswordstringMot de passe ou token API
moduleSettingsobjectParamètres du produit (plan, OS, etc.)
typescript
async create({ service, server }): Promise<ModuleResult> {
  try {
    const res = await httpRequest(`https://${server.hostname}/api/accounts`, {
      method: 'POST',
      headers: {
        'X-Api-Key': server.apiPassword,
        'Content-Type': 'application/json',
      },
      body: JSON.stringify({
        user:   service.username,
        pass:   service.password,
        domain: service.domain,
      }),
    });
    const json = JSON.parse(res.body);
    if (!json.success) return { success: false, message: json.error };
    return { success: true, message: 'Compte créé', username: service.username };
  } catch (e) {
    return { success: false, message: friendlyError(e) };
  }
},

Étape 4 — Enregistrer le module

En bas du fichier, enregistre le module avec l'identifiant déclaré dans registerPanelMeta.

typescript
registerModule('MON_PANEL', monPanelModule);

Étape 5 — Redémarrer

Le script de démarrage scanne automatiquement le dossier custom/ et génère le barrel index.ts. Il n'y a rien d'autre à faire.

bash
npm run dev
Le module apparaît immédiatement dans le menu déroulant de création de serveur dans l'interface admin.

Utilitaire httpRequest

Un helper HTTP est fourni dans lib/modules/http.ts. Il supporte GET, POST, PUT et DELETE, accepte les certificats SSL auto-signés et applique un timeout de 15 secondes.

typescript
import { httpRequest, basicAuth, friendlyError } from '../http';

const res = await httpRequest(url, {
  method:    'POST',
  headers:   { 'Authorization': basicAuth(user, pass) },
  body:      JSON.stringify(payload),
  timeoutMs: 10000,
});
// res.status: number
// res.body:   string

Structure du projet

text
lib/modules/
├── types.ts          ← interfaces Module, ModuleInput, ModuleResult
├── http.ts           ← httpRequest, basicAuth, friendlyError
├── panels.ts         ← métadonnées d'affichage (client-safe)
├── registry.ts       ← registre runtime des modules
├── index.ts          ← point d'entrée
├── cpanel.ts
├── plesk.ts
├── directadmin.ts
├── hestiacp.ts
├── virtualizor.ts
└── custom/
    ├── index.ts      ← AUTO-GENERATED, ne pas éditer
    ├── _template.ts  ← copier ce fichier
    └── mon-panel.ts  ← votre module
⚠️
Les modules utilisent des APIs Node.js (https, crypto) et ne peuvent pas être importés dans des composants React client ("use client"). Seul panels.ts est importable côté client.