docker stack via git

This commit is contained in:
kinou-p 2025-10-02 17:02:26 +02:00
parent 88a4fddf17
commit fa5b9135ae
5 changed files with 739 additions and 1 deletions

20
.env.portainer.example Normal file
View File

@ -0,0 +1,20 @@
# Variables d'environnement pour Portainer
# Copiez ces variables dans la section "Environment variables" de votre Stack Portainer
# Google Tag Manager ID
GTM_ID=GTM-5V6TCG4C
# Environnement (production/development)
NODE_ENV=production
# Domaine principal (utilisé par Traefik)
PRIMARY_DOMAIN=alexandre-pommier.com
SECONDARY_DOMAIN=www.alexandre-pommier.com
# Configuration Nginx (optionnel)
NGINX_WORKER_PROCESSES=auto
NGINX_WORKER_CONNECTIONS=1024
# Configuration du cache (optionnel)
CACHE_STATIC_ASSETS=31536000
CACHE_HTML=no-cache

315
PORTAINER_DEPLOYMENT.md Normal file
View File

@ -0,0 +1,315 @@
# 🚀 Guide de Déploiement sur Portainer
## 📋 Prérequis
1. Portainer installé et accessible
2. Traefik configuré avec le réseau `portfolio`
3. Git installé sur le serveur Docker
4. Accès à votre repository GitHub
---
## 🔧 Option 1 : Déploiement via Stack Portainer (Recommandé)
### Étape 1 : Connexion à Portainer
1. Ouvrez votre interface Portainer (ex: https://portainer.votredomaine.com)
2. Connectez-vous avec vos identifiants
### Étape 2 : Créer une nouvelle Stack
1. Dans le menu de gauche, cliquez sur **"Stacks"**
2. Cliquez sur **"+ Add stack"**
3. Donnez un nom : `portfolio-website`
### Étape 3 : Configuration de la Stack
**Option A - Déploiement depuis Git (Recommandé) :**
1. Sélectionnez **"Repository"** sous "Build method"
2. Remplissez les champs :
- **Repository URL** : `https://github.com/kinou-p/portfolio-website`
- **Repository reference** : `refs/heads/main`
- **Compose path** : `docker-compose.yml`
3. **Si votre repository est PRIVÉ** :
**Méthode 1 - Personal Access Token (Recommandé) :**
- ✅ Cochez **"Authentication"**
- **Username** : `kinou-p`
- **Personal Access Token** : Votre token GitHub (ex: `ghp_xxxxxxxxxxxx`)
Pour créer un token :
- GitHub → Settings → Developer settings → Personal access tokens → Tokens (classic)
- Generate new token → Cochez `repo` → Generate
**Méthode 2 - SSH Deploy Key (Plus sécurisé) :**
- Repository URL : `git@github.com:kinou-p/portfolio-website.git`
- Authentication : SSH
- Collez votre clé SSH privée
Pour créer une deploy key :
```bash
ssh-keygen -t ed25519 -C "portainer" -f ~/.ssh/portainer_deploy
# Ajoutez la clé publique (.pub) dans GitHub → Settings → Deploy keys
```
4. **Si votre repository est PUBLIC** :
- Pas besoin d'authentification
- Laissez "Authentication" décoché
**Option B - Copier/Coller le docker-compose.yml :**
1. Sélectionnez **"Web editor"**
2. Copiez-collez le contenu du fichier `docker-compose.yml`
### Étape 4 : Variables d'environnement (optionnel)
Cliquez sur **"Advanced mode"** et ajoutez si nécessaire :
```
GTM_ID=GTM-5V6TCG4C
NODE_ENV=production
```
### Étape 5 : Déployer
1. Vérifiez que le réseau `portfolio` existe
2. Cliquez sur **"Deploy the stack"**
3. Attendez la fin du build (peut prendre 2-5 minutes)
### Étape 6 : Vérification
1. Allez dans **"Containers"**
2. Vérifiez que `portfolio-website` est **"running"** (vert)
3. Cliquez sur le container pour voir les logs
4. Testez votre site : https://alexandre-pommier.com
---
## 🔧 Option 2 : Déploiement via Container Portainer
### Étape 1 : Construire l'image en local
```bash
# Sur votre machine locale
cd /path/to/portfolio-website
docker build -t portfolio-website:latest .
# Tag pour votre registry (optionnel)
docker tag portfolio-website:latest votre-registry/portfolio-website:latest
# Push vers votre registry
docker push votre-registry/portfolio-website:latest
```
### Étape 2 : Créer le container dans Portainer
1. Dans Portainer, allez dans **"Containers"**
2. Cliquez sur **"+ Add container"**
3. Remplissez les champs :
**Configuration de base :**
- **Name** : `portfolio-website`
- **Image** : `portfolio-website:latest` (ou `votre-registry/portfolio-website:latest`)
- **Always pull the image** : Coché
- **Restart policy** : `Unless stopped`
**Network :**
- **Network** : Sélectionnez `portfolio`
**Labels (pour Traefik) :**
Cliquez sur **"+ add label"** et ajoutez :
```
traefik.enable=true
traefik.http.routers.portfolio-website.rule=Host(`alexandre-pommier.com`) || Host(`www.alexandre-pommier.com`)
traefik.http.routers.portfolio-website.entrypoints=websecure
traefik.http.routers.portfolio-website.tls=true
traefik.http.routers.portfolio-website.tls.certresolver=letsencrypt
traefik.http.services.portfolio-website.loadbalancer.server.port=80
traefik.http.routers.portfolio-website-http.rule=Host(`alexandre-pommier.com`) || Host(`www.alexandre-pommier.com`)
traefik.http.routers.portfolio-website-http.entrypoints=web
traefik.http.routers.portfolio-website-http.middlewares=redirect-to-https
traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https
traefik.http.middlewares.redirect-to-https.redirectscheme.permanent=true
```
4. Cliquez sur **"Deploy the container"**
---
## 🔄 Mise à jour du Portfolio
### Via Stack (Option 1)
1. Allez dans **"Stacks"**
2. Cliquez sur votre stack `portfolio-website`
3. Cliquez sur **"Pull and redeploy"** ou **"Git pull and redeploy"**
4. Confirmez l'action
### Via Webhook (Automatique - Recommandé)
1. Dans votre stack, allez dans **"Webhooks"**
2. Cliquez sur **"+ Add webhook"**
3. Donnez un nom : `github-auto-deploy`
4. Copiez l'URL générée (ex: `https://portainer.com/api/webhooks/xxx`)
5. Sur GitHub :
- Allez dans **Settings** > **Webhooks** > **Add webhook**
- Collez l'URL Portainer
- Content type : `application/json`
- Événements : `Just the push event`
- Active : Coché
- Cliquez sur **"Add webhook"**
Maintenant, chaque `git push` sur `main` déclenchera automatiquement un redéploiement ! 🎉
---
## 📊 Monitoring et Logs
### Voir les logs en temps réel
1. Allez dans **"Containers"**
2. Cliquez sur `portfolio-website`
3. Cliquez sur **"Logs"**
4. Activez **"Auto-refresh"**
### Statistiques de performance
1. Dans le container, cliquez sur **"Stats"**
2. Visualisez CPU, RAM, Network en temps réel
### Health Check
Le container inclut un health check qui vérifie :
- Toutes les 30 secondes
- Si Nginx répond sur le port 80
- 3 tentatives avant de marquer comme "unhealthy"
---
## 🛠️ Commandes utiles
### Reconstruire l'image après changement
```bash
# Si vous utilisez Stack avec Git
# Portainer fait tout automatiquement avec "Git pull and redeploy"
# Si vous gérez manuellement
docker-compose build --no-cache
docker-compose up -d
```
### Voir les containers actifs
```bash
docker ps
```
### Accéder aux logs
```bash
docker logs portfolio-website -f
```
### Redémarrer le container
```bash
docker restart portfolio-website
```
### Supprimer et recréer
```bash
docker-compose down
docker-compose up -d --build
```
---
## 🔒 Sécurité
### Variables sensibles
Si vous avez des secrets (API keys, etc.), utilisez les **Secrets** de Portainer :
1. Allez dans **"Secrets"**
2. Créez un nouveau secret
3. Référencez-le dans votre stack avec `secrets:`
### Limiter les ressources
Dans le docker-compose, ajoutez :
```yaml
deploy:
resources:
limits:
cpus: '0.5'
memory: 512M
reservations:
cpus: '0.25'
memory: 256M
```
---
## ✅ Checklist de déploiement
- [ ] Portainer accessible et connecté
- [ ] Réseau `portfolio` créé
- [ ] Traefik configuré et fonctionnel
- [ ] Repository GitHub accessible
- [ ] Docker-compose.yml à jour sur le repo
- [ ] Stack créée dans Portainer
- [ ] Container démarré avec succès
- [ ] Site accessible via HTTPS
- [ ] Webhook configuré pour auto-deploy
- [ ] Logs vérifiés (pas d'erreurs)
- [ ] Health check en vert
---
## 🚨 Troubleshooting
### Le container ne démarre pas
1. Vérifiez les logs : `docker logs portfolio-website`
2. Vérifiez que le réseau `portfolio` existe
3. Vérifiez que le port 80 n'est pas déjà utilisé
### Le site n'est pas accessible
1. Vérifiez que Traefik tourne : `docker ps | grep traefik`
2. Vérifiez les labels Traefik dans Portainer
3. Vérifiez les logs Traefik : `docker logs traefik`
4. Vérifiez le DNS : `nslookup alexandre-pommier.com`
### Le build échoue
1. Vérifiez l'accès au repository GitHub
2. Vérifiez que le Dockerfile est présent
3. Vérifiez les logs de build dans Portainer
4. Essayez un build manuel : `docker build -t portfolio-website .`
### Le certificat SSL ne se génère pas
1. Vérifiez que les ports 80 et 443 sont ouverts
2. Vérifiez la configuration du résolveur Let's Encrypt dans Traefik
3. Vérifiez les logs Traefik pour les erreurs ACME
---
## 📞 Support
Si vous rencontrez des problèmes :
1. Consultez les logs du container
2. Vérifiez la documentation Traefik
3. Vérifiez la documentation Portainer
4. Ouvrez une issue sur GitHub
---
Bonne chance avec votre déploiement ! 🚀

102
PORTAINER_QUICK_START.md Normal file
View File

@ -0,0 +1,102 @@
# 🚀 Déploiement Rapide sur Portainer
## ⚡ Méthode Express (3 minutes)
### 1⃣ Connectez-vous à Portainer
Ouvrez votre Portainer : `https://votre-portainer.com`
### 2⃣ Créez une Stack
1. Menu **Stacks****+ Add stack**
2. Nom : `portfolio-website`
3. Sélectionnez **"Repository"**
### 3⃣ Configuration Git
**Pour repository PUBLIC :**
```
Repository URL: https://github.com/kinou-p/portfolio-website
Reference: refs/heads/main
Compose path: docker-compose.yml
Authentication: ❌ Décoché
```
**Pour repository PRIVÉ :**
```
Repository URL: https://github.com/kinou-p/portfolio-website
Reference: refs/heads/main
Compose path: docker-compose.yml
Authentication: ✅ Coché
Username: kinou-p
Token: ghp_votre_token_github
```
**Comment obtenir un token GitHub :**
1. GitHub → Settings → Developer settings → Personal access tokens
2. Generate new token (classic)
3. Cochez `repo` → Generate
4. Copiez le token (commence par `ghp_`)
### 4⃣ Déployez
Cliquez sur **"Deploy the stack"** → Attendez 2-5 min → C'est fait ! ✅
### 5⃣ Vérifiez
Allez sur : `https://alexandre-pommier.com` 🎉
---
## 🔄 Mise à jour automatique
### Configurez le Webhook GitHub
1. Dans Portainer : **Stacks**`portfolio-website`**Webhooks****+ Add webhook**
2. Copiez l'URL générée
3. Sur GitHub : **Settings****Webhooks** → **Add webhook**
4. Collez l'URL Portainer
5. Événement : `push`
Maintenant chaque `git push` met à jour automatiquement votre site ! 🚀
---
## 📖 Documentation complète
Voir [PORTAINER_DEPLOYMENT.md](./PORTAINER_DEPLOYMENT.md) pour :
- Guide détaillé étape par étape
- Troubleshooting
- Configuration avancée
- Monitoring et logs
---
## 🆘 Problèmes ?
### Le site ne s'affiche pas
1. Vérifiez les logs : Portainer → **Containers**`portfolio-website` → **Logs**
2. Vérifiez que Traefik fonctionne : `docker ps | grep traefik`
3. Vérifiez le DNS : `nslookup alexandre-pommier.com`
### Le build échoue
1. Vérifiez l'accès au repository GitHub
2. Vérifiez les logs de build dans Portainer
3. Vérifiez que le Dockerfile existe dans le repo
---
## ✅ Checklist
- [ ] Portainer accessible
- [ ] Réseau `portfolio` créé (`docker network create portfolio`)
- [ ] Traefik configuré et actif
- [ ] Stack créée dans Portainer
- [ ] Site accessible en HTTPS
- [ ] Webhook configuré (optionnel mais recommandé)
---
**Besoin d'aide ?** Consultez la doc complète ou les logs ! 📚

291
SECURITY_GUIDE.md Normal file
View File

@ -0,0 +1,291 @@
# 🔐 Sécurisation du Repository pour Portainer
## ⚖️ Public vs Privé : Que choisir ?
### ✅ **Repository PUBLIC** (Recommandé pour un portfolio)
**Avantages :**
- ✅ Déploiement plus simple (pas d'authentification)
- ✅ Pas de gestion de tokens
- ✅ Bon pour votre CV (montre votre code)
- ✅ Open source = crédibilité
**Points d'attention :**
- ⚠️ Ne JAMAIS commit de secrets (API keys, mots de passe)
- ⚠️ Utiliser des variables d'environnement pour les configs sensibles
- ⚠️ Vérifier le `.gitignore` avant de push
**Fichiers à NE JAMAIS commit :**
```
.env
.env.local
.env.production
secrets/
*.key
*.pem
config/database.yml
```
### 🔒 **Repository PRIVÉ** (Si vous avez du code propriétaire)
**Avantages :**
- 🔒 Code source non visible publiquement
- 🔒 Contrôle d'accès granulaire
- 🔒 Adapté aux projets clients
**Inconvénients :**
- Configuration plus complexe
- Besoin de gérer des tokens/clés SSH
---
## 🔑 **Méthodes d'authentification pour dépôt PRIVÉ**
### **Méthode 1 : Personal Access Token (PAT) - Plus simple**
#### Étape 1 : Créer le token sur GitHub
1. Connectez-vous à GitHub
2. Settings → Developer settings → Personal access tokens → Tokens (classic)
3. **Generate new token (classic)**
4. Configuration :
- **Note** : `Portainer Portfolio Deploy`
- **Expiration** : `90 days` ou `No expiration` (moins sécurisé)
- **Scopes** : Cochez uniquement :
- ✅ `repo` (Full control of private repositories)
5. **Generate token**
6. ⚠️ **COPIEZ le token immédiatement** (commence par `ghp_`)
- Vous ne pourrez plus le voir après !
#### Étape 2 : Utiliser le token dans Portainer
1. Dans Portainer : Stacks → + Add stack
2. Repository URL : `https://github.com/kinou-p/portfolio-website`
3. ✅ Cochez **"Authentication"**
4. Remplissez :
```
Username: kinou-p
Personal Access Token: ghp_xxxxxxxxxxxxxxxxxxxx
```
#### Étape 3 : Sécuriser le token
- ⚠️ Ne partagez JAMAIS ce token
- 🔄 Régénérez-le régulièrement (tous les 3 mois)
- 📝 Stockez-le dans un gestionnaire de mots de passe (1Password, Bitwarden)
---
### **Méthode 2 : SSH Deploy Key - Plus sécurisé**
#### Étape 1 : Générer une paire de clés SSH
Sur votre serveur Docker :
```bash
# Générer une clé SSH dédiée
ssh-keygen -t ed25519 -C "portainer-deploy-portfolio" -f ~/.ssh/portainer_portfolio
# NE METTEZ PAS de passphrase (appuyez sur Entrée 2 fois)
# Vérifier que les clés sont créées
ls -la ~/.ssh/portainer_portfolio*
# Vous devez voir :
# portainer_portfolio (clé privée)
# portainer_portfolio.pub (clé publique)
```
#### Étape 2 : Ajouter la clé publique sur GitHub
```bash
# Afficher la clé publique
cat ~/.ssh/portainer_portfolio.pub
```
Copiez la sortie (commence par `ssh-ed25519 AAAAC3...`)
1. Sur GitHub : Repository → **Settings** → **Deploy keys**
2. **Add deploy key**
3. Configuration :
```
Title: Portainer Deploy
Key: [Collez la clé publique]
❌ Allow write access (décoché - read-only suffit)
```
4. **Add key**
#### Étape 3 : Utiliser la clé dans Portainer
```bash
# Afficher la clé PRIVÉE
cat ~/.ssh/portainer_portfolio
```
Copiez TOUTE la sortie (de `-----BEGIN OPENSSH PRIVATE KEY-----` jusqu'à `-----END OPENSSH PRIVATE KEY-----`)
1. Dans Portainer : Stacks → + Add stack
2. Repository configuration :
```
Repository URL: git@github.com:kinou-p/portfolio-website.git
Repository reference: refs/heads/main
```
3. ✅ Cochez **"Authentication"**
4. Sélectionnez **"SSH"**
5. Collez la clé privée complète dans le champ
---
## 🔒 **Bonnes pratiques de sécurité**
### **1. Utiliser des variables d'environnement**
Ne jamais commit de secrets dans le code. Utilisez `.env` :
```bash
# .env (NE JAMAIS COMMIT)
GTM_ID=GTM-5V6TCG4C
API_KEY=secret_key_here
DATABASE_URL=postgresql://user:pass@localhost/db
```
Dans Portainer, ajoutez ces variables dans la Stack :
- Stack → Environment variables → + add variable
### **2. Fichier .gitignore robuste**
Assurez-vous que votre `.gitignore` contient :
```gitignore
# Secrets
.env
.env.*
!.env.example
*.key
*.pem
secrets/
credentials/
# Système
.DS_Store
Thumbs.db
desktop.ini
# IDE
.vscode/
.idea/
*.swp
*.swo
# Build
node_modules/
dist/
build/
.cache/
# Logs
*.log
logs/
```
### **3. Vérifier avant de commit**
```bash
# Vérifier ce qui va être commit
git status
# Vérifier qu'aucun secret n'est présent
git diff
# Si vous avez commit un secret par erreur :
# 1. Supprimez-le du code
# 2. Changez le secret (token, API key, etc.)
# 3. Faites un commit correctif
# 4. Le secret restera dans l'historique Git !
# Utilisez git filter-branch ou BFG Repo-Cleaner pour l'effacer
```
### **4. Rotation des secrets**
- 🔄 Régénérez les tokens tous les 90 jours
- 🔄 Changez les clés SSH si elles sont compromises
- 🔄 Révoquez immédiatement tout token exposé
---
## 🎯 **Recommandation finale**
Pour un **portfolio personnel** comme le vôtre :
### ✅ **Gardez le repository PUBLIC**
**Raisons :**
1. Pas de secrets sensibles (juste un site vitrine)
2. Plus simple à déployer
3. Bon pour votre profil GitHub
4. Permet aux recruteurs de voir votre code
**Configuration sécurisée :**
```
✅ .gitignore complet
✅ Pas de .env committed
✅ Variables d'environnement dans Portainer
✅ Tokens d'API en variables d'environnement seulement
```
### 🔒 **Passez en PRIVÉ seulement si :**
- Vous avez du code propriétaire
- C'est un projet client
- Vous testez des features non prêtes
---
## 📋 **Checklist de sécurité**
Avant de rendre votre repo public :
- [ ] Vérifier `.gitignore` complet
- [ ] Aucun fichier `.env` committed
- [ ] Aucune API key dans le code
- [ ] Pas de mots de passe en dur
- [ ] Pas de tokens GitHub/AWS/etc.
- [ ] Vérifier l'historique Git : `git log -p | grep -i "password\|token\|key"`
- [ ] Supprimer les fichiers sensibles de l'historique si nécessaire
- [ ] Tester le déploiement Portainer
---
## 🆘 **J'ai commit un secret par erreur !**
### 🚨 Action immédiate :
1. **Changez le secret** (régénérez la clé API, token, etc.)
2. **Supprimez-le du code** et commit
3. **Nettoyez l'historique Git** (le secret reste dans l'historique !)
```bash
# Option 1 : BFG Repo-Cleaner (plus simple)
# Téléchargez : https://rtyley.github.io/bfg-repo-cleaner/
java -jar bfg.jar --replace-text secrets.txt # fichier avec les secrets à remplacer
# Option 2 : git filter-branch (manuel)
git filter-branch --force --index-filter \
"git rm --cached --ignore-unmatch chemin/vers/fichier" \
--prune-empty --tag-name-filter cat -- --all
# Force push
git push origin --force --all
```
4. **Notifiez l'équipe** si c'est un projet collaboratif
---
## 📞 **Besoin d'aide ?**
- 📖 [GitHub Personal Access Tokens](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token)
- 📖 [GitHub Deploy Keys](https://docs.github.com/en/developers/overview/managing-deploy-keys)
- 📖 [Git Secrets Scanner](https://github.com/awslabs/git-secrets)
---
Bonne sécurisation ! 🔒✨

View File

@ -1,9 +1,12 @@
version: '3.8'
services:
portfolio-website:
restart: unless-stopped
build:
context: .
context: https://github.com/kinou-p/portfolio-website.git#main
dockerfile: Dockerfile
image: portfolio-website:latest
container_name: portfolio-website
networks:
- portfolio
@ -23,7 +26,14 @@ services:
- "traefik.http.routers.portfolio-website-http.middlewares=redirect-to-https"
- "traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https"
- "traefik.http.middlewares.redirect-to-https.redirectscheme.permanent=true"
healthcheck:
test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:80"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
networks:
portfolio:
external: true