Communitygithub.com

patterns-de-deploiement

Workflows de déploiement en production, patterns CI/CD, conteneurisation Docker, vérifications de santé, stratégies de rollback et listes de contrôle pour la mise en production d'applications web.

Qu'est-ce que patterns-de-deploiement ?

Cette compétence fournit un guide complet pour la mise en place de pipelines de déploiement robustes et de bonnes pratiques CI/CD. Elle couvre les stratégies de déploiement (roulant, blue-green, canary) avec leurs avantages et inconvénients, ainsi que des exemples concrets de Dockerfiles multi-étapes pour Node.js, Go et Python. Elle inclut également des modèles de pipelines GitHub Actions, des sondes de santé pour Kubernetes, et une validation de configuration suivant le pattern Twelve-Factor App. L'utilisateur y trouvera des checklists de production, des stratégies de rollback, et des bonnes pratiques de sécurité, de monitoring et d'opérations. Cette compétence est utile pour les développeurs et les ingénieurs DevOps qui déploient des applications conteneurisées sur des plateformes comme Railway, Vercel ou Kubernetes.

Compatible avec~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/affaan-m/ECC/tree/main/skills/deployment-patterns

Demander à votre IA préférée

Ouvre une nouvelle conversation avec cette compétence d'agent déjà préchargée.

Documentation

Patterns de Déploiement

Workflows de déploiement en production et bonnes pratiques CI/CD.

Quand Activer

  • Mise en place de pipelines CI/CD
  • Conteneurisation d'une application
  • Planification d'une stratégie de déploiement (blue-green, canary, roulant)
  • Implémentation de vérifications de santé et de sondes de préparation
  • Préparation d'une mise en production
  • Configuration de paramètres spécifiques à l'environnement

Stratégies de Déploiement

Déploiement Roulant (Par défaut)

Remplacez les instances progressivement — les anciennes et nouvelles versions fonctionnent simultanément pendant le déploiement.

Instance 1 : v1 → v2  (mise à jour en premier)
Instance 2 : v1        (exécute toujours v1)
Instance 3 : v1        (exécute toujours v1)

Instance 1 : v2
Instance 2 : v1 → v2  (mise à jour en second)
Instance 3 : v1

Instance 1 : v2
Instance 2 : v2
Instance 3 : v1 → v2  (mise à jour en dernier)

Avantages : Zéro temps d'arrêt, déploiement progressif Inconvénients : Deux versions s'exécutent simultanément — nécessite des modifications rétrocompatibles Utiliser quand : Déploiements standards, modifications rétrocompatibles

Déploiement Blue-Green

Exécutez deux environnements identiques. Basculez le trafic de manière atomique.

Bleu (v1) ← trafic
Vert (v2)   inactif, exécute la nouvelle version

# Après vérification :
Bleu (v1)   inactif (devient la sauvegarde)
Vert (v2) ← trafic

Avantages : Rollback instantané (revenir au bleu), transition propre Inconvénients : Nécessite 2x l'infrastructure pendant le déploiement Utiliser quand : Services critiques, tolérance zéro aux problèmes

Déploiement Canary

Acheminez d'abord un petit pourcentage de trafic vers la nouvelle version.

v1 : 95 % du trafic
v2 :  5 % du trafic (canary)

# Si les métriques sont bonnes :
v1 : 50 % du trafic
v2 : 50 % du trafic

# Final :
v2 : 100 % du trafic

Avantages : Détecte les problèmes avec le trafic réel avant le déploiement complet Inconvénients : Nécessite une infrastructure de répartition de trafic, une surveillance Utiliser quand : Services à fort trafic, modifications risquées, feature flags

Docker

Dockerfile Multi-étapes (Node.js)

# Étape 1 : Installer les dépendances
FROM node:22-alpine AS deps
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm ci --production=false

# Étape 2 : Construire
FROM node:22-alpine AS builder
WORKDIR /app
COPY --from=deps /app/node_modules ./node_modules
COPY . .
RUN npm run build
RUN npm prune --production

# Étape 3 : Image de production
FROM node:22-alpine AS runner
WORKDIR /app

RUN addgroup -g 1001 -S appgroup && adduser -S appuser -u 1001
USER appuser

COPY --from=builder --chown=appuser:appgroup /app/node_modules ./node_modules
COPY --from=builder --chown=appuser:appgroup /app/dist ./dist
COPY --from=builder --chown=appuser:appgroup /app/package.json ./

ENV NODE_ENV=production
EXPOSE 3000

HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
  CMD wget --no-verbose --tries=1 --spider http://localhost:3000/health || exit 1

CMD ["node", "dist/server.js"]

Dockerfile Multi-étapes (Go)

FROM golang:1.22-alpine AS builder
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -ldflags="-s -w" -o /server ./cmd/server

FROM alpine:3.19 AS runner
RUN apk --no-cache add ca-certificates
RUN adduser -D -u 1001 appuser
USER appuser

COPY --from=builder /server /server

EXPOSE 8080
HEALTHCHECK --interval=30s --timeout=3s CMD wget -qO- http://localhost:8080/health || exit 1
CMD ["/server"]

Dockerfile Multi-étapes (Python/Django)

FROM python:3.12-slim AS builder
WORKDIR /app
RUN pip install --no-cache-dir uv
COPY requirements.txt .
RUN uv pip install --system --no-cache -r requirements.txt

FROM python:3.12-slim AS runner
WORKDIR /app

RUN useradd -r -u 1001 appuser
USER appuser

COPY --from=builder /usr/local/lib/python3.12/site-packages /usr/local/lib/python3.12/site-packages
COPY --from=builder /usr/local/bin /usr/local/bin
COPY . .

ENV PYTHONUNBUFFERED=1
EXPOSE 8000

HEALTHCHECK --interval=30s --timeout=3s CMD python -c "import urllib.request; urllib.request.urlopen('http://localhost:8000/health/')" || exit 1
CMD ["gunicorn", "config.wsgi:application", "--bind", "0.0.0.0:8000", "--workers", "4"]

Bonnes Pratiques Docker

# BONNES pratiques
- Utiliser des tags de version spécifiques (node:22-alpine, pas node:latest)
- Constructions multi-étapes pour minimiser la taille de l'image
- Exécuter en tant qu'utilisateur non-root
- Copier d'abord les fichiers de dépendances (mise en cache des couches)
- Utiliser .dockerignore pour exclure node_modules, .git, tests
- Ajouter l'instruction HEALTHCHECK
- Définir des limites de ressources dans docker-compose ou k8s

# MAUVAISES pratiques
- Exécuter en tant que root
- Utiliser des tags :latest
- Copier l'intégralité du dépôt en une seule couche COPY
- Installer les dépendances de développement dans l'image de production
- Stocker des secrets dans l'image (utiliser des variables d'environnement ou un gestionnaire de secrets)

Pipeline CI/CD

GitHub Actions (Pipeline Standard)

name: CI/CD

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

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: 22
          cache: npm
      - run: npm ci
      - run: npm run lint
      - run: npm run typecheck
      - run: npm test -- --coverage
      - uses: actions/upload-artifact@v4
        if: always()
        with:
          name: coverage
          path: coverage/

  build:
    needs: test
    runs-on: ubuntu-latest
    if: github.ref == 'refs/heads/main'
    steps:
      - uses: actions/checkout@v4
      - uses: docker/setup-buildx-action@v3
      - uses: docker/login-action@v3
        with:
          registry: ghcr.io
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}
      - uses: docker/build-push-action@v5
        with:
          push: true
          tags: ghcr.io/${{ github.repository }}:${{ github.sha }}
          cache-from: type=gha
          cache-to: type=gha,mode=max

  deploy:
    needs: build
    runs-on: ubuntu-latest
    if: github.ref == 'refs/heads/main'
    environment: production
    steps:
      - name: Déploiement en production
        run: |
          # Commande de déploiement spécifique à la plateforme
          # Railway: railway up
          # Vercel: vercel --prod
          # K8s: kubectl set image deployment/app app=ghcr.io/${{ github.repository }}:${{ github.sha }}
          echo "Déploiement de ${{ github.sha }}"

Étapes du Pipeline

PR ouverte :
  lint → typecheck → tests unitaires → tests d'intégration → déploiement de prévisualisation

Fusionnée dans main :
  lint → typecheck → tests unitaires → tests d'intégration → construction image → déploiement staging → tests de fumée → déploiement production

Vérifications de Santé

Point de Terminaison de Vérification de Santé

// Vérification de santé simple
app.get("/health", (req, res) => {
  res.status(200).json({ status: "ok" });
});

// Vérification de santé détaillée (pour surveillance interne)
app.get("/health/detailed", async (req, res) => {
  const checks = {
    database: await checkDatabase(),
    redis: await checkRedis(),
    externalApi: await checkExternalApi(),
  };

  const allHealthy = Object.values(checks).every(c => c.status === "ok");

  res.status(allHealthy ? 200 : 503).json({
    status: allHealthy ? "ok" : "dégradé",
    timestamp: new Date().toISOString(),
    version: process.env.APP_VERSION || "inconnue",
    uptime: process.uptime(),
    checks,
  });
});

async function checkDatabase(): Promise<HealthCheck> {
  try {
    await db.query("SELECT 1");
    return { status: "ok", latency_ms: 2 };
  } catch (err) {
    return { status: "error", message: "Base de données inaccessible" };
  }
}

Sondes Kubernetes

livenessProbe:
  httpGet:
    path: /health
    port: 3000
  initialDelaySeconds: 10
  periodSeconds: 30
  failureThreshold: 3

readinessProbe:
  httpGet:
    path: /health
    port: 3000
  initialDelaySeconds: 5
  periodSeconds: 10
  failureThreshold: 2

startupProbe:
  httpGet:
    path: /health
    port: 3000
  initialDelaySeconds: 0
  periodSeconds: 5
  failureThreshold: 30    # 30 * 5s = 150s temps de démarrage maximum

Configuration de l'Environnement

Pattern Twelve-Factor App

# Toute configuration via des variables d'environnement — jamais dans le code
DATABASE_URL=postgres://user:pass@host:5432/db
REDIS_URL=redis://host:6379/0
API_KEY=${API_KEY}           # injecté par le gestionnaire de secrets
LOG_LEVEL=info
PORT=3000

# Comportement spécifique à l'environnement
NODE_ENV=production          # ou staging, development
APP_ENV=production           # environnement d'application explicite

Validation de la Configuration

import { z } from "zod";

const envSchema = z.object({
  NODE_ENV: z.enum(["development", "staging", "production"]),
  PORT: z.coerce.number().default(3000),
  DATABASE_URL: z.string().url(),
  REDIS_URL: z.string().url(),
  JWT_SECRET: z.string().min(32),
  LOG_LEVEL: z.enum(["debug", "info", "warn", "error"]).default("info"),
});

// Valider au démarrage — échouer rapidement si la configuration est erronée
export const env = envSchema.parse(process.env);

Stratégie de Rollback

Rollback Instantané

# Docker/Kubernetes : pointer vers l'image précédente
kubectl rollout undo deployment/app

# Vercel : promouvoir le déploiement précédent
vercel rollback

# Railway : redéployer le commit précédent
railway up --commit <previous-sha>

# Base de données : annuler la migration (si réversible)
npx prisma migrate resolve --rolled-back <nom-migration>

Liste de Contrôle de Rollback

  • L'image/artefact précédent est disponible et étiqueté
  • Les migrations de base de données sont rétrocompatibles (pas de modifications destructrices)
  • Les feature flags peuvent désactiver les nouvelles fonctionnalités sans déploiement
  • Les alertes de surveillance sont configurées pour les pics de taux d'erreur
  • Le rollback a été testé dans l'environnement de staging avant la mise en production

Liste de Contrôle de Mise en Production

Avant tout déploiement en production :

Application

  • Tous les tests passent (unitaires, intégration, E2E)
  • Aucun secret codé en dur dans le code ou les fichiers de configuration
  • La gestion des erreurs couvre tous les cas limites
  • La journalisation est structurée (JSON) et ne contient pas de données personnelles
  • Le point de terminaison de vérification de santé renvoie un état significatif

Infrastructure

  • L'image Docker se construit de manière reproductible (versions épinglées)
  • Les variables d'environnement sont documentées et validées au démarrage
  • Les limites de ressources sont définies (CPU, mémoire)
  • La mise à l'échelle horizontale est configurée (instances min/max)
  • SSL/TLS activé sur tous les points de terminaison

Surveillance

  • Les métriques de l'application sont exportées (taux de requêtes, latence, erreurs)
  • Des alertes sont configurées pour un taux d'erreur > seuil
  • L'agrégation des journaux est configurée (journaux structurés, consultables)
  • Surveillance de la disponibilité sur le point de terminaison de vérification de santé

Sécurité

  • Les dépendances sont analysées pour les CVE
  • CORS configuré uniquement pour les origines autorisées
  • La limitation du débit est activée sur les points de terminaison publics
  • L'authentification et l'autorisation sont vérifiées
  • Les en-têtes de sécurité sont définis (CSP, HSTS, X-Frame-Options)

Opérations

  • Le plan de rollback est documenté et testé
  • La migration de base de données est testée avec des données de taille de production
  • Un runbook pour les scénarios de panne courants
  • La rotation d'astreinte et la chaîne d'escalade sont définies

Individual skills in this repo

This repo contains 20 individual skills — each has its own dedicated page.

accessibility

Design, implement, and audit inclusive digital products using WCAG 2.2 Level AA. Use when building or auditing UI that must meet WCAG 2.2 Level AA, or when reviewing a change for keyboard, contrast, or screen-reader support.

affaan-m/content-engine

Create platform-native content systems for X, LinkedIn, TikTok, YouTube, newsletters, and repurposed multi-platform campaigns. Use when the user wants social posts, threads, scripts, content calendars, or one source asset adapted cleanly across platforms.

affaan-m/ECC

Multi-platform content distribution across X, LinkedIn, Threads, and Bluesky. Adapts content per platform using content-engine patterns. Never posts identical content cross-platform. Use when the user wants to distribute content across social platforms.

affaan-m/fal-ai-media

Unified media generation via fal.ai MCP — image, video, and audio. Covers text-to-image (Nano Banana), text/image-to-video (Seedance, Kling, Veo 3), text-to-speech (CSM-1B), and video-to-audio (ThinkSound). Use when the user wants to generate images, videos, or audio with AI.

affaan-m/manim-video

日本語翻訳:このファイルは manim-video 用の日本語翻訳が必要です

affaan-m/remotion-video-creation

Remotion のベストプラクティス - React で動画を作成する。3D、アニメーション、音声、字幕、チャート、トランジションなどをカバーするドメイン固有の29のルール。

affaan-m/video-editing

AI-assisted video editing workflows for cutting, structuring, and augmenting real footage. Covers the full pipeline from raw capture through FFmpeg, Remotion, ElevenLabs, fal.ai, and final polish in Descript or CapCut. Use when the user wants to edit video, cut footage, create vlogs, or build video content.

agent-architecture-audit

Full-stack diagnostic for agent and LLM applications. Audits the 12-layer agent stack for wrapper regression, memory pollution, tool discipline failures, hidden repair loops, and rendering corruption. Produces severity-ranked findings with code-first fixes. Essential for developers building agent applications, autonomous loops, or any LLM-powered feature. Use when an agent or LLM feature misbehaves and the failing layer is unknown, or before shipping an agent stack.

agent-eval

Head-to-head comparison of coding agents (Claude Code, Aider, Codex, etc.) on custom tasks with pass rate, cost, time, and consistency metrics. Use when choosing between coding agents, or when a change to an agent setup needs measured pass rate, cost, and time rather than an impression.

agent-harness-construction

Design and optimize AI agent action spaces, tool definitions, and observation formatting for higher completion rates. Use when defining or revising an agent

agentic-engineering

Operate as an agentic engineer using eval-first execution, decomposition, and cost-aware model routing. Use when planning or executing engineering work that agents will carry out end to end.

agentic-os

Build persistent multi-agent operating systems on Claude Code. Covers kernel architecture, specialist agents, slash commands, file-based memory, scheduled automation, and state management without external databases. Use when building a persistent multi-agent system on Claude Code with its own memory, commands, and scheduling.

agent-introspection-debugging

Structured self-debugging workflow for AI agent failures using capture, diagnosis, contained recovery, and introspection reports. Use when an agent run fails and you need a reproducible diagnosis instead of a retry.

agent-payment-x402

Add x402 payment execution to AI agents with per-task budgets, spending controls, and non-custodial wallets. Supports Base through agentwallet-sdk and X Layer through OKX Payments / OKX Agent Payments Protocol. Use when an agent must pay for something itself and needs per-task budgets, spending controls, and a non-custodial wallet.

agent-self-evaluation

Use after completing any non-trivial task. The agent self-rates its output on 5 axes — accuracy, completeness, clarity, actionability, conciseness — with concrete evidence per criterion. Produces a structured 1-5 scorecard with specific improvement suggestions.

agent-sort

Build an evidence-backed ECC install plan for a specific repo by sorting skills, commands, rules, hooks, and extras into DAILY vs LIBRARY buckets using parallel repo-aware review passes. Use when ECC should be trimmed to what a project actually needs instead of loading the full bundle.

ai-first-engineering

Engineering operating model for teams where AI agents generate a large share of implementation output. Use when setting team process, review gates, or ownership rules for a codebase largely written by agents.

ai-regression-testing

Regression testing strategies for AI-assisted development. Sandbox-mode API testing without database dependencies, automated bug-check workflows, and patterns to catch AI blind spots where the same model writes and reviews code. Use when adding regression coverage to AI-assisted code, or when the same model both wrote and reviewed a change.

android-clean-architecture

Clean Architecture patterns for Android and Kotlin Multiplatform projects — module structure, dependency rules, UseCases, Repositories, and data layer patterns. Use when structuring modules, layers, or data flow in an Android or KMP project.

angular-developer

Generates Angular code and provides architectural guidance. Trigger when creating projects, components, or services, or for best practices on reactivity (signals, linkedSignal, resource), forms, dependency injection, routing, SSR, accessibility (ARIA), animations, styling (component styles, Tailwind CSS), testing, or CLI tooling.

Skills associés