diff --git a/app/Livewire/Admin/HostCreate.php b/app/Livewire/Admin/HostCreate.php index df55aee..ee773a4 100644 --- a/app/Livewire/Admin/HostCreate.php +++ b/app/Livewire/Admin/HostCreate.php @@ -3,6 +3,7 @@ namespace App\Livewire\Admin; use App\Actions\StartHostOnboarding; +use App\Models\Datacenter; use App\Support\HostEnrolment; use App\Support\HostName; use App\Support\HostTakeoverCommand; @@ -14,16 +15,9 @@ use Livewire\Component; class HostCreate extends Component { /** - * Die fertige Befehlszeile — gesetzt, sobald der Host angelegt ist. - * - * Sie wird GENAU EINMAL gezeigt. In der Datenbank steht nur der Hash des - * Codes, und der private Schlüssel steht dort überhaupt nicht; wer die Seite - * neu lädt, bekommt sie nicht wieder, sondern legt einen neuen Code an. Das - * ist kein Versehen, sondern der Grund, warum ein abgefangener Blick auf - * einen Bildschirm später nichts mehr wert ist. + * Gesetzt, sobald der Host angelegt ist — und zugleich die Weiche der + * Ansicht zwischen Formular und Bestätigung. */ - public ?string $command = null; - public ?string $createdUuid = null; public ?string $createdName = null; @@ -33,7 +27,7 @@ class HostCreate extends Component public function mount(): void { - $this->datacenter = (string) \App\Models\Datacenter::query()->active()->orderBy('name')->value('code'); + $this->datacenter = (string) Datacenter::query()->active()->orderBy('name')->value('code'); } #[Validate('required|ip|unique:hosts,public_ip')] @@ -49,10 +43,18 @@ class HostCreate extends Component $host = $action->run($data); - // Kein Weiterleiten mehr. Die Befehlszeile gibt es nur hier und nur - // jetzt — wer den Betreiber auf eine andere Seite schickt, schickt ihn - // von dem einzigen Wert weg, den er braucht. - $this->command = HostTakeoverCommand::for($host, HostEnrolment::issueWithKeys($host)); + // Der Einmal-Code und das Schlüsselpaar entstehen weiterhin: dieselbe + // Methode legt auch die Tunneladresse und den öffentlichen Schlüssel am + // Host an, und der Code trägt den Bootstrap-Weg, der über + // Admin\ReissueTakeover erreichbar bleibt. + // + // Die BEFEHLSZEILE daraus zeigt diese Seite nicht mehr. Sie gehört zum + // Rettungssystem-Weg, und das Speichern hier startet die + // Provisionierungs-Pipeline: `EstablishSshTrust` meldet sich mit dem + // Root-Passwort an einer laufenden Debian-Maschine an, danach kommt + // Proxmox per Paket dazu. Es gibt für den Betreiber nichts zu kopieren. + HostEnrolment::issueWithKeys($host); + $this->createdUuid = $host->uuid; $this->createdName = $host->name; } @@ -65,10 +67,13 @@ class HostCreate extends Component $preview = $this->datacenter === '' ? null : HostName::preview($this->datacenter); return view('livewire.admin.host-create', [ - 'datacenters' => \App\Models\Datacenter::query()->active()->orderBy('name')->get(), + 'datacenters' => Datacenter::query()->active()->orderBy('name')->get(), 'previewName' => $preview, 'previewFqdn' => $preview === null ? null : HostName::fqdn($preview), - 'archiveUrl' => HostTakeoverCommand::archiveUrl(), + // `archiveUrl` fiel weg: er war der Hinweis, woher die Bootstrap- + // Zeile ihr Skript holt, und die Zeile zeigt diese Seite nicht mehr. + // Die fehlenden Tunnel-Einstellungen bleiben — ohne sie kommt auch + // die Pipeline nicht in den Tunnel. 'missingSettings' => HostTakeoverCommand::missingSettings(), ]); } diff --git a/app/Livewire/Admin/Hosts.php b/app/Livewire/Admin/Hosts.php index 9a7fc89..f3d95e2 100644 --- a/app/Livewire/Admin/Hosts.php +++ b/app/Livewire/Admin/Hosts.php @@ -56,7 +56,6 @@ class Hosts extends Component // Für die aufklappbare Anleitung: dieselbe Adresse, die später in // der Befehlszeile steht, damit hier nichts anderes behauptet wird // als dort getan wird. - 'archiveUrl' => \App\Support\HostTakeoverCommand::archiveUrl(), ]); } } diff --git a/lang/de/hosts.php b/lang/de/hosts.php index 2f15420..63d494e 100644 --- a/lang/de/hosts.php +++ b/lang/de/hosts.php @@ -183,43 +183,38 @@ return [ 'takeover' => [ 'eyebrow' => 'Host-Übernahme', 'how_title' => 'So läuft eine Host-Übernahme ab', - 'how_sub' => 'Sechs Schritte, etwa 20 bis 40 Minuten. Die ersten beiden passieren beim Anbieter.', + 'how_sub' => 'Drei Schritte. Nur der erste passiert beim Anbieter.', 'rail_title' => 'Ablauf', 'badge_before' => 'vorher', // Kurz — sie stehen in der Schiene nebeneinander, nicht als Absatz. + // + // Bis hierher standen hier SECHS Schritte, und zwei davon hießen + // „Rettungssystem". Sie beschrieben den Bootstrap-Weg: Rettungssystem + // starten, Befehlszeile kopieren, dort einfügen. Beim Speichern läuft + // aber die Provisionierungs-Pipeline — `EstablishSshTrust` meldet sich + // schlicht mit dem Root-Passwort an einer LAUFENDEN Debian-Maschine an, + // dann kommt Proxmox per Paket dazu. Die Seite beschrieb den einen Weg + // und ging den anderen. 's1_label' => 'Server bestellen', - 's2_label' => 'Rettungssystem', - 's3_label' => 'Host anlegen', - 's4_label' => 'Zeile kopieren', - 's5_label' => 'Einfügen', - 's6_label' => 'Zusehen', + 's2_label' => 'Host anlegen', + 's3_label' => 'Zusehen', 's1_title' => 'Server bestellen', - 's1_body' => 'Dediziert, nicht Cloud. Ohne /dev/kvm startet kein Gast, und das Skript weist die Maschine ab.', + 's1_body' => 'Dediziert, nicht Cloud, mit vorinstalliertem Debian 13 und Zugang als Root. Ohne /dev/kvm startet später kein Gast.', - 's2_title' => 'Rettungssystem starten', - 's2_body' => 'Einschalten UND neu starten. Läuft der Server noch im alten System, weigert sich das Skript — es überschreibt Platten.', + 's2_title' => 'Host anlegen', + 's2_body' => 'Rechenzentrum, öffentliche IP, Root-Passwort. Das Passwort gilt nur für die erste Anmeldung und wird verworfen, sobald der Schlüssel liegt.', - 's3_title' => 'Host anlegen', - 's3_body' => 'Die Angaben unten. Danach entsteht der Einmal-Code, und seine Frist von 24 Stunden beginnt.', - - 's4_title' => 'Befehlszeile kopieren', - 's4_body' => 'Sie erscheint nach dem Speichern und wird genau einmal gezeigt.', - - 's5_title' => 'Im Rettungssystem einfügen', - 's5_body' => 'Per SSH als root, Zeile einfügen, Eingabetaste. Nichts abtippen, nichts ausfüllen.', - 's5_hint' => 'Holt das Skript von :url und startet es. Mehr lädt der Server nicht nach.', - - 's6_title' => 'Zusehen', - 's6_body' => 'Der Fortschritt läuft auf der Host-Seite mit. Bis der Tunnel steht, meldet der Server nichts — danach kommt alles auf einmal nach.', + 's3_title' => 'Zusehen', + 's3_body' => 'CluPilot meldet sich selbst an, installiert Proxmox, startet in dessen Kernel und baut Netzbrücke, Tunnel und Vorlage. Der Fortschritt läuft auf der Host-Seite mit.', 'requirements_title' => 'Beim Anbieter, vorher', - 'requirements_sub' => 'Beides muss erledigt sein, bevor unten gespeichert wird — der Code läuft ab dem Speichern.', + 'requirements_sub' => 'Das muss stehen, bevor unten gespeichert wird — danach meldet sich CluPilot an der Maschine an.', 'form_title' => 'Der Host', - 'form_sub' => 'Vier Angaben. Den Rest holt sich der Server selbst.', + 'form_sub' => 'Drei Angaben. Den Rest holt sich der Server selbst.', 'command_title' => 'Die Befehlszeile', 'command_sub' => 'Einfügen im Rettungssystem, als root. Sie trägt alles, was der Server vor dem Tunnel braucht.', diff --git a/lang/en/hosts.php b/lang/en/hosts.php index 685186b..dd2c82d 100644 --- a/lang/en/hosts.php +++ b/lang/en/hosts.php @@ -183,42 +183,35 @@ return [ 'takeover' => [ 'eyebrow' => 'Host takeover', 'how_title' => 'How a host takeover works', - 'how_sub' => 'Six steps, roughly 20 to 40 minutes. The first two happen at the provider.', + 'how_sub' => 'Three steps. Only the first happens at the provider.', 'rail_title' => 'Procedure', 'badge_before' => 'first', + // There were SIX steps here, two of them named "rescue system": boot the + // rescue system, copy the command line, paste it there. That described + // the bootstrap route. Saving actually starts the provisioning pipeline + // — EstablishSshTrust simply signs in with the root password on a + // RUNNING Debian machine, and Proxmox arrives as a package after that. + // The page described one route and took the other. 's1_label' => 'Order server', - 's2_label' => 'Rescue system', - 's3_label' => 'Add host', - 's4_label' => 'Copy line', - 's5_label' => 'Paste', - 's6_label' => 'Watch', + 's2_label' => 'Add host', + 's3_label' => 'Watch', 's1_title' => 'Order the server', - 's1_body' => 'Dedicated, not cloud. Without /dev/kvm no guest will start, and the script turns the machine away.', + 's1_body' => 'Dedicated, not cloud, with Debian 13 preinstalled and root access. Without /dev/kvm no guest will start later on.', - 's2_title' => 'Boot the rescue system', - 's2_body' => 'Enable it AND restart. If the server is still in the old system the script refuses — it overwrites disks.', + 's2_title' => 'Add the host', + 's2_body' => 'Datacenter, public IP, root password. The password is only for the first sign-in and is discarded once the key is in place.', - 's3_title' => 'Add the host', - 's3_body' => 'The fields below. The one-time code is created after that, and its 24-hour window starts.', - - 's4_title' => 'Copy the command line', - 's4_body' => 'It appears after saving and is shown exactly once.', - - 's5_title' => 'Paste it into the rescue system', - 's5_body' => 'SSH in as root, paste, press enter. Nothing typed out, nothing filled in.', - 's5_hint' => 'Fetches the installer from :url and starts it. The server downloads nothing else.', - - 's6_title' => 'Watch', - 's6_body' => 'Progress appears on the host page. Until the tunnel is up the server reports nothing — then everything arrives at once.', + 's3_title' => 'Watch', + 's3_body' => 'CluPilot signs in by itself, installs Proxmox, reboots into its kernel and builds the bridge, the tunnel and the template. Progress appears on the host page.', 'requirements_title' => 'At the provider, first', - 'requirements_sub' => 'Both have to be done before you save below — the code starts expiring the moment you do.', + 'requirements_sub' => 'This has to be in place before you save below — CluPilot signs in to the machine straight after.', 'form_title' => 'The host', - 'form_sub' => 'Four fields. The server works out the rest itself.', + 'form_sub' => 'Three fields. The server works out the rest itself.', 'command_title' => 'The command line', 'command_sub' => 'Paste into the rescue system as root. It carries everything the server needs before the tunnel.', diff --git a/resources/views/components/admin/takeover-rail.blade.php b/resources/views/components/admin/takeover-rail.blade.php index e79546d..8c21fbd 100644 --- a/resources/views/components/admin/takeover-rail.blade.php +++ b/resources/views/components/admin/takeover-rail.blade.php @@ -1,7 +1,7 @@ @props([ - // Der Schritt, an dem der Betreiber gerade steht: 3 solange das Formular - // offen ist, 4 sobald die Befehlszeile da ist. - 'current' => 3, + // Der Schritt, an dem der Betreiber gerade steht: 2 solange das Formular + // offen ist, 3 sobald gespeichert wurde und die Pipeline läuft. + 'current' => 2, ]) {{-- Der Ablauf als schmale Schiene, nicht als Textwand. @@ -20,13 +20,15 @@ dasselbe Problem wäre eine zweite Sprache. --}} @php + // Drei, nicht sechs. Die drei gestrichenen — Rettungssystem starten, Zeile + // kopieren, dort einfügen — gehörten zum Bootstrap-Weg. Gefahren wird beim + // Speichern die Provisionierungs-Pipeline, und die meldet sich selbst an + // einer laufenden Debian-Maschine an. Der Betreiber tut wirklich weniger; + // die Schiene sagt es jetzt auch. $steps = [ 1 => __('hosts.takeover.s1_label'), 2 => __('hosts.takeover.s2_label'), 3 => __('hosts.takeover.s3_label'), - 4 => __('hosts.takeover.s4_label'), - 5 => __('hosts.takeover.s5_label'), - 6 => __('hosts.takeover.s6_label'), ]; @endphp diff --git a/resources/views/components/admin/takeover-steps.blade.php b/resources/views/components/admin/takeover-steps.blade.php index d6f9239..4cf7cc0 100644 --- a/resources/views/components/admin/takeover-steps.blade.php +++ b/resources/views/components/admin/takeover-steps.blade.php @@ -1,22 +1,22 @@ -@props(['archiveUrl' => '']) - -{{-- Dieselben sechs Schritte, für die Stelle, an der noch nichts angelegt ist: +{{-- Dieselben drei Schritte, für die Stelle, an der noch nichts angelegt ist: die Host-Liste. Dort ist es eine Auskunft und kein Ablauf — also Zeilen mit je einem Satz, nicht die Schiene mit Zustand. Eine Zeile je Schritt, nach dem Muster von `x-ui.row`: links wozu, rechts - was. Die zwei Schritte beim Anbieter tragen eine Plakette, sonst liest sich - die Liste, als könne man oben anfangen und sich durcharbeiten — und Schritt - 2 ist eine halbe Stunde Wartezeit. --}} + was. Der Schritt beim Anbieter trägt eine Plakette, sonst liest sich die + Liste, als könne man oben anfangen und sich durcharbeiten. + + Waren sechs, zwei davon „Rettungssystem". Sie beschrieben den + Bootstrap-Weg; gefahren wird beim Anlegen die Provisionierungs-Pipeline, + die sich selbst an einer laufenden Debian-Maschine anmeldet. Mit den + Schritten fiel auch `archiveUrl` weg — die Adresse gehörte zur + Befehlszeile, die es hier nicht mehr gibt. --}} @php $steps = [ 1 => [__('hosts.takeover.s1_title'), __('hosts.takeover.s1_body'), true], - 2 => [__('hosts.takeover.s2_title'), __('hosts.takeover.s2_body'), true], + 2 => [__('hosts.takeover.s2_title'), __('hosts.takeover.s2_body'), false], 3 => [__('hosts.takeover.s3_title'), __('hosts.takeover.s3_body'), false], - 4 => [__('hosts.takeover.s4_title'), __('hosts.takeover.s4_body'), false], - 5 => [__('hosts.takeover.s5_title'), __('hosts.takeover.s5_body'), false], - 6 => [__('hosts.takeover.s6_title'), __('hosts.takeover.s6_body'), false], ]; @endphp @@ -32,9 +32,6 @@
{{ $body }} - @if ($number === 5 && $archiveUrl) - {{ __('hosts.takeover.s5_hint', ['url' => $archiveUrl]) }} - @endif
@endforeach diff --git a/resources/views/livewire/admin/host-create.blade.php b/resources/views/livewire/admin/host-create.blade.php index 937fc58..04fab01 100644 --- a/resources/views/livewire/admin/host-create.blade.php +++ b/resources/views/livewire/admin/host-create.blade.php @@ -6,25 +6,25 @@{{ __('hosts.takeover.eyebrow') }}
- {{ $command === null ? __('hosts.create_sub') : __('hosts.takeover.subtitle') }} + {{ $createdUuid === null ? __("hosts.create_sub") : __("hosts.takeover.subtitle") }}
{{ __('hosts.takeover.missing_title') }}
@@ -32,9 +32,12 @@{{ __('hosts.takeover.requirements_sub') }}
@@ -43,9 +46,6 @@{{ __('hosts.takeover.s1_body') }}
{{ __('hosts.takeover.s2_body') }}
-{{ __('hosts.takeover.command_sub') }}
+{{ __('hosts.takeover.s3_body') }}
-{{ __('hosts.takeover.once_title') }}
- -{{ $command }}
+
-
- {{ __('hosts.takeover.once_body') }}
- - -{{ __('hosts.takeover.s5_body') }}
-{{ __('hosts.takeover.s5_hint', ['url' => $archiveUrl]) }}
-{{ __('hosts.takeover.s6_body') }}
- -