step === 1) { $this->validateOnly('form_domain'); $this->validateOnly('form_timezone'); } elseif ($this->step === 2) { $this->validate([ 'form_admin_name' => 'required|string|min:3', 'form_admin_email' => 'required|email', 'form_admin_password' => 'required|string|min:8|same:form_admin_password_confirmation', ]); } $this->step = min($this->step + 1, 3); } public function prevStep() { $this->step = max($this->step - 1, 1); } public function finish() { // Step 3 Validierung (nur wenn sofort erstellen) if ($this->form_cert_create_now) { $this->validateOnly('form_cert_email'); } // 1) Settings persistieren Setting::set('app.domain', $this->form_domain); Setting::set('app.timezone', $this->form_timezone); Setting::set('app.force_https', (bool)$this->form_cert_force_https); // Optional: .env spiegeln, damit URLs/HMR etc. sofort passen $scheme = $this->form_cert_force_https ? 'https' : 'http'; EnvWriter::set([ 'APP_HOST' => $this->form_domain, 'APP_URL' => "{$scheme}://{$this->form_domain}", 'APP_TIMEZONE' => $this->form_timezone, ]); // 2) Admin anlegen/aktualisieren $user = User::query() ->where('email', $this->form_admin_email) ->when($this->form_admin_username, fn($q) => $q->orWhere('username', $this->form_admin_username) ) ->first(); if (!$user) { $user = new User(); $user->email = $this->form_admin_email; if ($this->form_admin_username) { $user->username = $this->form_admin_username; } } else { // vorhandene Email/Username harmonisieren $user->email = $this->form_admin_email; if ($this->form_admin_username) { $user->username = $this->form_admin_username; } } $user->name = $this->form_admin_name; $user->is_admin = true; $user->password = Hash::make($this->form_admin_password); $user->must_change_pw = true; $user->save(); // 3) Zertifikat jetzt ausstellen (optional) $taskKey = 'issue-cert:' . $this->form_domain; if ($this->form_cert_create_now) { SystemTask::updateOrCreate( ['key' => $taskKey], [ 'type' => 'issue-cert', 'status' => 'queued', 'message' => 'Warte auf Ausführung…', 'payload' => [ 'domain' => $this->form_domain, 'email' => $this->form_cert_email, 'mode' => 'letsencrypt' ], ] ); Cache::store('redis')->put($taskKey, [ 'type' => 'issue-cert', 'status' => 'queued', 'message' => 'Warte auf Ausführung…', 'payload' => [ 'domain' => $this->form_domain, 'email' => $this->form_cert_create_now ? $this->form_cert_email : null, 'mode' => $this->form_cert_create_now ? 'letsencrypt' : 'self-signed', ], ], now()->addMinutes(30)); Redis::sadd('ui:toasts', $taskKey); ProvisionCertJob::dispatch( domain: $this->form_domain, email: $this->form_cert_email, taskKey: $taskKey, useLetsEncrypt: true ); session()->flash('task_key', $taskKey); session()->flash('banner_ok', 'Let’s Encrypt wird gestartet…'); } else { // automatisch self-signed SystemTask::updateOrCreate( ['key' => $taskKey], [ 'type' => 'issue-cert', 'status' => 'queued', 'message' => 'Warte auf Ausführung…', 'payload' => [ 'domain' => $this->form_domain, 'mode' => 'self-signed' ], ] ); Cache::store('redis')->put($taskKey, [ 'type' => 'issue-cert', 'status' => 'queued', 'message' => 'Warte auf Ausführung…', 'payload' => [ 'domain' => $this->form_domain, 'email' => $this->form_cert_create_now ? $this->form_cert_email : null, 'mode' => $this->form_cert_create_now ? 'letsencrypt' : 'self-signed', ], ], now()->addMinutes(30)); Cache::store('redis')->put($taskKey, [ 'type' => 'issue-cert', 'status' => 'queued', 'message' => 'Warte auf Ausführung…', 'payload' => [ 'domain' => $this->form_domain, 'email' => $this->form_cert_create_now ? $this->form_cert_email : null, 'mode' => $this->form_cert_create_now ? 'letsencrypt' : 'self-signed', ], ], now()->addMinutes(30)); Redis::sadd('ui:toasts', $taskKey); ProvisionCertJob::dispatch( domain: $this->form_domain, email: null, taskKey: $taskKey, useLetsEncrypt: false ); session()->flash('task_key', $taskKey); session()->flash('banner_ok', 'Self-Signed Zertifikat wird erstellt…'); } return redirect()->route('dashboard'); } public function render() { return view('livewire.setup.wizard'); } }