Entwurf: Kuendigung — Export, Archiv und Abbau

Beim Kuendigen verspricht CluPilot schriftlich einen fertigen Datenexport. Im
Code steht dazu "(both mocked for now)" — es gibt keinen, und es gab nie einen.
Und die gekuendigte Maschine wird nie abgebaut: sie laeuft weiter, fuer immer,
auf einem Platz, den niemand mehr verkaufen kann.

Der Ablauf stammt vom Betreiber, und sein Angelpunkt ist, VORHER zu fragen: wer
keinen Export braucht, loest keine Arbeit aus und wartet auf nichts. Wer einen
bestellt, bekommt ihn am Laufzeitende samt Link, bestaetigt, dass alles da ist —
und ohne Bestaetigung gilt er nach der Frist als angenommen. Das steht in
derselben Mail, sonst waere es keine Zustimmung.

Eine technische Huerde ist benannt statt ueberspielt: der Export passt NICHT auf
die Platte des Kunden. Ein Business-Paket hat 175 GB Kontingent bei 200 GB
Platte — wer sein Kontingent nutzt, hat keinen Platz fuer ein Archiv seiner
eigenen Daten, und der Gastagent ist kein Weg, hundert Gigabyte herauszutragen.
Drei Wege stehen mit ihren Kosten da; empfohlen ist der ueber den Host, an der
Maschine vorbei.

Offen und ausdruecklich als Frage markiert: wie lange ein VM-Archiv liegen
bleibt. Ohne Frist waechst dieser Speicher unbegrenzt.
claude/nice-moser-521659
nexxo 2026-08-04 01:42:13 +02:00
parent 1eee6afe66
commit 460d0db35b
1 changed files with 204 additions and 0 deletions

View File

@ -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.