docker stack via git
This commit is contained in:
parent
88a4fddf17
commit
fa5b9135ae
20
.env.portainer.example
Normal file
20
.env.portainer.example
Normal 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
315
PORTAINER_DEPLOYMENT.md
Normal 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
102
PORTAINER_QUICK_START.md
Normal 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
291
SECURITY_GUIDE.md
Normal 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 ! 🔒✨
|
||||||
@ -1,9 +1,12 @@
|
|||||||
|
version: '3.8'
|
||||||
|
|
||||||
services:
|
services:
|
||||||
portfolio-website:
|
portfolio-website:
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
build:
|
build:
|
||||||
context: .
|
context: https://github.com/kinou-p/portfolio-website.git#main
|
||||||
dockerfile: Dockerfile
|
dockerfile: Dockerfile
|
||||||
|
image: portfolio-website:latest
|
||||||
container_name: portfolio-website
|
container_name: portfolio-website
|
||||||
networks:
|
networks:
|
||||||
- portfolio
|
- portfolio
|
||||||
@ -23,7 +26,14 @@ services:
|
|||||||
- "traefik.http.routers.portfolio-website-http.middlewares=redirect-to-https"
|
- "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.scheme=https"
|
||||||
- "traefik.http.middlewares.redirect-to-https.redirectscheme.permanent=true"
|
- "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:
|
networks:
|
||||||
portfolio:
|
portfolio:
|
||||||
external: true
|
external: true
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user