diff --git a/app/resources/css/app.css b/app/resources/css/app.css index 867ee0c..43bacc2 100644 --- a/app/resources/css/app.css +++ b/app/resources/css/app.css @@ -1404,12 +1404,14 @@ /* Pure switch toggle (no checkbox) */ .clu-toggle { + display: inline-block; position: relative; flex: none; width: 36px; height: 20px; background: rgba(30,35,60,0.20); border-radius: 999px; cursor: pointer; transition: background .18s; + vertical-align: middle; } .clu-toggle::after { content: ""; diff --git a/app/resources/views/livewire/pages/sites/show.blade.php b/app/resources/views/livewire/pages/sites/show.blade.php index 13c58f9..4fc77ad 100644 --- a/app/resources/views/livewire/pages/sites/show.blade.php +++ b/app/resources/views/livewire/pages/sites/show.blade.php @@ -34,6 +34,56 @@ new #[Layout('layouts.app')] class extends Component { public bool $stagingExcludeMedia = false; public string $stagingLastSync = '2026-05-31 14:22'; + /** Generic settings bag for all toggle-rows across tabs. */ + public array $settings = [ + // vHost + 'vhost.server_tokens' => true, + 'vhost.http2_push' => false, + // SSL + 'ssl.ocsp' => true, + 'ssl.auto_renew' => true, + 'ssl.caa_check' => true, + 'ssl.ct_log' => true, + // SSH/FTP + 'access.password_auth' => true, // password-auth DISABLED toggle + 'access.no_root' => true, + 'access.fail2ban' => true, + 'access.ip_allowlist' => false, + 'access.ssh_2fa' => false, + // Plugins + 'wp.auto.security' => true, + 'wp.auto.minor' => true, + 'wp.auto.major' => false, + 'wp.auto.snapshot' => true, + 'wp.auto.staging_first' => false, + // Redirects new-rule form + 'redirect.keep_qs' => true, + 'redirect.case_insens' => false, + // Staging + 'staging.robots_block' => true, + 'staging.email_sandbox' => true, + 'staging.payments_test' => true, + // Plugin auto-update flags (per slug) + 'plugin.wordpress-seo.auto' => true, + 'plugin.woocommerce.auto' => false, + 'plugin.wp-rocket.auto' => true, + 'plugin.wordfence.auto' => true, + 'plugin.advanced-custom-fields.auto' => false, + 'plugin.contact-form-7.auto' => true, + 'plugin.akismet.auto' => true, + 'plugin.updraftplus.auto' => false, + ]; + + public function toggleSetting(string $key): void + { + $this->settings[$key] = ! ($this->settings[$key] ?? false); + } + + public function isOn(string $key): bool + { + return (bool) ($this->settings[$key] ?? false); + } + /** Plugin / theme registry — mocked, would come from WP-API in prod. */ public function getPluginsProperty(): array { @@ -640,7 +690,9 @@ new #[Layout('layouts.app')] class extends Component { @else inaktiv@endif - +
@@ -698,25 +750,25 @@ new #[Layout('layouts.app')] class extends Component {

Update-Policy

-
+
Auto-Update: Security-Patches
kritische sicherheits-updates automatisch einspielen
- +
-
+
Auto-Update: Minor-Versionen
8.9.2 → 8.9.4 automatisch (gleiche major)
- +
-
+
Auto-Update: Major-Versionen
8.x → 9.x — manuell empfohlen, breaking changes möglich
- +
-
+
Snapshot vor jedem Update
automatisches backup vor plugin-update, rollback bei fehler
- +
-
+
Staging-Test vor Production
update zuerst auf staging, smoke-test, dann auf prod
- +
@@ -776,13 +828,13 @@ new #[Layout('layouts.app')] class extends Component {
-
+
Query-String beibehalten
?utm_source=… überträgt sich auf target
- +
-
+
Case-insensitive Match
/PRODUKT und /produkt matchen gleich
- +
@@ -873,21 +925,21 @@ new #[Layout('layouts.app')] class extends Component {
HTTP-Basic-Auth
staging-zugriff per username + passwort schützen (verhindert google-indexierung)
-
+
robots.txt blockt alle Crawler
User-agent: * / Disallow: /
- +
Media-Dateien beim Sync ausschließen
spart bandwidth, lädt /uploads lazy on-demand
-
+
Email-Sandbox (DISALLOW_OUTGOING_MAIL)
keine kunden-mails von staging versenden
- +
-
+
Payment-Gateways auf Test-Mode
stripe + paypal automatisch im sandbox-mode
- +
@@ -1014,13 +1066,13 @@ new #[Layout('layouts.app')] class extends Component {
Brotli + gzip Kompression
text-assets vor auslieferung komprimieren
-
+
server_tokens off
nginx-version aus header entfernen
- +
-
+
HTTP/2 Server Push
kritische assets im voraus an client streamen
- +
@@ -1111,21 +1163,21 @@ new #[Layout('layouts.app')] class extends Component {
-
+
OCSP Stapling
cert-revocation-status mit response cachen
- +
-
+
Auto-Renewal
erneuerung 30 tage vor ablauf
- +
-
+
CAA-Record-Check
vor neuausstellung dns-caa prüfen
- +
-
+
Certificate Transparency Log
cert in öffentliches ct-log eintragen
- +
@@ -1223,25 +1275,25 @@ new #[Layout('layouts.app')] class extends Component {

Zugriffs-Policy

-
+
Password-Auth deaktiviert
SSH nur über Public-Key zulassen
- +
-
+
Root-Login verbieten
PermitRootLogin no
- +
-
+
fail2ban (3 Versuche → 1h Ban)
automatische IP-Sperre nach fehlversuchen
- +
-
+
IP-Allowlist
SSH nur aus 10.10.0.0/16 + büro-WAN
- +
-
+
2FA für SSH (Google Authenticator)
zusätzlich zum public key
- +