Nginx Proxy Manager centralisant des services Docker derrière un reverse proxy HTTPS avec certificats SSL

Nginx Proxy Manager : installer un reverse proxy avec SSL automatique

User avatar placeholder
Écrit par Vincent

Mis à jour le 13 août 2026

Nginx Proxy Manager est une interface web qui pilote Nginx en mode reverse proxy et gère les certificats Let’s Encrypt à votre place. Il se déploie uniquement sous forme d’image Docker, s’administre sur le port 81, et permet d’exposer plusieurs services internes derrière un seul point d’entrée HTTPS. Ce guide couvre l’installation avec Docker Compose, la création du premier hôte proxy, l’obtention du certificat SSL, et surtout les points de version qui cassent une installation existante.

L’essentiel
Version couverte : 2.15.1 (dernière version publiée au 12 août 2026)
Prérequis : Docker et le plugin Compose, un nom de domaine, les ports 80 et 443 redirigés
Ports : 80 et 443 publics, 81 pour l’administration (à ne pas exposer)
Architectures : amd64 et arm64 uniquement — armv7 abandonné depuis la 2.14
Fiabilité : procédure conforme à la documentation officielle du projet, consultée le 12 août 2026
Point critique : les versions antérieures à la 2.15.0 sont concernées par un correctif d’élévation de privilèges — voir la section sécurité

À quoi sert Nginx Proxy Manager

Quand vous hébergez plusieurs services chez vous, vous accumulez des adresses du type 192.168.1.20:8096, 192.168.1.20:9000, 192.168.1.20:32400. Chacune expose un port différent, aucune n’est chiffrée, et aucune n’est mémorisable.

Un reverse proxy résout ce problème : il reçoit toutes les requêtes sur les ports 80 et 443, lit le nom de domaine demandé, et transmet la requête au bon service interne. Vos utilisateurs tapent photos.mondomaine.fr, le proxy s’occupe du reste. C’est exactement le type de service que couvre notre guide pour installer Immich avec Docker Compose, une galerie photo auto-hébergée pensée pour tourner derrière un reverse proxy comme celui-ci. Tous les services ne méritent pas cette exposition publique : pour un outil d’administration ou un usage strictement personnel, mieux vaut parfois y accéder sans l’exposer publiquement via un VPN mesh comme Tailscale, et réserver le reverse proxy aux services que vous voulez réellement partager.

Nginx sait faire cela depuis toujours, mais il faut écrire un fichier de configuration par service, générer les certificats à la main et programmer leur renouvellement. Nginx Proxy Manager remplace ce travail par un formulaire.

Différence avec Nginx installé directement

Nginx seul Nginx Proxy Manager
Configuration Fichiers dans /etc/nginx/sites-available/ Formulaire web
Certificats SSL Certbot en ligne de commande Bouton dans l’interface
Renouvellement Tâche cron à surveiller Automatique
Versionnage de la conf Possible avec Git Base de données, non versionnable
Réglages avancés Complets Champ « Custom Nginx Configuration » par hôte

Le compromis est clair : vous gagnez du temps et perdez la possibilité de suivre votre configuration dans Git. Pour un serveur personnel ou un homelab, l’échange est favorable. Pour une infrastructure gérée en configuration-as-code, Nginx nu ou Traefik restent plus cohérents.

Comparatif indiquant quand choisir Nginx Proxy Manager et quand préférer Nginx nu ou Traefik

Les quatre types d’hôtes

L’interface propose quatre entrées distinctes, souvent confondues :

  • Proxy Host — transmet un domaine vers une IP et un port internes. C’est celui que vous utiliserez dans 90 % des cas.
  • Redirection Host — renvoie un domaine vers un autre par une redirection HTTP. Utile pour un ancien nom de domaine.
  • Stream — proxifie du TCP ou de l’UDP brut, sans comprendre le HTTP. Pour une base de données ou un serveur de jeu.
  • 404 Host — répond proprement aux domaines qui pointent vers votre serveur sans y correspondre.

Prérequis

Docker et le plugin Compose doivent être installés. Si ce n’est pas le cas, la procédure est détaillée dans le guide installer Docker sur Linux quelle que soit votre distribution.

Il vous faut également un nom de domaine dont vous contrôlez les enregistrements DNS, et les ports 80 et 443 redirigés depuis votre box vers la machine hôte.

Avertissement — architectures 32 bits
Depuis la version 2.14, le projet ne publie plus d’image pour armv7, en conséquence de l’abandon de cette architecture par Node.js. Les images officielles couvrent amd64 et arm64. Sur un Raspberry Pi 2, un Pi 3 en système 32 bits ou un Pi Zero, la documentation officielle recommande de rester sur le tag 2.13.7. Une mise à jour vers latest sur ce matériel échoue dès le téléchargement, avec un message du type no matching manifest for linux/arm/v7 in the manifest list entries.

Vérifiez que les ports nécessaires sont libres avant de lancer quoi que ce soit :

# Les ports 80, 81 et 443 doivent être libres
sudo ss -tlnp | grep -E ':(80|81|443)\s'

Une sortie vide signifie que les trois ports sont disponibles. Si Apache ou un Nginx système répond déjà sur le port 80, arrêtez-le avant de continuer, sinon le conteneur ne démarrera pas.

Schéma des 7 étapes pour installer Nginx Proxy Manager avec Docker Compose

Étape 1 : créer le fichier docker-compose.yml

Créez un dossier dédié, puis un fichier docker-compose.yml :

mkdir -p ~/nginx-proxy-manager && cd ~/nginx-proxy-manager
services:
  app:
    image: 'jc21/nginx-proxy-manager:2.15.1'
    restart: unless-stopped
    ports:
      - '80:80'      # HTTP public
      - '81:81'      # Interface d'administration
      - '443:443'    # HTTPS public
    environment:
      TZ: 'Europe/Paris'
    volumes:
      - ./data:/data
      - ./letsencrypt:/etc/letsencrypt

Trois choix méritent une explication.

L’image est épinglée sur une version précise, pas sur latest. Avec latest, un docker compose pull de routine peut vous faire franchir une version majeure sans que vous l’ayez décidé — exactement le scénario qui casse les installations sur ARM 32 bits ou les plugins DNS Certbot. Épingler vous laisse choisir le moment.

Aucune clé version: en tête de fichier. De nombreux tutoriels commencent encore par version: '3.8'. La documentation Docker classe cette clé comme obsolète : elle n’est conservée que pour compatibilité, n’a aucun effet, et produit un avertissement à chaque commande.

Aucun service de base de données. Par défaut, Nginx Proxy Manager utilise SQLite dans le volume ./data, ce qui suffit largement pour un serveur personnel. La documentation officielle décrit également des configurations MariaDB et PostgreSQL, utiles seulement si vous mutualisez déjà un serveur de base de données.

Notez que - '81:81' publie l’interface d’administration sur toutes les interfaces réseau de la machine. C’est nécessaire pour y accéder depuis un autre poste du réseau local, mais cela impose de bloquer ce port au pare-feu si le serveur possède une adresse IP publique — voir la section sécurité.

Vérifiez la syntaxe avant de démarrer :

docker compose config

La commande affiche le fichier interprété. Toute erreur d’indentation ou de clé inconnue apparaît ici, avant que le conteneur ne soit créé.

Étape 2 : démarrer le conteneur

docker compose up -d

Notez l’absence de tiret entre docker et compose. La commande docker-compose, écrite en Python, correspond à Compose V1, que Docker ne maintient plus et invite à remplacer par Compose V2. Les tutoriels qui recommandent encore apt install docker-compose vous font installer un outil abandonné.

Contrôlez que le conteneur tourne :

docker compose ps

La colonne STATUS doit afficher Up suivi d’une durée. Le fichier Compose ci-dessus ne définit pas de bloc healthcheck : n’attendez pas la mention (healthy), parfois vue dans d’autres tutoriels — elle suppose une configuration explicite, documentée dans le guide officiel Advanced Configuration du projet. Le premier démarrage prend une à deux minutes : l’application génère ses clés JWT, initialise la base et crée sa structure de tables. Suivez l’opération si elle vous semble longue :

docker compose logs -f app

Quittez l’affichage avec Ctrl+C une fois le démarrage terminé.

Étape 3 : créer le compte administrateur

Ouvrez http://ADRESSE_DU_SERVEUR:81 dans votre navigateur, en remplaçant l’adresse par l’IP locale de la machine.

Le premier écran affiche « Welcome! » et un formulaire de création de compte administrateur : nom complet, adresse e-mail, mot de passe. Il n’y a pas d’identifiants préremplis à modifier après coup.

Formulaire de création du compte administrateur Nginx Proxy Manager au premier lancement
Capture officielle du projet Nginx Proxy Manager — nginxproxymanager.com

Ce point mérite d’être précisé, car il est mal documenté. De nombreux tutoriels francophones mentionnent encore un couple admin@example.com / changeme, et la page officielle Full Setup Instructions indique elle-même, dans sa section Initial Run, qu’un utilisateur administrateur par défaut est créé. Le code de la version 2.15.1 dit autre chose : dans backend/setup.js, la fonction setupDefaultUser ne crée un compte automatiquement que si les variables d’environnement INITIAL_ADMIN_EMAIL et INITIAL_ADMIN_PASSWORD sont définies. Le commentaire du code est explicite : dans le cas contraire, l’assistant de configuration doit être présenté dans l’interface. Comme le fichier Compose ci-dessus ne définit aucune de ces deux variables, c’est bien l’écran de création de compte que vous obtenez.

Cette possibilité de préremplir le compte est d’ailleurs utile pour un déploiement automatisé. Il suffit d’ajouter au bloc environment :

    environment:
      TZ: 'Europe/Paris'
      INITIAL_ADMIN_EMAIL: 'vous@mondomaine.fr'
      INITIAL_ADMIN_PASSWORD: 'un-mot-de-passe-solide'

Le compte n’est alors créé qu’au tout premier démarrage, tant qu’aucun utilisateur actif n’existe en base.

Étape 4 : créer votre premier hôte proxy

Avant tout, faites pointer un enregistrement DNS de type A vers l’adresse IP publique de votre connexion. Sans cela, l’étape suivante échouera.

Dans l’interface, ouvrez Hosts → Proxy Hosts → Add Proxy Host et renseignez :

  • Domain Names : le sous-domaine, par exemple photos.mondomaine.fr
  • Scheme : http — c’est le protocole entre le proxy et votre service interne, pas celui vu par le visiteur
  • Forward Hostname / IP : l’adresse interne du service, par exemple 192.168.1.20
  • Forward Port : son port, par exemple 8096

Le formulaire se présente en trois onglets : Details (les champs ci-dessus), Custom Locations et SSL. Sous les champs de destination, un sélecteur Access List permet de restreindre l’accès à cet hôte — laissez Publicly Accessible pour un service ouvert à tous. Trois options apparaissent sous forme d’interrupteurs, pas de cases à cocher : Cache Assets (mise en cache des fichiers statiques par Nginx), Block Common Exploits (filtre les requêtes contenant des motifs d’attaque connus) et Websockets Support (nécessaire pour toute application dont l’interface se met à jour en temps réel). Activez au minimum Block Common Exploits.

Enregistrez, puis ouvrez http://photos.mondomaine.fr dans votre navigateur. Le service doit répondre, encore en HTTP.

Formulaire Add Proxy Host de Nginx Proxy Manager avec les champs de destination et les options
Capture officielle du projet Nginx Proxy Manager — nginxproxymanager.com

Étape 5 : activer le certificat SSL

Rouvrez l’hôte que vous venez de créer et allez dans l’onglet SSL. Dans la liste des certificats, choisissez la demande d’un nouveau certificat — l’interface 2.15.1 intitule cette entrée Request a new Certificate, avec la mention with Let’s Encrypt. Cochez ensuite Force SSL et HTTP/2 Support, puis enregistrez.

Deux options supplémentaires apparaissent sur cet onglet, désactivées par défaut : HSTS Enabled et HSTS Sub-domains, qui indiquent au navigateur de toujours exiger HTTPS pour ce domaine. Ne les activez qu’une fois le certificat obtenu et le HTTPS confirmé fonctionnel : un HSTS activé par erreur sur un domaine mal configuré rend le site inaccessible pendant la durée de la directive, sans recours simple.

Trois conditions doivent être réunies pour que la demande aboutisse :

  1. le domaine résout bien vers votre IP publique ;
  2. le port 80 est joignable depuis Internet, car c’est par lui que passe la validation ;
  3. la propagation DNS est terminée — comptez jusqu’à une heure sur un enregistrement récent.

Vérifiez le résultat depuis n’importe quelle machine :

# Affiche l'émetteur et les dates de validité du certificat
echo | openssl s_client -connect photos.mondomaine.fr:443 -servername photos.mondomaine.fr 2>/dev/null | openssl x509 -noout -issuer -dates

L’émetteur doit mentionner Let’s Encrypt. Le renouvellement est ensuite automatique.

Si vous voulez éviter d’exposer le port 80, ou couvrir *.mondomaine.fr d’un seul certificat, utilisez la validation DNS Challenge dans le même onglet : elle valide par un enregistrement DNS temporaire au lieu d’une requête HTTP, et autorise les certificats génériques.

Onglet SSL de Nginx Proxy Manager avec la demande de certificat Let’s Encrypt et le DNS Challenge
Capture officielle du projet Nginx Proxy Manager — nginxproxymanager.com

Sécurité : ce que la plupart des tutoriels ne disent pas

C’est le point le plus important de cet article, et le plus souvent absent ailleurs.

Mettez à jour vers la 2.15.0 au minimum

Les notes de version 2.15.0 mentionnent la correction d’un défaut permettant à tout utilisateur authentifié de modifier son propre champ de rôles via une requête PUT. Sur une instance où vous avez créé des comptes secondaires à droits réduits, cela signifie qu’un de ces comptes pouvait s’attribuer des privilèges supplémentaires. La même version met à jour OpenResty pour traiter les vulnérabilités CVE-2026-42945, CVE-2026-8711 et CVE-2026-9256.

Si votre instance tourne encore en 2.14 ou antérieure et que plusieurs personnes y ont un compte, la mise à jour n’est pas optionnelle.

N’exposez jamais le port 81

L’interface d’administration ne doit être joignable que depuis votre réseau local ou votre VPN. Ne créez pas d’hôte proxy pointant vers elle, et bloquez le port au niveau du pare-feu si la machine est directement exposée. La procédure de durcissement est décrite dans le guide configurer et sécuriser un accès SSH, dont la logique s’applique ici.

Activez l’authentification à deux facteurs

Depuis la version 2.13.6, Nginx Proxy Manager gère l’authentification à deux facteurs par TOTP. Elle s’active dans le profil utilisateur. Peu de tutoriels en parlent, alors que c’est la protection la plus directe pour une interface qui contrôle l’ensemble de votre routage.

Le piège des listes d’accès

Les Access Lists permettent de protéger un service par identifiant et mot de passe, ou de restreindre l’accès à certaines adresses IP.

Avertissement
Une liste d’accès avec authentification par mot de passe impose au navigateur d’envoyer un en-tête Authorization à chaque requête. Si l’application derrière le proxy utilise elle-même cet en-tête pour sa propre authentification — ce qui est le cas de la majorité d’entre elles — les deux se retrouvent en conflit. La norme HTTP n’autorise pas deux en-têtes Authorization, et l’une des deux connexions cesse de fonctionner. La documentation officielle du projet documente ce comportement. Utilisez la restriction par IP dans ce cas.

Mettre à jour et revenir en arrière

Avant toute mise à jour, sauvegardez les deux volumes :

cd ~/nginx-proxy-manager
docker compose down
# sudo est indispensable : le conteneur tourne en root et les fichiers
# des volumes ./data et ./letsencrypt lui appartiennent
sudo tar czf ~/npm-sauvegarde-$(date +%F).tar.gz data letsencrypt
sudo chown "$USER":"$USER" ~/npm-sauvegarde-$(date +%F).tar.gz

Sans sudo, tar échoue sur les clés privées avec Cannot open: Permission denied et produit une archive incomplète — le pire scénario juste avant une mise à jour.

Modifiez ensuite le numéro de version dans docker-compose.yml, puis :

docker compose pull
docker compose up -d

Avertissement — passage à la 2.15.0
Cette version change l’image de base pour Debian Trixie et met à jour OpenResty, Certbot et Python. Les notes officielles signalent que les plugins DNS Certbot peuvent cesser de fonctionner et nécessiter un ajustement de leurs dépendances. Si vous utilisez la validation DNS pour vos certificats, prévoyez du temps pour cette montée de version et gardez votre sauvegarde à portée de main.

Pour revenir en arrière, remettez l’ancien numéro de version dans le fichier, relancez docker compose up -d, et restaurez l’archive si la base a été migrée.

Désinstaller proprement

docker compose down

Cette commande arrête et supprime le conteneur, sans toucher aux données.

Avertissement — suppression définitive
Les dossiers data et letsencrypt contiennent votre base de configuration et vos certificats. Leur suppression est irréversible et vous obligera à redemander tous vos certificats. Sans sudo, la commande ci-dessous échoue silencieusement sur la plupart des fichiers et vous laisse croire que tout est effacé.

# À n'exécuter que si vous voulez tout effacer
# sudo est nécessaire : ces fichiers appartiennent à root
sudo rm -rf ~/nginx-proxy-manager/data ~/nginx-proxy-manager/letsencrypt

Erreurs courantes

Le conteneur ne démarre pas, le port 80 est déjà utilisé. Un serveur web tourne déjà sur l’hôte. Identifiez-le avec sudo ss -tlnp | grep ':80\s', puis arrêtez-le ou changez les ports publiés.

Let’s Encrypt refuse le certificat. Dans l’ordre de fréquence : le DNS ne pointe pas encore vers la bonne IP, le port 80 n’est pas redirigé par la box, ou la propagation DNS n’est pas terminée. Vérifiez la résolution avec dig +short photos.mondomaine.fr avant de réessayer.

Erreur 502 Bad Gateway. Le proxy reçoit bien votre requête mais ne joint pas le service cible. L’IP ou le port de destination sont incorrects, ou le service écoute sur 127.0.0.1 et non sur l’IP du réseau. Si le service tourne dans un autre conteneur Docker, vous pouvez utiliser son nom au lieu d’une adresse IP, mais uniquement si les deux conteneurs partagent le même réseau Docker déclaré : sans cela, le journal Nginx renverra host not found in upstream. Vérifiez avec docker network inspect nginx-proxy-manager_default que le conteneur cible y figure.

Erreurs liées à IPv6 au démarrage. Si IPv6 est désactivé sur l’hôte, ajoutez DISABLE_IPV6: 'true' dans le bloc environment du fichier Compose.

Questions fréquentes

Peut-on installer Nginx Proxy Manager sans Docker ?
Non. La documentation officielle indique que le projet est distribué uniquement sous forme d’image Docker, ce choix permettant aux mainteneurs de maîtriser les versions de Nginx et des bibliothèques embarquées. Il n’existe pas de paquet natif pour les distributions Linux.

Nginx Proxy Manager est-il sécurisé ?
Il l’est à condition de tenir trois règles : rester au minimum en version 2.15.0, ne jamais exposer le port 81 sur Internet, et activer l’authentification à deux facteurs. Une instance à jour et correctement isolée réduit la surface d’attaque, puisqu’elle remplace plusieurs ports ouverts par un seul point d’entrée chiffré.

Sur quel port se trouve l’interface d’administration ?
Le port 81, en HTTP. Vous y accédez par http://ADRESSE_DU_SERVEUR:81. Ce port doit rester accessible uniquement depuis votre réseau local ou votre VPN.

Que faire si le mot de passe administrateur est perdu ?
Aucune procédure de réinitialisation n’est prévue dans l’interface. Le mot de passe est stocké sous forme de condensat dans la base SQLite du dossier data. La récupération passe par une modification directe de cette base, opération à réaliser après avoir arrêté le conteneur et sauvegardé le fichier.

Peut-on créer le compte administrateur automatiquement ?
Oui, en définissant INITIAL_ADMIN_EMAIL et INITIAL_ADMIN_PASSWORD dans le bloc environment du fichier Compose. Le compte est alors créé au premier démarrage, tant qu’aucun utilisateur actif n’existe en base, et l’assistant de configuration n’apparaît pas. C’est la méthode à utiliser pour un déploiement scripté.

Nginx Proxy Manager fonctionne-t-il sur Raspberry Pi ?
Oui sur les modèles 64 bits, les images officielles couvrant amd64 et arm64. Les modèles plus anciens en 32 bits ne sont plus pris en charge depuis la version 2.14 : utilisez l’image 2.13.7 et n’appliquez pas de mise à jour automatique.

Faut-il préférer Traefik ?
Traefik configure ses routes automatiquement à partir des étiquettes des conteneurs, ce qui convient aux environnements où les services apparaissent et disparaissent souvent. Nginx Proxy Manager demande une saisie manuelle par service, mais ne réclame aucun fichier de configuration. Sur une infrastructure stable de quelques services, le second est plus rapide à mettre en œuvre et à corriger.

Conclusion

Retenez trois décisions plutôt qu’une procédure. Épinglez toujours un numéro de version dans votre fichier Compose, jamais latest : c’est ce qui vous évite une mise à jour subie sur un matériel ARM 32 bits ou une configuration Certbot par DNS. Restez au minimum en 2.15.0 si plusieurs comptes existent sur votre instance, à cause du correctif d’élévation de privilèges. Et gardez le port 81 hors d’Internet, quelle que soit la solidité de votre mot de passe.

Une fois le reverse proxy en place, la suite logique consiste à lui donner une machine correctement configurée. Le guide installer et sécuriser Ubuntu Serveur 26.04 LTS couvre le socle système, et l’installation de Proxmox VE décrit comment isoler chaque service dans son propre conteneur avant de les publier.

Sources officielles

Vincent

Vincent est le créateur de MémoLinux. Venu de Windows par curiosité, il est resté sur Linux pour sa logique et le plaisir de comprendre ce qui se passe sous le capot. Il documente ici les commandes et les procédures qu’il utilise lui-même, avec leurs sources officielles et leur date de vérification.

Laisser un commentaire