Un stack Docker prêt pour la production pour Portainer CE avec une intégration complète de Traefik v2+, support HTTPS/SSL et fonctionnalités de sécurité modernes.
- Fonctionnalités
- Prérequis
- Installation
- Configuration
- Labels Traefik
- Utilisation
- Sécurité
- Dépannage
- Licence
- ✅ Portainer CE - Interface moderne de gestion Docker
- ✅ Intégration Traefik - Routage automatique et certificats SSL
- ✅ Let's Encrypt - Certificats HTTPS automatiques
- ✅ Stockage persistant - Les données persistent lors des mises à jour
- ✅ Prêt pour production - Bonnes pratiques pour sécurité et performance
- Docker Engine 20.10+
- Docker Compose v2.0+
- Proxy inverse Traefik v2+ en cours d'exécution
- Domaine avec enregistrement DNS pointant vers votre serveur
Le stack nécessite un réseau Docker externe pour Traefik :
docker network create traefik_proxy_networkCe stack utilise les middlewares Traefik suivants (optionnel) :
redirect-to-https@file- Redirection HTTP → HTTPSgeo-block@file- Géo-blocage (23 pays à haut risque)security-headers@file- En-têtes de sécurité (HSTS, X-Frame-Options)compression@file- Compression Gzip/Brotlirate-limit@file- Protection DoS (100 req/s)
Si ces middlewares ne sont pas disponibles, supprimez-les des labels ou créez-les dans votre traefik-dynamic.yaml.
git clone https://github.com/csaeum/DockerStackPortainer.git
cd DockerStackPortainercp .env.example .env
nano .envAjustez les valeurs dans .env :
COMPOSE_PROJECT_NAME=portainer
HOSTRULE=Host(`portainer.votre-domaine.fr`)
PROXY_NETWORK=traefik_proxy_network
RESTART=unless-stoppeddocker-compose up -d- Ouvrez
https://portainer.votre-domaine.frdans votre navigateur - Créez un utilisateur admin (mot de passe min. 12 caractères)
- Sélectionnez "Docker Standalone" comme environnement
- Terminé ! Vous pouvez maintenant gérer les conteneurs Docker
Le stack utilise la configuration suivante :
volumes:
portainer_data:
driver: local
driver_opts:
device: ${PWD}/volumes # Stockage persistant
o: bind
type: none
services:
portainer:
image: portainer/portainer-ce:lts
command: -H unix:///var/run/docker.sock
container_name: ${COMPOSE_PROJECT_NAME}
networks:
- ${PROXY_NETWORK}
restart: ${RESTART}
volumes:
- portainer_data:/data
- /var/run/docker.sock:/var/run/docker.sock # Accès DockerLes données Portainer sont stockées dans ./volumes/ :
- Utilisateurs, équipes, rôles
- Paramètres et configurations
- Modèles de conteneurs
- Registres
Important : Sauvegardez régulièrement ce dossier !
labels:
- traefik.enable=true
- traefik.http.routers.${COMPOSE_PROJECT_NAME}.rule=${HOSTRULE}
- traefik.http.routers.${COMPOSE_PROJECT_NAME}.entrypoints=websecure-https
- traefik.http.routers.${COMPOSE_PROJECT_NAME}.tls.certresolver=letsEncrypt
- traefik.http.services.${COMPOSE_PROJECT_NAME}.loadBalancer.server.port=9000Pour une sécurité maximale, ajoutez les labels suivants :
labels:
- traefik.enable=true
# Routeur HTTP (pour redirection HTTPS)
- traefik.http.routers.${COMPOSE_PROJECT_NAME}-http.rule=${HOSTRULE}
- traefik.http.routers.${COMPOSE_PROJECT_NAME}-http.entrypoints=web-http
- traefik.http.routers.${COMPOSE_PROJECT_NAME}-http.middlewares=redirect-to-https@file
# Routeur HTTPS
- traefik.http.routers.${COMPOSE_PROJECT_NAME}.rule=${HOSTRULE}
- traefik.http.routers.${COMPOSE_PROJECT_NAME}.entrypoints=websecure-https
- traefik.http.routers.${COMPOSE_PROJECT_NAME}.tls.certresolver=letsEncrypt
- traefik.http.routers.${COMPOSE_PROJECT_NAME}.tls.options=modern@file
- traefik.http.routers.${COMPOSE_PROJECT_NAME}.middlewares=geo-block@file,security-headers@file,compression@file,rate-limit@file
- traefik.http.services.${COMPOSE_PROJECT_NAME}.loadBalancer.server.port=9000Avantages :
- ✅ Redirection automatique HTTP → HTTPS
- ✅ TLS 1.3 forcé
- ✅ Géo-blocage contre les pays à haut risque
- ✅ HSTS et en-têtes de sécurité
- ✅ Protection contre force brute via rate-limiting
# Démarrer le stack
docker-compose up -d
# Voir les logs
docker-compose logs -f
# Arrêter le stack
docker-compose down
# Redémarrer le stack
docker-compose restart
# Supprimer le stack avec volumes (ATTENTION !)
docker-compose down -v# Arrêter Portainer
docker-compose down
# Créer la sauvegarde
tar -czf portainer-backup-$(date +%Y%m%d).tar.gz volumes/
# Redémarrer le stack
docker-compose up -d# Arrêter le stack
docker-compose down
# Supprimer anciennes données
rm -rf volumes/*
# Restaurer la sauvegarde
tar -xzf portainer-backup-YYYYMMDD.tar.gz
# Démarrer le stack
docker-compose up -d- Mot de passe admin fort - Min. 16 caractères, caractères spéciaux, chiffres
- Activer 2FA - Dans Portainer : User → My account → Enable 2FA
- Utiliser le géo-blocage - Middleware Traefik
geo-block@file - Rate-limiting - Protection contre les attaques par force brute
- Mises à jour régulières -
docker-compose pull && docker-compose up -d - Liste blanche IP - Si vous accédez toujours depuis la même IP
Créez un middleware Traefik :
# Dans traefik-dynamic.yaml
http:
middlewares:
portainer-ip-whitelist:
ipWhiteList:
sourceRange:
- "192.168.1.0/24" # Votre réseau local
- "1.2.3.4/32" # Votre IP bureauAjoutez-le aux labels :
- traefik.http.routers.${COMPOSE_PROJECT_NAME}.middlewares=portainer-ip-whitelist@file,geo-block@file,security-headers@filePortainer nécessite l'accès à /var/run/docker.sock - cela signifie accès root complet à l'hôte Docker !
Important :
- Ne jamais exposer Portainer publiquement sans authentification
- Accorder l'accès admin Portainer uniquement aux utilisateurs de confiance
- Vérifier régulièrement les journaux d'audit
Cause : Conteneur pas dans le réseau Traefik
# Vérifier le réseau
docker network inspect traefik_proxy_network
# Redémarrer le conteneur
docker-compose down && docker-compose up -dCause : Port 9000 incorrect ou conteneur ne fonctionne pas
# Vérifier le statut du conteneur
docker-compose ps
# Vérifier les logs
docker-compose logs portainer
# Inspecter le réseau du conteneur
docker exec -it portainer shCause : DNS ne pointe pas vers votre serveur ou limite de taux atteinte
# Vérifier DNS
dig portainer.votre-domaine.fr +short
# Vérifier les logs Traefik
docker logs traefik 2>&1 | grep -i acmeCause : Cookies de session invalides après redémarrage du conteneur
# Vider le cache du navigateur
# Ou : Utiliser une fenêtre privée/incognito- Version Portainer :
portainer/portainer-ce:lts - Port requis : 9000 (interne uniquement, accessible via Traefik)
- Volumes :
./volumes/(bind-mount) - Réseau :
traefik_proxy_network(externe)
Les contributions sont les bienvenues ! Veuillez créer une pull request ou ouvrir une issue.
Ce projet est sous licence GPL-3.0-or-later - voir LICENSE pour plus de détails.
Fait avec ❤️ par WSC - Web SEO Consulting
Ce projet est gratuit et open source. S'il vous a aidé, j'apprécie votre soutien :