+ placeholder="leer = /webmail/…">
.{{ $base_domain }}
diff --git a/resources/views/livewire/ui/system/installer-page.blade.php b/resources/views/livewire/ui/system/installer-page.blade.php
new file mode 100644
index 0000000..3088f4b
--- /dev/null
+++ b/resources/views/livewire/ui/system/installer-page.blade.php
@@ -0,0 +1,237 @@
+
System
+
Installer
+
+
+
+ {{-- ═══ Page Header ═══ --}}
+
+
+ {{-- Polling when running --}}
+ @if($state === 'running' || $running)
+
+ @endif
+
+
+
+ {{-- ═══ Warning Banner ═══ --}}
+
+
+
+
+
+
+
+ Achtung: Diese Seite führt Systemänderungen durch.
+ Installationen und Neukonfigurationen werden mit Root-Rechten ausgeführt und können laufende Dienste kurzzeitig unterbrechen.
+
+
+
+ {{-- ═══ Section 1: Komponentenstatus ═══ --}}
+
+
+
+ Komponentenstatus
+
+
+
+ Aktualisieren
+
+
+
+
+
+ @php
+ $componentIcons = [
+ 'nginx' => '
',
+ 'postfix' => '
',
+ 'dovecot' => '
',
+ 'rspamd' => '
',
+ 'fail2ban' => '
',
+ 'certbot' => '
',
+ ];
+ @endphp
+
+ @foreach($componentStatus as $key => $info)
+
+
+
+
+ {!! $componentIcons[$key] ?? ' ' !!}
+
+
+
+
{{ $info['label'] }}
+
+ @if($info['installed'] && $info['active'])
+ Aktiv
+ @elseif($info['installed'])
+ Inaktiv
+ @else
+ Nicht installiert
+ @endif
+
+
+
+
+ {{ $info['installed'] ? 'Neu konfigurieren' : 'Installieren' }}
+
+
+ @endforeach
+
+ @if(empty($componentStatus))
+
+ Status wird geladen …
+
+ @endif
+
+
+
+
+
+ {{-- ═══ Section 2: Status ═══ --}}
+
+
+
+ Installations-Status
+
+
+
+
+ @if($state === 'running')
+
+
+
+
+ Installation läuft …
+ @if($component !== 'all')
+ ({{ ucfirst($component) }})
+ @endif
+
+
Bitte nicht unterbrechen. Die Seite aktualisiert sich automatisch.
+
+
+ @elseif($rc !== null && $rc !== 0)
+
+
+
+
Installation fehlgeschlagen (rc={{ $rc }})
+
Bitte das Log unten prüfen.
+
+
+ @elseif($rc === 0)
+
+
+
Installation erfolgreich abgeschlossen.
+
+ @else
+
Keine Installation aktiv. Wähle eine Komponente oder starte die Komplett-Installation.
+ @endif
+
+ {{-- Progress Bar --}}
+ @if($state === 'running' || $progressPct > 0)
+
+
+ Fortschritt
+ {{ $progressPct }}%
+
+
+
+ @endif
+
+
+
+
+ {{-- ═══ Section 3: Log Viewer ═══ --}}
+
+
+
+ Installer-Log
+
+
+
+
+ Auto-Scroll
+
+
+
+ Log leeren
+
+
+
+
+
+ @if(count($logLines) === 0)
+ Keine Log-Einträge vorhanden.
+ @else
+ @foreach($logLines as $line)
+ @php
+ $color = 'inherit';
+ if (str_contains($line, '[!]') || str_contains($line, 'error') || str_contains($line, 'Error') || str_contains($line, 'fehlgeschlagen')) {
+ $color = '#f87171';
+ } elseif (str_contains($line, '[✓]') || str_contains($line, 'beendet') || str_contains($line, 'abgeschlossen')) {
+ $color = 'rgba(34,197,94,.85)';
+ } elseif (str_contains($line, '[i]')) {
+ $color = 'var(--mw-t3)';
+ } elseif (str_contains($line, '=====')) {
+ $color = 'rgba(14,165,233,.8)';
+ }
+ @endphp
+ {{ $line }}
+
+ @endforeach
+ @endif
+
+
+ {{ count($logLines) }} Zeilen · /var/log/mailwolt-install.log
+
+
+
+
+
+
+
diff --git a/resources/views/livewire/ui/system/modal/api-key-create-modal.blade.php b/resources/views/livewire/ui/system/modal/api-key-create-modal.blade.php
new file mode 100644
index 0000000..0af684f
--- /dev/null
+++ b/resources/views/livewire/ui/system/modal/api-key-create-modal.blade.php
@@ -0,0 +1,62 @@
+
+
+
+
+ API Keys
+ — Neuen Key erstellen
+
+
+
+
+
+
+
+
+
+
Name / Bezeichnung
+
+ @error('name')
{{ $message }}
@enderror
+
+
+
+
+ Berechtigungen (Scopes)
+
+ {{ count($selected) === count($scopes) ? 'Alle abwählen' : 'Alle wählen' }}
+
+
+
+ @foreach($scopes as $key => $label)
+
+
+ {{ $key }}
+ — {{ $label }}
+
+ @endforeach
+
+ @error('selected')
{{ $message }}
@enderror
+
+
+
+
+
+
+
Sandbox-Modus
+
Schreiboperationen werden simuliert — keine Änderungen in der Datenbank. Ideal für Tests und Entwicklung.
+
+
+
+
+
+
+
+
+
diff --git a/resources/views/livewire/ui/system/modal/api-key-show-modal.blade.php b/resources/views/livewire/ui/system/modal/api-key-show-modal.blade.php
new file mode 100644
index 0000000..11280b1
--- /dev/null
+++ b/resources/views/livewire/ui/system/modal/api-key-show-modal.blade.php
@@ -0,0 +1,43 @@
+
+
+
+
+ Key erstellt
+ — einmalig anzeigen
+
+
+
+
+
+
+
+
+
+
Diesen Key jetzt kopieren!
+
Der Token wird nur dieses eine Mal angezeigt. Danach kann er nicht mehr eingesehen werden.
+
+
+
+
+ {{ $plainText }}
+
+
+
+ Kopieren
+
+
+
+
+ Verwende diesen Token im HTTP-Header:
+ Authorization: Bearer <token>
+
+
+
+
+
+
+
diff --git a/resources/views/livewire/ui/system/modal/backup-delete-modal.blade.php b/resources/views/livewire/ui/system/modal/backup-delete-modal.blade.php
new file mode 100644
index 0000000..8129754
--- /dev/null
+++ b/resources/views/livewire/ui/system/modal/backup-delete-modal.blade.php
@@ -0,0 +1,31 @@
+
+
+
+
+
Backup löschen
+ {{ $filename }}
+
+
+
+
+
+
+
+
+
+ Diese Aktion kann nicht rückgängig gemacht werden.
+
+
+ Der Backup-Eintrag und die Archiv-Datei werden endgültig gelöscht.
+
+
+
+
+
+
diff --git a/resources/views/livewire/ui/system/modal/backup-progress-modal.blade.php b/resources/views/livewire/ui/system/modal/backup-progress-modal.blade.php
new file mode 100644
index 0000000..eaddfa2
--- /dev/null
+++ b/resources/views/livewire/ui/system/modal/backup-progress-modal.blade.php
@@ -0,0 +1,158 @@
+
+
+ @php
+ $isRestore = !empty($restoreToken);
+ if ($isRestore) {
+ $rs = $this->restoreStatus;
+ $status = $rs['status'] ?? 'queued';
+ $log = $rs['log'] ?? '';
+ } else {
+ $job = $this->job;
+ $status = $job?->status ?? 'queued';
+ $log = $job?->log_excerpt ?: ($job?->error ?? '');
+ }
+ $done = in_array($status, ['ok','failed','canceled']);
+ $elapsed = 0;
+ if (!$isRestore && ($job?->started_at ?? null)) {
+ $elapsed = $done && ($job->finished_at ?? null)
+ ? $job->started_at->diffInSeconds($job->finished_at)
+ : now()->diffInSeconds($job->started_at);
+ }
+ $elapsedFmt = $elapsed >= 60
+ ? floor($elapsed/60) . ' min ' . ($elapsed % 60) . 's'
+ : $elapsed . 's';
+ @endphp
+
+
+
+ {{ $isRestore ? 'Restore' : 'Backup' }}
+ — {{ $isRestore ? 'Wiederherstellung' : 'Sicherung' }}
+
+ @if($done)
+
+
+
+ @endif
+
+
+
+
+ {{-- Status-Zeile --}}
+
+
+ @if($status === 'queued')
+
+
+
+
+
Warteschlange…
+
Prozess wird gestartet
+
+
+ @elseif($status === 'running')
+
+
+
+
+
+ {{ $isRestore ? 'Wiederherstellung läuft…' : 'Sicherung läuft…' }}
+
+ @if(!$isRestore && $elapsed > 0)
+
Verstrichene Zeit: {{ $elapsedFmt }}
+ @endif
+
+
+ @elseif($status === 'ok')
+
+
+
+ {{ $isRestore ? 'Wiederherstellung erfolgreich' : 'Backup erfolgreich' }}
+
+ @if(!$isRestore)
+
+ Dauer: {{ $elapsedFmt }}
+ @if($job?->size_bytes > 0)
+ ·
+ @php $u=['B','KB','MB','GB']; $i=0; $v=(float)$job->size_bytes;
+ while($v>=1024&&$i<3){$v/=1024;$i++;} echo number_format($v,$i<=1?0:1).' '.$u[$i]; @endphp
+ @endif
+
+ @endif
+
+
+ @elseif($status === 'failed')
+
+
+
+ {{ $isRestore ? 'Wiederherstellung fehlgeschlagen' : 'Backup fehlgeschlagen' }}
+
+ @if(!$isRestore)
+
Dauer: {{ $elapsedFmt }}
+ @endif
+
+ @endif
+
+
+
+ {{-- Fortschrittsbalken --}}
+ @if(!$done)
+
+ @endif
+
+ {{-- Log --}}
+ @if($log)
+
+ @endif
+
+ {{-- Hinweis --}}
+ @if(!$done)
+
+
+ {{ $isRestore ? 'Die Wiederherstellung läuft im Hintergrund weiter.' : 'Du kannst dieses Fenster schließen — das Backup läuft im Hintergrund weiter.' }}
+
+ @endif
+
+ @if($isRestore && $status === 'ok')
+
+
+ Seite neu laden um die wiederhergestellten Daten zu sehen.
+
+ @endif
+
+
+
+
+
+
+
+
diff --git a/resources/views/livewire/ui/system/modal/backup-restore-confirm-modal.blade.php b/resources/views/livewire/ui/system/modal/backup-restore-confirm-modal.blade.php
new file mode 100644
index 0000000..7b0c952
--- /dev/null
+++ b/resources/views/livewire/ui/system/modal/backup-restore-confirm-modal.blade.php
@@ -0,0 +1,35 @@
+
+
+
+
+
Backup wiederherstellen
+ {{ $startedAt }}
+
+
+
+
+
+
+
+
+
+ Der aktuelle Mailserver-Zustand wird überschrieben.
+
+
+ Datenbank, E-Mails und Konfiguration werden aus dem Backup vom
+ {{ $startedAt }} wiederhergestellt.
+
+
+ {{ $filename }}
+
+
+
+
+
+
diff --git a/resources/views/livewire/ui/system/modal/installer-confirm-modal.blade.php b/resources/views/livewire/ui/system/modal/installer-confirm-modal.blade.php
new file mode 100644
index 0000000..2e1949a
--- /dev/null
+++ b/resources/views/livewire/ui/system/modal/installer-confirm-modal.blade.php
@@ -0,0 +1,43 @@
+
+
+
+
+
Installation bestätigen
+
+ {{ $component === 'all' ? 'Komplett-Installation' : ucfirst($component) }}
+
+
+
+
+
+
+
+
+
+
+ Diese Aktion führt Systemänderungen mit Root-Rechten durch.
+
+
+ @if($component === 'all')
+ Die Komplett-Installation konfiguriert alle Komponenten
+ (Nginx, Postfix, Dovecot, Rspamd, Fail2ban, SSL) neu.
+ @else
+ Die Komponente {{ ucfirst($component) }}
+ wird installiert bzw. neu konfiguriert.
+ @endif
+
+
+ Laufende Dienste können kurzzeitig unterbrochen werden.
+ Der Fortschritt wird im Log-Viewer angezeigt.
+
+
+
+
+
+
diff --git a/resources/views/livewire/ui/system/modal/ssl-provision-modal.blade.php b/resources/views/livewire/ui/system/modal/ssl-provision-modal.blade.php
new file mode 100644
index 0000000..4d02c77
--- /dev/null
+++ b/resources/views/livewire/ui/system/modal/ssl-provision-modal.blade.php
@@ -0,0 +1,32 @@
+
+
+
+
+
SSL manuell erzwingen
+ certbot · Let's Encrypt
+
+
+
+
+
+
+
+
+
+ Bereits vorhandene Zertifikate (z. B. von NPM) können überschrieben werden.
+
+
+ certbot wird jetzt für alle drei konfigurierten Domains ausgeführt.
+ Stelle sicher, dass Port 80 erreichbar ist und kein anderer Dienst den ACME-Challenge blockiert.
+
+
+
+
+
+
diff --git a/resources/views/livewire/ui/system/modal/totp-setup-modal.blade.php b/resources/views/livewire/ui/system/modal/totp-setup-modal.blade.php
new file mode 100644
index 0000000..f9a043f
--- /dev/null
+++ b/resources/views/livewire/ui/system/modal/totp-setup-modal.blade.php
@@ -0,0 +1,74 @@
+
+
+
+
+ 2FA
+ — TOTP einrichten
+
+
+
+
+
+
+
+
+ @if($step === 'scan')
+
+
QR-Code mit Google Authenticator, Authy oder einer TOTP-App scannen.
+
+ {{-- QR Code --}}
+
+ {!! $qrSvg !!}
+
+
+ {{-- Manual secret --}}
+
Manueller Schlüssel
+
+ {{ chunk_split($secret, 4, ' ') }}
+
+
+
+
+
Code zur Bestätigung eingeben
+
+ @error('code')
{{ $message }}
@enderror
+
6-stelligen Code aus deiner App eingeben um die Einrichtung abzuschließen.
+
+
+ @elseif($step === 'codes')
+
+
+
Recovery-Codes — jetzt speichern!
+
Diese Codes werden nur einmal angezeigt. Bewahre sie sicher auf.
+
+
+ @foreach($recoveryCodes as $rc)
+
+ {{ $rc }}
+
+ @endforeach
+
+
+ @endif
+
+
+
+
+
+
diff --git a/resources/views/livewire/ui/system/modal/user-create-modal.blade.php b/resources/views/livewire/ui/system/modal/user-create-modal.blade.php
new file mode 100644
index 0000000..175f02b
--- /dev/null
+++ b/resources/views/livewire/ui/system/modal/user-create-modal.blade.php
@@ -0,0 +1,58 @@
+
+
+
+
+ Benutzer
+ — Neu anlegen
+
+
+
+
+
+
+
+
+
+
Name / Benutzername
+
+ @error('name')
{{ $message }}
@enderror
+
+
+
E-Mail
+
+ @error('email')
{{ $message }}
@enderror
+
+
+
+
Passwort
+
+ @error('password')
{{ $message }}
@enderror
+
+
+
+
Rolle
+
+ @foreach($roles as $r)
+ {{ $r->label() }}
+ @endforeach
+
+
Admin = voller Zugriff · Operator = Mail/Domains · Viewer = nur lesen
+
+
+
+
+ Sofort aktiv
+
+
+
+
+
+
+
+
diff --git a/resources/views/livewire/ui/system/modal/user-delete-modal.blade.php b/resources/views/livewire/ui/system/modal/user-delete-modal.blade.php
new file mode 100644
index 0000000..b5179d5
--- /dev/null
+++ b/resources/views/livewire/ui/system/modal/user-delete-modal.blade.php
@@ -0,0 +1,30 @@
+
+
+
+
+ Benutzer
+ — Löschen
+
+
+
+
+
+
+
+
+
{{ $userName }}
+
+ Dieser Benutzer wird dauerhaft gelöscht und kann sich nicht mehr anmelden.
+
+
+
+
+
+
+
diff --git a/resources/views/livewire/ui/system/modal/user-edit-modal.blade.php b/resources/views/livewire/ui/system/modal/user-edit-modal.blade.php
new file mode 100644
index 0000000..6efbf8d
--- /dev/null
+++ b/resources/views/livewire/ui/system/modal/user-edit-modal.blade.php
@@ -0,0 +1,60 @@
+
+
+
+
+ Benutzer
+ — {{ $name }}
+
+
+
+
+
+
+
+
+
+
Name
+
+ @error('name')
{{ $message }}
@enderror
+
+
+
E-Mail
+
+ @error('email')
{{ $message }}
@enderror
+
+
+
+
Neues Passwort (leer lassen = unverändert)
+
+ @error('password')
{{ $message }}
@enderror
+
+
+
+
Rolle
+
+ @foreach($roles as $r)
+ {{ $r->label() }}
+ @endforeach
+
+ @if($isSelf)
+
Eigene Rolle kann nicht geändert werden.
+ @endif
+
+
+
+
+ Aktiv
+
+
+
+
+
+
+
+
diff --git a/resources/views/livewire/ui/system/modal/webhook-create-modal.blade.php b/resources/views/livewire/ui/system/modal/webhook-create-modal.blade.php
new file mode 100644
index 0000000..22027d6
--- /dev/null
+++ b/resources/views/livewire/ui/system/modal/webhook-create-modal.blade.php
@@ -0,0 +1,69 @@
+
+
+
+
+ Webhooks
+ — Neu anlegen
+
+
+
+
+
+
+
+
+
+
+
Name
+
+ @error('name')
{{ $message }}
@enderror
+
+
+
+
+ Sofort aktiv
+
+
+
+
+
+
Endpoint-URL
+
+ @error('url')
{{ $message }}
@enderror
+
+
+
+
+ Events
+
+ {{ count($selected) === count($allEvents) ? 'Alle abwählen' : 'Alle wählen' }}
+
+
+
+ @foreach($allEvents as $key => $label)
+
+
+ {{ $key }}
+
+ @endforeach
+
+ @error('selected')
{{ $message }}
@enderror
+
+
+
+ Ein HMAC-SHA256 Secret wird automatisch generiert und kann nach dem Erstellen im Edit-Dialog eingesehen werden.
+
+
+
+
+
+
+
diff --git a/resources/views/livewire/ui/system/modal/webhook-delete-modal.blade.php b/resources/views/livewire/ui/system/modal/webhook-delete-modal.blade.php
new file mode 100644
index 0000000..4e46f96
--- /dev/null
+++ b/resources/views/livewire/ui/system/modal/webhook-delete-modal.blade.php
@@ -0,0 +1,30 @@
+
+
+
+
+ Löschen
+ — Webhook entfernen
+
+
+
+
+
+
+
+
+ Webhook {{ $webhookName }} wirklich löschen?
+
+
+ Diese Aktion kann nicht rückgängig gemacht werden. Das Secret wird unwiderruflich gelöscht.
+
+
+
+
+
+
diff --git a/resources/views/livewire/ui/system/modal/webhook-edit-modal.blade.php b/resources/views/livewire/ui/system/modal/webhook-edit-modal.blade.php
new file mode 100644
index 0000000..f8f3440
--- /dev/null
+++ b/resources/views/livewire/ui/system/modal/webhook-edit-modal.blade.php
@@ -0,0 +1,81 @@
+
+
+
+
+ Webhooks
+ — Bearbeiten
+
+
+
+
+
+
+
+
+
+
+
Name
+
+ @error('name')
{{ $message }}
@enderror
+
+
+
+
+ Aktiv
+
+
+
+
+
+
Endpoint-URL
+
+ @error('url')
{{ $message }}
@enderror
+
+
+
+
+ Events
+
+ {{ count($selected) === count($allEvents) ? 'Alle abwählen' : 'Alle wählen' }}
+
+
+
+ @foreach($allEvents as $key => $label)
+
+
+ {{ $key }}
+
+ @endforeach
+
+ @error('selected')
{{ $message }}
@enderror
+
+
+ {{-- Secret --}}
+
+
HMAC Secret
+
+
Für HMAC-SHA256 Signaturverifikation. Nur einmalig sicher speichern.
+
+
+
+
+
+
+
diff --git a/resources/views/livewire/ui/system/partials/api-endpoint-list.blade.php b/resources/views/livewire/ui/system/partials/api-endpoint-list.blade.php
new file mode 100644
index 0000000..37dd590
--- /dev/null
+++ b/resources/views/livewire/ui/system/partials/api-endpoint-list.blade.php
@@ -0,0 +1,24 @@
+@php
+$methodColors = [
+ 'GET' => ['bg' => 'rgba(59,130,246,.1)', 'bd' => 'rgba(59,130,246,.25)', 'tx' => '#93c5fd'],
+ 'POST' => ['bg' => 'rgba(16,185,129,.1)', 'bd' => 'rgba(16,185,129,.25)', 'tx' => '#6ee7b7'],
+ 'PATCH' => ['bg' => 'rgba(251,191,36,.1)', 'bd' => 'rgba(251,191,36,.25)', 'tx' => '#fcd34d'],
+ 'DELETE' => ['bg' => 'rgba(239,68,68,.1)', 'bd' => 'rgba(239,68,68,.25)', 'tx' => '#fca5a5'],
+];
+@endphp
+
+@foreach($routes as [$method, $path, $scope, $desc, $query])
+@php $c = $methodColors[$method]; @endphp
+
+
{{ $method }}
+
+
+ {{ $path }}{{ $query ? '' . $query . ' ' : '' }}
+
+
+ {{ $desc }}
+ {{ $scope }}
+
+
+
+@endforeach
diff --git a/resources/views/livewire/ui/system/sandbox-mailbox.blade.php b/resources/views/livewire/ui/system/sandbox-mailbox.blade.php
new file mode 100644
index 0000000..6275144
--- /dev/null
+++ b/resources/views/livewire/ui/system/sandbox-mailbox.blade.php
@@ -0,0 +1,235 @@
+
System
+
Mail-Sandbox
+
+
+
+
+
+ {{-- Mail-Client Layout --}}
+
+
+ {{-- ═══ Left: Mail-Liste ═══ --}}
+
+
+ @if($mails->isEmpty())
+
+
+
+
+
+
+ {{ $search ? 'Keine Treffer' : 'Postfach leer' }}
+
+
+ {{ $search ? 'Suche anpassen.' : 'Eingehende Mails erscheinen hier sobald der Sandbox-Transport aktiv ist.' }}
+
+
+ @else
+ @foreach($mails as $mail)
+
+
+
+
+ @if(!$mail->is_read)
+
+ @endif
+
+ {{ $mail->from_name ?: $mail->from_address }}
+
+
+
{{ $mail->received_at->format('H:i') }}
+
+
+
+ {{ $mail->subject ?: '(kein Betreff)' }}
+
+
+ An: {{ $mail->to_preview }}
+
+
+ @endforeach
+ @endif
+
+
+
+ {{-- ═══ Right: Mail-Detail ═══ --}}
+
+
+ @if(!$selected)
+
+
+
+
+
+
Nachricht auswählen
+
+ @else
+ {{-- Header --}}
+
+
+
{{ $selected->subject ?: '(kein Betreff)' }}
+
+
+
+
+
+
+
+ Von
+ {{ $selected->sender }}
+
+
+ An
+ {{ implode(', ', $selected->to_addresses) }}
+
+
+ Zeit
+ {{ $selected->received_at->format('d.m.Y H:i:s') }}
+
+ @if($selected->message_id)
+
+ ID
+ {{ $selected->message_id }}
+
+ @endif
+
+
+
+ {{-- Body Tabs --}}
+
+
+
+ @if($selected->body_html)
+
+ HTML
+
+ @endif
+ @if($selected->body_text)
+
+ Plain Text
+
+ @endif
+
+ Header
+
+
+
+ @if($selected->body_html)
+
+
+
+ @endif
+
+ @if($selected->body_text)
+
+
{{ $selected->body_text }}
+
+ @endif
+
+
+
{{ $selected->raw_headers }}
+
+
+ @if(!$selected->body_html && !$selected->body_text)
+
Kein Inhalt
+ @endif
+
+
+ @endif
+
+
+
+
+
+ {{-- Setup Guide --}}
+
+
+
+
+ Postfix-Konfiguration
+ — Sandbox-Transport aktivieren
+
+
+
+
+
+
1. master.cf — Transport anlegen
+
sandbox unix - n n - - pipe
+ flags=Rq user=www-data
+ argv=/usr/bin/php
+ {{ base_path('artisan') }}
+ sandbox:receive
+ --to=${recipient}
+
+
+
+
2. main.cf — Transport aktivieren
+
# Alle Mails abfangen:
+default_transport = sandbox
+
+# Oder nur bestimmte Domains:
+transport_maps =
+ hash:/etc/postfix/transport
+
+# /etc/postfix/transport:
+# example.com sandbox:
+
+
+
+
3. Reload & Test
+
postmap /etc/postfix/transport
+postfix reload
+
+# Test:
+echo "Test" | mail \
+ -s "Sandbox-Test" \
+ user@example.com
+
+ Die Mail erscheint nach wenigen Sekunden hier (Auto-Refresh alle 5s).
+
+
+
+
+
+
+
+
diff --git a/resources/views/livewire/ui/system/settings-form.blade.php b/resources/views/livewire/ui/system/settings-form.blade.php
index 4bc922b..382857c 100644
--- a/resources/views/livewire/ui/system/settings-form.blade.php
+++ b/resources/views/livewire/ui/system/settings-form.blade.php
@@ -1,106 +1,343 @@
-{{-- resources/views/livewire/ui/system/settings-form.blade.php --}}
-
- {{-- Tabs --}}
-
-
- Allgemein
-
-
- Domains & SSL
-
-
- Sicherheit
-
-
+
System
+
Einstellungen
- {{-- Allgemein --}}
-
-
-
Instanzname
-
{{ $instance_name }}
+
+
+