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.

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
- Ouvrez Hosts → Proxy Hosts → Add Proxy Host.
- Saisissez, par exemple,
app.exemple.frdans Domain Names. - Choisissez http, puis l’IP LAN du Pi et le port de l’application cible. Exemple Home Assistant :
192.168.1.50, port8123. - Activez Block Common Exploits ; activez WebSockets seulement si l’application l’exige.
- 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.

5. Tester puis dépanner
- Ouvrez le domaine HTTPS depuis un autre appareil du LAN.
- Contrôlez le nom et la date du certificat dans le navigateur.
- En cas d’erreur 502, testez d’abord le service cible sur son IP et son port.
- 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.




