- Documentation complète pour Nginx Proxy Manager (docs/10-configuration-nginx-proxy-manager.md) - Script get-npm-token.sh pour générer automatiquement les tokens API - Exemple complet de .woodpecker.yml avec logique inline de déploiement - Documentation déploiement applications avec URLs dynamiques (docs/09-deploiement-applications.md) - Script deploy.sh comme alternative optionnelle - Mise à jour README avec références aux nouvelles documentations
10 KiB
Configuration Nginx Proxy Manager
Ce guide explique comment configurer Nginx Proxy Manager (NPM) pour l'utiliser avec le déploiement automatique d'applications via Woodpecker CI.
Vue d'ensemble
Nginx Proxy Manager permet de :
- Gérer facilement les reverse proxies
- Configurer automatiquement les certificats SSL avec Let's Encrypt
- Sécuriser l'accès aux applications avec des Access Lists
- Automatiser la configuration via l'API
Installation
Via Docker Compose
version: "3.9"
services:
npm:
image: 'jc21/nginx-proxy-manager:latest'
container_name: nginx-proxy-manager
restart: unless-stopped
ports:
- '80:80' # HTTP
- '443:443' # HTTPS
- '81:81' # Interface d'administration
volumes:
- npm-data:/data
- npm-letsencrypt:/etc/letsencrypt
networks:
- gitgit_syoul_fr_gitea_net
volumes:
npm-data:
npm-letsencrypt:
networks:
gitgit_syoul_fr_gitea_net:
external: true
Accès initial
- Accédez à l'interface :
http://[IP-serveur]:81 - Identifiants par défaut :
- Email :
admin@example.com - Mot de passe :
changeme
- Email :
- IMPORTANT : Changez immédiatement le mot de passe !
Configuration de l'API
Obtenir un token API
Nginx Proxy Manager ne propose pas d'interface graphique pour créer des tokens API. Il faut utiliser l'API directement.
Méthode 1 : Via curl
curl -X POST http://192.168.42.144:81/api/tokens \
-H "Content-Type: application/json" \
-d '{
"identity": "votre_email@example.com",
"secret": "votre_mot_de_passe"
}'
Réponse attendue :
{
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"token_name": "API Token",
"expires_at": null
}
Méthode 2 : Script automatique
Créez un script get-npm-token.sh :
#!/bin/bash
# get-npm-token.sh - Génère un token API pour Nginx Proxy Manager
set -e
NPM_URL=${1:-"http://localhost:81"}
EMAIL=${2:-"admin@example.com"}
echo "Génération du token API pour Nginx Proxy Manager..."
echo "URL: ${NPM_URL}"
echo "Email: ${EMAIL}"
echo ""
# Demander le mot de passe de manière sécurisée
read -sp "Mot de passe: " PASSWORD
echo ""
# Obtenir le token
RESPONSE=$(curl -s -X POST "${NPM_URL}/api/tokens" \
-H "Content-Type: application/json" \
-d "{
\"identity\": \"${EMAIL}\",
\"secret\": \"${PASSWORD}\"
}")
# Extraire le token
TOKEN=$(echo "${RESPONSE}" | jq -r '.token')
if [ "${TOKEN}" = "null" ] || [ -z "${TOKEN}" ]; then
echo "❌ Erreur lors de la génération du token"
echo "Réponse: ${RESPONSE}"
exit 1
fi
echo "✅ Token généré avec succès !"
echo ""
echo "Token: ${TOKEN}"
echo ""
echo "Pour l'utiliser dans Woodpecker CI :"
echo "1. Allez dans Woodpecker > Settings > Secrets"
echo "2. Ajoutez NPM_API_TOKEN avec la valeur ci-dessus"
echo "3. Ajoutez NPM_API_URL avec la valeur: ${NPM_URL}"
Usage :
chmod +x get-npm-token.sh
./get-npm-token.sh http://192.168.42.144:81 votre_email@example.com
Tester le token
Vérifiez que le token fonctionne :
TOKEN="votre-token-ici"
NPM_URL="http://192.168.42.144:81"
# Lister les proxy hosts
curl -H "Authorization: Bearer ${TOKEN}" \
"${NPM_URL}/api/nginx/proxy-hosts"
# Obtenir les détails d'un proxy host
curl -H "Authorization: Bearer ${TOKEN}" \
"${NPM_URL}/api/nginx/proxy-hosts/1"
Configuration dans Woodpecker CI
Ajouter les secrets
- Connectez-vous à Woodpecker CI (
https://ci.syoul.fr) - Allez dans Settings > Secrets
- Ajoutez les secrets suivants :
| Secret | Valeur | Description |
|---|---|---|
NPM_API_URL |
http://192.168.42.144:81 |
URL de votre Nginx Proxy Manager |
NPM_API_TOKEN |
votre-token-api |
Token obtenu via l'API |
DOMAIN_BASE |
syoul.fr |
Domaine de base pour les URLs (optionnel) |
URL interne vs externe
Si Nginx Proxy Manager est dans le même réseau Docker que vos applications :
Utilisez l'URL interne :
NPM_API_URL=http://npm-manager:81 # Nom du conteneur
Ou l'IP interne :
NPM_API_URL=http://172.18.0.X:81 # IP du conteneur
Pour trouver le nom/IP du conteneur :
docker ps | grep nginx-proxy-manager
docker inspect nginx-proxy-manager | grep IPAddress
Utilisation de l'API
Créer un proxy host
curl -X POST "${NPM_API_URL}/api/nginx/proxy-hosts" \
-H "Authorization: Bearer ${NPM_API_TOKEN}" \
-H "Content-Type: application/json" \
-d '{
"domain_names": ["mon-app.syoul.fr"],
"forward_scheme": "http",
"forward_host": "172.18.0.10",
"forward_port": 3000,
"ssl_forced": true,
"hsts_enabled": true,
"hsts_subdomains": true,
"block_exploits": true,
"caching_enabled": true,
"allow_websocket_upgrade": true
}'
Mettre à jour un proxy host
PROXY_ID=1 # ID du proxy host
curl -X PUT "${NPM_API_URL}/api/nginx/proxy-hosts/${PROXY_ID}" \
-H "Authorization: Bearer ${NPM_API_TOKEN}" \
-H "Content-Type: application/json" \
-d '{
"forward_host": "172.18.0.11",
"forward_port": 3000
}'
Supprimer un proxy host
PROXY_ID=1
curl -X DELETE "${NPM_API_URL}/api/nginx/proxy-hosts/${PROXY_ID}" \
-H "Authorization: Bearer ${NPM_API_TOKEN}"
Lister tous les proxy hosts
curl -H "Authorization: Bearer ${NPM_API_TOKEN}" \
"${NPM_API_URL}/api/nginx/proxy-hosts" | jq
Intégration avec le déploiement automatique
Dans .woodpecker.yml
Le pipeline Woodpecker utilise automatiquement ces secrets pour configurer les reverse proxies :
pipeline:
deploy:
environment:
- NPM_API_URL=${NPM_API_URL} # Secret Woodpecker
- NPM_API_TOKEN=${NPM_API_TOKEN} # Secret Woodpecker
- DOMAIN_BASE=${DOMAIN_BASE:-syoul.fr}
commands:
# ... configuration automatique du proxy ...
Voir Déploiement d'applications pour plus de détails.
Configuration SSL
Certificats Let's Encrypt
Nginx Proxy Manager peut automatiquement obtenir des certificats SSL via Let's Encrypt :
- Allez dans SSL Certificates
- Cliquez sur Add SSL Certificate
- Sélectionnez Let's Encrypt
- Entrez le domaine (ex:
mon-app.syoul.fr) - Cochez Use a DNS Challenge si nécessaire
- Le certificat sera automatiquement renouvelé
Forcer HTTPS
Dans la configuration du proxy host, activez :
- SSL : Certificat SSL
- Force SSL : Redirige automatiquement HTTP vers HTTPS
- HSTS Enabled : Active HTTP Strict Transport Security
Access Lists (Listes de contrôle d'accès)
Créer une Access List
- Allez dans Access Lists
- Cliquez sur Add Access List
- Configurez :
- Name : Nom de la liste
- Satisfy :
any(au moins une règle) ouall(toutes les règles) - Rules : Ajoutez des règles d'autorisation
Types de règles
- IP Address : Autoriser/bloquer des IPs spécifiques
- Basic Auth : Authentification HTTP basique
- Client Certificate : Authentification par certificat client
Appliquer une Access List
Dans la configuration du proxy host :
- Allez dans Advanced > Access List
- Sélectionnez votre Access List
- Sauvegardez
Bonnes pratiques
1. Sécurité
- ✅ Changez le mot de passe par défaut immédiatement
- ✅ Utilisez des tokens API avec expiration si possible
- ✅ Limitez l'accès à l'interface d'administration (firewall)
- ✅ Utilisez HTTPS pour l'interface d'administration si exposée
2. Organisation
- ✅ Utilisez des noms de domaines cohérents
- ✅ Documentez les proxy hosts créés manuellement
- ✅ Utilisez des Access Lists pour sécuriser les applications sensibles
3. Monitoring
- ✅ Surveillez les logs dans Audit Log
- ✅ Vérifiez régulièrement les certificats SSL
- ✅ Monitor les performances des reverse proxies
Dépannage
Le token API ne fonctionne pas
- Vérifiez que l'email et le mot de passe sont corrects
- Vérifiez que l'URL est accessible :
curl http://192.168.42.144:81/api/nginx/proxy-hosts - Vérifiez les permissions de l'utilisateur dans NPM
Erreur "401 Unauthorized"
- Le token est invalide ou expiré
- Régénérez un nouveau token
- Vérifiez que le header
Authorization: Bearerest correct
Erreur "Cannot connect to NPM API"
- Vérifiez que NPM est accessible depuis le conteneur Woodpecker
- Utilisez l'URL interne si dans le même réseau Docker
- Vérifiez les règles de firewall
Le proxy host n'est pas créé
- Vérifiez les logs de Woodpecker
- Vérifiez que le domaine n'existe pas déjà
- Vérifiez les permissions du token API
- Testez manuellement la création via curl
Exemples
Script complet de déploiement avec NPM
#!/bin/bash
# deploy-with-npm.sh
APP_NAME="mon-app"
APP_PORT=3000
APP_IP="172.18.0.10"
APP_URL="${APP_NAME}.syoul.fr"
NPM_API_URL="http://npm-manager:81"
NPM_API_TOKEN="votre-token"
# Vérifier si le proxy existe
EXISTING_PROXY=$(curl -s -H "Authorization: Bearer ${NPM_API_TOKEN}" \
"${NPM_API_URL}/api/nginx/proxy-hosts" | \
jq -r ".[] | select(.domain_names[] == \"${APP_URL}\") | .id" | head -1)
PROXY_DATA=$(cat <<EOF
{
"domain_names": ["${APP_URL}"],
"forward_scheme": "http",
"forward_host": "${APP_IP}",
"forward_port": ${APP_PORT},
"ssl_forced": true,
"hsts_enabled": true,
"hsts_subdomains": true,
"block_exploits": true,
"caching_enabled": true,
"allow_websocket_upgrade": true
}
EOF
)
if [ -n "${EXISTING_PROXY}" ]; then
echo "Mise à jour du proxy existant..."
curl -X PUT "${NPM_API_URL}/api/nginx/proxy-hosts/${EXISTING_PROXY}" \
-H "Authorization: Bearer ${NPM_API_TOKEN}" \
-H "Content-Type: application/json" \
-d "${PROXY_DATA}"
else
echo "Création d'un nouveau proxy..."
curl -X POST "${NPM_API_URL}/api/nginx/proxy-hosts" \
-H "Authorization: Bearer ${NPM_API_TOKEN}" \
-H "Content-Type: application/json" \
-d "${PROXY_DATA}"
fi
echo "✅ Proxy configuré pour ${APP_URL}"