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 <noreply@anthropic.com>
This commit is contained in:
Kevin Adametz 2026-07-06 08:56:14 +00:00
parent 43397adb6a
commit 3940d462d9
9 changed files with 72 additions and 1 deletions

View file

@ -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).

View file

@ -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',

View file

@ -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'),
],
];

View file

@ -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).

8
dev/release/umami.md Normal file
View file

@ -0,0 +1,8 @@
presseecho
<script defer src="https://sys.adametz.media/config.js" data-website-id="3ea8a7b0-105d-4519-b200-138cadc0fbdc"></script>
businessportal24
<script defer src="https://sys.adametz.media/config.js" data-website-id="f03a5fc3-ac44-488f-9118-84004861099f"></script>
pressekonto
<script defer src="https://sys.adametz.media/config.js" data-website-id="ca440b65-a5bd-42c1-8cdb-96f34734003c"></script>

View file

@ -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.
---

View file

@ -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)
<script defer src="{{ config('services.umami.script_url') }}" data-website-id="{{ $umamiWebsiteId }}"></script>
@endif

View file

@ -100,6 +100,8 @@
<!-- Additional Styles -->
@stack('styles')
<x-web.umami />
</head>
<body class="antialiased" style="background-color: hsl(var(--background)); color: hsl(var(--foreground));">

View file

@ -0,0 +1,26 @@
<?php
use Tests\TestCase;
test('the umami snippet stays off until the go-live switch is set', function () {
/** @var TestCase $this */
// Default (UMAMI_ENABLED=false): kein Analytics-Script vor dem Go-Live.
$this->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'],
]);