feat(deploymentkey): Rotation vor dem Umstellen abbrechen (#036)

Eine begonnene Rotation ließ sich nicht zurücknehmen; nahm ein Host den
neuen Key dauerhaft nicht an, blieb nur das Übergehen. Abbrechen
verwirft jetzt den neuen Key samt Private Key, ein Dry-Run nimmt ihn
wieder von den Hosts, und eine neue Rotation kann sofort starten.

Nebenbei: Aktionen der Benutzerverwaltung (#035) bekommen im Audit-Log
eine eigene Gruppe, statt den Filter „Anmeldung“ zu verwässern; der
E2E-Test für lokale Konten hängt nicht mehr von der Reihenfolge ab.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-12 22:52:32 +02:00
co-authored by Claude Opus 5.5
parent 68dbc7cadb
commit 5d03681f3c
11 changed files with 160 additions and 13 deletions
+23 -1
View File
@@ -1,4 +1,4 @@
import { CheckCheck, KeyRound, ShieldCheck } from "lucide-react";
import { CheckCheck, KeyRound, ShieldCheck, Undo2 } from "lucide-react";
import type { Metadata } from "next";
import Link from "next/link";
import { AusrollenPanel } from "@/components/ausrollen/AusrollenPanel";
@@ -81,6 +81,16 @@ export default async function DeploymentKeySeite() {
)}
</Karte>
{stand.phase === "bereit" && stand.abgebrochen && (
<Karte
titel="Abgebrochene Rotation aufräumen"
untertitel="Der verworfene Key kann noch in den Blöcken stehen. Ein Dry-Run zeigt es; steht alles auf Soll, ist nichts mehr zu tun."
>
<p className="text-muted mb-4 font-mono text-[13px] break-all">{stand.abgebrochen.fingerprint}</p>
<AusrollenPanel auswahl={{ deploymentKey: true }} offen={0} />
</Karte>
)}
{stand.phase === "bereit" && stand.aktuell && (
<Karte
titel="1 · Neuen Key erzeugen"
@@ -136,6 +146,18 @@ export default async function DeploymentKeySeite() {
<Umstellen fehlgeschlagen={fehlgeschlagen} />
</Karte>
)}
<Karte
titel="Rotation abbrechen"
untertitel="Solange nicht umgestellt ist: der neue Key wird verworfen, der alte bleibt unverändert. Danach per Dry-Run den neuen wieder von den Hosts entfernen."
className="border-danger-border"
>
<VorgangsKnopf
aktion={rotationsSchrittAktion.bind(null, "abbrechen")}
beschriftung="Rotation abbrechen"
variante="gefahr"
icon={<Undo2 className="size-4" />}
/>
</Karte>
</>
)}