From 3940d462d9b37b743ed5bb063b813c4abd24a8a1 Mon Sep 17 00:00:00 2001 From: Kevin Adametz Date: Mon, 6 Jul 2026 08:56:14 +0000 Subject: [PATCH] Umami-Webanalyse eingebaut, bis zum Go-Live deaktiviert Selbst gehostetes Umami (sys.adametz.media) je Brand: Website-IDs aus dev/release/umami.md in config/domains.php, Snippet via x-web.umami im web-master-Layout auf allen oeffentlichen Seiten der drei Domains. UMAMI_ENABLED=false haelt es aus, bis die Webseiten live gehen (User-Vorgabe 06.07.; Go-Live-Checkliste WS-7 ergaenzt). Damit stimmt Datenschutz Abschnitt 5 mit dem Code ueberein. User bestaetigt ausserdem: Log-/Backup-Fristen und Stripe-Entitaet passen wie eingetragen. Co-Authored-By: Claude Fable 5 --- .env.example | 5 ++++ config/domains.php | 3 +++ config/services.php | 12 +++++++++ dev/release/entwicklungsplan-release.md | 3 ++- dev/release/umami.md | 8 ++++++ .../Live-Deployment-Checkliste (WS-7).md | 1 + .../views/components/web/umami.blade.php | 13 ++++++++++ .../views/web/layouts/web-master.blade.php | 2 ++ tests/Feature/Web/UmamiSnippetTest.php | 26 +++++++++++++++++++ 9 files changed, 72 insertions(+), 1 deletion(-) create mode 100644 dev/release/umami.md create mode 100644 resources/views/components/web/umami.blade.php create mode 100644 tests/Feature/Web/UmamiSnippetTest.php diff --git a/.env.example b/.env.example index 6226e36f..1f4f2b88 100644 --- a/.env.example +++ b/.env.example @@ -188,6 +188,11 @@ CONTACT_EMAIL_PRESSEKONTO= CONTACT_EMAIL_PRESSEECHO= CONTACT_EMAIL_BUSINESSPORTAL= +# Selbst gehostete Umami-Webanalyse (sys.adametz.media; IDs je Brand in +# config/domains.php). Erst beim Go-Live der Webseiten auf true setzen — +# die Datenschutzerklärung (Abschnitt 5) beschreibt den Einsatz bereits. +UMAMI_ENABLED=false + # Haupt-E-Mail für alle rechtlichen Anliegen (Impressum, Datenschutz, AGB, # Meldeverfahren, Richtlinien) — auf allen drei Domains identisch. # Ohne Wert gilt der Default info@pressekonto.com (config/legal.php). diff --git a/config/domains.php b/config/domains.php index df472b1d..6f1041d1 100644 --- a/config/domains.php +++ b/config/domains.php @@ -55,6 +55,7 @@ return [ 'accent' => 'konto', 'contact_email' => env('CONTACT_EMAIL_PRESSEKONTO'), 'report_email' => env('REPORT_EMAIL_PRESSEKONTO'), + 'umami_website_id' => 'ca440b65-a5bd-42c1-8cdb-96f34734003c', 'tagline_short' => 'Publisher · Hub', 'tagline_long' => 'Der gemeinsame Publisher-Bereich für presseecho und businessportal24 – Pressemitteilungen schreiben, redaktionell prüfen lassen, auf beiden Reichweiten veröffentlichen.', 'footer_legal' => '© :year pressekonto · Alle Rechte vorbehalten', @@ -82,6 +83,7 @@ return [ 'accent' => 'echo', 'contact_email' => env('CONTACT_EMAIL_PRESSEECHO'), 'report_email' => env('REPORT_EMAIL_PRESSEECHO'), + 'umami_website_id' => '3ea8a7b0-105d-4519-b200-138cadc0fbdc', 'tagline_short' => 'Pressemitteilungen · DACH', 'tagline_long' => 'Fachmeldungen aus Wirtschaft und Industrie. Redaktionell geprüft. Strukturiert distribuiert.', 'footer_legal' => '© :year presseecho · Alle Rechte vorbehalten', @@ -115,6 +117,7 @@ return [ 'accent' => '24', 'contact_email' => env('CONTACT_EMAIL_BUSINESSPORTAL'), 'report_email' => env('REPORT_EMAIL_BUSINESSPORTAL'), + 'umami_website_id' => 'f03a5fc3-ac44-488f-9118-84004861099f', 'tagline_short' => 'Pressemitteilungen · DACH', 'tagline_long' => 'Veröffentlichungs-Portal für redaktionell geprüfte Pressemitteilungen aus Deutschland, Österreich und der Schweiz.', 'footer_legal' => '© :year businessportal24 · Alle Rechte vorbehalten', diff --git a/config/services.php b/config/services.php index 39540df4..c60799dd 100644 --- a/config/services.php +++ b/config/services.php @@ -46,4 +46,16 @@ return [ 'client_secret' => env('GOOGLE_CLIENT_SECRET'), 'redirect' => env('GOOGLE_REDIRECT_URI'), ], + + /* + | Selbst gehostete Webanalyse (Umami auf sys.adametz.media) — cookielos, + | IP-anonymisiert, beschrieben in der Datenschutzerklärung Abschnitt 5. + | Bleibt bis zum Go-Live der Webseiten deaktiviert (UMAMI_ENABLED=true + | erst mit dem Live-Schalten setzen); Website-IDs je Brand stehen in + | config/domains.php (brand.umami_website_id). + */ + 'umami' => [ + 'enabled' => env('UMAMI_ENABLED', false), + 'script_url' => env('UMAMI_SCRIPT_URL', 'https://sys.adametz.media/config.js'), + ], ]; diff --git a/dev/release/entwicklungsplan-release.md b/dev/release/entwicklungsplan-release.md index cd951f76..09c8daf1 100644 --- a/dev/release/entwicklungsplan-release.md +++ b/dev/release/entwicklungsplan-release.md @@ -17,8 +17,9 @@ R2.2+R2.3 erledigt: Hub-Landing komplett ueberarbeitet (datengetriebenes Tarif-G **03.07. abends — Hub-Inhalts-Audit + Rechtstexte (Entscheidung E2: B2B-only!):** Alle Hub-/Web-Inhalte gegen den echten Funktionsstand geprueft und korrigiert (Startseiten-Claims, FAQ, Hilfe, Veroeffentlichen, API-Doku inkl. OpenAPI); kontakt/ueber-uns zurueckgebaut; Rechtstexte aus docs/legal eingebaut (Impressum echt, AGB v0.6, /richtlinien, /melden); Widerrufs-UI raus (E2), Submit-Modal auf Archiv-Hinweis (T2neu); Preise nach Leistungsbeschreibung v0.2. Details in R3.0–R3.2. **03.07. spaet — Rechtstexte komplett + T1neu + Mail-CI (TAGESABSCHLUSS, Suite: 935 gruen):** Datenschutzerklaerung v0.3 host-aware eingebaut (Hub-/Spoke-Bausteine, Magic-Link 15 Min., Stripe Payments Europe); Cookie-Seite zurueckgebaut (301 -> /datenschutz, Cookies stehen in Abschnitt 4, kein Banner). T1neu umgesetzt: Unternehmer-Pflicht-Checkbox im Buchungs-Modal, protokolliert in `booking_confirmations` (Timestamp/IP/AGB-Version aus `config/legal.php`), CheckoutController erzwingt zeitnahe Bestaetigung serverseitig. System-Mails auf zentrales pressekonto-CI-Layout umgestellt (components/emails/layout, inkl. Framework-Auth-Mails via toMailUsing, EmailBrandingTest). **06.07. — Zentrale Rechts-E-Mail (User-Entscheidung):** `info@pressekonto.com` ist die Haupt-E-Mail fuer alle rechtlichen Anliegen; zentral in `config/legal.php` (`LEGAL_CONTACT_EMAIL`), alle fuenf Rechtsseiten (Impressum, AGB, Datenschutz, /melden, /richtlinien) nutzen sie domainuebergreifend. Support-/Redaktionskontakt bleibt je Brand (CONTACT_EMAIL_*), REPORT_EMAIL_* ist nur noch optionales separates DSA-Postfach. Live-Domain bestaetigt .com (Deployment-Checkliste), nicht .de. +**06.07. — Umami eingebaut + Klaerungsliste teilweise beantwortet:** Umami-Snippets (dev/release/umami.md, sys.adametz.media) je Brand in `config/domains.php` (`brand.umami_website_id`), gerendert via `x-web.umami` im web-master-Layout — per `UMAMI_ENABLED=false` deaktiviert bis zum Go-Live (User-Vorgabe; Checklisten-Punkt in WS-7 ergaenzt). User bestaetigt: Server-Fristen (Logs 14 Tage, Backups 4 Wochen) stimmen, Stripe-Entitaet (Stripe Payments Europe, Dublin) passt. **Wiedereinstieg / naechste Schritte:** -1. **Klaerungsliste Rechtstexte abarbeiten** (User-Antworten offen, siehe Chat 03.07.): Umami installieren oder Datenschutz-Abschnitt 5 vorerst raus · Log-Frist 14 Tage + Backups 4 Wochen mit Server-Konfig abgleichen · Stripe-Entitaet im Dashboard verifizieren · Medienprivileg-Zitierung praezisieren, falls anwaltlich bestaetigt · AGB par. 1 (3): eigene /portale-Seite oder Link auf Hub-#familie ok? · O-B Depublikations-Preisdarstellung bestaetigen. +1. **Klaerungsliste Rechtstexte — Rest** (Umami/Fristen/Stripe am 06.07. geklaert, siehe oben): Medienprivileg-Zitierung praezisieren, falls anwaltlich bestaetigt · AGB par. 1 (3): eigene /portale-Seite oder Link auf Hub-#familie ok? · AGB par. 11 (3) Kuendigungsseiten-Ergaenzung absegnen · O-B Depublikations-Preisdarstellung bestaetigen · /melden-Aenderungsweg (Magic-Links statt Pfade C/D) fuer Launch ok? 2. **[EXTERN]:** Postfach `info@pressekonto.com` anlegen (Haupt-Rechts-Mail, 06.07.); CONTACT_EMAIL_*-Support-Postfaecher je Brand; REPORT_EMAIL_* optional · R1.2 Stripe-Live · R1.4 Preisfreigabe · R5.4 Favicons · anwaltliche Freigabe AGB v0.6/Datenschutz v0.3. 3. **Backlog Rechtstexte-System (R3.1-Rest):** legal_documents-Versionierung + agb_version_id an Buchungen (E3; config/legal.php ist die Uebergangsloesung) · rejection_categories-DB fuer /richtlinien · T10 eigenstaendige DSA-Meldeformulare mit URL-Feld + Vorgangsnummer · T12 Depublikations-Checkout · T13 Melde-Button prominenter an der PM. 4. **Dann:** R6.1 manuelle QA-Checkliste, R6.3 Staging-Rehearsal, R6.4 Go-Live-Kette, R6.5 Git-Hygiene (Branch fix/zeitzone-europe-berlin liegt ~125 Commits vor main — mergen, sobald freigegeben). Offen bleibt ausserdem die User-Entscheidung zu den Legacy-SQL-Dumps in `dev/migration 2026/sql/` (enttracken vor Repo-Sharing). diff --git a/dev/release/umami.md b/dev/release/umami.md new file mode 100644 index 00000000..8c771cbc --- /dev/null +++ b/dev/release/umami.md @@ -0,0 +1,8 @@ +presseecho + + +businessportal24 + + +pressekonto + \ No newline at end of file diff --git a/docs/weiteres/Live-Deployment-Checkliste (WS-7).md b/docs/weiteres/Live-Deployment-Checkliste (WS-7).md index e2937f5e..0ac8fa1f 100644 --- a/docs/weiteres/Live-Deployment-Checkliste (WS-7).md +++ b/docs/weiteres/Live-Deployment-Checkliste (WS-7).md @@ -12,6 +12,7 @@ - [ ] **OpenAI**: `OPENAI_API_KEY` für KI-Klassifikation/Content-Score. - [ ] **Mail-Provider** (echter Versand statt `log`): Zugangsdaten/Domain (SPF/DKIM gesetzt). - [ ] **DNS/SSL**: alle Domains zeigen auf den Host, gültige Zertifikate (Portal + presseecho + businessportal24). +- [ ] **Umami-Webanalyse einschalten**: `UMAMI_ENABLED=true` (Snippet je Brand, sys.adametz.media; bis dahin bewusst aus — die Datenschutzerklärung Abschnitt 5 beschreibt den Einsatz bereits). - [ ] **Domain final bestätigen:** Standing-Wert ist `pressekonto.com` (so in `.env.example`). ⚠️ `CLAUDE.md` nennt `pressekonto.de` – vor Go-Live verbindlich klären und überall konsistent setzen. --- diff --git a/resources/views/components/web/umami.blade.php b/resources/views/components/web/umami.blade.php new file mode 100644 index 00000000..1d26a5d3 --- /dev/null +++ b/resources/views/components/web/umami.blade.php @@ -0,0 +1,13 @@ +@php + // Selbst gehostete, cookielose Webanalyse (Datenschutz Abschnitt 5). + // Deaktiviert bis zum Go-Live (UMAMI_ENABLED, config/services.php); + // die Website-ID kommt je Brand aus config/domains.php. + $umamiHost = request()->getHost(); + $umamiBrandKey = str_contains($umamiHost, 'pressekonto') + ? 'pressekonto' + : (str_contains($umamiHost, 'presseecho') ? 'presseecho' : 'businessportal24'); + $umamiWebsiteId = config('domains.domains.'.$umamiBrandKey.'.brand.umami_website_id'); +@endphp +@if (config('services.umami.enabled') && $umamiWebsiteId) + +@endif diff --git a/resources/views/web/layouts/web-master.blade.php b/resources/views/web/layouts/web-master.blade.php index 1730fc16..b379538e 100644 --- a/resources/views/web/layouts/web-master.blade.php +++ b/resources/views/web/layouts/web-master.blade.php @@ -100,6 +100,8 @@ @stack('styles') + + diff --git a/tests/Feature/Web/UmamiSnippetTest.php b/tests/Feature/Web/UmamiSnippetTest.php new file mode 100644 index 00000000..2f029904 --- /dev/null +++ b/tests/Feature/Web/UmamiSnippetTest.php @@ -0,0 +1,26 @@ +get('https://presseecho.test/de') + ->assertSuccessful() + ->assertDontSee('sys.adametz.media', false); +}); + +test('the umami snippet renders the website id of the requested brand', function (string $host, string $websiteId) { + /** @var TestCase $this */ + config()->set('services.umami.enabled', true); + + // /de/faq existiert auf allen drei Hosts (die Hub-Startseite liegt auf /). + $this->get("https://{$host}/de/faq") + ->assertSuccessful() + ->assertSee('https://sys.adametz.media/config.js', false) + ->assertSee('data-website-id="'.$websiteId.'"', false); +})->with([ + 'presseecho' => ['presseecho.test', '3ea8a7b0-105d-4519-b200-138cadc0fbdc'], + 'businessportal24' => ['businessportal24.test', 'f03a5fc3-ac44-488f-9118-84004861099f'], + 'pressekonto hub' => ['pressekonto.test', 'ca440b65-a5bd-42c1-8cdb-96f34734003c'], +]);