Communitygithub.com

deployment-patterns

Workflows de déploiement, modèles de pipeline CI/CD, conteneurisation Docker, sondes de santé, stratégies de rollback et listes de contrôle de préparation à la production pour les applications web. À utiliser lors de la mise en place de CI/CD, de la conteneurisation d'une application ou de la vérification de la préparation à la production avant une release.

Qu'est-ce que deployment-patterns ?

Cette compétence fournit un guide complet sur les meilleures pratiques de déploiement en production et de CI/CD. Elle couvre les stratégies de déploiement clés comme le déploiement progressif (rolling), blue-green et canary, en détaillant pour chacune les avantages, les inconvénients et les cas d'usage. Elle inclut des exemples concrets de Dockerfiles multi-étapes pour Node.js, Go et Python/Django, ainsi que des pipelines CI/CD complets avec GitHub Actions et des sondes de santé avec leur configuration Kubernetes. L'utilisateur y trouvera également des principes de configuration d'environnement (Twelve-Factor App), des stratégies de rollback avec des commandes concrètes pour Docker, Kubernetes, Vercel et Railway, et une checklist exhaustive de préparation à la production couvrant la sécurité, la surveillance, les opérations et l'infrastructure. Utile pour les développeurs et les ingénieurs DevOps qui configurent le déploiement d'applications web modernes, améliorent la fiabilité et automatisent les pipelines.

Compatible avec~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/affaan-m/everything-claude-code/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

Modèles de déploiement

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

Quand activer

  • Configuration de pipelines CI/CD
  • Conteneurisation d'une application
  • Planification d'une stratégie de déploiement (blue-green, canary, progressif)
  • Implémentation de sondes de santé et de probes de readiness
  • Préparation d'une release en production
  • Configuration de paramètres spécifiques à l'environnement

Stratégies de déploiement

Déploiement progressif (rolling) (par défaut)

Remplacez les instances graduellement : les anciennes et nouvelles versions s'exécutent simultanément pendant le déploiement.

Instance 1: v1 → v2  (mise à jour en premier)
Instance 2: v1        (exécute encore v1)
Instance 3: v1        (exécute encore 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 bleu-vert

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 l'environnement de secours)
Vert (v2) ← trafic

Avantages : Rollback instantané (rebasculer vers le bleu), basculement 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 du 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 du trafic réel avant le déploiement complet Inconvénients : Nécessite une infrastructure de répartition du trafic, surveillance À utiliser quand : Services à fort trafic, modifications risquées, feature flags

Docker

Dockerfile multi-étapes (Node.js)

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

# Étape 2 : Build
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"]

Meilleures 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, les 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 les 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 les secrets dans l'image (utiliser les 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éployer 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é sur main :
  lint → typecheck → tests unitaires → tests d'intégration → construction image → déploiement staging → tests de fumée → déploiement production

Sondes de santé

Point d'accès de la sonde de santé

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

// Sonde 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" : "degraded",
    timestamp: new Date().toISOString(),
    version: process.env.APP_VERSION || "unknown",
    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" };
  }
}

Probes 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 de démarrage max

Configuration de l'environnement

Modèle Twelve-Factor App

# Toute configuration via les 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 explicite de l'application

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 — échec rapide 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 <migration-name>

Liste de contrôle pour le rollback

  • L'image/artefact précédent est disponible et tagué
  • Les migrations de base de données sont rétrocompatibles (pas de modifications destructives)
  • 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é en staging avant la release en production

Liste de contrôle de préparation à la production

Avant tout déploiement en production :

Application

  • Tous les tests réussissent (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 (PII)
  • Le point d'accès de la sonde de santé retourne un statut 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 d'accès

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 logs est configurée (logs structurés, consultables)
  • Surveillance de la disponibilité sur le point d'accès de santé

Sécurité

  • Les dépendances sont analysées pour les CVE
  • CORS configuré uniquement pour les origines autorisées
  • Limitation de débit activée sur les points d'accès publics
  • Authentification et autorisation vérifiées
  • En-têtes de sécurité définis (CSP, HSTS, X-Frame-Options)

Opérations

  • Plan de rollback documenté et testé
  • Migration de base de données testée avec des données de taille de production
  • Runbook pour les scénarios de panne courants
  • Rotation d'astreinte et chemin d'escalade définis

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/claude-api

Anthropic Claude API patterns for Python and TypeScript. Covers Messages API, streaming, tool use, vision, extended thinking, batches, prompt caching, and Claude Agent SDK. Use when building applications with the Claude API or Anthropic SDKs.

affaan-m/everything-claude-code

End-to-end marketing campaign planning and execution. Covers audience research, positioning, campaign angle definition, landing page copy, email sequences, social posts, ad copy, short-form video scripts, and content calendars. Use as the orchestration layer for multi-channel product launches. Use when planning or executing a multi-channel product launch, or producing landing page, email, social, or ad copy.

affaan-m/everything-claude-code

Development conventions and patterns for everything-claude-code. JavaScript project with conventional commits.

affaan-m/everything-claude-code-conventions

Development conventions and patterns for everything-claude-code. JavaScript project with conventional commits.

affaan-m/frontend-design

Create distinctive, production-grade frontend interfaces with high design quality. Use when the user asks to build web components, pages, or applications and the visual direction matters as much as the code quality.

affaan-m/gget

gget CLI and Python workflow for quick genomic database queries, sequence lookup, BLAST-style searches, enrichment checks, and reproducible bioinformatics evidence logs.

affaan-m/literature-review

Systematic literature-review workflow for academic, biomedical, technical, and scientific topics, including search planning, source screening, synthesis, citation checks, and evidence logging.

affaan-m/motion-ui

Production-ready UI motion system for React/Next.js. Use when implementing animations, transitions, or motion patterns.

affaan-m/project-guidelines-example

Example project-specific skill template based on a real production application.

affaan-m/pubmed-database

Direct PubMed and NCBI E-utilities search workflows for biomedical literature, MeSH queries, PMID lookup, citation retrieval, and API-backed literature monitoring.

affaan-m/scholar-evaluation

Structured scholarly-work evaluation for papers, proposals, literature reviews, methods sections, evidence quality, citation support, and research-writing feedback.

affaan-m/uspto-database

USPTO patent and trademark data workflow for official record lookup, PatentSearch queries, TSDR checks, assignment data, and reproducible IP research logs.

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.

Skills associés