31 KiB
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_TOKENest configuré,Authorization: Bearer <API_TOKEN>accorde un accÚs complet. - Jeton Biscuit (recommandé) : Obtenez un jeton depuis
POST /authen utilisant des identifiants Basic ou un corps de requĂȘte JSON/formulaire contenantusernameetpassword. Utilisez le jeton retournĂ© commeAuthorization: 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.readcorrespond Ă GET/HEAD/OPTIONS ;writecorrespond Ă 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_USERNAMEetAPI_PASSWORDpour créer le premier administrateur au démarrage. Pour renouveler les identifiants plus tard, définissezOVERRIDE_API_CREDS=yes(ou assurez-vous que l'admin a été créé avec la méthodemanual). 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_FILEpointant 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.jsonau 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ĂȘtesAuthorization. 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 dansskipped.GET /instances/pingetGET /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 (utilisezfull=truepour la configuration complÚte,methods=truepour 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 listeSERVER_NAMEde 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 deSERVER_NAMEdansvariablespar 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=globalpar dĂ©faut).with_data=trueintĂšgre le contenu UTF-8 s'il est affichable.POST /configsetPOST /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}etPATCH .../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 /configsetDELETE /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 listeskippedpour les entrĂ©es ignorĂ©es.
Orchestration des bannissements
GET /bans: agrĂšge les bannissements actifs signalĂ©s par toutes les instances.POST /bansouPOST /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.serviceest optionnel ; si omis, le bannissement est global.POST /bans/unbanouDELETE /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=trueinclut 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 unplugin.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=trueinclut le contenu des fichiers s'il est affichable.GET /cache/{service}/{plugin}/{job}/{file}: récupÚre un fichier de cache spécifique (download=truele télécharge en piÚce jointe).DELETE /cacheouDELETE /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_TIMESparAPI_RATE_LIMIT_SECONDS(ex.100par60) 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=yeset les variablesREDIS_*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=yeset les paramÚtres Redis commeREDIS_HOST,REDIS_PORT, etc., sont définis. Voir la table des paramÚtres Redis dansdocs/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 :
- Variables d'environnement (ex.
environment:du conteneur ou variables shell exportées) - Fichiers secrets sous
/run/secrets(secrets Docker/K8s ; les noms de fichiers correspondent aux noms de variables) - Fichier YAML Ă l'adresse
/etc/bunkerweb/api.yml - Fichier d'environnement Ă l'adresse
/etc/bunkerweb/api.env(lignesclé=valeur) - 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/nonepour désactiver les points d'accÚs (ex.API_DOCS_URL=off). - Si
API_SSL_ENABLED=yes, vous devez aussi définirAPI_SSL_CERTFILEetAPI_SSL_KEYFILE. - Si Redis est activé (
USE_REDIS=yes), fournissez les détails de connexion ; voir la section Redis dansdocs/features.md.
Authentification et utilisateurs
- Bootstrap admin : définissez
API_USERNAMEetAPI_PASSWORDpour créer le premier admin. Pour réappliquer plus tard, définissezOVERRIDE_API_CREDS=yes. - Non-admins et permissions : fournissez
API_ACL_BOOTSTRAP_FILEavec 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_KEYou montez des fichiers sur/var/lib/bunkerweb/.api_biscuit_public_keyet/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éfaut0.0.0.0),API_LISTEN_PORT(défaut8888). - Reverse proxies : définissez
API_FORWARDED_ALLOW_IPSavec les IPs des proxys pour que Gunicorn fasse confiance aux en-tĂȘtesX-Forwarded-*. - Terminaison TLS dans l'API :
API_SSL_ENABLED=yesplusAPI_SSL_CERTFILEetAPI_SSL_KEYFILE; optionnellementAPI_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_RULESsur 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 /healthrenvoie{"status":"ok"}lorsque le service est démarré. - Service Linux : une unité
systemdnomméebunkerweb-api.serviceest fournie. Personnalisez via/etc/bunkerweb/api.envet gérez avecsystemctl. - 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.