From d5b2612e24393d2a3266e4dcde3890835f852bc0 Mon Sep 17 00:00:00 2001 From: nexxo Date: Wed, 29 Jul 2026 17:10:06 +0200 Subject: [PATCH] Always name the host we are being served from, and stop promising a duration MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ── Why the domain list looked wrong ───────────────────────────────────────── Reported three times, and it was not only the setting. The list came from `admin_access.site_hosts` and the instance zone — and where SITE_HOST is not configured, site_hosts is EMPTY. So an installation reached by a name nobody wrote into the config listed ONLY the instance zone, and described it as the customers' domain: the page a visitor opened to check our addresses omitted the address they had just typed, and named the wrong thing as ours. The host serving the request is now always in the list. It is the one address that is true by construction and needs no configuration to be right. (The zone itself is still one setting, and it is now clupilot.cloud on this machine. On another installation it is Konsole → Integrationen → DNS-Zone.) ── The clock ──────────────────────────────────────────────────────────────── "Eine Zeit angeben geht nicht — wenn es fertig ist, ist es fertig." Correct, and it was claimed three times over: an eyebrow saying "In 20 Minuten betriebsbereit", a provisioning log with minute marks down the side, and a closing line repeating it. A run waits on a hypervisor, on a certificate authority and on DNS propagating. A customer who once waits forty minutes has been told something untrue by their supplier, and the page cannot take it back. What replaces it is what actually IS promised and kept: the order of the steps, ticked off, numbered 1/5 to 5/5 — and then the sentence that answers the real question behind "how long", which is not a number but "do I have to sit here": you get an email with the address and the credentials when it is ready. The same claim is gone from the hero meta ("< 20 Min." → "automatisch"), from the figure line ("20 Minuten bis zum Betrieb" → "0 Termine bis zum Start") and from the FAQ, which now says outright that we do not name a duration and why. Kept deliberately: the 45-minute training session and the three-to-seven working days for setup. Those are appointments we schedule and commitments we control, not predictions about a machine. Co-Authored-By: Claude Opus 5 --- VERSION | 2 +- app/Support/OfficialDomains.php | 15 +++++++++ resources/views/landing.blade.php | 53 +++++++++++++++++++++---------- 3 files changed, 52 insertions(+), 18 deletions(-) diff --git a/VERSION b/VERSION index 4fc01ac..3c59b40 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.3.19 +1.3.20 diff --git a/app/Support/OfficialDomains.php b/app/Support/OfficialDomains.php index 3849731..46054aa 100644 --- a/app/Support/OfficialDomains.php +++ b/app/Support/OfficialDomains.php @@ -31,6 +31,21 @@ class OfficialDomains $entries[] = ['host' => (string) $host, 'what' => 'site']; } + // The host this page is being served from, always. + // + // Without it an installation that has not configured SITE_HOST — a + // development box, or one reached by a name nobody wrote into the + // config — listed ONLY the instance zone, and described it as the + // customers' domain. So the page a visitor opened to check our + // addresses omitted the address they had just typed, and named the + // wrong thing as ours. Reported exactly that way. + // + // Deduplicated below by hostname, so a configured site host does not + // appear twice. + if (($current = request()?->getHost()) && ! in_array($current, array_column($entries, 'host'), true)) { + $entries[] = ['host' => $current, 'what' => 'site']; + } + if ($app = (string) config('admin_access.app_host')) { $entries[] = ['host' => $app, 'what' => 'portal']; } diff --git a/resources/views/landing.blade.php b/resources/views/landing.blade.php index 015973c..629c26a 100644 --- a/resources/views/landing.blade.php +++ b/resources/views/landing.blade.php @@ -135,7 +135,7 @@ ['99,95', '99.95', 2, '% Verfügbarkeit'], ['365', '365', 0, 'Sicherungen pro Jahr'], ['12', '12', 0, 'Wiederherstellungstests'], - ['20', '20', 0, 'Minuten bis zum Betrieb'], + ['0', '0', 0, 'Termine bis zum Start'], ['0', '0', 0, 'Datenverluste'], ] as [$shown, $target, $decimals, $label])
@@ -262,8 +262,19 @@ {{-- ════ The dark hinge — how it arrives ════════════════════════════════ --}}
+ {{-- No clock anywhere in this section any more. + "In 20 Minuten betriebsbereit", a log with minute marks down the + side, "betriebsbereit in unter 20 Minuten" — three promises about + a duration nobody controls. A provisioning run waits on a + hypervisor, on a certificate authority and on DNS propagating; + when it is done it is done, and a customer who once waited + forty minutes has been told something untrue by their supplier. + + What replaces it is the thing that IS promised and IS kept: the + order of the steps, and a message when it is ready. Nobody has to + sit and watch. --}}
-

In 20 Minuten betriebsbereit

+

Ohne Termin, ohne Warten

Nur der erste Schritt ist Ihrer.

@@ -272,7 +283,7 @@
    @foreach ([ - ['Sie', 'Paket wählen', 'Zwei Minuten online. Die Instanz wird unmittelbar danach automatisch erstellt.'], + ['Sie', 'Paket wählen', 'Ein Formular online. Unmittelbar danach beginnt die Instanz von selbst zu entstehen — Sie müssen nichts weiter tun und auf nichts warten.'], ['Wir', 'Einrichtung', 'Benutzer und Rechte, Ordnerstruktur, Ihr Logo, Ihre Domain. Auf Wunsch übernehmen wir Bestandsdaten aus Dropbox, OneDrive oder vom alten Server — mit schriftlichem Übernahmeprotokoll.'], ['Gemeinsam', 'Einschulung', '45 Minuten für Ihr Team per Videokonferenz, Kurzanleitung als PDF mit Ihren eigenen Screenshots.'], ] as $i => [$who, $what, $body]) @@ -296,23 +307,31 @@ Bereitstellungsprotokoll Beispiel
+ {{-- The steps in order, ticked as they pass. The column that + held minute marks now holds a number: WHAT happens and in + which order is a promise that can be kept. --}} @foreach ([ - ['0:40', 'Instanz erstellt und gestartet'], - ['1:10', 'Verschlüsselung und Firewall aktiv'], - ['2:30', 'Domain verbunden, Zertifikat ausgestellt'], - ['4:15', 'Erste Sicherung angelegt und geprüft'], - ['5:00', 'Logo und Farben hinterlegt'], - ] as [$at, $what]) -
- + 'Instanz erstellt und gestartet', + 'Verschlüsselung und Firewall aktiv', + 'Domain verbunden, Zertifikat ausgestellt', + 'Erste Sicherung angelegt und geprüft', + 'Logo und Farben hinterlegt', + ] as $i => $what) +
+ + + {{ $what }} - OK + {{ $i + 1 }}/5
@endforeach -

- - Instanz betriebsbereit in unter 20 Minuten. -

+
+ +

+ Fertig. Sie bekommen eine E-Mail mit Adresse und Zugangsdaten, + sobald Ihre Cloud bereit ist — Sie müssen nicht danebensitzen. +

+
@@ -669,7 +688,7 @@ @foreach ([ ['Was passiert mit unseren Daten, wenn wir kündigen?', 'Sie erhalten vor Vertragsende einen vollständigen Export in offenen Standardformaten. Ihre Cloud basiert auf Open-Source-Software — Sie sind nie eingesperrt. Nach der Übergabe löschen wir Instanz und Sicherungen und bestätigen das schriftlich.'], ['Ersetzt das Microsoft 365?', 'Es ersetzt den Dateiteil. Viele Kunden behalten Microsoft für E-Mail und nutzen die Cloud als zentrale, sichere Ablage statt OneDrive oder Dropbox — zum fixen Firmenpreis statt pro Benutzer.'], - ['Wie lange dauert die Einrichtung?', 'Die Instanz läuft wenige Minuten nach der Bestellung. Die vollständige Einrichtung — Benutzer und Rechte, Ordnerstruktur nach Branchenvorlage, Ihr Logo, Ihre Domain und die Einschulung — ist in drei bis sieben Werktagen abgeschlossen. Die Übernahme Ihrer Bestandsdaten aus Dropbox, OneDrive oder vom alten Server bieten wir gesondert an, inklusive schriftlichem Übernahmeprotokoll.'], + ['Wie lange dauert die Einrichtung?', 'Die Instanz entsteht unmittelbar nach der Bestellung von selbst; Sie bekommen eine E-Mail, sobald sie bereit ist. Eine Dauer nennen wir bewusst nicht — sie hängt an Dingen, die wir nicht allein in der Hand haben. Die vollständige Einrichtung — Benutzer und Rechte, Ordnerstruktur nach Branchenvorlage, Ihr Logo, Ihre Domain und die Einschulung — ist in drei bis sieben Werktagen abgeschlossen. Die Übernahme Ihrer Bestandsdaten aus Dropbox, OneDrive oder vom alten Server bieten wir gesondert an, inklusive schriftlichem Übernahmeprotokoll.'], ['Was, wenn jemand versehentlich Dateien löscht?', 'Papierkorb und Versionierung fangen den Alltag ab. Darüber hinaus gibt es tägliche Sicherungen mit 30 Tagen Aufbewahrung: Ein Anruf genügt, wir stellen den gewünschten Stand wieder her.'], ['Brauchen wir eigene IT-Kenntnisse?', 'Nein. Bedienen kann es jeder, der mit Ordnern und Dateien umgeht — dafür gibt es die Einschulung. Alles Technische übernehmen wir dauerhaft.'], ['Mit wem spreche ich bei Fragen?', 'Direkt mit uns, per E-Mail oder Telefon, auf Deutsch, mit Antwort am selben Werktag. Kein Callcenter, keine Warteschleife.'],