Tips & Tricks (Aktualisiert: 3.6.2026)

Claude-Code-Produktionsvorfälle: Erkennung, Rollback, RCA und Prävention

Praxisleitfaden für Claude-Code-Vorfälle: Secrets, Löschungen, DB, Kosten, Rollback, RCA und Prävention.

Claude-Code-Produktionsvorfälle: Erkennung, Rollback, RCA und Prävention

Claude Code beschleunigt Arbeit, weil es Dateien lesen, Code ändern und Shell-Befehle ausführen kann. In Produktions-Repositories bedeutet diese Geschwindigkeit auch ein anderes Risiko: Eine schnelle Freigabe kann ein Secret veröffentlichen, lokale Dateien löschen, main überschreiben, eine gefährliche Migration starten oder API-Kosten erhöhen.

Dieser Artikel beschreibt keinen privaten Ausfall eines bestimmten Unternehmens. Es sind zusammengesetzte Szenarien aus ClaudeCodeLab-Übungen, Repository-Reviews und Content-Operations. Zeiten und Beträge sind Beispiele, die Muster sind aber realistisch genug für ein Training.

Ein Incident ist ein Ereignis, das Nutzer, Daten, Sicherheit, Kosten oder Verfügbarkeit betrifft. Eindämmung bedeutet, weiteren Schaden zu stoppen. RCA ist Root-Cause-Analyse, also Ursachenanalyse. Rollback bedeutet Rückkehr zur letzten sicheren Version.

Die aktuelle Syntax steht in der offiziellen Dokumentation zu Claude Code settings und hooks. Hier bauen wir daraus einen Ablauf: erkennen, eindämmen, diagnostizieren, zurückrollen, kommunizieren, Postmortem schreiben und Wiederholung verhindern.

Ablauf für die Reaktion

PhaseZielAuftrag an Claude Code
ErkennenÄnderung und Auswirkung findenAlerts, Logs, Diff, Deploys und Befehle zusammenfassen
EindämmenSchaden stoppenSchlüssel sperren, Jobs pausieren, Flags abschalten, Endpoints sperren
DiagnostizierenDirekte Ursache eingrenzenLetzte sichere Version mit dem Fehlerwechsel vergleichen
RollbackSicheren Zustand herstellenZielversion, Datenrisiko und Prüfkommandos nennen
KommunizierenUnsicherheit senkenStatus, Impact, nächste Aktualisierung und Owner formulieren
PostmortemLernen festhaltenRCA, Timeline, Erkennungslücke und Maßnahmen ausfüllen
VorbeugenWiederholung erschwerenPermissions, Hooks, CI, Alerts und Review-Gates ergänzen

Bei Secrets, Abrechnung, personenbezogenen Daten und Datenbank-Schreibzugriffen gilt: erst eindämmen, dann untersuchen.

Sieben konkrete Muster

MusterWirkungErste ReaktionHäufiger Fehler
Secret-Leak.env, Logs oder Screenshots zeigen einen SchlüsselSperren, rotieren, Logs prüfenGit bereinigen, aber CI-Logs vergessen
Gefährliches Löschenrm -rf entfernt nötige DateienArbeit stoppen, Backups prüfen, untracked Dateien listengit checkout . stellt nur verfolgte Dateien wieder her
Force Pushmain überschreibt Team-CommitsPush stoppen, reflog prüfen, Recovery-Branch erstellen--force-with-lease mit --force verwechseln
DB-MigrationDrop, Mass-Update oder Lock legt Produktion lahmWrites pausieren, Zustand sichern, restore planenUngetestetes SQL direkt in Produktion
Endlose API-RetriesFehlversuche erzeugen KostenProzess beenden, Queue pausieren, Limits prüfen”Retry” wird zur Endlosschleife
Defekte DependencyDeployment startet mit 503Vorheriges Deployment reaktivieren, lockfile prüfennpm update hebt Major-Versionen an
Fehlende AuthAdmin-Endpunkt ist öffentlichEndpoint sperren, Access-Logs prüfen”Admin” wird nicht als Auth-Anforderung notiert

Drei Übungsfälle

Beim API-Key-Leak kann die Erkennung aus GitHub Secret Scanning, Cloud-Alerts oder Billing kommen. Zuerst wird der Schlüssel gesperrt. Danach prüft man Repository, Pull Requests, CI-Logs, Chat und Monitoring.

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

Bei einer Datenbankmigration werden Schreibzugriffe gestoppt, bevor man die Ursache erklärt. Code-Rollback ist oft schnell, aber gelöschte Daten brauchen Backup, Journal, Audit-Logs oder erneute Synchronisierung.

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

Für API-Retries braucht jeder Batch eine harte Grenze. Speichere die Datei als 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("nutzung: node incident-budget-runner.mjs <befehl> [...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(`gestoppt: geschätzte Kosten ${estimatedCost} Cent`);
    process.exit(1);
  }
  const delayMs = Math.min(1000 * 2 ** (attempt - 1), 10_000);
  await new Promise((resolve) => setTimeout(resolve, delayMs));
}

console.error(`fehlgeschlagen nach ${maxAttempts} Versuchen`);
process.exit(1);

Guardrails für 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 "Gefährlicher Befehl blockiert: $command" >&2
  exit 2
fi

exit 0

Kommunikation und Postmortem

## Incident-Update
- Status: Untersuchung / eingedämmt / Wiederherstellung wird geprüft
- Auswirkung: Funktion, Nutzer, Startzeit
- Aktuelle Aktion: Job gestoppt, Deployment zurückgerollt, Logs geprüft
- Nächstes Update: YYYY-MM-DD HH:mm
- Owner:
# Postmortem: [Titel]

## Zusammenfassung
- Start:
- Erkennung:
- Lösung:
- Auswirkung:
- Schweregrad: P0/P1/P2/P3

## Timeline
| Zeit | Ereignis |
| --- | --- |
| HH:mm | |

## Ursache
- Direkte Ursache:
- Root Cause:
- Warum wurde es spät erkannt:

## Prävention
| Maßnahme | Owner | Termin |
| --- | --- | --- |
| | | |

Als externe Referenz hilft Googles SRE-Kapitel Postmortem Culture.

Weiterführend sind Security Best Practices, der Permissions Guide, der API-Kostenguide und der Verification-Receipt-Workflow.

Einzelpersonen starten mit dem kostenlosen Cheatsheet. Wiederverwendbare Vorlagen stehen unter ClaudeCodeLab-Produkte. Teams können über Claude-Code-Training und Beratung CLAUDE.md, Permissions, Hooks, Review-Gates und Incident-Übungen ordnen.

In ClaudeCodeLab-Übungen war der größte Gewinn, Eindämmung vor Diagnose zu schreiben. Die Syntaxprüfung von JSON, Bash und Node vor Veröffentlichung hat einfache Fehler entfernt. Eine 20-Minuten-Probe zeigt schnell fehlende Alerts, ungetestete Backups und zu breite Claude-Code-Rechte.

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

Kostenloses PDF: Claude-Code-Cheatsheet

E-Mail eintragen und eine Seite mit Befehlen, Review-Gewohnheiten und sicheren Workflows herunterladen.

Wir schützen Ihre Daten und senden keinen Spam.

Masa

Über den Autor

Masa

Engineer für praktische Claude-Code-Workflows und Team-Einführung.