Vous venez de commander un VPS, vous y déployez vos applications, et vous pensez que tout va bien. Erreur. Sans couche de protection applicative en amont, votre serveur est exposé en permanence à des scanners automatisés, des tentatives d'injection SQL, des attaques par force brute et des bots malveillants. Chaque seconde, des milliers de requêtes hostiles parcourent Internet à la recherche de cibles vulnérables.
La bonne nouvelle ? Il existe une solution open-source, puissante et accessible même aux débutants : BunkerWeb (anciennement Bunkerity). Combiné à Docker et déployé sur un VPS Contabo bien dimensionné, il vous offre une protection de niveau professionnel pour quelques euros par mois.
Dans ce guide complet, vous allez apprendre à choisir et configurer le bon VPS Contabo, installer Docker et Docker Compose sur Debian 13, déployer BunkerWeb en conteneur et enfin prendre en main l'interface web et ses fonctionnalités de sécurité
Que vous soyez administrateur système confirmé ou passionné qui débute sur Linux, ce tutoriel est fait pour vous. Allons-y.
Pourquoi choisir le Cloud VPS 20 SSD de Contabo ?

Contabo : 20 ans d'hébergement abordable et fiable
Fondée en 2003 à Munich, Contabo s'est imposée comme l'un des hébergeurs VPS les plus populaires en Europe grâce à une philosophie simple : des ressources généreuses à des tarifs imbattables. Là où d'autres fournisseurs font payer au centime chaque gigaoctet de RAM ou de bande passante, Contabo joue la carte du volume.
Ce positionnement a convaincu une communauté large, allant des développeurs indépendants aux PME qui cherchent à optimiser leur infrastructure sans sacrifier la qualité.
L'offre Cloud VPS 20 SSD : le meilleur rapport qualité-prix du marché
Parmi toutes les offres de Contabo, le Cloud VPS 20 SSD s'impose comme le choix idéal pour héberger une stack Docker complète incluant BunkerWeb. Voici ses caractéristiques actuelles :

À titre de comparaison, une configuration équivalente chez un concurrent comme DigitalOcean ou Vultr dépasse facilement les 30 à 40 € par mois. Le Cloud VPS 20 est d'ailleurs présenté par Contabo elle-même comme son offre la plus populaire, et les benchmarks indépendants du site VPSBenchmarks lui attribuent régulièrement des distinctions "Best VPS" dans sa gamme de prix.
Pourquoi ce VPS est adapté à notre usage
Faire tourner BunkerWeb en Docker implique de lancer plusieurs conteneurs simultanément : le serveur WAF principal, le scheduler, la base de données MariaDB et l'interface web. Ce type de stack nécessite a minima 2 Go de RAM disponibles. Avec 12 Go de RAM et 6 vCPU, le Cloud VPS 20 absorbe très confortablement cette charge, tout en laissant de la marge pour vos applications métier.
Le stockage SSD de 200 Go est également amplement suffisant pour les logs, les certificats TLS, les caches et les données persistantes de vos conteneurs.
Commande et premier démarrage
La commande d'un Cloud VPS 20 chez Contabo se fait en quelques minutes sur leur site. Lors du processus de commande, sélectionnez les options suivantes :
- Système d'exploitation : Debian 13 (Trixie)
- Stockage : SSD 200 Go
- Région : Europe (Frankfurt de préférence, pour des latences minimales depuis la France)
- Accès : activez l'accès SSH avec votre clé publique
Une fois le serveur provisionné (généralement en moins de 15 minutes), vous recevez un e-mail contenant l'adresse IP publique et vos identifiants d'accès.
BunkerWeb, le WAF nouvelle génération : présentation et comparatif

Qu'est-ce que BunkerWeb ?
BunkerWeb est un pare-feu applicatif web (WAF) open-source de nouvelle génération, développé par la société française Bunkerity. Son principe est élégant : il s'intercale entre Internet et vos applications en tant que reverse proxy sécurisé, basé sur NGINX. Tout le trafic entrant passe par BunkerWeb avant d'atteindre vos services, qui se trouvent ainsi protégés "par défaut", sans configuration complexe.
Sous le capot, BunkerWeb s'appuie sur trois piliers techniques majeurs :
- NGINX comme moteur de reverse proxy hautes performances
- ModSecurity avec le jeu de règles OWASP Core Rule Set (CRS) pour la détection des attaques web
- Un système de plugins modulaire permettant d'étendre les fonctionnalités
Son modèle de licence est AGPLv3, ce qui signifie qu'il est entièrement gratuit pour un usage personnel et professionnel. Une version PRO avec des fonctionnalités avancées est également disponible pour les besoins des enterprises.
Les fonctionnalités de sécurité clés

BunkerWeb intègre nativement un arsenal complet de protections :
- Protection contre les attaques web courantes : injection SQL, XSS (Cross-Site Scripting), CSRF, inclusion de fichiers (LFI/RFI), toutes couvertes par ModSecurity et l'OWASP CRS
- Gestion des bots et scrapers : BunkerWeb peut demander aux clients suspects de résoudre un challenge (cookie challenge, challenge JavaScript, CAPTCHA via hCaptcha ou reCAPTCHA) avant d'accéder au contenu
- Réputation IP en temps réel : intégration avec des listes noires externes (blacklists) et des systèmes DNSBL (DNS-based Blocklists) pour bloquer automatiquement les adresses IP connues comme malveillantes
- Durcissement TLS : configuration automatique d'un TLS robuste, désactivation des protocoles obsolètes (TLS 1.0, 1.1), en-têtes de sécurité HTTP (HSTS, CSP, X-Frame-Options...)
- Limitation de débit (rate limiting) : protection contre les attaques par force brute et les abus d'API.
- Bannissement automatique : détection et blocage des comportements anormaux basés sur les codes de statut HTTP.
- Certificats SSL/TLS automatiques : intégration native avec Let's Encrypt pour générer et renouveler vos certificats sans intervention manuelle.
- Mode multisite : un seul déploiement BunkerWeb peut protéger plusieurs applications web avec des configurations de sécurité distinctes par domaine.
BunkerWeb vs Traefik : le comparatif honnête
Traefik est souvent mentionné dans le même contexte que BunkerWeb, car les deux s'utilisent comme reverse proxy dans un environnement Docker. Cependant, leurs philosophies sont radicalement différentes.

Le verdict : si votre priorité est la sécurité applicative, BunkerWeb est le meilleur choix sans aucune contestation. Traefik excelle dans l'orchestration de services dynamiques et la facilité de mise en route, mais il ne peut pas rivaliser avec le niveau de protection offert par BunkerWeb nativement. Pour une infrastructure exposée sur Internet, BunkerWeb n'est pas un luxe : c'est une nécessité.
Déclaration de votre domaine
Si vous souhaitez accéder à BunkerWeb, vous devrez avoir un nom de domaine chez un hébergeur. Pour ma part j’utilise OVH. J’ai donc créé un enregistrement de type A auquel j’ai affecté l’adresse IP statique de mon VPS de chez Contabo.

Installation de Docker et Docker Compose sur Debian 13
Étape 1 — Mise à jour du système
Avant toute installation, mettez à jour les paquets de votre système Debian 13 :
apt update && apt upgrade -y

Installez également quelques dépendances utiles pour la suite :
apt install -y ca-certificates curl gnupg lsb-release wget sudo ufw
Étape 2 — Ajout du dépôt officiel Docker
Debian 13 "Trixie" ne propose pas Docker dans ses dépôts officiels. Il faut donc ajouter le dépôt officiel de Docker Engine.
Ajout de la clé GPG de Docker :
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc
chmod a+r /etc/apt/keyrings/docker.asc
Ajout du dépôt Docker dans les sources APT :
echo
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc]
https://download.docker.com/linux/debian
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" |
tee /etc/apt/sources.list.d/docker.list > /dev/null
Étape 3 — Installation de Docker Engine
Mettez à jour l'index des paquets pour prendre en compte le nouveau dépôt, puis installez Docker et ses composants :
apt update
apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

Étape 4 — Vérification de l'installation Docker
Vérifiez que Docker est correctement installé et démarré :
systemctl status docker
Vous devriez voir active (running) en vert, comme ci-dessous:

Étape 5 — Installation de Docker Compose (plugin v2)
Depuis Docker Engine 23.x, Docker Compose V2 est inclus directement en tant que plugin. Vérifiez qu'il est bien présent :
docker compose version
La commande doit retourner quelque chose comme Docker Compose version v5.x.x. Si ce n'est pas le cas (le jour du tutoriel), installez-le manuellement avec la commande ci-dessous :

apt install -y docker-compose-plugin
Étape 6 — Activation au démarrage et gestion des permissions
Activez Docker pour qu'il démarre automatiquement au démarrage du serveur :
systemctl enable docker

Si vous souhaitez utiliser Docker avec un utilisateur non-root (recommandé pour la sécurité), ajoutez cet utilisateur au groupe docker :
usermod -aG docker votre_utilisateur
Déconnectez-vous et reconnectez-vous pour que ce changement prenne effet.
Déploiement de BunkerWeb en Docker
Architecture du déploiement
Notre stack BunkerWeb en Docker Compose se compose de quatre services :
- bunkerweb : le conteneur principal NGINX + WAF qui reçoit le trafic web
- bw-scheduler : le "cerveau" de BunkerWeb, responsable de la gestion de la configuration et des tâches planifiées
- bw-ui : l'interface web d'administration
- bw-db : la base de données MariaDB qui stocke la configuration et les logs
Ces services communiquent via des réseaux Docker isolés pour garantir une segmentation de sécurité maximale.
Création du répertoire de travail
mkdir -p /opt/containers/bunkerweb
cd /opt/containers/bunkerweb
Création du fichier docker-compose.yml
Créez le fichier de composition Docker :
nano compose.yaml
Vous retrouverez l’intégralité de mon fichier compose.yaml sur mon compte Github (docker-compose Bunkerweb). Pour éviter de surcharger inutilement cet article, je n’ai pas mis le contenu du fichier compose, de plus il est assez long. Tout est détaillé sur le compte GitHub.
Attention!!! Avant d’utiliser le compose ci-dessus, vous devez vérifier plusieurs choses :
Vérification #1: Droits sur le répertoire ./data, appliquer les droits ci-dessous
sudo chown -R 101:101 ./bw-data
sudo chmod -R 755 ./bw-data
Vérification #2: Trois réseaux sont nécessaires pour sécuriser l’infrastructure de BunkerWeb :
- net-bw-frontal : Réseau frontal (reverse-proxy, scheduler, UI, etc.)
- net-bw-db: Réseau backend (UI & scheduler <-> PostgreSQL). Non exposé au proxy.
- net-bw-apps: Réseau pour connecter vos applications backend à BunkerWeb. Ce réseau doit être créé manuellement avec cette commande:
docker network create net-bw-apps

Vous pouvez lister les réseaux docker avec cette commande :
docker network ls
Vérification #3: Si votre mot de passe contient un @. Ce caractère est réservé dans le fichier compose, vous devez le remplacer par ceci %40.
Pourquoi les réseaux net-bw-apps et net-bw-db n'ont pas de subnet défini ?
Quand vous ne définissez pas de ipam sur un réseau Docker, Docker attribue automatiquement une plage IP depuis son pool par défaut, généralement dans les plages 172.16.0.0/12 ou 192.168.0.0/16. C'est tout à fait fonctionnel.
La raison pour laquelle net-bw-frontal a un subnet explicitement défini (10.20.30.0/24) est purement fonctionnelle et non un caprice de configuration.
Afin de sécuriser l’installation (API_WHITELIST_IP: "127.0.0.0/8 10.20.30.0/24"), BunkerWeb a besoin de savoir à l'avance depuis quelle plage IP le scheduler va appeler son API interne. Si le subnet de net-bw-frontal était aléatoire, cette whitelist serait impossible à écrire de manière fiable. C'est donc un choix délibéré : on fixe le subnet pour pouvoir le référencer dans la whitelist.
net-bw-apps et net-bw-db n'ont pas cette contrainte car personne n'a besoin de connaître leur plage IP à l'avance, Docker peut donc les gérer librement.
La règle de base : à qui appartient le réseau ?
La question à se poser pour chaque réseau est : qui est responsable de son cycle de vie ? La commande external: true signifie que vous prenez la responsabilité de créer et de gérer ce réseau manuellement, en dehors de tout Compose. C'est un choix justifié uniquement quand le réseau doit être partagé entre plusieurs stacks indépendantes.
Pourquoi net-bw-frontal et net-bw-db ne sont PAS externes
Ces deux réseaux sont exclusivement privés à la stack BunkerWeb. Aucun conteneur extérieur n'a besoin de s'y connecter :
- net-bw-frontal : uniquement BunkerWeb, le scheduler et l'UI
- net-bw-db : uniquement le scheduler, l'UI et la base de données
Les laisser gérés par Compose présente plusieurs avantages concrets :
- La stack est autonome et portable. Un simple docker compose up sur un nouveau serveur crée tout le nécessaire sans étape préalable. Pas de risque d'oublier de créer un réseau manuellement.
- Le cycle de vie est cohérent. Ces réseaux n'ont aucune raison d'exister sans la stack BunkerWeb. Quand vous faites docker compose down, ils sont supprimés proprement avec le reste. Ce comportement est logique et évite d'accumuler des réseaux orphelins sur l'hôte.
- Pas de risque de collision. Puisque Compose les gère, il vérifie lui-même qu'ils n'entrent pas en conflit avec d'autres réseaux existants.
Voici une vue graphique de notre Stack BunkerWeb pour faciliter votre compréhension. C’est toujours plus facile avec un schéma :

Points de vérifications
Avant de pouvoir vous connectez à l’interface web de BunkerWeb, vous pouvez vérifier si tout est opérationnel :
Vous pouvez vérifier si vos containers tournent correctement, avec la commande suivante:
docker ps --format "table {{.Names}}\t{{.Image}}\t{{.Status}}\t{{.Ports}}"

Une fois votre container lancé, je vous conseille de regarder les logs avec la commande pour vérifier qu’il n’y a pas de message d’erreur :
docker compose logs -f

Premiers pas avec l'interface web d'administration
Si vous avez respecter les consignes ci-dessus, vous devriez arriver sur cette page de configuration UI de BunkerWeb.

Dans un premier temps, renseignez les informations du compte administrateur. Ce compte servira d'identifiant pour accéder à l'interface d'administration web de BunkerWeb.
Configurez ensuite les paramètres d'accès à cette interface. Le champ Server Name correspond au nom de domaine ou à l'adresse utilisée pour accéder à l'interface d'administration. En revanche, il est impératif de ne pas modifier les champs UI Host et UI URL, car ils correspondent aux adresses internes utilisées par BunkerWeb pour assurer le fonctionnement du reverse proxy.

En ce qui concerne le certificat TLS, vous pouvez utiliser un certificat SSL personnalisé. Dans ce guide, nous opterons toutefois pour Let's Encrypt, qui permet d'obtenir et de renouveler automatiquement des certificats SSL gratuits. Il suffit donc de cocher l'option Auto Let's Encrypt.
Si votre domaine est géré par un fournisseur DNS compatible avec Certbot, vous avez également la possibilité de générer un certificat Wildcard. Pour cela, cochez l'option correspondante, définissez le Challenge Type sur dns, puis renseignez les clés API requises par votre fournisseur DNS.
BunkerWeb prend en charge un grand nombre de fournisseurs DNS. Vous pouvez vérifier si le vôtre est compatible en consultant la documentation officielle. Ensuite suivez les étapes pour valider la configuration. Nous allons maintenant pouvoir mettre les mains dans le cambouis.
Configuration et prise en main de BunkerWeb

Vous accédez maintenant à l'interface de BunkerWeb. La page d'accueil affiche les statistiques clés de votre instance. La barre latérale organise les fonctionnalités disponibles :
- Accueil
- Instances : utile pour les clusters uniquement
- Paramètres Globaux: configuration générale commune à tous les services
- Services : configuration individuelle des VirtualHosts
- Configurations : paramètres NGINX avancés
- Plugins : modules supplémentaires
- Cache : fichiers mis en cache
- Rapports : alertes et blocages
- Bannissements : bannissements
- Tâches : tâches planifiées
- Logs : fichiers de journalisation
Pour cette configuration initiale, concentrez-vous sur les paramètres globaux, qui regroupent les paramètres essentiels. Accédez-y depuis la barre latérale.
Commencez par les paramètres globaux, où vous trouverez les paramètres fondamentaux à ajuster. En voici quelques uns que je vous conseille d’ajuster :
Général


- LISTEN_STREAM : false – désactive la fonctionnalité Stream de NGINX (permettant de forward les ports).
- USE_TCP : false
- USE_UDP : false
Brotli

- USE_BROTLI : true – active la compression Brotli pour des transferts encore plus légers (vous pouvez ensuite affiner le niveau et les types MIME).
Client Cache

- USE_CLIENT_CACHE : true – autorise le cache côté navigateur, soulageant ainsi votre serveur.
Gzip

- USE_GZIP : true – active la compression Gzip, largement reconnue ; ajustez ensuite les paramètres selon vos besoins.
Let's Encrypt

- AUTO_LETS_ENCRYPT : true – préremplit les champs Let's Encrypt lors de la création d'un service.
- EMAIL_LETS_ENCRYPT : mail@votredomaine.tld
Vous pouvez remplir les autres options, comme le type de challenge, et vos credentials, pour automatiser les certificats sur l'ensemble des services avec le même type de challenge.
ModSecurity

- USE_MODSECURITY_GLOBAL_CRS : true – Active le chargement global des règles de protection OWASP Core Rule Set (CRS) pour l'ensemble de vos services, ce qui est fortement recommandé dès lors que vous hébergez plusieurs applications (mode multisite) pour éviter d'avoir à les configurer individuellement. Le OWASP Core Rule Set (CRS) est un ensemble standardisé de règles de détection d'attaques génériques (injections SQL, XSS, etc.) conçu pour être intégré à un pare-feu applicatif web (WAF) afin de bloquer les menaces courantes visant les applications web.
Miscellaneous

- Disable default server : true – Vous permet d'automatiquement refuser les connexions pour des services qui n'existe pas, et les connexions sur l'adresse IP en brut.
Reverse Proxy

- REVERSE_PROXY_INTERCEPT_ERRORS : false – Permet d'afficher l'erreur native du service (peut-être utile avec certains services comme Guacamole).
SSL

- REDIRECT_HTTP_TO_HTTPS : true – force la redirection vers HTTPS.
FAQ
Q: Qu'est-ce que BunkerWeb exactement et comment fonctionne-t-il ?
BunkerWeb est un pare-feu applicatif web (WAF) open-source qui s'intercale entre Internet et vos applications comme reverse proxy sécurisé basé sur NGINX. Tout le trafic entrant passe par BunkerWeb avant d'atteindre vos services, les protégeant ainsi "par défaut" contre les injections SQL, XSS, les bots malveillants et autres attaques courantes, sans configuration complexe.
Quel est le rapport qualité-prix du Cloud VPS 20 SSD de Contabo comparé à la concurrence ?
Le Cloud VPS 20 offre 12 Go de RAM, 6 vCPU et 200 Go de SSD pour environ 12 € par mois, ce qui représente le meilleur rapport qualité-prix du marché. Une configuration équivalente chez DigitalOcean ou Vultr coûte facilement 30 à 40 € par mois. Ces ressources suffisent confortablement pour héberger BunkerWeb et plusieurs applications métier en parallèle.
Pourquoi BunkerWeb est-il préférable à Traefik pour sécuriser une infrastructure web ?
Traefik excelle dans l'orchestration dynamique de services et la facilité de mise en route, mais il n'intègre pas nativement les protections applicatives avancées de BunkerWeb. BunkerWeb offre ModSecurity avec l'OWASP CRS, gestion des bots, réputation IP en temps réel, limitation de débit et certificats Let's Encrypt automatiques. Pour une infrastructure exposée sur Internet, BunkerWeb n'est pas un luxe : c'est une nécessité.
Comment fonctionne l'intégration de Let's Encrypt avec BunkerWeb en mode multisite ?
BunkerWeb propose deux modes d'intégration Let's Encrypt : global (pour tous les services) ou par service. Le challenge DNS permet de générer des certificats Wildcard automatiquement si votre fournisseur DNS est compatible (OVH, Cloudflare, etc.). Dans certains cas, il est recommandé de désactiver l'extension globale et de gérer les certificats individuellement par service pour éviter les conflits de configuration.
Pourquoi la segmentation des réseaux Docker (net-bw-frontal, net-bw-db, net-bw-apps) est-elle importante ?
Cette segmentation applique le principe du moindre privilège : chaque service n'accède qu'aux ressources nécessaires. net-bw-frontal reçoit le trafic Internet, net-bw-db communique uniquement entre l'UI, le scheduler et la base de données (sans exposition au proxy), et net-bw-apps permet vos applications métier de se connecter à BunkerWeb. Cette architecture réduit drastiquement la surface d'attaque en cas de compromission d'un conteneur.
Quelles configurations ModSecurity dois-je activer en priorité ?
Activez au minimum USE_MODSECURITY_GLOBAL_CRS : true pour charger globalement l'OWASP Core Rule Set (ensemble standardisé de règles détectant injections SQL, XSS et attaques courantes). Cette seule configuration offre une protection robuste pour toutes vos applications sans configuration individuelle. Complétez ensuite avec DISABLE_DEFAULT_SERVER : true pour refuser les connexions sur des services inexistants ou l'adresse IP brute, et REDIRECT_HTTP_TO_HTTPS : true pour forcer le chiffrement.
Source: https://github.com/networkpulse/docker-compose-bunkerweb