Installer Nginx Proxy Manager sur Raspberry Pi avec Docker : guide HTTPS pas à pas

Schéma du flux entre internet, Nginx Proxy Manager et un service Docker sur Raspberry Pi

Vous auto-hébergez plusieurs services Docker sur un Raspberry Pi et les adresses avec des ports deviennent ingérables ? Nginx Proxy Manager permet de les publier derrière des noms de domaine et HTTPS, depuis une interface graphique.

  • Un point d’entrée HTTPS unique pour vos applications maison.
  • Certificats Let’s Encrypt et redirection HTTPS dans l’interface.
  • Installation reproductible avec Docker Compose.

Résultat attendu : https://app.exemple.fr atteint un service de votre Pi avec un certificat valide. Ce guide vise Raspberry Pi OS 64 bits, Debian ou Ubuntu ARM64.

Verdict rapide : pour qui et pourquoi ?

Un proxy inverse reçoit une requête puis l’envoie au bon service interne. NPM ajoute à Nginx une interface pour créer des Proxy Hosts, gérer les certificats et forcer HTTPS. C’est adapté à Home Assistant, Vaultwarden, une application Docker ou un NAS. Il ne remplace ni les sauvegardes ni l’authentification propre à chaque application.

Le proxy reçoit la requête HTTPS puis la transmet uniquement au service choisi.

Prérequis

Élément À prévoir
Système Pi à jour, Docker Engine et plugin Compose fonctionnels
Réseau IP locale stable ; ports 80, 81 et 443 disponibles
Domaine Enregistrement A/AAAA vers votre IP publique pour Let’s Encrypt
Sécurité Deux secrets uniques et une sauvegarde de la stack

Pour un usage uniquement local, un DNS local suffit. En revanche, le défi HTTP de Let’s Encrypt requiert que le domaine soit joignable publiquement sur le port 80. Ne redirigez jamais le port d’administration 81 depuis votre box.

1. Vérifier Docker Compose

docker --version
docker compose version

Si une commande échoue, installez Docker depuis la documentation officielle Docker pour Debian. Vérifiez ensuite que votre utilisateur peut exécuter Docker avant la suite.

2. Créer et démarrer la stack

Créez un dossier, ouvrez compose.yml, puis copiez la configuration suivante. Remplacez tous les secrets avant le démarrage.

mkdir -p ~/stacks/nginx-proxy-manager
cd ~/stacks/nginx-proxy-manager
nano compose.yml
services:
  app:
    image: jc21/nginx-proxy-manager:latest
    restart: unless-stopped
    ports: ["80:80", "81:81", "443:443"]
    environment:
      DB_MYSQL_HOST: db
      DB_MYSQL_PORT: 3306
      DB_MYSQL_USER: npm
      DB_MYSQL_PASSWORD: REMPLACER_PAR_UN_SECRET
      DB_MYSQL_NAME: npm
    volumes: ["./data:/data", "./letsencrypt:/etc/letsencrypt"]
  db:
    image: jc21/mariadb-aria:latest
    restart: unless-stopped
    environment:
      MYSQL_ROOT_PASSWORD: REMPLACER_PAR_UN_AUTRE_SECRET
      MYSQL_DATABASE: npm
      MYSQL_USER: npm
      MYSQL_PASSWORD: REMPLACER_PAR_UN_SECRET
    volumes: ["./mysql:/var/lib/mysql"]
docker compose up -d
docker compose ps
docker compose logs --tail=50 app

Au premier lancement, MariaDB peut nécessiter quelques instants. Attendez que les deux conteneurs soient démarrés avant de diagnostiquer l’interface.

3. Protéger l’interface d’administration

Sur le LAN, ouvrez http://IP_DU_PI:81. Les identifiants initiaux indiqués par le projet sont admin@example.com et changeme ; modifiez-les immédiatement. L’interface :81 doit rester limitée au réseau local, par l’absence de redirection de port et, si besoin, une règle pare-feu.

4. Ajouter un premier Proxy Host

  1. Ouvrez Hosts → Proxy Hosts → Add Proxy Host.
  2. Saisissez, par exemple, app.exemple.fr dans Domain Names.
  3. Choisissez http, puis l’IP LAN du Pi et le port de l’application cible. Exemple Home Assistant : 192.168.1.50, port 8123.
  4. Activez Block Common Exploits ; activez WebSockets seulement si l’application l’exige.
  5. Dans SSL, demandez un certificat Let’s Encrypt, acceptez les conditions et activez Force SSL.

Quand NPM et l’application sont dans des fichiers Compose différents, utilisez l’IP LAN stable ou un réseau Docker externe documenté. N’utilisez pas une IP de conteneur : elle peut changer.

À contrôler après la configuration : accès local, DNS et validité du certificat.

5. Tester puis dépanner

  1. Ouvrez le domaine HTTPS depuis un autre appareil du LAN.
  2. Contrôlez le nom et la date du certificat dans le navigateur.
  3. En cas d’erreur 502, testez d’abord le service cible sur son IP et son port.
  4. Consultez les journaux : docker compose logs --tail=100 app.
  • Certificat refusé : DNS public, port 80, CGNAT ou port déjà occupé sont les causes habituelles.
  • 502 Bad Gateway : protocole, adresse ou port cible erroné.
  • Connexion en boucle : consultez la documentation de l’application ; des en-têtes proxy ou WebSockets peuvent être requis.

Vidéo de prise en main

Cette démonstration complète la procédure ; adaptez toujours les ports et secrets à votre réseau.

Variantes, limites et sauvegarde

Pour un accès personnel, Tailscale ou WireGuard évite d’ouvrir des ports publics. Sauvegardez régulièrement data, letsencrypt et mysql. Caddy et Traefik sont des alternatives adaptées si vous préférez une configuration déclarative plutôt qu’une interface graphique.

Questions fréquentes

Faut-il un Raspberry Pi 5 ?

Non : un Pi 4 64 bits suffit généralement pour quelques services domestiques ; privilégiez un stockage fiable et le réseau filaire.

Peut-on l’utiliser sans domaine ?

Oui en local avec un DNS interne, mais Let’s Encrypt ne délivre pas de certificat public pour une adresse IP privée.

Comment mettre à jour ?

Sauvegardez les volumes, puis exécutez docker compose pull && docker compose up -d après lecture des notes de version.

Sources officielles

Vincent Vandegans — Passionné de Raspberry Pi, Linux et auto-hébergement, il partage des guides concrets pour monter des services maison plus simples et plus sûrs.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *