Tips & Tricks (Mis à jour: 03/06/2026)

Incidents de production avec Claude Code: détection, rollback, RCA et prévention

Guide pratique des incidents Claude Code: secrets, suppressions, BD, coûts, rollback, RCA et prévention.

Incidents de production avec Claude Code: détection, rollback, RCA et prévention

Claude Code accélère le travail car il peut lire les fichiers, modifier le code et lancer des commandes. Dans un dépôt de production, cette vitesse crée aussi un nouveau risque: une approbation trop rapide peut exposer un secret, supprimer des fichiers, écraser main, exécuter une migration dangereuse ou multiplier les appels API.

Cet article ne décrit pas l’incident privé d’une entreprise réelle. Il synthétise des exercices ClaudeCodeLab, des revues de dépôts et des tâches de publication. Les heures et montants sont fictifs, mais les scénarios sont assez concrets pour servir de répétition.

Un incident touche les utilisateurs, les données, la sécurité, le coût ou la disponibilité. Contenir signifie empêcher l’aggravation. RCA signifie analyse de cause racine. Un rollback revient à la dernière version sûre.

Vérifiez toujours la syntaxe dans la documentation officielle Claude Code settings et hooks. Ici, nous organisons la réponse: détecter, contenir, diagnostiquer, revenir en arrière, communiquer, postmortem, prévenir.

Le flux de réponse

ÉtapeObjectifDemande utile à Claude Code
DétecterSavoir ce qui a changéRésumer alertes, logs, diff, déploiements et commandes
ContenirStopper les dégâtsProposer révocation de clé, pause de job, flag OFF ou endpoint coupé
DiagnostiquerIsoler la cause directeComparer la dernière version saine et le changement suspect
RollbackRevenir à un état sûrLister cible, risque de données et commandes de vérification
CommuniquerRéduire l’incertitudeRédiger état, impact, prochaine mise à jour et responsable
PostmortemTransformer l’incident en apprentissageRemplir RCA, chronologie, détection manquée et actions
PrévenirÉviter la répétitionAjouter permissions, hooks, CI, alertes et revue

Pour les secrets, la facturation, les données personnelles et les écritures en base, on contient d’abord et on enquête ensuite.

Sept scénarios concrets

ScénarioEffetPremier gestePiège fréquent
Secret exposé.env, logs ou captures révèlent une cléRévoquer, tourner, inspecter les logsNettoyer git mais oublier les logs CI
Suppression dangereuserm -rf enlève des fichiers utilesArrêter, vérifier sauvegardes, lister non suivisgit checkout . ne restaure pas le non suivi
Force pushmain écrase le travail d’autres personnesStopper les push, inspecter reflog, créer une branche de récupérationConfondre --force-with-lease et --force
Migration BDDrop, update massif ou lock casse la productionPauser les écritures, sauvegarder, restaurerSQL non testé lancé en production
API en boucleLes retries font monter le coûtTuer le processus, pauser la queue, vérifier les limites”Retry” devient boucle infinie
Dépendance casséeDéploiement en 503 au démarrageRéactiver l’ancien déploiement, lire le lockfilenpm update monte une version majeure
Auth manquanteEndpoint admin publicCouper endpoint, lire logs d’accès, notifier si besoin”Admin” n’est pas une exigence d’authentification

Trois cas à répéter

Pour une fuite de clé API, la détection peut venir du secret scanning GitHub, d’une alerte cloud ou d’une facture. La première action est la révocation. Ensuite seulement, on cherche où la clé a circulé.

git status --short
git diff --cached --name-only
git log --all -- .env .env.local
git grep -n "sk-" -- ':!node_modules' ':!dist'

Pour une migration BD, il faut stopper les écritures avant d’expliquer. Le code peut revenir vite, mais les données supprimées dépendent des sauvegardes, du journal et des audits.

psql "$DATABASE_URL" -c "select now();"
psql "$DATABASE_URL" -c "\d users"
pg_dump "$DATABASE_URL" --schema-only > schema_before_repair.sql

Pour les retries API, placez une limite explicite autour du batch. Enregistrez ce fichier sous incident-budget-runner.mjs.

#!/usr/bin/env node
import { spawn } from "node:child_process";

const command = process.argv.slice(2);
const maxAttempts = Number(process.env.MAX_ATTEMPTS || 3);
const maxCostCents = Number(process.env.MAX_COST_CENTS || 200);
const costPerAttempt = Number(process.env.COST_PER_ATTEMPT_CENTS || 0);

if (command.length === 0) {
  console.error("usage: node incident-budget-runner.mjs <commande> [...args]");
  process.exit(2);
}

let estimatedCost = 0;

for (let attempt = 1; attempt <= maxAttempts; attempt += 1) {
  const child = spawn(command[0], command.slice(1), {
    stdio: "inherit",
    shell: process.platform === "win32"
  });
  const exitCode = await new Promise((resolve) => {
    child.on("exit", (code) => resolve(code ?? 1));
  });
  estimatedCost += costPerAttempt;
  if (exitCode === 0) process.exit(0);
  if (estimatedCost >= maxCostCents) {
    console.error(`arrêt: coût estimé ${estimatedCost} centimes`);
    process.exit(1);
  }
  const delayMs = Math.min(1000 * 2 ** (attempt - 1), 10_000);
  await new Promise((resolve) => setTimeout(resolve, delayMs));
}

console.error(`échec après ${maxAttempts} tentatives`);
process.exit(1);

Garde-fous Claude Code

{
  "$schema": "https://json.schemastore.org/claude-code-settings.json",
  "permissions": {
    "deny": [
      "Read(./.env)",
      "Read(./.env.*)",
      "Read(./secrets/**)",
      "Bash(git push --force *main*)",
      "Bash(git push -f *main*)",
      "Bash(rm -rf /*)",
      "Bash(rm -rf ~*)"
    ],
    "ask": [
      "Bash(git push*)",
      "Bash(rm*)",
      "Bash(npm install*)",
      "Bash(*migrate*)",
      "Bash(*deploy*)"
    ]
  },
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Bash",
        "hooks": [
          {
            "type": "command",
            "command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/protect-danger.sh"
          }
        ]
      }
    ]
  }
}
#!/usr/bin/env bash
set -euo pipefail

payload="$(cat)"
command="$(node -e 'const fs = require("fs"); const raw = fs.readFileSync(0, "utf8") || "{}"; const json = JSON.parse(raw); console.log(json.tool_input?.command || "");' <<< "$payload")"
blocked='(rm[[:space:]]+-rf[[:space:]]+(/|~)|git[[:space:]]+push[[:space:]].*(-f|--force)([[:space:]]|$)|DROP[[:space:]]+TABLE|TRUNCATE[[:space:]])'

if [[ "$command" =~ $blocked ]]; then
  echo "Commande dangereuse bloquée: $command" >&2
  exit 2
fi

exit 0

Communication et postmortem

## Point incident
- État: enquête / contenu / récupération en validation
- Impact: fonctionnalité, utilisateurs, heure de début
- Action actuelle: job arrêté, déploiement annulé, logs vérifiés
- Prochaine mise à jour: YYYY-MM-DD HH:mm
- Responsable:
# Postmortem: [titre]

## Résumé
- Début:
- Détection:
- Résolution:
- Impact:
- Sévérité: P0/P1/P2/P3

## Chronologie
| Heure | Événement |
| --- | --- |
| HH:mm | |

## Cause
- Cause directe:
- Cause racine:
- Pourquoi la détection a tardé:

## Prévention
| Action | Responsable | Date limite |
| --- | --- | --- |
| | | |

La page Google SRE Postmortem Culture aide à garder ce document utile et non accusatoire.

Liens et CTA

Pour continuer, lisez bonnes pratiques sécurité, guide des permissions, guide des coûts API et workflow de vérification.

En solo, commencez par la cheatsheet gratuite. Pour des modèles réutilisables, consultez les produits ClaudeCodeLab. Pour une équipe, la page formation et conseil Claude Code permet de cadrer CLAUDE.md, permissions, hooks, revue et exercices.

Lors des essais ClaudeCodeLab, l’amélioration la plus nette a été d’écrire la contention avant le diagnostic. La vérification de la syntaxe JSON, Bash et Node avant publication a aussi supprimé plusieurs erreurs simples. Une répétition de 20 minutes montre vite les alertes absentes, les sauvegardes non testées et les permissions trop larges.

#claude-code #incident #production #sre #security #postmortem
Gratuit

PDF gratuit: cheatsheet Claude Code

Saisissez votre email et téléchargez une page avec commandes, habitudes de review et workflow sûr.

Nous protégeons vos données et n'envoyons pas de spam.

Masa

À propos de l'auteur

Masa

Ingénieur spécialisé dans les workflows pratiques avec Claude Code.