Contrat API — Capacités du déploiement
Route publique
- Méthode :
GET - Chemin :
/api/v1/capabilities - Authentification : aucune
- Cache serveur : court, environ 60 s
Cette route permet à la PWA et aux surfaces en marque blanche de savoir quelles parties de l’interface afficher avant connexion. La réponse ne contient ni secret, ni clé, ni donnée client.
Artefact public de licence du nœud
- Méthode :
GET - Chemin :
/api/v1/capabilities/license - Authentification : aucune
- Réponse : l’artefact de licence signé tel quel
- Erreur :
503 SILO_LICENSE_ARTIFACT_UNAVAILABLEsi le nœud n’a aucun artefact signé valide à servir
Cette route sert le backend PWA du partenaire quand il configure PWA_LICENSE_URL. L’artefact ne
contient pas de secret : il contient un payload public et sa signature Ed25519. Un client doit
vérifier la signature avec la clé publique du master avant d’en déduire des droits.
Réponse
Exemple fictif pour un nœud partenaire VPN :
{
"success": true,
"data": {
"role": "node",
"api_version": "2.9.3",
"build": "a1b2c3d",
"modules": {
"vpn": true,
"radius": false,
"tiketmomo": false,
"pwa": true
},
"features": {
"vpn_sales": true,
"tiketmomo_store": false,
"radius_hotspot": false,
"radius_pppoe": false
},
"licence": {
"status": "valid",
"expires_at": "2026-10-05T12:00:00.000Z",
"service_expires_at": {
"vpn": "2027-10-01T00:00:00.000Z",
"pwa": "2027-10-01T00:00:00.000Z"
}
}
}
}
En mode master, licence.status vaut not_applicable.
Règles d’affichage PWA
La PWA doit afficher uniquement les modules et fonctionnalités dont la valeur est true.
Elle ne doit pas déduire TiketMOMO, RADIUS ou la vente VPN à partir du nom du partenaire, du
domaine ou d’une ancienne configuration locale.
features.vpn_sales vaut true seulement si le module VPN est disponible, si au moins un
provider de paiement actif sait vendre des licences et si le catalogue local contient une offre
VPN active. Le champ pwa est contrôlé par la licence, même s’il n’ajoute pas de tables de schéma.
Cycle de vie côté nœud
En mode node, le backend télécharge périodiquement son artefact depuis le master via
GET /api/v1/silo/license avec le jeton de nœud Tier-2, vérifie la signature avec la clé publique
du master, puis écrit le fichier local de façon atomique à SILO_LICENSE_ARTIFACT_PATH.
La route /api/v1/capabilities ne contacte jamais le master : elle lit uniquement l’artefact local
et utilise son cache court. Quand un nouvel artefact est écrit, ce cache est invalidé.
Si le master est temporairement injoignable, le dernier artefact signé reste en place et la période
de grâce éventuelle continue à s’appliquer. Si le master refuse le nœud (401 ou 403), l’ancien
artefact est remplacé par un état non signé : les capacités deviennent non licenciées et
/api/v1/capabilities/license répond 503.