Skip to content

📋 Vue d'ensemble du déploiement

📋 Résumé exécutif

Le processus de déploiement LIPAIX est entièrement manuel et basé sur des branches de déploiement séparées. Cette approche nous donne un contrôle total sur le processus tout en garantissant la stabilité de la production.

🏗️ Architecture globale

Flux de déploiement

Développement → Validation → Déclenchement Manuel → Production
     ↓              ↓              ↓              ↓
Feature Branch → Code Review → GitHub Actions → Railway

Services et environnements

LIPAIX Platform
├── 🌐 Web Application (Next.js + PayloadCMS)
│   ├── Production: https://www.lipaix.com
│   ├── Staging: https://staging.lipaix.com
│   └── Development: http://localhost:3000
├── 🤖 Discord Bot (Node.js)
│   ├── Production: Bot Discord actif
│   └── Development: Bot local
├── 🗄️ Database (PostgreSQL)
│   ├── Production: Base de données cloud
│   ├── Staging: Base de données de test
│   └── Development: Base locale
├── 🚀 Cache (Redis)
│   ├── Production: Cache cloud
│   ├── Staging: Cache de test
│   └── Development: Cache local
└── 📚 Documentation (VitePress)
    └── Production: https://docs.lipaix.com

🔄 Processus détaillé

Phase 1: Développement

bash
# 1. Création de la feature branch
git checkout main
git pull origin main
git checkout -b feature/nouvelle-fonctionnalite

# 2. Développement et tests locaux
npm run dev          # Démarrage du serveur de développement
npm run test         # Exécution des tests
npm run lint         # Vérification du code

# 3. Commit et push
git add .
git commit -m "feat: ajouter nouvelle fonctionnalité"
git push origin feature/nouvelle-fonctionnalite

Phase 2: Validation

bash
# 1. Création de la Pull Request
# - Aller sur GitHub
# - Créer une PR de feature/* vers main
# - Remplir le template de PR

# 2. Code Review
# - Validation par au moins un membre de l'équipe
# - Vérification des tests et de la documentation
# - Approbation finale

# 3. Merge dans main
# - Merge automatique après approbation
# - Tests CI/CD automatiques
# - Validation de la qualité du code

Phase 3: Déclenchement manuel

⚠️ IMPORTANT : Le déploiement est MANUEL, pas automatique !

bash
# 1. Validation finale
# - Vérifier que le code est stable
# - Valider les tests CI/CD
# - Vérifier la documentation

# 2. Déclenchement du workflow
# - Aller sur GitHub Actions
# - Sélectionner le workflow "Deploy to Production"
# - Cliquer sur "Run workflow"
# - Choisir l'environnement (production/staging)

# 3. Monitoring du processus
# - Surveiller l'exécution du workflow
# - Vérifier les étapes de build et test
# - Confirmer le succès du déploiement

Phase 4: Mise en production

bash
# 1. Mise à jour des branches de déploiement
git checkout deploy/web
git reset --hard main
git push origin deploy/web --force

# 2. Déclenchement automatique sur Railway
# - Railway détecte la mise à jour de deploy/web
# - Build automatique de l'application
# - Déploiement sur la plateforme

# 3. Validation de la production
# - Health checks automatiques
# - Tests de régression
# - Confirmation de la disponibilité

📊 Workflows GitHub Actions

Workflow principal de déploiement

yaml
# .github/workflows/deploy.yml
name: Deploy to Production

on:
  workflow_dispatch:  # Déclenchement manuel uniquement
    inputs:
      environment:
        description: 'Environment to deploy to'
        required: true
        default: 'production'
        type: choice
        options:
        - production
        - staging

jobs:
  validate:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v4
        
      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: '18'
          cache: 'npm'
          
      - name: Install dependencies
        run: npm ci
        
      - name: Run linting
        run: npm run lint
        
      - name: Run tests
        run: npm test
        
      - name: Build application
        run: npm run build
        
      - name: Run integration tests
        run: npm run test:integration

  deploy:
    needs: validate
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v4
        
      - name: Deploy to Railway
        run: |
          if [ "${{ github.event.inputs.environment }}" = "production" ]; then
            # Mise à jour de la branche deploy/web
            git checkout -b deploy/web
            git push origin deploy/web --force
          else
            # Mise à jour de la branche deploy/staging/web
            git checkout -b deploy/staging/web
            git push origin deploy/staging/web --force
          fi

Workflows de validation

yaml
# .github/workflows/ci.yml
name: Continuous Integration

on:
  push:
    branches: [ main, develop ]
  pull_request:
    branches: [ main ]

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v4
        
      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: '18'
          cache: 'npm'
          
      - name: Install dependencies
        run: npm ci
        
      - name: Run linting
        run: npm run lint
        
      - name: Run tests
        run: npm test
        
      - name: Run type checking
        run: npm run type-check
        
      - name: Build application
        run: npm run build

🔐 Sécurité et permissions

Contrôle d'accès

  • 👥 Équipe technique - Accès complet aux workflows
  • 🔒 Validation manuelle - Approbation requise pour la production
  • 📋 Audit trail - Traçabilité de tous les déploiements
  • 🚫 Branches protégées - main et deploy/* protégées

Validation des déploiements

  • ✅ Tests automatiques - Validation de la qualité du code
  • 🔍 Code review - Validation humaine obligatoire
  • 🧪 Tests d'intégration - Validation des fonctionnalités
  • 📋 Checklist - Validation manuelle avant déploiement

📊 Monitoring et observabilité

Health checks

Chaque service expose des endpoints de santé :

typescript
// Endpoint de santé principal
export async function GET() {
  try {
    const checks = await Promise.all([
      checkDatabase(),
      checkRedis(),
      checkPayload(),
      checkDiscord()
    ]);
    
    const isHealthy = checks.every(check => check.status === 'healthy');
    
    return Response.json({
      status: isHealthy ? 'healthy' : 'unhealthy',
      timestamp: new Date().toISOString(),
      version: process.env.APP_VERSION || 'unknown',
      environment: process.env.NODE_ENV || 'unknown',
      checks: {
        database: checks[0],
        redis: checks[1],
        payload: checks[2],
        discord: checks[3]
      }
    }, { 
      status: isHealthy ? 200 : 503 
    });
  } catch (error) {
    return Response.json({
      status: 'unhealthy',
      timestamp: new Date().toISOString(),
      error: error.message
    }, { status: 503 });
  }
}

async function checkDatabase() {
  try {
    await db.query('SELECT 1');
    return { status: 'healthy', responseTime: Date.now() };
  } catch (error) {
    return { status: 'unhealthy', error: error.message };
  }
}

async function checkRedis() {
  try {
    const start = Date.now();
    await redis.ping();
    return { status: 'healthy', responseTime: Date.now() - start };
  } catch (error) {
    return { status: 'unhealthy', error: error.message };
  }
}

async function checkPayload() {
  try {
    await payload.db.connect();
    return { status: 'healthy' };
  } catch (error) {
    return { status: 'unhealthy', error: error.message };
  }
}

async function checkDiscord() {
  try {
    // Vérifier la connectivité Discord
    const guild = await discordClient.guilds.fetch(process.env.DISCORD_GUILD_ID!);
    return { status: 'healthy', guild: guild.name };
  } catch (error) {
    return { status: 'unhealthy', error: error.message };
  }
}

Métriques de performance

  • ⏱️ Temps de réponse - Latence des APIs et pages
  • 📊 Taux d'erreur - Pourcentage d'erreurs par endpoint
  • 🚀 Throughput - Nombre de requêtes par seconde
  • 💾 Utilisation des ressources - CPU, mémoire, disque
  • 🔄 Temps de déploiement - Durée moyenne des déploiements

Alertes et notifications

  • 🚨 Déploiement échoué - Notification immédiate à l'équipe
  • ⚠️ Service dégradé - Alerte en cas de problèmes de performance
  • ✅ Déploiement réussi - Confirmation de la mise en production
  • 📊 Métriques anormales - Détection des comportements inhabituels

🔄 Rollback et récupération

Stratégie de rollback

En cas de problème après déploiement :

bash
# 1. Détection du problème
# - Monitoring automatique
# - Alertes en temps réel
# - Validation manuelle

# 2. Rollback automatique
# - Health check échoue pendant 5 minutes
# - Rollback automatique à la version précédente
# - Notification à l'équipe

# 3. Investigation
# - Analyse de la cause du problème
# - Tests de régression
# - Correction du bug

# 4. Re-déploiement
# - Développement de la correction
# - Tests complets
# - Déploiement de la correction

Points de restauration

  • 📦 Images Docker - Versions précédentes disponibles
  • 🗄️ Base de données - Sauvegardes automatiques quotidiennes
  • 📁 Code source - Tags Git pour chaque déploiement
  • 🔧 Configuration - Versions des variables d'environnement

🚀 Optimisations de déploiement

Build optimisé

  • ⚡ Compilation rapide - Utilisation de la cache Next.js
  • 📦 Bundle splitting - Division intelligente du code
  • 🖼️ Optimisation des images - Compression et formats modernes
  • 🔍 Tree shaking - Élimination du code mort
  • 🔄 Incremental builds - Rebuild uniquement des parties modifiées

Déploiement sans interruption

  • 🔄 Blue-green deployment - Basculement sans downtime
  • 📊 Health checks avancés - Validation complète avant basculement
  • 🔄 Rolling updates - Mise à jour progressive des instances
  • 📈 Scaling automatique - Adaptation à la charge

📚 Documentation et formation

Procédures de déploiement

  • 📋 Checklist - Étapes obligatoires avant déploiement
  • 🔧 Troubleshooting - Solutions aux problèmes courants
  • 📊 Monitoring - Guide d'interprétation des métriques
  • 🚨 Urgences - Procédures en cas de problème critique

Formation de l'équipe

  • 👥 Sessions de formation - Apprentissage des outils de déploiement
  • 📚 Documentation technique - Guides détaillés pour chaque service
  • 🔄 Pratiques - Exercices de déploiement en environnement de test
  • 📊 Analyse post-mortem - Retours d'expérience et améliorations

🎯 Bonnes pratiques

Do's

  • Valider le code - Tests et linting avant déploiement
  • Documenter les changements - Changelog et release notes
  • Surveiller la production - Monitoring et alertes actifs
  • Tester en staging - Validation complète avant production
  • Préparer le rollback - Plan de récupération toujours prêt
  • Valider manuellement - Déclenchement manuel obligatoire

Don'ts

  • Déployer sans tests - Validation obligatoire
  • Ignorer les alertes - Réaction immédiate aux problèmes
  • Modifier la production - Toujours passer par le processus
  • Oublier la documentation - Traçabilité complète requise
  • Automatiser complètement - Contrôle humain obligatoire

🚀 Prochaines étapes


Le déploiement LIPAIX est maîtrisé, sécurisé et manuel. Suivez ces procédures pour des mises en production réussies ! 🚀

Released under the MIT License.