Aller au contenu principal

Référence de l'API

L'API écoute sur le port 2538 et répond en JSON.

Authentification​

ClientCommentPermissions
NavigateurSession après la connexion OIDC : cookie signé authorization (un en-tête Authorization: Bearer <token> est aussi accepté)Toutes les permissions de l'utilisateur
CLI, scripts, MCPClé API dans l'en-tête X-API-KeyLe profil de l'utilisateur, limité par les scopes de la clé
  • Profil : un utilisateur est admin ou restreint. Une clé porte le profil de son utilisateur : un scope admin sur la clé d'un utilisateur restreint ne donne rien. Les utilisateurs restreints ne voient que les conteneurs qui leur sont attribués.
  • Scopes : une clé sans scope (ancienne clé) a un accès complet. * donne tous les droits et ne se combine avec aucun autre scope. Une clé ne peut créer que des clés dans ses propres scopes. Liste complète : scopes des clés API.
  • Jetons : loch_ suivi de 64 caractères hexadécimaux, affiché une seule fois, valable 365 jours au plus, 20 clés au plus par utilisateur.
  • CSRF : les requêtes d'écriture venant d'un navigateur doivent porter l'Origin de FRONT_URL, sinon 403 FORBIDDEN_ORIGIN. Les clients sans navigateur ne sont pas concernés.
  • Limitation de débit : 120 requêtes par minute et par IP. L'IP n'est lue dans X-Forwarded-For que derrière un proxy listé dans TRUSTED_PROXIES.

Erreurs​

Les erreurs ont la forme :

{"code": "INSUFFICIENT_SCOPE", "error": "Insufficient API key scope"}

code est stable et traduit par l'interface ; error est un texte lisible de secours.

StatutCodeSignification
400INVALID_REQUEST_BODYCorps mal formé ; les corps stricts refusent aussi les champs inconnus
401UNAUTHORIZEDPas de session, ou clé API inconnue
401API_KEY_EXPIREDLa clé API a expiré
403FORBIDDENSession invalide, ou action non autorisée (pas admin, conteneur non attribué)
403INSUFFICIENT_SCOPEIl manque le scope à la clé API
403FORBIDDEN_ORIGINÉcriture d'un navigateur depuis une autre origine
429—Limitation de débit, réponse en texte brut
500INTERNAL_ERRORErreur du serveur

Routes​

Dans les tableaux, Scope est le scope de clé API vérifié par la route ; « — » signifie que seul le profil est vérifié. Admin signifie que la route est réservée aux admins.

Publiques​

MéthodeCheminDescription
GET/_healthContrôle de santé, inclut l'état de Docker
GET/openid-connect/loginDémarrer une connexion OIDC
GET/openid-connect/redirectRetour OIDC
GET/openid-connect/logoutDéconnexion

Conteneurs et stacks​

MéthodeCheminScopeAdminDescription
GET/dockercontainers:readConteneurs, filtrés selon les permissions
GET/docker/{id}containers:readDétails d'un conteneur
POST/docker/{id}/{action}containers:actionsstart, stop, kill, restart, delete
POST/stacks/{name}/{action}containers:actionsstart, stop, restart tous les conteneurs accessibles d'une stack compose, dans l'ordre depends_on
GET/logs/{id}containers:logsLogs (texte)
GET/logs/{id}/jsoncontainers:logsLogs (JSON)
GET/logs/{id}/file?path=&tail=containers:logsDernières lignes d'un fichier du conteneur
GET/docker/{id}/cp?path=containers:cpTélécharger un fichier ou un dossier (flux tar)
PUT/docker/{id}/cp?path=containers:cpEnvoyer un fichier ou un dossier (flux tar)
GET/wsselon l'événementWebSocket, voir plus bas

Domaines​

MéthodeCheminScopeAdminDescription
GET/domains—OuiDomaines routés par Traefik

Tâches planifiées​

MéthodeCheminScopeAdminDescription
GET/croncronTâches
POST/croncronCréer
GET/cron/{id}cronDétails
PUT / PATCH/cron/{id}cronModifier / modifier en partie
DELETE/cron/{id}cronSupprimer
POST/cron/{id}/runcronLancer maintenant (202)

Les admins voient toutes les tâches. Les utilisateurs restreints voient, modifient et suppriment toutes les tâches HTTP et les tâches Docker de leurs conteneurs ; ils ne peuvent créer que des tâches Docker sur ces conteneurs.

Types de tâches : docker_action, docker_exec, http et function_invoke. Une tâche function_invoke (functionInvoke: {function, event}, événement de 64 Kio au plus, {} par défaut) est réservée aux admins ; la créer, la modifier ou la lancer demande aussi functions:invoke. 5 tâches au plus par fonction. Chaque tâche porte lastSkipped (une exécution sautée parce que la précédente tournait encore) et disabledReason (FUNCTION_DELETED quand le panel l'a désactivée).

Utilisateurs et clés API​

MéthodeCheminScopeAdminDescription
GET/users/me—Utilisateur courant
GET/users/me/api-keys—Ses propres clés, jamais le jeton
POST/users/me/api-keys—Créer une clé ; le jeton est renvoyé une seule fois
DELETE/users/me/api-keys/{id}—Révoquer une clé
GET/users—OuiUtilisateurs
PATCH/users/{email}/switch—OuiBasculer admin / restreint
PATCH/users/{email}/restrict—OuiRendre restreint
PATCH/users/{email}—OuiModifier les permissions sur les conteneurs
DELETE/users/{email}—OuiSupprimer, et révoquer les clés de l'utilisateur

Utilisateurs SFTP​

Disponible quand SFTP_ENABLED est activé (/sftp/config répond toujours).

MéthodeCheminScopeAdminDescription
GET/sftp/config—OuiÉtat du plugin et informations de connexion
GET/sftp/sitessftp:readOuiSites
GET/sftp/userssftp:readOuiUtilisateurs
POST/sftp/userssftp:writeOuiCréer
PUT/sftp/users/{username}sftp:writeOuiModifier
DELETE/sftp/users/{username}sftp:writeOuiSupprimer
POST/sftp/users/{username}/passwordsftp:writeOuiNouveau mot de passe
POST/sftp/users/{username}/statussftp:writeOuiActiver / désactiver

Hébergement web​

Disponible quand HOSTING_ENABLED est activé (/hosting/config répond toujours).

MéthodeCheminScopeAdminDescription
GET/hosting/config—OuiÉtat du plugin, modèles, versions PHP, valeurs par défaut, limites, defaultNetworks
GET/hosting/siteshosting:readOuiRépertoires de sites et l'hébergement qui utilise chacun
GET/hosting/php-modules?template=&version=hosting:readOuiModules PHP d'une image
GET/hosting/routing-templatehosting:readOuiModèle de routage
GET/hosting/stackshosting:readOuiSites avec leur état
GET/hosting/stacks/check-name?name=hosting:readOuiDisponibilité d'un nom
POST/hosting/stackshosting:writeOuiCréer et déployer (202, asynchrone)
GET/hosting/stacks/{name}hosting:readOuiParamètres, conteneurs, dernière opération. Sans hosting:write, les valeurs d'environnement et les snippets sont masqués
PUT/hosting/stacks/{name}[?force=true]hosting:writeOuiModifier et redéployer, annulé en cas d'échec (202)
POST/hosting/stacks/{name}/deploy[?pull=true][&force=true]hosting:writeOuiRedéployer (202) ; force écrase les modifications faites hors du panel
DELETE/hosting/stacks/{name}[?purgeData=true]hosting:writeOuiSupprimer ; les données du site sont gardées sauf avec purgeData (202)

Services managés​

Disponible quand SERVICES_ENABLED est activé (/services/config répond toujours).

MéthodeCheminScopeAdminDescription
GET/services/configservices:readOuiÉtat du module, moteurs, versions, options, politique d'exposition, état de la découverte des versions
GET/services/instancesservices:readOuiInstances avec état, réseaux, exposition, fin de support, mises à jour disponibles
GET/services/instances/{instance}/resourcesservices:readOuiRessources d'une instance
POST/services/resourcesservices:writeOuiCréer {engine, version, name, options, legacyAuth, networks?} ; renvoie les identifiants une seule fois
POST/services/instances/{instance}/resources/{name}/passwordservices:writeOuiNouveau mot de passe, renvoyé une seule fois
DELETE/services/instances/{instance}/resources/{name}services:writeOuiSupprimer une ressource (une instance dédiée est supprimée avec elle)
PATCH/services/instances/{instance}services:writeOuiModifier les options modifiables d'une instance dédiée {options}
POST/services/instances/{instance}/updateservices:writeOuiMettre à jour une instance dédiée {version?} ; renvoie {updated, version, image}
POST/services/updates/checkservices:writeOuiDécouvrir les versions et mises à jour maintenant, au plus une fois toutes les 30 secondes
PUT/services/instances/{instance}/networksnetworks:writeOuiRemplacer les réseaux {networks} ; le conteneur est recréé
PUT/services/instances/{instance}/exposureservices:exposeOuiPublier {address, port, tlsOptional?}
DELETE/services/instances/{instance}/exposureservices:exposeOuiFermer le port
DELETE/services/instances/{instance}[?purge=true]services:writeOuiRetirer une instance partagée vide ; purge supprime une instance modifiée à la main, avec ses données

services:expose n'est pas inclus dans services:write.

Réseaux privés​

Les corps sont stricts : les champs inconnus sont refusés (INVALID_REQUEST_BODY).

MéthodeCheminScopeAdminDescription
GET/networksnetworks:readOuiRéseaux privés, le réseau système services en premier
GET/networks/confignetworks:readOuiRègles de création
GET/networks/dockernetworks:readOuiRéseaux Docker que le panel n'a pas créés (lecture seule)
GET/networks/docker/{id}networks:readOuiL'un d'eux, avec ses membres
GET/networks/{name}networks:readOuiUn réseau privé avec ses membres
POST/networksnetworks:writeOuiCréer {name, description?, subnet?} (201)
PATCH/networks/{name}networks:writeOuiModifier {description}
DELETE/networks/{name}networks:writeOuiSupprimer (204)
POST/networks/{name}/membersnetworks:writeOuiRattacher {kind: "site" | "instance" | "function", name} ; une fonction demande aussi functions:deploy
DELETE/networks/{name}/members/{kind}/{member}networks:writeOuiDétacher ; une fonction demande aussi functions:deploy
POST/networks/{name}/disconnectnetworks:writeOuiDéconnecter un conteneur que le panel ne gère pas {containerId} (204)

Fonctions (travail en cours)​

Disponible quand FUNCTIONS_ENABLED est activé (/functions/config répond toujours). Les corps sont stricts. Créer avec env, networks, egress, sigv4 ou mcpInvocable, ou modifier env, handler ou mcpInvocable, demande functions:deploy en plus de functions:write.

MéthodeCheminScopeAdminDescription
GET/functions/configfunctions:readOuiÉtat du module, runtimes et versions, état du binaire du runtime (runtime, runtimeReady), limites, budget utilisé, valeurs par défaut
GET/functionsfunctions:readOuiFonctions et leur état
POST/functionsfunctions:writeOuiCréer {name, runtime, runtimeVersion, handler, memoryMB?, cpus?, timeoutSeconds?, tmpSizeMB?, env?, networks?, egress?, sigv4?, mcpInvocable?} (201) ; renvoie une seule fois les identifiants d'invocation
GET/functions/{name}functions:readOuiDétails : image, variables, noms des secrets, déploiements, endpoint ; le conteneur est vérifié
PATCH/functions/{name}functions:writeOuiModifier {memoryMB?, cpus?, timeoutSeconds?, tmpSizeMB?, handler?, env?, mcpInvocable?} ; une fonction en marche est recréée
DELETE/functions/{name}[?purge=true]functions:writeOuiSupprimer ; purge supprime une fonction modifiée hors du panel sans exécuter ses fichiers
POST/functions/{name}/codefunctions:deployOuiDéployer un zip (corps application/zip ou partie code d'un multipart/form-data), activé aussitôt (201)
GET/functions/{name}/deploymentsfunctions:readOuiDéploiements conservés, du plus récent au plus ancien
POST/functions/{name}/deployments/{id}/activatefunctions:deployOuiActiver un déploiement conservé (204)
PUT/functions/{name}/secrets/{key}functions:deployOuiDéfinir un secret {value} (204) ; jamais renvoyé
DELETE/functions/{name}/secrets/{key}functions:deployOuiSupprimer un secret (204)
POST/functions/{name}/credentials/rotatefunctions:deployOuiNouveaux identifiants d'invocation, renvoyés une seule fois ; {sigv4} facultatif
POST/functions/{name}/invokefunctions:invokeOuiInvoquer avec le corps comme événement (une valeur JSON, 6 Mio au plus) ; toujours 200 avec {statusCode, functionError?, requestId?, durationMs, payload? | payloadBase64?, logTail}
POST/functions/{name}/{action}functions:writeOuistart, stop, restart (204)
PUT/functions/{name}/networksfunctions:deployOuiRemplacer les réseaux {networks} (jamais services) ; le conteneur est recréé
PUT/functions/{name}/egressfunctions:deployOuiAccès à Internet {enabled}

Ce que renvoie une fonction n'est pas fiable : affichez-le comme texte. Les conteneurs des fonctions sont protégés dans les routes des conteneurs : leur environnement est masqué, et shell, copie de fichiers, lecture de fichiers, tunnel de port, actions sur les conteneurs et les stacks et tâches cron Docker répondent 403 FUNCTION_CONTAINER_PROTECTED. Leur sortie standard reste lisible par les admins.

Journal d'audit​

MéthodeCheminScopeAdminDescription
GET/audit?from=&to=&user=&event=&exclude=&level=&q=&before=&limit=audit:readOuiEntrées, les plus récentes d'abord ; limit jusqu'à 500

Une requête lit au plus 64 Mo du journal : une page peut donc être plus courte que limit, voire vide. Continuez tant que la réponse contient un curseur next, à passer dans before.

WebSocket​

Connectez-vous à /ws avec le cookie de session ou l'en-tête X-API-Key. Les messages sont en JSON {"event": ..., "data": ...}. Le scope est vérifié sur les événements qui ouvrent une session ; un scope manquant renvoie l'événement d'erreur correspondant (error, logsError, statsError, proxyError, streamError).

Événement clientScopeDonnées
attachcontainers:shell{"id": "container-id"}
streamInput— (après attach)"command"
resize— (après attach){"cols": 120, "rows": 40}
logsStartcontainers:logs{"id": "container-id", "tail": 100, "file": "/optional/path"}
logsStop——
statsStartcontainers:stats{"ids": ["container-id-1", "container-id-2"]}
statsStop——
proxyOpencontainers:proxy{"id": "container-id", "mappings": [{"remote": 5432, "local": 15432}]}
streamOpencontainers:proxy{"streamID": 1, "remotePort": 5432}
streamClose—{"streamID": 1}

Événements serveur : attach, stdout, stderr, end, logsData, logsEnd, logsError, statsData, statsError, proxyReady, streamOpened, streamClose, streamError, proxyError, error.

LimiteValeur
Données du proxy de portsMessages binaires [streamID: uint32 big endian][payload]
Proxy de ports10 correspondances au plus par session et 256 flux simultanés
StatistiquesCollectées toutes les 2 secondes, 20 conteneurs au plus par abonnement, un statsStart toutes les 3 secondes au plus