Docker

Installer Nginx Proxy Manager – Auto Héberger vos services

Nginx Proxy Manager est une solution de reverse proxy, il permet de lier un nom de domaine à un site ou service web et lui fournit un certificat SSL/TLS gratuitement via Let’s Encrypt.

Si vous vous auto-hébergez, c’est un indispensable pour la sécurité de votre homelab car c’est lui qui redirigera les flux entrant sur votre adresse IP public de votre box vers le bon serveur et port logiciel sur votre réseau interne.

Le rôle du Reverse Proxy

Un reverse proxy c’est un serveur intermédiaire entre un client et un serveur. Au lieu de vous connecter directement à un serveur web, vous passerez par lui.

Les intérêts sont nombreux, dans le cadre de l’auto hébergement il permet d’exposer plusieurs serveurs sur internet de manière sécurisée.

Il ne faut pas confondre proxy et reverse proxy. Le proxy fait l’intermédiaire des flux sortant de votre réseau contrairement au reverse proxy qui fait l’intermédiaire sur les flux entrant.

Pourquoi le choix de Nginx Proxy Manager

Le marché du reverse proxy est assez grand, l’avantage outre l’installation simple via docker de cette solution est l’intégration avec Let’s Encrypt pour certifier nos sites (le fameux cadenas). Et il s‘administre via une interface web qui c’est son gros atout, pour les novices c’est une excellente solution clé en main.

Disclaimer

Attention auto héberger ces serveurs et exposer ces sites web et services sur internet peut paraître excitant à première vue. Un reverse proxy ajoute une sécurité certes non négligeable mais il y a plein d’autres paramètres à prendre en compte.

Je ne peux que vous conseiller d’avoir au grand minimum une DMZ sur votre réseau. Je fais l’impasse sur tout ce qui est de la sécurité de vos serveurs physiquement mais encore la sécurité niveau de l’OS (mot de passe, mise à jour, etc). Le sujet est vaste et complet.

Une bonne infrastructure et compétences sont requises pour s’auto héberger. Si l’infrastructure vous fait défaut, vous pouvez louer un VPS ou serveur dédié. Je viendrai sur le sujet plus global de l’auto hébergement dans un autre article.

Pour ceux qui souhaitent s’auto héberger ou monter un reverse proxy temporaire pour monter en compétences, on commence avec les nombreux prérequis :

Prérequis

J’utilise la même machine sur laquelle j’ai effectué le tuto d’installation de docker et de portainer. Par conséquent j’hérite d’un Debian 11.

Voici la liste des prérequis (j’ai déjà créer du contenue sur la plupart de ces prérequis) :

  • Une adresse IP statique
  • Docker et portainer d’installer
  • Avoir un nom de domaine chez un fournisseur
  • Un service DDNS (si votre IP public n’est pas fixe)
  • Rediriger les ports 80 et 443 de votre box/routeur sur la machine hôte.

Redirection des ports 80 et 443

Cette redirection permettra de rediriger le trafic entrant sur les ports 80 et 443 (respectivement http et https) de votre IP public vers le serveur reverse proxy qui lui rédige la requête selon sur le bon serveur.

Il ne met pas possible d’effectuer un tuto précis sur cette étape car cela dépend de votre infrastructure. Je vous incite à rechercher sur internet en fonction de votre box ou routeur. Néanmoins je vous fournis une aide si vous avez une box orange ou un routeur Pfsense ci-dessous.

Redirection NAT sur une livebox

Ici j’ai deux règles : une pour le protocole http, l’autre https que je fais rediriger vers mon serveur en 192.168.20.2 qui est mon serveur où j’installe nginx proxy manager.

Redirection NAT sur pfsense

Même chose sur pfsense.

Installer Nginx Proxy Manager

Je considère que l’adresse IP du serveur est bien statique et que docker ainsi que portainer sont installés.

Allez sur votre interface web portainer et dans l’onglet « Stack » pour déployer la stack nginx proxy manager.

Copier le code suivant dans votre nouvelle stack :

Vous pouvez modifier les chemins des volumes au besoin. N’oubliez pas de modifier les variables d’environnement liées à la base de données.

version: '3'
services:
  nginx:
    image: 'jc21/nginx-proxy-manager:latest'
    container_name: nginx
    ports:
      - '80:80' # ne pas modifier
      - '81:81'
      - '443:443' # ne pas modifier
    restart: unless-stopped
    environment:
      DB_MYSQL_HOST: "db"
      DB_MYSQL_PORT: 3306
      DB_MYSQL_USER: "utilisateur" # à modifier
      DB_MYSQL_PASSWORD: "mdp" # à modifier
      DB_MYSQL_NAME: "nginx"
    volumes:
      - /srv/docker/nginx-proxy-manager/data:/data
      - /srv/docker/nginx-proxy-manager/letsencrypt:/etc/letsencrypt
    depends_on:
      - db
  db:
    image: 'jc21/mariadb-aria:latest'
    container_name: nginx-db
    restart: unless-stopped
    environment:
      MYSQL_ROOT_PASSWORD: 'npm' # à modifier
      MYSQL_DATABASE: 'nginx'
      MYSQL_USER: 'utilisateur' # à modifier
      MYSQL_PASSWORD: 'mdp' # à modifier
    volumes:
      - /srv/docker/nginx-proxy-manager/mysql:/var/lib/mysql

Une fois la stack prête, vous pouvez la déployer.

Si vous n’avez pas modifier la redirection du port 81, l’interface web de nginx proxy manager sera accessible sur celui-ci. Dans votre navigateur connecter vous selon l’adresse IP de votre machine hôte : http://votre_ip:81

installer nginx proxy manager

les identifiants par défaut sont : admin@example.com et « changeme » pour le mot de passe

Une fois connecté, il vous faudra créer un utilisateur

Puis changer le mot de passe de défaut.

Ajout d’un site

Pour ce tuto, on va rediriger le nom de domaine : nginxproxymanager.zatoufly.ovh vers l’interface web de nginx proxy manager.

Votre nom de domaine/sous domaine devra bien pointer vers votre DDNS dans le cas d’une installation avec une adresse IP dynamique. J’ai déjà fait un article et une vidéo à ce sujet.

Pour ma part le nom de domaine nginxproxymanager.zatoufly.ovh est redirigé avec un enregistrement de type CNAME où j’ai fourni mon nom de domaine DDNS.

Allez dans « Dashboard » et dans « Proxy Hosts » et ajoutez un nouveau « Proxy Host »

Tout d’abord dans « Domain Names » je renseigne le nom de sous domaine souhaité.

Le Scheme est très important, si le site web que vous souhaitez rendre public est en https, mettez y le scheme https. Dans mon cas, l’interface web de nginx proxy manager est en http.

Dans « Forward Hostname/IP » je mets l’adresse IP où sera redirigée la requête. Puis dans « Forward Port » même chose avec le Port, dans mon cas le port 81.

Pour résumer ce Proxy Host : Si une requête DNS arrive avec le domaine nginxproxymanager.zatoufly.ovh alors je le redirige vers l’ip 192.168.20.2 sur le port 81.

Ensuite, allez dans l’onglet « SSL ». Ici envoyé une requête à Let’s Encrypt pour certifié vers site web en https, c’est pour avoir le fameux cadenas.

N’oubliez pas d’accepter les termes d’utilisation de Let’s Encrypt. Pour rediriger automatiquement les requêtes http en https, cochez l’option « Force SSL ».

Vous pouvez sauvegarder. Normalement vous obtiendrez un Proxy Host avec le Status « Online »

Maintenant il nous reste qu’à tester si l’on a bien accès à mon nom de domaine sur internet.

Sur mon navigateur je tape donc « nginxproxymanager.zatoufly.ovh » et je tombe sur l’interface web de nginx proxy manager.

Nous avons vue comment installer Nginx Proxy Manager et ajouter des Proxy Host pour exposer ces sites ou services sur internet.

Pour résumer grossièrement le chemin effectué lorsque je me connecter un mon site depuis internet :

J’effectue une requête DNS sur le nom de domaine « nginxproxymanager.zatoufly.ovh » qui redirige vers « maisontest.duckdns.org » qui est mon DDNS. Ce dernier envoie la requête vers mon IP public, grâce au NAT et à l’exposition des ports du conteneur on atterrit sur le reverse proxy conteneurisé via docker. Et enfin le reverse proxy nous envoie vers le bon serveur sur votre réseau interne.

Jérémy Taunay

🪪 Be smarter everyday | 🏮 Less is more | 🐧Tech systèmes et réseaux | 🖥️ Homelaber