bunkerweb/docs/fr/api.md
TheophileDiot 47fa0d4250
Road to 1.6.6 🚀
2025-11-21 20:04:34 +01:00

31 KiB
Raw Blame History

API

Aperçu

L'API de BunkerWeb est le plan de contrĂŽle utilisĂ© pour gĂ©rer les instances BunkerWeb de maniĂšre programmatique : lister et gĂ©rer les instances, les recharger/arrĂȘter, gĂ©rer les bannissements, les plugins, les tĂąches, les configurations, et plus encore. Elle expose une application FastAPI documentĂ©e avec une authentification forte, une gestion des autorisations et une limitation de dĂ©bit.

Ouvrez la documentation interactive sur /docs (ou <root_path>/docs si vous avez défini API_ROOT_PATH). Le schéma OpenAPI est disponible sur /openapi.json.

!!! warning "Sécurité" L'API est un plan de contrÎle privilégié. Ne l'exposez pas sur l'Internet public sans protections supplémentaires.

Au minimum, restreignez les adresses IP sources (`API_WHITELIST_IPS`), activez l'authentification (`API_TOKEN` ou des utilisateurs API + Biscuit), et envisagez de la placer derriÚre BunkerWeb avec une URL difficile à deviner et des contrÎles d'accÚs supplémentaires.

Prérequis

Le service API nécessite un accÚs à la base de données de BunkerWeb (DATABASE_URI). Il est généralement déployé aux cÎtés du Planificateur (Scheduler) et, optionnellement, de l'Interface Web (Web UI). La configuration recommandée est d'exécuter BunkerWeb en tant que reverse proxy en amont et d'isoler l'API sur un réseau interne.

Consultez l'assistant et les conseils d'architecture dans le guide de démarrage rapide.

Déploiement recommandé (Conteneurs dédiés)

En production, dĂ©ployez l'API dans son propre conteneur aux cĂŽtĂ©s du plan de donnĂ©es et du scheduler BunkerWeb. Gardez l'API limitĂ©e au rĂ©seau interne du plan de contrĂŽle et exposez-la uniquement via BunkerWeb en reverse proxy. Cette architecture s'aligne sur la rĂ©fĂ©rence d'intĂ©gration Docker et garantit que le scheduler, BunkerWeb et l'API partagent les mĂȘmes paramĂštres.

x-bw-env: &bw-env
  # Nous utilisons une ancre pour Ă©viter de rĂ©pĂ©ter la mĂȘme configuration pour les deux services
  API_WHITELIST_IP: "127.0.0.0/8 10.20.30.0/24" # Veillez à définir la plage d'IP correcte pour que le scheduler puisse envoyer la configuration à l'instance
  DATABASE_URI: "mariadb+pymysql://bunkerweb:changeme@bw-db:3306/db" # N'oubliez pas de définir un mot de passe plus robuste pour la base de données

services:
  bunkerweb:
    # Nom utilisé par le Scheduler pour identifier l'instance
    image: bunkerity/bunkerweb:1.6.6
    ports:
      - "80:8080/tcp"
      - "443:8443/tcp"
      - "443:8443/udp" # Pour la prise en charge de QUIC / HTTP3
    environment:
      <<: *bw-env # Nous rĂ©utilisons l'ancre pour ne pas rĂ©pĂ©ter la mĂȘme configuration pour tous les services
    restart: "unless-stopped"
    networks:
      - bw-universe
      - bw-services

  bw-scheduler:
    image: bunkerity/bunkerweb-scheduler:1.6.6
    environment:
      <<: *bw-env
      BUNKERWEB_INSTANCES: "bunkerweb" # Veillez Ă  utiliser le nom d'instance correct
      SERVER_NAME: "api.example.com" # Modifiez-le si nécessaire
      MULTISITE: "yes"
      USE_REDIS: "yes"
      REDIS_HOST: "redis"
      api.example.com_USE_TEMPLATE: "bw-api"
      api.example.com_GENERATE_SELF_SIGNED_SSL: "yes"
      api.example.com_USE_REVERSE_PROXY: "yes"
      api.example.com_REVERSE_PROXY_URL: "/"
      api.example.com_REVERSE_PROXY_HOST: "http://bw-api:8888"
    volumes:
      - bw-storage:/data # Sert à persister le cache et d'autres données comme les sauvegardes
    restart: "unless-stopped"
    networks:
      - bw-universe
      - bw-db

  bw-api:
    image: bunkerity/bunkerweb-api:1.6.6
    environment:
      <<: *bw-env
      API_USERNAME: "admin"
      API_PASSWORD: "Str0ng&P@ss!" # N'oubliez pas de définir un mot de passe plus robuste pour l'utilisateur administrateur
      DEBUG: "1"
    restart: "unless-stopped"
    networks:
      bw-universe:
        aliases:
          - bw-api
      bw-db:
        aliases:
          - bw-api

  bw-db:
    image: mariadb:11
    # Nous dĂ©finissons la taille maximale des paquets pour Ă©viter les problĂšmes avec les requĂȘtes volumineuses
    command: --max-allowed-packet=67108864
    environment:
      MYSQL_RANDOM_ROOT_PASSWORD: "yes"
      MYSQL_DATABASE: "db"
      MYSQL_USER: "bunkerweb"
      MYSQL_PASSWORD: "changeme" # N'oubliez pas de définir un mot de passe plus robuste pour la base de données
    volumes:
      - bw-data:/var/lib/mysql
    restart: "unless-stopped"
    networks:
      - bw-db

  redis: # Service Redis pour la persistance des rapports/bannissements/statistiques
    image: redis:7-alpine
    command: >
      redis-server
      --maxmemory 256mb
      --maxmemory-policy allkeys-lru
      --save 60 1000
      --appendonly yes      
    volumes:
      - redis-data:/data
    restart: "unless-stopped"
    networks:
      - bw-universe

volumes:
  bw-data:
  bw-storage:
  redis-data:

networks:
  bw-universe:
    name: bw-universe
    ipam:
      driver: default
      config:
        - subnet: 10.20.30.0/24 # Veillez à définir la plage d'IP correcte pour que le scheduler puisse envoyer la configuration à l'instance
  bw-services:
    name: bw-services
  bw-db:
    name: bw-db

Cela isole l'API derriÚre BunkerWeb, maintient le trafic sur des réseaux de confiance et vous permet de faire respecter l'authentification, les listes blanches et les limites de débit au niveau du plan de contrÎle comme du nom d'hÎte exposé.

Points clés

  • Gestion des instances : diffuse les actions opĂ©rationnelles aux instances dĂ©couvertes.
  • Authentification forte : Basic pour les administrateurs, jeton Bearer pour un accĂšs admin complet, ou jeton Biscuit pour des permissions granulaires.
  • Liste blanche d'IP et limitation de dĂ©bit flexible par route.
  • Signaux standards de santĂ©/disponibilitĂ© (health/readiness) et vĂ©rifications de sĂ©curitĂ© au dĂ©marrage.

ModĂšles de configuration Docker Compose

=== "Docker"

Exposer l'API en reverse proxy sous `/api` avec BunkerWeb.

```yaml
x-bw-env: &bw-env
  # Liste blanche commune pour le plan de contrĂŽle des instances (BunkerWeb/Scheduler)
  API_WHITELIST_IP: "127.0.0.0/8 10.20.30.0/24"

services:
  bunkerweb:
    image: bunkerity/bunkerweb:1.6.6
    ports:
      - "80:8080/tcp"
      - "443:8443/tcp"
      - "443:8443/udp"  # QUIC
    environment:
      <<: *bw-env
    restart: unless-stopped
    networks:
      - bw-universe
      - bw-services

  bw-scheduler:
    image: bunkerity/bunkerweb-scheduler:1.6.6
    environment:
      <<: *bw-env
      BUNKERWEB_INSTANCES: "bunkerweb"  # Doit correspondre au nom de service de l'instance
      SERVER_NAME: "www.example.com"
      MULTISITE: "yes"
      DATABASE_URI: "mariadb+pymysql://bunkerweb:changeme@bw-db:3306/db"
      DISABLE_DEFAULT_SERVER: "yes"
      # Reverse proxy pour l'API sur /api
      www.example.com_USE_REVERSE_PROXY: "yes"
      www.example.com_REVERSE_PROXY_URL: "/api"
      www.example.com_REVERSE_PROXY_HOST: "http://bw-api:8888"
    volumes:
      - bw-storage:/data
    restart: unless-stopped
    networks:
      - bw-universe
      - bw-db

  bw-api:
    image: bunkerity/bunkerweb-api:1.6.6
    environment:
      DATABASE_URI: "mariadb+pymysql://bunkerweb:changeme@bw-db:3306/db"  # Utilisez un mot de passe robuste
      API_WHITELIST_IPS: "127.0.0.0/8 10.20.30.0/24"                      # Liste blanche de l'API
      API_TOKEN: "secret"                                                 # Jeton optionnel pour accĂšs admin complet
      API_ROOT_PATH: "/api"                                               # Doit correspondre au chemin du reverse proxy
    restart: unless-stopped
    networks:
      - bw-universe
      - bw-db

  bw-db:
    image: mariadb:11
    # Évite les problĂšmes avec les requĂȘtes volumineuses
    command: --max-allowed-packet=67108864
    environment:
      MYSQL_RANDOM_ROOT_PASSWORD: "yes"
      MYSQL_DATABASE: "db"
      MYSQL_USER: "bunkerweb"
      MYSQL_PASSWORD: "changeme"  # Utilisez un mot de passe robuste
    volumes:
      - bw-data:/var/lib/mysql
    restart: unless-stopped
    networks:
      - bw-db

volumes:
  bw-data:
  bw-storage:

networks:
  bw-universe:
    name: bw-universe
    ipam:
      driver: default
      config:
        - subnet: 10.20.30.0/24
  bw-services:
    name: bw-services
  bw-db:
    name: bw-db
```

=== "Docker Autoconf"

Identique à ci-dessus, mais en utilisant le service Autoconf pour découvrir et configurer automatiquement les services. L'API est exposée sous `/api` grùce aux labels sur le conteneur de l'API.

```yaml
x-api-env: &api-env
  AUTOCONF_MODE: "yes"
  DATABASE_URI: "mariadb+pymysql://bunkerweb:changeme@bw-db:3306/db"  # Utilisez un mot de passe robuste

services:
  bunkerweb:
    image: bunkerity/bunkerweb:1.6.6
    ports:
      - "80:8080/tcp"
      - "443:8443/tcp"
      - "443:8443/udp"  # QUIC
    environment:
      AUTOCONF_MODE: "yes"
      API_WHITELIST_IP: "127.0.0.0/8 10.20.30.0/24"
    restart: unless-stopped
    networks:
      - bw-universe
      - bw-services

  bw-scheduler:
    image: bunkerity/bunkerweb-scheduler:1.6.6
    environment:
      <<: *api-env
      BUNKERWEB_INSTANCES: ""    # Découvert par Autoconf
      SERVER_NAME: ""            # Rempli via les labels
      MULTISITE: "yes"           # Obligatoire avec Autoconf
      API_WHITELIST_IP: "127.0.0.0/8 10.20.30.0/24"
    volumes:
      - bw-storage:/data
    restart: unless-stopped
    networks:
      - bw-universe
      - bw-db

  bw-autoconf:
    image: bunkerity/bunkerweb-autoconf:1.6.6
    depends_on:
      - bunkerweb
      - bw-docker
    environment:
      <<: *api-env
      DOCKER_HOST: "tcp://bw-docker:2375"
    restart: unless-stopped
    networks:
      - bw-universe
      - bw-docker
      - bw-db

  bw-api:
    image: bunkerity/bunkerweb-api:1.6.6
    environment:
      <<: *api-env
      API_WHITELIST_IPS: "127.0.0.0/8 10.20.30.0/24"
      API_TOKEN: "secret"
      API_ROOT_PATH: "/api"
    labels:
      - "bunkerweb.SERVER_NAME=www.example.com"
      - "bunkerweb.USE_REVERSE_PROXY=yes"
      - "bunkerweb.REVERSE_PROXY_URL=/api"
      - "bunkerweb.REVERSE_PROXY_HOST=http://bw-api:8888"
    restart: unless-stopped
    networks:
      - bw-universe
      - bw-db

  bw-db:
    image: mariadb:11
    command: --max-allowed-packet=67108864
    environment:
      MYSQL_RANDOM_ROOT_PASSWORD: "yes"
      MYSQL_DATABASE: "db"
      MYSQL_USER: "bunkerweb"
      MYSQL_PASSWORD: "changeme"
    volumes:
      - bw-data:/var/lib/mysql
    restart: unless-stopped
    networks:
      - bw-db

  bw-docker:
    image: tecnativa/docker-socket-proxy:nightly
    environment:
      CONTAINERS: "1"
      LOG_LEVEL: "warning"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
    restart: unless-stopped
    networks:
      - bw-docker

volumes:
  bw-data:
  bw-storage:

networks:
  bw-universe:
    name: bw-universe
    ipam:
      driver: default
      config:
        - subnet: 10.20.30.0/24
  bw-services:
    name: bw-services
  bw-db:
    name: bw-db
  bw-docker:
    name: bw-docker
```

!!! warning "Chemin du reverse proxy" Gardez le chemin de l'API difficile Ă  deviner et combinez-le avec la liste blanche et l'authentification de l'API.

Si vous exposez dĂ©jĂ  une autre application sur le mĂȘme nom de serveur avec un modĂšle (par ex. `USE_TEMPLATE`), prĂ©fĂ©rez un nom d'hĂŽte distinct pour l'API afin d'Ă©viter les conflits.

All-In-One

Si vous utilisez l'image All-In-One, l'API peut ĂȘtre activĂ©e en dĂ©finissant SERVICE_API=yes:

docker run -d \
  --name bunkerweb-aio \
  -e SERVICE_API=yes \
  -e API_WHITELIST_IPS="127.0.0.0/8" \
  -p 80:8080/tcp -p 443:8443/tcp -p 443:8443/udp \
  bunkerity/bunkerweb-all-in-one:1.6.6

Authentification

MĂ©thodes supportĂ©es pour authentifier les requĂȘtes :

  • Basic admin : Lorsque les identifiants appartiennent Ă  un utilisateur admin de l'API, les points d'accĂšs protĂ©gĂ©s acceptent Authorization: Basic <base64(username:password)>.
  • Bearer admin (jeton global) : Si API_TOKEN est configurĂ©, Authorization: Bearer <API_TOKEN> accorde un accĂšs complet.
  • Jeton Biscuit (recommandĂ©) : Obtenez un jeton depuis POST /auth en utilisant des identifiants Basic ou un corps de requĂȘte JSON/formulaire contenant username et password. Utilisez le jeton retournĂ© comme Authorization: Bearer <token> pour les appels suivants.

Exemple : obtenir un jeton Biscuit, lister les instances, puis les recharger toutes.

# 1) Obtenir un jeton Biscuit avec des identifiants admin
TOKEN=$(curl -s -X POST -u admin:changeme http://api.example.com/auth | jq -r .token)

# 2) Lister les instances
curl -H "Authorization: Bearer $TOKEN" http://api.example.com/instances

# 3) Recharger la configuration sur toutes les instances (sans test)
curl -X POST -H "Authorization: Bearer $TOKEN" \
     "http://api.example.com/instances/reload?test=no"

Jetons Biscuit : fonctionnement et vérifications

Les jetons intÚgrent des "faits" (facts) comme user(<username>), client_ip(<ip>), domain(<host>), et un rÎle général role("api_user", ["read", "write"]) dérivé des permissions de la base de données. Les administrateurs incluent admin(true) tandis que les non-administrateurs ont des faits granulaires comme api_perm(<resource_type>, <resource_id|*>, <permission>).

L'autorisation fait correspondre la route/méthode aux permissions requises ; admin(true) est toujours accepté. En l'absence de faits granulaires, le systÚme se base sur le rÎle général : GET/HEAD/OPTIONS nécessitent read ; les verbes d'écriture nécessitent write.

Les clés sont stockées dans /var/lib/bunkerweb/.api_biscuit_private_key et /var/lib/bunkerweb/.api_biscuit_public_key. Vous pouvez aussi fournir BISCUIT_PUBLIC_KEY/BISCUIT_PRIVATE_KEY via des variables d'environnement ; si ni les fichiers ni les variables ne sont définis, l'API génÚre et sauvegarde une paire de clés au démarrage.

Permissions (ACL)

Cette API supporte deux niveaux d'autorisation :

  • RĂŽle gĂ©nĂ©ral : Les jetons contiennent role("api_user", ["read"[, "write"]]) pour les points d'accĂšs sans correspondance granulaire. read correspond Ă  GET/HEAD/OPTIONS ; write correspond Ă  POST/PUT/PATCH/DELETE.
  • ACL granulaire : Les jetons intĂšgrent api_perm(<resource_type>, <resource_id|*>, <permission>) et les routes dĂ©clarent ce qu'elles exigent. admin(true) contourne toutes les vĂ©rifications.

Types de ressources supportés : instances, global_config, services, configs, plugins, cache, bans, jobs.

Noms des permissions par type de ressource :

  • instances: instances_read, instances_update, instances_delete, instances_create, instances_execute
  • global_config: global_config_read, global_config_update
  • services: service_read, service_create, service_update, service_delete, service_convert, service_export
  • configs: configs_read, config_read, config_create, config_update, config_delete
  • plugins: plugin_read, plugin_create, plugin_delete
  • cache: cache_read, cache_delete
  • bans: ban_read, ban_update, ban_delete, ban_created
  • jobs: job_read, job_run

ID de ressource : Pour les vérifications granulaires, le deuxiÚme segment de l'URL est traité comme resource_id lorsque c'est pertinent. Exemples : /services/{service} -> {service} ; /configs/{service}/... -> {service}. Utilisez "*" (ou omettez) pour accorder la permission globalement pour un type de ressource.

Configuration des utilisateurs et des ACL :

  • Utilisateur admin : DĂ©finissez API_USERNAME et API_PASSWORD pour crĂ©er le premier administrateur au dĂ©marrage. Pour renouveler les identifiants plus tard, dĂ©finissez OVERRIDE_API_CREDS=yes (ou assurez-vous que l'admin a Ă©tĂ© créé avec la mĂ©thode manual). Il n'y a qu'un seul admin ; les tentatives supplĂ©mentaires de crĂ©ation basculent vers la crĂ©ation d'un utilisateur non-admin.
  • Utilisateurs non-admin et permissions : Fournissez API_ACL_BOOTSTRAP_FILE pointant vers un fichier JSON, ou montez-le sur /var/lib/bunkerweb/api_acl_bootstrap.json. L'API le lit au dĂ©marrage pour crĂ©er/mettre Ă  jour les utilisateurs et les permissions.
  • Fichier cache ACL : Un rĂ©sumĂ© en lecture seule est Ă©crit dans /var/lib/bunkerweb/api_acl.json au dĂ©marrage pour introspection ; l'autorisation Ă©value les permissions stockĂ©es en base de donnĂ©es et intĂ©grĂ©es dans le jeton Biscuit.

Exemples de JSON de bootstrap (les deux formats sont supportés) :

{
  "users": {
    "ci": {
      "admin": false,
      "password": "M0tDeP@sseF0rt!",
      "permissions": {
        "services": {
          "*": { "service_read": true },
          "app-frontend": { "service_update": true, "service_delete": false }
        },
        "configs": {
          "app-frontend": { "config_read": true, "config_update": true }
        }
      }
    },
    "ops": {
      "admin": false,
      "password_hash": "$2b$13$...hash-bcrypt...",
      "permissions": {
        "instances": { "*": { "instances_execute": true } },
        "jobs": { "*": { "job_run": true } }
      }
    }
  }
}

Ou en format liste :

{
  "users": [
    {
      "username": "ci",
      "password": "M0tDeP@sseF0rt!",
      "permissions": [
        { "resource_type": "services", "resource_id": "*", "permission": "service_read" },
        { "resource_type": "services", "resource_id": "app-frontend", "permission": "service_update" }
      ]
    }
  ]
}

Notes :

  • Les mots de passe peuvent ĂȘtre en clair (password) ou bcrypt (password_hash / password_bcrypt). Les mots de passe en clair trop faibles sont rejetĂ©s en dehors des builds de dĂ©bogage ; si manquant, un mot de passe alĂ©atoire est gĂ©nĂ©rĂ© et un avertissement est journalisĂ©.
  • resource_id: "*" (ou null/vide) accorde la permission globalement pour ce type de ressource.
  • Les mots de passe des utilisateurs existants peuvent ĂȘtre mis Ă  jour et des permissions supplĂ©mentaires peuvent ĂȘtre appliquĂ©es via le bootstrap.

Référence des fonctionnalités

L'API est organisĂ©e par routeurs thĂ©matiques. Utilisez les sections ci-dessous comme un aperçu des capacitĂ©s ; le schĂ©ma interactif sur /docs documente en dĂ©tail les modĂšles de requĂȘte/rĂ©ponse.

CƓur et authentification

  • GET /ping, GET /health : sondes de vivacitĂ© lĂ©gĂšres pour le service API lui-mĂȘme.
  • POST /auth : Ă©changez des identifiants Basic (ou le jeton admin global) contre un jeton Biscuit. Accepte JSON, formulaire, ou les en-tĂȘtes Authorization. Les admins peuvent aussi continuer Ă  utiliser l'authentification HTTP Basic sur les routes protĂ©gĂ©es.

Plan de contrĂŽle des instances

  • GET /instances : liste les instances enregistrĂ©es, avec horodatages, mĂ©thode d'enregistrement et mĂ©tadonnĂ©es.
  • POST /instances : enregistre une nouvelle instance gĂ©rĂ©e par l'API (nom d'hĂŽte, port optionnel, nom de serveur, nom descriptif, mĂ©thode).
  • GET /instances/{hostname}, PATCH /instances/{hostname}, DELETE /instances/{hostname} : inspecte, met Ă  jour les champs modifiables, ou supprime les instances gĂ©rĂ©es par l'API.
  • DELETE /instances : suppression en masse ; ignore les instances non gĂ©rĂ©es par l'API et les signale dans skipped.
  • GET /instances/ping et GET /instances/{hostname}/ping : vĂ©rifications de santĂ© sur toutes les instances ou une seule.
  • POST /instances/reload?test=yes|no, POST /instances/{hostname}/reload : dĂ©clenche le rechargement de la configuration (le mode test effectue une validation Ă  blanc).
  • POST /instances/stop, POST /instances/{hostname}/stop : relaie les commandes d'arrĂȘt aux instances.

Configuration globale

  • GET /global_config : rĂ©cupĂšre les paramĂštres non-dĂ©faut (utilisez full=true pour la configuration complĂšte, methods=true pour inclure la provenance).
  • PATCH /global_config : crĂ©e ou met Ă  jour les paramĂštres globaux gĂ©rĂ©s par l'API (method="api") ; les erreurs de validation signalent les clĂ©s inconnues ou en lecture seule.

Cycle de vie des services

  • GET /services : Ă©numĂšre les services avec leurs mĂ©tadonnĂ©es, y compris le statut de brouillon et les horodatages.
  • GET /services/{service} : rĂ©cupĂšre les surcharges non-dĂ©faut (full=false) ou la configuration complĂšte (full=true) pour un service.
  • POST /services : crĂ©e des services, optionnellement en tant que brouillon, et initialise des variables prĂ©fixĂ©es ({service}_{KEY}). Met Ă  jour la liste SERVER_NAME de maniĂšre atomique.
  • PATCH /services/{service} : renomme les services, bascule le statut brouillon/en ligne, et met Ă  jour les variables prĂ©fixĂ©es. Ignore les modifications directes de SERVER_NAME dans variables par sĂ©curitĂ©.
  • DELETE /services/{service} : supprime un service et ses clĂ©s de configuration dĂ©rivĂ©es.
  • POST /services/{service}/convert?convert_to=online|draft : bascule rapidement entre les Ă©tats brouillon/en ligne sans modifier d'autres variables.

Extraits de configuration personnalisés

  • GET /configs : liste les fragments de configuration personnalisĂ©s (hooks HTTP/server/stream/ModSecurity/CRS) pour un service (service=global par dĂ©faut). with_data=true intĂšgre le contenu UTF-8 s'il est affichable.
  • POST /configs et POST /configs/upload : crĂ©e de nouveaux extraits depuis des donnĂ©es JSON ou des fichiers tĂ©lĂ©versĂ©s. Types acceptĂ©s : http, server_http, default_server_http, modsec, modsec_crs, stream, server_stream, et les hooks de plugins CRS. Les noms doivent correspondre Ă  ^[\w_-]{1,255}$.
  • GET /configs/{service}/{type}/{name} : rĂ©cupĂšre un extrait avec son contenu optionnel (with_data=true).
  • PATCH /configs/{service}/{type}/{name} et PATCH .../upload : met Ă  jour ou dĂ©place les extraits gĂ©rĂ©s par l'API ; les entrĂ©es gĂ©rĂ©es par modĂšle ou fichier restent en lecture seule.
  • DELETE /configs et DELETE /configs/{service}/{type}/{name} : supprime les extraits gĂ©rĂ©s par l'API tout en prĂ©servant ceux gĂ©rĂ©s par modĂšle, retournant une liste skipped pour les entrĂ©es ignorĂ©es.

Orchestration des bannissements

  • GET /bans : agrĂšge les bannissements actifs signalĂ©s par toutes les instances.
  • POST /bans ou POST /bans/ban : applique un ou plusieurs bannissements. Les donnĂ©es peuvent ĂȘtre des objets JSON, des tableaux, ou du JSON sous forme de chaĂźne. service est optionnel ; si omis, le bannissement est global.
  • POST /bans/unban ou DELETE /bans : supprime des bannissements globalement ou par service en utilisant les mĂȘmes formats de donnĂ©es flexibles.

Gestion des plugins

  • GET /plugins?type=all|external|ui|pro : liste les plugins avec leurs mĂ©tadonnĂ©es ; with_data=true inclut les octets du paquet si disponibles.
  • POST /plugins/upload : installe des plugins UI depuis des archives .zip, .tar.gz, ou .tar.xz. Les archives peuvent contenir plusieurs plugins si chacun a un plugin.json.
  • DELETE /plugins/{id} : supprime un plugin UI par son ID (^[\w.-]{4,64}$).

Cache et exécution des tùches

  • GET /cache : liste les artefacts en cache produits par les tĂąches du planificateur, filtrĂ©s par service, ID de plugin, ou nom de tĂąche. with_data=true inclut le contenu des fichiers s'il est affichable.
  • GET /cache/{service}/{plugin}/{job}/{file} : rĂ©cupĂšre un fichier de cache spĂ©cifique (download=true le tĂ©lĂ©charge en piĂšce jointe).
  • DELETE /cache ou DELETE /cache/{service}/{plugin}/{job}/{file} : supprime des fichiers de cache et notifie le planificateur des plugins affectĂ©s.
  • GET /jobs : inspecte les tĂąches connues, les mĂ©tadonnĂ©es de leur planification, et les rĂ©sumĂ©s du cache.
  • POST /jobs/run : demande l'exĂ©cution d'une tĂąche en marquant le ou les plugins associĂ©s comme modifiĂ©s.

Notes opérationnelles

  • Les points d'accĂšs en Ă©criture persistent dans la base de donnĂ©es partagĂ©e ; les instances rĂ©cupĂšrent les changements via la synchronisation du planificateur ou aprĂšs un /instances/reload.
  • Les erreurs sont normalisĂ©es en { "status": "error", "message": "..." } avec des codes de statut HTTP appropriĂ©s (422 validation, 404 non trouvĂ©, 403 ACL, 5xx erreurs en amont).

Limitation de débit

La limitation de débit par client est gérée par SlowAPI. Activez/désactivez et configurez les limites via des variables d'environnement ou /etc/bunkerweb/api.yml.

  • API_RATE_LIMIT_ENABLED (dĂ©faut : yes)
  • Limite par dĂ©faut : API_RATE_LIMIT_TIMES par API_RATE_LIMIT_SECONDS (ex. 100 par 60)
  • API_RATE_LIMIT_RULES : JSON/CSV en ligne, ou un chemin vers un fichier YAML/JSON avec des rĂšgles par route
  • Stockage : en mĂ©moire ou Redis/Valkey lorsque USE_REDIS=yes et les variables REDIS_* sont fournies (Sentinel supportĂ©)
  • En-tĂȘtes : API_RATE_LIMIT_HEADERS_ENABLED (dĂ©faut : yes)

POST /auth applique toujours sa propre limite de API_RATE_LIMIT_AUTH_TIMES par API_RATE_LIMIT_AUTH_SECONDS (par dĂ©faut 10 par 60). DĂ©finissez l’une de ces valeurs sur 0 ou ajoutez une rĂšgle /auth personnalisĂ©e pour l’ignorer ou la dĂ©sactiver. Cette rĂšgle intĂ©grĂ©e utilise le mĂȘme backend SlowAPI (mĂ©moire ou Redis/Valkey), garantissant un comportement identique sur toutes les rĂ©plicas.

Exemple de YAML (monté dans /etc/bunkerweb/api.yml) :

API_RATE_LIMIT_ENABLED: yes
API_RATE_LIMIT_DEFAULTS: ["200/minute"]
API_RATE_LIMIT_RULES:
  - path: "/auth"
    methods: "POST"
    times: 10
    seconds: 60
  - path: "/instances*"
    methods: "GET|POST"
    times: 100
    seconds: 60

Configuration

Vous pouvez configurer l'API via des variables d'environnement, des secrets Docker, et les fichiers optionnels /etc/bunkerweb/api.yml ou /etc/bunkerweb/api.env. ParamÚtres clés :

  • Docs & schĂ©ma : API_DOCS_URL, API_REDOC_URL, API_OPENAPI_URL, API_ROOT_PATH.
  • Authentification de base : API_TOKEN (jeton Bearer admin), API_USERNAME/API_PASSWORD (crĂ©er/mettre Ă  jour l'admin), OVERRIDE_API_CREDS.
  • ACL et utilisateurs : API_ACL_BOOTSTRAP_FILE (chemin JSON).
  • Politique Biscuit : API_BISCUIT_TTL_SECONDS (0/dĂ©sactivĂ© dĂ©sactive la durĂ©e de vie), CHECK_PRIVATE_IP (lie le jeton Ă  l'IP du client sauf si privĂ©e).
  • Liste blanche IP : API_WHITELIST_ENABLED, API_WHITELIST_IPS.
  • Limitation de dĂ©bit (cƓur) : API_RATE_LIMIT_ENABLED, API_RATE_LIMIT_TIMES, API_RATE_LIMIT_SECONDS, API_RATE_LIMIT_HEADERS_ENABLED.
  • Limitation de dĂ©bit (avancĂ©) : API_RATE_LIMIT_AUTH_TIMES, API_RATE_LIMIT_AUTH_SECONDS, API_RATE_LIMIT_RULES, API_RATE_LIMIT_DEFAULTS, API_RATE_LIMIT_APPLICATION_LIMITS, API_RATE_LIMIT_STRATEGY, API_RATE_LIMIT_KEY, API_RATE_LIMIT_EXEMPT_IPS, API_RATE_LIMIT_STORAGE_OPTIONS.
  • Stockage de la limitation de dĂ©bit : en mĂ©moire ou Redis/Valkey lorsque USE_REDIS=yes et les paramĂštres Redis comme REDIS_HOST, REDIS_PORT, etc., sont dĂ©finis. Voir la table des paramĂštres Redis dans docs/features.md.
  • RĂ©seau/TLS : API_LISTEN_ADDR, API_LISTEN_PORT, API_FORWARDED_ALLOW_IPS, API_SSL_ENABLED, API_SSL_CERTFILE, API_SSL_KEYFILE, API_SSL_CA_CERTS.

Comment la configuration est chargée

Priorité du plus élevé au plus bas :

  1. Variables d'environnement (ex. environment: du conteneur ou variables shell exportées)
  2. Fichiers secrets sous /run/secrets (secrets Docker/K8s ; les noms de fichiers correspondent aux noms de variables)
  3. Fichier YAML Ă  l'adresse /etc/bunkerweb/api.yml
  4. Fichier d'environnement à l'adresse /etc/bunkerweb/api.env (lignes clé=valeur)
  5. Valeurs par défaut intégrées

Notes :

  • Le YAML supporte l'inclusion de fichiers secrets avec <file:chemin/relatif>; le chemin est rĂ©solu par rapport Ă  /run/secrets.
  • Mettez les URL de la documentation Ă  off/disabled/none pour dĂ©sactiver les points d'accĂšs (ex. API_DOCS_URL=off).
  • Si API_SSL_ENABLED=yes, vous devez aussi dĂ©finir API_SSL_CERTFILE et API_SSL_KEYFILE.
  • Si Redis est activĂ© (USE_REDIS=yes), fournissez les dĂ©tails de connexion ; voir la section Redis dans docs/features.md.

Authentification et utilisateurs

  • Bootstrap admin : dĂ©finissez API_USERNAME et API_PASSWORD pour crĂ©er le premier admin. Pour rĂ©appliquer plus tard, dĂ©finissez OVERRIDE_API_CREDS=yes.
  • Non-admins et permissions : fournissez API_ACL_BOOTSTRAP_FILE avec un chemin JSON (ou montez-le sur /var/lib/bunkerweb/api_acl_bootstrap.json). Le fichier peut lister des utilisateurs et des permissions granulaires.
  • ClĂ©s Biscuit : dĂ©finissez BISCUIT_PUBLIC_KEY/BISCUIT_PRIVATE_KEY ou montez des fichiers sur /var/lib/bunkerweb/.api_biscuit_public_key et /var/lib/bunkerweb/.api_biscuit_private_key. Si rien n'est fourni, l'API gĂ©nĂšre et sauvegarde une paire de clĂ©s au dĂ©marrage.

TLS et réseau

  • Adresse/port d'Ă©coute : API_LISTEN_ADDR (dĂ©faut 0.0.0.0), API_LISTEN_PORT (dĂ©faut 8888).
  • Reverse proxies : dĂ©finissez API_FORWARDED_ALLOW_IPS avec les IPs des proxys pour que Gunicorn fasse confiance aux en-tĂȘtes X-Forwarded-*.
  • Terminaison TLS dans l'API : API_SSL_ENABLED=yes plus API_SSL_CERTFILE et API_SSL_KEYFILE ; optionnellement API_SSL_CA_CERTS.

Limitation de débit : configurations rapides

  • DĂ©sactiver globalement : API_RATE_LIMIT_ENABLED=no
  • DĂ©finir une limite globale simple : API_RATE_LIMIT_TIMES=100, API_RATE_LIMIT_SECONDS=60
  • RĂšgles par route : dĂ©finissez API_RATE_LIMIT_RULES sur un chemin de fichier JSON/YAML ou du YAML en ligne dans /etc/bunkerweb/api.yml.

!!! warning "Sécurité au démarrage" L'API se termine si aucun chemin d'authentification n'est configuré (pas de clés Biscuit, pas d'utilisateur admin, et pas de API_TOKEN). Assurez-vous qu'au moins une méthode est définie avant de démarrer.

!!! info "Chemin racine et proxys" Si vous déployez l'API derriÚre BunkerWeb sur une sous-URL, définissez API_ROOT_PATH sur ce chemin pour que /docs et les routes relatives fonctionnent correctement.

Opérations

  • SantĂ© : GET /health renvoie {"status":"ok"} lorsque le service est dĂ©marrĂ©.
  • Service Linux : une unitĂ© systemd nommĂ©e bunkerweb-api.service est fournie. Personnalisez via /etc/bunkerweb/api.env et gĂ©rez avec systemctl.
  • SĂ©curitĂ© au dĂ©marrage : l'API Ă©choue rapidement si aucun chemin d'authentification n'est disponible (pas de clĂ©s Biscuit, pas d'utilisateur admin, pas de API_TOKEN). Les erreurs sont Ă©crites dans /var/tmp/bunkerweb/api.error.