Docker nécessite souvent, pour faire propre et simple, d’utiliser une solution globale de reverse proxy. Ces dernières utilisant plutôt Nginx qu’Apache.
La solution la plus connue est sans doute Traefik, que j’ai utilisé après longtemps avoir fait tourner le couple JWilder/Nginx-proxy & JrCs/letsencrypt-nginx-proxy-companion pour la partie Lets Encrypt.
Nginx-Poxy-Manager de jc21 est un petit nouveau sur le marché. Avec un peu de recul, et pour une utilisation basique de Docker, je le trouve plus simple que les autres solutions. Enfin du moins plus abordable notamment du fait de son interface graphique qui permet de créer des reverses, avec ou sans SSL (Lets Encrypts, perso, autre) et d’ajouter des paramètres Nginx (par exemple l’authentification).

L’installation est simple et peut se faire via un docker-compose.yml. Il nécessite une base de données SQL, dans mon exemple je prend MariaDB.
version: "3"services: app: image: jc21/nginx-proxy-manager:2 restart: always container_name : nginx-proxy-manager ports: - 80:80 - 81:81 - 443:443 volumes: - /home/aerya/docker/nginx-proxy-manager/config.json:/app/config/production.json - /home/aerya/docker/nginx-proxy-manager/data:/data - /home/aerya/docker/nginx-proxy-manager/letsencrypt:/etc/letsencrypt depends_on: - db db: image: mariadb restart: always container_name : mariadb environment: MYSQL_ROOT_PASSWORD: "unmotdepassedelamortquitue" MYSQL_DATABASE: "nginxproxymanagertest" MYSQL_USER: "nginxproxymanagertestinguser" MYSQL_PASSWORD: "unautremotdepassedelamortquitue" volumes: - /home/aerya/docker/mariadb/data/mysql:/var/lib/mysql
Et il faudra aussi compléter son fichier de configuration
/home/aerya/docker/nginx-proxy-manager/config.json
{ "database": { "engine": "mysql", "host": "mariadb", "name": "nginxproxymanagertest", "user": "nginxproxymanagertestinguser", "password": "unautremotdepassedelamortquitue", "port": 3306 }}
Bien évidemment pour chaque container Docker qu’on souhaite utiliser via un reverse-proxy il convient de créer un domaine ou sous-domaine adéquate chez son gestionnaire de domaines. Le plus courant étant de créer un sous-domaine du genre “Plex” vers l’IP de son serveur.
EDIT 06/02/19 : le projet continue dévoluer et gère maintenant le HTTP/2 ainsi que les redirections SSL.

EDIT 21/02/19 : ajout de HSTS pour domaine et sous-domaines

L’ajout d’un reverse se fait en quelques clics : Add Proxy Host, entrez votre sous-domaine, le port configuré dans votre Docker, si vous voulez un SSL et, éventuellement, une authentification Nginx. Bien évidemment pas d’auth avec Plex, c’est qu’un exemple…



Pour pouvoir ajouter une authentification vous devez créer le fichier indiqué dans les paramètres : /data/htpassword/plex.upandclear.org
Le /data correspond à /home/aerya/docker/nginx-proxy-manager/data:/data, comme nous l’avons vu (ou pas !) dans le docker-compose.yml du début.
Du coup pour créer votre utilisateur:mot_de_passe (chiffré) vous pouvez vous servir de ce site. Il convient enfin d’écrire ces infos dans un fichier “plex.upandclear.org” dans /home/aerya/docker/nginx-proxy-manager/data
Voilà, je n’ai pas trouvé plus accessible pour ceux qui ne sont pas à l’aise sur Linux 🙂

C’est un super projet, merci pour la découverte !
Bonjour, je pense qu’il y à une coquille dans ton tuto.
« Et il faudra aussi compléter son fichier de configuration
/home/aerya/docker/nginx-proxy-manager/PRODUCTION.SON »
Je pense que le fichier a créer c’est config.json et non pas production.json
😉
Oups, corrigé 🙂 Merci
De rien =)
Merci pour la découverte !
Bonsoir, après plusieurs jours de test j’ai trouvé ce petit programme fort sympathique. Cependant je ne suis pas très doué avec nginx et je cherchais à faire en sorte que mes application ne soit pas disponible sur ipduserver:5000 par exemple.
N’y a-t-il pas une ligne à rajouté dans les paramètre sur nginx pour rendre les application inaccessible via numéro de port sans pour autant bloqué la redirection de port sur mon nom de domaine.
Ma question est elle clair ?
Bonne soirée =)
Si tu ne publies (80:80, 82:80 etc) aucun port lorsque tu lances tes containers Docker alors rien ne sera accessible autrement que via domaine et/ou sous-domaines.
Merci de ta réponse, mais en utilisant le tuto, on fait bien de la redirection d’un port vers un ndd. Et donc si je ne publie pas de port, comment je lie mes applications, à mon ndd.
Le port est ouvert, le container est fait comme ça. Donc sur le réseau Docker il est bien présent. Par exemple, ton container Nginx gérant Lets Encrypt et les sous-domaines étant sur le même réseau que tes containers, il va le voir et pouvoir rediriger.
C’est juste que tu ne le rends pas accessible publiquement.
Salut Aerya faut-il installer nginx et mariadb et php le fichier de configuration est à placer dans /home/aerya/docker/nginx-proxy-manager/config.json donc dans le config.json si je comprend bien
car quand je vais sur mon ip sa me dis You’ve successfully started the Nginx Proxy Manager mais quand je vais sur mon ip :81 page blanche
Salut lolo,
Le docker-compose installe tout ce qu’il faut à savoir le docker du reverse nginx et celui de la base de données mariadb. En effet le config.json à placer est celui qu’il faut remplir avec les user:pwd que tu as définis avant. Ensuite faut tout relancer pour que le reverse prenne en compte ce fameux config.json.
Merci Aerya,
ça fonctionne super , si je veux installer wordpress à la racine de mon nom de domaine il faut que j’installe nginx pour avoir le www dans var ou alors ça se passe autrement car installer un site wordpress avec nginx je sais faire mais avec Nginx-Proxy-Manager je sais pas si ça se passe autrement encore une question je voudrais ajouter adminer dans le docker-compose.yml tu me conseille de mettre quoi ?
merci encore
J’ai pas testé d’installation à la main ensuite, je ne suis qu’en Docker, y compris pour WordPress. Je ne sais pas si le mettre dans le /www lié à ton docker du reverse sera fonctionnel (en théorie oui).
Pour Adminer, je n’utilise pas de compose mais un simple docker run -d –link mariadb:db -p 9898:8080 adminer. Pour le compose il faut suivre leur guide : https://hub.docker.com/_/adminer/
Merci Aerya,
j’ai commencé à tout installé en docker aussi Nginx Poxy Manager fonctionne plutôt bien à part avec wordpress une erreur s’affiche pour le faire passer avec ssl , en http pas de souci ,aussi si je veux pas que les ports s’affiche derriere mon wordpress il faut que je fais un redirection hosts avec juste mon nom de domaine ? et pour installer nextcloud sous Nginx Poxy Manager à tu un docker-compose.yml qui traine dans le coin 😉
encore merci
Salut, j’ai une IPv4/v6 dédiée pour mon blog donc je ne rencontre pas ce problème. Peut-être que tu peux faire de même en attribuant une IP statique (interne) ? https://docs.docker.com/compose/compose-file/compose-file-v2/#ipv4_address-ipv6_address
Pour Nextcloud voici mon compose Owncloud si ça peut t’aider :
docker run -d
--name owncloud
--restart always
--link mariadb:db
--link redis:redis
-e OWNCLOUD_DOMAIN=cloud.***.***
-e OWNCLOUD_DB_TYPE=mysql
-e OWNCLOUD_DB_NAME=***
-e OWNCLOUD_DB_USERNAME=***
-e OWNCLOUD_DB_PASSWORD=***
-e OWNCLOUD_DB_HOST=db
-e OWNCLOUD_ADMIN_USERNAME=***
-e 'OWNCLOUD_ADMIN_PASSWORD=***'
-e OWNCLOUD_REDIS_ENABLED=true
-e OWNCLOUD_REDIS_HOST=redis
--volume /home/***/docker/owncloud/data:/mnt/data
--label=com.centurylinklabs.watchtower.enable=true
owncloud/server:latest
Merci Aerya
d’avoir pris le temps de répondre 👍
Bonjour aerya j’essaie d’installer ceci mais sans sucés dois je lancer le docker compose avant de faire le config.json pour éditer le config.json sous débian c’est bien la commande « nano » je suis un peu perdu.
Salut, nano est un éditeur simple pour Linux en CLI en effet. Comme répondu sur Mondedie je te recommande de créer ton fichier config.json avant de lancer ton docker-compose up -d.
Salut Aerya.
Tout d’abord, merci pour la découverte. J’adore tes tutos, toujours aussi clairs et instructifs.
Malgré tout, je n’arrive pas à faire fonctionner ce p*** de reverse proxy. Je ne pense pas que ce soit celui-ci particulièrement car j’ai pas réussi à faire fonctionner non plus Traefik mdr. Je dois rater un truc, mais je ne vois pas quoi.
Pour commencer ma conf :
Je suis en phase de test, donc je bosse dans une VirtualBox (en phase final, ce sera aussi en machine virtuelle mais sur un serveur proXmoX) avec OpenMediaVault (et le plugin Docker) comme image. Evidemment je redirige tous les ports que j’utilise vers ma machine virtuelle OMV…
Ensuite je config le reste avec docker-compose (en suivant ton tuto). Tout semble OK (les conteneurs sont créés,fonctionnels et démarrés), mais quand je tape localhost:81, j’ai un ERR_CONNECTION_REFUSED.
Alors je sais pas trop d’où ça peut venir. Je me dis que c’est peut-être le nginx principal (celui de OMV -> port d’admin changé en 8888 pour laisser libre le 80) qui intercepte la requête sur le 81 … ?
J’ai aussi fais un « docker network ls » et j’ai :
NETWORK ID NAME DRIVER SCOPE
b3716dcf56ec bridge bridge local
2d5b86b39fba dockercompose_default bridge local
9b4432ba8e04 host host local
dcb670181ef3 none null local
Un petit ifconfig me donne :
br-2d5b86b39fba Link encap:Ethernet HWaddr 02:42:7B:F6:B5:C6
inet addr:172.18.0.1 Bcast:172.18.255.255 Mask:255.255.0.0
docker0 Link encap:Ethernet HWaddr 02:42:FA:61:A6:5B
inet addr:172.17.0.1 Bcast:172.17.255.255 Mask:255.255.0.0
—-> Est-ce bien normal d’avoir 2 bridges ? Le problème peut-il venir de là ?
Bref, je sèche lol. Bien que j’arrive à faire fonctionner plusieurs services docker sur des ports différents en local (plex sur le 32400, adguardhome en 8080, portainer sur le 9000 …).
J’ai essayé de changer le mode réseau en Bridge ou Host … ça change rien.
Si une de tes lumières peut m’éclairer please ^^
Merci de m’avoir lu (je sais, c’est long mais j’essais de détailler lol).
@++
Salut, tu peux me montrer comment tu lances ton Docker stp ? (masque des infos si besoin)
Et via le port HTTPS, ça ne fonctionne pas non plus ?
Et si tu change les ports de config ? Par exemple
ports:
– 2017:80
– 2018:81
– 2019:443
Du coup, je suis passé directement sur mon ptit serveur … après tout, ce n’est que du Docker, je risque pas de tout casser (et j’ai pris un snapshot lol).
Alors, pour le port 80, j’ai une belle page :
Congratulations!
You’ve successfully started the Nginx Proxy Manager.
If you’re seeing this site then you’re trying to access a host that isn’t set up yet.
Log in to the Admin panel to get started.
En 81, j’ai toujours un ERR_CONNECTION_REFUSED.
En https (443), j’ai un certificat « O=Nginx Proxy Manager,OU=Dummy Certificate » avec un ERR_EMPTY_RESPONSE.
-> J’ai l’impression que c’est pas mal, mais je ne comprends pas pourquoi je n’arrive pas a accéder à la page d’admin …
Je ne lance pas Docker moi même, j’utilise le plugin OMV qui fait un docker run avec les paramètres que je lui donne.
Dans les logs du conteneurs proxy j’ai ceci :
[s6-init] making user provided files available at /var/run/s6/etc…exited 0.
[s6-init] ensuring user provided files have correct perms…exited 0.
[fix-attrs.d] applying ownership & permissions fixes…
[fix-attrs.d] done.
[cont-init.d] executing container initialization scripts…
[cont-init.d] done.
[services.d] starting services
[services.d] done.
[9/21/2019] [5:07:33 PM] [Global ] › ✖ error connect ETIMEDOUT
[9/21/2019] [5:07:44 PM] [Global ] › ✖ error connect ETIMEDOUT
[9/21/2019] [5:07:55 PM] [Global ] › ✖ error connect ETIMEDOUT
-> Les 3 dernières sont non-stop…
Je te joins le détail de la conf des conteneurs si tu vois quelque-chose …
http://bit.ly/34XbRpg -> mariadb
http://bit.ly/2M3GgJU -> proxy
Désolé encore de t’embêter, mais je débute en docker et là, je t’avoue que je sèche. Je suis sûre que c’est juste un ptit truc qui mer**, mais ça me saute pas aux yeux pour l’instant.
[9/21/2019] [5:07:33 PM] [Global ] › ✖ error connect ETIMEDOUT
Faudrait voir les logs du Docker concerné (ou globaux), y’a un pépin. Le port 443 ne serait pas déjà utilisé ? Tu as bien changé les ports de ton Docker comme j’ai mis plus haut ?
Par exemple au lieu de 443:443 tu mets 2019:443. Le port local de ton Docker sera bien 443 mais son port public sera 2019.
Merci pour ton aide Aerya.
J’ai réussi à le faire fonctionner en modifiant le config.json.
Dans la partie « host », j’ai dû mettre directement l’adresse du conteneur de la BDD fournit par le bridge Docker (en 172.17.x.x). Il semble que le nom d’hôte ne soit pas résolu, mais je ne sais pas encore pourquoi…
J’ai cette ligne dans les logs du conteneur de la BDD qui peut peut-être expliquer :
2019-09-23 20:17:28 0 [Warning] ‘proxies_priv’ entry ‘@% root@b8bfa698b7a5’ ignored in –skip-name-resolve mode.
En tout cas, encore merci pour ton aide et le temps que tu consacres à nous concocter de supers tutos ^^
@++
Le nom d’hôte est peut-être local simplement ? Ou derrière un routeur qui bloque l’accès direct au port ?
Bonjour,
J’ai suivi ce tuto super sympa, mais j’ai un soucis.
Si je désactive tout ce qui est lié à https (le « scheme » et le certificat fraichement généré), j’arrive bien sur ma page en http (donc mon container fonctionne bien).
Dès que je repasse en https et avec le certificat, j’ai un bon ERR_CONNECTION_REFUSED sur mon domaine en https.
Côté container (en apache), j’ai une configuration qui gère le 443 et le 80 (j’ai suivi cet autre tuto : https://www.memoinfo.fr/tutoriels-linux/configurer-lets-encrypt-apache/), et l’image que j’utilise pour container expose (logiquement) les ports 443 et 80.
Une piste, parce que dans ce tuto, ça paraît super simple d’activer le https, mais dans mon cas, plouf !
Une idée pour tester avec un container simple et vérifier que le https fonctionne (un Dockerfile exemple ?)
Merci pour votre aide 😉
Hello,
j’utilise actuellement le couple nginx-proxy avec le companion letsencrypt. Le souci que je rencontre est que je ne peux pas modifier le fichier de conf de nginx. Donc, je ne peux pas rajouter une entrée correspondante à une autre machine de mon réseau, je suis cantonné aux containers hébergés sur la même machine. De ce que je comprends, nginx-proxy-manager me permettrait de passer outre cette limitation et de rediriger vers des containers ou vers d’autres machines ?
Merci d’avance !
Salut, là en effet tu peux ajouter des paramètres à la configuration Nginx pour chaque proxy. En revanche je n’ai pas testé de reverse « déporté ». Je suppose que c’est possible en LAN via proxy_pass.
Hello,
je te confirme que tout fonctionne niquel. J’ai donc installé nginx-proxy-manager en container, et je peux rediriger vers d’autres VMs sans souci. Merci pour l’article !
Super, merci de ton retour 🙂
Hello Aerya
J’ai voulu faire quelques chose de propre sur mon serveur maison et la solution nginx proxy est parfaite donc merci pour le tuto 🙂
J’ai une machine sous OpenMediaVault5 sur laquelle j’ai nginx proxy manager d’installer
J’ai une autre machine sous debian ou j’ai mes applis d’installé (sickchill,plex,rutorrent+vpn, autre…)
J’ai réussi à tout rediriger comme je l’entend sauf… rutorrent+vpn
J’utilise la solution de binhex qui fonctionne très bien en local mais que j’aimerai faire sortir sous la forme torrent.mondomaine.com
Lorsque je fais la manip j’arrive sur l’interface qui me demande mon login/mdp mais une fois rentré l’interface se charge mais après plusieurs minutes (sans exagérer)
Aurais tu une idée sur à ce propos car je sèche un peu (beaucoup)
merci pour ton travail en tout cas 😉
Merci 🙂
J’ai déjà eu ce genre de souci avec ruTorrent, c’était aléatoire et j’ai jamais vraiment trouvé ce qui clochait (mais RAS depuis un bout de temps). Teste en désactivant Cache Assests et/ou Websocket dans les options du reverse concerné.
Elles sont déjà décochées…
là en gros j’ai :
domaine name : torrent.mondomaine.com
scheme https
forward hostname/ip : 192.168.1.ipdemamachine
forward port 443
cache assets / block common exploits / websockets support : tous desactivés
j’ai demandé un ssl
Force SSL activé
HTTP/2 support activé
HSTS enable désactivé
HSTS Subdomaine désactivé
.
et en custom nginx configuration j’ai ajouté ca pour le proxypass :
location / {
proxy_pass https://adresse_ip_de_la_machine:9443;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# HTTP 1.1 support
proxy_http_version 1.1;
proxy_set_header Connection « »;
}
PS : quelle vitesse de réponse (surtout si tard ^^ )
Là pour le coup j’ai un trop long délai de réponse ^^’
Y’a rien de bizarre dans ton paramétrage. Tu as tenté avec un navigateur en mode privé ? Tu utilises quel Docker ?
En ce moment je tourne avec romancin/rutorrent et mondedie/rutorrent et je ne rencontre aucun souci.
hello et à mon tour de mettre trois plombes à repondre…
J’ai test avec mondedie/rutorrent et ca fonctionne plutot pas mal, sauf que le statut du port reste en « inconnu » et la copie vers avec filemanager se lance mais ne copie rien… ^^
Le statut du port c’est pas grave, ça communique quand même bien. J’ai souvent eu ce souci et aucun impact.
Pour FileManager je regarde ça dimanche ou lundi mais je penche pour un problème de droits sur le dossier cible.
Bonjour à tous
Très bon tuto merci à tous
J’ai un Microserver Gen8 chez moi avec Proxmox en vue du remplacement de mon NAS Qnap.
N’ayant pas d’IP fixe j’ai mis en place via NOIP une redirection qui arrive sur le serveur Nginx-Proxy manager.
Je n’arrive pas à installer le HTTPS via letsencrypt.
Pour info j’ai mis en place un container via portainer qui porte le Docker Nginxproxymanager.
Si vous avez un bon tuto suit preneur
Bonne journée
Fred