Ce guide vaut pour Ubuntu 26.04 et Debian 13 avec Docker Engine et Compose. Le fichier suit la documentation officielle, relue le 14 octobre 2026 : Full Setup Instructions, version 2.16.0 de l'image.
À quoi il sert
Sur un serveur qui fait tourner plusieurs applications (n8n, un gestionnaire de mots de passe, un tableau de bord), chacune écoute sur son propre port. Les ouvrir toutes sur Internet serait une mauvaise idée : chaque port ouvert est une porte supplémentaire, et aucune n'aurait de certificat. Le proxy inverse règle les deux problèmes : il est seul à écouter sur 80 et 443, il porte les certificats, et il oriente chaque nom de domaine vers son application.
Installer Nginx Proxy Manager
- Créer un dossier et s'y placer :
mkdir ~/npm && cd ~/npm. - Écrire `compose.yaml`. Par rapport à l'exemple officiel, l'interface d'administration n'est publiée que sur l'adresse locale du serveur, et le fuseau horaire est celui de Paris.
services:
app:
image: jc21/nginx-proxy-manager:2.16.0
restart: unless-stopped
ports:
- "80:80"
- "443:443"
- "127.0.0.1:81:81"
environment:
TZ: "Europe/Paris"
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt
networks:
- proxy
networks:
proxy:
name: proxy
- Démarrer :
docker compose up -d. Le premier démarrage crée la base, les clés et un compte administrateur ; la documentation prévient qu'il peut prendre une minute ou deux.
Le réseau Docker nommé proxy est celui que rejoindront vos applications : le proxy pourra les joindre par leur nom de conteneur, sans qu'elles publient de port.
Ouvrir l'interface sans l'exposer
- Depuis votre ordinateur :
ssh -L 8081:127.0.0.1:81 utilisateur@adresse-du-serveur, et laissez la fenêtre ouverte. - Ouvrez
http://localhost:8081. Le trafic voyage chiffré dans le tunnel SSH. - Connectez-vous, puis remplacez sans attendre l'adresse et le mot de passe du compte administrateur créé au premier démarrage, comme l'interface le propose.
Publier une application en HTTPS
Prenons une application dont le conteneur s'appelle monapp et écoute sur le port 3000.
- La rattacher au réseau `proxy` dans son propre
compose.yaml, sans publier de port :
services:
monapp:
image: mon-image:1.0
restart: unless-stopped
networks:
- proxy
networks:
proxy:
external: true
- Faire pointer le domaine (par exemple
app.votre-domaine.fr) vers l'adresse IP du serveur, par un enregistrement A. - Créer l'hôte dans l'interface : Hosts, Proxy Hosts, Add Proxy Host. Domaine
app.votre-domaine.fr, schémahttp, nom d'hôtemonapp, port3000. - Demander le certificat dans l'onglet SSL : choisir « Request a new SSL Certificate », cocher Force SSL, accepter les conditions de Let's Encrypt, enregistrer.
En une minute, l'application répond en HTTPS sur son domaine, et le certificat se renouvelle seul.
Bonnes pratiques
- Un service qui n'a pas besoin d'Internet ne passe pas par le proxy. Une base de données reste sur le réseau interne de son application.
- Les listes d'accès (Access Lists) limitent un hôte à des adresses IP ou ajoutent un mot de passe : utile pour un tableau de bord interne.
- Sauvegardez `data` et `letsencrypt` : toute la configuration et les certificats y sont.
- Fixez la version de l'image, comme ici, et mettez à jour après avoir lu les notes de version :
docker compose pullpuisdocker compose up -d.
Sur un VPS Hubspace
Docker et Compose sont installés à la livraison, utilisables par le compte admin sans sudo. Le pare-feu réseau ouvre déjà 80 et 443, ceux dont Nginx Proxy Manager a besoin, et laisse le port 81 fermé depuis Internet : le tunnel SSH est la voie normale vers l'interface. Pour Portainer ou Vaultwarden, le même proxy fait l'affaire. Les serveurs VPS décrivent ce qui est livré.
Questions fréquentes
Faut-il Nginx Proxy Manager si j'utilise Caddy ou Traefik ?
Non, un seul proxy inverse par serveur suffit, puisqu'un seul programme peut écouter sur les ports 80 et 443. Nginx Proxy Manager convient à qui préfère une interface ; Caddy et Traefik se règlent par fichiers ou par étiquettes Docker.
Le certificat ne s'obtient pas, que vérifier ?
Que le domaine pointe bien vers l'adresse du serveur (dig +short app.votre-domaine.fr), que les ports 80 et 443 sont joignables depuis Internet, et qu'aucun autre programme ne les occupe déjà. Let's Encrypt doit pouvoir joindre le serveur sur le port 80 pour valider le domaine.
Puis-je publier un service qui n'est pas dans Docker ?
Oui. Le nom d'hôte de destination peut être l'adresse du serveur vue depuis le conteneur, par exemple 172.17.0.1 sur un réseau Docker par défaut, avec le port du service.
Articles liés
- Installer Docker sur Ubuntu ou Debian, pas à pasInstaller Docker Engine et Docker Compose sur Ubuntu 24.04, 26.04 ou Debian 13 depuis le dépôt officiel, l'utiliser sans sudo et vérifier que tout fonctionne.
- Docker Compose : décrire et lancer vos conteneursDocker Compose expliqué : écrire un fichier compose.yaml, lancer et arrêter vos services, lire les journaux et mettre à jour une application sur un serveur.
- Portainer : gérer ses conteneurs DockerInstaller Portainer CE sur un serveur Linux avec Docker, s'y connecter sans l'exposer en clair, et suivre conteneurs, journaux et piles Compose.