-.node.`. * * Mitgegeben statt vom Skript geraten. Die erste Fassung leitete ihn auf der * Maschine aus der Rückwärtsauflösung ab und fiel notfalls auf einen fest * verdrahteten Namen zurück — der Installer verlangt einen FQDN, und ein * geratener steht danach in `/etc/hosts`, im Zertifikatsantrag und in jeder * Protokollzeile des Hosts. * * Die PLATTFORM-Zone, nicht die Kundenzone: `clupilot.com`, nicht * `clupilot.cloud`. Die zwei sind laut OfficialDomains getrennt, und ein * Host gehört auf die Seite der Plattform. */ public static function fqdnFor(Host $host): string { $name = $host->dns_name ?: $host->name; return $name.'.node.'.config('provisioning.dns.platform_zone'); } /** Die Präfixlänge des Tunnel-Subnetzes, damit `--wg-ip` vollständig ist. */ private static function subnetPrefix(): string { $subnet = (string) config('provisioning.wireguard.subnet', '10.66.0.0/24'); return str_contains($subnet, '/') ? explode('/', $subnet)[1] : '24'; } /** * Was in der Zeile fehlt, damit sie überhaupt funktionieren kann. * * Ein leerer Hub-Schlüssel oder ein leerer Endpunkt ergibt eine Zeile, die * sauber aussieht, kopiert wird, läuft — und in einem Tunnel endet, der nie * einen Handshake hat. Das fiele erst auf der Maschine auf, nach der * Installation. Lieber hier sagen, was fehlt. * * @return list */ public static function missingSettings(): array { $missing = []; if (blank(config('provisioning.wireguard.hub_public_key'))) { $missing[] = 'CLUPILOT_WG_HUB_PUBKEY'; } if (blank(config('provisioning.wireguard.endpoint'))) { $missing[] = 'CLUPILOT_WG_ENDPOINT'; } if (blank(config('provisioning.wireguard.hub_address'))) { $missing[] = 'CLUPILOT_WG_HUB_ADDRESS'; } return $missing; } }