chore(release): v0.2.0 — System TLS rationale + version bump + CHANGELOG

- System page: collapsible "Warum läuft TLS über Caddy?" explaining the single
  host-exposed TLS terminator (auto Let's Encrypt + auto-renew + wss for Reverb,
  decoupled from app updates) — answers the operator's question in the UI; Caddy stays.
- Bump 0.1.1 -> 0.2.0 (cross-OS management, firewall + fail2ban control, command
  palette) + CHANGELOG entry.

Pint clean; Codex review clean; R12 — all 9 routes HTTP 200, 0 console errors,
TLS note renders.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
feat/v1-foundation v0.2.0
boban 2026-06-13 20:43:07 +02:00
parent 2c533bf821
commit 4a4d107bfc
3 changed files with 52 additions and 2 deletions

View File

@ -13,6 +13,41 @@ getaggte Releases (Kanal `stable`, optional `beta`) — niemals Entwicklungs-Bui
_Keine offenen Änderungen — der nächste Stand wird hier gesammelt und als `vX.Y.Z` getaggt._
## [0.2.0] - 2026-06-13
Mehr-Betriebssystem-Verwaltung, echte Firewall- und fail2ban-Steuerung aus dem Dashboard sowie eine Tastatur-/Befehls-Bedienung.
### Hinzugefügt
- **OS-Abstraktion**: Updates, Härtung und Firewall laufen jetzt über **apt, dnf und
zypper** (Debian/Ubuntu, RHEL/Fedora/Rocky/Alma, openSUSE). Das Betriebssystem wird
erkannt und auf der Server-Detailseite angezeigt (Paketverwaltung/Firewall). Arch
und Alpine werden erkannt; nicht unterstützte Funktionen werden mit deutschem
Hinweis sauber deaktiviert statt fehlzuschlagen.
- **Firewall-Regeln (UFW)**: Regeln ansehen, hinzufügen und löschen samt
Standard-Anzeige — mit Aussperr-Schutz (SSH-Regeln/-Port, deny ohne Port). firewalld
wird nur angezeigt (Laufzeit aller aktiven Zonen inkl. Rich Rules); Regelverwaltung
bleibt vorerst UFW.
- **fail2ban-Status**: Jails mit Zählern, **gebannte IPs sehen und entsperren**,
IP manuell sperren (R5-Dialog, Aussperr-Schutz für Loopback + eigenen Zugang) und
**Whitelist (ignoreip)** verwalten.
- **Befehls-Palette (Strg/⌘-K)** + Tastenkürzel: Schnell-Navigation (Leader „g“),
Seitensuche („/“), Hilfe („?“).
### Geändert
- System-Updates verwenden je Distribution den passenden Paketmanager
(Audit-Aktion `system.package_upgrade`).
- fail2ban-Tuning und -Whitelist liegen in getrennten Drop-ins, damit Änderungen sich
nicht gegenseitig überschreiben; das frühere Einzel-Drop-in wird migriert.
- Server-Detailseite zeigt erkanntes System, Paketverwaltung und Firewall-Werkzeug.
- System-Seite erklärt jetzt, warum TLS über Caddy terminiert wird.
### Sicherheit
- Firewall: race-freies Löschen per Regel-Spezifikation (keine Regelnummern),
Whitelisting gegen Befehls-Injection, firewalld-Lockout-Schutz (Ports vor dem Start
in der permanenten Konfiguration).
- fail2ban: kanonischer (inet_pton) Schutz gegen das Sperren des eigenen Zugangs,
ignoreip wird verbatim erhalten (inkl. Hostnames/Fortsetzungszeilen).
## [0.1.1] - 2026-06-13
Wartungs-Release: vollständige Code-Auditierung, Entfernung von totem Code und ein behobenes Open-Redirect. Keine funktionalen Änderungen für Nutzer.
@ -79,6 +114,7 @@ Erste geschnittene Version — die komplette v1-Basis inklusive Server- und Pane
- Release-/Versionierungsmodell: echte semantische Versionen + Git-Tags, Changelog
pro Version, Kanäle `stable`/`beta` (kein nutzer-seitiges `dev`).
[Unreleased]: https://git.bave.dev/boban/clusev/compare/v0.1.1...HEAD
[Unreleased]: https://git.bave.dev/boban/clusev/compare/v0.2.0...HEAD
[0.2.0]: https://git.bave.dev/boban/clusev/compare/v0.1.1...v0.2.0
[0.1.1]: https://git.bave.dev/boban/clusev/compare/v0.1.0...v0.1.1
[0.1.0]: https://git.bave.dev/boban/clusev/releases/tag/v0.1.0

View File

@ -3,7 +3,7 @@
return [
// First tagged release is v0.1.0 (semantic, not -dev). The live build hash
// is resolved from .git at runtime (see App\Livewire\Versions\Index).
'version' => '0.1.1',
'version' => '0.2.0',
// Default user channel. Only 'stable' and 'beta' are ever offered to users.
'channel' => 'stable',

View File

@ -45,6 +45,20 @@
</div>
@endif
{{-- Architecture rationale: why TLS is terminated by Caddy (collapsible) --}}
<div class="mb-4 rounded-md border border-line bg-inset p-3" x-data="{ open: false }">
<button type="button" @click="open = ! open" class="flex w-full items-center gap-2 text-left">
<x-icon name="shield" class="h-3.5 w-3.5 shrink-0 text-ink-3" />
<span class="text-sm text-ink-2">Warum läuft TLS über Caddy?</span>
<span class="ml-auto shrink-0 font-mono text-[10px] uppercase tracking-wider text-ink-4" x-text="open ? 'schließen' : 'mehr'"></span>
</button>
<div x-show="open" x-cloak x-transition class="mt-2.5 space-y-1.5 font-mono text-[11px] leading-relaxed text-ink-3">
<p>Clusev nutzt <span class="text-ink-2">genau einen</span> nach außen offenen Dienst: Caddy. Es terminiert TLS, holt und erneuert das Let's-Encrypt-Zertifikat automatisch und leitet die Reverb-WebSockets (wss) über dieselbe Adresse ohne Skript, Cronjob oder Reload-Hook.</p>
<p>App und Reverb bleiben intern erreichbar (kein offener Port nach außen). Caddy ist ein eigener Container mit eigener Version, daher kann ein App-Update die TLS-Terminierung nie unterbrechen.</p>
<p>Ein zusätzliches certbot + nginx wären <span class="text-ink-2">mehr</span> bewegliche Teile (eigene 443-Konfiguration, WebSocket-Upgrade, Renewal-Timer, Reload-Hook) bei nur einer Domain kein Gewinn.</p>
</div>
</div>
<form wire:submit="saveDomain" class="space-y-4">
<div class="grid gap-4 sm:grid-cols-2">
<div>