portfolio-website/PORTAINER_DEPLOYMENT.md
2025-10-02 17:02:26 +02:00

8.1 KiB

🚀 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 :

    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

# 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
  1. 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

# 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

docker ps

Accéder aux logs

docker logs portfolio-website -f

Redémarrer le container

docker restart portfolio-website

Supprimer et recréer

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 :

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 ! 🚀