
Une seule image Docker pour surveiller vos conteneurs, vos endpoints HTTP, vos certificats TLS et vos tâches planifiées : c’est la promesse de Maintenant, un outil de supervision open source, auto-hébergé, qui rassemble en une interface ce qui nécessiterait habituellement trois ou quatre applications distinctes.
Si vous administrez un serveur Docker, vous connaissez probablement le rituel : Uptime Kuma pour les sondes HTTP et la vérification des certificats TLS, Portainer et Dozzle pour garder un œil sur les conteneurs et leurs logs. Chacun de ces outils fonctionne bien, mais cela implique de multiplier les briques et donc d’avoir plus de conteneurs à maintenir, et surtout, c’est synonyme de plusieurs interfaces à consulter.
De son côté, Maintenant propose une autre approche. Que vous gériez un homelab, un VPS en production hébergeant quelques services web, ou une petite flotte de serveurs Docker chez un client, l’objectif est le même : disposer d’une vue unifiée sur l’état de votre infrastructure sans empiler les outils.
Dans cet article, je vous propose justement de découvrir Maintenant. Par la suite, nous verrons comment l’installer avec Docker Compose dans une version simple puis derrière un reverse proxy Traefik, et ce sera l’occasion de faire un tour d’horizon de ses principales fonctionnalités.
Qu’est-ce que Maintenant, cette solution de supervision open source ?
Maintenant est un outil de supervision conçu pour les environnements Docker et Kubernetes. Il est développé par Benjamin Touchard (alias kOlapsis), un développeur indépendant basé à Bordeaux. Ce projet open source est distribué sous licence libre AGPL-3.0, et se décline en deux versions : une version gratuite (avec des limites) et une édition Pro payante avec des fonctionnalités avancées (facturée 29 € par mois ou 290 € par an).
Sur le plan technique, l’application est écrite en Go et elle s’appuie sur une base SQLite pour la persistance des données. Il faut comprendre qu’il n’y a pas de dépendance : pas de Redis, pas de PostgreSQL, pas de file de messages à déployer à côté. Maintenant tient en un seul conteneur.
De plus, c’est un projet léger et peu gourmand en ressources. J’ai pu constater qu’il consommait moins de 30 Mo de RAM sur ma machine.
Il faut savoir également que Maintenant applique le principe de la supervision en lecture seule. Il observe et surveille vos conteneurs et vos sondes HTTP, mais ne les pilote pas : il ne les redémarre pas, ne les supprime pas et ne modifie pas votre stack. Il n’effectue pas les mises à jour des images Docker non plus, mais il vous guide pour le faire. C’est une différence importante avec un outil comme Portainer ou Dockhand, qui sert avant tout à administrer Docker. Ici, on reste sur de l’observabilité.
Voici deux liens utiles vers Maintenant :
Les fonctionnalités de Maintenant
Avant de passer à l’installation, faisons le tour des briques principales que vous retrouverez dans l’interface.
Découverte automatique des conteneurs : Docker comme Kubernetes sont pris en charge. Dès qu’un conteneur démarre, il est suivi (état, health checks, boucles de redémarrage, logs). Les projets Docker Compose sont regroupés automatiquement.
Sondes HTTP / TCP : vous définissez des points de contrôle qui mesurent le temps de réponse, le code de statut et la disponibilité dans le temps. La configuration se fait via le Web ou via des labels Docker.
Heartbeats et tâches cron : chaque moniteur dispose d’une URL de ping unique. Vous ajoutez un appel curl à votre tâche planifiée, et Maintenant vous alerte si le job ne s’exécute pas dans le délai attendu. Autrement dit, ce sont vos tâches qui contactent Maintenant pour montrer un signe de vie.
Certificats SSL/TLS : détection automatique sur vos endpoints HTTPS, avec des alertes d’expiration à 30, 14, 7, 3 et 1 jour, et une validation de la chaîne complète.
Métriques système : CPU, mémoire, entrées/sorties réseau et disque, par conteneur, avec des graphiques temps réel et des seuils d’alerte configurables.
Détection des mises à jour : Maintenant compare les empreintes (digests) des images via les registres OCI pour signaler les mises à jour disponibles.
Moteur d’alertes : webhook et Discord sont inclus dans l’édition Community, tandis que Slack, Teams et e-mail relèvent de l’édition Pro.
Page de statut publique : une page temps réel pour informer vos utilisateurs de l’état de vos services (comme avec Uptime Kuma).
API REST et serveur MCP : une API complète sous /api/v1/ ainsi qu’un serveur MCP pour interroger votre instance Maintenant depuis un assistant IA compatible.
L’édition Community impose quelques limites : 10 endpoints, 5 heartbeats, 5 certificats et une page de statut à 3 composants. Pour un Homelab ou une très petite infrastructure, ces quotas peuvent s’avérer suffisants. De son côté, l’édition Pro lève ces plafonds et ajoute des canaux d’alerte supplémentaires, l’escalade des incidents, les fenêtres de maintenance et l’enrichissement CVE.
Les prérequis de Maintenant
Pour suivre ce tutoriel, vous aurez besoin d’un hôte disposant de :
Docker Engine 20.10 ou supérieur et Docker Compose. Les architectures amd64 et arm64 sont prises en charge.
D’un accès au socket Docker (/var/run/docker.sock), que nous monterons en lecture seule.
D’un compte utilisateur appartenant au groupe docker, ou des droits suffisants pour exécuter les commandes Docker.
Une machine sous Linux fera l’affaire, tout comme un Raspberry Pi (le projet est vraiment léger) ou encore une machine macOS ou Windows avec Docker. Si besoin, retrouvez mon tutoriel d’installation de Docker sur Linux.
En complément, vous devez aussi repérer sur votre machine quel est l’identifiant du groupe Docker (GID). En effet, il sera nécessaire de l’indiquer dans le fichier Docker Compose par la suite. Cela s’explique pour des raisons de sécurité, le conteneur Maintenant ne tourne pas en root mais sous l’utilisateur nobody (uid 65534). Or le socket Docker appartient à root:docker. Sans appartenance au bon groupe, le noyau refuse l’accès au socket, même monté en lecture seule.
À présent, nous allons donc récupérer ce GID sur l’hôte avant de lancer le conteneur.
Exécutez la commande suivante sur l’hôte :
getent group docker | cut -d: -f3
Pour ma part, l’ID est 990. Notez le nombre retourné : il s’agit du GID du groupe docker sur votre machine.
Installation de Maintenant avec Docker Compose
Pour débuter, nous allons commencer par la version simple, directement inspirée de celle proposée sur le dépôt GitHub du projet. Cette configuration expose Maintenant sur le port 8080 de l’hôte et applique d’emblée plusieurs bonnes pratiques de sécurité.
Avant de configurer le Docker Compose, préparons l’architecture au niveau de l’espace de stockage. Si vous me suivez, vous savez que j’ai l’habitude de stocker mes projets sous /opt/docker-compose/.
Sans plus attendre, créez un répertoire de travail dédié à cet outil, puis placez-vous dedans :
cd /opt/docker-compose/
mkdir -p maintenant && cd maintenant
Notre futur fichier Docker Compose utilisera un bind mount (./maintenant-data:/data), ce qui place la base SQLite directement sur l’hôte (dans le répertoire de notre choix). Comme le conteneur s’exécute sous l’utilisateur nobody (uid/gid 65534), ce dossier doit lui appartenir, sans quoi l’application ne pourra pas créer sa base au démarrage (vous rencontrerez une erreur d’ouverture de la base de données).
Créez-le sous /opt/docker-compose/maintenant et ajustez son propriétaire :
mkdir -p maintenant-data
sudo chown -R 65534:65534 maintenant-data
Créez ensuite un fichier .env dans le répertoire maintenant pour y stocker le GID du groupe Docker récupéré précédemment. Cela permet à Docker Compose de l’injecter et évite d’avoir à modifier le fichier Docker Compose lui-même :
DOCKER_GID=990
Ensuite, à la racine du répertoire de ce projet, créez à présent le fichier docker-compose.yml avec le contenu suivant :
services:
maintenant:
image: ghcr.io/kolapsis/maintenant:latest
ports:
– “8080:8080”
read_only: true
security_opt:
– no-new-privileges:true
group_add:
– “${DOCKER_GID:-983}”
tmpfs:
– /tmp:noexec,nosuid,size=64m
volumes:
– /var/run/docker.sock:/var/run/docker.sock:ro
– /proc:/host/proc:ro
– maintenant-data:/data
environment:
MAINTENANT_ADDR: “0.0.0.0:8080”
MAINTENANT_DB: “/data/maintenant.db”
restart: unless-stopped
Pour vous aider à comprendre ce que l’on fait, prenons le temps de détailler certaines options :
read_only: true monte le système de fichiers du conteneur en lecture seule, ce qui réduit la surface d’attaque.
security_opt: no-new-privileges:true empêche le processus d’acquérir de nouveaux privilèges à l’exécution.
group_add injecte le GID du groupe Docker récupéré plus haut. La valeur 983 n’est qu’un repli au cas où la variable ne serait pas définie : la bonne valeur est celle de votre .env.
tmpfs fournit un /tmp temporaire en mémoire, monté sans exécution ni setuid, puisque le reste du système de fichiers est en lecture seule.
Le montage de /var/run/docker.sock en lecture seule (:ro) permet la découverte des conteneurs sans autoriser d’action sur eux.
Le montage de /proc (/host/proc) en lecture seule donne accès aux métriques système de l’hôte.
Le volume nommé maintenant-data assure la persistance des données (base SQLite).
Quand tout est prêt, enregistrez le fichier Docker Compose et préparez-vous à faire décoller le conteneur !
Note : Maintenant se connecte automatiquement au moteur Docker local via le lien effectué sur le socket. Pour étendre le monitoring à plusieurs hôtes, il est nécessaire de déployer un agent, mais c’est une capacité réservée à l’offre Pro.
Lancez cette commande :
docker compose up -d
Vérifiez que le conteneur est bien démarré :
docker compose ps
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
maintenant-app ghcr.io/kolapsis/maintenant:latest “/docker-entrypoint.…” maintenant 8 hours ago Up 8 hours (healthy) 8080/tcp
Vous pouvez aussi suivre les logs au démarrage pour vous assurer qu’aucune erreur n’apparaît, notamment concernant l’accès au socket Docker :
docker compose logs -f maintenant
Une fois le conteneur en route, ouvrez votre navigateur à l’adresse http://:8080. L’interface s’affiche, et vos conteneurs déjà en cours d’exécution devraient apparaître automatiquement, sans aucune configuration supplémentaire. C’est normal, c’est le mécanisme de découverte automatique de Maintenant qui est entré en action.
Gérer la télémétrie
Par défaut, Maintenant envoie une fois par heure des informations sur votre usage de la solution, de façon anonyme (édition utilisée, nombre de conteneurs, d’endpoints, etc.). Cette opération ne transmet pas de noms d’hôtes, d’adresses IP, de noms de conteneurs ou d’URL. Cette télémétrie est en opt-out : si vous souhaitez la désactiver, ajoutez la variable d’environnement MAINTENANT_DISABLE_TELEMETRY dans la section environment de votre fichier Docker Compose, puis relancez le conteneur :
environment:
MAINTENANT_ADDR: “0.0.0.0:8080”
MAINTENANT_DB: “/data/maintenant.db”
MAINTENANT_DISABLE_TELEMETRY: “1”
Installation de Maintenant derrière Traefik
En revanche, la version simple expose Maintenant directement sur le port 8080, ce qui convient pour un test ou un réseau interne. En production, on préférera placer l’application derrière un reverse proxy comme Traefik, afin de gérer le nom de domaine, le certificat TLS et la couche d’authentification. En effet, l’interface de Maintenant n’est pas protégée par une page d’authentification : il convient de gérer cela via une solution externe (TinyAuth, Authelia, Authentik…).
Je pense sincèrement que c’est volontaire qu’il n’y ait aucun système d’authentification. Ce qu’il faut savoir, et cela va dicter la suite de la configuration, c’est que :
Le tableau de bord et les routes /api/v1/* ne doivent jamais être exposés sans protection.
Deux familles de routes doivent rester publiques pour que l’outil fonctionne : /ping/ (réception des heartbeats) et /status/ (page de statut).
Ainsi, notre configuration Traefik devra donc gérer ces deux cas. Dans cet exemple, l’instance sera accessible à l’adresse https://maintenant.it-connectlab.fr.
Avant de commencer, créez l’arborescence de dossiers avec les bonnes permissions telle que spécifiée pour la première méthode d’installation.
Prérequis côté Traefik
Je n’aborderai pas ici l’installation et la configuration de Traefik. Ceci a été abordé dans mon guide d’installation de Traefik. Pour contextualiser, voici des informations sur ma configuration :
Un entrypoint HTTPS nommé websecure (port 443),
Un résolveur de certificats configuré : dans notre exemple, il s’agit d’un résolveur OVHcloud (challenge DNS) nommé ovhcloud, mais n’importe quel autre résolveur, comme Let’s Encrypt, convient tout aussi bien,
Le provider Docker activé, et un réseau Docker externe partagé entre Traefik et les services qu’il dessert. Il est nommé ici frontend,
Les middlewares de protection et d’authentification que vous souhaitez appliquer. Dans cet exemple, nous combinons CrowdSec avec Traefik (déclaré en tant que crowdsec@file) pour la protection contre les attaques et TinyAuth pour l’authentification, mais ces briques restent interchangeables.
Adaptez les noms websecure, ovhcloud, frontend ainsi que les middlewares à votre propre configuration.
Le fichier .env
Pour une configuration de production, on déporte les paramètres dans un fichier .env placé à côté du docker-compose.yml. Si vous avez suivi la première partie de ce tutoriel, vous l’avez déjà ! Sinon, il convient de le créer. Cela évite de modifier le fichier Docker Compose à chaque ajustement et regroupe au même endroit les valeurs propres à votre environnement :
# GID du groupe docker de l’hôte
DOCKER_GID=990
# Adresse publique de l’instance.
# Utilisée pour les URL de ping des heartbeats et les liens de la page de statut.
MAINTENANT_BASE_URL=https://maintenant.it-connectlab.fr
# Nom de l’organisation affiché sur la page de statut publique
MAINTENANT_ORGANISATION_NAME=IT-Connect Lab
# Désactivation de la télémétrie
MAINTENANT_DISABLE_TELEMETRY=1
Quelques remarques sur ces variables :
MAINTENANT_BASE_URL mérite une attention particulière. C’est elle qui détermine les URL de ping communiquées pour les heartbeats et les liens de la page de statut. Si elle ne correspond pas à l’URL réellement utilisée, vos tâches cron pointeront vers une mauvaise adresse. On la renseigne donc avec l’URL HTTPS publique.
MAINTENANT_ORGANISATION_NAME personnalise simplement l’en-tête de la page de statut publique.
On laisse volontairement MAINTENANT_CORS_ORIGINS non défini : en production, on conserve la politique par défaut (même origine) plutôt que d’autoriser un caractère générique *.
Si vous disposez d’une licence Pro et souhaitez utiliser les notifications par e-mail, vous ajouterez ici les variables MAINTENANT_SMTP_HOST, MAINTENANT_SMTP_PORT, MAINTENANT_SMTP_USERNAME, MAINTENANT_SMTP_PASSWORD et MAINTENANT_SMTP_FROM, ainsi que MAINTENANT_LICENSE_KEY pour activer votre licence Pro.
Le fichier docker-compose.yml
Voici le fichier Docker Compose complet utilisé pour ce déploiement derrière Traefik. Sa particularité, c’est qu’il contient les labels Traefik, dont la chaîne de middlewares crowdsec@file,tinyauth appliquée au routeur principal :
services:
maintenant:
image: ghcr.io/kolapsis/maintenant:latest
container_name: maintenant-app
read_only: true
security_opt:
– no-new-privileges:true
group_add:
– “${DOCKER_GID:-983}”
tmpfs:
– /tmp:noexec,nosuid,size=64m
volumes:
– /var/run/docker.sock:/var/run/docker.sock:ro
– /proc:/host/proc:ro
– ./maintenant-data:/data
environment:
MAINTENANT_ADDR: “0.0.0.0:8080”
MAINTENANT_DB: “/data/maintenant.db”
MAINTENANT_BASE_URL: “${MAINTENANT_BASE_URL}”
MAINTENANT_ORGANISATION_NAME: “${MAINTENANT_ORGANISATION_NAME}”
MAINTENANT_DISABLE_TELEMETRY: “${MAINTENANT_DISABLE_TELEMETRY:-}”
restart: unless-stopped
networks:
– frontend
labels:
– traefik.enable=true
– traefik.docker.network=frontend
# Routeur principal (tableau de bord + API) avec authentification
– traefik.http.routers.maintenant-https.rule=Host(`maintenant.it-connectlab.fr`)
– traefik.http.routers.maintenant-https.entrypoints=websecure
– traefik.http.routers.maintenant-https.tls=true
– traefik.http.routers.maintenant-https.tls.certresolver=ovhcloud
– traefik.http.services.maintenant-https.loadbalancer.server.port=8080
– traefik.http.routers.maintenant-https.middlewares=crowdsec@file,tinyauth
– tinyauth.apps.maintenant.config.domain=maintenant.it-connectlab.fr
– tinyauth.apps.maintenant.users.allow=mon-utilisateur
# Routeur public (ping/status) sans authentification
– traefik.http.routers.maintenant-public.rule=Host(`maintenant.it-connectlab.fr`) && (PathPrefix(`/ping/`) || PathPrefix(`/status/`))
– traefik.http.routers.maintenant-public.entrypoints=websecure
– traefik.http.routers.maintenant-public.tls=true
– traefik.http.routers.maintenant-public.tls.certresolver=ovhcloud
– traefik.http.routers.maintenant-public.priority=100
networks:
frontend:
external: true
La particularité de cette configuration tient dans la cohabitation de deux routeurs Traefik (ce qui correspond aux recommandations du développeur) :
Le routeur principal (maintenant-https) capte l’ensemble du trafic vers maintenant.it-connectlab.fr et lui applique la chaîne de middlewares crowdsec@file,tinyauth. Il protège donc le tableau de bord et l’API /api/v1/*.
Le routeur public (maintenant-public) ne capte que les chemins /ping/ et /status/, sans authentification. On lui attribue une priorité élevée (100) pour qu’il l’emporte sur le routeur principal lorsque les deux règles correspondent. Ainsi, vos tâches cron peuvent envoyer leurs pings et vos utilisateurs consulter la page de statut sans rencontrer de demande d’authentification.
Si vous activez plus tard le serveur MCP (MAINTENANT_MCP=true), il faudra ajouter un troisième routeur pour les chemins /mcp, /oauth/ et /.well-known/, que MCP authentifie lui-même. J’en parlerai plus loin dans cet article.
Démarrer et vérifier
Lancez ensuite le conteneur :
docker compose up -d
Suivez les logs le temps que Traefik obtienne le certificat et que Maintenant termine son initialisation :
docker compose logs -f maintenant
Ouvrez ensuite https://maintenant.it-connectlab.fr dans votre navigateur : vous êtes redirigé vers la page d’authentification de TinyAuth, puis, une fois identifié, vers le tableau de bord. Pour confirmer que la séparation des routes fonctionne, vérifiez que l’URL https://maintenant.it-connectlab.fr/status/ reste accessible sans authentification.
Découverte de l’outil de supervision Maintenant
Une fois connecté, l’écran d’accueil présente le tableau de bord général. On y retrouve une synthèse de la disponibilité, de la consommation des ressources, une visibilité sur les alertes principales, et un aperçu global sur l’état des conteneurs.
Surveiller les conteneurs et leurs logs
La supervision des conteneurs ne demande aucune configuration : c’est le point fort de l’auto-découverte. Dès qu’un conteneur démarre sur l’hôte, il rejoint la liste. Maintenant suit les changements d’état et permet de consulter les logs en temps réel.
Ainsi, la section “Containers” accessible dans le menu latéral liste tout ce que Maintenant a découvert sur l’hôte. Pour chaque conteneur, vous voyez son état, ses ressources et si une mise à jour est disponible, c’est également mis en avant. Les projets Docker Compose sont regroupés, ce qui facilite la lecture quand plusieurs services appartiennent à la même stack.
En cliquant sur un conteneur, vous avez un aperçu de son historique de disponibilité et vous pouvez accéder aux journaux en temps réel (comme le propose Dozzle). Un champ de recherche permet de filtrer les logs en temps réel, y compris via des expressions régulières.
Vous pouvez personnaliser ce comportement à l’aide de labels Docker ajoutés directement à vos services (à appliquer sur chaque projet). Quelques exemples utiles :
labels:
maintenant.ignore: “true” # Exclure ce conteneur de la supervision
maintenant.group: “backend” # Regrouper sous un nom personnalisé
maintenant.alert.severity: “critical” # Niveau de sévérité : critical | warning | info
maintenant.alert.restart_threshold: “5” # Seuil de détection des boucles de redémarrage
Le label maintenant.ignore est pratique si vous ne souhaitez pas voir remonter dans le tableau de bord certains conteneurs.
Ajouter des sondes HTTP et TCP
C’est là que Maintenant rejoint le terrain d’Uptime Kuma. Il est capable de surveiller l’état de services via HTTP ou TCP, que ce soit un service externe (le site web IT-Connect, par exemple) ou un conteneur. Pour déclarer une sonde, vous avez deux options :
Créer la sonde via l’interface graphique de Maintenant,
Déclarer la sonde via des labels dans la configuration du conteneur ciblé.
La configuration s’effectue via la section “HTTP Endpoints”. C’est également ici que vous verrez l’état de vos endpoints surveillés. L’exemple ci-dessous montre deux sondes : l’une ajoutée via le formulaire web, l’autre via les labels Docker (pour BentoPDF).
Pour la surveillance de BentoPDF, voici les labels ajoutés au fichier Docker Compose de ce projet :
labels:
– maintenant.endpoint.http=http://bentopdf:8080
– maintenant.endpoint.interval=30s
– maintenant.endpoint.http.expected-status=200
– maintenant.endpoint.failure-threshold=2
Toutes les 30 secondes, Maintenant va s’assurer que l’interface web de BentoPDF retourne bien un code HTTP/200. S’il y a deux échecs consécutifs, une alerte sera déclenchée.
Dans la section “SSL Certificates”, une surveillance a été configurée automatiquement pour suivre l’expiration du certificat. Sachez qu’il y a aussi un label pour déclarer des domaines à surveiller (maintenant.tls.certificates).
Plusieurs paramètres de réglage sont disponibles : intervalle de vérification, délai d’expiration, méthode HTTP, codes de statut attendus, en-têtes personnalisés, ou encore seuils d’échec et de récupération. Pour déclarer plusieurs endpoints sur un même conteneur, on utilise une syntaxe indexée :
labels:
maintenant.endpoint.0.http: “https://app:8443/health”
maintenant.endpoint.1.tcp: “redis:6379”
maintenant.endpoint.interval: “30s”
maintenant.endpoint.timeout: “10s”
maintenant.endpoint.http.expected-status: “200,201”
Pour rappel, l’édition Community autorise jusqu’à 10 endpoints.
Surveiller les tâches planifiées avec les heartbeats
Les sondes HTTP vérifient qu’un service répond, mais elles ne disent rien d’une sauvegarde nocturne ou d’un script de purge qui ne s’est pas lancé. C’est le rôle des heartbeats, qui reprennent le principe d’un service comme Healthchecks.io.
Le fonctionnement est le suivant : vous créez un élément de monitoring de type heartbeat dans Maintenant, ce qui génère une URL de ping unique. Il vous suffit ensuite d’ajouter un appel à cette URL à la fin de votre tâche planifiée (dans un script Bash, par exemple). Maintenant enregistre alors chaque “ping” émis par votre script, voire même les heures de début et de fin. Surtout, Maintenant vous alerte si un job manque à l’appel.
Ensuite, un appel sur l’adresse de Maintenant, sur un GUID spécifique, va permettre au script ou à la tâche planifiée de montrer un signe de vie.
curl -fsS -m 10 –retry 5 https://maintenant.it-connectlab.fr/ping/627ec8f2-100d-42df-be54-165198a7a0dc
Chaque ping est enregistré dans le journal d’activité de l’application :
Configurer les alertes
La supervision n’a d’intérêt que si elle vous prévient au bon moment. Maintenant centralise les alertes issues de toutes ses sources : conteneurs, endpoints, heartbeats, certificats, ressources, mises à jour, au même endroit.
Les canaux sont silencieux par défaut et activés via des déclencheurs que vous filtrez par sévérité ou par source. Vous pouvez créer une alerte lorsqu’un conteneur spécifique a une alerte critique associée, par exemple. Ceci est vrai pour les différents types de sources, même s’il manque la possibilité de créer une alerte basée sur l’analyse de logs (comme le propose Dozzle).
Dans l’édition Community, deux canaux sont disponibles : le webhook générique HTTP et Discord. Le webhook est le plus intéressant puisqu’il permet de relayer des alertes vers de nombreux services (et même de déclencher des actions annexes via un autre outil). Il est possible de définir des fenêtres de maintenance pour mettre les alertes en pause pendant un laps de temps spécifique (plutôt pratique pendant une maintenance planifiée).
Cette présentation est bien pensée et elle offre un aperçu complet sur l’état de l’infrastructure. Dommage que l’on ne puisse pas acquitter un problème pour le faire sortir de la liste des alertes actives.
Pour rappel, l’édition Pro ajoute Slack, Microsoft Teams et l’e-mail, ainsi que des règles de filtrage plus fines et des politiques d’escalade.
Publier une page de statut
Maintenant peut exposer une page de statut publique, à destination de vos utilisateurs ou de vos clients. Cette page agrège l’état de vos services et se met à jour en temps réel grâce aux flux SSE (Server-Sent Events). En cas d’incident, vos visiteurs voient immédiatement quels services sont concernés.
L’édition Community permet de publier une page avec jusqu’à 3 composants. L’édition Pro ajoute la gestion des incidents avec une chronologie publique, les fenêtres de maintenance et les notifications aux abonnés.
Vous pouvez créer des composants groupés ou individuels à destination de votre page de statut. Vous pouvez aussi faire en sorte que le statut change dynamiquement si une alerte est détectée sur un endpoint associé à la page de statut (mode incident).
Voici un exemple :
Depuis l’interface de Maintenant, vous avez la main pour changer le statut d’un service. Il est possible de préciser s’il s’agit d’un incident majeur ou d’une simple maintenance programmée.
Connecter un assistant IA via MCP
Maintenant intègre un serveur MCP, un standard qui permet à un assistant IA d’interroger une application à travers des outils que celle-ci expose. Une fois la connexion établie, vous pouvez demander en langage naturel l’état de vos conteneurs, la liste des certificats proches de l’expiration ou les mises à jour en attente, et l’assistant interroge votre instance pour répondre. C’est une façon moderne d’obtenir des informations sans ouvrir le tableau de bord (c’est ce qui va vous permettre de vous la péter auprès de vos collègues).
Nous prenons ici l’exemple de Claude Desktop, mais le principe vaut pour tout client compatible MCP. La configuration se fait en trois temps : activer le serveur MCP côté Maintenant, ouvrir les routes correspondantes dans Traefik, puis déclarer le connecteur dans le client IA.
Activer le serveur MCP côté Maintenant
Le serveur MCP s’active par variables d’environnement. Comme le client se connecte à distance, on utilise le transport HTTP avec authentification OAuth2. Ajoutez ces lignes à votre fichier .env :
# Activation du serveur MCP
MAINTENANT_MCP=true
MAINTENANT_MCP_CLIENT_ID=maintenant-mcp
MAINTENANT_MCP_CLIENT_SECRET=
# URL de rappel OAuth2 autorisées (obligatoire dès que les identifiants MCP sont définis)
MAINTENANT_MCP_ALLOWED_REDIRECT_URIS=https://claude.ai/api/mcp/auth_callback,https://claude.com/api/mcp/auth_callback
Générez le secret avec la commande suivante (ou d’une autre façon) et insérez-le comme valeur de MAINTENANT_MCP_CLIENT_SECRET.
openssl rand -hex 32
La variable MAINTENANT_MCP_ALLOWED_REDIRECT_URIS mérite une explication : elle est requise dès lors qu’un client ID et un secret sont définis, et doit contenir l’URL de rappel OAuth du client. Pour Claude, il s’agit de https://claude.ai/api/mcp/auth_callback. Renseigner ces identifiants protège le serveur MCP par OAuth2 : sans eux, le endpoint /mcp serait ouvert à tous. Il vaut mieux éviter.
Reportez ensuite ces variables dans le bloc environment: du docker-compose.yml :
MAINTENANT_MCP: “${MAINTENANT_MCP:-false}”
MAINTENANT_MCP_CLIENT_ID: “${MAINTENANT_MCP_CLIENT_ID:-}”
MAINTENANT_MCP_CLIENT_SECRET: “${MAINTENANT_MCP_CLIENT_SECRET:-}”
MAINTENANT_MCP_ALLOWED_REDIRECT_URIS: “${MAINTENANT_MCP_ALLOWED_REDIRECT_URIS:-}”
Ouvrir les routes MCP dans Traefik
Le serveur MCP gère sa propre authentification OAuth2. Les routes /mcp, /oauth/ et /.well-known/ ne doivent donc pas passer par TinyAuth, sans quoi le portail d’authentification intercepterait le dialogue OAuth du client.
On ajoute pour cela un troisième routeur, calqué sur le routeur public, mais sans le middleware d’authentification. Ajoutez donc les labels suivants à votre fichier Docker Compose de Maintenant :
# Routeur MCP + OAuth — MCP assure sa propre authentification (pas de TinyAuth)
– traefik.http.routers.maintenant-mcp.rule=Host(`maintenant.it-connectlab.fr`) && (PathPrefix(`/mcp`) || PathPrefix(`/oauth/`) || PathPrefix(`/.well-known/`))
– traefik.http.routers.maintenant-mcp.entrypoints=websecure
– traefik.http.routers.maintenant-mcp.tls=true
– traefik.http.routers.maintenant-mcp.tls.certresolver=ovhcloud
– traefik.http.routers.maintenant-mcp.middlewares=crowdsec@file
– traefik.http.routers.maintenant-mcp.priority=100
Après modification, recréez le conteneur pour que Traefik recharge sa configuration.
Déclarer le connecteur dans Claude Desktop
Dans Claude Desktop, ouvrez les réglages, rubrique “Connecteurs” (vous serez redirigé vers la section de personnalisation) afin d’ajouter un connecteur personnalisé. Renseignez un nom, l’URL du serveur MCP (https://maintenant.it-connectlab.fr/mcp), puis dépliez les paramètres avancés pour saisir le client ID et le secret définis plus haut. Ici, vous devez reprendre les valeurs déclarées dans le fichier .env.
Validez avec “Ajouter”, puis lancez la connexion (bouton situé sur la droite). Claude découvre alors automatiquement les endpoints OAuth2, ouvre une fenêtre d’autorisation et établit la connexion, sans échange de jeton manuel. Une fois la connexion établie, le client affiche les outils exposés par Maintenant et vous laisse choisir le niveau d’autorisation de chacun.
Ils sont classés en deux catégories : les outils en lecture seule et les outils capables d’effectuer des actions. Vous pouvez gérer les permissions pour chaque outil, ce qui peut permettre d’autoriser par défaut les outils en lecture tout en contrôlant de façon plus stricte les outils sensibles.
Une fois la connexion établie, vous pouvez alors interroger votre instance Maintenant en langage naturel à propos de votre infrastructure. En demandant par exemple les mises à jour en attente, l’assistant interroge Maintenant et renvoie la liste des images concernées :
Conclusion
Maintenant a une approche intéressante en matière de supervision puisqu’il regroupe en une seule image Docker des capacités habituellement accessibles via plusieurs outils (Uptime Kuma et Dozzle, et même Beszel sur certains points). Tout dans une seule interface (conteneurs, sondes, heartbeats, certificats), avec des capacités de gestion unifiée, c’est intéressant pour éviter de démultiplier les outils. Ceci est d’autant plus vrai qu’il est dommage de monter un Uptime Kuma pour surveiller 2 URL, là au moins, c’est inclus et natif.
Je suis curieux de voir comment évoluera cette solution open source dans les années à venir : permettra-t-elle d’administrer les conteneurs en proposant la mise à jour des images, par exemple ? La question reste entière. Néanmoins, c’est une solution de monitoring, donc ce n’est pas sa vocation première.
Qu’en pensez-vous ?
Cofondateur d’IT-Connect et Microsoft MVP “Cloud and Datacenter Management”. Mon obsession depuis près de 15 ans ? Rendre l’administration système et la cybersécurité accessibles, que vous soyez junior ou confirmé. Plus qu’un métier, l’IT est pour moi une véritable passion. J’accompagne au quotidien les sysadmins et les professionnels de l’IT dans leur montée en compétences et leur veille technique.
