API HTTP¶
L’API HTTP de kikx-backend, compilée depuis backend/. Elle est sans état, se contente d’effectuer des rendus et n’écrit jamais sur le disque. L’adresse d’écoute et le port se règlent dans Configuration.
URL de base : http://127.0.0.1:4000 par défaut. Tous les chemins sont sous /api.
Méthode |
Chemin |
Requête |
Réponse |
|---|---|---|---|
|
— |
|
|
|
— |
|
|
|
— |
|
|
|
— |
|
|
|
— |
|
|
|
chemin |
Manifeste de preset |
|
|
requête |
|
|
|
JSON |
|
Les routes GET répondent aussi à HEAD. Toute autre méthode sur un chemin connu renvoie 405 Method Not Allowed avec un en-tête allow. Un chemin inconnu renvoie 404 Not Found avec un corps vide.
GET /api/health¶
Réponse 200, content-type: text/plain; charset=utf-8 :
ok
GET /api/components¶
Références des composants intégrés, dans l’ordre du registre.
Réponse 200 :
{"components":["k8s/deployment","k8s/service","k8s/ingress","terraform/digitalocean","terraform/hetzner","ansible/k8s-bootstrap","ansible/inventory","ansible/group-vars","ansible/common-role","ansible/role","ansible/playbook","ansible/site","ansible/config"]}
Clé |
Type |
|---|---|
|
tableau de chaînes |
GET /api/registry¶
Tous les composants intégrés.
Réponse 200 :
{"items":[{"name":"deployment","category":"k8s","title":"Deployment","description":"Pods running one container image.","reference":"k8s/deployment","fields":[{"name":"image","required":true,"default":null,"description":null,"example":"nginx:1.27","options":[]},{"name":"replicas","required":false,"default":"1","description":null,"example":null,"options":[]},{"name":"port","required":false,"default":"80","description":null,"example":null,"options":[]}],"files":["{{ name }}-deployment.yaml"]}]}
L’exemple ne montre que le premier élément. Le contenu complet est listé dans Composants.
Clé |
Type |
|---|---|
|
tableau de |
RegistryItem¶
Clé |
Type |
Description |
|---|---|---|
|
chaîne |
Nom du composant |
|
chaîne |
Catégorie du composant |
|
chaîne |
Titre affiché, |
|
chaîne |
Description sur une ligne, |
|
chaîne |
|
|
tableau de |
Champs déclarés, dans l’ordre |
|
tableau de chaînes |
Templates des chemins de sortie, non rendus. Le corps des templates n’est pas inclus |
Field¶
Clé |
Type |
Description |
|---|---|---|
|
chaîne |
Nom du champ |
|
booléen |
Le rendu échoue en l’absence de valeur et de valeur par défaut |
|
chaîne ou |
Valeur utilisée lorsqu’aucune n’est fournie |
|
chaîne ou |
Texte d’aide |
|
chaîne ou |
Valeur d’exemple |
|
tableau de |
Valeurs suggérées. |
GET /api/config¶
Valeurs par défaut du projet compilées dans kikx-core.
Réponse 200 :
{"defaultNamespace":"default","defaultOutputDir":"k8s","defaultProjectName":"kikx-project"}
Clé |
Type |
|---|---|
|
chaîne |
|
chaîne |
|
chaîne |
GET /api/presets¶
Résumés des templates de preset intégrés, dans l’ordre où kikx presets les affiche.
Réponse 200 :
{"presets":[{"name":"k8s-web-app","title":"Kubernetes web app","description":"A web frontend and an API behind ingresses, plus a background worker.","componentCount":7},{"name":"single-server","title":"Single server with Ansible","description":"One DigitalOcean droplet, configured by a common role through a site playbook.","componentCount":7},{"name":"kubeadm-cluster","title":"Kubernetes cluster with kubeadm","description":"Hetzner servers bootstrapped into a three-node control plane and three workers.","componentCount":11},{"name":"web-and-database","title":"Web servers and a database","description":"Existing servers split into a web tier and a PostgreSQL primary with a replica.","componentCount":13},{"name":"multi-tier-platform","title":"Multi-tier platform","description":"A storefront platform: edge load balancers, web/app tiers, PostgreSQL primary + replicas, Redis, monitoring and a Kubernetes cluster.","componentCount":35}]}
Clé |
Type |
|---|---|
|
tableau de |
PresetSummary¶
Clé |
Type |
Description |
|---|---|---|
|
chaîne |
Nom du template, accepté par |
|
chaîne |
Titre affiché, |
|
chaîne |
Description sur une ligne, |
|
entier |
Nombre de composants du template |
GET /api/presets/{name}¶
Renvoie un template intégré sous forme de manifeste de preset, au Format des presets. Toutes les clés sont présentes : fields et labels valent {} lorsque le template les omet, et project.name vaut null s’il n’est pas défini. Pour l’ouvrir, le tableau de bord effectue le rendu de chaque composant via POST /api/render.
Paramètre de chemin |
Description |
|---|---|
|
Nom du template, tel que listé par |
Requête :
GET /api/presets/k8s-web-app
Réponse 200, raccourcie au premier composant :
{"name":"k8s-web-app","title":"Kubernetes web app","description":"A web frontend and an API behind ingresses, plus a background worker.","project":{"name":"web-app","namespace":"web","outputDir":"k8s"},"components":[{"reference":"k8s/deployment","name":"frontend","fields":{"image":"ghcr.io/example/frontend:1.0.0","replicas":"2","port":"3000"},"labels":{}}]}
Condition |
Statut |
Corps |
|---|---|---|
Aucun template ne porte ce nom |
|
|
GET /api/registry/inspect¶
Résout une référence et renvoie son RegistryItem.
Paramètre de requête |
Obligatoire |
Description |
|---|---|---|
|
oui |
Référence intégrée, URL, ou chemin vers un |
Requête :
GET /api/registry/inspect?ref=k8s/service
Réponse 200 :
{"name":"service","category":"k8s","title":"Service","description":"A stable address for pods.","reference":"k8s/service","fields":[{"name":"port","required":false,"default":"80","description":null,"example":null,"options":[]},{"name":"target_port","required":false,"default":null,"description":"Container port; defaults to the service port.","example":null,"options":[]}],"files":["{{ name }}-service.yaml"]}
Condition |
Statut |
Corps |
|---|---|---|
Référence inconnue |
|
|
La récupération de l’URL échoue |
|
|
Le fichier ou la réponse n’est pas un élément de registre |
|
|
|
|
|
POST /api/render¶
Effectue le rendu d’un composant et renvoie le contenu des fichiers. N’écrit rien. Les vérifications de sécurité des chemins appliquées par la CLI à l’écriture ne sont pas appliquées.
En-têtes de la requête : Content-Type: application/json.
RenderRequest¶
Clé |
Type |
Obligatoire |
Valeur par défaut |
Description |
|---|---|---|---|---|
|
chaîne |
oui |
— |
Référence du composant |
|
chaîne |
oui |
— |
|
|
objet de chaîne vers chaîne |
non |
|
Valeurs des champs |
|
tableau de |
non |
|
Labels. |
|
chaîne |
non |
|
Namespace utilisé lorsqu’aucun champ |
|
chaîne |
non |
— |
Définit le champ |
|
entier non signé sur 32 bits |
non |
— |
Définit le champ |
|
entier |
non |
— |
Définit le champ |
|
entier |
non |
— |
Définit le champ |
|
chaîne |
non |
— |
Définit le champ |
|
chaîne |
non |
— |
Définit le champ |
|
chaîne |
non |
— |
Définit le champ |
|
chaîne |
non |
— |
Définit le champ |
Une clé de fields l’emporte sur la clé de premier niveau qui définit le même champ. Les clés de premier niveau inconnues sont ignorées.
Requête :
{"reference":"k8s/service","name":"web","port":8080,"labels":[{"key":"tier","value":"frontend"}]}
Réponse 200 :
{"component":"service","files":[{"path":"web-service.yaml","content":"apiVersion: v1\nkind: Service\nmetadata:\n name: web\n namespace: default\nspec:\n selector:\n\n app: web\n\n tier: frontend\n\n ports:\n - port: 8080\n targetPort: 8080\n protocol: TCP\n"}]}
RenderResponse¶
Clé |
Type |
Description |
|---|---|---|
|
chaîne |
Nom du composant, sans la catégorie |
|
tableau de |
Chemin rendu, relatif, et contenu du fichier |
Erreurs¶
Condition |
Statut |
Type de contenu |
Corps |
|---|---|---|---|
Référence inconnue ou invalide |
|
JSON |
|
Champ obligatoire manquant |
|
JSON |
|
Deux fichiers sont rendus vers le même chemin |
|
JSON |
|
Erreur de syntaxe ou de rendu du template |
|
JSON |
|
|
|
texte |
|
Le corps n’est pas du JSON valide |
|
texte |
|
Clé manquante ou type incorrect |
|
texte |
|
Forme des erreurs¶
Les erreurs levées par kikx utilisent ce corps JSON, avec content-type: application/json :
{"code":"invalid_request","error":"--image is required for k8s/deployment"}
|
Statut |
|---|---|
|
|
|
|
|
|
|
|
|
|
not_initialized et already_exists sont définis mais ne sont renvoyés par aucun point d’accès actuel. Les erreurs d’analyse de la requête sont renvoyées par le framework en text/plain, comme indiqué pour chaque point d’accès.
CORS¶
Réglage |
Valeur |
|---|---|
Méthodes autorisées |
|
En-têtes de requête autorisés |
|
Origines autorisées, |
Toute origine dont l’hôte est |
Origines autorisées, |
Exactement les origines listées. Les origines de bouclage ne sont plus autorisées si elles ne sont pas listées |
Une origine autorisée est renvoyée dans access-control-allow-origin. Une origine refusée ne reçoit aucun en-tête access-control-allow-origin ; la requête elle-même est tout de même traitée. Chaque réponse porte vary: origin. Les requêtes préalables OPTIONS renvoient 200 avec access-control-allow-methods: GET,POST et access-control-allow-headers: content-type.
Requête préalable pour http://localhost:3000 :
HTTP/1.1 200 OK
vary: origin
access-control-allow-methods: GET,POST
access-control-allow-headers: content-type
access-control-allow-origin: http://localhost:3000
allow: POST
content-length: 0