clusev/app/Services
boban da53b6f7c7 fix(alerts): fresh mailer at queue time (poller!) + branded HTML alert e-mail
ROOT CAUSE of "alert fires but no e-mail", third and final layer: the
metrics poller (clusev:poll-metrics, a long-lived supervisor process) is
what queues alert mail — and Laravel bakes the DEFAULT MAILER NAME into a
mailable at Mail::to()->queue() time. A poller that booted before SMTP
was configured bakes `log` into every alert e-mail forever; the worker
then faithfully "sends" them into laravel.log no matter how correct its
own config is. This is why manual test sends (fresh processes → smtp)
arrived while real alert mails (poller → log) never did.

Fix: extract the SMTP-settings application into App\Support\MailSettings
(::apply(), now with Mail::purge on change so long-lived processes
rebuild the transport) and call it from all three process shapes:
  - web requests   → AppServiceProvider::boot()
  - queue worker   → Queue::before
  - poller/loops   → AlertNotifier::notify() right before queueing,
                     so the CURRENT mailer name is baked in.

Also: enterprise HTML alert e-mail (frontend-design). Dark Tactical
Terminal card — signal rail + status pill (red ALARM / green BEHOBEN),
rule headline, mono terminal readout (server/metric/value/threshold),
bulletproof dashboard CTA, CID-embedded logo (no external assets; renders
in Gmail/Outlook with images blocked), full de/en, plain-text part kept
as fallback. Offline rules render state text (offline/back online)
instead of a bare 0/1.

Verified: app restarted (poller reloaded), synchronous + queued sends to
the admin both deliver over real SMTP (476ms send, no new log-mailer
entries). 750 tests.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 21:14:52 +02:00
..
.gitkeep feat: scaffold — Dockerized Laravel 13 + Livewire 3 + Tailwind 4 + Reverb 2026-06-12 00:31:50 +02:00
AlertEvaluator.php fix(ui): sidebar alert/threat badges update at once, not up to 60s late 2026-07-06 20:22:51 +02:00
AlertNotifier.php fix(alerts): fresh mailer at queue time (poller!) + branded HTML alert e-mail 2026-07-06 21:14:52 +02:00
BruteforceGuard.php fix(security): close file-read RBAC gap + fail2ban arg-injection + update/HMAC hardening 2026-07-05 16:05:16 +02:00
CertService.php feat(security): TLS certificate expiry monitoring (feature 7/8) 2026-07-05 20:57:53 +02:00
CommandRunner.php feat(commands): ad-hoc fleet commands + runbooks (feature 4/8) 2026-07-05 20:38:09 +02:00
DeploymentService.php fix(security): harden the update path — signed sentinel, symlink-safe root writes, .env 0600 2026-07-04 10:25:10 +02:00
DockerService.php perf/cleanup: one SSH round-trip for Docker, drop dead i18n, dedupe row 2026-07-06 20:06:27 +02:00
Fail2banService.php fix(security): close file-read RBAC gap + fail2ban arg-injection + update/HMAC hardening 2026-07-05 16:05:16 +02:00
FirewallService.php i18n: complete DE/EN localization (modals, shell, backend) + v0.3.0 2026-06-13 23:27:42 +02:00
FleetService.php fix(security): keep internal IPs out of shipped code and docs/ out of the public image 2026-07-04 10:25:10 +02:00
HardeningService.php fix(hardening): fail2ban — pin the sshd jail to the systemd backend 2026-06-25 01:14:06 +02:00
HealthService.php feat(uptime): HTTP/TCP health checks + status board (feature 8/8) 2026-07-05 21:04:14 +02:00
MaintenanceService.php feat(patch): fleet patch view + security-update awareness (feature 6/8) 2026-07-05 20:51:17 +02:00
MetricHistory.php refactor(metrics): interactive history chart — smooth, area, tooltip, instant ranges 2026-06-25 01:51:24 +02:00
PipelineStatus.php refactor(release): single stable channel — cut internal release candidates (-rc), remove all beta wording 2026-07-05 13:13:09 +02:00
PostureService.php feat(security): fleet security-posture score (feature 5/8) 2026-07-05 20:43:56 +02:00
PromotionService.php refactor(release): single stable channel — cut internal release candidates (-rc), remove all beta wording 2026-07-05 13:13:09 +02:00
ReleaseBridge.php feat(release): ReleaseBridge — write staging request, read host result 2026-06-22 23:14:34 +02:00
ReleaseChecker.php feat(release): collapse to a single stable channel 2026-07-03 20:00:50 +02:00
ReleasePlanner.php refactor(release): single stable channel — cut internal release candidates (-rc), remove all beta wording 2026-07-05 13:13:09 +02:00
SessionService.php feat(sessions): database sessions + list/revoke (other devices, per-user, global) with remember-token rotation 2026-06-14 23:34:00 +02:00
SshKeyProvisioner.php fix(ssh): best-effort audit + exception-safe switch/verify and modal run(); lock serverId 2026-06-14 22:16:54 +02:00
WebauthnService.php fix(webauthn): add security-key hint so passkey managers defer 2026-06-19 21:30:52 +02:00
WgBridge.php feat(wg): configurable DNS + Server/Peers tabs + faster offline (v0.9.45) 2026-06-21 22:48:46 +02:00
WgStatus.php feat(wg): configurable DNS + Server/Peers tabs + faster offline (v0.9.45) 2026-06-21 22:48:46 +02:00
WgTraffic.php refactor(wireguard): remove dead code + DRY the WG surface (no behavior change) 2026-06-21 16:33:41 +02:00