# Hostnamen vergibt CluPilot, nicht der Betreiber

**Stand:** Entwurf, 1. August 2026
**Auslöser:** gemessen auf `pve-fns-1`, dem ersten echten Host

---

## Das Problem, an dem es aufgefallen ist

Der Betreiber legte einen Host als `pve-fns-1` an. Die Konsole zeigte diesen
Namen, `PrepareBaseSystem` setzte ihn als Hostnamen, und Proxmox übernahm ihn
als Node-Namen.

`RegisterHostDns` trug aber etwas anderes ein:

```
10.66.0.100 fsn-01.node.clupilot.com
```

`HostTakeoverCommand::fqdnFor()` bildet den Namen **systematisch** aus
Rechenzentrum und laufender Nummer — unabhängig davon, was eingegeben wurde.

Damit führt CluPilot zwei Namen für dieselbe Maschine, und **nur einer davon
löst auf.** Der Betreiber rief den Namen auf, den er selbst vergeben hatte,
und stand vor einer Seite, die nicht lädt. Nirgendwo in der Oberfläche stand,
dass es einen zweiten gibt.

Das ist keine Anzeigeschwäche. Es sind zwei Wahrheiten über dieselbe Sache,
und die zweite fällt erst auf, wenn jemand sie braucht.

## Die Entscheidung

**Der systematische Name gewinnt. Das Namensfeld entfällt.**

Der Betreiber wählt ein Rechenzentrum und trägt IP und Root-Passwort ein.
Den Namen vergibt CluPilot:

```
<rz>-<nn>          fsn-03
<rz>-<nn>.node.<zone>   fsn-03.node.clupilot.com
```

Ein Name, an einer Stelle gebildet, von Maschine, Proxmox-Node, DNS und
Konsole gleichermaßen benutzt.

Begründung des Besitzers, wörtlich: *„das wäre sogar besser wie pve-fns-1 was
ich eingetragen habe."* Ein selbst getippter Name ist eine Fehlerquelle ohne
Gegenwert — er muss eindeutig sein, DNS-tauglich, und er sagt nichts, was das
Rechenzentrum nicht schon sagt.

## Wie die Nummer vergeben wird

**Fortlaufend je Rechenzentrum, niemals wiederverwendet.**

Eine gelöschte `fsn-02` steht danach noch in Protokollen, in Sicherungen, in
der Überwachungshistorie und im DNS-Zwischenspeicher. Bekäme die nächste
Maschine denselben Namen, teilten sich zwei verschiedene Server einen Namen
über die Zeit — und niemand könnte im Nachhinein sagen, welche gemeint war.

`MAX(nummer) + 1` **reicht dafür nicht**, weil `PurgeHost` die Zeile löscht und
das Maximum damit zurückfällt. Der Zähler muss die Löschung überleben:

- Spalte `next_host_number` an `datacenters`, Vorgabe 1
- Vergabe erhöht sie, Löschen eines Hosts fasst sie nicht an
- Vergabe innerhalb der bestehenden Transaktion in `StartHostOnboarding`,
  mit Sperre auf die Rechenzentrums-Zeile (`lockForUpdate`)
- Zusätzlich ein eindeutiger Index auf `hosts.name` — ein Riegel, kein Ersatz

Zweistellig aufgefüllt (`fsn-03`), ab hundert wächst es natürlich weiter
(`fsn-100`). Kein Sonderfall nötig.

## Was sich ändert

| Ort | Heute | Danach |
|---|---|---|
| `Admin\HostCreate` | Feld „Name", Pflicht | entfällt; die Seite **zeigt**, welcher Name vergeben wird |
| `StartHostOnboarding` | nimmt `name` entgegen | vergibt ihn selbst aus dem Rechenzentrum |
| `HostTakeoverCommand::fqdnFor()` | bildet `<rz>-<nn>` eigenständig | `$host->name.'.node.'.$zone` — eine Zeile |
| `RegisterHostDns` | eigene Ableitung | benutzt dieselbe Quelle |
| `PrepareBaseSystem` | `hostnamectl set-hostname $host->name` | unverändert — der Name ist jetzt der richtige |
| `datacenters` | — | Spalte `next_host_number` |
| `hosts` | `name` frei | eindeutiger Index auf `name` |

`PrepareBaseSystem` bleibt bewusst unangetastet: Es setzte immer schon
`$host->name`. Sobald der Name systematisch ist, stimmen Maschine, Node und DNS
von selbst überein. Das ist der Beweis, dass die Reparatur an der richtigen
Stelle sitzt — sie entfernt eine zweite Quelle, statt eine dritte einzuführen.

## Die Anlegen-Seite sagt den Namen vorher

Ein Name, der ohne Ankündigung entsteht, ist eine Überraschung. Die Seite
zeigt ihn, sobald ein Rechenzentrum gewählt ist:

> Dieser Host wird **fsn-03** heißen und unter
> `fsn-03.node.clupilot.com` erreichbar sein.

Vergeben wird er trotzdem erst beim Speichern — die Vorschau liest den Zähler,
sie verbraucht ihn nicht. Zwei gleichzeitig geöffnete Formulare zeigen also
beide `fsn-03`, und der zweite bekommt beim Speichern `fsn-04`. Das ist
richtig so und darf nicht durch eine Reservierung „behoben" werden: ein
abgebrochenes Formular hinterließe sonst eine Lücke im Zähler, die niemand
wieder auffüllt.

## Der bestehende Host

`pve-fns-1` läuft, sein Proxmox-Node heißt so, und ein Node lässt sich
nachträglich nur mühsam umbenennen.

**Die Zeile wird auf `fsn-01` umbenannt, die Maschine nicht.** Konsole und DNS
stimmen damit überein; dass der Proxmox-Node anders heißt, ist sichtbar und
schadet nicht — die Host-Detailseite führt „Node" ohnehin als eigenes Feld.

`datacenters.next_host_number` für `fsn` startet entsprechend bei 2.

## Abnahme

1. Host in `fsn` anlegen ohne Namensfeld → heißt `fsn-02`, DNS löst auf
2. Zweiten anlegen → `fsn-03`, keine Kollision
3. `fsn-02` entfernen, dritten anlegen → **`fsn-04`**, nicht `fsn-02`
4. Auf der Maschine: `hostname` meldet denselben Namen wie das DNS
5. Zwei Formulare gleichzeitig: beide zeigen `fsn-05`, gespeichert wird
   `fsn-05` und `fsn-06`

Punkt 3 ist der, der die Sorgfalt trägt. Er scheitert bei jeder Umsetzung, die
`MAX(nummer) + 1` rechnet.

## Reihenfolge

Nach `vmbr0`, vor der vollständigen Abnahmeinstallation. Der Besitzer will die
Namensvergabe im selben Durchlauf prüfen, in dem eine frische Maschine ohne
einen Handgriff auf `active` geht.
