Créer un module de provisionnement
Ajoutez votre propre panneau de contrôle à BilloraX en créant un seul fichier TypeScript.
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/.
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.
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.
| Champ | Type | Description |
|---|---|---|
service.email | string | Email du client |
service.username | string | Identifiant du compte (stocké après create) |
service.password | string | Mot de passe |
service.domain | string | Domaine principal |
service.firstName | string | Prénom |
service.lastName | string | Nom |
server.hostname | string | Hostname du serveur |
server.apiUrl | string? | URL API si différente du hostname |
server.apiUsername | string | Identifiant API |
server.apiPassword | string | Mot de passe ou token API |
moduleSettings | object | Paramètres du produit (plan, OS, etc.) |
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.
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.
npm run devUtilitaire 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.
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: stringStructure du projet
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