
Il y a quelques mois, je me suis lancé dans un petit projet autour de Nginx : Nginx Dashboard.
L’objectif de départ était assez simple : disposer d’une interface permettant de consulter quelques informations sur mon reverse proxy Nginx sans avoir à passer en permanence par la ligne de commande.
Comme souvent avec les projets personnels, le petit outil a progressivement grandi.
Et à force d’ajouter des fonctionnalités, Nginx Dashboard est finalement devenu quelque chose de bien différent de ce que j’avais imaginé au départ.
Aujourd’hui, je vous présente donc officiellement Nginx Control.
De Nginx Dashboard à Nginx Control
Le changement de nom n’est pas simplement cosmétique.
Au départ, Nginx Dashboard était principalement… un dashboard.
L’idée était de centraliser quelques informations autour de Nginx : statistiques, logs, certificats et quelques opérations courantes.
Mais au fil du temps, le projet s’est enrichi.
Gestion de configuration, GitOps, sauvegardes, supervision des backends, certificats Let’s Encrypt, CrowdSec, GeoIP, GoAccess, analyse des journaux, cache Nginx…
Puis sont arrivées des fonctionnalités encore plus importantes : la publication automatique de conteneurs Docker et la gestion d’hôtes Docker distants.
À ce stade, le terme Dashboard commençait à être un peu réducteur.
Nginx Control correspond beaucoup mieux à ce que le projet est devenu : une interface permettant non seulement de voir ce qui se passe sur Nginx, mais également de contrôler, superviser, analyser et automatiser une partie de son fonctionnement.
Pourquoi avoir développé cet outil ?
La réponse est finalement assez simple : j’en avais besoin.
Nginx est un excellent reverse proxy, mais lorsqu’on commence à avoir plusieurs Virtual Hosts, plusieurs certificats, des configurations réparties dans différents fichiers, des applications Docker, des logs à analyser et plusieurs environnements, la gestion devient rapidement plus complexe.
Et surtout, je voulais conserver quelque chose d’important :
La configuration doit rester de la configuration Nginx.
Je ne voulais pas créer une nouvelle abstraction qui obligerait à apprendre une nouvelle manière de configurer Nginx.
Les fichiers restent donc des fichiers Nginx classiques :
conf.d/
sites/
snippets/
streams/
On peut les modifier avec un éditeur de texte, les versionner avec Git, les déployer avec un pipeline…
Ou utiliser Nginx Control.
C’est cette approche qui est au cœur du projet.
Un projet né de mon infrastructure
Nginx Control n’a pas été pensé comme un produit théorique.
Il a été développé pour répondre à des besoins rencontrés sur mes propres infrastructures.
C’est également pour cette raison que le projet s’est progressivement connecté à d’autres briques que j’utilise régulièrement :
- Docker ;
- Git ;
- CrowdSec ;
- Certbot ;
- GeoIP ;
- GoAccess ;
- Nginx Analyzer ;
- monitoring des backends ;
- logs Nginx ;
- gestion du cache.
L’objectif n’est pas de remplacer ces outils.
Au contraire, Nginx Control cherche plutôt à les rassembler autour de Nginx.
GitOps au cœur du projet
Une des fonctionnalités qui me tient particulièrement à cœur est la gestion de la configuration avec Git.
Nginx Control peut utiliser un dépôt Git comme source de vérité pour la configuration Nginx.
Cela permet notamment de versionner :
- les Virtual Hosts ;
- les fichiers
conf.d; - les snippets ;
- les configurations
stream; - les certificats.
Mais surtout, avant de déployer une modification, Nginx Control peut tester la configuration dans un conteneur temporaire.
Si la configuration est invalide, elle n’est pas déployée.
Cette fonctionnalité fait partie des raisons pour lesquelles j’ai initialement commencé à développer Nginx Control : je voulais retrouver autour de Nginx les pratiques de gestion de configuration que l’on applique déjà à beaucoup d’autres composants d’une infrastructure.
Docker change aussi la manière de gérer Nginx
Lorsque les applications sont elles-mêmes déployées avec Docker, créer manuellement un Virtual Host Nginx pour chaque nouveau conteneur devient rapidement répétitif.
C’est pourquoi Nginx Control propose maintenant une auto-configuration basée sur les labels Docker.
Par exemple :
labels:
- "nginx-control.enable=true"
- "nginx-control.vhost.server_name=app.example.com"
- "nginx-control.vhost.location01=/"
- "nginx-control.vhost.location01.proxy_pass=http://web:80"
Nginx Control peut détecter le conteneur et générer la configuration Nginx correspondante.
On retrouve ici une approche que l’on connaît notamment avec Traefik, mais en conservant au final une véritable configuration Nginx.
Et pas uniquement sur le même serveur
Une autre évolution importante concerne les hôtes Docker distants.
Nginx Control peut maintenant fonctionner avec un agent permettant de récupérer les informations Docker d’un serveur distant et de publier ses conteneurs à travers Nginx.
Plusieurs modes sont disponibles selon l’architecture :
- connexion directe ;
- tunnel WebSocket sortant ;
- mode relay.
Le mode tunnel est notamment intéressant lorsqu’un serveur distant se trouve derrière un NAT ou qu’il n’est pas possible d’ouvrir une connexion entrante vers celui-ci.
Cette partie est encore en évolution, mais elle ouvre des possibilités intéressantes pour gérer plusieurs hôtes Docker depuis une même interface.
Nginx Control ne fait pas que publier des applications
L’une des évolutions que je trouve particulièrement intéressante est la partie analyse.
Avec Nginx Analyzer, Nginx Control peut analyser les journaux Nginx et détecter différents comportements inhabituels.
Par exemple :
- brute force ;
- scans de chemins ;
- flood provenant d’une adresse IP ;
- aspiration de contenu ;
- anomalies volumétriques ;
- anomalies de trafic par pays.
Il est également possible de créer ses propres règles.
L’idée est ici de faire le lien entre les logs Nginx, la configuration du Virtual Host et le contexte de l’application.
Et lorsque CrowdSec est présent, Nginx Control peut également interagir avec ses décisions.
On obtient donc progressivement une chaîne assez intéressante :
Nginx
│
├── Logs
│
▼
Nginx Analyzer
│
├── Détection
│
▼
Nginx Control
│
└── CrowdSec
│
└── Décision / blocage
La détection et la remédiation restent volontairement séparées.
Quelques fonctionnalités moins visibles
Il y a également toute une série de fonctionnalités qui peuvent sembler secondaires mais qui deviennent rapidement utiles au quotidien :
- consultation des logs en temps réel ;
- gestion du cache Nginx ;
- supervision des backends ;
- diagnostic d’un Virtual Host ;
- visualisation de la chaîne proxy ;
- statistiques GoAccess ;
- analyse GeoIP ;
- gestion des certificats ;
- génération de certificats Let’s Encrypt ;
- blocklists IP ;
- contrôle de Nginx ;
- sauvegardes de configuration.
Certaines sont très sérieuses.
D’autres sont un peu plus… gadget.
La carte géographique des requêtes en fait partie.
Mais après tout, afficher sur une carte d’où viennent les requêtes de son reverse proxy est totalement inutile… donc indispensable. 😄
Et maintenant ?
Le passage de Nginx Dashboard à Nginx Control marque surtout le passage d’un projet personnel à un projet que je souhaite maintenant réellement publier et faire évoluer comme un projet open source.
Le code, la documentation et les fichiers de déploiement sont progressivement séparés afin de rendre le projet plus simple à découvrir et à utiliser.
Le nouveau dépôt public de Nginx Control est disponible ici :
La documentation est disponible ici :
Et pour découvrir rapidement le projet :
Ce qui arrive ensuite 👀
Et justement, cette nouvelle version n’arrive pas seule.
Plusieurs fonctionnalités récentes sont déjà en cours d’intégration ou de finalisation.
🐳 Publication automatique des conteneurs Docker
L’auto-configuration Docker va continuer à évoluer, notamment avec les hôtes distants et l’agent.
L’objectif est de pouvoir déployer une application Docker et, avec quelques labels, disposer automatiquement de sa publication Nginx.
Sans devoir retourner modifier manuellement un Virtual Host.
🔌 Un agent Docker
L’agent permet de connecter des hôtes Docker distants à Nginx Control.
Il ouvre également la voie à de nouveaux scénarios autour de la publication distante, du monitoring et des tunnels.
🔍 Encore plus d’analyse
L’analyseur de journaux est encore jeune.
De nouvelles règles et de nouvelles possibilités d’analyse vont venir compléter cette partie.
L’idée est notamment de mieux exploiter les informations déjà présentes dans les logs Nginx au lieu de simplement les stocker.
🛡️ Une intégration encore plus poussée avec CrowdSec
CrowdSec est déjà intégré à Nginx Control pour consulter les métriques et les décisions, mais également pour permettre certaines actions.
Il y a encore plusieurs possibilités à explorer entre la détection réalisée par Nginx Control et la remédiation effectuée par CrowdSec.
Un projet qui continue à évoluer
Nginx Control est donc loin d’être terminé.
Et c’est probablement ce qui est le plus intéressant dans ce projet.
Il est parti d’un besoin très concret : avoir un dashboard pour mon Nginx.
Il est devenu un outil de gestion de configuration.
Puis un outil de supervision.
Puis un outil d’analyse.
Puis un outil d’automatisation Docker.
Et maintenant, il devient un véritable projet open source.
Je vais continuer à l’utiliser sur mes propres infrastructures, à ajouter les fonctionnalités dont j’ai besoin et, je l’espère, à récupérer également des retours d’autres administrateurs qui l’utiliseront.
Après tout, c’est souvent comme ça que naissent les outils que l’on finit par garder pendant des années.