Commit Graph

250 Commits (v1.1.165)

Author SHA1 Message Date
boban 73bda08244 Fix: Livewire NoModificationAllowedError im Setup-Wizard Step 5
wire:poll Div war bedingt gerendert – beim Entfernen aus dem DOM
versuchte Livewire noch es zu patchen → outerHTML Fehler.
Div bleibt jetzt immer im DOM, pollSetup() kehrt früh zurück wenn fertig.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-24 14:55:18 +02:00
boban 660402a32d Fix: storage/backups/ zu .gitignore hinzugefügt
Verhindert Abbruch des Update-Scripts durch Dirty-Check wenn
Backups im storage-Verzeichnis vorhanden sind.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-24 14:48:27 +02:00
boban 32f43020d3 Fix: HTTPS-Redirect im Wizard entfernt + nginx HTTP-Block korrigiert
HTTPS→HTTP Redirect war ein Workaround für SESSION_SECURE_COOKIE,
der jetzt durch den Installer-Fix (false initial) nicht mehr nötig ist.
fastcgi_param HTTPS on gehört nur in den 443-Block, nicht in den 80-Block.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-24 14:43:26 +02:00
boban ed176ec243 Fix: Monit-Config vollständig und robust
- Alle Dienste überwacht: postfix, dovecot, mariadb, redis, rspamd,
  opendkim, opendmarc, nginx, fail2ban, clamav
- rspamd via process-matching statt pidfile (zuverlässiger)
- SSL-Checks mit for 3 cycles (kein Sofort-Restart bei Init)
- /var/run/ → /run/ Pfade korrigiert (moderne Debian-Konvention)
- monit -t vor dem Start (Konfig-Fehler werden sichtbar)
- 5 restarts within 10 cycles alert bei allen Diensten

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-24 14:33:57 +02:00
boban 4fd37985b3 Fix: Passwort-Mindestlänge im Wizard auf 6 Zeichen gesenkt
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-24 14:30:32 +02:00
boban 7d30faa7d7 Fix: SESSION_SECURE_COOKIE verhindert HTTP-Setup (419-Fehler)
Installer setzt SESSION_SECURE_COOKIE=false initial – damit Setup-Wizard
über http://ip erreichbar ist. WizardDomains setzt es auf true nach
erfolgreichem SSL. mount()-Redirect ohne exit (sauberer Return).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-24 14:29:13 +02:00
boban 4f3066e225 Fix: Spinner und Text im Login-Button immer nebeneinander
Livewire setzt beim Einblenden display:inline statt inline-flex.
Innerer Wrapper erzwingt inline-flex damit SVG und Text nie stacken.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-24 14:14:16 +02:00
boban a30c21a1a9 Fix: Login-Spinner standardmäßig versteckt (display:none)
wire:loading-Span war vor Livewire-Init sichtbar, wodurch Anmelden
und Spinner gleichzeitig angezeigt wurden.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-24 14:13:08 +02:00
boban 085f27d67c Redesign: Login-Seite an Wizard-Design angepasst
Eigenes HTML-Layout ohne Sidebar, mw-* CSS-Klassen, gleiches Logo
und Karten-Design wie der Setup-Wizard. Icons als Inline-SVG da
app.js (Phosphor) auf der Login-Seite nicht geladen wird.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-24 14:11:53 +02:00
boban 3869f6e67f Fix: Login-Redirect nur bei erfolgreichem SSL auf Domain umleiten
ssl_configured=1 → https://{ui_domain}/login
ssl_configured=0 → /login (bleibt auf aktueller IP/Host)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-24 14:08:01 +02:00
boban a322aa17ac Fix: goToLogin leitet auf konfigurierte UI-Domain weiter
route('login') nutzt die gecachte Config (alte IP/URL). Stattdessen
direkt auf https://{ui_domain}/login umleiten, da APP_URL erst nach
dem Prozess-Neustart greift.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-24 14:06:54 +02:00
boban 0b415c6862 Fix: Setup-Wizard bei HTTPS auf HTTP umleiten
Vor SSL-Zertifikaten schlägt Livewires AJAX über HTTPS fehl.
mount() leitet automatisch auf http:// um damit der Wizard funktioniert.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-24 14:04:50 +02:00
boban 31f486c753 Fix: SSL-Erstellung nicht von APP_ENV abhängig machen
isProduction()-Check entfernt — SSL wird jetzt allein durch skipSsl gesteuert,
da APP_ENV=local sonst SSL-Zertifikate komplett verhindert.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-24 14:03:24 +02:00
boban af045b21d5 Fix: Version via git ls-remote statt describe (kein --unshallow nötig)
ls-remote fragt den Remote direkt — funktioniert mit shallow clone ohne
History-Download. Kein --unshallow, kein Fehler mehr.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-24 13:49:58 +02:00
boban 5b9e486b98 Fix: --unshallow vor --tags fetch damit git describe funktioniert
Shallow clones (--depth=1) kennen keine Tag-Historie. --unshallow
konvertiert zuerst zum vollständigen Clone, danach sind alle Tags erreichbar.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-24 13:46:50 +02:00
boban fbce5dc8ba Fix: update.sh State-Dateien, Lock, Version-Datei + Installer-Integration
update.sh:
- State-Dateien (/var/lib/mailwolt/update/state + rc) werden geschrieben
- Lock-Datei verhindert parallele Update-Prozesse
- write_version_files() aktualisiert auch /var/lib/mailwolt/version
- Kombinierter _cleanup-Trap ersetzt cleanup_maintenance
- LATEST_TAG via git rev-list statt sort -V (zuverlässiger)
- Update-Log nach /var/log/mailwolt-update.log

installer.sh:
- update.sh wird als /usr/local/sbin/mailwolt-update installiert
- Sudoers-Eintrag für mailwolt-update ergänzt

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-24 13:38:27 +02:00
boban f8f30d57f7 Feature: Installer-Spinner + verbesserter Smoke-Test
- Spinner (⠋⠙⠹…) läuft während quietly() auf Abschluss wartet
- stop_spin() in ok/warn/err integriert, EXIT-Trap sichert Cleanup
- Smoke-Test: kein eval, separate Funktionen pro Protokoll (smtp/tls/imap/pop3)
- Service-Namen neben Port, Zusammenfassung X/7 Dienste erreichbar

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-24 13:31:30 +02:00
boban eb16f7d6ad Refactor: Installer-Output auf saubere Schritt-Anzeige umgestellt
- Nur Hauptschritte mit Zeitschätzung sichtbar (~Pakete 2-5 Min, etc.)
- Alle verbose Ausgaben (apt/composer/npm/git) gehen in /var/log/mailwolt-install.log
- Bei Fehler: letzte 20 Log-Zeilen werden angezeigt + Log-Pfad
- quietly()/try_quiet() Helper für stille Ausführung
- Smoke-Test zeigt nur OK/⚠ pro Port ohne verbose openssl-Output
- Node/npm wird nach Git-Clone installiert (package.json bereits vorhanden)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-24 13:27:31 +02:00
boban 814776d1ff Fix: Tags nach shallow clone explizit fetchen für Version-Datei
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-24 13:20:19 +02:00
boban 01e7db589a Fix: Installer + Wizard Step 5 robuster gegen IPv6/SSL-Fehler
- installer.sh: mailwolt-apply-domains mit 3-Phasen certbot (HTTP → LE → SSL),
  IPv6-Check vor certbot, Zertifikat-Ablauf-Check (10 Tage), Version-Datei schreiben
- WizardDomains: noipv6-Status aus Helper-Output erkennen
- Wizard: retryDomains()-Methode für Wiederholung ohne neuen Wizard-Durchlauf
- Step 5 Blade: Hints pro Fehlerstatus, Retry-Button, "Trotzdem zum Login"
- UpdatePage: Version aus Datei, Fallback auf git describe (kein "dev" mehr)
- UpdatePage: refreshLowLevelState behandelt fehlende State-Datei als idle

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-24 13:16:42 +02:00
boban 3c8eaa16df Fix: Installer bricht bei nicht-kritischen Fehlern nicht mehr ab
- || true für Services (postfix, dovecot, redis, nginx)
- || true für artisan config/route/view:cache
- npm run build: Warnung statt Abbruch, Hinweis zum manuellen Nachholen
- Monit ist bereits aktiviert (systemctl enable --now)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-23 23:01:06 +02:00
boban e833ab72c6 Fix: WizardDomains übergibt SSL-Handling komplett an mailwolt-apply-domains
- Kein certbot --nginx mehr im Wizard (scheitert an catch-all server_name)
- mailwolt-apply-domains erstellt Vhosts zuerst, dann certbot --webroot
- sudoers-Eintrag für certbot im Installer

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-23 22:48:47 +02:00
boban d5d5fd819c Fix: mailwolt-apply-domains Helper + sudoers + Monit aktiviert
- mailwolt-apply-domains Script im Installer erstellt
- sudoers-Eintrag für www-data (certbot + apply-domains ohne Passwort)
- Wizard State-Dir Owner www-data
- Monit standardmäßig aktiviert (nicht mehr disabled)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-23 22:24:28 +02:00
boban 19618746ba Fix: Installer komplett bereinigt für sauberen Erstdurchlauf
- acl-Paket ergänzt (setfacl)
- DB_NAME/DB_USER Doppel-Assignment entfernt
- VITE_REVERB_HOST nutzt jetzt tatsächliche SERVER_IP
- BROADCAST_CONNECTION=reverb gesetzt
- COMPOSER_ALLOW_SUPERUSER entfernt
- config:cache / route:cache / view:cache nach Migration
- /var/lib/mailwolt/wizard Verzeichnis angelegt
- git safe.directory gesetzt
- Footer zeigt /setup URL statt Login

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-23 22:08:42 +02:00
boban 8551a00414 Fix: Setup-Route und Wizard gegen fehlende DB absichern (try/catch)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-23 22:03:30 +02:00
boban 94cddb7987 Fix: Pusher-Key-Fehler + wire:model remember + Reverb-Keys im Installer
- connection.js: Echo nur initialisieren wenn VITE_REVERB_APP_KEY gesetzt
- LoginForm: $remember Property ergänzt
- installer.sh: Reverb-Keys automatisch generieren und in .env schreiben

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-23 21:58:21 +02:00
boban 7c3376bfbc Fix: Setup-Wizard ohne Auth erreichbar, Root-Route prüft setup_completed
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-23 21:56:05 +02:00
boban 75d1f136a3 Fix: Installer-Cleanup (PHP-FPM-Socket dynamisch, Arg-Parsing oben, APP_PW früh, doppelter setfacl entfernt)
- PHPV-Erkennung vor nginx-Config verschoben, Socket-Pfad dynamisch
- Argument-Parsing (-dev/-stag) ganz an den Anfang
- APP_PW früh generieren damit es überall verfügbar ist
- Doppelten setfacl-Block entfernt

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-23 21:38:35 +02:00
boban b9c2eb5eef Refactor: Installer-Reihenfolge korrigiert (Git-Clone zuerst, dann .env/composer/migrate)
- composer create-project entfernt (wir klonen das eigene Repo)
- .env wird nach dem Clone auf dem echten Codebase gesetzt
- composer install, key:generate, migrate und storage:link nach Clone
- nodesource curl|bash durch Datei-Download ersetzt (stdin-safe)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-23 21:33:53 +02:00
boban a07a0d1a98 Fix: APP_DIR vor git clone leeren wenn kein .git vorhanden
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-23 21:19:48 +02:00
boban 8e8dff39c9 Fix: git zu Paketliste hinzugefügt
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-23 21:16:49 +02:00
boban d271c96828 Fix: trailing > auf Zeile 512 entfernt (BOOTSTRAP_ADMIN_EMAIL redirect)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-23 21:14:32 +02:00
boban b8d121f251 Fix: unclosed quote in installer (BOOTSTRAP_EMAIL) verursachte Syntax Error
php-sqlite3 ergänzt um composer post-install migrate-Warning zu vermeiden.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-23 21:08:01 +02:00
boban 45e762be7f Fix: \$uri escape in Nginx heredoc verhindert set -u Abbruch
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-23 21:00:23 +02:00
boban 38d22c85ed Feature: API-Key/Webhook responsive div-grid, Sandbox-Icon in Domains, Search-fix
- API-Key-Tabelle: unified CSS-Grid div-layout (kein separates mobile/desktop HTML mehr),
  Scopes auf max. 2 Badges + +N Modal, Lösch-Bestätigung via Livewire-Modal
- Webhook-Tabelle: selbes div-grid Pattern, Status/HTTP inline auf Mobile
- Globale Suche: go()-Methode fixed (forceClose + setTimeout 350ms gegen resetState-Race)
- Domains: Sandbox-Icon ersetzt Globus durch gelbes Warndreieck wenn Sandbox aktiv
- Sandbox: SandboxRoute-Model, SandboxService, Migration, Routen-Verwaltung
- CSS: mw-kl-*/mw-whl-* Grid-Klassen, minmax(0,1fr) Fix für Text-Truncation

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-23 19:48:06 +02:00
boban fc8dbf894a Fix: bash trap entfernt public/hot zuverlässig nach Vite-Stop
trap EXIT/INT/TERM feuert auch bei Ctrl+C — vorheriges node-Cleanup
lief nur beim Start, nicht beim Beenden.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-23 06:22:04 +02:00
boban acab5d4c84 Fix: strictPort:true verhindert Vite auf falschem Port
Wenn Port 5173 belegt ist schlägt npm run dev sofort fehl statt
still auf 5174 zu wechseln — nginx würde dann ins Leere proxyen.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-23 06:20:27 +02:00
boban c1d5ca1988 Refactor: app-webmail.js als eigener Vite-Entry ohne Admin-Websocket
Webmail-Layouts laden jetzt app-webmail.js statt app.js.
websocket.js, ui/command.js und sidebar.js werden im Webmail nicht
mehr geladen — kein /ui/tasks/active Aufruf mehr möglich.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-23 06:11:50 +02:00
boban 79548c5aa0 Fix: meta-Tag statt window-Variable für Webmail-Context-Erkennung
type=module Scripts haben kein garantiertes Timing mit inline Scripts.
<meta name="mw-context" content="webmail"> im <head> ist vor Modulausführung
garantiert im DOM verfügbar.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-23 06:01:45 +02:00
boban 52887e2dd5 Fix: MW_CONTEXT vor app.js setzen damit bootstrapToasts() es liest
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-23 05:56:42 +02:00
boban 3064c0b186 Fix: /ui/tasks/active wird auf Webmail-Seiten nicht mehr aufgerufen
window.MW_CONTEXT='webmail' in beiden Webmail-Layouts gesetzt.
bootstrapToasts() prüft diesen Context und bricht früh ab um
den 401-Fehler auf der Webmail-Domain zu vermeiden.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-23 05:54:42 +02:00
boban 949cdd1e5b Fix: Webmail path-fallback zurück (name 'webmail.') + hot-file cleanup
Path-based Fallback /webmail/* mit ->name('webmail.') re-added — kein
Namenskonflikt mehr mit web.php 'login'. Behebt gecachte 301-Redirects
im Browser. npm dev-script räumt public/hot vor dem Start auf damit
Vite-Stop nie mehr die App kaputt macht.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-23 03:24:01 +02:00
boban 5158d7b3b3 Fix: SVG-Pfade (fehlendes M) + Vite-HMR-Proxy in nginx UI-Vhost
SVG paths in domain-list und installer-page hatten kein führendes 'M' im
d-Attribut — Browser-Fehler behoben. Nginx UI-Vhost bekommt Proxy-Locations
für /@vite/, /node_modules/, /resources/ und WebSocket /vite-hmr (Port 5173)
damit npm run dev durch nginx funktioniert.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-23 03:12:08 +02:00
boban 6796ff3859 Fix: Route-Namenskonflikt 'login' bei konfigurierter Webmail-Domain
Path-based Fallback (/webmail/*) wird nicht mehr registriert wenn eine
dedizierte Webmail-Subdomain konfiguriert ist. Sonst kollidiert das nackte
->name('login') aus webmail.php mit dem login-Route aus web.php.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-23 03:05:55 +02:00
boban 12a16dbd64 Fix: Webmail-Vhost serviert volle Laravel-App statt nur /webmail/*
Mit dedizierter Webmail-Subdomain ist kein /webmail/-Präfix nötig —
Laravel's domain()-Routing in bootstrap/app.php übernimmt die Isolation.
Nur / leitet auf /login um, alle anderen Pfade gehen direkt an Laravel.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-23 03:02:15 +02:00
boban 46fb3f12ff Fix: Webmail-Vhost nur /webmail/* — Control Panel nicht mehr erreichbar
- build_webmail_http_only / build_webmail_tls als eigene Funktionen
- Webmail-Domain: / und /login → redirect auf /webmail/login
- Webmail-Domain: nur /webmail/* wird an Laravel weitergeleitet
- Alles andere auf Webmail-Domain → 403
- UI-Domain bleibt unverändert (voller Laravel-Zugriff)
- mailwolt-apply-domains deployed aktualisiert (write_webmail_vhost)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-23 02:54:05 +02:00
boban 3bc3862b69 Fix: /var/lib/mailwolt/wizard mit www-data Owner anlegen
Installer legt das Wizard-State-Verzeichnis jetzt mit chown www-data an
damit finish() im Wizard die Status-Dateien schreiben kann.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-23 02:41:36 +02:00
boban 627ef668e5 Feature: Domain Auto-fill, SSL-Skip, Dashboard SSL-Banner
- Wizard Schritt 2: leere Domain-Felder werden beim Tippen auto-gefüllt
  (wer nur eine Domain nutzt muss sie nur einmal eingeben)
- Wizard Schritt 4: Checkbox "SSL jetzt überspringen" mit Hinweistext
- Wizard Schritt 5: skip-Status wird pro Domain angezeigt
- WizardDomains schreibt ssl_configured=0/1 in Settings
- SettingsForm: setzt ssl_configured=1 nach erfolgreichem applyDomains
- Dashboard: gelber Banner wenn ssl_configured != 1, Link zu Einstellungen

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-23 02:36:11 +02:00
boban 077a029ff4 Feature: Wizard Schritt 5 — Domain-Setup mit Fortschrittsanzeige
- Neuer Schritt 5: SSL-Registrierung läuft im Hintergrund pro Domain
- Artisan-Command mailwolt:wizard-domains schreibt per-Domain Status-Dateien
- Wizard pollt alle 2s: pending → running → done/nodns/error
- "Zum Login" Button erscheint wenn alle Domains abgeschlossen
- Mail-Domain erhält ebenfalls SSL-Zertifikat (für STARTTLS/IMAPS)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-23 02:29:52 +02:00
boban 35fe7c2c6f Feature: perPage als URL-Parameter + kompaktes Pagination-Fenster
- perPage (#[Url as:'limit']) bleibt nach Reload erhalten (25/50/100)
- Pagination zeigt max 5 Seiten (±2 um aktuelle) + 1/letzte mit ...
- Per-Seite-Select in Quarantäne und Queue eingefügt

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-23 02:16:17 +02:00