Déployer Nginx Proxy Manager via Docker Compose pour gérer un reverse proxy avec une interface web (sans HTTPS ni certificat).
nextcloud.labo.local dans son navigateur, le reverse proxy sait qu'il doit envoyer la requête vers le container Nextcloud (port 8081). Ça permet d'avoir un seul point d'entrée (port 80) pour plusieurs applications. Nginx Proxy Manager ajoute une interface graphique pour configurer tout ça sans toucher aux fichiers de config.
*.labo.local utilisés dans ce tuto sont des exemples. Remplacez-les par vos propres noms de domaine de test. L'IP 192.168.1.50 dans le fichier hosts doit être remplacée par l'IP réelle de votre machine Windows (ipconfig dans PowerShell).
# Créer le dossier du projet (-p = crée les sous-dossiers si besoin)
mkdir -p ~/nginx-proxy-manager
# Se déplacer dans le dossier
cd ~/nginx-proxy-manager
# Ouvrir le dossier dans VS Code pour éditer les fichiers
code .
Ce fichier déploie Nginx Proxy Manager + des applications web de test à proxifier. Tous les volumes sont en ./data/ pour rester dans le même dossier.
Créez le fichier docker-compose.yml dans VS Code :
services:
# ========================
# NGINX PROXY MANAGER
# ========================
npm:
image: jc21/nginx-proxy-manager:latest
container_name: nginx-proxy-manager
restart: unless-stopped
ports:
- "80:80" # Port HTTP public
- "81:81" # Interface d'administration
environment:
DISABLE_IPV6: "true"
volumes:
- ./data/npm:/data
- ./data/npm-letsencrypt:/etc/letsencrypt
networks:
- proxy-net
# ========================
# APP 1 : Site statique
# ========================
site1:
image: nginx:alpine
container_name: site1
restart: unless-stopped
volumes:
- ./site1:/usr/share/nginx/html:ro
networks:
- proxy-net
# ========================
# APP 2 : WordPress
# ========================
wordpress-db:
image: mariadb:10.11
container_name: wp-db
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: Password
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: Password
volumes:
- ./data/wp-db:/var/lib/mysql
networks:
- proxy-net
wordpress:
image: wordpress:latest
container_name: wordpress
restart: unless-stopped
environment:
WORDPRESS_DB_HOST: wordpress-db
WORDPRESS_DB_NAME: wordpress
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: Password
volumes:
- ./data/wordpress:/var/www/html
depends_on:
- wordpress-db
networks:
- proxy-net
# ========================
# APP 3 : Portainer
# ========================
portainer:
image: portainer/portainer-ce:latest
container_name: portainer
restart: unless-stopped
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- ./data/portainer:/data
networks:
- proxy-net
networks:
proxy-net:
driver: bridge
Créez le dossier site1/ et le fichier site1/index.html dans VS Code :
<!DOCTYPE html>
<html>
<head><title>Site 1</title></head>
<body style="font-family:Arial;text-align:center;padding:60px;background:#1a1a2e;color:#eee;">
<h1 style="color:#7ecfff;">Site 1</h1>
<p>Ce site est servi via Nginx Proxy Manager.</p>
</body>
</html>
# Lancer tous les services en arrière-plan
# -d = "detached" → le terminal reste libre
# Docker va télécharger les images puis créer les conteneurs
docker compose up -d
# Afficher l'état de chaque conteneur de la stack
# Tous doivent être "Up" (en cours d'exécution)
docker compose ps
Tous les containers doivent être en état Up.
Ouvrez un navigateur et allez sur :
http://localhost:81
| Champ | Valeur |
|---|---|
[email protected] |
|
| Password | changeme |
Au premier login, vous serez invité à changer l'email et le mot de passe.
Dans l'interface NPM, cliquez sur Hosts → Proxy Hosts → Add Proxy Host.
| Champ | Valeur |
|---|---|
| Domain Names | site1.labo.local |
| Scheme | http |
| Forward Hostname / IP | site1 (nom du container) |
| Forward Port | 80 |
| Champ | Valeur |
|---|---|
| Domain Names | wordpress.labo.local |
| Scheme | http |
| Forward Hostname / IP | wordpress |
| Forward Port | 80 |
| Champ | Valeur |
|---|---|
| Domain Names | portainer.labo.local |
| Scheme | http |
| Forward Hostname / IP | portainer |
| Forward Port | 9000 |
Pour que les noms de domaine pointent vers votre serveur, configurez-les dans votre DNS :
Ouvrez un terminal PowerShell en administrateur et éditez le fichier hosts :
# Ouvrir le fichier hosts dans le Bloc-notes (en mode admin !)
# Ce fichier permet de forcer la résolution d'un nom → IP
# Sans ça, votre PC ne saura pas où envoyer "site1.labo.local"
notepad C:\Windows\System32\drivers\etc\hosts
Ajoutez ces lignes (remplacez l'IP par celle de votre machine, voir ipconfig) :
# ⭐ Remplacez 192.168.x.x par l'IP réelle de votre PC Windows
# Chaque ligne dit : "quand je tape ce nom, va à cette IP"
# C'est comme un annuaire local qui court-circuite le DNS
192.168.1.50 site1.labo.local
192.168.1.50 wordpress.labo.local
192.168.1.50 portainer.labo.local
Ou créez des enregistrements A dans votre serveur DNS Windows (voir le tuto DNS).
Depuis un poste client :
# Tester Site 1 depuis le terminal
# curl = outil qui fait une requête HTTP (comme un navigateur en texte)
# Si ça affiche du HTML, le reverse proxy fonctionne !
curl http://site1.labo.local
# Ouvrir dans le navigateur pour voir le résultat visuel
# Chaque URL passe par NPM (port 80) qui redirige vers le bon conteneur
http://site1.labo.local → Site statique (conteneur site1, port 80)
http://wordpress.labo.local → WordPress (conteneur wordpress, port 80)
http://portainer.labo.local → Portainer (conteneur portainer, port 9000)
Nginx Proxy Manager routera automatiquement chaque requête vers le bon container en fonction du nom de domaine.
nginx-proxy-manager/
├── docker-compose.yml
├── site1/
│ └── index.html
└── data/
├── npm/ # Config Nginx Proxy Manager
├── npm-letsencrypt/ # Certificats (vide en HTTP)
├── wp-db/ # Base de données WordPress
├── wordpress/ # Fichiers WordPress
└── portainer/ # Données Portainer
./data/, visible dans VS Code.