Nginx-Proxy-Manager : reverse proxy Nginx + SSL via interface Web [NOOB]

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 🙂

36 Commentaires
Le plus ancien
Le plus récent Le plus populaire
spider1163
spider1163
Invité
20/09/2018 10h55

C’est un super projet, merci pour la découverte !

B3nJ
B3nJ
Invité
20/09/2018 11h11

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

😉

Benjamin Le Dizes
Benjamin Le Dizes
Invité
Répondre à  Aerya
20/09/2018 20h36

De rien =)

Cyprien
Cyprien
Invité
25/09/2018 19h08

Merci pour la découverte !

B3nJ
B3nJ
Invité
14/11/2018 18h47

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 =)

B3nJ
B3nJ
Invité
Répondre à  Aerya
26/11/2018 14h23

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.

lolo
lolo
Invité
01/01/2019 18h38

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

lolo
lolo
Invité
Répondre à  Aerya
01/01/2019 20h26

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

lolo
lolo
Invité
Répondre à  Aerya
07/01/2019 19h51

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

lolo
lolo
Invité
Répondre à  Aerya
08/01/2019 17h01

Merci Aerya
d’avoir pris le temps de répondre 👍

XxS3BxX
XxS3BxX
Invité
22/08/2019 1h26

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.

Vendetta90
Vendetta90
Invité
20/09/2019 13h47

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).

@++

Vendetta90
Vendetta90
Invité
Répondre à  Aerya
21/09/2019 19h44

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.

Vendetta90
Vendetta90
Invité
Répondre à  Aerya
23/09/2019 20h33

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 ^^

@++

piolet
piolet
Invité
10/11/2019 22h20

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 😉

Jihefge
Jihefge
Invité
03/05/2020 21h13

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 !

jihefge
jihefge
Invité
Répondre à  Aerya
12/05/2020 17h27

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 !

superboki
superboki
Invité
07/05/2020 0h23

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 😉

superboki
superboki
Invité
Répondre à  Aerya
07/05/2020 0h48

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 ^^ )

superboki
superboki
Invité
Répondre à  Aerya
15/05/2020 10h35

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… ^^

Fred
Fred
Invité
Répondre à  Aerya
07/01/2022 11h55

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