diff --git a/docs/superpowers/specs/2026-08-04-kuendigung-export-abbau-design.md b/docs/superpowers/specs/2026-08-04-kuendigung-export-abbau-design.md new file mode 100644 index 0000000..d37d0b9 --- /dev/null +++ b/docs/superpowers/specs/2026-08-04-kuendigung-export-abbau-design.md @@ -0,0 +1,204 @@ +# Kündigung: Export, Archiv und Abbau — Entwurf + +**Stand:** 2026-08-04 +**Zustand:** Entwurf. Eine technische Frage ist offen und braucht eine Entscheidung — siehe „Die eine harte Stelle". + +## Worum es geht + +Beim Kündigen verspricht CluPilot dem Kunden heute schriftlich einen fertigen +Datenexport. Im Code steht dazu `(both mocked for now)`. Es gibt **keinen +Export**, und es gab nie einen. + +Und die zweite Hälfte: die virtuelle Maschine eines gekündigten Kunden wird +**nie abgebaut**. Sie läuft weiter, für immer, mit ihrem Speicher und ihrem +Platz auf dem Host — einem Platz, den der Betreiber nicht mehr verkaufen kann. + +## Was heute schon richtig ist + +Nicht alles fehlt. Am Laufzeitende zieht `EndInstanceService` die Adresse ein: +Traefik-Route weg, DNS-Eintrag weg, `status = 'ended'`. Das schliesst eine +echte Lücke (ein Hostname, der auf einen Gast zeigt, den der Host später an +jemand anderen vergibt) und bleibt unverändert. + +Ebenso bleibt: **eine Kündigung endet nichts früher.** Wer am Zweiten kündigt, +hat bis zum Monatsende bezahlt und arbeitet bis dahin weiter. `hasEnded()` ist +die ganze Regel, und sie wird nicht angefasst. + +## Der Ablauf + +Vom Betreiber so entworfen: + +### 1. Beim Kündigen wird gefragt + +Der Kündigungsdialog stellt **eine** zusätzliche Frage: *Möchten Sie einen +Datenexport?* + +Das ist der Angelpunkt des ganzen Entwurfs. Wer keinen braucht — weil er seine +Dateien längst synchronisiert hat, weil er zu einem anderen Anbieter zieht, der +selbst überträgt —, löst keine Arbeit aus und wartet auf nichts. Wer einen +braucht, sagt es zu dem Zeitpunkt, an dem er ohnehin über seine Daten +nachdenkt. + +Die Antwort steht am Datensatz der Instanz. Sie lässt sich bis zum Laufzeitende +ändern: es ist dieselbe Frage, und ein Kunde, der es sich überlegt, soll nicht +anrufen müssen. + +### 2. Bis zum Laufzeitende ändert sich nichts + +Der Kunde arbeitet weiter. Keine Sperre, keine Einschränkung, keine +Erinnerungsmail, die wie eine Mahnung klingt. + +**Eine Erinnerung sieben Tage vor Ende** gehört trotzdem hinein, und zwar aus +einem Grund, der leicht übersehen wird: **ab dem Laufzeitende kommt der Kunde +nicht mehr an seine Nextcloud.** Die Adresse ist dann eingezogen. Wer selbst +etwas herunterladen will, muss es **vorher** tun, und das weiss er nur, wenn es +ihm jemand sagt. + +Die Erinnerung nennt das Datum, den Weg zum Selbst-Herunterladen, und ob ein +Export bestellt ist oder nicht — mit dem Knopf, das noch zu ändern. + +### 3. Am Laufzeitende + +Die Adresse geht (baut schon). Die Maschine **läuft weiter** — sie wird +gebraucht, für den Export und als Rückfahrkarte. + +Danach trennt sich der Weg: + +**Kein Export bestellt:** nichts weiter. Die Frist läuft. + +**Export bestellt:** der Export wird erzeugt und auf dem Speicherserver +abgelegt. Ist er fertig, bekommt der Kunde eine Mail mit einem zeitlich +begrenzten Link. + +### 4. Die Bestätigung, und was ohne sie gilt + +Die Mail bittet den Kunden zu bestätigen, dass sein Export vollständig ist. +Sie sagt im selben Atemzug, **was ohne Bestätigung geschieht**: nach Ablauf der +Frist gilt der Export als angenommen, und die Maschine wird abgebaut. + +Das ist die Entscheidung des Betreibers, und sie ist richtig herum: eine +Maschine, die auf eine Bestätigung wartet, die nie kommt, steht ewig. Aber sie +gilt nur, weil der Satz in der Mail steht — eine stillschweigende Zustimmung, +die niemandem angekündigt wurde, wäre keine. + +### 5. Nach vierzehn Tagen + +Vierzehn Tage nach dem Laufzeitende — oder früher, sobald der Kunde bestätigt +hat: + +1. Die Maschine wird heruntergefahren. +2. Sie wird als Ganzes auf den Speicherserver archiviert. +3. Sie wird vom Host gelöscht. Der Platz ist wieder verkaufbar. + +**Das Archiv ist das Sicherheitsnetz des Betreibers**, nicht das des Kunden. Er +kann daraus eine Maschine wiederherstellen. Der Kunde kann mit einem +Festplattenabbild nichts anfangen — dafür ist der Export da. Die beiden sind +keine Alternativen, sie beantworten verschiedene Fragen. + +--- + +## Die eine harte Stelle + +**Der Export passt nicht auf die Festplatte des Kunden.** + +Aus dem Katalog: + +| Paket | Kontingent | Platte | Luft | +|---|---|---|---| +| Start | 30 GB | 40 GB | 10 GB | +| Team | 85 GB | 100 GB | 15 GB | +| Business | 175 GB | 200 GB | 25 GB | + +Ein Kunde, der sein Kontingent ausnutzt, hat **keinen Platz für ein Archiv +seiner eigenen Daten**. Der naheliegende Weg — im Gast ein `tar` bauen und es +danach abholen — scheitert genau bei den Kunden, bei denen es am meisten +zählt. + +Dazu kommt: CluPilot erreicht einen Gast **nur über den Proxmox-Gastagenten**. +Der führt Befehle aus; er ist kein Weg, hundert Gigabyte herauszutragen. + +### Drei Wege, und was sie kosten + +**A — Vom Host aus, an der Maschine vorbei.** Die Platte des Gastes liegt als +Datenträger auf dem Proxmox-Host, und dorthin hat CluPilot eine SSH-Verbindung. +Die Platte wird auf dem Host schreibgeschützt eingehängt, das Datenverzeichnis +direkt auf den Speicherserver gepackt. **Kein Platz im Gast nötig, kein +Gastagent im Spiel.** Braucht Werkzeug auf dem Host (`qemu-nbd` oder +`libguestfs`), das dort noch nicht steht. + +**B — Aus dem Archiv heraus.** Die Maschine wird ohnehin archiviert. Man +archiviert zuerst, holt die Dateien danach **auf dem Speicherserver** aus dem +Abbild und packt sie dort. Ein Vorgang trägt beide Zwecke. Braucht dafür einen +Speicherserver, der das Abbild öffnen kann — er wird damit vom Ablageort zum +Werkzeug. + +**C — Kein Archiv von uns, nur ein Hinweis.** Der Kunde lädt vor dem +Laufzeitende selbst herunter; wir erinnern ihn zweimal und geben ihm den Weg. +Nichts zu bauen, kein Speicherbedarf. **Aber der Satz im Kündigungsdialog muss +geändert werden** — was dann versprochen wird, ist eine Frist und eine +Anleitung, kein fertiger Export. + +**Empfehlung: A.** Er ist der einzige, der ohne Umweg das liefert, was +versprochen wurde, und er belastet weder die Maschine des Kunden noch macht er +den Speicherserver zu etwas, das rechnen können muss. Der Preis ist ein +Werkzeug auf dem Host — und Hosts richtet dieses Produkt selbst ein, das ist +ein Schritt in der Übernahme, kein Handgriff des Betreibers. + +--- + +## Was ein Export enthält + +- **Die Dateien aller Benutzer**, in der Ordnerstruktur, die sie in ihrer Cloud + gesehen haben. Das ist der Teil, den ein Mensch braucht und ohne uns öffnen + kann. +- **Ein Abzug der Datenbank**, getrennt und als solcher benannt. Er trägt + Kontakte, Kalender und Freigaben. Ein Mensch kann damit nichts anfangen — ein + Anbieter, zu dem der Kunde zieht, sehr wohl. Ihn wegzulassen hiesse, genau + die Daten zurückzuhalten, die eine Übertragung möglich machen. +- **Eine Liesmich-Datei**, die sagt, was die beiden Teile sind. + +--- + +## Offene Frage an den Betreiber + +**Wie lange bleibt ein VM-Archiv liegen?** + +Das ist die Zahl, die über den Speicherbedarf entscheidet, und sie ist nicht +gestellt worden. + +Ein Business-Archiv bringt bis zu 200 GB mit. Archiviert man **jede** gekündigte +Maschine und löscht nie, wächst dieser Speicher **unbegrenzt**: zehn +Kündigungen sind zwei Terabyte, die nie wieder kleiner werden. In zwei Jahren +zahlt der Betreiber für Kunden, die es seit anderthalb Jahren nicht mehr gibt. + +Vorschlag: **zwölf Monate.** Lang genug für jede Nachfrage, die realistisch +kommt, und kurz genug, dass der Speicher eine Grösse hat statt einer Richtung. +Danach fällt das Archiv weg — angekündigt in derselben Mail, in der die +Bestätigung erbeten wird. + +--- + +## Was der Speicherserver dreifach trägt + +Dieselbe Box trägt drei Dinge, von denen zwei ohnehin gebraucht werden: + +1. **Zweiter Sicherungsort** — das Modul, das heute **verkauft wird und nichts + tut**. Von den dreien das dringlichste, weil dort bereits Geld fliesst. +2. Die VM-Archive. +3. Die Kunden-Exporte. + +Für die Exporte ist der Bedarf klein: sie leben, bis der Kunde sie geholt hat. +Drei gleichzeitig kündigende Business-Kunden sind gut 500 GB. Der grosse +Posten sind die Archive, und dort entscheidet die Frist oben. + +--- + +## Was nicht gebaut wird + +- **Kein früheres Ende.** Eine Kündigung nimmt niemandem etwas weg, wofür er + bezahlt hat. +- **Keine Wiederherstellung durch den Kunden.** Wer zurückwill, meldet sich; + innerhalb der vierzehn Tage steht die Maschine noch. Ein Selbstbedienungsknopf + dafür wäre ein eigenes Vorhaben. +- **Kein Export nach dem Abbau.** Danach gibt es das Archiv, und das öffnet der + Betreiber.