245 lines
7.6 KiB
JSON
245 lines
7.6 KiB
JSON
{
|
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
"$id": "https://irbis-os.org/schemas/app-template.schema.json",
|
|
"title": "Irbis OS Application Template",
|
|
"description": "Schéma de définition pour les applications communautaires de l'App Store Irbis OS",
|
|
"type": "object",
|
|
"required": [
|
|
"id",
|
|
"name",
|
|
"tagline",
|
|
"description",
|
|
"category",
|
|
"version",
|
|
"developer"
|
|
],
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"$schema": {
|
|
"type": "string",
|
|
"description": "URI du schéma JSON utilisé pour l'auto-complétion et la validation"
|
|
},
|
|
"id": {
|
|
"type": "string",
|
|
"pattern": "^[a-z0-9-]+$",
|
|
"minLength": 2,
|
|
"maxLength": 64,
|
|
"description": "Identifiant unique de l'application en minuscules (ex: nextcloud, homeassistant)"
|
|
},
|
|
"name": {
|
|
"type": "string",
|
|
"minLength": 2,
|
|
"maxLength": 100,
|
|
"description": "Nom complet d'affichage de l'application"
|
|
},
|
|
"tagline": {
|
|
"type": "string",
|
|
"minLength": 5,
|
|
"maxLength": 150,
|
|
"description": "Accroche courte résumant la fonction principale de l'application"
|
|
},
|
|
"description": {
|
|
"type": "string",
|
|
"minLength": 10,
|
|
"maxLength": 500,
|
|
"description": "Description concise de l'application (affichée sur la carte)"
|
|
},
|
|
"longDescription": {
|
|
"type": "string",
|
|
"minLength": 20,
|
|
"maxLength": 4000,
|
|
"description": "Description détaillée affichée dans la modale de l'App Store"
|
|
},
|
|
"icon": {
|
|
"type": "string",
|
|
"description": "Nom du fichier d'icône/image de garde (ex: icon.png) ou URL directe"
|
|
},
|
|
"screenshots": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
},
|
|
"description": "Noms des fichiers de captures d'écran de démo (ex: screenshot1.png) ou URLs directes"
|
|
},
|
|
"firstStartTip": {
|
|
"type": "string",
|
|
"description": "Astuce et guide de premier démarrage affichés après l'installation"
|
|
},
|
|
"composeFile": {
|
|
"type": "string",
|
|
"description": "Nom du fichier Docker Compose dans le dossier de l'app (défaut: docker-compose.yml)"
|
|
},
|
|
"nginx": {
|
|
"type": "object",
|
|
"description": "Configuration du domaine et reverse proxy Nginx automatique",
|
|
"properties": {
|
|
"recommendedSubdomain": {
|
|
"type": "string",
|
|
"description": "Sous-domaine recommandé (ex: cloud, vault, media)"
|
|
},
|
|
"enableSsl": {
|
|
"type": "boolean",
|
|
"description": "Activer le certificat SSL Let's Encrypt / HTTPS par défaut"
|
|
},
|
|
"mainPort": {
|
|
"type": "integer",
|
|
"description": "Port cible principal pour le reverse proxy Nginx"
|
|
}
|
|
}
|
|
},
|
|
"category": {
|
|
"type": "string",
|
|
"enum": ["media", "cloud", "productivity", "security", "utilities", "development", "home_automation", "network"],
|
|
"description": "Catégorie de l'application dans l'App Store"
|
|
},
|
|
"version": {
|
|
"type": "string",
|
|
"pattern": "^[a-zA-Z0-9.-]+$",
|
|
"description": "Version du paquet ou du conteneur (ex: 1.0.0, stable, 2024.9.0)"
|
|
},
|
|
"developer": {
|
|
"type": "string",
|
|
"minLength": 2,
|
|
"maxLength": 100,
|
|
"description": "Nom de l'auteur, de l'entreprise ou du projet open source"
|
|
},
|
|
"website": {
|
|
"type": "string",
|
|
"format": "uri",
|
|
"description": "Site web officiel ou dépôt GitHub de l'application"
|
|
},
|
|
"rating": {
|
|
"type": "number",
|
|
"minimum": 1.0,
|
|
"maximum": 5.0,
|
|
"description": "Note moyenne indicative (entre 1.0 et 5.0)"
|
|
},
|
|
"downloads": {
|
|
"type": "string",
|
|
"description": "Indication du volume d'utilisateurs ou téléchargements (ex: 1.2M, 500K)"
|
|
},
|
|
"sizeMb": {
|
|
"type": "number",
|
|
"minimum": 1,
|
|
"maximum": 50000,
|
|
"description": "Taille estimée de l'image Docker en mégaoctets"
|
|
},
|
|
"license": {
|
|
"type": "string",
|
|
"description": "Licence logicielle (ex: MIT, AGPLv3, Apache-2.0, Propriétaire)"
|
|
},
|
|
"image": {
|
|
"type": "string",
|
|
"minLength": 3,
|
|
"maxLength": 255,
|
|
"description": "Image Docker officielle ou vérifiée (ex: nextcloud:apache, lscr.io/linuxserver/plex:latest)"
|
|
},
|
|
"defaultPort": {
|
|
"type": "integer",
|
|
"minimum": 1,
|
|
"maximum": 65535,
|
|
"description": "Port d'écoute public principal par défaut"
|
|
},
|
|
"ports": {
|
|
"type": "array",
|
|
"minItems": 1,
|
|
"items": {
|
|
"type": "object",
|
|
"required": ["privatePort", "defaultPublicPort"],
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"name": {
|
|
"type": "string",
|
|
"description": "Nom lisible du service réseau (ex: Web UI, API, DNS)"
|
|
},
|
|
"privatePort": {
|
|
"type": "integer",
|
|
"minimum": 1,
|
|
"maximum": 65535,
|
|
"description": "Port interne du conteneur Docker"
|
|
},
|
|
"defaultPublicPort": {
|
|
"type": "integer",
|
|
"minimum": 1,
|
|
"maximum": 65535,
|
|
"description": "Port hôte suggéré par défaut"
|
|
},
|
|
"description": {
|
|
"type": "string",
|
|
"description": "Description du rôle du port (ex: Interface Web, Flux RTSP, WebSocket)"
|
|
},
|
|
"type": {
|
|
"type": "string",
|
|
"enum": ["tcp", "udp"],
|
|
"description": "Protocole de transport réseau du port"
|
|
},
|
|
"protocol": {
|
|
"type": "string",
|
|
"enum": ["http", "https", "tcp", "udp"],
|
|
"description": "Protocole applicatif pour la redirection Nginx"
|
|
},
|
|
"isDefaultNginxTarget": {
|
|
"type": "boolean",
|
|
"description": "Indique si ce port est la cible principale du domaine Nginx automatique"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"volumes": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "object",
|
|
"required": ["defaultHostPath", "containerPath", "required"],
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"defaultHostPath": {
|
|
"type": "string",
|
|
"pattern": "^/.*",
|
|
"description": "Chemin hôte recommandé pour les données persistantes (généralement sous /mnt/storage/...)"
|
|
},
|
|
"containerPath": {
|
|
"type": "string",
|
|
"pattern": "^/.*",
|
|
"description": "Chemin absolu de destination à l'intérieur du conteneur"
|
|
},
|
|
"description": {
|
|
"type": "string",
|
|
"description": "Explication de la destination (ex: Répertoire des photos, Base de données)"
|
|
},
|
|
"required": {
|
|
"type": "boolean",
|
|
"description": "Indique si ce volume est indispensable au bon fonctionnement"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"env": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "object",
|
|
"required": ["key", "defaultValue", "label", "required"],
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"key": {
|
|
"type": "string",
|
|
"pattern": "^[A-Z0-9_]+$",
|
|
"description": "Nom de la variable d'environnement (ex: TZ, DB_NAME)"
|
|
},
|
|
"defaultValue": {
|
|
"type": "string",
|
|
"description": "Valeur par défaut ou exemple"
|
|
},
|
|
"label": {
|
|
"type": "string",
|
|
"description": "Nom convivial affiché dans l'interface"
|
|
},
|
|
"required": {
|
|
"type": "boolean",
|
|
"description": "Indique si la variable est obligatoire"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|